From: Jean-Philippe Bruyère Date: Wed, 1 May 2019 17:48:42 +0000 (+0200) Subject: save stencil state in remaining bits, limit save/restore to 6 layers X-Git-Tag: v0.1-alpha~83 X-Git-Url: https://git.osiis.dedyn.io/?a=commitdiff_plain;h=f35695f4df615e5a41e63625261a53509577bbec;p=jp%2Fvkvg.git save stencil state in remaining bits, limit save/restore to 6 layers --- diff --git a/src/vkvg_context.c b/src/vkvg_context.c index 894ea50..5f33fca 100644 --- a/src/vkvg_context.c +++ b/src/vkvg_context.c @@ -62,6 +62,7 @@ VkvgContext vkvg_create(VkvgSurface surf) ctx->pSurf = surf; ctx->curOperator = VKVG_OPERATOR_OVER; ctx->curFillRule = VKVG_FILL_RULE_NON_ZERO; + ctx->curSavBit = 0x4; push_constants pc = { {.height=1}, @@ -753,34 +754,19 @@ void vkvg_save (VkvgContext ctx){ VkvgDevice dev = ctx->pSurf->dev; vkvg_context_save_t* sav = (vkvg_context_save_t*)calloc(1,sizeof(vkvg_context_save_t)); - sav->stencil = vkh_image_ms_create ((VkhDevice)dev,VK_FORMAT_S8_UINT, dev->samples, ctx->pSurf->width, ctx->pSurf->height, - VMA_MEMORY_USAGE_GPU_ONLY, - VK_IMAGE_USAGE_TRANSFER_SRC_BIT|VK_IMAGE_USAGE_TRANSFER_DST_BIT); + _start_cmd_for_render_pass(ctx); - vkh_cmd_begin (ctx->cmd, VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT); - ctx->cmdStarted = true; + CmdBindPipeline(ctx->cmd, VK_PIPELINE_BIND_POINT_GRAPHICS, ctx->pSurf->dev->pipelineClipping); - vkh_image_set_layout (ctx->cmd, ctx->pSurf->stencil, VK_IMAGE_ASPECT_STENCIL_BIT, - VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, - VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT); - vkh_image_set_layout (ctx->cmd, sav->stencil, VK_IMAGE_ASPECT_STENCIL_BIT, - VK_IMAGE_LAYOUT_GENERAL, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, - VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT); + CmdSetStencilReference(ctx->cmd, VK_STENCIL_FRONT_AND_BACK, STENCIL_CLIP_BIT|ctx->curSavBit); + CmdSetStencilCompareMask(ctx->cmd, VK_STENCIL_FRONT_AND_BACK, STENCIL_CLIP_BIT); + CmdSetStencilWriteMask(ctx->cmd, VK_STENCIL_FRONT_AND_BACK, ctx->curSavBit); - VkImageCopy cregion = { .srcSubresource = {VK_IMAGE_ASPECT_STENCIL_BIT, 0, 0, 1}, - .dstSubresource = {VK_IMAGE_ASPECT_STENCIL_BIT, 0, 0, 1}, - .extent = {ctx->pSurf->width,ctx->pSurf->height,1}}; - vkCmdCopyImage(ctx->cmd, - vkh_image_get_vkimage (ctx->pSurf->stencil),VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, - vkh_image_get_vkimage (sav->stencil), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, - 1, &cregion); + CmdDrawIndexed (ctx->cmd,6,1,0,0,0); - vkh_image_set_layout (ctx->cmd, ctx->pSurf->stencil, VK_IMAGE_ASPECT_STENCIL_BIT, - VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, - VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT); + _bind_draw_pipeline (ctx); + CmdSetStencilCompareMask(ctx->cmd, VK_STENCIL_FRONT_AND_BACK, STENCIL_CLIP_BIT); - VK_CHECK_RESULT(vkEndCommandBuffer(ctx->cmd)); - _submit_ctx_cmd(ctx); sav->lineWidth = ctx->lineWidth; sav->curOperator= ctx->curOperator; @@ -799,12 +785,10 @@ void vkvg_save (VkvgContext ctx){ sav->pNext = ctx->pSavedCtxs; ctx->pSavedCtxs = sav; + ctx->curSavBit = (ctx->curSavBit << 1); if (ctx->pattern) vkvg_pattern_reference (ctx->pattern); - - _wait_and_reset_ctx_cmd (ctx); - _init_cmd_buff (ctx); } void vkvg_restore (VkvgContext ctx){ if (ctx->pSavedCtxs == NULL){ @@ -824,29 +808,20 @@ void vkvg_restore (VkvgContext ctx){ _flush_cmd_buff(ctx); - vkh_cmd_begin (ctx->cmd, VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT); - ctx->cmdStarted = true; - - vkh_image_set_layout (ctx->cmd, ctx->pSurf->stencil, VK_IMAGE_ASPECT_STENCIL_BIT, - VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, - VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT); - vkh_image_set_layout (ctx->cmd, sav->stencil, VK_IMAGE_ASPECT_STENCIL_BIT, - VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, - VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT); - - VkImageCopy cregion = { .srcSubresource = {VK_IMAGE_ASPECT_STENCIL_BIT, 0, 0, 1}, - .dstSubresource = {VK_IMAGE_ASPECT_STENCIL_BIT, 0, 0, 1}, - .extent = {ctx->pSurf->width,ctx->pSurf->height,1}}; - vkCmdCopyImage(ctx->cmd, - vkh_image_get_vkimage (sav->stencil), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, - vkh_image_get_vkimage (ctx->pSurf->stencil),VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, - 1, &cregion); - vkh_image_set_layout (ctx->cmd, ctx->pSurf->stencil, VK_IMAGE_ASPECT_STENCIL_BIT, - VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, - VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT); - - VK_CHECK_RESULT(vkEndCommandBuffer(ctx->cmd)); - _submit_ctx_cmd(ctx); + ctx->curSavBit = (ctx->curSavBit >> 1); + + _start_cmd_for_render_pass(ctx); + + CmdBindPipeline(ctx->cmd, VK_PIPELINE_BIND_POINT_GRAPHICS, ctx->pSurf->dev->pipelineClipping); + + CmdSetStencilReference(ctx->cmd, VK_STENCIL_FRONT_AND_BACK, STENCIL_CLIP_BIT|ctx->curSavBit); + CmdSetStencilCompareMask(ctx->cmd, VK_STENCIL_FRONT_AND_BACK, ctx->curSavBit); + CmdSetStencilWriteMask(ctx->cmd, VK_STENCIL_FRONT_AND_BACK, STENCIL_CLIP_BIT); + + CmdDrawIndexed (ctx->cmd,6,1,0,0,0); + + _bind_draw_pipeline (ctx); + CmdSetStencilCompareMask(ctx->cmd, VK_STENCIL_FRONT_AND_BACK, STENCIL_CLIP_BIT); ctx->lineWidth = sav->lineWidth; ctx->curOperator= sav->curOperator; @@ -860,9 +835,6 @@ void vkvg_restore (VkvgContext ctx){ ctx->currentFont = sav->currentFont; ctx->textDirection= sav->textDirection; - _wait_and_reset_ctx_cmd (ctx); - _init_cmd_buff (ctx); - _free_ctx_save(sav); } diff --git a/src/vkvg_context_internal.c b/src/vkvg_context_internal.c index 2a76b0e..465c1de 100644 --- a/src/vkvg_context_internal.c +++ b/src/vkvg_context_internal.c @@ -305,10 +305,11 @@ void _start_cmd_for_render_pass (VkvgContext ctx) { CmdBindVertexBuffers(ctx->cmd, 0, 1, &ctx->vertices.buffer, offsets); CmdBindIndexBuffer(ctx->cmd, ctx->indices.buffer, 0, VK_INDEX_TYPE_UINT32); + _update_push_constants (ctx); + _bind_draw_pipeline (ctx); CmdSetStencilCompareMask(ctx->cmd, VK_STENCIL_FRONT_AND_BACK, STENCIL_CLIP_BIT); - _update_push_constants (ctx); ctx->cmdStarted = true; } diff --git a/src/vkvg_context_internal.h b/src/vkvg_context_internal.h index bc222d3..e711f81 100644 --- a/src/vkvg_context_internal.h +++ b/src/vkvg_context_internal.h @@ -129,6 +129,7 @@ typedef struct _vkvg_context_t { vkvg_status_t status; vkvg_context_save_t* pSavedCtxs;//last ctx saved ptr + unsigned char curSavBit;//current stencil bit used to save context VkClearRect clearRect; VkRenderPassBeginInfo renderPassBeginInfo; diff --git a/src/vkvg_device_internal.c b/src/vkvg_device_internal.c index 9e92efb..5170832 100644 --- a/src/vkvg_device_internal.c +++ b/src/vkvg_device_internal.c @@ -59,7 +59,7 @@ VkRenderPass _createRenderPassNoResolve(VkvgDevice dev, VkAttachmentLoadOp loadO .initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, .finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL }; VkAttachmentDescription attDS = { - .format = VK_FORMAT_S8_UINT, + .format = FB_STENCIL_FORMAT, .samples = dev->samples, .loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE, .storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE, @@ -122,7 +122,7 @@ VkRenderPass _createRenderPassMS(VkvgDevice dev, VkAttachmentLoadOp loadOp, VkAt .initialLayout = VK_IMAGE_LAYOUT_UNDEFINED, .finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL }; VkAttachmentDescription attDS = { - .format = VK_FORMAT_S8_UINT, + .format = FB_STENCIL_FORMAT, .samples = dev->samples, .loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE, .storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE, diff --git a/src/vkvg_internal.h b/src/vkvg_internal.h index 9801167..40a336f 100644 --- a/src/vkvg_internal.h +++ b/src/vkvg_internal.h @@ -39,4 +39,10 @@ #include "vectors.h" #include "cross_mutex.h" +//width of the stencil buffer will determine the number of context saving/restore layers +//the two first bits of the stencil are the FILL and the CLIP bits, all other bits are +//used to store clipping bit on context saving. 8 bit stencil will allow 6 save/restore layer +#define FB_STENCIL_FORMAT VK_FORMAT_S8_UINT +#define FB_COLOR_FORMAT VK_FORMAT_B8G8R8A8_UNORM + #endif diff --git a/src/vkvg_surface.c b/src/vkvg_surface.c index df9ac8d..2b1a97f 100644 --- a/src/vkvg_surface.c +++ b/src/vkvg_surface.c @@ -122,7 +122,7 @@ void _create_surface_secondary_images (VkvgSurface surf) { vkh_image_create_descriptor(surf->imgMS, VK_IMAGE_VIEW_TYPE_2D, VK_IMAGE_ASPECT_COLOR_BIT, VK_FILTER_NEAREST, VK_FILTER_NEAREST, VK_SAMPLER_MIPMAP_MODE_NEAREST,VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE); } - surf->stencil = vkh_image_ms_create((VkhDevice)surf->dev,VK_FORMAT_S8_UINT,surf->dev->samples,surf->width,surf->height,VMA_MEMORY_USAGE_GPU_ONLY, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT|VK_IMAGE_USAGE_TRANSFER_DST_BIT|VK_IMAGE_USAGE_TRANSFER_SRC_BIT); + surf->stencil = vkh_image_ms_create((VkhDevice)surf->dev,FB_STENCIL_FORMAT,surf->dev->samples,surf->width,surf->height,VMA_MEMORY_USAGE_GPU_ONLY, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT|VK_IMAGE_USAGE_TRANSFER_DST_BIT|VK_IMAGE_USAGE_TRANSFER_SRC_BIT); vkh_image_create_descriptor(surf->stencil, VK_IMAGE_VIEW_TYPE_2D, VK_IMAGE_ASPECT_STENCIL_BIT, VK_FILTER_NEAREST, VK_FILTER_NEAREST, VK_SAMPLER_MIPMAP_MODE_NEAREST,VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE); } diff --git a/tests/clip.c b/tests/clip.c index e2763e1..e618974 100644 --- a/tests/clip.c +++ b/tests/clip.c @@ -27,10 +27,36 @@ void test_clip2(){ vkvg_surface_clear(surf); VkvgContext ctx = vkvg_create(surf); vkvg_set_fill_rule(ctx, VKVG_FILL_RULE_NON_ZERO); - vkvg_rectangle(ctx, 50,50,200,200); - vkvg_rectangle(ctx, 100,100,250,250); + vkvg_rectangle(ctx, 50,50,500,500); vkvg_clip(ctx); - //vkvg_rectangle(ctx, 150,150,200,200); + + vkvg_set_source_rgb(ctx,1,0,0); + vkvg_paint(ctx); + + vkvg_save(ctx); + vkvg_rectangle(ctx, 100,100,350,350); + vkvg_clip(ctx); + vkvg_save(ctx); + + + vkvg_set_source_rgb(ctx,1,1,0); + vkvg_paint(ctx); + + + vkvg_rectangle(ctx, 200,200,200,200); + vkvg_clip(ctx); + + vkvg_set_source_rgb(ctx,0,1,0); + vkvg_paint(ctx); + + vkvg_restore(ctx); + + + vkvg_rectangle(ctx, 350,350,420,420); + vkvg_set_source_rgb(ctx,0,0,1); + vkvg_fill(ctx); + + vkvg_restore(ctx); //vkvg_clip(ctx); // @@ -44,13 +70,7 @@ void test_clip2(){ vkvg_paint(ctx);*/ - vkvg_set_source_rgb(ctx,0,1,0); - vkvg_paint(ctx); - vkvg_rectangle(ctx, 60,60,480,480); - vkvg_clip(ctx); - vkvg_set_source_rgb(ctx,1,0,0); - vkvg_paint(ctx); vkvg_destroy(ctx); } diff --git a/tests/painting.c b/tests/painting.c index f8ac370..141cd75 100644 --- a/tests/painting.c +++ b/tests/painting.c @@ -6,11 +6,11 @@ void test(){ VkvgContext ctx = vkvg_create (surf); - vkvg_set_source_surface(ctx,surf2,0,0); + /*vkvg_set_source_surface(ctx,surf2,0,0); vkvg_paint (ctx); vkvg_destroy (ctx); - return; + return;*/ //vkvg_set_source_rgba(ctx,0.1,0.1,0.3,1.0); //vkvg_paint (ctx); @@ -18,8 +18,8 @@ void test(){ for (int i=0; i<10; i++) { vkvg_translate(ctx,50,50); - /*vkvg_save(ctx); - + vkvg_save(ctx); +/* vkvg_rectangle(ctx,0,0,200,200); vkvg_clip_preserve(ctx); vkvg_set_operator(ctx,VKVG_OPERATOR_CLEAR); @@ -34,7 +34,7 @@ void test(){ vkvg_set_source_surface(ctx,surf2,0,0); vkvg_paint (ctx); - //vkvg_restore(ctx); + vkvg_restore(ctx); } //VkvgPattern pat = vkvg_get_source (ctx); diff --git a/vkh b/vkh index e9cd185..24e6ffa 160000 --- a/vkh +++ b/vkh @@ -1 +1 @@ -Subproject commit e9cd1855b11fa23be0c9a452d9be4b239d76a485 +Subproject commit 24e6ffa99b66341a767caa434069530e9fc516a8