]> O.S.I.I.S - jp/vkvg.git/commitdiff
operator funcs, no implementation yet, VKSDK env var handling in cmake, debug
authorJean-Philippe Bruyère <jp_bruyere@hotmail.com>
Sat, 28 Apr 2018 16:34:23 +0000 (18:34 +0200)
committerJean-Philippe Bruyère <jp_bruyere@hotmail.com>
Sat, 28 Apr 2018 16:34:23 +0000 (18:34 +0200)
16 files changed:
CMakeLists.txt
README.md
include/vkvg.h
screenshot1.png [new file with mode: 0644]
shaders/vkvg_main.frag
src/shaders.h
src/vkvg_context.c
src/vkvg_context_internal.c
src/vkvg_context_internal.h
src/vkvg_device.c
src/vkvg_device_internal.c
src/vkvg_device_internal.h
src/vkvg_surface.c
tests/test1.c
tests/vkengine.c
vkh

index 0d11bbf379fd2d8e98fa6b88a465ce5eda4c1318..4957945046e97b6aa7a27e0996aac759074aa7dc 100644 (file)
@@ -11,8 +11,22 @@ IF(NOT CMAKE_BUILD_TYPE)
 ENDIF()
 MESSAGE(STATUS "${CMAKE_BUILD_TYPE} build.")
 
+if (CMAKE_BUILD_TYPE STREQUAL "Debug")
+       ADD_DEFINITIONS (-DDEBUG)
+ENDIF()
+
+set(VULKAN_SDK "$ENV{VULKAN_SDK}" CACHE STRING "LunarG Vulkan SDK path")
+if (VULKAN_SDK)
+               set(ENV{VULKAN_SDK} ${VULKAN_SDK})
+endif ()
+SET(ENV{VK_LAYER_PATH} "${VULKAN_SDK}/etc/explicit_layer.d")
+
+MESSAGE(STATUS "VULKAN_SDK = $ENV{VULKAN_SDK}")
+MESSAGE(STATUS "VK_LAYER_PATH = $ENV{VK_LAYER_PATH}")
+
 add_subdirectory (vkh)
 
+#be aware that system libraries have priority on SDK in the finding.
 FIND_PACKAGE(Vulkan REQUIRED)
 FIND_PACKAGE(GLFW3)
 FIND_PACKAGE(Freetype REQUIRED)
