From f451388bac66ff7618830e27e5171d359876e943 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jean-Philippe=20Bruy=C3=A8re?= Date: Sat, 23 Apr 2022 09:57:33 +0200 Subject: [PATCH] dev.stencilAspectFlag depending on depth or not for layout transitions --- src/vkvg_context.c | 12 ++++++------ src/vkvg_context_internal.c | 2 +- src/vkvg_device.c | 2 +- src/vkvg_device_internal.c | 4 +++- src/vkvg_device_internal.h | 3 ++- src/vkvg_surface.c | 2 +- 6 files changed, 14 insertions(+), 11 deletions(-) diff --git a/src/vkvg_context.c b/src/vkvg_context.c index 0078598..41c22d3 100644 --- a/src/vkvg_context.c +++ b/src/vkvg_context.c @@ -1316,10 +1316,10 @@ void vkvg_save (VkvgContext ctx){ vkh_cmd_label_start(ctx->cmd, "new save/restore stencil", DBG_LAB_COLOR_SAV); #endif - vkh_image_set_layout (ctx->cmd, ctx->pSurf->stencil, VK_IMAGE_ASPECT_STENCIL_BIT, + vkh_image_set_layout (ctx->cmd, ctx->pSurf->stencil, dev->stencilAspectFlag, 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, savStencil, VK_IMAGE_ASPECT_STENCIL_BIT, + vkh_image_set_layout (ctx->cmd, savStencil, dev->stencilAspectFlag, VK_IMAGE_LAYOUT_GENERAL, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT); @@ -1331,7 +1331,7 @@ void vkvg_save (VkvgContext ctx){ vkh_image_get_vkimage (savStencil), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &cregion); - vkh_image_set_layout (ctx->cmd, ctx->pSurf->stencil, VK_IMAGE_ASPECT_STENCIL_BIT, + vkh_image_set_layout (ctx->cmd, ctx->pSurf->stencil, dev->stencilAspectFlag, 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); @@ -1470,10 +1470,10 @@ void vkvg_restore (VkvgContext ctx){ vkh_cmd_label_start(ctx->cmd, "additional stencil copy while restoring", DBG_LAB_COLOR_SAV); #endif - vkh_image_set_layout (ctx->cmd, ctx->pSurf->stencil, VK_IMAGE_ASPECT_STENCIL_BIT, + vkh_image_set_layout (ctx->cmd, ctx->pSurf->stencil, ctx->dev->stencilAspectFlag, 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, savStencil, VK_IMAGE_ASPECT_STENCIL_BIT, + vkh_image_set_layout (ctx->cmd, savStencil, ctx->dev->stencilAspectFlag, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT); @@ -1484,7 +1484,7 @@ void vkvg_restore (VkvgContext ctx){ vkh_image_get_vkimage (savStencil), 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->stencil, VK_IMAGE_ASPECT_STENCIL_BIT, + vkh_image_set_layout (ctx->cmd, ctx->pSurf->stencil, ctx->dev->stencilAspectFlag, 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); diff --git a/src/vkvg_context_internal.c b/src/vkvg_context_internal.c index bf8078c..95f4a94 100644 --- a/src/vkvg_context_internal.c +++ b/src/vkvg_context_internal.c @@ -653,7 +653,7 @@ void _start_cmd_for_render_pass (VkvgContext ctx) { vkh_image_set_layout(ctx->cmd, ctx->pSurf->img, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT); - vkh_image_set_layout (ctx->cmd, ctx->pSurf->stencil, VK_IMAGE_ASPECT_STENCIL_BIT, + vkh_image_set_layout (ctx->cmd, ctx->pSurf->stencil, ctx->dev->stencilAspectFlag, 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); } diff --git a/src/vkvg_device.c b/src/vkvg_device.c index adb8abe..1f1dec1 100644 --- a/src/vkvg_device.c +++ b/src/vkvg_device.c @@ -232,7 +232,7 @@ const void* vkvg_get_device_requirements (VkPhysicalDeviceFeatures* pEnabledFeat void* pNext = NULL; -#ifdef VK_VERSION_1_2_ +#ifdef VK_VERSION_1_2 static VkPhysicalDeviceVulkan12Features enabledFeatures12 = { .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES #ifdef VKVG_ENABLE_VK_SCALAR_BLOCK_LAYOUT diff --git a/src/vkvg_device_internal.c b/src/vkvg_device_internal.c index ab37f2d..828e01d 100644 --- a/src/vkvg_device_internal.c +++ b/src/vkvg_device_internal.c @@ -517,7 +517,7 @@ void _device_create_empty_texture (VkvgDevice dev, VkFormat format, VkImageTilin vkh_cmd_end (dev->cmd); _device_submit_cmd (dev, &dev->cmd, dev->fence); } - +#define VKVG_SET_STENCIL_ASPECT dev->stencilAspectFlag = (dev->stencilFormat == VK_FORMAT_S8_UINT) ? VK_IMAGE_ASPECT_STENCIL_BIT : VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT; void _device_check_best_image_tiling (VkvgDevice dev, VkFormat format) { VkFlags stencilFormats[] = { VK_FORMAT_S8_UINT, VK_FORMAT_D16_UNORM_S8_UINT, VK_FORMAT_D24_UNORM_S8_UINT, VK_FORMAT_D32_SFLOAT_S8_UINT }; VkFormatProperties phyStencilProps = { 0 }, phyImgProps = { 0 }; @@ -553,6 +553,7 @@ void _device_check_best_image_tiling (VkvgDevice dev, VkFormat format) { vkGetPhysicalDeviceFormatProperties(dev->phy, stencilFormats[i], &phyStencilProps); if (phyStencilProps.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) { dev->stencilFormat = stencilFormats[i]; + VKVG_SET_STENCIL_ASPECT dev->supportedTiling = VK_IMAGE_TILING_OPTIMAL; return; } @@ -564,6 +565,7 @@ void _device_check_best_image_tiling (VkvgDevice dev, VkFormat format) { vkGetPhysicalDeviceFormatProperties(dev->phy, stencilFormats[i], &phyStencilProps); if (phyStencilProps.linearTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) { dev->stencilFormat = stencilFormats[i]; + VKVG_SET_STENCIL_ASPECT dev->supportedTiling = VK_IMAGE_TILING_LINEAR; return; } diff --git a/src/vkvg_device_internal.h b/src/vkvg_device_internal.h index 5503d17..992d22e 100644 --- a/src/vkvg_device_internal.h +++ b/src/vkvg_device_internal.h @@ -30,7 +30,7 @@ #define STENCIL_CLIP_BIT 0x2 #define STENCIL_ALL_BIT 0x3 -#define VKVG_MAX_CACHED_CONTEXT_COUNT 36 +#define VKVG_MAX_CACHED_CONTEXT_COUNT 2 extern PFN_vkCmdBindPipeline CmdBindPipeline; extern PFN_vkCmdBindDescriptorSets CmdBindDescriptorSets; @@ -68,6 +68,7 @@ typedef struct _vkvg_device_t { VkImageTiling supportedTiling; /**< Supported image tiling for surface, 0xFF=no support */ VkFormat stencilFormat; /**< Supported vulkan image format for stencil */ + VkImageAspectFlags stencilAspectFlag; /**< stencil only or depth stencil, could be solved by VK_KHR_separate_depth_stencil_layouts*/ VkFormat pngStagFormat; /**< Supported vulkan image format png write staging img */ VkImageTiling pngStagTiling; /**< tiling for the blit operation */ diff --git a/src/vkvg_surface.c b/src/vkvg_surface.c index 701e9c4..b2c3cdd 100644 --- a/src/vkvg_surface.c +++ b/src/vkvg_surface.c @@ -46,7 +46,7 @@ void _transition_surf_images (VkvgSurface surf) { vkh_image_set_layout(surf->cmd, surf->img, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT); - vkh_image_set_layout (surf->cmd, surf->stencil, VK_IMAGE_ASPECT_STENCIL_BIT, + vkh_image_set_layout (surf->cmd, surf->stencil, dev->stencilAspectFlag, 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 (surf->cmd); -- 2.47.3