]> O.S.I.I.S - jp/vkvg.git/commitdiff
test with only guarded last fence wait and submit
authorJean-Philippe Bruyère <jp_bruyere@hotmail.com>
Wed, 26 Jan 2022 22:41:15 +0000 (23:41 +0100)
committerj-p <jp_bruyere@hotmail.com>
Fri, 18 Feb 2022 20:09:23 +0000 (21:09 +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
tests/common/test.c
tests/multithreading/multithreaded.c

index 613cf9f156cc6ce7853b9d271dbad3ce37bf5120..42fc2d3ef67fe974332a5f80ee81326db1448f7e 100644 (file)
@@ -301,8 +301,8 @@ void vkvg_destroy (VkvgContext ctx)
        }
 
        _clear_context (ctx);
+       _vkvg_device_destroy_fence (ctx->pSurf->dev, ctx->flushFence);
 
-       vkDestroyFence          (ctx->dev->vkDev, ctx->flushFence,NULL);
        vkFreeCommandBuffers(dev, ctx->cmdPool, 2, ctx->cmdBuffers);
        vkDestroyCommandPool(dev, ctx->cmdPool, NULL);
 
index 1676f756938675d9bda8e084621070356ad6e725..c5880daaee51a2b16b133df308b2f4d07cd1ee36 100644 (file)
@@ -416,10 +416,6 @@ bool _wait_flush_fence (VkvgContext ctx) {
        ctx->status = VKVG_STATUS_TIMEOUT;
        return false;
 }
