]> O.S.I.I.S - jp/vkvg.git/commitdiff
fetch device proc addresses when possible, dashed closing corner bug, Diff and Clear...
authorJean-Philippe Bruyère <jp_bruyere@hotmail.com>
Thu, 1 Jul 2021 09:31:31 +0000 (11:31 +0200)
committerJean-Philippe Bruyère <jp_bruyere@hotmail.com>
Thu, 1 Jul 2021 09:31:31 +0000 (11:31 +0200)
src/vkvg_context.c
src/vkvg_context_internal.c
src/vkvg_device_internal.c
src/vkvg_device_internal.h
vkh

index 33e4c4b58f95117aa565e2ed9837003b0afbc9ba..76cb7de1eca87f78aea2c4fbcc07d59709b2b88c 100644 (file)
@@ -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;i<ctx->dashCount;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;
index 025b63eca326ab630defc6e409737803fcf1dc31..f06245f2f9fee15fcdcd5d782d34faa48d7edd84 100644 (file)
@@ -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;
index de463e9c1ee84a44a6af1e2b714806f1c84b7b7a..fb199c9649a0ab24e5ef1024f7689aaea743360a 100644 (file)
@@ -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;
 }
 
index ccd591785db82ca053b48936d21cf8be46ac2253..05fc5e6d962997f9f8a345ed96487cd93c4152b0 100644 (file)
@@ -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 4e265c6e268201e09bb8471633d9bafff2700351..403f694bf90455f13b115ea7cf58495f58bde6cc 160000 (submodule)
--- a/vkh
+++ b/vkh
@@ -1 +1 @@
-Subproject commit 4e265c6e268201e09bb8471633d9bafff2700351
+Subproject commit 403f694bf90455f13b115ea7cf58495f58bde6cc