summaryrefslogtreecommitdiffstatsci
diff options
context:
space:
mode:
-rw-r--r--gunit_tests/context.cpp2
-rw-r--r--gunit_tests/patternDraw.cpp2
-rw-r--r--src/vkvg_context.c37
-rw-r--r--src/vkvg_context_internal.c6
-rw-r--r--src/vkvg_device_internal.c2
-rw-r--r--src/vkvg_device_internal.h6
-rw-r--r--src/vkvg_surface_internal.c23
7 files changed, 25 insertions, 53 deletions
diff --git a/gunit_tests/context.cpp b/gunit_tests/context.cpp
index 6b9a107..c3be79b 100644
--- a/gunit_tests/context.cpp
+++ b/gunit_tests/context.cpp
@@ -270,7 +270,7 @@ TEST_F(ContextTest, CtxSaveRestore) {
vkvg_restore(ctx);
- VkvgPattern srcPat = vkvg_get_source(ctx);
+ //VkvgPattern srcPat = vkvg_get_source(ctx);
/*vkvg_set_source_rgb(ctx, 0.4f, 0.5f, 0.6f);
vkvg_set_source_rgba(ctx, 0.4f, 0.5f, 0.6f, 0.5f);
diff --git a/gunit_tests/patternDraw.cpp b/gunit_tests/patternDraw.cpp
index 71145ae..ef04e39 100644
--- a/gunit_tests/patternDraw.cpp
+++ b/gunit_tests/patternDraw.cpp
@@ -37,7 +37,7 @@ TEST_F(PatternDrawTest, References) {
EXPECT_NO_FATAL_FAILURE(vkvg_pattern_reference(NULL));
VkvgPattern pat = vkvg_pattern_create_for_surface(NULL);
- EXPECT_EQ(VKVG_STATUS_NULL_POINTER, vkvg_pattern_status(pat));
+ EXPECT_EQ(VKVG_STATUS_INVALID_SURFACE, vkvg_pattern_status(pat));
pat = vkvg_pattern_create_linear(0, 0, 0, 0);
EXPECT_EQ(VKVG_STATUS_SUCCESS, vkvg_pattern_status(pat));
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));