}
ctx->sizePoints = VKVG_PTS_SIZE;
- ctx->sizeVertices = ctx->sizeVBO = VKVG_VBO_SIZE;
- ctx->sizeIndices = ctx->sizeIBO = VKVG_IBO_SIZE;
+ ctx->sizeVertices = VKVG_VBO_SIZE;
+ ctx->sizeIndices = VKVG_IBO_SIZE;
ctx->sizePathes = VKVG_PATHES_SIZE;
ctx->lineWidth = 1;
ctx->curOperator = VKVG_OPERATOR_OVER;
//for context to be thread safe, command pool and descriptor pool have to be created in the thread of the context.
ctx->cmdPool = vkh_cmd_pool_create ((VkhDevice)dev, dev->gQueue->familyIndex, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT);
- _create_vertices_buff (ctx);
ctx->th_objs = _get_or_create_threaded_objects(ctx->pSurf->dev, thrd_current());
ctx->references = 1;
ctx->status = VKVG_STATUS_SUCCESS;
- LOG(VKVG_LOG_DBG_ARRAYS, "INIT\tctx = %p; pathes:%ju pts:%ju vch:%d vbo:%d ich:%d ibo:%d\n", ctx, (uint64_t)ctx->sizePathes, (uint64_t)ctx->sizePoints, ctx->sizeVertices, ctx->sizeVBO, ctx->sizeIndices, ctx->sizeIBO);
+ LOG(VKVG_LOG_DBG_ARRAYS, "INIT\tctx = %p; pathes:%ju pts:%ju vch:%d vbo:%d ich:%d ibo:%d\n", ctx, (uint64_t)ctx->sizePathes, (uint64_t)ctx->sizePoints, ctx->sizeVertices, ctx->th_objs->sizeVBO, ctx->sizeIndices, ctx->th_objs->sizeIBO);
#if defined(DEBUG) && defined (VKVG_DBG_UTILS)
vkh_device_set_object_name((VkhDevice)dev, VK_OBJECT_TYPE_COMMAND_POOL, (uint64_t)ctx->cmdPool, "CTX Cmd Pool");
vkh_device_set_object_name((VkhDevice)dev, VK_OBJECT_TYPE_COMMAND_BUFFER, (uint64_t)ctx->cmdBuffers[1], "CTX Cmd Buff B");
vkh_device_set_object_name((VkhDevice)dev, VK_OBJECT_TYPE_FENCE, (uint64_t)ctx->flushFence, "CTX Flush Fence");
- vkh_device_set_object_name((VkhDevice)dev, VK_OBJECT_TYPE_BUFFER, (uint64_t)ctx->indices.buffer, "CTX Index Buff");
- vkh_device_set_object_name((VkhDevice)dev, VK_OBJECT_TYPE_BUFFER, (uint64_t)ctx->vertices.buffer, "CTX Vertex Buff");
#endif
return ctx;
vkvg_flush (ctx);
- LOG(VKVG_LOG_DBG_ARRAYS, "END\tctx = %p; pathes:%d pts:%d vch:%d vbo:%d ich:%d ibo:%d\n", ctx, ctx->sizePathes, ctx->sizePoints, ctx->sizeVertices, ctx->sizeVBO, ctx->sizeIndices, ctx->sizeIBO);
+ _update_descriptor_set (ctx->th_objs, ctx->pSurf->dev->emptyImg, ctx->th_objs->dsSrc);
+
+ LOG(VKVG_LOG_DBG_ARRAYS, "END\tctx = %p; pathes:%d pts:%d vch:%d vbo:%d ich:%d ibo:%d\n", ctx, ctx->sizePathes, ctx->sizePoints, ctx->sizeVertices, ctx->th_objs->sizeVBO, ctx->sizeIndices, ctx->th_objs->sizeIBO);
#if VKVG_RECORDING
if (ctx->recording)
vkFreeCommandBuffers(dev, ctx->cmdPool, 2, ctx->cmdBuffers);
vkDestroyCommandPool(dev, ctx->cmdPool, NULL);
- vkvg_buffer_destroy (&ctx->indices);
- vkvg_buffer_destroy (&ctx->vertices);
-
free(ctx->vertexCache);
free(ctx->indexCache);
free(ctx->savedStencils);
+ ctx->th_objs->inUse = false;
+
//remove context from double linked list of context in device
if (ctx->pSurf->dev->lastCtx == ctx){
ctx->pSurf->dev->lastCtx = ctx->pPrev;
return fminf(M_PI / 3.f,M_PI / (r * 0.4f));
}
-void _create_vertices_buff (VkvgContext ctx){
- vkvg_buffer_create (ctx->pSurf->dev,
- VK_BUFFER_USAGE_VERTEX_BUFFER_BIT,
- VMA_MEMORY_USAGE_CPU_TO_GPU,
- ctx->sizeVBO * sizeof(Vertex), &ctx->vertices);
- vkvg_buffer_create (ctx->pSurf->dev,
- VK_BUFFER_USAGE_INDEX_BUFFER_BIT,
- VMA_MEMORY_USAGE_CPU_TO_GPU,
- ctx->sizeIBO * sizeof(VKVG_IBO_INDEX_TYPE), &ctx->indices);
-}
-void _resize_vbo (VkvgContext ctx, uint32_t new_size) {
- if (!_wait_flush_fence (ctx))//wait previous cmd if not completed
- return;
- ctx->sizeVBO = new_size;
- uint32_t mod = ctx->sizeVBO % VKVG_VBO_SIZE;
- if (mod > 0)
- ctx->sizeVBO += VKVG_VBO_SIZE - mod;
- LOG(VKVG_LOG_DBG_ARRAYS, "resize VBO: new size: %d\n", ctx->sizeVBO);
- vkvg_buffer_destroy (&ctx->vertices);
- vkvg_buffer_create (ctx->pSurf->dev,
- VK_BUFFER_USAGE_VERTEX_BUFFER_BIT,
- VMA_MEMORY_USAGE_CPU_TO_GPU,
- ctx->sizeVBO * sizeof(Vertex), &ctx->vertices);
-}
-void _resize_ibo (VkvgContext ctx, size_t new_size) {
- if (!_wait_flush_fence (ctx))//wait previous cmd if not completed
- return;
- ctx->sizeIBO = new_size;
- uint32_t mod = ctx->sizeIBO % VKVG_IBO_SIZE;
- if (mod > 0)
- ctx->sizeIBO += VKVG_IBO_SIZE - mod;
- LOG(VKVG_LOG_DBG_ARRAYS, "resize IBO: new size: %d\n", ctx->sizeIBO);
- vkvg_buffer_destroy (&ctx->indices);
- vkvg_buffer_create (ctx->pSurf->dev,
- VK_BUFFER_USAGE_INDEX_BUFFER_BIT,
- VMA_MEMORY_USAGE_CPU_TO_GPU,
- ctx->sizeIBO * sizeof(VKVG_IBO_INDEX_TYPE), &ctx->indices);
-}
+
void _add_vertexf (VkvgContext ctx, float x, float y){
Vertex* pVert = &ctx->vertexCache[ctx->vertCount];
pVert->pos.x = x;
void _flush_vertices_caches_until_vertex_base (VkvgContext ctx) {
_wait_flush_fence (ctx);
- memcpy(ctx->vertices.allocInfo.pMappedData, ctx->vertexCache, ctx->curVertOffset * sizeof (Vertex));
- memcpy(ctx->indices.allocInfo.pMappedData, ctx->indexCache, ctx->curIndStart * sizeof (VKVG_IBO_INDEX_TYPE));
+ memcpy(ctx->th_objs->vertices.allocInfo.pMappedData, ctx->vertexCache, ctx->curVertOffset * sizeof (Vertex));
+ memcpy(ctx->th_objs->indices.allocInfo.pMappedData, ctx->indexCache, ctx->curIndStart * sizeof (VKVG_IBO_INDEX_TYPE));
//copy remaining vertices and indices to caches starts
ctx->vertCount -= ctx->curVertOffset;
if (!_wait_flush_fence (ctx))
return;
- memcpy(ctx->vertices.allocInfo.pMappedData, ctx->vertexCache, ctx->vertCount * sizeof (Vertex));
- memcpy(ctx->indices.allocInfo.pMappedData, ctx->indexCache, ctx->indCount * sizeof (VKVG_IBO_INDEX_TYPE));
+ memcpy(ctx->th_objs->vertices.allocInfo.pMappedData, ctx->vertexCache, ctx->vertCount * sizeof (Vertex));
+ memcpy(ctx->th_objs->indices.allocInfo.pMappedData, ctx->indexCache, ctx->indCount * sizeof (VKVG_IBO_INDEX_TYPE));
ctx->vertCount = ctx->indCount = ctx->curIndStart = ctx->curVertOffset = 0;
}
}
void _check_vao_size (VkvgContext ctx) {
- if (ctx->vertCount > ctx->sizeVBO || ctx->indCount > ctx->sizeIBO){
+ if (ctx->vertCount > ctx->th_objs->sizeVBO || ctx->indCount > ctx->th_objs->sizeIBO){
//vbo or ibo buffers too small
if (ctx->cmdStarted)
//if cmd is started buffers, are already bound, so no resize is possible
//instead we flush, and clear vbo and ibo caches
_flush_cmd_until_vx_base (ctx);
- if (ctx->vertCount > ctx->sizeVBO)
- _resize_vbo(ctx, ctx->sizeVertices);
- if (ctx->indCount > ctx->sizeIBO)
- _resize_ibo(ctx, ctx->sizeIndices);
+ _wait_flush_fence (ctx);
+ if (ctx->vertCount > ctx->th_objs->sizeVBO)
+ _resize_vbo(ctx->th_objs, ctx->sizeVertices);
+ if (ctx->indCount > ctx->th_objs->sizeIBO)
+ _resize_ibo(ctx->th_objs, ctx->sizeIndices);
}
}
0, 3, dss, 0, NULL);
VkDeviceSize offsets[1] = { 0 };
- CmdBindVertexBuffers(ctx->cmd, 0, 1, &ctx->vertices.buffer, offsets);
- CmdBindIndexBuffer(ctx->cmd, ctx->indices.buffer, 0, VKVG_VK_INDEX_TYPE);
+ CmdBindVertexBuffers(ctx->cmd, 0, 1, &ctx->th_objs->vertices.buffer, offsets);
+ CmdBindIndexBuffer(ctx->cmd, ctx->th_objs->indices.buffer, 0, VKVG_VK_INDEX_TYPE);
_update_push_constants (ctx);
//Even-Odd inside test with stencil buffer implementation.
void _poly_fill (VkvgContext ctx){
//we anticipate the check for vbo buffer size, ibo is not used in poly_fill
- if (ctx->vertCount + ctx->pointCount < ctx->sizeVBO) {
+ if (ctx->vertCount + ctx->pointCount < ctx->th_objs->sizeVBO) {
if (ctx->cmdStarted) {
_end_render_pass(ctx);
_flush_vertices_caches(ctx);
vkh_cmd_end(ctx->cmd);
_wait_and_submit_cmd(ctx);//the extra wait here is not useful.
- if (ctx->vertCount + ctx->pointCount > ctx->sizeVBO){
+ if (ctx->vertCount + ctx->pointCount > ctx->th_objs->sizeVBO){
//_resize_vertex_cache(ctx, ctx->vertCount + ctx->pointCount);
- _resize_vbo(ctx, ctx->vertCount + ctx->pointCount);
+ _wait_flush_fence (ctx);
+ _resize_vbo(ctx->th_objs, ctx->vertCount + ctx->pointCount);
}
}else{
//_resize_vertex_cache(ctx, ctx->vertCount + ctx->pointCount);
- _resize_vbo(ctx, ctx->vertCount + ctx->pointCount);
+ _wait_flush_fence (ctx);
+ _resize_vbo(ctx->th_objs, ctx->vertCount + ctx->pointCount);
}
_start_cmd_for_render_pass(ctx);
vkvg_device_thread_items_t* th_objs;
- //vk buffers, holds data until flush
- vkvg_buff indices; //index buffer with persistent map memory
- uint32_t sizeIBO; //size of vk ibo
- uint32_t sizeIndices; //reserved size
- uint32_t indCount; //current indice count
uint32_t curIndStart; //last index recorded in cmd buff
VKVG_IBO_INDEX_TYPE curVertOffset; //vertex offset in draw indexed command
- vkvg_buff vertices; //vertex buffer with persistent mapped memory
- uint32_t sizeVBO; //size of vk vbo size
+ uint32_t sizeIndices; //reserved size
+ uint32_t indCount; //current indice count
+
uint32_t sizeVertices; //reserved size
uint32_t vertCount; //effective vertices count
void _fill_non_zero (VkvgContext ctx);
void _draw_full_screen_quad (VkvgContext ctx, bool useScissor);
-void _create_vertices_buff (VkvgContext ctx);
void _add_vertex (VkvgContext ctx, Vertex v);
void _add_vertexf (VkvgContext ctx, float x, float y);
void _set_vertex (VkvgContext ctx, uint32_t idx, Vertex v);
PFN_vkResetFences ResetFences;
PFN_vkResetCommandBuffer ResetCommandBuffer;
+void _create_vertices_buff (vkvg_device_thread_items_t* ctx){
+ vkvg_buffer_create (ctx->dev,
+ VK_BUFFER_USAGE_VERTEX_BUFFER_BIT,
+ VMA_MEMORY_USAGE_CPU_TO_GPU,
+ ctx->sizeVBO * sizeof(Vertex), &ctx->vertices);
+ vkvg_buffer_create (ctx->dev,
+ VK_BUFFER_USAGE_INDEX_BUFFER_BIT,
+ VMA_MEMORY_USAGE_CPU_TO_GPU,
+ ctx->sizeIBO * sizeof(VKVG_IBO_INDEX_TYPE), &ctx->indices);
+}
+void _resize_vbo (vkvg_device_thread_items_t* ctx, uint32_t new_size) {
+ ctx->sizeVBO = new_size;
+ uint32_t mod = ctx->sizeVBO % VKVG_VBO_SIZE;
+ if (mod > 0)
+ ctx->sizeVBO += VKVG_VBO_SIZE - mod;
+ LOG(VKVG_LOG_DBG_ARRAYS, "resize VBO: new size: %d\n", ctx->sizeVBO);
+ vkvg_buffer_destroy (&ctx->vertices);
+ vkvg_buffer_create (ctx->dev,
+ VK_BUFFER_USAGE_VERTEX_BUFFER_BIT,
+ VMA_MEMORY_USAGE_CPU_TO_GPU,
+ ctx->sizeVBO * sizeof(Vertex), &ctx->vertices);
+}
+void _resize_ibo (vkvg_device_thread_items_t* ctx, size_t new_size) {
+ ctx->sizeIBO = new_size;
+ uint32_t mod = ctx->sizeIBO % VKVG_IBO_SIZE;
+ if (mod > 0)
+ ctx->sizeIBO += VKVG_IBO_SIZE - mod;
+ LOG(VKVG_LOG_DBG_ARRAYS, "resize IBO: new size: %d\n", ctx->sizeIBO);
+ vkvg_buffer_destroy (&ctx->indices);
+ vkvg_buffer_create (ctx->dev,
+ VK_BUFFER_USAGE_INDEX_BUFFER_BIT,
+ VMA_MEMORY_USAGE_CPU_TO_GPU,
+ ctx->sizeIBO * sizeof(VKVG_IBO_INDEX_TYPE), &ctx->indices);
+}
+
void _delete_threaded_object (VkvgDevice dev, vkvg_device_thread_items_t* throbjs) {
vkvg_buffer_destroy (&throbjs->uboGrad);
+ vkvg_buffer_destroy (&throbjs->vertices);
+ vkvg_buffer_destroy (&throbjs->indices);
/*VkDescriptorSet dss[] = {throbjs->dsFont, throbjs->dsSrc};
vkFreeDescriptorSets (dev->vkDev, throbjs->descriptorPool, 2, dss);*/
vkvg_device_thread_items_t* _get_or_create_threaded_objects (VkvgDevice dev, thrd_t id) {
vkvg_device_thread_items_t* tmp = dev->threaded_objects;
while (tmp) {
- if (thrd_equal(tmp->id, id))
+ if (thrd_equal(tmp->id, id) && !tmp->inUse) {
+ tmp->inUse = true;
return tmp;
+ }
tmp = tmp->next;
}
tmp = (vkvg_device_thread_items_t*)calloc(1, sizeof(vkvg_device_thread_items_t));
tmp->id = thrd_current();
- tmp->dev = dev->vkDev;
+ tmp->dev = dev;
+ tmp->sizeVBO = VKVG_VBO_SIZE;
+ tmp->sizeIBO = VKVG_IBO_SIZE;
const VkDescriptorPoolSize descriptorPoolSize[] = {
{VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 2 },
_update_descriptor_set (tmp, dev->fontCache->texture, tmp->dsFont);
_update_descriptor_set (tmp, dev->emptyImg, tmp->dsSrc);
+ _create_vertices_buff (tmp);
+
#if defined(DEBUG) && defined (VKVG_DBG_UTILS)
vkh_device_set_object_name((VkhDevice)dev, VK_OBJECT_TYPE_DESCRIPTOR_POOL, (uint64_t)tmp->descriptorPool, "CTX Descriptor Pool");
vkh_device_set_object_name((VkhDevice)dev, VK_OBJECT_TYPE_DESCRIPTOR_SET, (uint64_t)tmp->dsSrc, "CTX DescSet SOURCE");
vkh_device_set_object_name((VkhDevice)dev, VK_OBJECT_TYPE_DESCRIPTOR_SET, (uint64_t)tmp->dsFont, "CTX DescSet FONT");
vkh_device_set_object_name((VkhDevice)dev, VK_OBJECT_TYPE_DESCRIPTOR_SET, (uint64_t)tmp->dsGrad, "CTX DescSet GRADIENT");
+
+ vkh_device_set_object_name((VkhDevice)dev, VK_OBJECT_TYPE_BUFFER, (uint64_t)tmp->indices.buffer, "CTX Index Buff");
+ vkh_device_set_object_name((VkhDevice)dev, VK_OBJECT_TYPE_BUFFER, (uint64_t)tmp->vertices.buffer, "CTX Vertex Buff");
#endif
+
_add_threaded_objects(dev, tmp);
+ tmp->inUse = true;
+
return tmp;
}
void _update_descriptor_set (vkvg_device_thread_items_t* ctx, VkhImage img, VkDescriptorSet ds){
.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
.pImageInfo = &descSrcTex
};
- vkUpdateDescriptorSets(ctx->dev, 1, &writeDescriptorSet, 0, NULL);
+ vkUpdateDescriptorSets(ctx->dev->vkDev, 1, &writeDescriptorSet, 0, NULL);
}
bool _try_get_phyinfo (VkhPhyInfo* phys, uint32_t phyCount, VkPhysicalDeviceType gpuType, VkhPhyInfo* phy) {
for (uint32_t i=0; i<phyCount; i++){
//per thread vulkan object used in contexts
typedef struct _vkvg_device_thread_items_t {
thrd_t id;
- VkDevice dev;
+ bool inUse;
+ VkvgDevice dev;
VkDescriptorPool descriptorPool; //one pool per thread
VkDescriptorSet dsGrad; //gradient uniform buffer
VkDescriptorSet dsFont; //fonts glyphs texture atlas descriptor (local for thread safety)
vkvg_buff uboGrad; //uniform buff obj holdings gradient infos
+ //vk buffers, holds data until flush
+ vkvg_buff indices; //index buffer with persistent map memory
+ uint32_t sizeIBO; //size of vk ibo
+ vkvg_buff vertices; //vertex buffer with persistent mapped memory
+ uint32_t sizeVBO; //size of vk vbo size
+
+
struct _vkvg_device_thread_items_t* next;
}vkvg_device_thread_items_t;
vkvg_device_thread_items_t* _get_or_create_threaded_objects (VkvgDevice dev, thrd_t id);
void _delete_threaded_object (VkvgDevice dev, vkvg_device_thread_items_t* throbjs);
void _update_descriptor_set (vkvg_device_thread_items_t*, VkhImage img, VkDescriptorSet ds);
+
+void _resize_vbo (vkvg_device_thread_items_t* ctx, uint32_t new_size);
+void _resize_ibo (vkvg_device_thread_items_t* ctx, size_t new_size);
#endif
VkvgContext next = dev->lastCtx;
while (next != NULL){
+ _wait_flush_fence (next);
_update_descriptor_set (next->th_objs, cache->texture, next->th_objs->dsFont);
next = next->pPrev;
}