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)
)
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}
#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
- 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/)
- 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.
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);
outFragColor = c;
}
+
+void op_CLEAR () {
+ outFragColor = vec4 (0);
+}
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,
};
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,
};
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,
};
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,
};
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,
ctx->sizePathes = VKVG_PATHES_SIZE;
ctx->lineWidth = 1;
ctx->pSurf = surf;
+ ctx->curOperator = VKVG_OPERATOR_OVER;
push_constants pc = {
{0,0,0,1},
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){
_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);
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){
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;
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);
_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;
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);
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);
}
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);
}
_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)
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;
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
//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
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);
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);
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;
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;
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,
}
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);
test_text(ctx);
- //vkvg_test_stroke(ctx);
+ vkvg_test_stroke(ctx);
// vkvg_translate(ctx, 10,10);
// vkvg_rotate(ctx, 0.2);
//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);
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);
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);
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);
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);
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);
}
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);
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);
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);
}
}
+ 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));
-Subproject commit 384c3add2173c9fb3de40f3679f4f5326178e331
+Subproject commit 9eca1ffd9de3da3814d634a28b10f61b1e43816e