diff --git a/renderdoc/api/replay/replay_enums.h b/renderdoc/api/replay/replay_enums.h index 0ce9a613c..09be3bbb3 100644 --- a/renderdoc/api/replay/replay_enums.h +++ b/renderdoc/api/replay/replay_enums.h @@ -193,6 +193,7 @@ enum SpecialFormat eSpecial_R5G5B5A1, eSpecial_R9G9B9E5, eSpecial_R4G4B4A4, + eSpecial_R4G4, eSpecial_D16S8, eSpecial_D24S8, eSpecial_D32S8, diff --git a/renderdoc/common/dds_readwrite.cpp b/renderdoc/common/dds_readwrite.cpp index bd17b5e5f..5f354bd58 100644 --- a/renderdoc/common/dds_readwrite.cpp +++ b/renderdoc/common/dds_readwrite.cpp @@ -517,6 +517,7 @@ DXGI_FORMAT ResourceFormat2DXGIFormat(ResourceFormat format) case eSpecial_S8: return DXGI_FORMAT_R8_UINT; default: + case eSpecial_R4G4: case eSpecial_D16S8: case eSpecial_ETC2: case eSpecial_EAC: @@ -776,6 +777,7 @@ bool write_dds_to_file(FILE *f, const dds_data &data) break; case eSpecial_D16S8: case eSpecial_YUV: + case eSpecial_R4G4: RDCERR("Unsupported file format %u", data.format.specialFormat); return false; default: @@ -1048,6 +1050,7 @@ dds_data load_dds_from_file(FILE *f) break; case eSpecial_D16S8: case eSpecial_YUV: + case eSpecial_R4G4: RDCERR("Unsupported file format %u", ret.format.specialFormat); return error; default: diff --git a/renderdoc/driver/vulkan/vk_common.cpp b/renderdoc/driver/vulkan/vk_common.cpp index 4a3205108..3fd830ea5 100644 --- a/renderdoc/driver/vulkan/vk_common.cpp +++ b/renderdoc/driver/vulkan/vk_common.cpp @@ -93,13 +93,16 @@ ResourceFormat MakeResourceFormat(VkFormat fmt) return ret; } - // VKTODOMED R4G4, R4G4B4A4, and refactor BGRA formats - switch(fmt) { + case VK_FORMAT_R4G4_UNORM_PACK8: + ret.special = true; + ret.specialFormat = eSpecial_R4G4; + break; + case VK_FORMAT_R4G4B4A4_UNORM_PACK16: case VK_FORMAT_B4G4R4A4_UNORM_PACK16: ret.special = true; - ret.specialFormat = eSpecial_B4G4R4A4; + ret.specialFormat = eSpecial_R4G4B4A4; break; case VK_FORMAT_A2B10G10R10_UNORM_PACK32: case VK_FORMAT_A2B10G10R10_SNORM_PACK32: @@ -118,6 +121,17 @@ ResourceFormat MakeResourceFormat(VkFormat fmt) ret.special = true; ret.specialFormat = eSpecial_R9G9B9E5; break; + case VK_FORMAT_R5G6B5_UNORM_PACK16: + case VK_FORMAT_B5G6R5_UNORM_PACK16: + ret.special = true; + ret.specialFormat = eSpecial_R5G6B5; + break; + case VK_FORMAT_R5G5B5A1_UNORM_PACK16: + case VK_FORMAT_B5G5R5A1_UNORM_PACK16: + case VK_FORMAT_A1R5G5B5_UNORM_PACK16: + ret.special = true; + ret.specialFormat = eSpecial_R5G5B5A1; + break; case VK_FORMAT_D16_UNORM_S8_UINT: ret.special = true; ret.specialFormat = eSpecial_D16S8; @@ -214,6 +228,16 @@ ResourceFormat MakeResourceFormat(VkFormat fmt) ret.special = true; ret.specialFormat = eSpecial_ASTC; break; + default: + break; + } + + switch(fmt) + { + case VK_FORMAT_B4G4R4A4_UNORM_PACK16: + case VK_FORMAT_B5G6R5_UNORM_PACK16: + case VK_FORMAT_B5G5R5A1_UNORM_PACK16: + case VK_FORMAT_A1R5G5B5_UNORM_PACK16: case VK_FORMAT_B8G8R8A8_UNORM: case VK_FORMAT_B8G8R8A8_SNORM: case VK_FORMAT_B8G8R8A8_USCALED: @@ -221,8 +245,13 @@ ResourceFormat MakeResourceFormat(VkFormat fmt) case VK_FORMAT_B8G8R8A8_UINT: case VK_FORMAT_B8G8R8A8_SINT: case VK_FORMAT_B8G8R8A8_SRGB: - ret.special = true; - ret.specialFormat = eSpecial_B8G8R8A8; + case VK_FORMAT_A2B10G10R10_UNORM_PACK32: + case VK_FORMAT_A2B10G10R10_SNORM_PACK32: + case VK_FORMAT_A2B10G10R10_USCALED_PACK32: + case VK_FORMAT_A2B10G10R10_SSCALED_PACK32: + case VK_FORMAT_A2B10G10R10_UINT_PACK32: + case VK_FORMAT_A2B10G10R10_SINT_PACK32: + ret.bgraOrder = true; break; default: break; @@ -773,48 +802,35 @@ VkFormat MakeVkFormat(ResourceFormat fmt) } case eSpecial_R10G10B10A2: if(fmt.compType == eCompType_UNorm) - ret = VK_FORMAT_A2R10G10B10_UNORM_PACK32; + ret = fmt.bgraOrder ? VK_FORMAT_A2B10G10R10_UNORM_PACK32 : VK_FORMAT_A2R10G10B10_UNORM_PACK32; else if(fmt.compType == eCompType_UInt) - ret = VK_FORMAT_A2R10G10B10_UINT_PACK32; + ret = fmt.bgraOrder ? VK_FORMAT_A2B10G10R10_UINT_PACK32 : VK_FORMAT_A2R10G10B10_UINT_PACK32; else if(fmt.compType == eCompType_UScaled) - ret = VK_FORMAT_A2R10G10B10_USCALED_PACK32; + ret = fmt.bgraOrder ? VK_FORMAT_A2B10G10R10_USCALED_PACK32 : VK_FORMAT_A2R10G10B10_USCALED_PACK32; else if(fmt.compType == eCompType_SNorm) - ret = VK_FORMAT_A2R10G10B10_SNORM_PACK32; + ret = fmt.bgraOrder ? VK_FORMAT_A2B10G10R10_SNORM_PACK32 : VK_FORMAT_A2R10G10B10_SNORM_PACK32; else if(fmt.compType == eCompType_SInt) - ret = VK_FORMAT_A2R10G10B10_SINT_PACK32; + ret = fmt.bgraOrder ? VK_FORMAT_A2B10G10R10_SINT_PACK32 : VK_FORMAT_A2R10G10B10_SINT_PACK32; else if(fmt.compType == eCompType_SScaled) - ret = VK_FORMAT_A2R10G10B10_SSCALED_PACK32; + ret = fmt.bgraOrder ? VK_FORMAT_A2B10G10R10_SSCALED_PACK32 : VK_FORMAT_A2R10G10B10_SSCALED_PACK32; break; case eSpecial_R11G11B10: ret = VK_FORMAT_B10G11R11_UFLOAT_PACK32; break; - case eSpecial_B5G6R5: + case eSpecial_R5G6B5: ret = VK_FORMAT_B5G6R5_UNORM_PACK16; break; - case eSpecial_B5G5R5A1: - ret = VK_FORMAT_B5G5R5A1_UNORM_PACK16; + case eSpecial_R5G5B5A1: + ret = fmt.bgraOrder ? VK_FORMAT_B5G5R5A1_UNORM_PACK16 : VK_FORMAT_B5G5R5A1_UNORM_PACK16; break; case eSpecial_R9G9B9E5: ret = VK_FORMAT_E5B9G9R9_UFLOAT_PACK32; 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; + case eSpecial_R4G4B4A4: + ret = fmt.bgraOrder ? VK_FORMAT_R4G4B4A4_UNORM_PACK16 : VK_FORMAT_B4G4R4A4_UNORM_PACK16; break; - case eSpecial_B4G4R4A4: - ret = VK_FORMAT_B4G4R4A4_UNORM_PACK16; + case eSpecial_R4G4: + ret = VK_FORMAT_R4G4_UNORM_PACK8; break; case eSpecial_D24S8: ret = VK_FORMAT_D24_UNORM_S8_UINT; @@ -831,7 +847,7 @@ VkFormat MakeVkFormat(ResourceFormat fmt) { if(fmt.srgbCorrected) { - ret = VK_FORMAT_R8G8B8A8_SRGB; + ret = fmt.bgraOrder ? VK_FORMAT_B8G8R8A8_SRGB : VK_FORMAT_R8G8B8A8_SRGB; } else if(fmt.compByteWidth == 4) { @@ -842,19 +858,23 @@ VkFormat MakeVkFormat(ResourceFormat fmt) } 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; + 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 if(fmt.compType == eCompType_SScaled) ret = VK_FORMAT_R16G16B16A16_SSCALED; + else if(fmt.compType == eCompType_UScaled) ret = VK_FORMAT_R16G16B16A16_USCALED; 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; + if(fmt.compType == eCompType_SInt) ret = fmt.bgraOrder ? VK_FORMAT_B8G8R8A8_SINT : VK_FORMAT_R8G8B8A8_SINT; + else if(fmt.compType == eCompType_UInt) ret = fmt.bgraOrder ? VK_FORMAT_B8G8R8A8_UINT : VK_FORMAT_R8G8B8A8_UINT; + else if(fmt.compType == eCompType_SNorm) ret = fmt.bgraOrder ? VK_FORMAT_B8G8R8A8_SNORM : VK_FORMAT_R8G8B8A8_SNORM; + else if(fmt.compType == eCompType_UNorm) ret = fmt.bgraOrder ? VK_FORMAT_B8G8R8A8_UNORM : VK_FORMAT_R8G8B8A8_UNORM; + else if(fmt.compType == eCompType_SScaled) ret = fmt.bgraOrder ? VK_FORMAT_B8G8R8A8_SSCALED : VK_FORMAT_R8G8B8A8_SSCALED; + else if(fmt.compType == eCompType_UScaled) ret = fmt.bgraOrder ? VK_FORMAT_B8G8R8A8_USCALED : VK_FORMAT_R8G8B8A8_USCALED; else RDCERR("Unrecognised component type"); } else @@ -877,19 +897,23 @@ VkFormat MakeVkFormat(ResourceFormat fmt) } 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; + 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 if(fmt.compType == eCompType_SScaled) ret = VK_FORMAT_R16G16B16_SSCALED; + else if(fmt.compType == eCompType_UScaled) ret = VK_FORMAT_R16G16B16_USCALED; 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; + 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 if(fmt.compType == eCompType_SScaled) ret = VK_FORMAT_R8G8B8_SSCALED; + else if(fmt.compType == eCompType_UScaled) ret = VK_FORMAT_R8G8B8_USCALED; else RDCERR("Unrecognised component type"); } else @@ -908,19 +932,23 @@ VkFormat MakeVkFormat(ResourceFormat fmt) } 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; + 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 if(fmt.compType == eCompType_SScaled) ret = VK_FORMAT_R16G16_SSCALED; + else if(fmt.compType == eCompType_UScaled) ret = VK_FORMAT_R16G16_USCALED; 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; + 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 if(fmt.compType == eCompType_SScaled) ret = VK_FORMAT_R8G8_SSCALED; + else if(fmt.compType == eCompType_UScaled) ret = VK_FORMAT_R8G8_USCALED; else RDCERR("Unrecognised component type"); } else @@ -940,20 +968,24 @@ VkFormat MakeVkFormat(ResourceFormat fmt) } 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; + 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 if(fmt.compType == eCompType_UScaled) ret = VK_FORMAT_R16_USCALED; + else if(fmt.compType == eCompType_SScaled) ret = VK_FORMAT_R16_SSCALED; 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; + 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 if(fmt.compType == eCompType_UScaled) ret = VK_FORMAT_R8_USCALED; + else if(fmt.compType == eCompType_SScaled) ret = VK_FORMAT_R8_SSCALED; else RDCERR("Unrecognised component type"); } else diff --git a/renderdoc/driver/vulkan/vk_core.cpp b/renderdoc/driver/vulkan/vk_core.cpp index d69ca00a6..4fddbf5fc 100644 --- a/renderdoc/driver/vulkan/vk_core.cpp +++ b/renderdoc/driver/vulkan/vk_core.cpp @@ -879,18 +879,13 @@ bool WrappedVulkan::EndFrameCapture(void *dev, void *wnd) uint32_t stride = fmt.compByteWidth*fmt.compCount; bool buf1010102 = false; - bool bufBGRA = false; + bool bufBGRA = (fmt.bgraOrder != false); if(fmt.special && fmt.specialFormat == eSpecial_R10G10B10A2) { stride = 4; buf1010102 = true; } - if(fmt.special && fmt.specialFormat == eSpecial_B8G8R8A8) - { - stride = 4; - bufBGRA = true; - } byte *dst = thpixels; diff --git a/renderdoc/driver/vulkan/vk_replay.cpp b/renderdoc/driver/vulkan/vk_replay.cpp index 427023cd4..f766e7982 100644 --- a/renderdoc/driver/vulkan/vk_replay.cpp +++ b/renderdoc/driver/vulkan/vk_replay.cpp @@ -1381,18 +1381,6 @@ FloatVector VulkanReplay::InterpretVertex(byte *data, uint32_t vert, MeshDisplay ret.z = v.z; return ret; } - else if(cfg.position.specialFormat == eSpecial_B8G8R8A8) - { - if(data+4 >= end) - { - valid = false; - return ret; - } - - fmt.compByteWidth = 1; - fmt.compCount = 4; - fmt.compType = eCompType_UNorm; - } if(data + cfg.position.compCount*cfg.position.compByteWidth > end) { @@ -1408,12 +1396,12 @@ FloatVector VulkanReplay::InterpretVertex(byte *data, uint32_t vert, MeshDisplay out++; } - if(cfg.position.specialFormat == eSpecial_B8G8R8A8) + if(cfg.position.bgraOrder) { FloatVector reversed; - reversed.x = ret.x; + reversed.x = ret.z; reversed.y = ret.y; - reversed.z = ret.z; + reversed.z = ret.x; reversed.w = ret.w; return reversed; } diff --git a/renderdoc/replay/replay_renderer.cpp b/renderdoc/replay/replay_renderer.cpp index efe1d4e96..123ac47ec 100644 --- a/renderdoc/replay/replay_renderer.cpp +++ b/renderdoc/replay/replay_renderer.cpp @@ -706,6 +706,7 @@ bool ReplayRenderer::SaveTexture(const TextureSave &saveData, const char *path) break; case eSpecial_D16S8: case eSpecial_YUV: + case eSpecial_R4G4: RDCERR("Unsupported file format %u", td.format.specialFormat); return false; default: diff --git a/renderdocui/Interop/Enums.cs b/renderdocui/Interop/Enums.cs index c1cc8e457..95801b06d 100644 --- a/renderdocui/Interop/Enums.cs +++ b/renderdocui/Interop/Enums.cs @@ -193,6 +193,7 @@ namespace renderdoc R5G5B5A1, R9G9B9E5, R4G4B4A4, + R4G4, D16S8, D24S8, D32S8,