Refactor BGRA formats to not be special (so allow any BGRA format)

* Also add ASTC and D16S8 types while in the neighbourhood
This commit is contained in:
baldurk committed 2015-11-29 22:05:26 +01:00
1 parent 7ef19b8ae1
commit 8b7a025853
20 files changed
+512 -309

No files matched your search

+1
View File
@@ -42,6 +42,7 @@ struct MeshFormat
uint32_t compCount;
uint32_t compByteWidth;
FormatComponentType compType;
bool32 bgraOrder;
SpecialFormat specialFormat;
bool showAlpha;
+3
View File
@@ -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;
};
+5 -4
View File
@@ -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,
+48 -27
View File
@@ -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;
+13 -12
View File
@@ -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)
+199 -186
View File
@@ -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
+3 -15
View File
@@ -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;
}
+1 -6
View File
@@ -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;
+4 -2
View File
@@ -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:
+40 -6
View File
@@ -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
{
+3 -15
View File
@@ -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;
}
+4 -4
View File
@@ -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);
}
+127
View File
@@ -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;
+7 -6
View File
@@ -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;
+37 -21
View File
@@ -109,43 +109,52 @@ namespace renderdocui.Code
{
var ret = new List<object>();
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();
+5 -4
View File
@@ -172,13 +172,14 @@ namespace renderdoc
BC7,
ETC2,
EAC,
ASTC,
R10G10B10A2,
R11G11B10,
B5G6R5,
B5G5R5A1,
R5G6B5,
R5G5B5A1,
R9G9B9E5,
B8G8R8A8,
B4G4R4A4,
R4G4B4A4,
D16S8,
D24S8,
D32S8,
S8,
+6
View File
@@ -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;
+3
View File
@@ -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;
@@ -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)
)
{
+1
View File
@@ -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))