Fixes for vulkan for BGRA changes, add R4G4 special format

This commit is contained in:
baldurk
2016-02-07 18:49:21 +01:00
parent f8df435826
commit 4b7c33d531
7 changed files with 111 additions and 90 deletions
+1
View File
@@ -193,6 +193,7 @@ enum SpecialFormat
eSpecial_R5G5B5A1,
eSpecial_R9G9B9E5,
eSpecial_R4G4B4A4,
eSpecial_R4G4,
eSpecial_D16S8,
eSpecial_D24S8,
eSpecial_D32S8,
+3
View File
@@ -517,6 +517,7 @@ DXGI_FORMAT ResourceFormat2DXGIFormat(ResourceFormat format)
case eSpecial_S8:
return DXGI_FORMAT_R8_UINT;
default:
case eSpecial_R4G4:
case eSpecial_D16S8:
case eSpecial_ETC2:
case eSpecial_EAC:
@@ -776,6 +777,7 @@ bool write_dds_to_file(FILE *f, const dds_data &data)
break;
case eSpecial_D16S8:
case eSpecial_YUV:
case eSpecial_R4G4:
RDCERR("Unsupported file format %u", data.format.specialFormat);
return false;
default:
@@ -1048,6 +1050,7 @@ dds_data load_dds_from_file(FILE *f)
break;
case eSpecial_D16S8:
case eSpecial_YUV:
case eSpecial_R4G4:
RDCERR("Unsupported file format %u", ret.format.specialFormat);
return error;
default:
+101 -69
View File
@@ -93,13 +93,16 @@ ResourceFormat MakeResourceFormat(VkFormat fmt)
return ret;
}
// VKTODOMED R4G4, R4G4B4A4, and refactor BGRA formats
switch(fmt)
{
case VK_FORMAT_R4G4_UNORM_PACK8:
ret.special = true;
ret.specialFormat = eSpecial_R4G4;
break;
case VK_FORMAT_R4G4B4A4_UNORM_PACK16:
case VK_FORMAT_B4G4R4A4_UNORM_PACK16:
ret.special = true;
ret.specialFormat = eSpecial_B4G4R4A4;
ret.specialFormat = eSpecial_R4G4B4A4;
break;
case VK_FORMAT_A2B10G10R10_UNORM_PACK32:
case VK_FORMAT_A2B10G10R10_SNORM_PACK32:
@@ -118,6 +121,17 @@ ResourceFormat MakeResourceFormat(VkFormat fmt)
ret.special = true;
ret.specialFormat = eSpecial_R9G9B9E5;
break;
case VK_FORMAT_R5G6B5_UNORM_PACK16:
case VK_FORMAT_B5G6R5_UNORM_PACK16:
ret.special = true;
ret.specialFormat = eSpecial_R5G6B5;
break;
case VK_FORMAT_R5G5B5A1_UNORM_PACK16:
case VK_FORMAT_B5G5R5A1_UNORM_PACK16:
case VK_FORMAT_A1R5G5B5_UNORM_PACK16:
ret.special = true;
ret.specialFormat = eSpecial_R5G5B5A1;
break;
case VK_FORMAT_D16_UNORM_S8_UINT:
ret.special = true;
ret.specialFormat = eSpecial_D16S8;
@@ -214,6 +228,16 @@ ResourceFormat MakeResourceFormat(VkFormat fmt)
ret.special = true;
ret.specialFormat = eSpecial_ASTC;
break;
default:
break;
}
switch(fmt)
{
case VK_FORMAT_B4G4R4A4_UNORM_PACK16:
case VK_FORMAT_B5G6R5_UNORM_PACK16:
case VK_FORMAT_B5G5R5A1_UNORM_PACK16:
case VK_FORMAT_A1R5G5B5_UNORM_PACK16:
case VK_FORMAT_B8G8R8A8_UNORM:
case VK_FORMAT_B8G8R8A8_SNORM:
case VK_FORMAT_B8G8R8A8_USCALED:
@@ -221,8 +245,13 @@ ResourceFormat MakeResourceFormat(VkFormat fmt)
case VK_FORMAT_B8G8R8A8_UINT:
case VK_FORMAT_B8G8R8A8_SINT:
case VK_FORMAT_B8G8R8A8_SRGB:
ret.special = true;
ret.specialFormat = eSpecial_B8G8R8A8;
case VK_FORMAT_A2B10G10R10_UNORM_PACK32:
case VK_FORMAT_A2B10G10R10_SNORM_PACK32:
case VK_FORMAT_A2B10G10R10_USCALED_PACK32:
case VK_FORMAT_A2B10G10R10_SSCALED_PACK32:
case VK_FORMAT_A2B10G10R10_UINT_PACK32:
case VK_FORMAT_A2B10G10R10_SINT_PACK32:
ret.bgraOrder = true;
break;
default:
break;
@@ -773,48 +802,35 @@ VkFormat MakeVkFormat(ResourceFormat fmt)
}
case eSpecial_R10G10B10A2:
if(fmt.compType == eCompType_UNorm)
ret = VK_FORMAT_A2R10G10B10_UNORM_PACK32;
ret = fmt.bgraOrder ? VK_FORMAT_A2B10G10R10_UNORM_PACK32 : VK_FORMAT_A2R10G10B10_UNORM_PACK32;
else if(fmt.compType == eCompType_UInt)
ret = VK_FORMAT_A2R10G10B10_UINT_PACK32;
ret = fmt.bgraOrder ? VK_FORMAT_A2B10G10R10_UINT_PACK32 : VK_FORMAT_A2R10G10B10_UINT_PACK32;
else if(fmt.compType == eCompType_UScaled)
ret = VK_FORMAT_A2R10G10B10_USCALED_PACK32;
ret = fmt.bgraOrder ? VK_FORMAT_A2B10G10R10_USCALED_PACK32 : VK_FORMAT_A2R10G10B10_USCALED_PACK32;
else if(fmt.compType == eCompType_SNorm)
ret = VK_FORMAT_A2R10G10B10_SNORM_PACK32;
ret = fmt.bgraOrder ? VK_FORMAT_A2B10G10R10_SNORM_PACK32 : VK_FORMAT_A2R10G10B10_SNORM_PACK32;
else if(fmt.compType == eCompType_SInt)
ret = VK_FORMAT_A2R10G10B10_SINT_PACK32;
ret = fmt.bgraOrder ? VK_FORMAT_A2B10G10R10_SINT_PACK32 : VK_FORMAT_A2R10G10B10_SINT_PACK32;
else if(fmt.compType == eCompType_SScaled)
ret = VK_FORMAT_A2R10G10B10_SSCALED_PACK32;
ret = fmt.bgraOrder ? VK_FORMAT_A2B10G10R10_SSCALED_PACK32 : VK_FORMAT_A2R10G10B10_SSCALED_PACK32;
break;
case eSpecial_R11G11B10:
ret = VK_FORMAT_B10G11R11_UFLOAT_PACK32;
break;
case eSpecial_B5G6R5:
case eSpecial_R5G6B5:
ret = VK_FORMAT_B5G6R5_UNORM_PACK16;
break;
case eSpecial_B5G5R5A1:
ret = VK_FORMAT_B5G5R5A1_UNORM_PACK16;
case eSpecial_R5G5B5A1:
ret = fmt.bgraOrder ? VK_FORMAT_B5G5R5A1_UNORM_PACK16 : VK_FORMAT_B5G5R5A1_UNORM_PACK16;
break;
case eSpecial_R9G9B9E5:
ret = VK_FORMAT_E5B9G9R9_UFLOAT_PACK32;
break;
case eSpecial_B8G8R8A8:
if(fmt.srgbCorrected)
ret = VK_FORMAT_B8G8R8A8_SRGB;
else if(fmt.compType == eCompType_UNorm)
ret = VK_FORMAT_B8G8R8A8_UNORM;
else if(fmt.compType == eCompType_UInt)
ret = VK_FORMAT_B8G8R8A8_UINT;
else if(fmt.compType == eCompType_UScaled)
ret = VK_FORMAT_B8G8R8A8_USCALED;
else if(fmt.compType == eCompType_SNorm)
ret = VK_FORMAT_B8G8R8A8_SNORM;
else if(fmt.compType == eCompType_SInt)
ret = VK_FORMAT_B8G8R8A8_SINT;
else if(fmt.compType == eCompType_SScaled)
ret = VK_FORMAT_B8G8R8A8_SSCALED;
case eSpecial_R4G4B4A4:
ret = fmt.bgraOrder ? VK_FORMAT_R4G4B4A4_UNORM_PACK16 : VK_FORMAT_B4G4R4A4_UNORM_PACK16;
break;
case eSpecial_B4G4R4A4:
ret = VK_FORMAT_B4G4R4A4_UNORM_PACK16;
case eSpecial_R4G4:
ret = VK_FORMAT_R4G4_UNORM_PACK8;
break;
case eSpecial_D24S8:
ret = VK_FORMAT_D24_UNORM_S8_UINT;
@@ -831,7 +847,7 @@ VkFormat MakeVkFormat(ResourceFormat fmt)
{
if(fmt.srgbCorrected)
{
ret = VK_FORMAT_R8G8B8A8_SRGB;
ret = fmt.bgraOrder ? VK_FORMAT_B8G8R8A8_SRGB : VK_FORMAT_R8G8B8A8_SRGB;
}
else if(fmt.compByteWidth == 4)
{
@@ -842,19 +858,23 @@ VkFormat MakeVkFormat(ResourceFormat fmt)
}
else if(fmt.compByteWidth == 2)
{
if(fmt.compType == eCompType_Float) ret = VK_FORMAT_R16G16B16A16_SFLOAT;
else if(fmt.compType == eCompType_SInt) ret = VK_FORMAT_R16G16B16A16_SINT;
else if(fmt.compType == eCompType_UInt) ret = VK_FORMAT_R16G16B16A16_UINT;
else if(fmt.compType == eCompType_SNorm) ret = VK_FORMAT_R16G16B16A16_SNORM;
else if(fmt.compType == eCompType_UNorm) ret = VK_FORMAT_R16G16B16A16_UNORM;
if(fmt.compType == eCompType_Float) ret = VK_FORMAT_R16G16B16A16_SFLOAT;
else if(fmt.compType == eCompType_SInt) ret = VK_FORMAT_R16G16B16A16_SINT;
else if(fmt.compType == eCompType_UInt) ret = VK_FORMAT_R16G16B16A16_UINT;
else if(fmt.compType == eCompType_SNorm) ret = VK_FORMAT_R16G16B16A16_SNORM;
else if(fmt.compType == eCompType_UNorm) ret = VK_FORMAT_R16G16B16A16_UNORM;
else if(fmt.compType == eCompType_SScaled) ret = VK_FORMAT_R16G16B16A16_SSCALED;
else if(fmt.compType == eCompType_UScaled) ret = VK_FORMAT_R16G16B16A16_USCALED;
else RDCERR("Unrecognised component type");
}
else if(fmt.compByteWidth == 1)
{
if(fmt.compType == eCompType_SInt) ret = VK_FORMAT_R8G8B8A8_SINT;
else if(fmt.compType == eCompType_UInt) ret = VK_FORMAT_R8G8B8A8_UINT;
else if(fmt.compType == eCompType_SNorm) ret = VK_FORMAT_R8G8B8A8_SNORM;
else if(fmt.compType == eCompType_UNorm) ret = VK_FORMAT_R8G8B8A8_UNORM;
if(fmt.compType == eCompType_SInt) ret = fmt.bgraOrder ? VK_FORMAT_B8G8R8A8_SINT : VK_FORMAT_R8G8B8A8_SINT;
else if(fmt.compType == eCompType_UInt) ret = fmt.bgraOrder ? VK_FORMAT_B8G8R8A8_UINT : VK_FORMAT_R8G8B8A8_UINT;
else if(fmt.compType == eCompType_SNorm) ret = fmt.bgraOrder ? VK_FORMAT_B8G8R8A8_SNORM : VK_FORMAT_R8G8B8A8_SNORM;
else if(fmt.compType == eCompType_UNorm) ret = fmt.bgraOrder ? VK_FORMAT_B8G8R8A8_UNORM : VK_FORMAT_R8G8B8A8_UNORM;
else if(fmt.compType == eCompType_SScaled) ret = fmt.bgraOrder ? VK_FORMAT_B8G8R8A8_SSCALED : VK_FORMAT_R8G8B8A8_SSCALED;
else if(fmt.compType == eCompType_UScaled) ret = fmt.bgraOrder ? VK_FORMAT_B8G8R8A8_USCALED : VK_FORMAT_R8G8B8A8_USCALED;
else RDCERR("Unrecognised component type");
}
else
@@ -877,19 +897,23 @@ VkFormat MakeVkFormat(ResourceFormat fmt)
}
else if(fmt.compByteWidth == 2)
{
if(fmt.compType == eCompType_Float) ret = VK_FORMAT_R16G16B16_SFLOAT;
else if(fmt.compType == eCompType_SInt) ret = VK_FORMAT_R16G16B16_SINT;
else if(fmt.compType == eCompType_UInt) ret = VK_FORMAT_R16G16B16_UINT;
else if(fmt.compType == eCompType_SNorm) ret = VK_FORMAT_R16G16B16_SNORM;
else if(fmt.compType == eCompType_UNorm) ret = VK_FORMAT_R16G16B16_UNORM;
if(fmt.compType == eCompType_Float) ret = VK_FORMAT_R16G16B16_SFLOAT;
else if(fmt.compType == eCompType_SInt) ret = VK_FORMAT_R16G16B16_SINT;
else if(fmt.compType == eCompType_UInt) ret = VK_FORMAT_R16G16B16_UINT;
else if(fmt.compType == eCompType_SNorm) ret = VK_FORMAT_R16G16B16_SNORM;
else if(fmt.compType == eCompType_UNorm) ret = VK_FORMAT_R16G16B16_UNORM;
else if(fmt.compType == eCompType_SScaled) ret = VK_FORMAT_R16G16B16_SSCALED;
else if(fmt.compType == eCompType_UScaled) ret = VK_FORMAT_R16G16B16_USCALED;
else RDCERR("Unrecognised component type");
}
else if(fmt.compByteWidth == 1)
{
if(fmt.compType == eCompType_SInt) ret = VK_FORMAT_R8G8B8_SINT;
else if(fmt.compType == eCompType_UInt) ret = VK_FORMAT_R8G8B8_UINT;
else if(fmt.compType == eCompType_SNorm) ret = VK_FORMAT_R8G8B8_SNORM;
else if(fmt.compType == eCompType_UNorm) ret = VK_FORMAT_R8G8B8_UNORM;
if(fmt.compType == eCompType_SInt) ret = VK_FORMAT_R8G8B8_SINT;
else if(fmt.compType == eCompType_UInt) ret = VK_FORMAT_R8G8B8_UINT;
else if(fmt.compType == eCompType_SNorm) ret = VK_FORMAT_R8G8B8_SNORM;
else if(fmt.compType == eCompType_UNorm) ret = VK_FORMAT_R8G8B8_UNORM;
else if(fmt.compType == eCompType_SScaled) ret = VK_FORMAT_R8G8B8_SSCALED;
else if(fmt.compType == eCompType_UScaled) ret = VK_FORMAT_R8G8B8_USCALED;
else RDCERR("Unrecognised component type");
}
else
@@ -908,19 +932,23 @@ VkFormat MakeVkFormat(ResourceFormat fmt)
}
else if(fmt.compByteWidth == 2)
{
if(fmt.compType == eCompType_Float) ret = VK_FORMAT_R16G16_SFLOAT;
else if(fmt.compType == eCompType_SInt) ret = VK_FORMAT_R16G16_SINT;
else if(fmt.compType == eCompType_UInt) ret = VK_FORMAT_R16G16_UINT;
else if(fmt.compType == eCompType_SNorm) ret = VK_FORMAT_R16G16_SNORM;
else if(fmt.compType == eCompType_UNorm) ret = VK_FORMAT_R16G16_UNORM;
if(fmt.compType == eCompType_Float) ret = VK_FORMAT_R16G16_SFLOAT;
else if(fmt.compType == eCompType_SInt) ret = VK_FORMAT_R16G16_SINT;
else if(fmt.compType == eCompType_UInt) ret = VK_FORMAT_R16G16_UINT;
else if(fmt.compType == eCompType_SNorm) ret = VK_FORMAT_R16G16_SNORM;
else if(fmt.compType == eCompType_UNorm) ret = VK_FORMAT_R16G16_UNORM;
else if(fmt.compType == eCompType_SScaled) ret = VK_FORMAT_R16G16_SSCALED;
else if(fmt.compType == eCompType_UScaled) ret = VK_FORMAT_R16G16_USCALED;
else RDCERR("Unrecognised component type");
}
else if(fmt.compByteWidth == 1)
{
if(fmt.compType == eCompType_SInt) ret = VK_FORMAT_R8G8_SINT;
else if(fmt.compType == eCompType_UInt) ret = VK_FORMAT_R8G8_UINT;
else if(fmt.compType == eCompType_SNorm) ret = VK_FORMAT_R8G8_SNORM;
else if(fmt.compType == eCompType_UNorm) ret = VK_FORMAT_R8G8_UNORM;
if(fmt.compType == eCompType_SInt) ret = VK_FORMAT_R8G8_SINT;
else if(fmt.compType == eCompType_UInt) ret = VK_FORMAT_R8G8_UINT;
else if(fmt.compType == eCompType_SNorm) ret = VK_FORMAT_R8G8_SNORM;
else if(fmt.compType == eCompType_UNorm) ret = VK_FORMAT_R8G8_UNORM;
else if(fmt.compType == eCompType_SScaled) ret = VK_FORMAT_R8G8_SSCALED;
else if(fmt.compType == eCompType_UScaled) ret = VK_FORMAT_R8G8_USCALED;
else RDCERR("Unrecognised component type");
}
else
@@ -940,20 +968,24 @@ VkFormat MakeVkFormat(ResourceFormat fmt)
}
else if(fmt.compByteWidth == 2)
{
if(fmt.compType == eCompType_Float) ret = VK_FORMAT_R16_SFLOAT;
else if(fmt.compType == eCompType_SInt) ret = VK_FORMAT_R16_SINT;
else if(fmt.compType == eCompType_UInt) ret = VK_FORMAT_R16_UINT;
else if(fmt.compType == eCompType_SNorm) ret = VK_FORMAT_R16_SNORM;
else if(fmt.compType == eCompType_UNorm) ret = VK_FORMAT_R16_UNORM;
else if(fmt.compType == eCompType_Depth) ret = VK_FORMAT_D16_UNORM;
if(fmt.compType == eCompType_Float) ret = VK_FORMAT_R16_SFLOAT;
else if(fmt.compType == eCompType_SInt) ret = VK_FORMAT_R16_SINT;
else if(fmt.compType == eCompType_UInt) ret = VK_FORMAT_R16_UINT;
else if(fmt.compType == eCompType_SNorm) ret = VK_FORMAT_R16_SNORM;
else if(fmt.compType == eCompType_UNorm) ret = VK_FORMAT_R16_UNORM;
else if(fmt.compType == eCompType_Depth) ret = VK_FORMAT_D16_UNORM;
else if(fmt.compType == eCompType_UScaled) ret = VK_FORMAT_R16_USCALED;
else if(fmt.compType == eCompType_SScaled) ret = VK_FORMAT_R16_SSCALED;
else RDCERR("Unrecognised component type");
}
else if(fmt.compByteWidth == 1)
{
if(fmt.compType == eCompType_SInt) ret = VK_FORMAT_R8_SINT;
else if(fmt.compType == eCompType_UInt) ret = VK_FORMAT_R8_UINT;
else if(fmt.compType == eCompType_SNorm) ret = VK_FORMAT_R8_SNORM;
else if(fmt.compType == eCompType_UNorm) ret = VK_FORMAT_R8_UNORM;
if(fmt.compType == eCompType_SInt) ret = VK_FORMAT_R8_SINT;
else if(fmt.compType == eCompType_UInt) ret = VK_FORMAT_R8_UINT;
else if(fmt.compType == eCompType_SNorm) ret = VK_FORMAT_R8_SNORM;
else if(fmt.compType == eCompType_UNorm) ret = VK_FORMAT_R8_UNORM;
else if(fmt.compType == eCompType_UScaled) ret = VK_FORMAT_R8_USCALED;
else if(fmt.compType == eCompType_SScaled) ret = VK_FORMAT_R8_SSCALED;
else RDCERR("Unrecognised component type");
}
else
+1 -6
View File
@@ -879,18 +879,13 @@ bool WrappedVulkan::EndFrameCapture(void *dev, void *wnd)
uint32_t stride = fmt.compByteWidth*fmt.compCount;
bool buf1010102 = false;
bool bufBGRA = false;
bool bufBGRA = (fmt.bgraOrder != false);
if(fmt.special && fmt.specialFormat == eSpecial_R10G10B10A2)
{
stride = 4;
buf1010102 = true;
}
if(fmt.special && fmt.specialFormat == eSpecial_B8G8R8A8)
{
stride = 4;
bufBGRA = true;
}
byte *dst = thpixels;
+3 -15
View File
@@ -1381,18 +1381,6 @@ FloatVector VulkanReplay::InterpretVertex(byte *data, uint32_t vert, MeshDisplay
ret.z = v.z;
return ret;
}
else if(cfg.position.specialFormat == eSpecial_B8G8R8A8)
{
if(data+4 >= end)
{
valid = false;
return ret;
}
fmt.compByteWidth = 1;
fmt.compCount = 4;
fmt.compType = eCompType_UNorm;
}
if(data + cfg.position.compCount*cfg.position.compByteWidth > end)
{
@@ -1408,12 +1396,12 @@ FloatVector VulkanReplay::InterpretVertex(byte *data, uint32_t vert, MeshDisplay
out++;
}
if(cfg.position.specialFormat == eSpecial_B8G8R8A8)
if(cfg.position.bgraOrder)
{
FloatVector reversed;
reversed.x = ret.x;
reversed.x = ret.z;
reversed.y = ret.y;
reversed.z = ret.z;
reversed.z = ret.x;
reversed.w = ret.w;
return reversed;
}
+1
View File
@@ -706,6 +706,7 @@ bool ReplayRenderer::SaveTexture(const TextureSave &saveData, const char *path)
break;
case eSpecial_D16S8:
case eSpecial_YUV:
case eSpecial_R4G4:
RDCERR("Unsupported file format %u", td.format.specialFormat);
return false;
default:
+1
View File
@@ -193,6 +193,7 @@ namespace renderdoc
R5G5B5A1,
R9G9B9E5,
R4G4B4A4,
R4G4,
D16S8,
D24S8,
D32S8,