From 56bde775308f44f794b8cb68f5a283c66d096b10 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jean-Philippe=20Bruy=C3=A8re?= Date: Thu, 5 Sep 2019 16:30:20 +0200 Subject: [PATCH] remove fences in direct draw, rect fill test with rounded float, check arrays --- src/vkvg_context_internal.c | 32 +++++++++++++++++++++++++++++--- src/vkvg_device_internal.c | 4 ++-- tests/common/test.c | 36 +++++++++++------------------------- tests/common/vkengine.c | 4 ++-- tests/curve.c | 3 ++- tests/random_rects.c | 16 ++++++++-------- vkh | 2 +- 7 files changed, 55 insertions(+), 42 deletions(-) diff --git a/src/vkvg_context_internal.c b/src/vkvg_context_internal.c index b8411e4..48e9bf8 100644 --- a/src/vkvg_context_internal.c +++ b/src/vkvg_context_internal.c @@ -47,19 +47,43 @@ void _check_vbo_size (VkvgContext ctx) { if (ctx->sizeVertices - ctx->vertCount > VKVG_ARRAY_THRESHOLD) return; ctx->sizeVertices += VKVG_VBO_SIZE; - ctx->vertexCache = (Vertex*) realloc (ctx->vertexCache, ctx->sizeVertices * sizeof(Vertex)); + Vertex* tmp = (Vertex*) realloc (ctx->vertexCache, ctx->sizeVertices * sizeof(Vertex)); + if (tmp == NULL) + ctx->status = VKVG_STATUS_NO_MEMORY; + else + ctx->vertexCache = tmp; } void _check_ibo_size (VkvgContext ctx) { if (ctx->sizeIndices - ctx->indCount > VKVG_ARRAY_THRESHOLD) return; ctx->sizeIndices += VKVG_IBO_SIZE; - ctx->indexCache = (VKVG_IBO_INDEX_TYPE*) realloc (ctx->indexCache, ctx->sizeIndices * sizeof(VKVG_IBO_INDEX_TYPE)); + VKVG_IBO_INDEX_TYPE* tmp = (VKVG_IBO_INDEX_TYPE*) realloc (ctx->indexCache, ctx->sizeIndices * sizeof(VKVG_IBO_INDEX_TYPE)); + if (tmp == NULL) + ctx->status = VKVG_STATUS_NO_MEMORY; + else + ctx->indexCache = tmp; } void _check_pathes_array (VkvgContext ctx){ if (ctx->sizePathes - ctx->pathPtr - ctx->curvePtr > VKVG_ARRAY_THRESHOLD) return; ctx->sizePathes += VKVG_PATHES_SIZE; - ctx->pathes = (uint32_t*) realloc (ctx->pathes, ctx->sizePathes * sizeof(uint32_t)); + uint32_t* tmp = (uint32_t*) realloc (ctx->pathes, ctx->sizePathes * sizeof(uint32_t)); + if (tmp == NULL){ + ctx->status = VKVG_STATUS_NO_MEMORY; + ctx->pathPtr = 0 + (ctx->pathPtr % 2); + }else + ctx->pathes = tmp; +} +void _check_point_array (VkvgContext ctx){ + if (ctx->sizePoints - ctx->pointCount > VKVG_ARRAY_THRESHOLD) + return; + ctx->sizePoints += VKVG_PATHES_SIZE; + vec2* tmp = (vec2*) realloc (ctx->points, ctx->sizePoints * sizeof(vec2)); + if (tmp == NULL){ + ctx->status = VKVG_STATUS_NO_MEMORY; + ctx->pointCount = 0; + }else + ctx->points = tmp; } //when empty, ptr is even, else it's odd //when empty, no current point is defined. @@ -125,6 +149,8 @@ void _add_point (VkvgContext ctx, float x, float y){ ctx->points[ctx->pointCount] = (vec2){x,y}; ctx->pointCount++; + _check_point_array(ctx); + //bounds are computed here to scissor the painting operation //that speed up fill drastically. vkvg_matrix_transform_point (&ctx->pushConsts.mat, &x, &y); diff --git a/src/vkvg_device_internal.c b/src/vkvg_device_internal.c index 244d652..a7053fc 100644 --- a/src/vkvg_device_internal.c +++ b/src/vkvg_device_internal.c @@ -58,7 +58,7 @@ VkRenderPass _createRenderPassNoResolve(VkvgDevice dev, VkAttachmentLoadOp loadO .storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE, .stencilLoadOp = stencilLoadOp, .stencilStoreOp = VK_ATTACHMENT_STORE_OP_STORE, - .initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, + .initialLayout = VK_IMAGE_LAYOUT_UNDEFINED, .finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL }; VkAttachmentDescription attachments[] = {attColor,attDS}; @@ -112,7 +112,7 @@ VkRenderPass _createRenderPassMS(VkvgDevice dev, VkAttachmentLoadOp loadOp, VkAt .storeOp = VK_ATTACHMENT_STORE_OP_STORE, .stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE, .stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE, - .initialLayout = VK_IMAGE_LAYOUT_UNDEFINED, + .initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, .finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL }; VkAttachmentDescription attDS = { .format = FB_STENCIL_FORMAT, diff --git a/tests/common/test.c b/tests/common/test.c index 0cba5d2..5b662e6 100644 --- a/tests/common/test.c +++ b/tests/common/test.c @@ -62,10 +62,10 @@ double time_diff(struct timeval x , struct timeval y) void randomize_color (VkvgContext ctx) { vkvg_set_source_rgba(ctx, - 1.0f,//(float)rand()/RAND_MAX, (float)rand()/RAND_MAX, (float)rand()/RAND_MAX, - 0.5f//(float)rand()/RAND_MAX + (float)rand()/RAND_MAX, + 0.5f//0.8f*rand()/RAND_MAX + 0.2f ); } @@ -143,12 +143,11 @@ void perform_test (void(*testfunc)(void),uint width, uint height) { bool deferredResolve = false; - device = vkvg_device_create_multisample(vkh_app_get_inst(e->app), r->dev->phy, r->dev->dev, r->qFam, 0, VK_SAMPLE_COUNT_1_BIT, deferredResolve); + device = vkvg_device_create_multisample(vkh_app_get_inst(e->app), r->dev->phy, r->dev->dev, r->qFam, 0, VK_SAMPLE_COUNT_4_BIT, deferredResolve); vkvg_device_set_dpy(device, 96, 96); #ifdef VKVG_TEST_DIRECT_DRAW - VkFence* fences = (VkFence*)calloc(r->imgCount, sizeof (VkFence)); surfaces = (VkvgSurface*)malloc(r->imgCount * sizeof (VkvgSurface)); for (uint i=0; i < r->imgCount;i++) surfaces[i] = vkvg_surface_create_for_VkhImage (device, r->ScBuffers[i]); @@ -165,27 +164,17 @@ void perform_test (void(*testfunc)(void),uint width, uint height) { gettimeofday(&before , NULL); #ifdef VKVG_TEST_DIRECT_DRAW - VkFence fence = vkh_fence_create (e->dev); - - if (!vkh_presenter_acquireNextImage(r, fence)) { - for (uint i=0; i < r->imgCount;i++){ - if (fences[i]!=NULL){ - vkDestroyFence (e->dev->dev, fences[i], NULL); - fences[i] = NULL; - } + + if (!vkh_presenter_acquireNextImage(r, NULL, NULL)) { + for (uint i=0; i < r->imgCount;i++) vkvg_surface_destroy (surfaces[i]); - } - vkDestroyFence (e->dev->dev, fence, NULL); + vkh_presenter_create_swapchain (r); + for (uint i=0; i < r->imgCount;i++) surfaces[i] = vkvg_surface_create_for_VkhImage (device, r->ScBuffers[i]); }else{ surf = surfaces[r->currentScBufferIndex]; - if (fences[r->currentScBufferIndex] != NULL){ - vkWaitForFences (e->dev->dev, 1, &fences[r->currentScBufferIndex], VK_TRUE, UINT64_MAX); - vkDestroyFence (e->dev->dev, fences[r->currentScBufferIndex], NULL); - } - fences[r->currentScBufferIndex] = fence; testfunc(); @@ -208,7 +197,7 @@ void perform_test (void(*testfunc)(void),uint width, uint height) { vkh_presenter_build_blit_cmd (r, vkvg_surface_get_vk_image(surf), width, height); #endif - //vkDeviceWaitIdle(e->dev->dev); + vkDeviceWaitIdle(e->dev->dev); gettimeofday(&after , NULL); @@ -223,12 +212,9 @@ void perform_test (void(*testfunc)(void),uint width, uint height) { vkDeviceWaitIdle(e->dev->dev); #ifdef VKVG_TEST_DIRECT_DRAW - for (int i=0; iimgCount;i++){ + for (uint i=0; iimgCount;i++) vkvg_surface_destroy (surfaces[i]); - if (fences[i]!=NULL) - vkDestroyFence (e->dev->dev, fences[i], NULL); - } - free (fences); + free (surfaces); #else vkvg_surface_destroy (surf); diff --git a/tests/common/vkengine.c b/tests/common/vkengine.c index 6f7265c..4b54ead 100644 --- a/tests/common/vkengine.c +++ b/tests/common/vkengine.c @@ -109,7 +109,7 @@ vk_engine_t* vkengine_create (VkPhysicalDeviceType preferedGPU, VkPresentModeKHR for (uint i=0;i