]> O.S.I.I.S - jp/vkvg.git/commitdiff
move font and source descriptor to threaded objs
authorJean-Philippe Bruyère <jp_bruyere@hotmail.com>
Tue, 18 Jan 2022 13:16:06 +0000 (14:16 +0100)
committerJean-Philippe Bruyère <jp_bruyere@hotmail.com>
Tue, 18 Jan 2022 13:16:06 +0000 (14:16 +0100)
src/vkvg_context.c
src/vkvg_context_internal.c
src/vkvg_context_internal.h
src/vkvg_device.c
src/vkvg_device_internal.c
src/vkvg_device_internal.h
src/vkvg_fonts.c
src/vkvg_surface.c

index a64345d5f87d675f7a17ec2f710c9e87ba215738..2de8908b854d04166bb08524ee649edcae1dcc75 100644 (file)
@@ -103,11 +103,10 @@ VkvgContext vkvg_create(VkvgSurface surf)
        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);
@@ -119,8 +118,6 @@ VkvgContext vkvg_create(VkvgSurface surf)
                        free(ctx->indexCache);
                if (ctx->savedStencils)
                        free(ctx->savedStencils);
-               if (ctx->selectedFontName)
-                       free(ctx->selectedFontName);
                return NULL;
        }
 
@@ -133,10 +130,6 @@ VkvgContext vkvg_create(VkvgSurface surf)
        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);
 
@@ -153,11 +146,6 @@ VkvgContext vkvg_create(VkvgSurface surf)
        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
@@ -236,11 +224,6 @@ void vkvg_destroy (VkvgContext ctx)
        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);
 
@@ -250,7 +233,6 @@ void vkvg_destroy (VkvgContext ctx)
        //TODO:check this for source counter
        //vkh_image_destroy       (ctx->source);
 
-       free(ctx->selectedFontName);
        free(ctx->pathes);
        free(ctx->points);
        if (ctx->dashCount > 0)
@@ -1255,7 +1237,6 @@ void vkvg_save (VkvgContext ctx){
        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;
index d96be1ac8eff4ef050b6d043369d4c315f030b9d..0c1bf696d714de1d11869b957014d895a66dabb1 100644 (file)
@@ -601,7 +601,7 @@ void _start_cmd_for_render_pass (VkvgContext ctx) {
 
        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);
 
@@ -647,7 +647,7 @@ void _update_cur_pattern (VkvgContext ctx, VkvgPattern pat) {
                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:
        {
@@ -704,7 +704,7 @@ void _update_cur_pattern (VkvgContext ctx, VkvgPattern pat) {
                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) {
 
@@ -721,7 +721,7 @@ void _update_cur_pattern (VkvgContext ctx, VkvgPattern pat) {
                        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;
@@ -770,20 +770,7 @@ void _update_cur_pattern (VkvgContext ctx, VkvgPattern pat) {
        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
  */
@@ -799,30 +786,7 @@ void _update_descriptor_set (VkvgContext ctx, VkhImage img, VkDescriptorSet ds){
        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}};
@@ -1189,7 +1153,6 @@ bool ptInTriangle(vec2 p, vec2 p0, vec2 p1, vec2 p2) {
 void _free_ctx_save (vkvg_context_save_t* sav){
        if (sav->dashCount > 0)
                free (sav->dashes);
-       free(sav->selectedFontName);
        free (sav);
 }
 
index c9e799b4b9606f9efd0a654a60188a54d68cb755..675ba3e03410a70abf3ed8b7f629f345601a0fa2 100644 (file)
@@ -114,7 +114,7 @@ typedef struct _vkvg_context_save_t{
        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;
@@ -139,9 +139,6 @@ typedef struct _vkvg_context_t {
        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;
 
@@ -204,7 +201,7 @@ typedef struct _vkvg_context_t {
        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
@@ -304,9 +301,6 @@ void _update_cur_pattern    (VkvgContext ctx, VkvgPattern pat);
 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){
index 37a1c94498ae561f2c9c7127cc4c68d349d3f9d6..769e9f916d143a021e916d01a2cbc74d7d6d15a8 100644 (file)
@@ -204,6 +204,14 @@ void vkvg_device_destroy (VkvgDevice dev)
        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);
index e635ea59636f3b7e8407e1c32223a02337c70f7d..a94c44161f83d23dfbeb404a724215c653e993ed 100644 (file)
@@ -59,6 +59,9 @@ PFN_vkResetCommandBuffer              ResetCommandBuffer;
 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);
@@ -83,6 +86,7 @@ vkvg_device_thread_items_t* _get_or_create_threaded_objects (VkvgDevice dev, thr
        }
        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 },
@@ -100,6 +104,10 @@ vkvg_device_thread_items_t* _get_or_create_threaded_objects (VkvgDevice dev, thr
                                                                                                                          .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,
@@ -117,10 +125,32 @@ vkvg_device_thread_items_t* _get_or_create_threaded_objects (VkvgDevice dev, thr
        };
        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) {
index cffe2dd8e09a4d713468d62cb3993c1af9d7aa6e..bc18e28b6c9a7efe42e702a54a6a7f802cebd794 100644 (file)
@@ -54,8 +54,11 @@ extern PFN_vkResetCommandBuffer                      ResetCommandBuffer;
 //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
 
@@ -143,4 +146,6 @@ void _layers_check_init ();
 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
index c551a15dac7bf74f06fd1f9c1932ea2413dea82f..8abc23fd268c02c93c2123984066d215b09a62d4 100644 (file)
@@ -151,7 +151,7 @@ void _increase_font_tex_array (VkvgDevice dev){
 
        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);
index ed9a19c4a5b235e3f419766efaf8888e8ab1591a..c7e18d1c5d7c9f29bb376b066c47c22d737f630d 100644 (file)
@@ -161,7 +161,7 @@ VkvgSurface vkvg_surface_create_from_bitmap (VkvgDevice dev, unsigned char* img,
        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);