@@ -100,17 +114,18 @@ SET_TARGET_PROPERTIES(vkvg PROPERTIES
 )
 
 TARGET_INCLUDE_DIRECTORIES(vkvg PRIVATE
+       ${Vulkan_INCLUDE_DIRS}
+       ${FREETYPE_INCLUDE_DIRS}
+       ${HARFBUZZ_INCLUDE_DIRS}
+       ${FONTCONFIG_INCLUDE_DIR}
        ${CMAKE_CURRENT_SOURCE_DIR}/include
        ${CMAKE_CURRENT_SOURCE_DIR}/src
        ${CMAKE_CURRENT_SOURCE_DIR}/vkh/include
        ${CMAKE_CURRENT_SOURCE_DIR}/vkh/src
-       ${FREETYPE_INCLUDE_DIRS}
-       ${HARFBUZZ_INCLUDE_DIRS}
-       ${FONTCONFIG_INCLUDE_DIR}
 )
 
 TARGET_LINK_LIBRARIES(${PROJECT_NAME}
-       ${Vulkan_LIBRARY}
+       ${Vulkan_LIBRARIES}
        ${FREETYPE_LIBRARY}
        ${HARFBUZZ_LIBRARIES}
        ${FONTCONFIG_LIBRARIES}
@@ -127,13 +142,14 @@ if (GLFW3_FOUND)
        #build test app
        ADD_EXECUTABLE(${PROJECT_NAME}_test tests/test1.c tests/vkengine.c)
        TARGET_INCLUDE_DIRECTORIES(${PROJECT_NAME}_test PRIVATE
+               ${Vulkan_INCLUDE_DIRS}
                ${CMAKE_CURRENT_SOURCE_DIR}/include
                ${CMAKE_CURRENT_SOURCE_DIR}/src
                ${CMAKE_CURRENT_SOURCE_DIR}/vkh/include
                ${CMAKE_CURRENT_SOURCE_DIR}/vkh/src
        )
        TARGET_LINK_LIBRARIES(${PROJECT_NAME}_test
-               ${Vulkan_LIBRARY}
+               ${Vulkan_LIBRARIES}
                ${GLFW3_LIBRARY}
                vkh_static
                vkvg
index 1923b8afb446fcb061f449d0c908e4a33fb35920..24c5d8b20c57df277e33e6efe2db5e0eedb74826 100644 (file)
--- a/README.md
+++ b/README.md
 - Image loading and writing with [stb lib](https://github.com/nothings/stb)
 - Test includes svg rendering with [nanoSVG](https://github.com/memononen/nanosvg)
 
+<p align="center">
+  <a href="https://github.com/jpbruyere/vkvg/blob/master/screenshot1.png">
+    <img src="https://github.com/jpbruyere/vkvg/blob/master/screenshot1.png" width="500">
+  </a>
+</p>
+
 ### Requirements:
 
 - [Vulkan](https://www.khronos.org/vulkan/)
@@ -63,6 +69,8 @@ make                                              # Run Make
 
 - Radial gradients.
 - Dashed lines.
+- Operators.
+- Improve stroke algorithms.
 - Offscreen pattern building.
 - Optimize vulkan memory allocations by sub-allocating from a single shared memory chunk per type.
 - Optimize command submissions.
index 581e64080f370ef2cd96f9723f5c8aadb7c8b9a0..9a1e55546b3527a496bb551a179e2339b9c633c5 100644 (file)
@@ -187,6 +187,12 @@ void vkvg_set_line_cap      (VkvgContext ctx, vkvg_line_cap_t cap);
 void vkvg_set_line_join     (VkvgContext ctx, vkvg_line_join_t join);
 void vkvg_set_source_surface(VkvgContext ctx, VkvgSurface surf, float x, float y);
 void vkvg_set_source        (VkvgContext ctx, VkvgPattern pat);
+void vkvg_set_operator      (VkvgContext ctx, vkvg_operator_t op);
+
+float               vkvg_get_line_width     (VkvgContext ctx);
+vkvg_line_cap_t     vkvg_get_line_cap       (VkvgContext ctx);
+vkvg_line_join_t    vkvg_get_line_join      (VkvgContext ctx);
+vkvg_operator_t     vkvg_get_operator       (VkvgContext ctx);
 
 void vkvg_save              (VkvgContext ctx);
 void vkvg_restore           (VkvgContext ctx);
diff --git a/screenshot1.png b/screenshot1.png
new file mode 100644 (file)
index 0000000..6b668b7
Binary files /dev/null and b/screenshot1.png differ
index 472d3995ded70425fe4ab8436fc737eccfdcb519..161296fa76fc835c231e76166b80eabf7100c445 100644 (file)
@@ -88,3 +88,7 @@ void main()
 
        outFragColor = c;
 }
+
+void op_CLEAR () {
+       outFragColor = vec4 (0);
+}
index 9949740357e697c0c7a38aac8f07b58629e63400..45a3e01ae42cac2b2d02857d42f2a7182a179ceb 100644 (file)
@@ -1,5 +1,5 @@
 unsigned char vkvg_main_frag_spv[] = {
-  0x03, 0x02, 0x23, 0x07, 0x00, 0x00, 0x01, 0x00, 0x04, 0x00, 0x0d, 0x00,
+  0x03, 0x02, 0x23, 0x07, 0x00, 0x00, 0x01, 0x00, 0x06, 0x00, 0x0d, 0x00,
   0xef, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x02, 0x00,
   0x01, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x06, 0x00, 0x01, 0x00, 0x00, 0x00,
   0x47, 0x4c, 0x53, 0x4c, 0x2e, 0x73, 0x74, 0x64, 0x2e, 0x34, 0x35, 0x30,
@@ -484,7 +484,7 @@ unsigned char vkvg_main_frag_spv[] = {
 };
 unsigned int vkvg_main_frag_spv_len = 5780;
 unsigned char wired_frag_spv[] = {
-  0x03, 0x02, 0x23, 0x07, 0x00, 0x00, 0x01, 0x00, 0x04, 0x00, 0x0d, 0x00,
+  0x03, 0x02, 0x23, 0x07, 0x00, 0x00, 0x01, 0x00, 0x06, 0x00, 0x0d, 0x00,
   0x45, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x02, 0x00,
   0x01, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x06, 0x00, 0x01, 0x00, 0x00, 0x00,
   0x47, 0x4c, 0x53, 0x4c, 0x2e, 0x73, 0x74, 0x64, 0x2e, 0x34, 0x35, 0x30,
@@ -646,7 +646,7 @@ unsigned char wired_frag_spv[] = {
 };
 unsigned int wired_frag_spv_len = 1904;
 unsigned char vkvg_main_vert_spv[] = {
-  0x03, 0x02, 0x23, 0x07, 0x00, 0x00, 0x01, 0x00, 0x04, 0x00, 0x0d, 0x00,
+  0x03, 0x02, 0x23, 0x07, 0x00, 0x00, 0x01, 0x00, 0x06, 0x00, 0x0d, 0x00,
   0x61, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x02, 0x00,
   0x01, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x06, 0x00, 0x01, 0x00, 0x00, 0x00,
   0x47, 0x4c, 0x53, 0x4c, 0x2e, 0x73, 0x74, 0x64, 0x2e, 0x34, 0x35, 0x30,
@@ -873,7 +873,7 @@ unsigned char vkvg_main_vert_spv[] = {
 };
 unsigned int vkvg_main_vert_spv_len = 2680;
 unsigned char shader_comp_spv[] = {
-  0x03, 0x02, 0x23, 0x07, 0x00, 0x00, 0x01, 0x00, 0x04, 0x00, 0x0d, 0x00,
+  0x03, 0x02, 0x23, 0x07, 0x00, 0x00, 0x01, 0x00, 0x06, 0x00, 0x0d, 0x00,
   0xa1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x02, 0x00,
   0x01, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x06, 0x00, 0x01, 0x00, 0x00, 0x00,
   0x47, 0x4c, 0x53, 0x4c, 0x2e, 0x73, 0x74, 0x64, 0x2e, 0x34, 0x35, 0x30,
@@ -1175,7 +1175,7 @@ unsigned char shader_comp_spv[] = {
 };
 unsigned int shader_comp_spv_len = 3580;
 unsigned char shader2_comp_spv[] = {
-  0x03, 0x02, 0x23, 0x07, 0x00, 0x00, 0x01, 0x00, 0x04, 0x00, 0x0d, 0x00,
+  0x03, 0x02, 0x23, 0x07, 0x00, 0x00, 0x01, 0x00, 0x06, 0x00, 0x0d, 0x00,
   0x6c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x02, 0x00,
   0x01, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x06, 0x00, 0x01, 0x00, 0x00, 0x00,
   0x47, 0x4c, 0x53, 0x4c, 0x2e, 0x73, 0x74, 0x64, 0x2e, 0x34, 0x35, 0x30,
index b15347ebf966d4ebf41c13160d225c2a16f7a84f..b21f910229efc4cd4aece9c34213841d0815bbda 100644 (file)
@@ -42,6 +42,7 @@ VkvgContext vkvg_create(VkvgSurface surf)
     ctx->sizePathes     = VKVG_PATHES_SIZE;
     ctx->lineWidth      = 1;
     ctx->pSurf          = surf;
+    ctx->curOperator    = VKVG_OPERATOR_OVER;
 
     push_constants pc = {
             {0,0,0,1},
@@ -360,7 +361,7 @@ void vkvg_clip_preserve (VkvgContext ctx){
     vkCmdDrawIndexed (ctx->cmd,6,1,0,0,0);
 
     //should test current operator to bind correct pipeline
-    vkCmdBindPipeline(ctx->cmd, VK_PIPELINE_BIND_POINT_GRAPHICS, ctx->pSurf->dev->pipeline);
+    _bind_draw_pipeline (ctx);
     vkCmdSetStencilCompareMask(ctx->cmd, VK_STENCIL_FRONT_AND_BACK, STENCIL_CLIP_BIT);
 }
 void vkvg_fill_preserve (VkvgContext ctx){
@@ -373,7 +374,7 @@ void vkvg_fill_preserve (VkvgContext ctx){
 
     _poly_fill (ctx);
 
-    vkCmdBindPipeline(ctx->cmd, VK_PIPELINE_BIND_POINT_GRAPHICS, ctx->pSurf->dev->pipeline);
+    _bind_draw_pipeline (ctx);
     vkCmdSetStencilCompareMask(ctx->cmd, VK_STENCIL_FRONT_AND_BACK, STENCIL_FILL_BIT);
     vkCmdDrawIndexed (ctx->cmd,6,1,0,0,0);
     vkCmdSetStencilCompareMask(ctx->cmd, VK_STENCIL_FRONT_AND_BACK, STENCIL_CLIP_BIT);
@@ -605,7 +606,23 @@ void vkvg_set_line_cap (VkvgContext ctx, vkvg_line_cap_t cap){
     ctx->lineCap = cap;
 }
 void vkvg_set_line_join (VkvgContext ctx, vkvg_line_join_t join){
-    ctx->lineJoint = join;
+    ctx->lineJoin = join;
+}
+void vkvg_set_operator (VkvgContext ctx, vkvg_operator_t op){
+    ctx->curOperator = op;
+    _bind_draw_pipeline (ctx);
+}
+float vkvg_get_line_width (VkvgContext ctx){
+    return ctx->lineWidth;
+}
+vkvg_line_cap_t vkvg_get_line_cap (VkvgContext ctx){
+    return ctx->lineCap;
+}
+vkvg_line_join_t vkvg_get_line_join (VkvgContext ctx){
+    return ctx->lineJoin;
+}
+vkvg_operator_t vkvg_get_operator (VkvgContext ctx){
+    return ctx->curOperator;
 }
 
 void vkvg_select_font_face (VkvgContext ctx, const char* name){
@@ -675,6 +692,7 @@ void vkvg_save (VkvgContext ctx){
     memcpy (sav->pathes, ctx->pathes, sav->pathPtr * sizeof(uint32_t));
 
     sav->lineWidth  = ctx->lineWidth;
+    sav->curOperator= ctx->curOperator;
     sav->lineCap    = ctx->lineCap;
     sav->lineWidth  = ctx->lineWidth;
 
@@ -736,8 +754,9 @@ void vkvg_restore (VkvgContext ctx){
     memcpy (ctx->pathes, sav->pathes, ctx->pathPtr * sizeof(uint32_t));
 
     ctx->lineWidth  = sav->lineWidth;
+    ctx->curOperator= sav->curOperator;
     ctx->lineCap    = sav->lineCap;
-    ctx->lineJoint  = sav->lineJoint;
+    ctx->lineJoin  = sav->lineJoint;
 
     ctx->selectedFont.charSize = sav->selectedFont.charSize;
     strcpy (ctx->selectedFont.fontFile, sav->selectedFont.fontFile);
index c6188638e0721aef8bed29a85eeddca452459248..1723af69cb7ede0a989528071f170c6b070c31e3 100644 (file)
@@ -209,6 +209,21 @@ void _flush_cmd_buff (VkvgContext ctx){
 
     _submit_wait_and_reset_cmd(ctx);
 }
+//bind correct draw pipeline depending on current OPERATOR
+void _bind_draw_pipeline (VkvgContext ctx) {
+    switch (ctx->curOperator) {
+    case VKVG_OPERATOR_OVER:
+        vkCmdBindPipeline(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);
+        vkCmdBindPipeline(ctx->cmd, VK_PIPELINE_BIND_POINT_GRAPHICS, ctx->pSurf->dev->pipe_CLEAR);
+        break;
+    default:
+        vkCmdBindPipeline(ctx->cmd, VK_PIPELINE_BIND_POINT_GRAPHICS, ctx->pSurf->dev->pipe_OVER);
+        break;
+    }
+}
 void _init_cmd_buff (VkvgContext ctx){
     //full surf quad triangles is at the beginning
     ctx->vertCount = 4;
@@ -226,9 +241,9 @@ void _init_cmd_buff (VkvgContext ctx){
     VkRenderPassBeginInfo renderPassBeginInfo = { .sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
                                                   .renderPass = ctx->pSurf->dev->renderPass,
                                                   .framebuffer = ctx->pSurf->fb,
-                                                  .renderArea.extent = {ctx->pSurf->width,ctx->pSurf->height},
-                                                  .clearValueCount = 4,
-                                                  .pClearValues = clearValues};
+                                                  .renderArea.extent = {ctx->pSurf->width,ctx->pSurf->height}};
+                                                  //.clearValueCount = 4,
+                                                  //.pClearValues = clearValues};
 
     vkh_cmd_begin (ctx->cmd,VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT);
     vkCmdBeginRenderPass (ctx->cmd, &renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
@@ -243,8 +258,9 @@ void _init_cmd_buff (VkvgContext ctx){
     VkDeviceSize offsets[1] = { 0 };
     vkCmdBindVertexBuffers(ctx->cmd, 0, 1, &ctx->vertices.buffer, offsets);
     vkCmdBindIndexBuffer(ctx->cmd, ctx->indices.buffer, 0, VK_INDEX_TYPE_UINT32);
-    vkCmdBindPipeline(ctx->cmd, VK_PIPELINE_BIND_POINT_GRAPHICS, ctx->pSurf->dev->pipeline);
-    vkCmdSetStencilCompareMask(ctx->cmd, VK_STENCIL_FRONT_AND_BACK, 0);
+
+    _bind_draw_pipeline (ctx);
+    vkCmdSetStencilCompareMask(ctx->cmd, VK_STENCIL_FRONT_AND_BACK, STENCIL_CLIP_BIT);
 
     _update_push_constants  (ctx);
 }
@@ -353,7 +369,7 @@ void _build_vb_step (vkvg_context* ctx, Vertex v, float hw, uint32_t iL, uint32_
 
     uint32_t idx = ctx->vertCount;
 
-    if (ctx->lineJoint == VKVG_LINE_JOIN_MITER){
+    if (ctx->lineJoin == VKVG_LINE_JOIN_MITER){
         v.pos = vec2_add(ctx->points[i], bisec);
         _add_vertex(ctx, v);
         v.pos = vec2_sub(ctx->points[i], bisec);
@@ -372,11 +388,11 @@ void _build_vb_step (vkvg_context* ctx, Vertex v, float hw, uint32_t iL, uint32_
         }
         _add_vertex(ctx, v);
 
-        if (ctx->lineJoint == VKVG_LINE_JOIN_BEVEL){
+        if (ctx->lineJoin == VKVG_LINE_JOIN_BEVEL){
             _add_triangle_indices(ctx, idx, idx+2, idx+1);
             _add_triangle_indices(ctx, idx+2, idx+3, idx+1);
             _add_triangle_indices(ctx, idx+1, idx+3, idx+4);
-        }else if (ctx->lineJoint == VKVG_LINE_JOIN_ROUND){
+        }else if (ctx->lineJoin == VKVG_LINE_JOIN_ROUND){
             float step = M_PI / hw;
             float a = acos(vp.x);
             if (vp.y < 0)
index b1c7a2989a028953e836bda302584b54b4f1ecc8..bc799b6bb937e943216dcae48b2d1ab4fad2ae07 100644 (file)
@@ -64,10 +64,9 @@ typedef struct _vkvg_context_save_t{
     uint32_t*  pathes;
     size_t             sizePathes;
 
-    vec2               curPos;
-    bool        curPosExists;
     float       lineWidth;
 
+    vkvg_operator_t     curOperator;
     vkvg_line_cap_t     lineCap;
     vkvg_line_join_t    lineJoint;
 
@@ -84,14 +83,14 @@ typedef struct _vkvg_context_t {
 
     VkvgSurface                pSurf;
     VkFence                    flushFence;
-    VkhImage        source;
+    VkhImage        source;     //source of painting operation
 
-    VkCommandPool              cmdPool;
-    VkCommandBuffer     cmd;
+    VkCommandPool              cmdPool;//local pools ensure thread safety
+    VkCommandBuffer     cmd;    //single cmd buff for context operations
     VkDescriptorPool   descriptorPool;
-    VkDescriptorSet     dsFont;
-    VkDescriptorSet     dsSrc;
-    VkDescriptorSet     dsGrad;
+    VkDescriptorSet     dsFont; //fonts glyphs texture atlas descriptor (local for thread safety)
+    VkDescriptorSet     dsSrc;  //source ds
+    VkDescriptorSet     dsGrad; //gradient uniform buffer
 
     vkvg_buff  uboGrad;//uniform buff obj holdings gradient infos
 
@@ -115,15 +114,15 @@ typedef struct _vkvg_context_t {
     //pathes array is a list of couple (start,end) point idx refering to point array
     //it split points list in subpathes and tell if path is closed.
     //if path is closed, end index is the same as start.
-    //(I should use a boolean instead to keep last point in array)
+    //(TODO: I should use a boolean or smthg else instead to keep last point in array)
     uint32_t*  pathes;
     size_t             sizePathes;
 
-    vec4               curRGBA;    //is store in pushConsts => may be removed.
     float              lineWidth;
 
+    vkvg_operator_t     curOperator;
     vkvg_line_cap_t     lineCap;
-    vkvg_line_join_t    lineJoint;
+    vkvg_line_join_t    lineJoin;
 
     _vkvg_font_t  selectedFont;     //hold current face and size before cache addition
     _vkvg_font_t* currentFont;      //font ready for lookup
@@ -157,6 +156,7 @@ void _add_triangle_indices  (VkvgContext ctx, uint32_t i0, uint32_t i1,uint32_t i
 void _add_tri_indices_for_rect (VkvgContext ctx, uint32_t i);
 void _build_vb_step         (vkvg_context* ctx, Vertex v, float hw, uint32_t iL, uint32_t i, uint32_t iR);
 
+void _bind_draw_pipeline    (VkvgContext ctx);
 void _create_cmd_buff          (VkvgContext ctx);
 void _init_cmd_buff                    (VkvgContext ctx);
 void _flush_cmd_buff           (VkvgContext ctx);
index 5734fd1cc542bd393b34c6a6021596197d8d47e7..ee5deb57a8437f5065dafd17400f1620c0129978 100644 (file)
@@ -59,9 +59,12 @@ void vkvg_device_destroy (VkvgDevice dev)
     vkDestroyDescriptorSetLayout    (dev->vkDev, dev->dslSrc, NULL);
 
     vkDestroyPipeline               (dev->vkDev, dev->pipelinePolyFill, NULL);
-    vkDestroyPipeline               (dev->vkDev, dev->pipeline, NULL);
     vkDestroyPipeline               (dev->vkDev, dev->pipelineClipping, NULL);
-    vkDestroyPipeline               (dev->vkDev, dev->pipeline_OP_SUB, NULL);
+
+    vkDestroyPipeline               (dev->vkDev, dev->pipe_OVER,    NULL);
+    vkDestroyPipeline               (dev->vkDev, dev->pipe_SUB,     NULL);
+    vkDestroyPipeline               (dev->vkDev, dev->pipe_CLEAR,   NULL);
+
     vkDestroyPipeline               (dev->vkDev, dev->pipelineWired, NULL);
     vkDestroyPipeline               (dev->vkDev, dev->pipelineLineList, NULL);
 
index 5c0df70dcddefcda73baeabc21f92e3504a82503..2e6dd23fd559f88920a407a94e1fa4802a2d7856 100644 (file)
@@ -264,13 +264,19 @@ void _setupPipelines(VkvgDevice dev)
     dsStateCreateInfo.back = dsStateCreateInfo.front = stencilOpState;
     blendAttachmentState.colorWriteMask=0xf;
     dynamicState.dynamicStateCount = 3;
-    VK_CHECK_RESULT(vkCreateGraphicsPipelines(dev->vkDev, dev->pipelineCache, 1, &pipelineCreateInfo, NULL, &dev->pipeline));
+    VK_CHECK_RESULT(vkCreateGraphicsPipelines(dev->vkDev, dev->pipelineCache, 1, &pipelineCreateInfo, NULL, &dev->pipe_OVER));
 
     blendAttachmentState.alphaBlendOp = blendAttachmentState.colorBlendOp = VK_BLEND_OP_SUBTRACT;
-    VK_CHECK_RESULT(vkCreateGraphicsPipelines(dev->vkDev, dev->pipelineCache, 1, &pipelineCreateInfo, NULL, &dev->pipeline_OP_SUB));
+    VK_CHECK_RESULT(vkCreateGraphicsPipelines(dev->vkDev, dev->pipelineCache, 1, &pipelineCreateInfo, NULL, &dev->pipe_SUB));
+
+    blendAttachmentState.blendEnable = VK_FALSE;
+    //rasterizationState.polygonMode = VK_POLYGON_MODE_POINT;
+    //shaderStages[1].pName = "op_CLEAR";
+    VK_CHECK_RESULT(vkCreateGraphicsPipelines(dev->vkDev, dev->pipelineCache, 1, &pipelineCreateInfo, NULL, &dev->pipe_CLEAR));
 
     rasterizationState.polygonMode = VK_POLYGON_MODE_FILL;
     inputAssemblyState.topology = VK_PRIMITIVE_TOPOLOGY_LINE_LIST;
+    shaderStages[1].pName = "main";
     VK_CHECK_RESULT(vkCreateGraphicsPipelines(dev->vkDev, dev->pipelineCache, 1, &pipelineCreateInfo, NULL, &dev->pipelineLineList));
 
     shaderStages[1].module = modFragWired;
index d3f4505986e2f7317bc2febdf1f05d5ae813629f..b11ac24d929baa533710718831e08ae0e832ecdc 100644 (file)
@@ -42,10 +42,12 @@ typedef struct _vkvg_device_t{
     VkCommandBuffer         cmd;
     VkFence                 fence;
 
-    VkPipeline                         pipeline;
+    VkPipeline                         pipe_OVER;
+    VkPipeline                         pipe_SUB;
+    VkPipeline                         pipe_CLEAR;
+
     VkPipeline                         pipelinePolyFill;
     VkPipeline                         pipelineClipping;
-    VkPipeline                         pipeline_OP_SUB;
     VkPipeline                         pipelineWired;
     VkPipeline                         pipelineLineList;
 
index 35a22dccbe2d09aa849b5624c0cbecfa2d2e00ad..3c2a8cc329e7db44cd45cb1e4019922b8cdf6b0d 100644 (file)
@@ -35,7 +35,7 @@ void _clear_stencil (VkvgSurface surf)
 
     vkh_cmd_begin (cmd, VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT);
 
-    VkClearDepthStencilValue clr = {1.0f,0};
+    VkClearDepthStencilValue clr = {0,0};
     VkImageSubresourceRange range = {VK_IMAGE_ASPECT_STENCIL_BIT,0,1,0,1};
 
     vkh_image_set_layout (cmd, surf->stencilMS, VK_IMAGE_ASPECT_STENCIL_BIT, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
index d9ca9024138657b4c77fd9ea2948a39696342668..a6b1f5a1a6fe2b93e0ad5d42974228c4bddc3103 100644 (file)
@@ -455,14 +455,14 @@ void test_colinear () {
 }
 
 void multi_test1 () {
-    VkvgSurface surf2 = vkvg_surface_create (device,1024,800);;
+    VkvgSurface surf2 = vkvg_surface_create (device,800,800);;
     VkvgContext ctx = vkvg_create(surf2);
 
     vkvg_set_source_rgba(ctx,0.1,0.1,0.3,1.0);
     vkvg_paint(ctx);
 
-    //vkvg_test_fill(ctx);
-    //vkvg_test_fill2(ctx);
+    vkvg_test_fill(ctx);
+    vkvg_test_fill2(ctx);
 
 //    vkvg_set_line_join(ctx,VKVG_LINE_JOIN_ROUND);
 
@@ -491,7 +491,7 @@ void multi_test1 () {
     test_text(ctx);
 
 
-    //vkvg_test_stroke(ctx);
+    vkvg_test_stroke(ctx);
 
 //    vkvg_translate(ctx, 10,10);
 //    vkvg_rotate(ctx, 0.2);
@@ -499,8 +499,14 @@ void multi_test1 () {
 
 
     //vkvg_test_gradient (ctx);
-    //vkvg_test_curves(ctx);
-    //vkvg_test_curves2(ctx);
+
+    vkvg_test_curves(ctx);
+    vkvg_test_curves2(ctx);
+
+    /*vkvg_set_operator(ctx, VKVG_OPERATOR_CLEAR);
+    vkvg_rectangle(ctx,100,100,300,300);
+    vkvg_fill(ctx);
+    vkvg_set_operator(ctx, VKVG_OPERATOR_OVER);*/
 
     //test_img_surface(ctx);
     //test_line_caps(ctx);
@@ -508,10 +514,15 @@ void multi_test1 () {
     vkvg_destroy(ctx);
     ctx = vkvg_create(surf);
 
-    vkvg_set_source_rgba(ctx,0.0,0.0,0.0,1);
+    vkvg_set_source_rgba(ctx,0.0,1.0,0.0,1);
     vkvg_paint(ctx);
+//    vkvg_set_source_rgba(ctx,0.0,0.0,1.0,1);
+//    vkvg_rectangle(ctx,100,100,500,500);
+//    vkvg_fill(ctx);
 
     vkvg_set_source_surface(ctx, surf2, 0, 0);
+    //vkvg_rectangle(ctx,100,100,400,400);
+    //vkvg_fill(ctx);
     vkvg_paint(ctx);
 
     vkvg_destroy(ctx);
@@ -797,9 +808,11 @@ void cairo_tests () {
     vkvg_set_source_rgba(ctx,0.7,0.7,0.7,1);
     vkvg_paint(ctx);
 
-    /*vkvg_set_source_rgba(ctx,0,1,0,1);
-    vkvg_rectangle(ctx,100,100,200,200);
-    //vkvg_fill(ctx);
+    /*
+    vkvg_set_source_rgba(ctx,0,1,0,1);
+    vkvg_rectangle(ctx,0,0,600,600);
+    vkvg_fill(ctx);
+
     vkvg_clip(ctx);
 
     vkvg_set_source_rgba(ctx,1,0,0,1);
@@ -814,7 +827,8 @@ void cairo_tests () {
     vkvg_rel_line_to(ctx,800,800);
     vkvg_stroke(ctx);*/
 
-    //cairo_test_clip(ctx);
+//    cairo_test_clip(ctx);
+//    vkvg_reset_clip(ctx);
 
     cairo_print_arc(ctx);
 
@@ -824,10 +838,14 @@ void cairo_tests () {
     vkvg_translate(ctx,250,0);
     cairo_test_rounded_rect(ctx);
 
-    vkvg_translate(ctx,250,0);
-    cairo_test_curves(ctx);
+/*
+    vkvg_set_operator(ctx, VKVG_OPERATOR_CLEAR);
+    vkvg_rectangle(ctx,100,100,500,500);
+    vkvg_fill(ctx);
+    vkvg_set_operator(ctx, VKVG_OPERATOR_OVER);
+*/
 
-    vkvg_translate(ctx,-700,250);
+    vkvg_translate(ctx,-450,250);
     cairo_test_fill_and_stroke2(ctx);
 
     vkvg_translate(ctx,250,0);
@@ -837,11 +855,14 @@ void cairo_tests () {
     cairo_test_text(ctx);
 
     vkvg_translate(ctx,-500,250);
-    cairo_test_line_caps(ctx);
+    cairo_test_curves(ctx);
 
     vkvg_translate(ctx,250,0);
     cairo_test_line_joins(ctx);
 
+    vkvg_translate(ctx,250,0);
+    cairo_test_line_caps(ctx);
+
     vkvg_destroy(ctx);
 }
 
@@ -885,13 +906,13 @@ void test_svg () {
     NSVGpath* path;
     //svg = nsvgParseFromFile("/mnt/data/images/svg/tux.svg", "px", 96);
     //svg = nsvgParseFromFile("/mnt/data/images/svg/world.svg", "px", 96);
-    //svg = nsvgParseFromFile("/mnt/data/images/svg/tiger.svg", "px", 96);
+    svg = nsvgParseFromFile("/mnt/data/images/svg/tiger.svg", "px", 96);
     //svg = nsvgParseFromFile("/mnt/data/images/svg/koch_curve.svg", "px", 96);
     //svg = nsvgParseFromFile("/mnt/data/images/svg/diamond1.svg", "px", 96);
     //svg = nsvgParseFromFile("/mnt/data/images/svg/diamond2.svg", "px", 96);
     //svg = nsvgParseFromFile("/home/jp/yahweh-protosinaitic.svg", "px", 96);
     //svg = nsvgParseFromFile("/mnt/data/images/svg/WMD-biological.svg", "px", 96);
-    svg = nsvgParseFromFile("/mnt/data/images/svg/Skull_and_crossbones.svg", "px", 96);
+    //svg = nsvgParseFromFile("/mnt/data/images/svg/Skull_and_crossbones.svg", "px", 96);
     //svg = nsvgParseFromFile("/mnt/data/images/svg/IconAlerte.svg", "px", 96);
     //svg = nsvgParseFromFile("/mnt/data/images/svg/Svg_example4.svg", "px", 96);
 
@@ -950,6 +971,8 @@ void test_svg () {
 
 int main(int argc, char *argv[]) {
 
+    //dumpLayerExts();
+
     VkEngine* e = vke_create (VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU, 1024, 800);
     vke_set_key_callback (e, key_callback);
 
index a97117d3a032cdbdca92b1d40629252785309861..e93cbd0d48d3c971e405af3a256cf130ceafef5f 100644 (file)
@@ -197,7 +197,7 @@ VkEngine* vke_create (VkPhysicalDeviceType preferedGPU, uint32_t width, uint32_t
     assert (glfwVulkanSupported()==GLFW_TRUE);
 
     uint32_t enabledExtsCount = 0, phyCount = 0;
-    const char** enabledExts = glfwGetRequiredInstanceExtensions (&enabledExtsCount);
+    const char ** enabledExts = glfwGetRequiredInstanceExtensions (&enabledExtsCount);
 
     e->app = vkh_app_create("vkvgTest", enabledExtsCount, enabledExts);
 
@@ -254,9 +254,23 @@ VkEngine* vke_create (VkPhysicalDeviceType preferedGPU, uint32_t width, uint32_t
         }
     }
 
+    char const * dex [] = {"VK_KHR_swapchain"};
+#if DEBUG
+    uint32_t dlayCpt = 1;
+    static char const * dlay [] = {"VK_LAYER_LUNARG_standard_validation"};
+#else
+    uint32_t dlayCpt = 0;
+    static char const * dlay [] = {};
+#endif
+
     VkDeviceCreateInfo device_info = { .sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO,
                                        .queueCreateInfoCount = qCount,
-                                       .pQueueCreateInfos = &pQueueInfos};
+                                       .pQueueCreateInfos = &pQueueInfos,
+                                       .enabledLayerCount = dlayCpt,
+                                       .ppEnabledLayerNames = dlay,
+                                       .enabledExtensionCount = 1,
+                                       .ppEnabledExtensionNames = dex
+                                     };
 
     VK_CHECK_RESULT(vkCreateDevice(e->phy, &device_info, NULL, &e->dev));
 
diff --git a/vkh b/vkh
index 384c3add2173c9fb3de40f3679f4f5326178e331..9eca1ffd9de3da3814d634a28b10f61b1e43816e 160000 (submodule)
--- a/vkh
+++ b/vkh
@@ -1 +1 @@
-Subproject commit 384c3add2173c9fb3de40f3679f4f5326178e331
+Subproject commit 9eca1ffd9de3da3814d634a28b10f61b1e43816e