-void _reset_flush_fence (VkvgContext ctx) {
-       LOG(VKVG_LOG_INFO, "CTX: _reset_flush_fence\n");
-       ResetFences (ctx->dev->vkDev, 1, &ctx->flushFence);
-}
 bool _wait_and_submit_cmd (VkvgContext ctx){
        if (!ctx->cmdStarted)//current cmd buff is empty, be aware that wait is also canceled!!
                return true;
@@ -428,9 +424,8 @@ bool _wait_and_submit_cmd (VkvgContext ctx){
 
        if (!_wait_flush_fence (ctx))
                return false;
-       _reset_flush_fence(ctx);
-
-       _submit_cmd (ctx->dev, &ctx->cmd, ctx->flushFence);
+       _vkvg_device_reset_fence(ctx->pSurf->dev, ctx->flushFence);
+       _submit_cmd (ctx->pSurf->dev, &ctx->cmd, ctx->flushFence);
 
        if (ctx->cmd == ctx->cmdBuffers[0])
                ctx->cmd = ctx->cmdBuffers[1];
index ff10bea42b8352408323fd8fcfa6e9320379a596..fd219a846726407f9d8c3df26aa3e182cb069a06 100644 (file)
@@ -300,7 +300,6 @@ void _flush_cmd_buff                (VkvgContext ctx);
 void _emit_draw_cmd_undrawn_vertices(VkvgContext ctx);
 void _flush_cmd_until_vx_base (VkvgContext ctx);
 bool _wait_flush_fence         (VkvgContext ctx);
-void _reset_flush_fence                (VkvgContext ctx);
 bool _wait_and_submit_cmd      (VkvgContext ctx);
 void _update_push_constants (VkvgContext ctx);
 void _update_cur_pattern       (VkvgContext ctx, VkvgPattern pat);
index bcb594692a49dda89593184ac3f8ea95d4ea360f..a90ea8bc866a01c45558ab1c81da825caeedc941 100644 (file)
@@ -335,8 +335,8 @@ void vkvg_device_get_dpy (VkvgDevice dev, int* hdpy, int* vdpy) {
        *vdpy = dev->vdpi;
 }
 void vkvg_device_set_queue_guards (VkvgDevice dev, vkvg_queue_guard before_submit, vkvg_queue_guard after_submit, void* user_data) {
-       dev->gQBeforeSubmitGuard = before_submit;
-       dev->gQAfterSubmitGuard = after_submit;
+       dev->gQLockGuard = before_submit;
+       dev->gQUnlockGuard = after_submit;
        dev->gQGuardUserData = user_data;
 }
 #if VKVG_DBG_STATS
index d66df4c74bca88e231ec34418246c2d61adee041..38f6e55f83b3883f52d667814912aa7fb5cc9de5 100644 (file)
@@ -424,15 +424,49 @@ void _wait_idle (VkvgDevice dev) {
 }
 void _wait_and_reset_device_fence (VkvgDevice dev) {
        vkWaitForFences (dev->vkDev, 1, &dev->fence, VK_TRUE, UINT64_MAX);
-       vkResetFences (dev->vkDev, 1, &dev->fence);
+       _vkvg_device_reset_fence(dev, dev->fence);
+}
+
+void _vkvg_device_destroy_fence (VkvgDevice dev, VkFence fence) {
+       if (dev->gQLockGuard)
+               dev->gQLockGuard (dev->gQGuardUserData);
+
+       if (dev->gQLastFence == fence)
+               dev->gQLastFence = VK_NULL_HANDLE;
+
+       vkDestroyFence (dev->vkDev, fence, NULL);
+
+       if (dev->gQUnlockGuard)
+               dev->gQUnlockGuard (dev->gQGuardUserData);
+}
+void _vkvg_device_reset_fence (VkvgDevice dev, VkFence fence){
+       if (dev->gQLockGuard)
+               dev->gQLockGuard (dev->gQGuardUserData);
+
+       if (dev->gQLastFence == fence)
+               dev->gQLastFence = VK_NULL_HANDLE;
+
+       ResetFences (dev->vkDev, 1, &fence);
+
+       if (dev->gQUnlockGuard)
+               dev->gQUnlockGuard (dev->gQGuardUserData);
+}
+void _vkvg_device_wait_fence                   (VkvgDevice dev, VkFence fence){
+
+}
+void _vkvg_device_wait_and_reset_fence (VkvgDevice dev, VkFence fence){
+
 }
 
 void _submit_cmd (VkvgDevice dev, VkCommandBuffer* cmd, VkFence fence) {
-       if (dev->gQBeforeSubmitGuard)
-               dev->gQBeforeSubmitGuard (dev->gQGuardUserData);
+       if (dev->gQLockGuard)
+               dev->gQLockGuard (dev->gQGuardUserData);
+       if (dev->gQLastFence != VK_NULL_HANDLE)
+               WaitForFences (dev->vkDev, 1, &dev->gQLastFence, VK_TRUE, VKVG_FENCE_TIMEOUT);
        vkh_cmd_submit (dev->gQueue, cmd, fence);
-       if (dev->gQAfterSubmitGuard)
-               dev->gQAfterSubmitGuard (dev->gQGuardUserData);
+       dev->gQLastFence = fence;
+       if (dev->gQUnlockGuard)
+               dev->gQUnlockGuard (dev->gQGuardUserData);
 }
 
 bool _init_function_pointers (VkvgDevice dev) {
index 931d58251810c875b1069d5810ad11f47cb00239..c702e1cfc1b69c23232b32e8cfec39f3453caff4 100644 (file)
@@ -65,10 +65,11 @@ typedef struct _vkvg_device_t{
        VkFormat                                pngStagFormat;                  /**< Supported vulkan image format png write staging img */
        VkImageTiling                   pngStagTiling;                  /**< tiling for the blit operation */
 
-       vkvg_queue_guard                gQBeforeSubmitGuard;
-       vkvg_queue_guard                gQAfterSubmitGuard;
+       vkvg_queue_guard                gQLockGuard;
+       vkvg_queue_guard                gQUnlockGuard;
        void*                                   gQGuardUserData;
        VkhQueue                                gQueue;                                 /**< Vulkan Queue with Graphic flag */
+       VkFence                                 gQLastFence;
 
        VkRenderPass                    renderPass;                             /**< Vulkan render pass, common for all surfaces */
        VkRenderPass                    renderPass_ClearStencil;/**< Vulkan render pass for first draw with context, stencil has to be cleared */
@@ -131,4 +132,9 @@ void _flush_all_contexes            (VkvgDevice dev);
 void _wait_idle                                        (VkvgDevice dev);
 void _wait_and_reset_device_fence (VkvgDevice dev);
 void _submit_cmd                               (VkvgDevice dev, VkCommandBuffer* cmd, VkFence fence);
+
+void _vkvg_device_destroy_fence                        (VkvgDevice dev, VkFence fence);
+void _vkvg_device_reset_fence                  (VkvgDevice dev, VkFence fence);
+void _vkvg_device_wait_fence                   (VkvgDevice dev, VkFence fence);
+void _vkvg_device_wait_and_reset_fence (VkvgDevice dev, VkFence fence);
 #endif
index 39e95bc8cb2729aae31d727ba741a5a84f8a84c8..7d34bee7e5ed66a6ee139400c441fed04b9a8b76 100644 (file)
@@ -104,8 +104,9 @@ void _increase_font_tex_array (VkvgDevice dev){
        _font_cache_t* cache = dev->fontCache;
 
        vkWaitForFences         (dev->vkDev, 1, &cache->uploadFence, VK_TRUE, UINT64_MAX);
+       _vkvg_device_reset_fence (dev, cache->uploadFence);
+
        vkResetCommandBuffer(cache->cmd, 0);
-       vkResetFences           (dev->vkDev, 1, &cache->uploadFence);
 
        uint8_t newSize = cache->texLength + FONT_CACHE_INIT_LAYERS;
        VkhImage newImg = vkh_tex2d_array_create ((VkhDevice)dev, cache->texFormat, FONT_PAGE_SIZE, FONT_PAGE_SIZE,
@@ -241,8 +242,8 @@ void _flush_chars_to_tex (VkvgDevice dev, _vkvg_font_t* f) {
 
        LOG(VKVG_LOG_INFO, "_flush_chars_to_tex pen(%d, %d)\n",f->curLine.penX, f->curLine.penY);
        vkWaitForFences         (dev->vkDev,1,&cache->uploadFence,VK_TRUE,UINT64_MAX);
+       _vkvg_device_reset_fence (dev, cache->uploadFence);
        vkResetCommandBuffer(cache->cmd,0);
-       vkResetFences           (dev->vkDev,1,&cache->uploadFence);
 
        memcpy(cache->buff.allocInfo.pMappedData, cache->hostBuff, (uint64_t)f->curLine.height * FONT_PAGE_SIZE * cache->texPixelSize);
 
index 6271063477896cf22311b39c54360e29d52d8f19..cc04584ed414f0e80d778c260d4f437f64a21ac1 100644 (file)
@@ -647,7 +647,6 @@ void perform_test_onscreen (void(*testfunc)(void), const char *testName, int arg
 #ifdef VKVG_TEST_DIRECT_DRAW
        for (uint32_t i=0; i<r->imgCount;i++)
                vkvg_surface_destroy (surfaces[i]);
-
        free (surfaces);
 #else
        vkvg_surface_destroy    (surf);
index cc4aa0a35ac33d3d4245fd8de0a2802d2ece5296..5e6620aaf9a52c0a8460d7c764dc287e0cb7c5c0 100644 (file)
@@ -1,11 +1,11 @@
 #include "test.h"
 #include "tinycthread.h"
 
-#define THREAD_COUNT 2
+#define THREAD_COUNT 8
 
 
 static int finishedThreadCount = 0;
-static mtx_t mutex;
+static mtx_t* pmutex;
 
 void drawRandomRect (VkvgContext ctx, float s) {
        float w = (float)test_width;
@@ -25,9 +25,6 @@ void _after_submit (void* data) {
 }
 
 int drawRectsThread () {
-       mtx_t gQMutex;
-       mtx_init (&gQMutex, mtx_plain);
-       vkvg_device_set_queue_guards (device, _before_submit, _after_submit, &gQMutex);
 
        VkvgSurface s = vkvg_surface_create(device, test_width, test_height);
        VkvgContext ctx = vkvg_create(s);
@@ -37,26 +34,31 @@ int drawRectsThread () {
        }
        vkvg_destroy(ctx);
 
-       mtx_lock(&mutex);
-
-       finishedThreadCount++;
+       mtx_lock(pmutex);
 
        ctx = vkvg_create(surf);
                vkvg_set_source_surface (ctx, s, 0, 0);
                vkvg_paint(ctx);
        vkvg_destroy(ctx);
 
-       mtx_unlock(&mutex);
+       finishedThreadCount++;
+       mtx_unlock(pmutex);
 
        vkvg_surface_destroy (s);
-       vkvg_device_set_queue_guards (device, NULL, NULL, NULL);
-       mtx_destroy (&gQMutex);
        return 0;
 }
 void fixedSizeRects(){
+       mtx_t gQMutex, mutex;
+       mtx_t* pgQMutex = &gQMutex;
+       pmutex = &mutex;
+
+       mtx_init (pgQMutex, mtx_plain);
+       vkvg_device_set_queue_guards (device, _before_submit, _after_submit, pgQMutex);
+
        thrd_t threads[THREAD_COUNT];
+
        finishedThreadCount = 0;
-       mtx_init (&mutex,mtx_plain);
+       mtx_init (pmutex, mtx_plain);
        for (uint32_t i=0; i<THREAD_COUNT; i++) {
                thrd_create (&threads[i], drawRectsThread, NULL);
        }
@@ -65,7 +67,14 @@ void fixedSizeRects(){
        while (finishedThreadCount < THREAD_COUNT)
                thrd_sleep(&ts, NULL);
 
-       mtx_destroy(&mutex);
+       mtx_lock(pmutex);
+       mtx_unlock(pmutex);
+       mtx_destroy (pmutex);
+       pmutex = NULL;
+
+       vkvg_device_set_queue_guards (device, NULL, NULL, NULL);
+       mtx_destroy (pgQMutex);
+       pgQMutex = NULL;
 }
 
 int main(int argc, char *argv[]) {