ctx->indexCache = (VKVG_IBO_INDEX_TYPE*)malloc(ctx->sizeIndices * sizeof(VKVG_IBO_INDEX_TYPE));
ctx->savedStencils = malloc(0);
- ctx->selectedFontName = (char*)calloc(FONT_NAME_MAX_SIZE, sizeof(char));
ctx->selectedCharSize = 10 << 6;
ctx->currentFont = NULL;
- if (!ctx->points || !ctx->pathes || !ctx->vertexCache || !ctx->indexCache || !ctx->savedStencils || !ctx->selectedFontName) {
+ if (!ctx->points || !ctx->pathes || !ctx->vertexCache || !ctx->indexCache || !ctx->savedStencils ) {
dev->status = VKVG_STATUS_NO_MEMORY;
if (ctx->points)
free(ctx->points);
free(ctx->indexCache);
if (ctx->savedStencils)
free(ctx->savedStencils);
- if (ctx->selectedFontName)
- free(ctx->selectedFontName);
return NULL;
}
ctx->th_objs = _get_or_create_threaded_objects(ctx->pSurf->dev, thrd_current());
_create_cmd_buff (ctx);
- _createDescriptorPool (ctx);
- _init_descriptor_sets (ctx);
- _update_descriptor_set (ctx, ctx->pSurf->dev->fontCache->texture, ctx->dsFont);
- _update_descriptor_set (ctx, surf->dev->emptyImg, ctx->dsSrc);
_clear_path (ctx);
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_DESCRIPTOR_POOL, (uint64_t)ctx->descriptorPool, "CTX Descriptor Pool");
- vkh_device_set_object_name((VkhDevice)dev, VK_OBJECT_TYPE_DESCRIPTOR_SET, (uint64_t)ctx->dsSrc, "CTX DescSet SOURCE");
- vkh_device_set_object_name((VkhDevice)dev, VK_OBJECT_TYPE_DESCRIPTOR_SET, (uint64_t)ctx->dsFont, "CTX DescSet FONT");
- vkh_device_set_object_name((VkhDevice)dev, VK_OBJECT_TYPE_DESCRIPTOR_SET, (uint64_t)ctx->dsGrad, "CTX DescSet GRADIENT");
-
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
vkFreeCommandBuffers(dev, ctx->cmdPool, 2, ctx->cmdBuffers);
vkDestroyCommandPool(dev, ctx->cmdPool, NULL);
- VkDescriptorSet dss[] = {ctx->dsFont,ctx->dsSrc};
- vkFreeDescriptorSets (dev, ctx->descriptorPool, 2, dss);
-
- vkDestroyDescriptorPool (dev, ctx->descriptorPool,NULL);
-
vkvg_buffer_destroy (&ctx->indices);
vkvg_buffer_destroy (&ctx->vertices);
//TODO:check this for source counter
//vkh_image_destroy (ctx->source);
- free(ctx->selectedFontName);
free(ctx->pathes);
free(ctx->points);
if (ctx->dashCount > 0)
sav->curFillRule= ctx->curFillRule;
sav->selectedCharSize = ctx->selectedCharSize;
- sav->selectedFontName = (char*)calloc(FONT_NAME_MAX_SIZE,sizeof(char));
strcpy (sav->selectedFontName, ctx->selectedFontName);
sav->currentFont = ctx->currentFont;
CmdSetScissor(ctx->cmd, 0, 1, &ctx->bounds);
- VkDescriptorSet dss[] = {ctx->dsFont, ctx->dsSrc,ctx->th_objs->dsGrad};
+ VkDescriptorSet dss[] = {ctx->th_objs->dsFont, ctx->th_objs->dsSrc,ctx->th_objs->dsGrad};
CmdBindDescriptorSets(ctx->cmd, VK_PIPELINE_BIND_POINT_GRAPHICS, ctx->pSurf->dev->pipelineLayout,
0, 3, dss, 0, NULL);
if (!_wait_flush_fence (ctx))
return;
if (lastPat->type == VKVG_PATTERN_TYPE_SURFACE)//unbind current source surface by replacing it with empty texture
- _update_descriptor_set (ctx, ctx->pSurf->dev->emptyImg, ctx->dsSrc);
+ _update_descriptor_set (ctx->th_objs, ctx->pSurf->dev->emptyImg, ctx->th_objs->dsSrc);
break;
case VKVG_PATTERN_TYPE_SURFACE:
{
vkh_image_create_sampler (ctx->source, filter, filter,
VK_SAMPLER_MIPMAP_MODE_NEAREST, addrMode);
- _update_descriptor_set (ctx, ctx->source, ctx->dsSrc);
+ _update_descriptor_set (ctx->th_objs, ctx->source, ctx->th_objs->dsSrc);
if (pat->hasMatrix) {
return;
if (lastPat && lastPat->type == VKVG_PATTERN_TYPE_SURFACE)
- _update_descriptor_set (ctx, ctx->pSurf->dev->emptyImg, ctx->dsSrc);
+ _update_descriptor_set (ctx->th_objs, ctx->pSurf->dev->emptyImg, ctx->th_objs->dsSrc);
vec4 bounds = {{(float)ctx->pSurf->width}, {(float)ctx->pSurf->height}, {0}, {0}};//store img bounds in unused source field
ctx->pushConsts.source = bounds;
if (lastPat)
vkvg_pattern_destroy (lastPat);
}
-void _update_descriptor_set (VkvgContext ctx, VkhImage img, VkDescriptorSet ds){
- if (!_wait_flush_fence(ctx))//descriptorSet update invalidate cmd buffs
- return;
- VkDescriptorImageInfo descSrcTex = vkh_image_get_descriptor (img, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);
- VkWriteDescriptorSet writeDescriptorSet = {
- .sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET,
- .dstSet = ds,
- .dstBinding = 0,
- .descriptorCount = 1,
- .descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
- .pImageInfo = &descSrcTex
- };
- vkUpdateDescriptorSets(ctx->pSurf->dev->vkDev, 1, &writeDescriptorSet, 0, NULL);
-}
+
/*
* Reset currently bound descriptor which image could be destroyed
*/
VK_CHECK_RESULT(vkAllocateDescriptorSets(dev->vkDev, &descriptorSetAllocateInfo, &ctx->dsSrc));
}*/
-void _createDescriptorPool (VkvgContext ctx) {
- VkvgDevice dev = ctx->pSurf->dev;
- const VkDescriptorPoolSize descriptorPoolSize[] = {
- {VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 2 },
- {VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1 }
- };
- VkDescriptorPoolCreateInfo descriptorPoolCreateInfo = { .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,
- .maxSets = 3,
- .flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT,
- .poolSizeCount = 2,
- .pPoolSizes = descriptorPoolSize };
- VK_CHECK_RESULT(vkCreateDescriptorPool (dev->vkDev, &descriptorPoolCreateInfo, NULL, &ctx->descriptorPool));
-}
-void _init_descriptor_sets (VkvgContext ctx){
- VkvgDevice dev = ctx->pSurf->dev;
- VkDescriptorSetAllocateInfo descriptorSetAllocateInfo = { .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO,
- .descriptorPool = ctx->descriptorPool,
- .descriptorSetCount = 1,
- .pSetLayouts = &dev->dslFont
- };
- VK_CHECK_RESULT(vkAllocateDescriptorSets(dev->vkDev, &descriptorSetAllocateInfo, &ctx->dsFont));
- descriptorSetAllocateInfo.pSetLayouts = &dev->dslSrc;
- VK_CHECK_RESULT(vkAllocateDescriptorSets(dev->vkDev, &descriptorSetAllocateInfo, &ctx->dsSrc));
-}
+
//populate vertice buff for stroke
bool _build_vb_step (vkvg_context* ctx, float hw, stroke_context_t* str, bool isCurve){
Vertex v = {{0},ctx->curColor, {0,0,-1}};
void _free_ctx_save (vkvg_context_save_t* sav){
if (sav->dashCount > 0)
free (sav->dashes);
- free(sav->selectedFontName);
free (sav);
}
vkvg_fill_rule_t curFillRule;
long selectedCharSize; /* Font size*/
- char* selectedFontName;
+ char selectedFontName[FONT_NAME_MAX_SIZE];
_vkvg_font_identity_t selectedFont; //hold current face and size before cache addition
_vkvg_font_identity_t* currentFont; //font ready for lookup
vkvg_direction_t textDirection;
VkCommandBuffer cmd; //current recording buffer
bool cmdStarted; //prevent flushing empty renderpass
bool pushCstDirty;//prevent pushing to gpu if not requested
- VkDescriptorPool descriptorPool;//one pool per thread
- VkDescriptorSet dsFont; //fonts glyphs texture atlas descriptor (local for thread safety)
- VkDescriptorSet dsSrc; //source ds
VkRect2D bounds;
vkvg_fill_rule_t curFillRule;
long selectedCharSize; /* Font size*/
- char* selectedFontName;
+ char selectedFontName[FONT_NAME_MAX_SIZE];
//_vkvg_font_t selectedFont; //hold current face and size before cache addition
_vkvg_font_identity_t* currentFont; //font pointing to cached fonts identity
_vkvg_font_t* currentFontSize; //font structure by size ready for lookup
void _set_mat_inv_and_vkCmdPush (VkvgContext ctx);
void _start_cmd_for_render_pass (VkvgContext ctx);
-void _createDescriptorPool (VkvgContext ctx);
-void _init_descriptor_sets (VkvgContext ctx);
-void _update_descriptor_set (VkvgContext ctx, VkhImage img, VkDescriptorSet ds);
void _free_ctx_save (vkvg_context_save_t* sav);
static inline float vec2_zcross (vec2 v1, vec2 v2){
if (dev->references > 0)
return;
+ vkvg_device_thread_items_t* tmp = dev->threaded_objects;
+ while (tmp) {
+ vkvg_device_thread_items_t* next = tmp->next;
+ _delete_threaded_object(dev, tmp);
+ tmp = next;
+ }
+
+
LOG(VKVG_LOG_INFO, "DESTROY Device\n");
vkh_image_destroy (dev->emptyImg);
void _delete_threaded_object (VkvgDevice dev, vkvg_device_thread_items_t* throbjs) {
vkvg_buffer_destroy (&throbjs->uboGrad);
+ /*VkDescriptorSet dss[] = {throbjs->dsFont, throbjs->dsSrc};
+ vkFreeDescriptorSets (dev->vkDev, throbjs->descriptorPool, 2, dss);*/
+
vkDestroyDescriptorPool (dev->vkDev, throbjs->descriptorPool,NULL);
free (throbjs);
}
tmp = (vkvg_device_thread_items_t*)calloc(1, sizeof(vkvg_device_thread_items_t));
tmp->id = thrd_current();
+ tmp->dev = dev->vkDev;
const VkDescriptorPoolSize descriptorPoolSize[] = {
{VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 2 },
.descriptorSetCount = 1,
.pSetLayouts = &dev->dslGrad };
VK_CHECK_RESULT(vkAllocateDescriptorSets(dev->vkDev, &descriptorSetAllocateInfo, &tmp->dsGrad));
+ descriptorSetAllocateInfo.pSetLayouts = &dev->dslFont;
+ VK_CHECK_RESULT(vkAllocateDescriptorSets(dev->vkDev, &descriptorSetAllocateInfo, &tmp->dsFont));
+ descriptorSetAllocateInfo.pSetLayouts = &dev->dslSrc;
+ VK_CHECK_RESULT(vkAllocateDescriptorSets(dev->vkDev, &descriptorSetAllocateInfo, &tmp->dsSrc));
vkvg_buffer_create (dev,
VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT,
};
vkUpdateDescriptorSets(dev->vkDev, 1, &writeDescriptorSet, 0, NULL);
+ _update_descriptor_set (tmp, dev->fontCache->texture, tmp->dsFont);
+ _update_descriptor_set (tmp, dev->emptyImg, tmp->dsSrc);
+
+#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");
+#endif
+
_add_threaded_objects(dev, tmp);
return tmp;
}
+void _update_descriptor_set (vkvg_device_thread_items_t* ctx, VkhImage img, VkDescriptorSet ds){
+ VkDescriptorImageInfo descSrcTex = vkh_image_get_descriptor (img, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);
+ VkWriteDescriptorSet writeDescriptorSet = {
+ .sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET,
+ .dstSet = ds,
+ .dstBinding = 0,
+ .descriptorCount = 1,
+ .descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
+ .pImageInfo = &descSrcTex
+ };
+ vkUpdateDescriptorSets(ctx->dev, 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++){
if (vkh_phyinfo_get_properties(phys[i]).deviceType == gpuType) {
//per thread vulkan object used in contexts
typedef struct _vkvg_device_thread_items_t {
thrd_t id;
+ VkDevice dev;
VkDescriptorPool descriptorPool; //one pool per thread
VkDescriptorSet dsGrad; //gradient uniform buffer
+ VkDescriptorSet dsFont; //fonts glyphs texture atlas descriptor (local for thread safety)
+ VkDescriptorSet dsSrc; //source ds
vkvg_buff uboGrad; //uniform buff obj holdings gradient infos
void _layers_check_release ();
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);
#endif
VkvgContext next = dev->lastCtx;
while (next != NULL){
- _update_descriptor_set (next, cache->texture, next->dsFont);
+ _update_descriptor_set (next->th_objs, cache->texture, next->th_objs->dsFont);
next = next->pPrev;
}
_wait_idle(dev);
ctx->pushConsts.fsq_patternType = (ctx->pushConsts.fsq_patternType & FULLSCREEN_BIT) + VKVG_PATTERN_TYPE_SURFACE;
//_update_push_constants (ctx);
- _update_descriptor_set (ctx, tmpImg, ctx->dsSrc);
+ _update_descriptor_set (ctx->th_objs, tmpImg, ctx->th_objs->dsSrc);
_ensure_renderpass_is_started (ctx);
vkvg_paint (ctx);