diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/vkvg_context.c | 37 | ||||
| -rw-r--r-- | src/vkvg_context_internal.c | 6 | ||||
| -rw-r--r-- | src/vkvg_device_internal.c | 2 | ||||
| -rw-r--r-- | src/vkvg_device_internal.h | 6 | ||||
| -rw-r--r-- | src/vkvg_surface_internal.c | 23 |
5 files changed, 23 insertions, 51 deletions
diff --git a/src/vkvg_context.c b/src/vkvg_context.c index 8f35871..e1edfe3 100644 --- a/src/vkvg_context.c +++ b/src/vkvg_context.c @@ -842,37 +842,16 @@ void _clip_preserve(VkvgContext ctx) { #if defined(DEBUG) && defined(VKVG_DBG_UTILS) vkh_cmd_label_start(ctx->cmd, "clip", DBG_LAB_COLOR_CLIP); #endif - - /*if (ctx->curFillRule == VKVG_FILL_RULE_EVEN_ODD) { - _poly_fill(ctx, NULL); - CmdBindPipeline(ctx->cmd, VK_PIPELINE_BIND_POINT_GRAPHICS, ctx->pSurf->surfClass->pipelineClipping); - } else { - CmdBindPipeline(ctx->cmd, VK_PIPELINE_BIND_POINT_GRAPHICS, ctx->pSurf->surfClass->pipelineClipping); - CmdSetStencilReference(ctx->cmd, VK_STENCIL_FRONT_AND_BACK, STENCIL_FILL_BIT); - CmdSetStencilCompareMask(ctx->cmd, VK_STENCIL_FRONT_AND_BACK, STENCIL_CLIP_BIT); - CmdSetStencilWriteMask(ctx->cmd, VK_STENCIL_FRONT_AND_BACK, STENCIL_FILL_BIT); - _fill_non_zero(ctx); - _emit_draw_cmd_undrawn_vertices(ctx); - } - CmdSetStencilReference(ctx->cmd, VK_STENCIL_FRONT_AND_BACK, STENCIL_CLIP_BIT); - CmdSetStencilCompareMask(ctx->cmd, VK_STENCIL_FRONT_AND_BACK, STENCIL_FILL_BIT); - CmdSetStencilWriteMask(ctx->cmd, VK_STENCIL_FRONT_AND_BACK, STENCIL_ALL_BIT); - - _draw_full_screen_quad(ctx, NULL);*/ - CmdBindPipeline(ctx->cmd, VK_PIPELINE_BIND_POINT_GRAPHICS, ctx->pSurf->surfClass->pipelineClipping); CmdSetStencilReference(ctx->cmd, VK_STENCIL_FRONT_AND_BACK, ctx->curClipRef); - CmdSetStencilCompareMask(ctx->cmd, VK_STENCIL_FRONT_AND_BACK, STENCIL_ALL_BIT); - CmdSetStencilWriteMask(ctx->cmd, VK_STENCIL_FRONT_AND_BACK, STENCIL_ALL_BIT); + _fill_non_zero(ctx); _emit_draw_cmd_undrawn_vertices(ctx); ctx->curClipRef++; + _bind_draw_pipeline(ctx); CmdSetStencilReference(ctx->cmd, VK_STENCIL_FRONT_AND_BACK, ctx->curClipRef); - CmdSetStencilCompareMask(ctx->cmd, VK_STENCIL_FRONT_AND_BACK, STENCIL_CLIP_BIT); - CmdSetStencilWriteMask(ctx->cmd, VK_STENCIL_FRONT_AND_BACK, STENCIL_ALL_BIT); - #if defined(DEBUG) && defined(VKVG_DBG_UTILS) vkh_cmd_label_end(ctx->cmd); #endif @@ -892,9 +871,9 @@ void _fill_preserve(VkvgContext ctx) { vec4 bounds = {FLT_MAX, FLT_MAX, FLT_MIN, FLT_MIN}; _poly_fill(ctx, &bounds); _bind_draw_pipeline(ctx); - CmdSetStencilCompareMask(ctx->cmd, VK_STENCIL_FRONT_AND_BACK, STENCIL_FILL_BIT); + CmdSetStencilReference(ctx->cmd, VK_STENCIL_FRONT_AND_BACK, STENCIL_FILL_MASK); _draw_full_screen_quad(ctx, &bounds); - CmdSetStencilCompareMask(ctx->cmd, VK_STENCIL_FRONT_AND_BACK, STENCIL_CLIP_BIT); + CmdSetStencilReference(ctx->cmd, VK_STENCIL_FRONT_AND_BACK, ctx->curClipRef); return; } @@ -1157,13 +1136,15 @@ void vkvg_set_operator(VkvgContext ctx, vkvg_operator_t op) { if (op == ctx->curOperator) return; - _emit_draw_cmd_undrawn_vertices( - ctx); // draw call with different ops cant be combined, so emit draw cmd for previous vertices. + // draw call with different ops cant be combined, so emit draw cmd for previous vertices. + _emit_draw_cmd_undrawn_vertices(ctx); ctx->curOperator = op; - if (ctx->cmdStarted) + if (ctx->cmdStarted) { _bind_draw_pipeline(ctx); + CmdSetStencilReference(ctx->cmd, VK_STENCIL_FRONT_AND_BACK, ctx->curClipRef); + } } void vkvg_set_fill_rule(VkvgContext ctx, vkvg_fill_rule_t fr) { if (vkvg_status(ctx)) diff --git a/src/vkvg_context_internal.c b/src/vkvg_context_internal.c index 41a43a4..bcbc609 100644 --- a/src/vkvg_context_internal.c +++ b/src/vkvg_context_internal.c @@ -645,9 +645,8 @@ void _start_cmd_for_render_pass(VkvgContext ctx) { _update_push_constants(ctx); _bind_draw_pipeline(ctx); - //CmdSetStencilCompareMask(ctx->cmd, VK_STENCIL_FRONT_AND_BACK, STENCIL_CLIP_BIT); - CmdSetStencilCompareMask(ctx->cmd, VK_STENCIL_FRONT_AND_BACK, 0xff); CmdSetStencilReference(ctx->cmd, VK_STENCIL_FRONT_AND_BACK, ctx->curClipRef); + ctx->cmdStarted = true; } // compute inverse mat used in shader when context matrix has changed @@ -682,7 +681,7 @@ void _update_cur_pattern(VkvgContext ctx, VkvgPattern pat) { //if lastpat has only one ref, descriptorSet would be destroyed, so flush context if (vkvg_pattern_get_reference_count(lastPat) == 1) vkvg_flush(ctx); - if (newPatternType != VKVG_PATTERN_TYPE_SURFACE) + else if (newPatternType != VKVG_PATTERN_TYPE_SURFACE) CmdBindDescriptorSets(ctx->cmd, VK_PIPELINE_BIND_POINT_GRAPHICS, ctx->dev->pipelineLayout, 1, 1, &ctx->dev->dummySrcSet, 0, NULL); break; @@ -1494,6 +1493,7 @@ void _poly_fill(VkvgContext ctx, vec4* bounds) { } CmdBindPipeline(ctx->cmd, VK_PIPELINE_BIND_POINT_GRAPHICS, ctx->pSurf->surfClass->pipelinePolyFill); + CmdSetStencilReference(ctx->cmd, VK_STENCIL_FRONT_AND_BACK, ctx->curClipRef); Vertex v = {{0}, ctx->curColor, {0, 0, -1}}; uint32_t ptrPath = 0; diff --git a/src/vkvg_device_internal.c b/src/vkvg_device_internal.c index b2064c9..2c79c2c 100644 --- a/src/vkvg_device_internal.c +++ b/src/vkvg_device_internal.c @@ -209,9 +209,7 @@ bool _device_init_function_pointers(VkvgDevice dev) { CmdBindVertexBuffers = GetVkProcAddress(dev->vkDev, dev->instance, vkCmdBindVertexBuffers); CmdDrawIndexed = GetVkProcAddress(dev->vkDev, dev->instance, vkCmdDrawIndexed); CmdDraw = GetVkProcAddress(dev->vkDev, dev->instance, vkCmdDraw); - CmdSetStencilCompareMask = GetVkProcAddress(dev->vkDev, dev->instance, vkCmdSetStencilCompareMask); CmdSetStencilReference = GetVkProcAddress(dev->vkDev, dev->instance, vkCmdSetStencilReference); - CmdSetStencilWriteMask = GetVkProcAddress(dev->vkDev, dev->instance, vkCmdSetStencilWriteMask); CmdBeginRenderPass = GetVkProcAddress(dev->vkDev, dev->instance, vkCmdBeginRenderPass); CmdEndRenderPass = GetVkProcAddress(dev->vkDev, dev->instance, vkCmdEndRenderPass); CmdSetViewport = GetVkProcAddress(dev->vkDev, dev->instance, vkCmdSetViewport); diff --git a/src/vkvg_device_internal.h b/src/vkvg_device_internal.h index 09df720..37cb29f 100644 --- a/src/vkvg_device_internal.h +++ b/src/vkvg_device_internal.h @@ -7,8 +7,8 @@ #include "vkvg_fonts.h" #include "vkvg_internal.h" -#define STENCIL_FILL_BIT 1 << 7 -#define STENCIL_CLIP_BIT 0xFF +#define STENCIL_FILL_MASK 0x80 +#define STENCIL_CLIP_MASK 0x7F #define STENCIL_ALL_BIT 0xFF #define VKVG_MAX_CACHED_CONTEXT_COUNT 2 @@ -21,9 +21,7 @@ extern PFN_vkCmdBindVertexBuffers CmdBindVertexBuffers; extern PFN_vkCmdDrawIndexed CmdDrawIndexed; extern PFN_vkCmdDraw CmdDraw; -extern PFN_vkCmdSetStencilCompareMask CmdSetStencilCompareMask; extern PFN_vkCmdSetStencilReference CmdSetStencilReference; -extern PFN_vkCmdSetStencilWriteMask CmdSetStencilWriteMask; extern PFN_vkCmdBeginRenderPass CmdBeginRenderPass; extern PFN_vkCmdEndRenderPass CmdEndRenderPass; extern PFN_vkCmdSetViewport CmdSetViewport; diff --git a/src/vkvg_surface_internal.c b/src/vkvg_surface_internal.c index 9483f06..bf7e91d 100644 --- a/src/vkvg_surface_internal.c +++ b/src/vkvg_surface_internal.c @@ -264,23 +264,23 @@ void _setupPipelines(surface_class* surf) { VkStencilOpState polyFillOpState = {VK_STENCIL_OP_KEEP, VK_STENCIL_OP_INVERT, VK_STENCIL_OP_KEEP, - VK_COMPARE_OP_EQUAL, - STENCIL_CLIP_BIT, - STENCIL_FILL_BIT, + VK_COMPARE_OP_LESS_OR_EQUAL, + STENCIL_CLIP_MASK, + STENCIL_FILL_MASK, 0}; VkStencilOpState clipingOpState = {VK_STENCIL_OP_KEEP, VK_STENCIL_OP_INCREMENT_AND_CLAMP, VK_STENCIL_OP_KEEP, VK_COMPARE_OP_LESS_OR_EQUAL, - STENCIL_ALL_BIT, - STENCIL_ALL_BIT, + STENCIL_CLIP_MASK, + STENCIL_CLIP_MASK, 0x0}; VkStencilOpState stencilOpState = {VK_STENCIL_OP_KEEP, - VK_STENCIL_OP_KEEP, + VK_STENCIL_OP_ZERO, VK_STENCIL_OP_KEEP, VK_COMPARE_OP_LESS_OR_EQUAL, STENCIL_ALL_BIT, - STENCIL_ALL_BIT, + STENCIL_FILL_MASK, 0x0}; VkPipelineDepthStencilStateCreateInfo dsStateCreateInfo = { @@ -295,12 +295,10 @@ void _setupPipelines(surface_class* surf) { VkDynamicState dynamicStateEnables[] = { VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR, - VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK, - VK_DYNAMIC_STATE_STENCIL_REFERENCE, - VK_DYNAMIC_STATE_STENCIL_WRITE_MASK, + VK_DYNAMIC_STATE_STENCIL_REFERENCE }; VkPipelineDynamicStateCreateInfo dynamicState = {.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO, - .dynamicStateCount = 2, + .dynamicStateCount = 3, .pDynamicStates = dynamicStateEnables}; VkPipelineViewportStateCreateInfo viewportState = { @@ -389,18 +387,15 @@ void _setupPipelines(surface_class* surf) { inputAssemblyState.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST; dsStateCreateInfo.back = dsStateCreateInfo.front = clipingOpState; - dynamicState.dynamicStateCount = 5; VK_CHECK_RESULT(vkCreateGraphicsPipelines(dev->vkDev, dev->pipelineCache, 1, &pipelineCreateInfo, NULL, &surf->pipelineClipping)); dsStateCreateInfo.back = dsStateCreateInfo.front = stencilOpState; blendAttachmentState.colorWriteMask = 0xf; - dynamicState.dynamicStateCount = 5; pipelineCreateInfo.stageCount = 2; VK_CHECK_RESULT( vkCreateGraphicsPipelines(dev->vkDev, dev->pipelineCache, 1, &pipelineCreateInfo, NULL, &surf->pipe_OVER)); - dynamicState.dynamicStateCount = 3; blendAttachmentState.alphaBlendOp = blendAttachmentState.colorBlendOp = VK_BLEND_OP_SUBTRACT; VK_CHECK_RESULT( vkCreateGraphicsPipelines(dev->vkDev, dev->pipelineCache, 1, &pipelineCreateInfo, NULL, &surf->pipe_SUB)); |