From: Jean-Philippe Bruyère Date: Sat, 28 Apr 2018 16:34:23 +0000 (+0200) Subject: operator funcs, no implementation yet, VKSDK env var handling in cmake, debug X-Git-Tag: v0.1-alpha~128 X-Git-Url: https://git.osiis.dedyn.io/?a=commitdiff_plain;h=f83ef58951e2feb5c7953c1e5c9cc8af27d2ee85;p=jp%2Fvkvg.git operator funcs, no implementation yet, VKSDK env var handling in cmake, debug --- diff --git a/CMakeLists.txt b/CMakeLists.txt index 0d11bbf..4957945 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -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 diff --git a/README.md b/README.md index 1923b8a..24c5d8b 100644 --- a/README.md +++ b/README.md @@ -33,6 +33,12 @@ - Image loading and writing with [stb lib](https://github.com/nothings/stb) - Test includes svg rendering with [nanoSVG](https://github.com/memononen/nanosvg) +

+ + + +

+ ### 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. diff --git a/include/vkvg.h b/include/vkvg.h index 581e640..9a1e555 100644 --- a/include/vkvg.h +++ b/include/vkvg.h @@ -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 index 0000000..6b668b7 Binary files /dev/null and b/screenshot1.png differ diff --git a/shaders/vkvg_main.frag b/shaders/vkvg_main.frag index 472d399..161296f 100644 --- a/shaders/vkvg_main.frag +++ b/shaders/vkvg_main.frag @@ -88,3 +88,7 @@ void main() outFragColor = c; } + +void op_CLEAR () { + outFragColor = vec4 (0); +} diff --git a/src/shaders.h b/src/shaders.h index 9949740..45a3e01 100644 --- a/src/shaders.h +++ b/src/shaders.h @@ -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, diff --git a/src/vkvg_context.c b/src/vkvg_context.c index b15347e..b21f910 100644 --- a/src/vkvg_context.c +++ b/src/vkvg_context.c @@ -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); diff --git a/src/vkvg_context_internal.c b/src/vkvg_context_internal.c index c618863..1723af6 100644 --- a/src/vkvg_context_internal.c +++ b/src/vkvg_context_internal.c @@ -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) diff --git a/src/vkvg_context_internal.h b/src/vkvg_context_internal.h index b1c7a29..bc799b6 100644 --- a/src/vkvg_context_internal.h +++ b/src/vkvg_context_internal.h @@ -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); diff --git a/src/vkvg_device.c b/src/vkvg_device.c index 5734fd1..ee5deb5 100644 --- a/src/vkvg_device.c +++ b/src/vkvg_device.c @@ -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); diff --git a/src/vkvg_device_internal.c b/src/vkvg_device_internal.c index 5c0df70..2e6dd23 100644 --- a/src/vkvg_device_internal.c +++ b/src/vkvg_device_internal.c @@ -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; diff --git a/src/vkvg_device_internal.h b/src/vkvg_device_internal.h index d3f4505..b11ac24 100644 --- a/src/vkvg_device_internal.h +++ b/src/vkvg_device_internal.h @@ -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; diff --git a/src/vkvg_surface.c b/src/vkvg_surface.c index 35a22dc..3c2a8cc 100644 --- a/src/vkvg_surface.c +++ b/src/vkvg_surface.c @@ -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, diff --git a/tests/test1.c b/tests/test1.c index d9ca902..a6b1f5a 100644 --- a/tests/test1.c +++ b/tests/test1.c @@ -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); diff --git a/tests/vkengine.c b/tests/vkengine.c index a97117d..e93cbd0 100644 --- a/tests/vkengine.c +++ b/tests/vkengine.c @@ -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 384c3ad..9eca1ff 160000 --- a/vkh +++ b/vkh @@ -1 +1 @@ -Subproject commit 384c3add2173c9fb3de40f3679f4f5326178e331 +Subproject commit 9eca1ffd9de3da3814d634a28b10f61b1e43816e