CMAKE_MINIMUM_REQUIRED(VERSION 3.9)
-PROJECT(vkvg VERSION 0.1.0 DESCRIPTION "Vulkan Vector Graphic")
+PROJECT(vkvg VERSION 0.1.1 DESCRIPTION "Vulkan Vector Graphic")
INCLUDE(CheckSymbolExists)
INCLUDE(CheckIncludeFile)
-/*
+/*
* Copyright (c) 2018 Jean-Philippe Bruyère <jp_bruyere@hotmail.com>
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of
static uint32_t dlpCount = 0;
#endif
+static VkClearValue clearValues[3] = {
+ { {{0.0f, 0.0f, 0.0f, 1.0f}} },
+ { {{1.0f, 0}} },
+ { {{0.0f, 0.0f, 0.0f, 1.0f}} }
+};
+
/**
* @brief create new context for surface
* @param drawing operation output surface
const VkClearRect cr = {{{0},{ctx->pSurf->width, ctx->pSurf->height}},0,1};
ctx->clearRect = cr;
+ ctx->renderPassBeginInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
+ ctx->renderPassBeginInfo.framebuffer = ctx->pSurf->fb;
+ ctx->renderPassBeginInfo.renderArea.extent.width = ctx->pSurf->width;
+ ctx->renderPassBeginInfo.renderArea.extent.height = ctx->pSurf->height;
+ ctx->renderPassBeginInfo.pClearValues = clearValues;
+ ctx->renderPassBeginInfo.renderPass = ctx->pSurf->dev->renderPass_ClearStencil;
+ ctx->renderPassBeginInfo.clearValueCount = 3;
ctx->pPrev = surf->dev->lastCtx;
if (ctx->pPrev != NULL)
ctx->points = (vec2*) malloc (VKVG_VBO_SIZE*sizeof(vec2));
ctx->pathes = (uint32_t*) malloc (VKVG_PATHES_SIZE*sizeof(uint32_t));
+ //for context to be thread safe, command pool and descriptor pool have to be created in the thread of the context.
ctx->cmdPool = vkh_cmd_pool_create ((VkhDevice)dev, dev->gQueue->familyIndex, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT);
_create_vertices_buff (ctx);
_init_cmd_buff (ctx);
_clear_path (ctx);
- vkvg_reset_clip (ctx);
- vkh_cmd_end (ctx->cmd);
- _submit_wait_and_reset_cmd(ctx);
-
ctx->references = 1;
ctx->status = VKVG_STATUS_SUCCESS;
return ctx;
VkvgDevice dev = ctx->pSurf->dev;
vkvg_context_save_t* sav = (vkvg_context_save_t*)calloc(1,sizeof(vkvg_context_save_t));
- sav->stencilMS = vkh_image_ms_create ((VkhDevice)dev,VK_FORMAT_S8_UINT, dev->samples, ctx->pSurf->width, ctx->pSurf->height,
+ sav->stencil = vkh_image_ms_create ((VkhDevice)dev,VK_FORMAT_S8_UINT, dev->samples, ctx->pSurf->width, ctx->pSurf->height,
VMA_MEMORY_USAGE_GPU_ONLY,
VK_IMAGE_USAGE_TRANSFER_SRC_BIT|VK_IMAGE_USAGE_TRANSFER_DST_BIT);
vkh_cmd_begin (ctx->cmd, VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT);
ctx->cmdStarted = true;
- vkh_image_set_layout (ctx->cmd, ctx->pSurf->stencilMS, VK_IMAGE_ASPECT_STENCIL_BIT,
+ vkh_image_set_layout (ctx->cmd, ctx->pSurf->stencil, VK_IMAGE_ASPECT_STENCIL_BIT,
VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT);
- vkh_image_set_layout (ctx->cmd, sav->stencilMS, VK_IMAGE_ASPECT_STENCIL_BIT,
+ vkh_image_set_layout (ctx->cmd, sav->stencil, VK_IMAGE_ASPECT_STENCIL_BIT,
VK_IMAGE_LAYOUT_GENERAL, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT);
.dstSubresource = {VK_IMAGE_ASPECT_STENCIL_BIT, 0, 0, 1},
.extent = {ctx->pSurf->width,ctx->pSurf->height,1}};
vkCmdCopyImage(ctx->cmd,
- vkh_image_get_vkimage (ctx->pSurf->stencilMS),VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
- vkh_image_get_vkimage (sav->stencilMS), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
+ vkh_image_get_vkimage (ctx->pSurf->stencil),VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
+ vkh_image_get_vkimage (sav->stencil), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
1, &cregion);
- vkh_image_set_layout (ctx->cmd, ctx->pSurf->stencilMS, VK_IMAGE_ASPECT_STENCIL_BIT,
+ vkh_image_set_layout (ctx->cmd, ctx->pSurf->stencil, VK_IMAGE_ASPECT_STENCIL_BIT,
VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT);
vkh_cmd_begin (ctx->cmd, VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT);
ctx->cmdStarted = true;
- vkh_image_set_layout (ctx->cmd, ctx->pSurf->stencilMS, VK_IMAGE_ASPECT_STENCIL_BIT,
+ vkh_image_set_layout (ctx->cmd, ctx->pSurf->stencil, VK_IMAGE_ASPECT_STENCIL_BIT,
VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT);
- vkh_image_set_layout (ctx->cmd, sav->stencilMS, VK_IMAGE_ASPECT_STENCIL_BIT,
+ vkh_image_set_layout (ctx->cmd, sav->stencil, VK_IMAGE_ASPECT_STENCIL_BIT,
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT);
.dstSubresource = {VK_IMAGE_ASPECT_STENCIL_BIT, 0, 0, 1},
.extent = {ctx->pSurf->width,ctx->pSurf->height,1}};
vkCmdCopyImage(ctx->cmd,
- vkh_image_get_vkimage (sav->stencilMS), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
- vkh_image_get_vkimage (ctx->pSurf->stencilMS),VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
+ vkh_image_get_vkimage (sav->stencil), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
+ vkh_image_get_vkimage (ctx->pSurf->stencil),VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
1, &cregion);
- vkh_image_set_layout (ctx->cmd, ctx->pSurf->stencilMS, VK_IMAGE_ASPECT_STENCIL_BIT,
+ vkh_image_set_layout (ctx->cmd, ctx->pSurf->stencil, VK_IMAGE_ASPECT_STENCIL_BIT,
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT);
LOG(LOG_INFO, "FLUSH Context: ctx = %lu; vert cpt = %d; ind cpt = %d\n", ctx, ctx->vertCount -4, ctx->indCount - 6);
_record_draw_cmd (ctx);
CmdEndRenderPass (ctx->cmd);
+ ctx->renderPassBeginInfo.renderPass = ctx->pSurf->dev->renderPass;
}
void _flush_cmd_buff (VkvgContext ctx){
if (!ctx->cmdStarted)
//VkClearValue clearValues[2];
//clearValues[0].color = { { 0.0f, 0.0f, 0.0f, 1.0f } };
//clearValues[1].depthStencil = { 1.0f, 0 };
- /*VkClearValue clearValues[4] = {
- { 0.0f, 1.0f, 0.0f, 1.0f },
- { 0.0f, 0.0f, 0.0f, 1.0f },
- { 1.0f, 0 },
- { 1.0f, 0 }
- };*/
}
-void _start_cmd_for_render_pass (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};
+
+void _start_cmd_for_render_pass (VkvgContext ctx) {
vkh_cmd_begin (ctx->cmd,VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT);
if (ctx->pSurf->img->layout == VK_IMAGE_LAYOUT_UNDEFINED){
VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT);
}
- CmdBeginRenderPass (ctx->cmd, &renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
+ CmdBeginRenderPass (ctx->cmd, &ctx->renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
VkViewport viewport = {0,0,ctx->pSurf->width,ctx->pSurf->height,0,1};
CmdSetViewport(ctx->cmd, 0, 1, &viewport);
VkRect2D scissor = {{0,0},{ctx->pSurf->width,ctx->pSurf->height}};
CmdSetStencilCompareMask(ctx->cmd, VK_STENCIL_FRONT_AND_BACK, STENCIL_CLIP_BIT);
_update_push_constants (ctx);
+
ctx->cmdStarted = true;
}
//compute inverse mat used in shader when context matrix has changed
void _free_ctx_save (vkvg_context_save_t* sav){
free(sav->selectedFont.fontFile);
- vkh_image_destroy (sav->stencilMS);
+ vkh_image_destroy (sav->stencil);
free (sav);
}
typedef struct _vkvg_context_save_t{
struct _vkvg_context_save_t* pNext;
- VkhImage stencilMS;
+ VkhImage stencil;
uint32_t stencilRef;
float lineWidth;
vkvg_context_save_t* pSavedCtxs;//last ctx saved ptr
VkClearRect clearRect;
+ VkRenderPassBeginInfo renderPassBeginInfo;
}vkvg_context;
typedef struct _ear_clip_point{
_create_pipeline_cache (dev);
_init_fonts_cache (dev);
- if (dev->deferredResolve)
- _setupRenderPassDeferredResolve(dev);
- else
- _setupRenderPass (dev);
+ if (dev->deferredResolve || dev->samples == VK_SAMPLE_COUNT_1_BIT){
+ dev->renderPass = _setupRenderPassNoResolve (dev, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_LOAD_OP_LOAD);
+ dev->renderPass_ClearStencil = _setupRenderPassNoResolve (dev, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_LOAD_OP_CLEAR);
+ }else{
+ dev->renderPass = _createRenderPassMS (dev, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_LOAD_OP_LOAD);
+ dev->renderPass_ClearStencil = _createRenderPassMS (dev, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_LOAD_OP_CLEAR);
+ }
_createDescriptorSetLayout (dev);
_setupPipelines (dev);
VK_CHECK_RESULT(vkCreatePipelineCache(dev->vkDev, &pipelineCacheCreateInfo, NULL, &dev->pipelineCache));
}
-void _setupRenderPassDeferredResolve(VkvgDevice dev)
+VkRenderPass _setupRenderPassNoResolve(VkvgDevice dev, VkAttachmentLoadOp loadOp, VkAttachmentLoadOp stencilLoadOp)
{
VkAttachmentDescription attColor = {
.format = FB_COLOR_FORMAT,
.samples = dev->samples,
- .loadOp = VK_ATTACHMENT_LOAD_OP_LOAD,
+ .loadOp = loadOp,
.storeOp = VK_ATTACHMENT_STORE_OP_STORE,
.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE,
.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE,
.samples = dev->samples,
.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE,
.storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE,
- .stencilLoadOp = VK_ATTACHMENT_LOAD_OP_LOAD,
+ .stencilLoadOp = stencilLoadOp,
.stencilStoreOp = VK_ATTACHMENT_STORE_OP_STORE,
.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL };
.dependencyCount = 2,
.pDependencies = dependencies
};
-
- VK_CHECK_RESULT(vkCreateRenderPass(dev->vkDev, &renderPassInfo, NULL, &dev->renderPass));
+ VkRenderPass rp;
+ VK_CHECK_RESULT(vkCreateRenderPass(dev->vkDev, &renderPassInfo, NULL, &rp));
+ return rp;
}
-void _setupRenderPass(VkvgDevice dev)
+VkRenderPass _createRenderPassMS(VkvgDevice dev, VkAttachmentLoadOp loadOp, VkAttachmentLoadOp stencilLoadOp)
{
VkAttachmentDescription attColor = {
.format = FB_COLOR_FORMAT,
.samples = dev->samples,
- .loadOp = VK_ATTACHMENT_LOAD_OP_LOAD,
+ .loadOp = loadOp,
.storeOp = VK_ATTACHMENT_STORE_OP_STORE,
.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE,
.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE,
.samples = dev->samples,
.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE,
.storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE,
- .stencilLoadOp = VK_ATTACHMENT_LOAD_OP_LOAD,
+ .stencilLoadOp = stencilLoadOp,
.stencilStoreOp = VK_ATTACHMENT_STORE_OP_STORE,
.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL };
- VkAttachmentDescription attachments[] = {attColor,attColorResolve,attDS};
- VkAttachmentReference colorRef = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
- VkAttachmentReference resolveRef= {1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
- VkAttachmentReference dsRef = {2, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
+ VkAttachmentDescription attachments[] = {attColorResolve,attDS,attColor};
+ VkAttachmentReference resolveRef= {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
+ VkAttachmentReference dsRef = {1, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
+ VkAttachmentReference colorRef = {2, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
VkSubpassDescription subpassDescription = { .pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS,
.colorAttachmentCount = 1,
.dependencyCount = 2,
.pDependencies = dependencies
};
-
- VK_CHECK_RESULT(vkCreateRenderPass(dev->vkDev, &renderPassInfo, NULL, &dev->renderPass));
+ VkRenderPass rp;
+ VK_CHECK_RESULT(vkCreateRenderPass(dev->vkDev, &renderPassInfo, NULL, &rp));
+ return rp;
}
void _setupPipelines(VkvgDevice dev)
VkhQueue gQueue; /**< Vulkan Queue with Graphic flag */
MUTEX gQMutex; /**< queue submission has to be externally syncronized */
VkRenderPass renderPass; /**< Vulkan render pass, common for all surfaces */
+ VkRenderPass renderPass_ClearStencil;/**< Vulkan render pass for first draw with context, stencil has to be cleared */
uint32_t references; /**< Reference count, prevent destroying device if still in use */
VkCommandPool cmdPool; /**< Global command pool for processing on surfaces without context */
void _create_empty_texture (VkvgDevice dev);
void _check_image_format_properties (VkvgDevice dev);
void _create_pipeline_cache (VkvgDevice dev);
-void _setupRenderPass (VkvgDevice dev);
-void _setupRenderPassDeferredResolve (VkvgDevice dev);
+VkRenderPass _createRenderPassMS(VkvgDevice dev, VkAttachmentLoadOp loadOp, VkAttachmentLoadOp stencilLoadOp);
+VkRenderPass _setupRenderPassNoResolve(VkvgDevice dev, VkAttachmentLoadOp loadOp, VkAttachmentLoadOp stencilLoadOp);
void _setupPipelines (VkvgDevice dev);
void _createDescriptorSetLayout (VkvgDevice dev);
void _flush_all_contexes (VkvgDevice dev);
}
}
//Get harfBuzz buffer for provided text.
-hb_buffer_t * _get_hb_buffer (VkvgContext ctx, const char* text) {
+hb_buffer_t * _get_hb_buffer (_vkvg_font_t* font, const char* text) {
hb_buffer_t *buf = hb_buffer_create();
const char *lng = "fr";
hb_buffer_set_language (buf, hb_language_from_string(lng,strlen(lng)));
hb_buffer_add_utf8 (buf, text, strlen(text), 0, strlen(text));
- hb_shape (ctx->currentFont->hb_font, buf, NULL, 0);
+ hb_shape (font->hb_font, buf, NULL, 0);
return buf;
}
//retrieve global font extends of context's current font as defined by FreeType
_update_current_font (ctx);
- textRun->hbBuf = _get_hb_buffer (ctx, text);
+ textRun->hbBuf = _get_hb_buffer (ctx->currentFont, text);
textRun->font = ctx->currentFont;
textRun->dev = ctx->pSurf->dev;
VkClearColorValue cclr = {{0,0,0,0}};
VkImageSubresourceRange range = {VK_IMAGE_ASPECT_COLOR_BIT,0,1,0,1};
- vkh_image_set_layout (cmd, surf->imgMS, VK_IMAGE_ASPECT_COLOR_BIT,
+ VkhImage img = surf->imgMS;
+ if (surf->dev->samples == VK_SAMPLE_COUNT_1_BIT)
+ img = surf->img;
+
+ vkh_image_set_layout (cmd, img, VK_IMAGE_ASPECT_COLOR_BIT,
VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT);
- vkCmdClearColorImage(cmd, vkh_image_get_vkimage (surf->imgMS),
+ vkCmdClearColorImage(cmd, vkh_image_get_vkimage (img),
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, &cclr, 1, &range);
- vkh_image_set_layout (cmd, surf->imgMS, VK_IMAGE_ASPECT_COLOR_BIT,
+ vkh_image_set_layout (cmd, img, VK_IMAGE_ASPECT_COLOR_BIT,
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT);
}
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,
+ vkh_image_set_layout (cmd, surf->stencil, VK_IMAGE_ASPECT_STENCIL_BIT,
VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT);
- vkCmdClearDepthStencilImage (cmd, vkh_image_get_vkimage (surf->stencilMS),
+ vkCmdClearDepthStencilImage (cmd, vkh_image_get_vkimage (surf->stencil),
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,&clr,1,&range);
- vkh_image_set_layout (cmd, surf->stencilMS, VK_IMAGE_ASPECT_STENCIL_BIT,
+ vkh_image_set_layout (cmd, surf->stencil, VK_IMAGE_ASPECT_STENCIL_BIT,
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT);
}
VK_IMAGE_USAGE_SAMPLED_BIT|VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT|VK_IMAGE_USAGE_TRANSFER_SRC_BIT|VK_IMAGE_USAGE_TRANSFER_DST_BIT);
vkh_image_create_descriptor(surf->img, VK_IMAGE_VIEW_TYPE_2D, VK_IMAGE_ASPECT_COLOR_BIT, VK_FILTER_NEAREST, VK_FILTER_NEAREST, VK_SAMPLER_MIPMAP_MODE_NEAREST,VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE);
}
-void _create_surface_ms_images (VkvgSurface surf) {
- surf->imgMS = vkh_image_ms_create((VkhDevice)surf->dev,surf->format,surf->dev->samples,surf->width,surf->height,VMA_MEMORY_USAGE_GPU_ONLY,
- VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT|VK_IMAGE_USAGE_TRANSFER_DST_BIT|VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
- surf->stencilMS = vkh_image_ms_create((VkhDevice)surf->dev,VK_FORMAT_S8_UINT,surf->dev->samples,surf->width,surf->height,VMA_MEMORY_USAGE_GPU_ONLY,
- VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT|VK_IMAGE_USAGE_TRANSFER_DST_BIT|VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
- vkh_image_create_descriptor(surf->imgMS, VK_IMAGE_VIEW_TYPE_2D, VK_IMAGE_ASPECT_COLOR_BIT, VK_FILTER_NEAREST, VK_FILTER_NEAREST, VK_SAMPLER_MIPMAP_MODE_NEAREST,VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE);
- vkh_image_create_descriptor(surf->stencilMS, VK_IMAGE_VIEW_TYPE_2D, VK_IMAGE_ASPECT_STENCIL_BIT, VK_FILTER_NEAREST, VK_FILTER_NEAREST, VK_SAMPLER_MIPMAP_MODE_NEAREST,VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE);
+//create multisample color img if sample count > 1 and the stencil buffer multisampled or not
+void _create_surface_secondary_images (VkvgSurface surf) {
+ if (surf->dev->samples > VK_SAMPLE_COUNT_1_BIT){
+ surf->imgMS = vkh_image_ms_create((VkhDevice)surf->dev,surf->format,surf->dev->samples,surf->width,surf->height,VMA_MEMORY_USAGE_GPU_ONLY,
+ VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT|VK_IMAGE_USAGE_TRANSFER_DST_BIT|VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
+ vkh_image_create_descriptor(surf->imgMS, VK_IMAGE_VIEW_TYPE_2D, VK_IMAGE_ASPECT_COLOR_BIT, VK_FILTER_NEAREST,
+ VK_FILTER_NEAREST, VK_SAMPLER_MIPMAP_MODE_NEAREST,VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE);
+ }
+ surf->stencil = vkh_image_ms_create((VkhDevice)surf->dev,VK_FORMAT_S8_UINT,surf->dev->samples,surf->width,surf->height,VMA_MEMORY_USAGE_GPU_ONLY, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT|VK_IMAGE_USAGE_TRANSFER_DST_BIT|VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
+ vkh_image_create_descriptor(surf->stencil, VK_IMAGE_VIEW_TYPE_2D, VK_IMAGE_ASPECT_STENCIL_BIT, VK_FILTER_NEAREST,
+ VK_FILTER_NEAREST, VK_SAMPLER_MIPMAP_MODE_NEAREST,VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE);
}
void _create_framebuffer (VkvgSurface surf) {
VkImageView attachments[] = {
- vkh_image_get_view (surf->imgMS),
vkh_image_get_view (surf->img),
- vkh_image_get_view (surf->stencilMS),
+ vkh_image_get_view (surf->stencil),
+ vkh_image_get_view (surf->imgMS),
};
VkFramebufferCreateInfo frameBufferCreateInfo = { .sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO,
.renderPass = surf->dev->renderPass,
.width = surf->width,
.height = surf->height,
.layers = 1 };
- if (surf->dev->deferredResolve) {
- attachments[1] = attachments[2];
+ if (surf->dev->samples == VK_SAMPLE_COUNT_1_BIT)
+ frameBufferCreateInfo.attachmentCount = 2;
+ else if (surf->dev->deferredResolve) {
+ attachments[0] = attachments[2];
frameBufferCreateInfo.attachmentCount = 2;
}
VK_CHECK_RESULT(vkCreateFramebuffer(surf->dev->vkDev, &frameBufferCreateInfo, NULL, &surf->fb));
surf->format = FB_COLOR_FORMAT;//force bgra internally
_create_surface_main_image (surf);
- _create_surface_ms_images (surf);
+ _create_surface_secondary_images (surf);
_create_framebuffer (surf);
_clear_surface (surf, VK_IMAGE_ASPECT_STENCIL_BIT);
#if DEBUG
vkh_image_set_name(surf->img, "surfImg");
vkh_image_set_name(surf->imgMS, "surfImgMS");
- vkh_image_set_name(surf->stencilMS, "surfStencil");
+ vkh_image_set_name(surf->stencil, "surfStencil");
#endif
}
void vkvg_surface_clear (VkvgSurface surf) {
vkh_image_create_sampler(img, VK_FILTER_NEAREST, VK_FILTER_NEAREST,
VK_SAMPLER_MIPMAP_MODE_NEAREST,VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE);
- _create_surface_ms_images (surf);
+ _create_surface_secondary_images (surf);
_create_framebuffer (surf);
_clear_surface (surf, VK_IMAGE_ASPECT_STENCIL_BIT);
if (surf->references > 0)
return;
vkDestroyFramebuffer(surf->dev->vkDev, surf->fb, NULL);
- if (!surf->img->imported)
- vkh_image_destroy(surf->img);
+
+ vkh_image_destroy(surf->img);
vkh_image_destroy(surf->imgMS);
- vkh_image_destroy(surf->stencilMS);
+ vkh_image_destroy(surf->stencil);
vkvg_device_destroy (surf->dev);
free(surf);
VkFramebuffer fb;
VkhImage img;
VkhImage imgMS;
- VkhImage stencilMS;
+ VkhImage stencil;
uint32_t references;
}vkvg_surface;
bool deferredResolve = false;
- device = vkvg_device_create_multisample(vkh_app_get_inst(e->app), r->dev->phy, r->dev->dev, r->qFam, 0, VK_SAMPLE_COUNT_8_BIT, deferredResolve);
+ device = vkvg_device_create_multisample(vkh_app_get_inst(e->app), r->dev->phy, r->dev->dev, r->qFam, 0, VK_SAMPLE_COUNT_1_BIT, deferredResolve);
vkvg_device_set_dpy(device, 96, 96);
void test(){
VkvgContext ctx = vkvg_create(surf);
-
+ vkvg_set_fill_rule(ctx,VKVG_FILL_RULE_EVEN_ODD);
VkvgSurface imgSurf = vkvg_surface_create_from_image(device, "data/miroir.jpg");
vkvg_translate(ctx,200,200);
VkvgContext ctx = vkvg_create(surf);
vkvg_set_fill_rule(ctx, VKVG_FILL_RULE_NON_ZERO);
- vkvg_set_line_width(ctx,1);
- for (int i=0; i<5000; i++) {
+ vkvg_set_line_width(ctx,2);
+ for (int i=0; i<1500; i++) {
randomize_color(ctx);
float x = trunc( (0.5*(float)w*rand())/RAND_MAX );
float y = trunc( (0.5*(float)w*rand())/RAND_MAX );
vkvg_matrix_translate(&mat,-512,-400);
VkvgContext ctx = vkvg_create(surf);
+ vkvg_set_fill_rule(ctx, VKVG_FILL_RULE_EVEN_ODD);
vkvg_set_source_rgba(ctx,1.0,1.0,1.0,1);
vkvg_paint(ctx);
-Subproject commit b93c31b7ba01ccfbc12dd7e907aa6cd6a986ae81
+Subproject commit e9cd1855b11fa23be0c9a452d9be4b239d76a485