From 9241f7f0e24371d789a63ecdd2b5735cbc7d8a83 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jean-Philippe=20Bruy=C3=A8re?= Date: Fri, 4 Sep 2020 21:58:34 +0000 Subject: [PATCH] move surface internal func to vkvg_surface_internal --- src/vkvg_surface.c | 170 ------------------------------- src/vkvg_surface_internal.c | 195 ++++++++++++++++++++++++++++++++++++ src/vkvg_surface_internal.h | 9 +- tests/lines.c | 30 +++++- 4 files changed, 227 insertions(+), 177 deletions(-) create mode 100644 src/vkvg_surface_internal.c diff --git a/src/vkvg_surface.c b/src/vkvg_surface.c index b622653..adc11cb 100644 --- a/src/vkvg_surface.c +++ b/src/vkvg_surface.c @@ -29,176 +29,6 @@ #include "stb_image_write.h" #include "vkh_image.h" -void _explicit_ms_resolve (VkvgSurface surf){ - VkvgDevice dev = surf->dev; - VkCommandBuffer cmd = dev->cmd; - - _wait_and_reset_device_fence (dev); - - vkh_cmd_begin (cmd, VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT); - vkh_image_set_layout (cmd, surf->imgMS, VK_IMAGE_ASPECT_COLOR_BIT, - VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, - VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT); - vkh_image_set_layout (cmd, surf->img, VK_IMAGE_ASPECT_COLOR_BIT, - VK_IMAGE_LAYOUT_GENERAL, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, - VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT); - - VkImageResolve re = { - .extent = {surf->width, surf->height,1}, - .srcSubresource = {VK_IMAGE_ASPECT_COLOR_BIT,0,0,1}, - .dstSubresource = {VK_IMAGE_ASPECT_COLOR_BIT,0,0,1} - }; - - vkCmdResolveImage(cmd, - vkh_image_get_vkimage (surf->imgMS), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, - vkh_image_get_vkimage (surf->img) ,VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, - 1,&re); - vkh_image_set_layout (cmd, surf->imgMS, VK_IMAGE_ASPECT_COLOR_BIT, - VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL , - VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT); - vkh_cmd_end (cmd); - - _submit_cmd (dev, &cmd, dev->fence); -} - -void _clear_surface (VkvgSurface surf, VkImageAspectFlags aspect) -{ - VkvgDevice dev = surf->dev; - VkCommandBuffer cmd = dev->cmd; - - _wait_and_reset_device_fence (dev); - - vkh_cmd_begin (cmd, VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT); - - if (aspect & VK_IMAGE_ASPECT_COLOR_BIT) { - VkClearColorValue cclr = {{0,0,0,0}}; - VkImageSubresourceRange range = {VK_IMAGE_ASPECT_COLOR_BIT,0,1,0,1}; - - 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 (img), - VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, &cclr, 1, &range); - - 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); - } - if (aspect & VK_IMAGE_ASPECT_STENCIL_BIT) { - VkClearDepthStencilValue clr = {0,0}; - VkImageSubresourceRange range = {VK_IMAGE_ASPECT_STENCIL_BIT,0,1,0,1}; - - 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->stencil), - VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,&clr,1,&range); - - 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); - } - vkh_cmd_end (cmd); - - _submit_cmd (dev, &cmd, dev->fence); -} - -void _create_surface_main_image (VkvgSurface surf){ - surf->img = vkh_image_create((VkhDevice)surf->dev,surf->format,surf->width,surf->height,surf->tiling,VMA_MEMORY_USAGE_GPU_ONLY, - 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); -#if defined(DEBUG) && defined (VKVG_DBG_UTILS) - vkh_image_set_name(surf->img, "SURF main color"); - vkh_device_set_object_name((VkhDevice)surf->dev, VK_OBJECT_TYPE_IMAGE_VIEW, (uint64_t)vkh_image_get_view(surf->img), "SURF main color VIEW"); - vkh_device_set_object_name((VkhDevice)surf->dev, VK_OBJECT_TYPE_SAMPLER, (uint64_t)vkh_image_get_sampler(surf->img), "SURF main color SAMPLER"); -#endif -} -//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); -#if defined(DEBUG) && defined (VKVG_DBG_UTILS) - vkh_image_set_name(surf->imgMS, "SURF MS color IMG"); - vkh_device_set_object_name((VkhDevice)surf->dev, VK_OBJECT_TYPE_IMAGE_VIEW, (uint64_t)vkh_image_get_view(surf->imgMS), "SURF MS color VIEW"); - vkh_device_set_object_name((VkhDevice)surf->dev, VK_OBJECT_TYPE_SAMPLER, (uint64_t)vkh_image_get_sampler(surf->imgMS), "SURF MS color SAMPLER"); -#endif - } - surf->stencil = vkh_image_ms_create((VkhDevice)surf->dev,FB_STENCIL_FORMAT,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); -#if defined(DEBUG) && defined (VKVG_DBG_UTILS) - vkh_image_set_name(surf->stencil, "SURF stencil"); - vkh_device_set_object_name((VkhDevice)surf->dev, VK_OBJECT_TYPE_IMAGE_VIEW, (uint64_t)vkh_image_get_view(surf->stencil), "SURF stencil VIEW"); - vkh_device_set_object_name((VkhDevice)surf->dev, VK_OBJECT_TYPE_SAMPLER, (uint64_t)vkh_image_get_sampler(surf->stencil), "SURF stencil SAMPLER"); -#endif -} -void _create_framebuffer (VkvgSurface surf) { - VkImageView attachments[] = { - vkh_image_get_view (surf->img), - 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, - .attachmentCount = 3, - .pAttachments = attachments, - .width = surf->width, - .height = surf->height, - .layers = 1 }; - 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)); -#if defined(DEBUG) && defined (VKVG_DBG_UTILS) - vkh_device_set_object_name((VkhDevice)surf->dev, VK_OBJECT_TYPE_FRAMEBUFFER, (uint64_t)surf->fb, "SURF FB"); -#endif -} -void _create_surface_images (VkvgSurface surf) { - - _create_surface_main_image (surf); - _create_surface_secondary_images(surf); - _create_framebuffer (surf); - - _clear_surface (surf, VK_IMAGE_ASPECT_STENCIL_BIT); -#if defined(DEBUG) && defined(ENABLE_VALIDATION) - vkh_image_set_name(surf->img, "surfImg"); - vkh_image_set_name(surf->imgMS, "surfImgMS"); - vkh_image_set_name(surf->stencil, "surfStencil"); -#endif -} -VkvgSurface _create_surface (VkvgDevice dev, VkFormat format) { - VkImageTiling tiling; - if (!_get_best_image_tiling (dev, format, &tiling)) { - dev->status = VKVG_STATUS_INVALID_FORMAT; - return NULL; - } - - VkvgSurface surf = (vkvg_surface*)calloc(1,sizeof(vkvg_surface)); - if (!surf) { - dev->status = VKVG_STATUS_NO_MEMORY; - return NULL; - } - - surf->dev = dev; - surf->format = format; - surf->tiling = tiling; - - dev->status = VKVG_STATUS_SUCCESS; - return surf; -} - void vkvg_surface_clear (VkvgSurface surf) { _clear_surface(surf, VK_IMAGE_ASPECT_STENCIL_BIT|VK_IMAGE_ASPECT_COLOR_BIT); } diff --git a/src/vkvg_surface_internal.c b/src/vkvg_surface_internal.c new file mode 100644 index 0000000..fb05367 --- /dev/null +++ b/src/vkvg_surface_internal.c @@ -0,0 +1,195 @@ +/* + * Copyright (c) 2018-2020 Jean-Philippe Bruyère + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the + * Software, and to permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include "vkvg_surface_internal.h" +#include "vkvg_device_internal.h" +#include "vkh_image.h" + +void _explicit_ms_resolve (VkvgSurface surf){ + VkvgDevice dev = surf->dev; + VkCommandBuffer cmd = dev->cmd; + + _wait_and_reset_device_fence (dev); + + vkh_cmd_begin (cmd, VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT); + vkh_image_set_layout (cmd, surf->imgMS, VK_IMAGE_ASPECT_COLOR_BIT, + VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, + VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT); + vkh_image_set_layout (cmd, surf->img, VK_IMAGE_ASPECT_COLOR_BIT, + VK_IMAGE_LAYOUT_GENERAL, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, + VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT); + + VkImageResolve re = { + .extent = {surf->width, surf->height,1}, + .srcSubresource = {VK_IMAGE_ASPECT_COLOR_BIT,0,0,1}, + .dstSubresource = {VK_IMAGE_ASPECT_COLOR_BIT,0,0,1} + }; + + vkCmdResolveImage(cmd, + vkh_image_get_vkimage (surf->imgMS), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, + vkh_image_get_vkimage (surf->img) ,VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, + 1,&re); + vkh_image_set_layout (cmd, surf->imgMS, VK_IMAGE_ASPECT_COLOR_BIT, + VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL , + VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT); + vkh_cmd_end (cmd); + + _submit_cmd (dev, &cmd, dev->fence); +} + +void _clear_surface (VkvgSurface surf, VkImageAspectFlags aspect) +{ + VkvgDevice dev = surf->dev; + VkCommandBuffer cmd = dev->cmd; + + _wait_and_reset_device_fence (dev); + + vkh_cmd_begin (cmd, VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT); + + if (aspect & VK_IMAGE_ASPECT_COLOR_BIT) { + VkClearColorValue cclr = {{0,0,0,0}}; + VkImageSubresourceRange range = {VK_IMAGE_ASPECT_COLOR_BIT,0,1,0,1}; + + 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 (img), + VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, &cclr, 1, &range); + + 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); + } + if (aspect & VK_IMAGE_ASPECT_STENCIL_BIT) { + VkClearDepthStencilValue clr = {0,0}; + VkImageSubresourceRange range = {VK_IMAGE_ASPECT_STENCIL_BIT,0,1,0,1}; + + 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->stencil), + VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,&clr,1,&range); + + 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); + } + vkh_cmd_end (cmd); + + _submit_cmd (dev, &cmd, dev->fence); +} + +void _create_surface_main_image (VkvgSurface surf){ + surf->img = vkh_image_create((VkhDevice)surf->dev,surf->format,surf->width,surf->height,surf->tiling,VMA_MEMORY_USAGE_GPU_ONLY, + 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); +#if defined(DEBUG) && defined (VKVG_DBG_UTILS) + vkh_image_set_name(surf->img, "SURF main color"); + vkh_device_set_object_name((VkhDevice)surf->dev, VK_OBJECT_TYPE_IMAGE_VIEW, (uint64_t)vkh_image_get_view(surf->img), "SURF main color VIEW"); + vkh_device_set_object_name((VkhDevice)surf->dev, VK_OBJECT_TYPE_SAMPLER, (uint64_t)vkh_image_get_sampler(surf->img), "SURF main color SAMPLER"); +#endif +} +//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); +#if defined(DEBUG) && defined (VKVG_DBG_UTILS) + vkh_image_set_name(surf->imgMS, "SURF MS color IMG"); + vkh_device_set_object_name((VkhDevice)surf->dev, VK_OBJECT_TYPE_IMAGE_VIEW, (uint64_t)vkh_image_get_view(surf->imgMS), "SURF MS color VIEW"); + vkh_device_set_object_name((VkhDevice)surf->dev, VK_OBJECT_TYPE_SAMPLER, (uint64_t)vkh_image_get_sampler(surf->imgMS), "SURF MS color SAMPLER"); +#endif + } + surf->stencil = vkh_image_ms_create((VkhDevice)surf->dev,FB_STENCIL_FORMAT,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); +#if defined(DEBUG) && defined (VKVG_DBG_UTILS) + vkh_image_set_name(surf->stencil, "SURF stencil"); + vkh_device_set_object_name((VkhDevice)surf->dev, VK_OBJECT_TYPE_IMAGE_VIEW, (uint64_t)vkh_image_get_view(surf->stencil), "SURF stencil VIEW"); + vkh_device_set_object_name((VkhDevice)surf->dev, VK_OBJECT_TYPE_SAMPLER, (uint64_t)vkh_image_get_sampler(surf->stencil), "SURF stencil SAMPLER"); +#endif +} +void _create_framebuffer (VkvgSurface surf) { + VkImageView attachments[] = { + vkh_image_get_view (surf->img), + 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, + .attachmentCount = 3, + .pAttachments = attachments, + .width = surf->width, + .height = surf->height, + .layers = 1 }; + 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)); +#if defined(DEBUG) && defined (VKVG_DBG_UTILS) + vkh_device_set_object_name((VkhDevice)surf->dev, VK_OBJECT_TYPE_FRAMEBUFFER, (uint64_t)surf->fb, "SURF FB"); +#endif +} +void _create_surface_images (VkvgSurface surf) { + + _create_surface_main_image (surf); + _create_surface_secondary_images(surf); + _create_framebuffer (surf); + + _clear_surface (surf, VK_IMAGE_ASPECT_STENCIL_BIT); +#if defined(DEBUG) && defined(ENABLE_VALIDATION) + vkh_image_set_name(surf->img, "surfImg"); + vkh_image_set_name(surf->imgMS, "surfImgMS"); + vkh_image_set_name(surf->stencil, "surfStencil"); +#endif +} +VkvgSurface _create_surface (VkvgDevice dev, VkFormat format) { + VkImageTiling tiling; + if (!_get_best_image_tiling (dev, format, &tiling)) { + dev->status = VKVG_STATUS_INVALID_FORMAT; + return NULL; + } + + VkvgSurface surf = (vkvg_surface*)calloc(1,sizeof(vkvg_surface)); + if (!surf) { + dev->status = VKVG_STATUS_NO_MEMORY; + return NULL; + } + + surf->dev = dev; + surf->format = format; + surf->tiling = tiling; + + dev->status = VKVG_STATUS_SUCCESS; + return surf; +} diff --git a/src/vkvg_surface_internal.h b/src/vkvg_surface_internal.h index 935c132..ce89586 100644 --- a/src/vkvg_surface_internal.h +++ b/src/vkvg_surface_internal.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018 Jean-Philippe Bruyère + * Copyright (c) 2018-2020 Jean-Philippe Bruyère * * Permission is hereby granted, free of charge, to any person obtaining a copy of * this software and associated documentation files (the "Software"), to deal in @@ -40,6 +40,11 @@ typedef struct _vkvg_surface_t { bool new; }vkvg_surface; +void _explicit_ms_resolve (VkvgSurface surf); void _clear_surface (VkvgSurface surf, VkImageAspectFlags aspect); -void _svg_set_color (VkvgContext ctx, uint32_t c, float alpha); +void _create_surface_main_image (VkvgSurface surf); +void _create_surface_secondary_images (VkvgSurface surf); +void _create_framebuffer (VkvgSurface surf); +void _create_surface_images (VkvgSurface surf); +VkvgSurface _create_surface (VkvgDevice dev, VkFormat format); #endif diff --git a/tests/lines.c b/tests/lines.c index c796dde..d6ea3d7 100644 --- a/tests/lines.c +++ b/tests/lines.c @@ -1,6 +1,6 @@ #include "test.h" -static float line_width = 1.f; +static float line_width = 4.f; static vkvg_line_cap_t line_cap = VKVG_LINE_CAP_BUTT; void horizontal() { @@ -89,7 +89,26 @@ void multilines(){ vkvg_stroke (ctx); vkvg_destroy(ctx); } - +void multi_segments() { + float w = (float)test_width-10; + float h = (float)test_height-10; + + VkvgContext ctx = vkvg_create(surf); + vkvg_clear(ctx); + vkvg_set_line_width (ctx,line_width); + + randomize_color(ctx); + float x1 = w*rand()/RAND_MAX; + float y1 = h*rand()/RAND_MAX; + vkvg_move_to (ctx, x1, y1); + for (uint32_t i=0; i