From 8b7a0258534be32eab1232fd75d84ae49aac4e94 Mon Sep 17 00:00:00 2001 From: baldurk Date: Sun, 29 Nov 2015 22:05:26 +0100 Subject: [PATCH] Refactor BGRA formats to not be special (so allow any BGRA format) * Also add ASTC and D16S8 types while in the neighbourhood --- renderdoc/api/replay/control_types.h | 1 + renderdoc/api/replay/data_types.h | 3 + renderdoc/api/replay/replay_enums.h | 9 +- renderdoc/common/dds_readwrite.cpp | 75 ++-- renderdoc/driver/d3d11/d3d11_analyse.cpp | 25 +- renderdoc/driver/d3d11/d3d11_common.cpp | 385 +++++++++--------- renderdoc/driver/d3d11/d3d11_debug.cpp | 18 +- renderdoc/driver/d3d11/d3d11_device.cpp | 7 +- renderdoc/driver/d3d11/d3d11_resources.cpp | 6 +- renderdoc/driver/gl/gl_common.cpp | 46 ++- renderdoc/driver/gl/gl_debug.cpp | 18 +- renderdoc/driver/gl/gl_replay.cpp | 8 +- renderdoc/driver/gl/gl_resources.cpp | 127 ++++++ renderdoc/replay/replay_renderer.cpp | 13 +- renderdocui/Code/FormatElement.cs | 58 ++- renderdocui/Interop/Enums.cs | 9 +- renderdocui/Interop/FetchInfo.cs | 6 + renderdocui/Windows/BufferViewer.cs | 3 + .../PipelineState/GLPipelineStateViewer.cs | 3 +- renderdocui/Windows/PixelHistoryView.cs | 1 + 20 files changed, 512 insertions(+), 309 deletions(-) diff --git a/renderdoc/api/replay/control_types.h b/renderdoc/api/replay/control_types.h index 9def7502b..8193d13d1 100644 --- a/renderdoc/api/replay/control_types.h +++ b/renderdoc/api/replay/control_types.h @@ -42,6 +42,7 @@ struct MeshFormat uint32_t compCount; uint32_t compByteWidth; FormatComponentType compType; + bool32 bgraOrder; SpecialFormat specialFormat; bool showAlpha; diff --git a/renderdoc/api/replay/data_types.h b/renderdoc/api/replay/data_types.h index f3356f457..ca6b50340 100644 --- a/renderdoc/api/replay/data_types.h +++ b/renderdoc/api/replay/data_types.h @@ -43,6 +43,7 @@ struct ResourceFormat compCount = compByteWidth = 0; compType = eCompType_Float; + bgraOrder = false; srgbCorrected = false; } @@ -54,6 +55,7 @@ struct ResourceFormat return compCount == r.compCount && compByteWidth == r.compByteWidth && compType == r.compType && + bgraOrder == r.bgraOrder && srgbCorrected == r.srgbCorrected; } @@ -75,6 +77,7 @@ struct ResourceFormat uint32_t compByteWidth; FormatComponentType compType; + bool32 bgraOrder; bool32 srgbCorrected; }; diff --git a/renderdoc/api/replay/replay_enums.h b/renderdoc/api/replay/replay_enums.h index c6f2b4d9a..6d0ac388a 100644 --- a/renderdoc/api/replay/replay_enums.h +++ b/renderdoc/api/replay/replay_enums.h @@ -170,13 +170,14 @@ enum SpecialFormat eSpecial_BC7, eSpecial_ETC2, eSpecial_EAC, + eSpecial_ASTC, eSpecial_R10G10B10A2, eSpecial_R11G11B10, - eSpecial_B5G6R5, - eSpecial_B5G5R5A1, + eSpecial_R5G6B5, + eSpecial_R5G5B5A1, eSpecial_R9G9B9E5, - eSpecial_B8G8R8A8, - eSpecial_B4G4R4A4, + eSpecial_R4G4B4A4, + eSpecial_D16S8, eSpecial_D24S8, eSpecial_D32S8, eSpecial_S8, diff --git a/renderdoc/common/dds_readwrite.cpp b/renderdoc/common/dds_readwrite.cpp index eb8d98684..bd17b5e5f 100644 --- a/renderdoc/common/dds_readwrite.cpp +++ b/renderdoc/common/dds_readwrite.cpp @@ -287,25 +287,23 @@ ResourceFormat DXGIFormat2ResourceFormat(DXGI_FORMAT format) special.specialFormat = eSpecial_R10G10B10A2; special.compType = (format == DXGI_FORMAT_R10G10B10A2_UNORM ? eCompType_UNorm : eCompType_UInt); return special; - case DXGI_FORMAT_B8G8R8A8_UNORM: - case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB: - special.specialFormat = eSpecial_B8G8R8A8; - special.srgbCorrected = (format == DXGI_FORMAT_B8G8R8A8_UNORM_SRGB ? true : false); - return special; case DXGI_FORMAT_R11G11B10_FLOAT: special.specialFormat = eSpecial_R11G11B10; return special; case DXGI_FORMAT_B5G6R5_UNORM: - special.specialFormat = eSpecial_B5G6R5; + fmt8.bgraOrder = true; + special.specialFormat = eSpecial_R5G6B5; return special; case DXGI_FORMAT_B5G5R5A1_UNORM: - special.specialFormat = eSpecial_B5G5R5A1; + fmt8.bgraOrder = true; + special.specialFormat = eSpecial_R5G5B5A1; return special; case DXGI_FORMAT_R9G9B9E5_SHAREDEXP: special.specialFormat = eSpecial_R9G9B9E5; return special; case DXGI_FORMAT_B4G4R4A4_UNORM: - special.specialFormat = eSpecial_B4G4R4A4; + fmt8.bgraOrder = true; + special.specialFormat = eSpecial_R4G4B4A4; return special; case DXGI_FORMAT_D24_UNORM_S8_UINT: special.specialFormat = eSpecial_D24S8; @@ -434,6 +432,13 @@ ResourceFormat DXGIFormat2ResourceFormat(DXGI_FORMAT format) case DXGI_FORMAT_R8G8B8A8_UNORM: fmt8.compCount = 4; return fmt8; + case DXGI_FORMAT_B8G8R8A8_UNORM: + case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB: + fmt8.compType = eCompType_UNorm; + fmt8.compCount = 4; + fmt8.bgraOrder = true; + fmt8.srgbCorrected = (format == DXGI_FORMAT_B8G8R8A8_UNORM_SRGB ? true : false); + return fmt8; case DXGI_FORMAT_R8G8_UINT: fmt8.compType = eCompType_UInt; @@ -494,15 +499,16 @@ DXGI_FORMAT ResourceFormat2DXGIFormat(ResourceFormat format) return format.compType == eCompType_UNorm ? DXGI_FORMAT_R10G10B10A2_UNORM : DXGI_FORMAT_R10G10B10A2_UINT; case eSpecial_R11G11B10: return DXGI_FORMAT_R11G11B10_FLOAT; - case eSpecial_B5G6R5: + case eSpecial_R5G6B5: + RDCASSERT(format.bgraOrder); return DXGI_FORMAT_B5G6R5_UNORM; - case eSpecial_B5G5R5A1: + case eSpecial_R5G5B5A1: + RDCASSERT(format.bgraOrder); return DXGI_FORMAT_B5G5R5A1_UNORM; case eSpecial_R9G9B9E5: return DXGI_FORMAT_R9G9B9E5_SHAREDEXP; - case eSpecial_B8G8R8A8: - return format.srgbCorrected ? DXGI_FORMAT_B8G8R8A8_UNORM_SRGB : DXGI_FORMAT_B8G8R8A8_UNORM; - case eSpecial_B4G4R4A4: + case eSpecial_R4G4B4A4: + RDCASSERT(format.bgraOrder); return DXGI_FORMAT_B4G4R4A4_UNORM; case eSpecial_D24S8: return DXGI_FORMAT_D24_UNORM_S8_UINT; @@ -511,8 +517,10 @@ DXGI_FORMAT ResourceFormat2DXGIFormat(ResourceFormat format) case eSpecial_S8: return DXGI_FORMAT_R8_UINT; default: + case eSpecial_D16S8: case eSpecial_ETC2: case eSpecial_EAC: + case eSpecial_ASTC: case eSpecial_YUV: RDCERR("Unsupported writing format %u", format.specialFormat); return DXGI_FORMAT_UNKNOWN; @@ -549,8 +557,17 @@ DXGI_FORMAT ResourceFormat2DXGIFormat(ResourceFormat format) case eCompType_SInt: return DXGI_FORMAT_R8G8B8A8_SINT; case eCompType_SNorm: return DXGI_FORMAT_R8G8B8A8_SNORM; default: - case eCompType_UNorm: if(format.srgbCorrected) return DXGI_FORMAT_R8G8B8A8_UNORM_SRGB; - else return DXGI_FORMAT_R8G8B8A8_UNORM; + case eCompType_UNorm: + if(format.srgbCorrected) + { + if(format.bgraOrder) return DXGI_FORMAT_B8G8R8A8_UNORM_SRGB; + else return DXGI_FORMAT_R8G8B8A8_UNORM_SRGB; + } + else + { + if(format.bgraOrder) return DXGI_FORMAT_B8G8R8A8_UNORM; + else return DXGI_FORMAT_R8G8B8A8_UNORM; + } } } RDCERR("Unexpected component byte width %u for 4-component type", format.compByteWidth); @@ -687,7 +704,9 @@ bool write_dds_to_file(FILE *f, const dds_data &data) break; case eSpecial_ETC2: case eSpecial_EAC: - RDCERR("Unsupported file format, ETC2/EAC"); + case eSpecial_ASTC: + case eSpecial_YUV: + RDCERR("Unsupported file format, %u", data.format.specialFormat); return false; default: break; @@ -745,19 +764,19 @@ bool write_dds_to_file(FILE *f, const dds_data &data) case eSpecial_R9G9B9E5: case eSpecial_R11G11B10: case eSpecial_D24S8: - case eSpecial_B8G8R8A8: bytesPerPixel = 4; break; - case eSpecial_B5G6R5: - case eSpecial_B5G5R5A1: - case eSpecial_B4G4R4A4: + case eSpecial_R5G6B5: + case eSpecial_R5G5B5A1: + case eSpecial_R4G4B4A4: bytesPerPixel = 2; break; case eSpecial_D32S8: bytesPerPixel = 5; break; + case eSpecial_D16S8: case eSpecial_YUV: - RDCERR("Unsupported file format"); + RDCERR("Unsupported file format %u", data.format.specialFormat); return false; default: bytesPerPixel = data.format.compCount*data.format.compByteWidth; @@ -1017,19 +1036,19 @@ dds_data load_dds_from_file(FILE *f) case eSpecial_R9G9B9E5: case eSpecial_R11G11B10: case eSpecial_D24S8: - case eSpecial_B8G8R8A8: bytesPerPixel = 4; break; - case eSpecial_B5G6R5: - case eSpecial_B5G5R5A1: - case eSpecial_B4G4R4A4: + case eSpecial_R5G6B5: + case eSpecial_R5G5B5A1: + case eSpecial_R4G4B4A4: bytesPerPixel = 2; break; case eSpecial_D32S8: bytesPerPixel = 5; break; + case eSpecial_D16S8: case eSpecial_YUV: - RDCERR("Unsupported file format, YUV"); + RDCERR("Unsupported file format %u", ret.format.specialFormat); return error; default: bytesPerPixel = ret.format.compCount*ret.format.compByteWidth; @@ -1052,7 +1071,9 @@ dds_data load_dds_from_file(FILE *f) break; case eSpecial_ETC2: case eSpecial_EAC: - RDCERR("Unsupported file format, ETC2/EAC"); + case eSpecial_ASTC: + case eSpecial_YUV: + RDCERR("Unsupported file format, %u", ret.format.specialFormat); return error; default: break; diff --git a/renderdoc/driver/d3d11/d3d11_analyse.cpp b/renderdoc/driver/d3d11/d3d11_analyse.cpp index b9b711290..b5c7804c8 100644 --- a/renderdoc/driver/d3d11/d3d11_analyse.cpp +++ b/renderdoc/driver/d3d11/d3d11_analyse.cpp @@ -973,8 +973,7 @@ ShaderDebugTrace D3D11DebugManager::DebugVertex(uint32_t frameID, uint32_t event // if there's only e.g. 3 bytes remaining don't read and unpack some of // a 4-byte special format size_t packedsize = 4; - if (fmt.specialFormat == eSpecial_B8G8R8A8 || fmt.specialFormat == eSpecial_B5G5R5A1 || - fmt.specialFormat == eSpecial_B5G6R5 || fmt.specialFormat == eSpecial_B4G4R4A4) + if (fmt.specialFormat == eSpecial_R5G5B5A1 || fmt.specialFormat == eSpecial_R5G6B5 || fmt.specialFormat == eSpecial_R4G4B4A4) packedsize = 2; if(srcData == NULL || packedsize > dataSize) @@ -984,25 +983,21 @@ ShaderDebugTrace D3D11DebugManager::DebugVertex(uint32_t frameID, uint32_t event ret.inputs[i].value.u.z = ret.inputs[i].value.u.w = 0; } - else if (fmt.specialFormat == eSpecial_B8G8R8A8) - { - ret.inputs[i].value.f.x = float(srcData[2])/255.0f; - ret.inputs[i].value.f.y = float(srcData[1])/255.0f; - ret.inputs[i].value.f.z = float(srcData[0])/255.0f; - ret.inputs[i].value.f.w = float(srcData[3])/255.0f; - } - else if (fmt.specialFormat == eSpecial_B5G5R5A1) + else if (fmt.specialFormat == eSpecial_R5G5B5A1) { + RDCASSERT(fmt.bgraOrder); uint16_t packed = ((uint16_t *)srcData)[0]; *v4 = ConvertFromB5G5R5A1(packed); } - else if (fmt.specialFormat == eSpecial_B5G6R5) + else if (fmt.specialFormat == eSpecial_R5G6B5) { + RDCASSERT(fmt.bgraOrder); uint16_t packed = ((uint16_t *)srcData)[0]; *v3 = ConvertFromB5G6R5(packed); } - else if (fmt.specialFormat == eSpecial_B4G4R4A4) + else if (fmt.specialFormat == eSpecial_R4G4B4A4) { + RDCASSERT(fmt.bgraOrder); uint16_t packed = ((uint16_t *)srcData)[0]; *v4 = ConvertFromB4G4R4A4(packed); } @@ -1100,6 +1095,12 @@ ShaderDebugTrace D3D11DebugManager::DebugVertex(uint32_t frameID, uint32_t event RDCERR("Unexpected component type"); } } + + if(fmt.bgraOrder) + { + RDCASSERT(fmt.compCount == 4); + std::swap(ret.inputs[i].value.fv[2], ret.inputs[i].value.fv[0]); + } } } else if(dxbc->m_InputSig[i].systemValue == eAttr_VertexIndex) diff --git a/renderdoc/driver/d3d11/d3d11_common.cpp b/renderdoc/driver/d3d11/d3d11_common.cpp index 967ffa97a..bd55d1cc3 100644 --- a/renderdoc/driver/d3d11/d3d11_common.cpp +++ b/renderdoc/driver/d3d11/d3d11_common.cpp @@ -263,20 +263,20 @@ DXGI_FORMAT MakeDXGIFormat(ResourceFormat fmt) case eSpecial_R11G11B10: ret = DXGI_FORMAT_R11G11B10_FLOAT; break; - case eSpecial_B5G6R5: + case eSpecial_R5G6B5: + RDCASSERT(fmt.bgraOrder); ret = DXGI_FORMAT_B5G6R5_UNORM; break; - case eSpecial_B5G5R5A1: + case eSpecial_R5G5B5A1: + RDCASSERT(fmt.bgraOrder); ret = DXGI_FORMAT_B5G5R5A1_UNORM; break; case eSpecial_R9G9B9E5: ret = DXGI_FORMAT_R9G9B9E5_SHAREDEXP; break; - case eSpecial_B8G8R8A8: - ret = DXGI_FORMAT_B8G8R8A8_UNORM; - break; #if defined(INCLUDE_D3D_11_1) - case eSpecial_B4G4R4A4: + case eSpecial_R4G4B4A4: + RDCASSERT(fmt.bgraOrder); ret = DXGI_FORMAT_B4G4R4A4_UNORM; break; #endif @@ -295,8 +295,11 @@ DXGI_FORMAT MakeDXGIFormat(ResourceFormat fmt) case eSpecial_S8: RDCERR("D3D11 has no stencil-only format"); break; + case eSpecial_D16S8: + RDCERR("D3D11 has no D16S8 format"); + break; default: - RDCERR("Unrecognised special format"); + RDCERR("Unrecognised/unsupported special format %u", fmt.specialFormat); break; } } @@ -306,6 +309,9 @@ DXGI_FORMAT MakeDXGIFormat(ResourceFormat fmt) else if(fmt.compByteWidth == 2) ret = DXGI_FORMAT_R16G16B16A16_TYPELESS; else if(fmt.compByteWidth == 1) ret = DXGI_FORMAT_R8G8B8A8_TYPELESS; else RDCERR("Unrecognised 4-component byte width: %d", fmt.compByteWidth); + + if(fmt.bgraOrder) + ret = DXGI_FORMAT_B8G8R8A8_UNORM; } else if(fmt.compCount == 3) { @@ -374,68 +380,68 @@ ResourceFormat MakeResourceFormat(DXGI_FORMAT fmt) switch(fmt) { - case DXGI_FORMAT_R32G32B32A32_TYPELESS: - case DXGI_FORMAT_R32G32B32A32_FLOAT: - case DXGI_FORMAT_R32G32B32A32_UINT: - case DXGI_FORMAT_R32G32B32A32_SINT: - case DXGI_FORMAT_R16G16B16A16_TYPELESS: - case DXGI_FORMAT_R16G16B16A16_FLOAT: - case DXGI_FORMAT_R16G16B16A16_UNORM: - case DXGI_FORMAT_R16G16B16A16_UINT: - case DXGI_FORMAT_R16G16B16A16_SNORM: - case DXGI_FORMAT_R16G16B16A16_SINT: - case DXGI_FORMAT_R8G8B8A8_TYPELESS: - case DXGI_FORMAT_R8G8B8A8_UNORM: - case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB: - case DXGI_FORMAT_R8G8B8A8_UINT: - case DXGI_FORMAT_R8G8B8A8_SNORM: - case DXGI_FORMAT_R8G8B8A8_SINT: + case DXGI_FORMAT_R32G32B32A32_TYPELESS: + case DXGI_FORMAT_R32G32B32A32_FLOAT: + case DXGI_FORMAT_R32G32B32A32_UINT: + case DXGI_FORMAT_R32G32B32A32_SINT: + case DXGI_FORMAT_R16G16B16A16_TYPELESS: + case DXGI_FORMAT_R16G16B16A16_FLOAT: + case DXGI_FORMAT_R16G16B16A16_UNORM: + case DXGI_FORMAT_R16G16B16A16_UINT: + case DXGI_FORMAT_R16G16B16A16_SNORM: + case DXGI_FORMAT_R16G16B16A16_SINT: + case DXGI_FORMAT_R8G8B8A8_TYPELESS: + case DXGI_FORMAT_R8G8B8A8_UNORM: + case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB: + case DXGI_FORMAT_R8G8B8A8_UINT: + case DXGI_FORMAT_R8G8B8A8_SNORM: + case DXGI_FORMAT_R8G8B8A8_SINT: ret.compCount = 4; break; - case DXGI_FORMAT_R32G32B32_TYPELESS: - case DXGI_FORMAT_R32G32B32_FLOAT: - case DXGI_FORMAT_R32G32B32_UINT: - case DXGI_FORMAT_R32G32B32_SINT: + case DXGI_FORMAT_R32G32B32_TYPELESS: + case DXGI_FORMAT_R32G32B32_FLOAT: + case DXGI_FORMAT_R32G32B32_UINT: + case DXGI_FORMAT_R32G32B32_SINT: ret.compCount = 3; break; - case DXGI_FORMAT_R32G32_TYPELESS: - case DXGI_FORMAT_R32G32_FLOAT: - case DXGI_FORMAT_R32G32_UINT: - case DXGI_FORMAT_R32G32_SINT: - case DXGI_FORMAT_R16G16_TYPELESS: - case DXGI_FORMAT_R16G16_FLOAT: - case DXGI_FORMAT_R16G16_UNORM: - case DXGI_FORMAT_R16G16_UINT: - case DXGI_FORMAT_R16G16_SNORM: - case DXGI_FORMAT_R16G16_SINT: - case DXGI_FORMAT_R8G8_TYPELESS: - case DXGI_FORMAT_R8G8_UNORM: - case DXGI_FORMAT_R8G8_UINT: - case DXGI_FORMAT_R8G8_SNORM: - case DXGI_FORMAT_R8G8_SINT: + case DXGI_FORMAT_R32G32_TYPELESS: + case DXGI_FORMAT_R32G32_FLOAT: + case DXGI_FORMAT_R32G32_UINT: + case DXGI_FORMAT_R32G32_SINT: + case DXGI_FORMAT_R16G16_TYPELESS: + case DXGI_FORMAT_R16G16_FLOAT: + case DXGI_FORMAT_R16G16_UNORM: + case DXGI_FORMAT_R16G16_UINT: + case DXGI_FORMAT_R16G16_SNORM: + case DXGI_FORMAT_R16G16_SINT: + case DXGI_FORMAT_R8G8_TYPELESS: + case DXGI_FORMAT_R8G8_UNORM: + case DXGI_FORMAT_R8G8_UINT: + case DXGI_FORMAT_R8G8_SNORM: + case DXGI_FORMAT_R8G8_SINT: ret.compCount = 2; break; - case DXGI_FORMAT_R32_TYPELESS: - case DXGI_FORMAT_D32_FLOAT: - case DXGI_FORMAT_R32_FLOAT: - case DXGI_FORMAT_R32_UINT: - case DXGI_FORMAT_R32_SINT: - case DXGI_FORMAT_R16_TYPELESS: - case DXGI_FORMAT_R16_FLOAT: - case DXGI_FORMAT_D16_UNORM: - case DXGI_FORMAT_R16_UNORM: - case DXGI_FORMAT_R16_UINT: - case DXGI_FORMAT_R16_SNORM: - case DXGI_FORMAT_R16_SINT: - case DXGI_FORMAT_R8_TYPELESS: - case DXGI_FORMAT_R8_UNORM: - case DXGI_FORMAT_R8_UINT: - case DXGI_FORMAT_R8_SNORM: - case DXGI_FORMAT_R8_SINT: - case DXGI_FORMAT_A8_UNORM: + case DXGI_FORMAT_R32_TYPELESS: + case DXGI_FORMAT_D32_FLOAT: + case DXGI_FORMAT_R32_FLOAT: + case DXGI_FORMAT_R32_UINT: + case DXGI_FORMAT_R32_SINT: + case DXGI_FORMAT_R16_TYPELESS: + case DXGI_FORMAT_R16_FLOAT: + case DXGI_FORMAT_D16_UNORM: + case DXGI_FORMAT_R16_UNORM: + case DXGI_FORMAT_R16_UINT: + case DXGI_FORMAT_R16_SNORM: + case DXGI_FORMAT_R16_SINT: + case DXGI_FORMAT_R8_TYPELESS: + case DXGI_FORMAT_R8_UNORM: + case DXGI_FORMAT_R8_UINT: + case DXGI_FORMAT_R8_SNORM: + case DXGI_FORMAT_R8_SINT: + case DXGI_FORMAT_A8_UNORM: ret.compCount = 1; break; - + case DXGI_FORMAT_R32G8X24_TYPELESS: case DXGI_FORMAT_D32_FLOAT_S8X24_UINT: case DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS: @@ -450,7 +456,7 @@ ResourceFormat MakeResourceFormat(DXGI_FORMAT fmt) case DXGI_FORMAT_BC5_SNORM: ret.compCount = 2; break; - + case DXGI_FORMAT_R11G11B10_FLOAT: case DXGI_FORMAT_R9G9B9E5_SHAREDEXP: case DXGI_FORMAT_R8G8_B8G8_UNORM: @@ -474,7 +480,7 @@ ResourceFormat MakeResourceFormat(DXGI_FORMAT fmt) case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB: case DXGI_FORMAT_B5G5R5A1_UNORM: case DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM: - + case DXGI_FORMAT_BC1_TYPELESS: case DXGI_FORMAT_BC1_UNORM: case DXGI_FORMAT_BC1_UNORM_SRGB: @@ -491,7 +497,7 @@ ResourceFormat MakeResourceFormat(DXGI_FORMAT fmt) break; case DXGI_FORMAT_R1_UNORM: - + case DXGI_FORMAT_BC4_TYPELESS: case DXGI_FORMAT_BC4_UNORM: case DXGI_FORMAT_BC4_SNORM: @@ -507,63 +513,63 @@ ResourceFormat MakeResourceFormat(DXGI_FORMAT fmt) switch(fmt) { - case DXGI_FORMAT_R32G32B32A32_TYPELESS: - case DXGI_FORMAT_R32G32B32A32_FLOAT: - case DXGI_FORMAT_R32G32B32A32_UINT: - case DXGI_FORMAT_R32G32B32A32_SINT: - case DXGI_FORMAT_R32G32B32_TYPELESS: - case DXGI_FORMAT_R32G32B32_FLOAT: - case DXGI_FORMAT_R32G32B32_UINT: - case DXGI_FORMAT_R32G32B32_SINT: - case DXGI_FORMAT_R32G32_TYPELESS: - case DXGI_FORMAT_R32G32_FLOAT: - case DXGI_FORMAT_R32G32_UINT: - case DXGI_FORMAT_R32G32_SINT: - case DXGI_FORMAT_R32_TYPELESS: - case DXGI_FORMAT_D32_FLOAT: - case DXGI_FORMAT_R32_FLOAT: - case DXGI_FORMAT_R32_UINT: - case DXGI_FORMAT_R32_SINT: + case DXGI_FORMAT_R32G32B32A32_TYPELESS: + case DXGI_FORMAT_R32G32B32A32_FLOAT: + case DXGI_FORMAT_R32G32B32A32_UINT: + case DXGI_FORMAT_R32G32B32A32_SINT: + case DXGI_FORMAT_R32G32B32_TYPELESS: + case DXGI_FORMAT_R32G32B32_FLOAT: + case DXGI_FORMAT_R32G32B32_UINT: + case DXGI_FORMAT_R32G32B32_SINT: + case DXGI_FORMAT_R32G32_TYPELESS: + case DXGI_FORMAT_R32G32_FLOAT: + case DXGI_FORMAT_R32G32_UINT: + case DXGI_FORMAT_R32G32_SINT: + case DXGI_FORMAT_R32_TYPELESS: + case DXGI_FORMAT_D32_FLOAT: + case DXGI_FORMAT_R32_FLOAT: + case DXGI_FORMAT_R32_UINT: + case DXGI_FORMAT_R32_SINT: ret.compByteWidth = 4; break; - case DXGI_FORMAT_R16G16B16A16_TYPELESS: - case DXGI_FORMAT_R16G16B16A16_FLOAT: - case DXGI_FORMAT_R16G16B16A16_UNORM: - case DXGI_FORMAT_R16G16B16A16_UINT: - case DXGI_FORMAT_R16G16B16A16_SNORM: - case DXGI_FORMAT_R16G16B16A16_SINT: - case DXGI_FORMAT_R16G16_TYPELESS: - case DXGI_FORMAT_R16G16_FLOAT: - case DXGI_FORMAT_R16G16_UNORM: - case DXGI_FORMAT_R16G16_UINT: - case DXGI_FORMAT_R16G16_SNORM: - case DXGI_FORMAT_R16G16_SINT: - case DXGI_FORMAT_R16_TYPELESS: - case DXGI_FORMAT_R16_FLOAT: - case DXGI_FORMAT_D16_UNORM: - case DXGI_FORMAT_R16_UNORM: - case DXGI_FORMAT_R16_UINT: - case DXGI_FORMAT_R16_SNORM: - case DXGI_FORMAT_R16_SINT: + case DXGI_FORMAT_R16G16B16A16_TYPELESS: + case DXGI_FORMAT_R16G16B16A16_FLOAT: + case DXGI_FORMAT_R16G16B16A16_UNORM: + case DXGI_FORMAT_R16G16B16A16_UINT: + case DXGI_FORMAT_R16G16B16A16_SNORM: + case DXGI_FORMAT_R16G16B16A16_SINT: + case DXGI_FORMAT_R16G16_TYPELESS: + case DXGI_FORMAT_R16G16_FLOAT: + case DXGI_FORMAT_R16G16_UNORM: + case DXGI_FORMAT_R16G16_UINT: + case DXGI_FORMAT_R16G16_SNORM: + case DXGI_FORMAT_R16G16_SINT: + case DXGI_FORMAT_R16_TYPELESS: + case DXGI_FORMAT_R16_FLOAT: + case DXGI_FORMAT_D16_UNORM: + case DXGI_FORMAT_R16_UNORM: + case DXGI_FORMAT_R16_UINT: + case DXGI_FORMAT_R16_SNORM: + case DXGI_FORMAT_R16_SINT: ret.compByteWidth = 2; break; - case DXGI_FORMAT_R8G8B8A8_TYPELESS: - case DXGI_FORMAT_R8G8B8A8_UNORM: - case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB: - case DXGI_FORMAT_R8G8B8A8_UINT: - case DXGI_FORMAT_R8G8B8A8_SNORM: - case DXGI_FORMAT_R8G8B8A8_SINT: - case DXGI_FORMAT_R8G8_TYPELESS: - case DXGI_FORMAT_R8G8_UNORM: - case DXGI_FORMAT_R8G8_UINT: - case DXGI_FORMAT_R8G8_SNORM: - case DXGI_FORMAT_R8G8_SINT: - case DXGI_FORMAT_R8_TYPELESS: - case DXGI_FORMAT_R8_UNORM: - case DXGI_FORMAT_R8_UINT: - case DXGI_FORMAT_R8_SNORM: - case DXGI_FORMAT_R8_SINT: - case DXGI_FORMAT_A8_UNORM: + case DXGI_FORMAT_R8G8B8A8_TYPELESS: + case DXGI_FORMAT_R8G8B8A8_UNORM: + case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB: + case DXGI_FORMAT_R8G8B8A8_UINT: + case DXGI_FORMAT_R8G8B8A8_SNORM: + case DXGI_FORMAT_R8G8B8A8_SINT: + case DXGI_FORMAT_R8G8_TYPELESS: + case DXGI_FORMAT_R8G8_UNORM: + case DXGI_FORMAT_R8G8_UINT: + case DXGI_FORMAT_R8G8_SNORM: + case DXGI_FORMAT_R8G8_SINT: + case DXGI_FORMAT_R8_TYPELESS: + case DXGI_FORMAT_R8_UNORM: + case DXGI_FORMAT_R8_UINT: + case DXGI_FORMAT_R8_SNORM: + case DXGI_FORMAT_R8_SINT: + case DXGI_FORMAT_A8_UNORM: ret.compByteWidth = 1; break; @@ -584,87 +590,87 @@ ResourceFormat MakeResourceFormat(DXGI_FORMAT fmt) switch(fmt) { - case DXGI_FORMAT_R32G32B32A32_TYPELESS: - case DXGI_FORMAT_R32G32B32_TYPELESS: - case DXGI_FORMAT_R32G32_TYPELESS: - case DXGI_FORMAT_R32_TYPELESS: - case DXGI_FORMAT_R16G16B16A16_TYPELESS: - case DXGI_FORMAT_R16G16_TYPELESS: - case DXGI_FORMAT_R16_TYPELESS: - case DXGI_FORMAT_R8G8B8A8_TYPELESS: - case DXGI_FORMAT_R8G8_TYPELESS: - case DXGI_FORMAT_R8_TYPELESS: + case DXGI_FORMAT_R32G32B32A32_TYPELESS: + case DXGI_FORMAT_R32G32B32_TYPELESS: + case DXGI_FORMAT_R32G32_TYPELESS: + case DXGI_FORMAT_R32_TYPELESS: + case DXGI_FORMAT_R16G16B16A16_TYPELESS: + case DXGI_FORMAT_R16G16_TYPELESS: + case DXGI_FORMAT_R16_TYPELESS: + case DXGI_FORMAT_R8G8B8A8_TYPELESS: + case DXGI_FORMAT_R8G8_TYPELESS: + case DXGI_FORMAT_R8_TYPELESS: ret.compType = eCompType_None; break; - case DXGI_FORMAT_R32G32B32A32_FLOAT: - case DXGI_FORMAT_R32G32B32_FLOAT: - case DXGI_FORMAT_R16G16B16A16_FLOAT: - case DXGI_FORMAT_R32G32_FLOAT: - case DXGI_FORMAT_R16G16_FLOAT: - case DXGI_FORMAT_R32_FLOAT: - case DXGI_FORMAT_R16_FLOAT: + case DXGI_FORMAT_R32G32B32A32_FLOAT: + case DXGI_FORMAT_R32G32B32_FLOAT: + case DXGI_FORMAT_R16G16B16A16_FLOAT: + case DXGI_FORMAT_R32G32_FLOAT: + case DXGI_FORMAT_R16G16_FLOAT: + case DXGI_FORMAT_R32_FLOAT: + case DXGI_FORMAT_R16_FLOAT: ret.compType = eCompType_Float; break; - case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB: - case DXGI_FORMAT_R8G8B8A8_UNORM: - case DXGI_FORMAT_R16G16B16A16_UNORM: - case DXGI_FORMAT_R16G16_UNORM: - case DXGI_FORMAT_R8G8_UNORM: - case DXGI_FORMAT_R16_UNORM: - case DXGI_FORMAT_R8_UNORM: - case DXGI_FORMAT_A8_UNORM: + case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB: + case DXGI_FORMAT_R8G8B8A8_UNORM: + case DXGI_FORMAT_R16G16B16A16_UNORM: + case DXGI_FORMAT_R16G16_UNORM: + case DXGI_FORMAT_R8G8_UNORM: + case DXGI_FORMAT_R16_UNORM: + case DXGI_FORMAT_R8_UNORM: + case DXGI_FORMAT_A8_UNORM: ret.compType = eCompType_UNorm; break; - case DXGI_FORMAT_R8G8B8A8_SNORM: - case DXGI_FORMAT_R16G16B16A16_SNORM: - case DXGI_FORMAT_R16G16_SNORM: - case DXGI_FORMAT_R8G8_SNORM: - case DXGI_FORMAT_R16_SNORM: - case DXGI_FORMAT_R8_SNORM: + case DXGI_FORMAT_R8G8B8A8_SNORM: + case DXGI_FORMAT_R16G16B16A16_SNORM: + case DXGI_FORMAT_R16G16_SNORM: + case DXGI_FORMAT_R8G8_SNORM: + case DXGI_FORMAT_R16_SNORM: + case DXGI_FORMAT_R8_SNORM: ret.compType = eCompType_SNorm; break; - case DXGI_FORMAT_R32G32B32A32_UINT: - case DXGI_FORMAT_R32G32B32_UINT: - case DXGI_FORMAT_R16G16B16A16_UINT: - case DXGI_FORMAT_R32G32_UINT: - case DXGI_FORMAT_R8G8B8A8_UINT: - case DXGI_FORMAT_R16G16_UINT: - case DXGI_FORMAT_R32_UINT: - case DXGI_FORMAT_R8G8_UINT: - case DXGI_FORMAT_R16_UINT: - case DXGI_FORMAT_R8_UINT: + case DXGI_FORMAT_R32G32B32A32_UINT: + case DXGI_FORMAT_R32G32B32_UINT: + case DXGI_FORMAT_R16G16B16A16_UINT: + case DXGI_FORMAT_R32G32_UINT: + case DXGI_FORMAT_R8G8B8A8_UINT: + case DXGI_FORMAT_R16G16_UINT: + case DXGI_FORMAT_R32_UINT: + case DXGI_FORMAT_R8G8_UINT: + case DXGI_FORMAT_R16_UINT: + case DXGI_FORMAT_R8_UINT: ret.compType = eCompType_UInt; break; - case DXGI_FORMAT_R32G32B32A32_SINT: - case DXGI_FORMAT_R32G32B32_SINT: - case DXGI_FORMAT_R16G16B16A16_SINT: - case DXGI_FORMAT_R32G32_SINT: - case DXGI_FORMAT_R8G8B8A8_SINT: - case DXGI_FORMAT_R16G16_SINT: - case DXGI_FORMAT_R32_SINT: - case DXGI_FORMAT_R8G8_SINT: - case DXGI_FORMAT_R16_SINT: - case DXGI_FORMAT_R8_SINT: + case DXGI_FORMAT_R32G32B32A32_SINT: + case DXGI_FORMAT_R32G32B32_SINT: + case DXGI_FORMAT_R16G16B16A16_SINT: + case DXGI_FORMAT_R32G32_SINT: + case DXGI_FORMAT_R8G8B8A8_SINT: + case DXGI_FORMAT_R16G16_SINT: + case DXGI_FORMAT_R32_SINT: + case DXGI_FORMAT_R8G8_SINT: + case DXGI_FORMAT_R16_SINT: + case DXGI_FORMAT_R8_SINT: ret.compType = eCompType_SInt; break; - + case DXGI_FORMAT_R10G10B10A2_UINT: case DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM: ret.compType = eCompType_UInt; break; - + case DXGI_FORMAT_R9G9B9E5_SHAREDEXP: case DXGI_FORMAT_R11G11B10_FLOAT: ret.compType = eCompType_Float; break; - + case DXGI_FORMAT_BC4_SNORM: case DXGI_FORMAT_BC5_SNORM: case DXGI_FORMAT_BC6H_SF16: case DXGI_FORMAT_BC6H_TYPELESS: ret.compType = eCompType_SNorm; break; - + case DXGI_FORMAT_R24G8_TYPELESS: ret.compType = eCompType_None; break; @@ -672,13 +678,13 @@ ResourceFormat MakeResourceFormat(DXGI_FORMAT fmt) case DXGI_FORMAT_D32_FLOAT_S8X24_UINT: case DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS: case DXGI_FORMAT_X32_TYPELESS_G8X24_UINT: - case DXGI_FORMAT_D32_FLOAT: + case DXGI_FORMAT_D32_FLOAT: case DXGI_FORMAT_R24_UNORM_X8_TYPELESS: case DXGI_FORMAT_D24_UNORM_S8_UINT: - case DXGI_FORMAT_D16_UNORM: + case DXGI_FORMAT_D16_UNORM: ret.compType = eCompType_Depth; break; - + case DXGI_FORMAT_R10G10B10A2_TYPELESS: case DXGI_FORMAT_B8G8R8A8_TYPELESS: case DXGI_FORMAT_B8G8R8X8_TYPELESS: @@ -721,6 +727,18 @@ ResourceFormat MakeResourceFormat(DXGI_FORMAT fmt) ret.special = true; } + switch(fmt) + { + case DXGI_FORMAT_B8G8R8A8_UNORM: + case DXGI_FORMAT_B8G8R8X8_UNORM: + case DXGI_FORMAT_B8G8R8A8_TYPELESS: + case DXGI_FORMAT_B8G8R8X8_TYPELESS: + case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB: + case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB: + ret.bgraOrder = true; + break; + } + ret.specialFormat = eSpecial_Unknown; switch(fmt) @@ -783,22 +801,16 @@ ResourceFormat MakeResourceFormat(DXGI_FORMAT fmt) ret.specialFormat = eSpecial_R11G11B10; break; case DXGI_FORMAT_B5G6R5_UNORM: - ret.specialFormat = eSpecial_B5G6R5; + ret.specialFormat = eSpecial_R5G6B5; + ret.bgraOrder = true; break; case DXGI_FORMAT_B5G5R5A1_UNORM: - ret.specialFormat = eSpecial_B5G5R5A1; + ret.specialFormat = eSpecial_R5G5B5A1; + ret.bgraOrder = true; break; case DXGI_FORMAT_R9G9B9E5_SHAREDEXP: ret.specialFormat = eSpecial_R9G9B9E5; break; - case DXGI_FORMAT_B8G8R8A8_UNORM: - case DXGI_FORMAT_B8G8R8X8_UNORM: - case DXGI_FORMAT_B8G8R8A8_TYPELESS: - case DXGI_FORMAT_B8G8R8X8_TYPELESS: - case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB: - case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB: - ret.specialFormat = eSpecial_B8G8R8A8; - break; #if defined(INCLUDE_D3D_11_1) case DXGI_FORMAT_AYUV: @@ -820,7 +832,8 @@ ResourceFormat MakeResourceFormat(DXGI_FORMAT fmt) break; case DXGI_FORMAT_B4G4R4A4_UNORM: - ret.specialFormat = eSpecial_B4G4R4A4; + ret.specialFormat = eSpecial_R4G4B4A4; + ret.bgraOrder = true; break; #endif diff --git a/renderdoc/driver/d3d11/d3d11_debug.cpp b/renderdoc/driver/d3d11/d3d11_debug.cpp index e7d1a3329..18fcfaaa2 100644 --- a/renderdoc/driver/d3d11/d3d11_debug.cpp +++ b/renderdoc/driver/d3d11/d3d11_debug.cpp @@ -4548,18 +4548,6 @@ FloatVector D3D11DebugManager::InterpretVertex(byte *data, uint32_t vert, MeshDi 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) { @@ -4575,12 +4563,12 @@ FloatVector D3D11DebugManager::InterpretVertex(byte *data, uint32_t vert, MeshDi 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/driver/d3d11/d3d11_device.cpp b/renderdoc/driver/d3d11/d3d11_device.cpp index 402b165cd..5a6f29765 100644 --- a/renderdoc/driver/d3d11/d3d11_device.cpp +++ b/renderdoc/driver/d3d11/d3d11_device.cpp @@ -2679,18 +2679,13 @@ bool WrappedID3D11Device::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/d3d11/d3d11_resources.cpp b/renderdoc/driver/d3d11/d3d11_resources.cpp index 5d9dd7132..9e6217280 100644 --- a/renderdoc/driver/d3d11/d3d11_resources.cpp +++ b/renderdoc/driver/d3d11/d3d11_resources.cpp @@ -699,9 +699,11 @@ DXGI_FORMAT GetSRGBFormat(DXGI_FORMAT f) return DXGI_FORMAT_BC7_UNORM_SRGB; case DXGI_FORMAT_B8G8R8A8_TYPELESS: + case DXGI_FORMAT_B8G8R8A8_UNORM: return DXGI_FORMAT_B8G8R8A8_UNORM_SRGB; case DXGI_FORMAT_B8G8R8X8_TYPELESS: + case DXGI_FORMAT_B8G8R8X8_UNORM: return DXGI_FORMAT_B8G8R8X8_UNORM_SRGB; default: @@ -785,10 +787,10 @@ DXGI_FORMAT GetUnormTypedFormat(DXGI_FORMAT f) return DXGI_FORMAT_BC5_UNORM; case DXGI_FORMAT_B8G8R8A8_TYPELESS: - return DXGI_FORMAT_B8G8R8A8_UNORM_SRGB; + return DXGI_FORMAT_B8G8R8A8_UNORM; case DXGI_FORMAT_B8G8R8X8_TYPELESS: - return DXGI_FORMAT_B8G8R8X8_UNORM_SRGB; + return DXGI_FORMAT_B8G8R8X8_UNORM; case DXGI_FORMAT_BC6H_TYPELESS: case DXGI_FORMAT_BC6H_SF16: diff --git a/renderdoc/driver/gl/gl_common.cpp b/renderdoc/driver/gl/gl_common.cpp index 4f3a6f2ca..af6ea970b 100644 --- a/renderdoc/driver/gl/gl_common.cpp +++ b/renderdoc/driver/gl/gl_common.cpp @@ -739,6 +739,37 @@ ResourceFormat MakeResourceFormat(WrappedOpenGL &gl, GLenum target, GLenum fmt) case eGL_COMPRESSED_SIGNED_RG11_EAC: ret.specialFormat = eSpecial_EAC; break; + // ASTC + case GL_COMPRESSED_RGBA_ASTC_4x4_KHR: + case GL_COMPRESSED_RGBA_ASTC_5x4_KHR: + case GL_COMPRESSED_RGBA_ASTC_5x5_KHR: + case GL_COMPRESSED_RGBA_ASTC_6x5_KHR: + case GL_COMPRESSED_RGBA_ASTC_6x6_KHR: + case GL_COMPRESSED_RGBA_ASTC_8x5_KHR: + case GL_COMPRESSED_RGBA_ASTC_8x6_KHR: + case GL_COMPRESSED_RGBA_ASTC_8x8_KHR: + case GL_COMPRESSED_RGBA_ASTC_10x5_KHR: + case GL_COMPRESSED_RGBA_ASTC_10x6_KHR: + case GL_COMPRESSED_RGBA_ASTC_10x8_KHR: + case GL_COMPRESSED_RGBA_ASTC_10x10_KHR: + case GL_COMPRESSED_RGBA_ASTC_12x10_KHR: + case GL_COMPRESSED_RGBA_ASTC_12x12_KHR: + case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR: + case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR: + case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR: + case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR: + case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR: + case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR: + case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR: + case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR: + case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR: + case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR: + case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR: + case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR: + case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR: + case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR: + ret.specialFormat = eSpecial_ASTC; + break; default: RDCERR("Unexpected compressed format %#x", fmt); break; @@ -937,19 +968,16 @@ GLenum MakeGLFormat(WrappedOpenGL &gl, ResourceFormat fmt) case eSpecial_R11G11B10: ret = eGL_R11F_G11F_B10F; break; - case eSpecial_B5G6R5: + case eSpecial_R5G6B5: ret = eGL_RGB565; break; - case eSpecial_B5G5R5A1: + case eSpecial_R5G5B5A1: ret = eGL_RGB5_A1; break; case eSpecial_R9G9B9E5: ret = eGL_RGB9_E5; break; - case eSpecial_B8G8R8A8: - ret = eGL_RGBA; - break; - case eSpecial_B4G4R4A4: + case eSpecial_R4G4B4A4: ret = eGL_RGBA4; break; case eSpecial_D24S8: @@ -958,6 +986,9 @@ GLenum MakeGLFormat(WrappedOpenGL &gl, ResourceFormat fmt) case eSpecial_D32S8: ret = eGL_DEPTH32F_STENCIL8; break; + case eSpecial_ASTC: + RDCERR("ASTC can't be decoded unambiguously"); + break; case eSpecial_S8: ret = eGL_STENCIL_INDEX8; break; @@ -995,6 +1026,9 @@ GLenum MakeGLFormat(WrappedOpenGL &gl, ResourceFormat fmt) else if(fmt.compType == eCompType_SNorm) ret = eGL_RGBA8_SNORM; else if(fmt.compType == eCompType_UNorm) ret = eGL_RGBA8; else RDCERR("Unrecognised component type"); + + if(fmt.bgraOrder) + ret = eGL_BGRA; } else { diff --git a/renderdoc/driver/gl/gl_debug.cpp b/renderdoc/driver/gl/gl_debug.cpp index 08e3ceb54..253af14b8 100644 --- a/renderdoc/driver/gl/gl_debug.cpp +++ b/renderdoc/driver/gl/gl_debug.cpp @@ -3360,18 +3360,6 @@ FloatVector GLReplay::InterpretVertex(byte *data, uint32_t vert, MeshDisplay cfg 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) { @@ -3387,12 +3375,12 @@ FloatVector GLReplay::InterpretVertex(byte *data, uint32_t vert, MeshDisplay cfg 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/driver/gl/gl_replay.cpp b/renderdoc/driver/gl/gl_replay.cpp index 98e314eba..3285ec62f 100644 --- a/renderdoc/driver/gl/gl_replay.cpp +++ b/renderdoc/driver/gl/gl_replay.cpp @@ -947,15 +947,13 @@ void GLReplay::SavePipelineState() if(fmt.compCount == eGL_BGRA) { + fmt.compByteWidth = 1; fmt.compCount = 4; - fmt.special = true; - fmt.specialFormat = eSpecial_B8G8R8A8; + fmt.bgraOrder = true; fmt.compType = eCompType_UNorm; if(type == eGL_UNSIGNED_BYTE) { - fmt.specialFormat = eSpecial_B8G8R8A8; - fmt.compType = eCompType_UNorm; fmt.strname = "GL_BGRA8"; } else if(type == eGL_UNSIGNED_INT_2_10_10_10_REV || type == eGL_INT_2_10_10_10_REV) @@ -968,6 +966,8 @@ void GLReplay::SavePipelineState() { RDCERR("Unexpected BGRA type"); } + + // haven't checked the other cases work properly RDCASSERT(type == eGL_UNSIGNED_BYTE); } diff --git a/renderdoc/driver/gl/gl_resources.cpp b/renderdoc/driver/gl/gl_resources.cpp index 2a5453dec..f9cf1f0c4 100644 --- a/renderdoc/driver/gl/gl_resources.cpp +++ b/renderdoc/driver/gl/gl_resources.cpp @@ -33,6 +33,8 @@ size_t GetCompressedByteSize(GLsizei w, GLsizei h, GLsizei d, GLenum internalfor return GetByteSize(w, h, d, GetBaseFormat(internalformat), GetDataType(internalformat)); } + uint32_t astc[2] = { 0, 0 }; + switch(internalformat) { // BC1 @@ -81,10 +83,106 @@ size_t GetCompressedByteSize(GLsizei w, GLsizei h, GLsizei d, GLenum internalfor case eGL_COMPRESSED_RG11_EAC: case eGL_COMPRESSED_SIGNED_RG11_EAC: return (AlignUp4(w) * AlignUp4(h) * d); + case GL_COMPRESSED_RGBA_ASTC_4x4_KHR: + astc[0] = 4; astc[1] = 4; + break; + case GL_COMPRESSED_RGBA_ASTC_5x4_KHR: + astc[0] = 5; astc[1] = 4; + break; + case GL_COMPRESSED_RGBA_ASTC_5x5_KHR: + astc[0] = 5; astc[1] = 5; + break; + case GL_COMPRESSED_RGBA_ASTC_6x5_KHR: + astc[0] = 6; astc[1] = 5; + break; + case GL_COMPRESSED_RGBA_ASTC_6x6_KHR: + astc[0] = 6; astc[1] = 6; + break; + case GL_COMPRESSED_RGBA_ASTC_8x5_KHR: + astc[0] = 8; astc[1] = 5; + break; + case GL_COMPRESSED_RGBA_ASTC_8x6_KHR: + astc[0] = 8; astc[1] = 6; + break; + case GL_COMPRESSED_RGBA_ASTC_8x8_KHR: + astc[0] = 8; astc[1] = 8; + break; + case GL_COMPRESSED_RGBA_ASTC_10x5_KHR: + astc[0] = 10; astc[1] = 5; + break; + case GL_COMPRESSED_RGBA_ASTC_10x6_KHR: + astc[0] = 10; astc[1] = 6; + break; + case GL_COMPRESSED_RGBA_ASTC_10x8_KHR: + astc[0] = 10; astc[1] = 8; + break; + case GL_COMPRESSED_RGBA_ASTC_10x10_KHR: + astc[0] = 10; astc[1] = 10; + break; + case GL_COMPRESSED_RGBA_ASTC_12x10_KHR: + astc[0] = 12; astc[1] = 10; + break; + case GL_COMPRESSED_RGBA_ASTC_12x12_KHR: + astc[0] = 12; astc[1] = 12; + break; + case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR: + astc[0] = 4; astc[1] = 4; + break; + case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR: + astc[0] = 5; astc[1] = 4; + break; + case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR: + astc[0] = 5; astc[1] = 5; + break; + case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR: + astc[0] = 6; astc[1] = 5; + break; + case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR: + astc[0] = 6; astc[1] = 6; + break; + case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR: + astc[0] = 8; astc[1] = 5; + break; + case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR: + astc[0] = 8; astc[1] = 6; + break; + case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR: + astc[0] = 8; astc[1] = 8; + break; + case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR: + astc[0] = 10; astc[1] = 5; + break; + case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR: + astc[0] = 10; astc[1] = 6; + break; + case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR: + astc[0] = 10; astc[1] = 8; + break; + case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR: + astc[0] = 10; astc[1] = 10; + break; + case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR: + astc[0] = 12; astc[1] = 10; + break; + case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR: + astc[0] = 12; astc[1] = 12; + break; default: break; } + if(astc[0] > 0 && astc[1] > 0) + { + uint32_t blocks[2] = { (w / astc[0]), (h / astc[1]) }; + + // how many blocks are needed - including any extra partial blocks + blocks[0] += (w % astc[0]) ? 1 : 0; + blocks[1] += (h % astc[1]) ? 1 : 0; + + // ASTC blocks are all 128 bits each + return blocks[0]*blocks[1]*16*d; + } + RDCERR("Unrecognised compressed format"); return GetByteSize(w, h, d, GetBaseFormat(internalformat), GetDataType(internalformat)); } @@ -686,6 +784,35 @@ bool IsCompressedFormat(GLenum internalFormat) case eGL_COMPRESSED_SIGNED_R11_EAC: case eGL_COMPRESSED_RG11_EAC: case eGL_COMPRESSED_SIGNED_RG11_EAC: + // ASTC + case GL_COMPRESSED_RGBA_ASTC_4x4_KHR: + case GL_COMPRESSED_RGBA_ASTC_5x4_KHR: + case GL_COMPRESSED_RGBA_ASTC_5x5_KHR: + case GL_COMPRESSED_RGBA_ASTC_6x5_KHR: + case GL_COMPRESSED_RGBA_ASTC_6x6_KHR: + case GL_COMPRESSED_RGBA_ASTC_8x5_KHR: + case GL_COMPRESSED_RGBA_ASTC_8x6_KHR: + case GL_COMPRESSED_RGBA_ASTC_8x8_KHR: + case GL_COMPRESSED_RGBA_ASTC_10x5_KHR: + case GL_COMPRESSED_RGBA_ASTC_10x6_KHR: + case GL_COMPRESSED_RGBA_ASTC_10x8_KHR: + case GL_COMPRESSED_RGBA_ASTC_10x10_KHR: + case GL_COMPRESSED_RGBA_ASTC_12x10_KHR: + case GL_COMPRESSED_RGBA_ASTC_12x12_KHR: + case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR: + case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR: + case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR: + case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR: + case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR: + case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR: + case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR: + case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR: + case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR: + case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR: + case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR: + case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR: + case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR: + case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR: return true; default: break; diff --git a/renderdoc/replay/replay_renderer.cpp b/renderdoc/replay/replay_renderer.cpp index bd78a6f2c..383feff26 100644 --- a/renderdoc/replay/replay_renderer.cpp +++ b/renderdoc/replay/replay_renderer.cpp @@ -623,7 +623,8 @@ bool ReplayRenderer::SaveTexture(const TextureSave &saveData, const char *path) // we don't support any file formats that handle these block compression formats if(td.format.specialFormat == eSpecial_ETC2 || - td.format.specialFormat == eSpecial_EAC) + td.format.specialFormat == eSpecial_EAC || + td.format.specialFormat == eSpecial_ASTC) downcast = true; // for DDS don't downcast, for non-HDR always downcast if we're not already RGBA8 unorm @@ -680,19 +681,19 @@ bool ReplayRenderer::SaveTexture(const TextureSave &saveData, const char *path) case eSpecial_R9G9B9E5: case eSpecial_R11G11B10: case eSpecial_D24S8: - case eSpecial_B8G8R8A8: bytesPerPixel = 4; break; - case eSpecial_B5G6R5: - case eSpecial_B5G5R5A1: - case eSpecial_B4G4R4A4: + case eSpecial_R5G6B5: + case eSpecial_R5G5B5A1: + case eSpecial_R4G4B4A4: bytesPerPixel = 2; break; case eSpecial_D32S8: bytesPerPixel = 5; break; + case eSpecial_D16S8: case eSpecial_YUV: - RDCERR("Unsupported file save format"); + RDCERR("Unsupported file format %u", td.format.specialFormat); return false; default: bytesPerPixel = td.format.compCount*td.format.compByteWidth; diff --git a/renderdocui/Code/FormatElement.cs b/renderdocui/Code/FormatElement.cs index 44e93c40c..33b59bcd8 100644 --- a/renderdocui/Code/FormatElement.cs +++ b/renderdocui/Code/FormatElement.cs @@ -109,43 +109,52 @@ namespace renderdocui.Code { var ret = new List(); - if (format.special && format.specialFormat == SpecialFormat.B8G8R8A8) - { - byte b = read.ReadByte(); - byte g = read.ReadByte(); - byte r = read.ReadByte(); - byte a = read.ReadByte(); - - ret.Add((float)r / 255.0f); - ret.Add((float)g / 255.0f); - ret.Add((float)b / 255.0f); - ret.Add((float)a / 255.0f); - } - else if (format.special && format.specialFormat == SpecialFormat.B5G5R5A1) + if (format.special && format.specialFormat == SpecialFormat.R5G5B5A1) { ushort packed = read.ReadUInt16(); - ret.Add((float)((packed >> 10) & 0x1f) / 31.0f); + ret.Add((float)((packed >> 0) & 0x1f) / 31.0f); ret.Add((float)((packed >> 5) & 0x1f) / 31.0f); - ret.Add((float)((packed >> 0) & 0x1f) / 31.0f); + ret.Add((float)((packed >> 10) & 0x1f) / 31.0f); ret.Add(((packed & 0x8000) > 0) ? 1.0f : 0.0f); + + if (format.bgraOrder) + { + object tmp = ret[2]; + ret[2] = ret[0]; + ret[0] = tmp; + } } - else if (format.special && format.specialFormat == SpecialFormat.B5G6R5) + else if (format.special && format.specialFormat == SpecialFormat.R5G6B5) { ushort packed = read.ReadUInt16(); - ret.Add((float)((packed >> 11) & 0x1f) / 31.0f); - ret.Add((float)((packed >> 5) & 0x3f) / 63.0f); ret.Add((float)((packed >> 0) & 0x1f) / 31.0f); + ret.Add((float)((packed >> 5) & 0x3f) / 63.0f); + ret.Add((float)((packed >> 11) & 0x1f) / 31.0f); + + if (format.bgraOrder) + { + object tmp = ret[2]; + ret[2] = ret[0]; + ret[0] = tmp; + } } - else if (format.special && format.specialFormat == SpecialFormat.B4G4R4A4) + else if (format.special && format.specialFormat == SpecialFormat.R4G4B4A4) { ushort packed = read.ReadUInt16(); - ret.Add((float)((packed >> 8) & 0xf) / 15.0f); - ret.Add((float)((packed >> 4) & 0xf) / 15.0f); ret.Add((float)((packed >> 0) & 0xf) / 15.0f); + ret.Add((float)((packed >> 4) & 0xf) / 15.0f); + ret.Add((float)((packed >> 8) & 0xf) / 15.0f); ret.Add((float)((packed >> 12) & 0xf) / 15.0f); + + if (format.bgraOrder) + { + object tmp = ret[2]; + ret[2] = ret[0]; + ret[0] = tmp; + } } else if (format.special && format.specialFormat == SpecialFormat.R10G10B10A2) { @@ -256,6 +265,13 @@ namespace renderdocui.Code } } } + + if (format.bgraOrder) + { + object tmp = ret[2]; + ret[2] = ret[0]; + ret[0] = tmp; + } } return ret.ToArray(); diff --git a/renderdocui/Interop/Enums.cs b/renderdocui/Interop/Enums.cs index 8c9c0da65..34e659d02 100644 --- a/renderdocui/Interop/Enums.cs +++ b/renderdocui/Interop/Enums.cs @@ -172,13 +172,14 @@ namespace renderdoc BC7, ETC2, EAC, + ASTC, R10G10B10A2, R11G11B10, - B5G6R5, - B5G5R5A1, + R5G6B5, + R5G5B5A1, R9G9B9E5, - B8G8R8A8, - B4G4R4A4, + R4G4B4A4, + D16S8, D24S8, D32S8, S8, diff --git a/renderdocui/Interop/FetchInfo.cs b/renderdocui/Interop/FetchInfo.cs index 96aad3687..b9791cdbb 100644 --- a/renderdocui/Interop/FetchInfo.cs +++ b/renderdocui/Interop/FetchInfo.cs @@ -87,6 +87,7 @@ namespace renderdoc compType = FormatComponentType.None; compCount = 0; compByteWidth = 0; + bgraOrder = false; srgbCorrected = false; strname = ""; @@ -101,6 +102,7 @@ namespace renderdoc compType = type; compCount = count; compByteWidth = byteWidth; + bgraOrder = false; srgbCorrected = false; strname = ""; @@ -120,6 +122,7 @@ namespace renderdoc public UInt32 compByteWidth; public FormatComponentType compType; + public bool bgraOrder; public bool srgbCorrected; public override string ToString() @@ -137,6 +140,7 @@ namespace renderdoc hash = hash * 17 + compCount.GetHashCode(); hash = hash * 17 + compByteWidth.GetHashCode(); hash = hash * 17 + compType.GetHashCode(); + hash = hash * 17 + bgraOrder.GetHashCode(); hash = hash * 17 + srgbCorrected.GetHashCode(); return hash; } @@ -148,6 +152,7 @@ namespace renderdoc return x.compCount == y.compCount && x.compByteWidth == y.compByteWidth && x.compType == y.compType && + x.bgraOrder == y.bgraOrder && x.srgbCorrected == y.srgbCorrected; } public static bool operator !=(ResourceFormat x, ResourceFormat y) @@ -379,6 +384,7 @@ namespace renderdoc public UInt32 compCount; public UInt32 compByteWidth; public FormatComponentType compType; + public bool bgraOrder; public SpecialFormat specialFormat; public bool showAlpha; diff --git a/renderdocui/Windows/BufferViewer.cs b/renderdocui/Windows/BufferViewer.cs index b6916c03e..7fec1e58f 100644 --- a/renderdocui/Windows/BufferViewer.cs +++ b/renderdocui/Windows/BufferViewer.cs @@ -2550,6 +2550,7 @@ namespace renderdocui.Windows m_MeshDisplay.position.compCount = pos.format.compCount; m_MeshDisplay.position.compByteWidth = pos.format.compByteWidth; m_MeshDisplay.position.compType = pos.format.compType; + m_MeshDisplay.position.bgraOrder = pos.format.bgraOrder; m_MeshDisplay.position.specialFormat = pos.format.special ? pos.format.specialFormat : SpecialFormat.Unknown; m_MeshDisplay.position.showAlpha = false; @@ -2622,6 +2623,7 @@ namespace renderdocui.Windows m_MeshDisplay.secondary.compCount = 0; m_MeshDisplay.secondary.compByteWidth = 0; m_MeshDisplay.secondary.compType = FormatComponentType.None; + m_MeshDisplay.secondary.bgraOrder = false; m_MeshDisplay.secondary.specialFormat = SpecialFormat.Unknown; m_MeshDisplay.secondary.showAlpha = false; @@ -2638,6 +2640,7 @@ namespace renderdocui.Windows m_MeshDisplay.secondary.compCount = tex.format.compCount; m_MeshDisplay.secondary.compByteWidth = tex.format.compByteWidth; m_MeshDisplay.secondary.compType = tex.format.compType; + m_MeshDisplay.secondary.bgraOrder = tex.format.bgraOrder; m_MeshDisplay.secondary.specialFormat = tex.format.special ? tex.format.specialFormat : SpecialFormat.Unknown; m_MeshDisplay.secondary.showAlpha = CurSecondShowAlpha; diff --git a/renderdocui/Windows/PipelineState/GLPipelineStateViewer.cs b/renderdocui/Windows/PipelineState/GLPipelineStateViewer.cs index aaece517f..89fe0db96 100644 --- a/renderdocui/Windows/PipelineState/GLPipelineStateViewer.cs +++ b/renderdocui/Windows/PipelineState/GLPipelineStateViewer.cs @@ -325,7 +325,8 @@ namespace renderdocui.Windows.PipelineState typename = texs[t].resType.Str(); if (texs[t].format.special && - (texs[t].format.specialFormat == SpecialFormat.D24S8 || + (texs[t].format.specialFormat == SpecialFormat.D16S8 || + texs[t].format.specialFormat == SpecialFormat.D24S8 || texs[t].format.specialFormat == SpecialFormat.D32S8) ) { diff --git a/renderdocui/Windows/PixelHistoryView.cs b/renderdocui/Windows/PixelHistoryView.cs index 5cd71f2e7..8803d3534 100644 --- a/renderdocui/Windows/PixelHistoryView.cs +++ b/renderdocui/Windows/PixelHistoryView.cs @@ -257,6 +257,7 @@ namespace renderdocui.Windows bool depth = false; if (texture.format.compType == FormatComponentType.Depth || + (texture.format.special && texture.format.specialFormat == SpecialFormat.D16S8) || (texture.format.special && texture.format.specialFormat == SpecialFormat.D24S8) || (texture.format.special && texture.format.specialFormat == SpecialFormat.D32S8) || (texture.format.special && texture.format.specialFormat == SpecialFormat.S8))