From 831cc5a572a196d681ab1968a2dc2a8e093ef7cf Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jean-Philippe=20Bruy=C3=A8re?= Date: Thu, 1 Jul 2021 11:31:31 +0200 Subject: [PATCH] fetch device proc addresses when possible, dashed closing corner bug, Diff and Clear pipelines --- src/vkvg_context.c | 15 ++++++-------- src/vkvg_context_internal.c | 6 ++++-- src/vkvg_device_internal.c | 40 +++++++++++++++++++------------------ src/vkvg_device_internal.h | 5 ++--- vkh | 2 +- 5 files changed, 34 insertions(+), 34 deletions(-) diff --git a/src/vkvg_context.c b/src/vkvg_context.c index 33e4c4b..76cb7de 100644 --- a/src/vkvg_context.c +++ b/src/vkvg_context.c @@ -636,6 +636,7 @@ void _draw_stoke_cap (VkvgContext ctx, float hw, vec2 p0, vec2 n, bool isStart) static bool dashOn = true; static uint32_t curDash = 0; //current dash index static float curDashOffset = 0.f; //cur dash offset between defined path point and last dash segment(on/off) start +static float totDashLength = 0; //total length of dashes static vec2 normal = {0}; float _draw_dashed_segment (VkvgContext ctx, float hw, vec2 pL, vec2 p, vec2 pR, bool isCurve) { @@ -651,11 +652,12 @@ float _draw_dashed_segment (VkvgContext ctx, float hw, vec2 pL, vec2 p, vec2 pR, _draw_stoke_cap (ctx, hw, p0, normal, dashOn); dashOn ^= true; + curDashOffset += ctx->dashes[curDash]; if (++curDash == ctx->dashCount) curDash = 0; - curDashOffset += ctx->dashes[curDash]; } curDashOffset -= segmentLength; + curDashOffset = fmodf(curDashOffset, totDashLength); return segmentLength; } static uint32_t curPathPointIdx, lastPathPointIdx, ptrPath, iL, iR; @@ -701,19 +703,14 @@ void vkvg_stroke_preserve (VkvgContext ctx) curDash = 0; //current dash index //limit offset to total length of dashes - float totDashLength = 0; + totDashLength = 0; for (uint32_t i=0;idashCount;i++) - totDashLength+=ctx->dashes[i]; + totDashLength += ctx->dashes[i]; if (totDashLength == 0){ ctx->status = VKVG_STATUS_INVALID_DASH; return; } - /*if (ctx->dashOffset == 0) - curDashOffset = 0; - else*/ - curDashOffset = fmodf(ctx->dashOffset, totDashLength); //cur dash offset between defined path point and last dash segment(on/off) start - //----- - + curDashOffset = fmodf(ctx->dashOffset, totDashLength); //cur dash offset between defined path point and last dash segment(on/off) start iL = lastPathPointIdx; } else if (_path_is_closed(ctx,ptrPath)){ iL = lastPathPointIdx; diff --git a/src/vkvg_context_internal.c b/src/vkvg_context_internal.c index 025b63e..f06245f 100644 --- a/src/vkvg_context_internal.c +++ b/src/vkvg_context_internal.c @@ -491,10 +491,12 @@ void _bind_draw_pipeline (VkvgContext ctx) { case VKVG_OPERATOR_OVER: CmdBindPipeline(ctx->cmd, VK_PIPELINE_BIND_POINT_GRAPHICS, ctx->pSurf->dev->pipe_OVER); break; - case VKVG_OPERATOR_CLEAR: - vkvg_set_source_rgba(ctx,0,0,0,0); + case VKVG_OPERATOR_CLEAR: CmdBindPipeline(ctx->cmd, VK_PIPELINE_BIND_POINT_GRAPHICS, ctx->pSurf->dev->pipe_CLEAR); break; + case VKVG_OPERATOR_DIFFERENCE: + CmdBindPipeline(ctx->cmd, VK_PIPELINE_BIND_POINT_GRAPHICS, ctx->pSurf->dev->pipe_SUB); + break; default: CmdBindPipeline(ctx->cmd, VK_PIPELINE_BIND_POINT_GRAPHICS, ctx->pSurf->dev->pipe_OVER); break; diff --git a/src/vkvg_device_internal.c b/src/vkvg_device_internal.c index de463e9..fb199c9 100644 --- a/src/vkvg_device_internal.c +++ b/src/vkvg_device_internal.c @@ -22,6 +22,8 @@ #define GetInstProcAddress(inst, func)(PFN_##func)vkGetInstanceProcAddr(inst, #func); +#define GetVkProcAddress(dev, inst, func)(vkGetDeviceProcAddr(dev,#func)==NULL)?(PFN_##func)vkGetInstanceProcAddr(inst, #func):(PFN_##func)vkGetDeviceProcAddr(dev, #func) + #include "vkvg_device_internal.h" #include "vkvg_context_internal.h" #include "shaders.h" @@ -33,8 +35,8 @@ PFN_vkCmdBindDescriptorSets CmdBindDescriptorSets; PFN_vkCmdBindIndexBuffer CmdBindIndexBuffer; PFN_vkCmdBindVertexBuffers CmdBindVertexBuffers; -PFN_vkCmdDrawIndexed CmdDrawIndexed; -PFN_vkCmdDraw CmdDraw; +PFN_vkCmdDrawIndexed CmdDrawIndexed; +PFN_vkCmdDraw CmdDraw; PFN_vkCmdSetStencilCompareMask CmdSetStencilCompareMask; PFN_vkCmdSetStencilReference CmdSetStencilReference; @@ -45,7 +47,6 @@ PFN_vkCmdSetViewport CmdSetViewport; PFN_vkCmdSetScissor CmdSetScissor; PFN_vkCmdPushConstants CmdPushConstants; -PFN_vkCmdPushDescriptorSetKHR CmdPushDescriptorSet; void _flush_all_contexes (VkvgDevice dev){ VkvgContext ctx = dev->lastCtx; @@ -346,9 +347,11 @@ void _setupPipelines(VkvgDevice dev) blendAttachmentState.alphaBlendOp = blendAttachmentState.colorBlendOp = VK_BLEND_OP_SUBTRACT; VK_CHECK_RESULT(vkCreateGraphicsPipelines(dev->vkDev, dev->pipelineCache, 1, &pipelineCreateInfo, NULL, &dev->pipe_SUB)); - blendAttachmentState.blendEnable = VK_FALSE; + //blendAttachmentState.blendEnable = VK_FALSE; //rasterizationState.polygonMode = VK_POLYGON_MODE_POINT; //shaderStages[1].pName = "op_CLEAR"; + blendAttachmentState.srcAlphaBlendFactor = blendAttachmentState.dstAlphaBlendFactor = + blendAttachmentState.srcColorBlendFactor = blendAttachmentState.dstColorBlendFactor = VK_BLEND_FACTOR_ZERO; VK_CHECK_RESULT(vkCreateGraphicsPipelines(dev->vkDev, dev->pipelineCache, 1, &pipelineCreateInfo, NULL, &dev->pipe_CLEAR)); @@ -420,21 +423,20 @@ bool _init_function_pointers (VkvgDevice dev) { } vkh_device_init_debug_utils ((VkhDevice)dev); #endif - CmdBindPipeline = GetInstProcAddress(dev->instance, vkCmdBindPipeline); - CmdBindDescriptorSets = GetInstProcAddress(dev->instance, vkCmdBindDescriptorSets); - CmdBindIndexBuffer = GetInstProcAddress(dev->instance, vkCmdBindIndexBuffer); - CmdBindVertexBuffers = GetInstProcAddress(dev->instance, vkCmdBindVertexBuffers); - CmdDrawIndexed = GetInstProcAddress(dev->instance, vkCmdDrawIndexed); - CmdDraw = GetInstProcAddress(dev->instance, vkCmdDraw); - CmdSetStencilCompareMask= GetInstProcAddress(dev->instance, vkCmdSetStencilCompareMask); - CmdSetStencilReference = GetInstProcAddress(dev->instance, vkCmdSetStencilReference); - CmdSetStencilWriteMask = GetInstProcAddress(dev->instance, vkCmdSetStencilWriteMask); - CmdBeginRenderPass = GetInstProcAddress(dev->instance, vkCmdBeginRenderPass); - CmdEndRenderPass = GetInstProcAddress(dev->instance, vkCmdEndRenderPass); - CmdSetViewport = GetInstProcAddress(dev->instance, vkCmdSetViewport); - CmdSetScissor = GetInstProcAddress(dev->instance, vkCmdSetScissor); - CmdPushConstants = GetInstProcAddress(dev->instance, vkCmdPushConstants); - CmdPushDescriptorSet = (PFN_vkCmdPushDescriptorSetKHR)vkGetInstanceProcAddr(dev->instance, "vkCmdDescriptorSet"); + CmdBindPipeline = GetVkProcAddress(dev->vkDev, dev->instance, vkCmdBindPipeline); + CmdBindDescriptorSets = GetVkProcAddress(dev->vkDev, dev->instance, vkCmdBindDescriptorSets); + CmdBindIndexBuffer = GetVkProcAddress(dev->vkDev, dev->instance, vkCmdBindIndexBuffer); + 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); + CmdSetScissor = GetVkProcAddress(dev->vkDev, dev->instance, vkCmdSetScissor); + CmdPushConstants = GetVkProcAddress(dev->vkDev, dev->instance, vkCmdPushConstants); return true; } diff --git a/src/vkvg_device_internal.h b/src/vkvg_device_internal.h index ccd5917..05fc5e6 100644 --- a/src/vkvg_device_internal.h +++ b/src/vkvg_device_internal.h @@ -35,8 +35,8 @@ extern PFN_vkCmdBindDescriptorSets CmdBindDescriptorSets; extern PFN_vkCmdBindIndexBuffer CmdBindIndexBuffer; extern PFN_vkCmdBindVertexBuffers CmdBindVertexBuffers; -extern PFN_vkCmdDrawIndexed CmdDrawIndexed; -extern PFN_vkCmdDraw CmdDraw; +extern PFN_vkCmdDrawIndexed CmdDrawIndexed; +extern PFN_vkCmdDraw CmdDraw; extern PFN_vkCmdSetStencilCompareMask CmdSetStencilCompareMask; extern PFN_vkCmdSetStencilReference CmdSetStencilReference; @@ -47,7 +47,6 @@ extern PFN_vkCmdSetViewport CmdSetViewport; extern PFN_vkCmdSetScissor CmdSetScissor; extern PFN_vkCmdPushConstants CmdPushConstants; -extern PFN_vkCmdPushDescriptorSetKHR CmdPushDescriptorSet; typedef struct _vkvg_device_t{ VkDevice vkDev; /**< Vulkan Logical Device */ diff --git a/vkh b/vkh index 4e265c6..403f694 160000 --- a/vkh +++ b/vkh @@ -1 +1 @@ -Subproject commit 4e265c6e268201e09bb8471633d9bafff2700351 +Subproject commit 403f694bf90455f13b115ea7cf58495f58bde6cc -- 2.47.3