ctx->pSurf = surf;
ctx->curOperator = VKVG_OPERATOR_OVER;
ctx->curFillRule = VKVG_FILL_RULE_NON_ZERO;
+ ctx->curSavBit = 0x4;
push_constants pc = {
{.height=1},
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;
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){
_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;
ctx->currentFont = sav->currentFont;
ctx->textDirection= sav->textDirection;
- _wait_and_reset_ctx_cmd (ctx);
- _init_cmd_buff (ctx);
-
_free_ctx_save(sav);
}
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);
//
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);
}