]> O.S.I.I.S - jp/vkvg.git/commitdiff
save stencil state in remaining bits, limit save/restore to 6 layers
authorJean-Philippe Bruyère <jp_bruyere@hotmail.com>
Wed, 1 May 2019 17:48:42 +0000 (19:48 +0200)
committerJean-Philippe Bruyère <jp_bruyere@hotmail.com>
Wed, 1 May 2019 17:48:42 +0000 (19:48 +0200)
src/vkvg_context.c
src/vkvg_context_internal.c
src/vkvg_context_internal.h
src/vkvg_device_internal.c
src/vkvg_internal.h
src/vkvg_surface.c
tests/clip.c
tests/painting.c
vkh

index 894ea50b4097c171dc5d0298adc866daedfb0fd5..5f33fcae18b588a887886455026cc091a18cafb5 100644 (file)
@@ -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);
 }
 
index 2a76b0e59564b649756e6b549c23a8a756a07ba0..465c1de18fd2286d6ac63f16c7ff91dc9d6e4fbc 100644 (file)
@@ -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;
 }
index bc222d3597575625ca87799f2a9083c459bcfb23..e711f81580329e8e1db0a51eb0d38bce0e380043 100644 (file)
@@ -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;
index 9e92efba04e02ec58c4c2cf7a05565c3fd0fcf68..517083263933cb6c0d1d12b81c9e39966d9805dc 100644 (file)
@@ -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,
index 980116785a7434f45695f0026440015b9fe0d7c4..40a336f968184c2adf209b65250771463635b08d 100644 (file)
 #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
index df9ac8dd4c2a5bc2b62c2e7c52afffc0d7c7d4bf..2b1a97fddf8f58fcdc1a396bccd7939e5b3ee0a2 100644 (file)
@@ -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);
 }
index e2763e1fc5e8e7e40bfb69c3d61db396b93d3b8e..e6189749e6d88b3cea7ccbf9fdae81196d339d29 100644 (file)
@@ -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);
 }
index f8ac37084b7cb179c19188698c37bd520b27776f..141cd756476d32cb3cbfcc13bd27201aa6aec3b1 100644 (file)
@@ -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 e9cd1855b11fa23be0c9a452d9be4b239d76a485..24e6ffa99b66341a767caa434069530e9fc516a8 160000 (submodule)
--- a/vkh
+++ b/vkh
@@ -1 +1 @@
-Subproject commit e9cd1855b11fa23be0c9a452d9be4b239d76a485
+Subproject commit 24e6ffa99b66341a767caa434069530e9fc516a8