From b985c5c67bd24907116f01b20a1f509518d1d529 Mon Sep 17 00:00:00 2001 From: baldurk Date: Fri, 13 Nov 2015 15:53:07 +0100 Subject: [PATCH] Add MakeVkFormat and MakeVkPrimitiveTopology functions --- renderdoc/driver/vulkan/vk_common.cpp | 307 ++++++++++++++++++++++++++ renderdoc/driver/vulkan/vk_common.h | 2 + 2 files changed, 309 insertions(+) diff --git a/renderdoc/driver/vulkan/vk_common.cpp b/renderdoc/driver/vulkan/vk_common.cpp index 417218978..3494bf1b5 100644 --- a/renderdoc/driver/vulkan/vk_common.cpp +++ b/renderdoc/driver/vulkan/vk_common.cpp @@ -678,6 +678,257 @@ ResourceFormat MakeResourceFormat(VkFormat fmt) return ret; } +VkFormat MakeVkFormat(ResourceFormat fmt) +{ + VkFormat ret = VK_FORMAT_UNDEFINED; + + if(fmt.special) + { + switch(fmt.specialFormat) + { + case eSpecial_BC1: + { + if(fmt.compCount == 3) + ret = fmt.srgbCorrected ? VK_FORMAT_BC1_RGB_SRGB : VK_FORMAT_BC1_RGB_UNORM; + else + ret = fmt.srgbCorrected ? VK_FORMAT_BC1_RGBA_SRGB : VK_FORMAT_BC1_RGBA_UNORM; + break; + } + case eSpecial_BC2: + ret = fmt.srgbCorrected ? VK_FORMAT_BC2_SRGB : VK_FORMAT_BC2_UNORM; + break; + case eSpecial_BC3: + ret = fmt.srgbCorrected ? VK_FORMAT_BC3_SRGB : VK_FORMAT_BC3_UNORM; + break; + case eSpecial_BC4: + ret = fmt.compType == eCompType_SNorm ? VK_FORMAT_BC4_SNORM : VK_FORMAT_BC4_UNORM; + break; + case eSpecial_BC5: + ret = fmt.compType == eCompType_SNorm ? VK_FORMAT_BC5_SNORM : VK_FORMAT_BC5_UNORM; + break; + case eSpecial_BC6: + ret = fmt.compType == eCompType_SNorm ? VK_FORMAT_BC6H_SFLOAT : VK_FORMAT_BC6H_UFLOAT; + break; + case eSpecial_BC7: + ret = fmt.srgbCorrected ? VK_FORMAT_BC7_SRGB : VK_FORMAT_BC7_UNORM; + break; + case eSpecial_ETC2: + { + if(fmt.compCount == 3) + ret = fmt.srgbCorrected ? VK_FORMAT_ETC2_R8G8B8_SRGB : VK_FORMAT_ETC2_R8G8B8_UNORM; + else + ret = fmt.srgbCorrected ? VK_FORMAT_ETC2_R8G8B8A8_SRGB : VK_FORMAT_ETC2_R8G8B8A8_UNORM; + break; + } + case eSpecial_EAC: + { + if(fmt.compCount == 1) + ret = fmt.compType == eCompType_SNorm ? VK_FORMAT_EAC_R11_SNORM : VK_FORMAT_EAC_R11_UNORM; + else if(fmt.compCount == 2) + ret = fmt.compType == eCompType_SNorm ? VK_FORMAT_EAC_R11G11_SNORM : VK_FORMAT_EAC_R11G11_UNORM; + break; + } + case eSpecial_R10G10B10A2: + if(fmt.compType == eCompType_UNorm) + ret = VK_FORMAT_R10G10B10A2_UNORM; + else if(fmt.compType == eCompType_UInt) + ret = VK_FORMAT_R10G10B10A2_UINT; + else if(fmt.compType == eCompType_UScaled) + ret = VK_FORMAT_R10G10B10A2_USCALED; + else if(fmt.compType == eCompType_SNorm) + ret = VK_FORMAT_R10G10B10A2_SNORM; + else if(fmt.compType == eCompType_SInt) + ret = VK_FORMAT_R10G10B10A2_SINT; + else if(fmt.compType == eCompType_SScaled) + ret = VK_FORMAT_R10G10B10A2_SSCALED; + break; + case eSpecial_R11G11B10: + ret = VK_FORMAT_R11G11B10_UFLOAT; + break; + case eSpecial_B5G6R5: + ret = fmt.compType == eCompType_UNorm ? VK_FORMAT_B5G6R5_UNORM : VK_FORMAT_B5G6R5_USCALED; + break; + case eSpecial_B5G5R5A1: + ret = VK_FORMAT_B5G5R5A1_UNORM; + break; + case eSpecial_R9G9B9E5: + ret = VK_FORMAT_R9G9B9E5_UFLOAT; + break; + case eSpecial_B8G8R8A8: + if(fmt.srgbCorrected) + ret = VK_FORMAT_B8G8R8A8_SRGB; + else if(fmt.compType == eCompType_UNorm) + ret = VK_FORMAT_B8G8R8A8_UNORM; + else if(fmt.compType == eCompType_UInt) + ret = VK_FORMAT_B8G8R8A8_UINT; + else if(fmt.compType == eCompType_UScaled) + ret = VK_FORMAT_B8G8R8A8_USCALED; + else if(fmt.compType == eCompType_SNorm) + ret = VK_FORMAT_B8G8R8A8_SNORM; + else if(fmt.compType == eCompType_SInt) + ret = VK_FORMAT_B8G8R8A8_SINT; + else if(fmt.compType == eCompType_SScaled) + ret = VK_FORMAT_B8G8R8A8_SSCALED; + break; + case eSpecial_B4G4R4A4: + ret = VK_FORMAT_B4G4R4A4_UNORM; + break; + case eSpecial_D24S8: + ret = VK_FORMAT_D24_UNORM_S8_UINT; + break; + case eSpecial_D32S8: + ret = VK_FORMAT_D32_SFLOAT_S8_UINT; + break; + default: + RDCERR("Unsupported special format %u", fmt.specialFormat); + break; + } + } + else if(fmt.compCount == 4) + { + if(fmt.srgbCorrected) + { + ret = VK_FORMAT_R8G8B8A8_SRGB; + } + else if(fmt.compByteWidth == 4) + { + if(fmt.compType == eCompType_Float) ret = VK_FORMAT_R32G32B32A32_SFLOAT; + else if(fmt.compType == eCompType_SInt) ret = VK_FORMAT_R32G32B32A32_SINT; + else if(fmt.compType == eCompType_UInt) ret = VK_FORMAT_R32G32B32A32_UINT; + else RDCERR("Unrecognised component type"); + } + else if(fmt.compByteWidth == 2) + { + if(fmt.compType == eCompType_Float) ret = VK_FORMAT_R16G16B16A16_SFLOAT; + else if(fmt.compType == eCompType_SInt) ret = VK_FORMAT_R16G16B16A16_SINT; + else if(fmt.compType == eCompType_UInt) ret = VK_FORMAT_R16G16B16A16_UINT; + else if(fmt.compType == eCompType_SNorm) ret = VK_FORMAT_R16G16B16A16_SNORM; + else if(fmt.compType == eCompType_UNorm) ret = VK_FORMAT_R16G16B16A16_UNORM; + else RDCERR("Unrecognised component type"); + } + else if(fmt.compByteWidth == 1) + { + if(fmt.compType == eCompType_SInt) ret = VK_FORMAT_R8G8B8A8_SINT; + else if(fmt.compType == eCompType_UInt) ret = VK_FORMAT_R8G8B8A8_UINT; + else if(fmt.compType == eCompType_SNorm) ret = VK_FORMAT_R8G8B8A8_SNORM; + else if(fmt.compType == eCompType_UNorm) ret = VK_FORMAT_R8G8B8A8_UNORM; + else RDCERR("Unrecognised component type"); + } + else + { + RDCERR("Unrecognised 4-component byte width: %d", fmt.compByteWidth); + } + } + else if(fmt.compCount == 3) + { + if(fmt.srgbCorrected) + { + ret = VK_FORMAT_R8G8B8_SRGB; + } + else if(fmt.compByteWidth == 4) + { + if(fmt.compType == eCompType_Float) ret = VK_FORMAT_R32G32B32_SFLOAT; + else if(fmt.compType == eCompType_SInt) ret = VK_FORMAT_R32G32B32_SINT; + else if(fmt.compType == eCompType_UInt) ret = VK_FORMAT_R32G32B32_UINT; + else RDCERR("Unrecognised component type"); + } + else if(fmt.compByteWidth == 2) + { + if(fmt.compType == eCompType_Float) ret = VK_FORMAT_R16G16B16_SFLOAT; + else if(fmt.compType == eCompType_SInt) ret = VK_FORMAT_R16G16B16_SINT; + else if(fmt.compType == eCompType_UInt) ret = VK_FORMAT_R16G16B16_UINT; + else if(fmt.compType == eCompType_SNorm) ret = VK_FORMAT_R16G16B16_SNORM; + else if(fmt.compType == eCompType_UNorm) ret = VK_FORMAT_R16G16B16_UNORM; + else RDCERR("Unrecognised component type"); + } + else if(fmt.compByteWidth == 1) + { + if(fmt.compType == eCompType_SInt) ret = VK_FORMAT_R8G8B8_SINT; + else if(fmt.compType == eCompType_UInt) ret = VK_FORMAT_R8G8B8_UINT; + else if(fmt.compType == eCompType_SNorm) ret = VK_FORMAT_R8G8B8_SNORM; + else if(fmt.compType == eCompType_UNorm) ret = VK_FORMAT_R8G8B8_UNORM; + else RDCERR("Unrecognised component type"); + } + else + { + RDCERR("Unrecognised 3-component byte width: %d", fmt.compByteWidth); + } + } + else if(fmt.compCount == 2) + { + if(fmt.compByteWidth == 4) + { + if(fmt.compType == eCompType_Float) ret = VK_FORMAT_R32G32_SFLOAT; + else if(fmt.compType == eCompType_SInt) ret = VK_FORMAT_R32G32_SINT; + else if(fmt.compType == eCompType_UInt) ret = VK_FORMAT_R32G32_UINT; + else RDCERR("Unrecognised component type"); + } + else if(fmt.compByteWidth == 2) + { + if(fmt.compType == eCompType_Float) ret = VK_FORMAT_R16G16_SFLOAT; + else if(fmt.compType == eCompType_SInt) ret = VK_FORMAT_R16G16_SINT; + else if(fmt.compType == eCompType_UInt) ret = VK_FORMAT_R16G16_UINT; + else if(fmt.compType == eCompType_SNorm) ret = VK_FORMAT_R16G16_SNORM; + else if(fmt.compType == eCompType_UNorm) ret = VK_FORMAT_R16G16_UNORM; + else RDCERR("Unrecognised component type"); + } + else if(fmt.compByteWidth == 1) + { + if(fmt.compType == eCompType_SInt) ret = VK_FORMAT_R8G8_SINT; + else if(fmt.compType == eCompType_UInt) ret = VK_FORMAT_R8G8_UINT; + else if(fmt.compType == eCompType_SNorm) ret = VK_FORMAT_R8G8_SNORM; + else if(fmt.compType == eCompType_UNorm) ret = VK_FORMAT_R8G8_UNORM; + else RDCERR("Unrecognised component type"); + } + else + { + RDCERR("Unrecognised 3-component byte width: %d", fmt.compByteWidth); + } + } + else if(fmt.compCount == 1) + { + if(fmt.compByteWidth == 4) + { + if(fmt.compType == eCompType_Float) ret = VK_FORMAT_R32_SFLOAT; + else if(fmt.compType == eCompType_SInt) ret = VK_FORMAT_R32_SINT; + else if(fmt.compType == eCompType_UInt) ret = VK_FORMAT_R32_UINT; + else if(fmt.compType == eCompType_Depth) ret = VK_FORMAT_D32_SFLOAT; + else RDCERR("Unrecognised component type"); + } + else if(fmt.compByteWidth == 2) + { + if(fmt.compType == eCompType_Float) ret = VK_FORMAT_R16_SFLOAT; + else if(fmt.compType == eCompType_SInt) ret = VK_FORMAT_R16_SINT; + else if(fmt.compType == eCompType_UInt) ret = VK_FORMAT_R16_UINT; + else if(fmt.compType == eCompType_SNorm) ret = VK_FORMAT_R16_SNORM; + else if(fmt.compType == eCompType_UNorm) ret = VK_FORMAT_R16_UNORM; + else if(fmt.compType == eCompType_Depth) ret = VK_FORMAT_D16_UNORM; + else RDCERR("Unrecognised component type"); + } + else if(fmt.compByteWidth == 1) + { + if(fmt.compType == eCompType_SInt) ret = VK_FORMAT_R8_SINT; + else if(fmt.compType == eCompType_UInt) ret = VK_FORMAT_R8_UINT; + else if(fmt.compType == eCompType_SNorm) ret = VK_FORMAT_R8_SNORM; + else if(fmt.compType == eCompType_UNorm) ret = VK_FORMAT_R8_UNORM; + else RDCERR("Unrecognised component type"); + } + else + { + RDCERR("Unrecognised 3-component byte width: %d", fmt.compByteWidth); + } + } + else + { + RDCERR("Unrecognised component count: %d", fmt.compCount); + } + + if(ret == VK_FORMAT_UNDEFINED) + RDCERR("No known vulkan format corresponding to resource format!"); + + return ret; +} + PrimitiveTopology MakePrimitiveTopology(VkPrimitiveTopology Topo, uint32_t patchControlPoints) { switch(Topo) @@ -722,6 +973,62 @@ PrimitiveTopology MakePrimitiveTopology(VkPrimitiveTopology Topo, uint32_t patch return eTopology_Unknown; } +VkPrimitiveTopology MakeVkPrimitiveTopology(PrimitiveTopology Topo) +{ + switch(Topo) + { + case eTopology_LineLoop: + RDCWARN("Unsupported primitive topology on Vulkan: %x", Topo); + break; + default: return VK_PRIMITIVE_TOPOLOGY_MAX_ENUM; + case eTopology_PointList: return VK_PRIMITIVE_TOPOLOGY_POINT_LIST; + case eTopology_LineStrip: return VK_PRIMITIVE_TOPOLOGY_LINE_STRIP; + case eTopology_LineList: return VK_PRIMITIVE_TOPOLOGY_LINE_LIST; + case eTopology_LineStrip_Adj: return VK_PRIMITIVE_TOPOLOGY_LINE_STRIP_ADJ; + case eTopology_LineList_Adj: return VK_PRIMITIVE_TOPOLOGY_LINE_LIST_ADJ; + case eTopology_TriangleStrip: return VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP; + case eTopology_TriangleFan: return VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN; + case eTopology_TriangleList: return VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST; + case eTopology_TriangleStrip_Adj: return VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP_ADJ; + case eTopology_TriangleList_Adj: return VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST_ADJ; + case eTopology_PatchList_1CPs: + case eTopology_PatchList_2CPs: + case eTopology_PatchList_3CPs: + case eTopology_PatchList_4CPs: + case eTopology_PatchList_5CPs: + case eTopology_PatchList_6CPs: + case eTopology_PatchList_7CPs: + case eTopology_PatchList_8CPs: + case eTopology_PatchList_9CPs: + case eTopology_PatchList_10CPs: + case eTopology_PatchList_11CPs: + case eTopology_PatchList_12CPs: + case eTopology_PatchList_13CPs: + case eTopology_PatchList_14CPs: + case eTopology_PatchList_15CPs: + case eTopology_PatchList_16CPs: + case eTopology_PatchList_17CPs: + case eTopology_PatchList_18CPs: + case eTopology_PatchList_19CPs: + case eTopology_PatchList_20CPs: + case eTopology_PatchList_21CPs: + case eTopology_PatchList_22CPs: + case eTopology_PatchList_23CPs: + case eTopology_PatchList_24CPs: + case eTopology_PatchList_25CPs: + case eTopology_PatchList_26CPs: + case eTopology_PatchList_27CPs: + case eTopology_PatchList_28CPs: + case eTopology_PatchList_29CPs: + case eTopology_PatchList_30CPs: + case eTopology_PatchList_31CPs: + case eTopology_PatchList_32CPs: + return VK_PRIMITIVE_TOPOLOGY_PATCH; + } + + return VK_PRIMITIVE_TOPOLOGY_MAX_ENUM; +} + template<> string ToStrHelper::Get(const VkResourceType &el) { diff --git a/renderdoc/driver/vulkan/vk_common.h b/renderdoc/driver/vulkan/vk_common.h index 16c5c3f01..f7a1597b1 100644 --- a/renderdoc/driver/vulkan/vk_common.h +++ b/renderdoc/driver/vulkan/vk_common.h @@ -68,7 +68,9 @@ #include "vk_dispatchtables.h" ResourceFormat MakeResourceFormat(VkFormat fmt); +VkFormat MakeVkFormat(ResourceFormat fmt); PrimitiveTopology MakePrimitiveTopology(VkPrimitiveTopology Topo, uint32_t patchControlPoints); +VkPrimitiveTopology MakeVkPrimitiveTopology(PrimitiveTopology Topo); // structure for casting to easily iterate and template specialising Serialise struct VkGenericStruct