diff --git a/qrenderdoc/Windows/TextureViewer.cpp b/qrenderdoc/Windows/TextureViewer.cpp index 6466a29aa..6fb0e2b26 100644 --- a/qrenderdoc/Windows/TextureViewer.cpp +++ b/qrenderdoc/Windows/TextureViewer.cpp @@ -3254,6 +3254,7 @@ void TextureViewer::on_viewTexBuffer_clicked() case ResourceFormatType::ETC2: case ResourceFormatType::EAC: case ResourceFormatType::ASTC: + case ResourceFormatType::PVRTC: varName = lit("block"); // display a 4x4 block at a time w /= 4; @@ -3280,6 +3281,7 @@ void TextureViewer::on_viewTexBuffer_clicked() case ResourceFormatType::BC4: case ResourceFormatType::ETC2: case ResourceFormatType::EAC: + case ResourceFormatType::PVRTC: baseType = lit("row_major xint2x1"); break; // 4x4 byte block, for 128-bit block formats diff --git a/renderdoc/api/replay/replay_enums.h b/renderdoc/api/replay/replay_enums.h index 36d3bf26e..35bf871f5 100644 --- a/renderdoc/api/replay/replay_enums.h +++ b/renderdoc/api/replay/replay_enums.h @@ -1142,6 +1142,7 @@ enum class ResourceFormatType : uint8_t D32S8, S8, YUV, + PVRTC, }; DOCUMENT(R"(An API specific hint for a certain behaviour. A legacy concept in OpenGL that controls diff --git a/renderdoc/driver/vulkan/vk_common.cpp b/renderdoc/driver/vulkan/vk_common.cpp index bd2eed134..20dba9909 100644 --- a/renderdoc/driver/vulkan/vk_common.cpp +++ b/renderdoc/driver/vulkan/vk_common.cpp @@ -337,6 +337,14 @@ ResourceFormat MakeResourceFormat(VkFormat fmt) case VK_FORMAT_ASTC_12x10_SRGB_BLOCK: case VK_FORMAT_ASTC_12x12_UNORM_BLOCK: case VK_FORMAT_ASTC_12x12_SRGB_BLOCK: ret.type = ResourceFormatType::ASTC; break; + case VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG: + case VK_FORMAT_PVRTC1_4BPP_UNORM_BLOCK_IMG: + case VK_FORMAT_PVRTC2_2BPP_UNORM_BLOCK_IMG: + case VK_FORMAT_PVRTC2_4BPP_UNORM_BLOCK_IMG: + case VK_FORMAT_PVRTC1_2BPP_SRGB_BLOCK_IMG: + case VK_FORMAT_PVRTC1_4BPP_SRGB_BLOCK_IMG: + case VK_FORMAT_PVRTC2_2BPP_SRGB_BLOCK_IMG: + case VK_FORMAT_PVRTC2_4BPP_SRGB_BLOCK_IMG: ret.type = ResourceFormatType::PVRTC; break; default: break; } @@ -542,7 +550,11 @@ ResourceFormat MakeResourceFormat(VkFormat fmt) case VK_FORMAT_ASTC_12x10_SRGB_BLOCK: case VK_FORMAT_ASTC_12x12_SRGB_BLOCK: case VK_FORMAT_B8G8R8_SRGB: - case VK_FORMAT_B8G8R8A8_SRGB: ret.srgbCorrected = true; break; + case VK_FORMAT_B8G8R8A8_SRGB: + case VK_FORMAT_PVRTC1_2BPP_SRGB_BLOCK_IMG: + case VK_FORMAT_PVRTC1_4BPP_SRGB_BLOCK_IMG: + case VK_FORMAT_PVRTC2_2BPP_SRGB_BLOCK_IMG: + case VK_FORMAT_PVRTC2_4BPP_SRGB_BLOCK_IMG: ret.srgbCorrected = true; break; default: break; } @@ -623,7 +635,15 @@ ResourceFormat MakeResourceFormat(VkFormat fmt) case VK_FORMAT_B8G8R8A8_SRGB: case VK_FORMAT_A8B8G8R8_UNORM_PACK32: case VK_FORMAT_A8B8G8R8_SRGB_PACK32: - case VK_FORMAT_A2B10G10R10_UNORM_PACK32: ret.compType = CompType::UNorm; break; + case VK_FORMAT_A2B10G10R10_UNORM_PACK32: + case VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG: + case VK_FORMAT_PVRTC1_4BPP_UNORM_BLOCK_IMG: + case VK_FORMAT_PVRTC2_2BPP_UNORM_BLOCK_IMG: + case VK_FORMAT_PVRTC2_4BPP_UNORM_BLOCK_IMG: + case VK_FORMAT_PVRTC1_2BPP_SRGB_BLOCK_IMG: + case VK_FORMAT_PVRTC1_4BPP_SRGB_BLOCK_IMG: + case VK_FORMAT_PVRTC2_2BPP_SRGB_BLOCK_IMG: + case VK_FORMAT_PVRTC2_4BPP_SRGB_BLOCK_IMG: ret.compType = CompType::UNorm; break; case VK_FORMAT_R8_SNORM: case VK_FORMAT_R8G8_SNORM: case VK_FORMAT_R8G8B8_SNORM: @@ -2910,6 +2930,14 @@ string ToStrHelper::Get(const VkFormat &el) TOSTR_CASE_STRINGIZE(VK_FORMAT_ASTC_12x10_SRGB_BLOCK) TOSTR_CASE_STRINGIZE(VK_FORMAT_ASTC_12x12_UNORM_BLOCK) TOSTR_CASE_STRINGIZE(VK_FORMAT_ASTC_12x12_SRGB_BLOCK) + TOSTR_CASE_STRINGIZE(VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG) + TOSTR_CASE_STRINGIZE(VK_FORMAT_PVRTC1_2BPP_SRGB_BLOCK_IMG) + TOSTR_CASE_STRINGIZE(VK_FORMAT_PVRTC1_4BPP_UNORM_BLOCK_IMG) + TOSTR_CASE_STRINGIZE(VK_FORMAT_PVRTC1_4BPP_SRGB_BLOCK_IMG) + TOSTR_CASE_STRINGIZE(VK_FORMAT_PVRTC2_2BPP_UNORM_BLOCK_IMG) + TOSTR_CASE_STRINGIZE(VK_FORMAT_PVRTC2_2BPP_SRGB_BLOCK_IMG) + TOSTR_CASE_STRINGIZE(VK_FORMAT_PVRTC2_4BPP_UNORM_BLOCK_IMG) + TOSTR_CASE_STRINGIZE(VK_FORMAT_PVRTC2_4BPP_SRGB_BLOCK_IMG) default: break; } diff --git a/renderdoc/driver/vulkan/vk_core.cpp b/renderdoc/driver/vulkan/vk_core.cpp index 73ee14d9e..75f939f91 100644 --- a/renderdoc/driver/vulkan/vk_core.cpp +++ b/renderdoc/driver/vulkan/vk_core.cpp @@ -762,6 +762,11 @@ static const VkExtensionProperties supportedExtensions[] = { { VK_EXT_VALIDATION_FLAGS_EXTENSION_NAME, VK_EXT_VALIDATION_FLAGS_SPEC_VERSION, }, +#ifdef VK_IMG_format_pvrtc + { + VK_IMG_FORMAT_PVRTC_EXTENSION_NAME, VK_IMG_FORMAT_PVRTC_SPEC_VERSION, + }, +#endif #ifdef VK_KHR_android_surface { VK_KHR_ANDROID_SURFACE_EXTENSION_NAME, VK_KHR_ANDROID_SURFACE_SPEC_VERSION, diff --git a/renderdoc/driver/vulkan/vk_resources.cpp b/renderdoc/driver/vulkan/vk_resources.cpp index ff6a32ae0..46f7b9701 100644 --- a/renderdoc/driver/vulkan/vk_resources.cpp +++ b/renderdoc/driver/vulkan/vk_resources.cpp @@ -184,7 +184,15 @@ bool IsBlockFormat(VkFormat f) case VK_FORMAT_ASTC_12x10_UNORM_BLOCK: case VK_FORMAT_ASTC_12x10_SRGB_BLOCK: case VK_FORMAT_ASTC_12x12_UNORM_BLOCK: - case VK_FORMAT_ASTC_12x12_SRGB_BLOCK: return true; + case VK_FORMAT_ASTC_12x12_SRGB_BLOCK: + case VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG: + case VK_FORMAT_PVRTC1_2BPP_SRGB_BLOCK_IMG: + case VK_FORMAT_PVRTC1_4BPP_UNORM_BLOCK_IMG: + case VK_FORMAT_PVRTC1_4BPP_SRGB_BLOCK_IMG: + case VK_FORMAT_PVRTC2_2BPP_UNORM_BLOCK_IMG: + case VK_FORMAT_PVRTC2_2BPP_SRGB_BLOCK_IMG: + case VK_FORMAT_PVRTC2_4BPP_UNORM_BLOCK_IMG: + case VK_FORMAT_PVRTC2_4BPP_SRGB_BLOCK_IMG: return true; default: break; } @@ -290,7 +298,11 @@ bool IsSRGBFormat(VkFormat f) case VK_FORMAT_ASTC_12x10_SRGB_BLOCK: case VK_FORMAT_ASTC_12x12_SRGB_BLOCK: case VK_FORMAT_B8G8R8_SRGB: - case VK_FORMAT_B8G8R8A8_SRGB: return true; + case VK_FORMAT_B8G8R8A8_SRGB: + case VK_FORMAT_PVRTC1_2BPP_SRGB_BLOCK_IMG: + case VK_FORMAT_PVRTC1_4BPP_SRGB_BLOCK_IMG: + case VK_FORMAT_PVRTC2_2BPP_SRGB_BLOCK_IMG: + case VK_FORMAT_PVRTC2_4BPP_SRGB_BLOCK_IMG: return true; default: break; } @@ -707,6 +719,18 @@ uint32_t GetByteSize(uint32_t Width, uint32_t Height, uint32_t Depth, VkFormat F astc[0] = 12; astc[1] = 12; break; + case VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG: + case VK_FORMAT_PVRTC1_2BPP_SRGB_BLOCK_IMG: + case VK_FORMAT_PVRTC2_2BPP_UNORM_BLOCK_IMG: + case VK_FORMAT_PVRTC2_2BPP_SRGB_BLOCK_IMG: + ret = (uint32_t)(ceil(w / 8.0) * ceil(h / 4.0) * 8.0); + break; + case VK_FORMAT_PVRTC1_4BPP_UNORM_BLOCK_IMG: + case VK_FORMAT_PVRTC1_4BPP_SRGB_BLOCK_IMG: + case VK_FORMAT_PVRTC2_4BPP_UNORM_BLOCK_IMG: + case VK_FORMAT_PVRTC2_4BPP_SRGB_BLOCK_IMG: + ret = (uint32_t)(ceil(w / 4.0) * ceil(h / 4.0) * 8.0); + break; default: ret = 1; RDCERR("Unrecognised Vulkan Format: %d", Format); diff --git a/renderdoc/replay/entry_points.cpp b/renderdoc/replay/entry_points.cpp index 895e00add..c1718e4c5 100644 --- a/renderdoc/replay/entry_points.cpp +++ b/renderdoc/replay/entry_points.cpp @@ -570,6 +570,7 @@ static std::string ResourceFormatName(const ResourceFormat &fmt) case ResourceFormatType::D32S8: return "D32S8"; case ResourceFormatType::S8: return "S8"; case ResourceFormatType::YUV: return "YUV"; + case ResourceFormatType::PVRTC: return "PVRTC"; } } else if(fmt.compType == CompType::Depth)