From 9fcccd789a40b3d73c98e13183f9f5df8f1ecaf2 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Thu, 24 Nov 2022 19:09:42 -0800 Subject: [PATCH] Vulkan: Correct displayed depth/stencil format. Also corrects handling of non-24 bit depth when reducing the range. --- Common/GPU/DataFormat.h | 1 + Common/GPU/Vulkan/thin3d_vulkan.cpp | 24 +++++++++++++++++++++++- Common/GPU/thin3d.cpp | 3 +++ 3 files changed, 27 insertions(+), 1 deletion(-) diff --git a/Common/GPU/DataFormat.h b/Common/GPU/DataFormat.h index b116ac9ab1..32463d3a16 100644 --- a/Common/GPU/DataFormat.h +++ b/Common/GPU/DataFormat.h @@ -65,6 +65,7 @@ enum class DataFormat : uint8_t { S8, D16, + D16_S8, D24_S8, D32F, D32F_S8, diff --git a/Common/GPU/Vulkan/thin3d_vulkan.cpp b/Common/GPU/Vulkan/thin3d_vulkan.cpp index 819b154905..1626958e91 100644 --- a/Common/GPU/Vulkan/thin3d_vulkan.cpp +++ b/Common/GPU/Vulkan/thin3d_vulkan.cpp @@ -592,6 +592,8 @@ static int GetBpp(VkFormat format) { static VkFormat DataFormatToVulkan(DataFormat format) { switch (format) { case DataFormat::D16: return VK_FORMAT_D16_UNORM; + case DataFormat::D16_S8: return VK_FORMAT_D16_UNORM_S8_UINT; + case DataFormat::D24_S8: return VK_FORMAT_D24_UNORM_S8_UINT; case DataFormat::D32F: return VK_FORMAT_D32_SFLOAT; case DataFormat::D32F_S8: return VK_FORMAT_D32_SFLOAT_S8_UINT; case DataFormat::S8: return VK_FORMAT_S8_UINT; @@ -784,6 +786,25 @@ bool VKTexture::Create(VkCommandBuffer cmd, VulkanPushBuffer *push, const Textur return true; } +static DataFormat DataFormatFromVulkanDepth(VkFormat fmt) { + switch (fmt) { + case VK_FORMAT_D24_UNORM_S8_UINT: + return DataFormat::D24_S8; + case VK_FORMAT_D16_UNORM: + return DataFormat::D16; + case VK_FORMAT_D32_SFLOAT: + return DataFormat::D32F; + case VK_FORMAT_D32_SFLOAT_S8_UINT: + return DataFormat::D32F_S8; + case VK_FORMAT_D16_UNORM_S8_UINT: + return DataFormat::D16_S8; + default: + break; + } + + return DataFormat::UNDEFINED; +} + VKContext::VKContext(VulkanContext *vulkan) : vulkan_(vulkan), renderManager_(vulkan) { shaderLanguageDesc_.Init(GLSL_VULKAN); @@ -803,7 +824,8 @@ VKContext::VKContext(VulkanContext *vulkan) caps_.framebufferStencilBlitSupported = caps_.framebufferDepthBlitSupported; caps_.framebufferDepthCopySupported = true; // Will pretty much always be the case. caps_.framebufferSeparateDepthCopySupported = true; // Will pretty much always be the case. - caps_.preferredDepthBufferFormat = DataFormat::D24_S8; // TODO: Ask vulkan. + // This doesn't affect what depth/stencil format is actually used, see VulkanQueueRunner. + caps_.preferredDepthBufferFormat = DataFormatFromVulkanDepth(vulkan->GetDeviceInfo().preferredDepthStencilFormat); caps_.texture3DSupported = true; caps_.textureDepthSupported = true; caps_.fragmentShaderInt32Supported = true; diff --git a/Common/GPU/thin3d.cpp b/Common/GPU/thin3d.cpp index fab4e665d1..a93a876766 100644 --- a/Common/GPU/thin3d.cpp +++ b/Common/GPU/thin3d.cpp @@ -46,6 +46,7 @@ size_t DataFormatSizeInBytes(DataFormat fmt) { case DataFormat::S8: return 1; case DataFormat::D16: return 2; + case DataFormat::D16_S8: return 3; case DataFormat::D24_S8: return 4; case DataFormat::D32F: return 4; // Or maybe 8... @@ -68,6 +69,7 @@ const char *DataFormatToString(DataFormat fmt) { case DataFormat::S8: return "S8"; case DataFormat::D16: return "D16"; + case DataFormat::D16_S8: return "D16_S8"; case DataFormat::D24_S8: return "D24_S8"; case DataFormat::D32F: return "D32F"; case DataFormat::D32F_S8: return "D32F_S8"; @@ -80,6 +82,7 @@ const char *DataFormatToString(DataFormat fmt) { bool DataFormatIsDepthStencil(DataFormat fmt) { switch (fmt) { case DataFormat::D16: + case DataFormat::D16_S8: case DataFormat::D24_S8: case DataFormat::S8: case DataFormat::D32F: