Added mapping for uncompressed formats to KRTextureKTX::getFormat

KRTexture2D now dynamically sets vkFormat of images
This commit is contained in:
2023-01-10 15:49:10 -08:00
parent dae67fd30c
commit ea0fff0e49
2 changed files with 116 additions and 10 deletions

View File

@@ -77,7 +77,7 @@ bool KRTexture2D::createGPUTexture(int lod_max_dim)
viewInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO; viewInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
viewInfo.image = texture.image; viewInfo.image = texture.image;
viewInfo.viewType = VK_IMAGE_VIEW_TYPE_2D; viewInfo.viewType = VK_IMAGE_VIEW_TYPE_2D;
viewInfo.format = VK_FORMAT_R8G8B8A8_SRGB; viewInfo.format = getFormat();
viewInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; viewInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
viewInfo.subresourceRange.baseMipLevel = 0; viewInfo.subresourceRange.baseMipLevel = 0;
viewInfo.subresourceRange.levelCount = 1; viewInfo.subresourceRange.levelCount = 1;

View File

@@ -137,34 +137,140 @@ int KRTextureKTX::getFaceCount() const
VkFormat KRTextureKTX::getFormat() const VkFormat KRTextureKTX::getFormat() const
{ {
/*
if (m_header.glFormat != 0) { if (m_header.glFormat != 0) {
// Non-Compressed formats, from table 8.3 of OpenGL 4.4 spec: // Non-Compressed formats, from table 8.3 of OpenGL 4.4 spec:
switch (m_header.glFormat) { switch (m_header.glFormat) {
case 0x1901: // GL_STENCIL_INDEX case 0x1901: // GL_STENCIL_INDEX
case 0x1902: // GL_DEPTH_COMPONENT case 0x1902: // GL_DEPTH_COMPONENT
case 0x84F9: // GL_DEPTH_STENCIL case 0x84F9: // GL_DEPTH_STENCIL
return VK_FORMAT_UNDEFINED;
case 0x1903: // GL_RED case 0x1903: // GL_RED
case 0x1904: // GL_GREEN case 0x1904: // GL_GREEN
case 0x1905: // GL_BLUE case 0x1905: // GL_BLUE
case 0x8227: // GL_RG
case 0x1907: // GL_RGB
case 0x1908: // GL_RGBA
case 0x80E0: // GL_BGR
case 0x80E1: // GL_BGRA
case 0x8D94: // GL_RED_INTEGER case 0x8D94: // GL_RED_INTEGER
case 0x8D95: // GL_GREEN_INTEGER case 0x8D95: // GL_GREEN_INTEGER
case 0x8D96: // GL_BLUE_INTEGER case 0x8D96: // GL_BLUE_INTEGER
// Types applicable to a single component from table 8.2 of OpenGL 4.4 spec
switch (m_header.glType) {
case 0x1401: // UNSIGNED_BYTE
return VK_FORMAT_R8_UNORM;
case 0x1400: // BYTE
return VK_FORMAT_R8_SNORM;
case 0x1403: // UNSIGNED_SHORT
return VK_FORMAT_R16_UNORM;
case 0x1402: // SHORT
return VK_FORMAT_R16_SNORM;
case 0x1405: // UNSIGNED_INT
return VK_FORMAT_R32_UINT;
case 0x1404: // INT
return VK_FORMAT_R32_SINT;
case 0x140B: // HALF_FLOAT
return VK_FORMAT_R16_SFLOAT;
case 0x1406: // FLOAT
return VK_FORMAT_R32_SFLOAT;
default:
return VK_FORMAT_UNDEFINED;
}
case 0x8227: // GL_RG
case 0x8228: // GL_RG_INTEGER case 0x8228: // GL_RG_INTEGER
// Types applicable to two components from table 8.2 of OpenGL 4.4 spec
switch (m_header.glType) {
case 0x1401: // UNSIGNED_BYTE
return VK_FORMAT_R8G8_UNORM;
case 0x1400: // BYTE
return VK_FORMAT_R8G8_SNORM;
case 0x1403: // UNSIGNED_SHORT
return VK_FORMAT_R16G16_UNORM;
case 0x1402: // SHORT
return VK_FORMAT_R16G16_SNORM;
case 0x1405: // UNSIGNED_INT
return VK_FORMAT_R32G32_UINT;
case 0x1404: // INT
return VK_FORMAT_R32G32_SINT;
case 0x140B: // HALF_FLOAT
return VK_FORMAT_R16G16_SFLOAT;
case 0x1406: // FLOAT
return VK_FORMAT_R32G32_SFLOAT;
default:
return VK_FORMAT_UNDEFINED;
}
case 0x1907: // GL_RGB
case 0x80E0: // GL_BGR
case 0x8D98: // GL_RGB_INTEGER case 0x8D98: // GL_RGB_INTEGER
case 0x8D99: // GL_RGBA_INTEGER
case 0x8D9A: // GL_BGR_INTEGER case 0x8D9A: // GL_BGR_INTEGER
case 0x8D99: // GL_BGRA_INTEGER // Types applicable to three components from table 8.2 of OpenGL 4.4 spec
switch (m_header.glType) {
case 0x1401: // UNSIGNED_BYTE
return VK_FORMAT_R8G8B8_UNORM;
case 0x1400: // BYTE
return VK_FORMAT_R8G8B8_SNORM;
case 0x1403: // UNSIGNED_SHORT
return VK_FORMAT_R16G16B16_UNORM;
case 0x1402: // SHORT
return VK_FORMAT_R16G16B16_SNORM;
case 0x1405: // UNSIGNED_INT
return VK_FORMAT_R32G32B32_UINT;
case 0x1404: // INT
return VK_FORMAT_R32G32B32_SINT;
case 0x140B: // HALF_FLOAT
return VK_FORMAT_R16G16B16_SFLOAT;
case 0x1406: // FLOAT
return VK_FORMAT_R32G32B32_SFLOAT;
// UNSIGNED_BYTE_3_3_2 not supported
// UNSIGNED_BYTE_2_3_3_REV not supported
case 0x8363: // UNSIGNED_SHORT_5_6_5 ushort
return VK_FORMAT_R5G6B5_UNORM_PACK16;
case 0x8364: // UNSIGNED_SHORT_5_6_5_REV
return VK_FORMAT_B5G6R5_UNORM_PACK16;
case 0x8C3B: // UNSIGNED_INT_10F_11F_11F_REV
return VK_FORMAT_B10G11R11_UFLOAT_PACK32;
default:
return VK_FORMAT_UNDEFINED;
}
case 0x1908: // GL_RGBA
case 0x80E1: // GL_BGRA
case 0x8D99: // GL_RGBA_INTEGER
case 0x8D9B: // GL_BGRA_INTEGER
// Types applicable to three components from table 8.2 of OpenGL 4.4 spec
switch (m_header.glType) {
case 0x1401: // UNSIGNED_BYTE
return VK_FORMAT_R8G8B8A8_UNORM;
case 0x1400: // BYTE
return VK_FORMAT_R8G8B8A8_SNORM;
case 0x1403: // UNSIGNED_SHORT
return VK_FORMAT_R16G16B16A16_UNORM;
case 0x1402: // SHORT
return VK_FORMAT_R16G16B16A16_SNORM;
case 0x1405: // UNSIGNED_INT
return VK_FORMAT_R32G32B32A32_UINT;
case 0x1404: // INT
return VK_FORMAT_R32G32B32A32_SINT;
case 0x140B: // HALF_FLOAT
return VK_FORMAT_R16G16B16A16_SFLOAT;
case 0x1406: // FLOAT
return VK_FORMAT_R32G32B32A32_SFLOAT;
case 0x8033: // UNSIGNED_SHORT_4_4_4_4
case 0x8365: // UNSIGNED_SHORT_4_4_4_4_REV
return VK_FORMAT_R4G4B4A4_UNORM_PACK16;
case 0x8034: // UNSIGNED_SHORT_5_5_5_1
return VK_FORMAT_R5G5B5A1_UNORM_PACK16;
case 0x8366: // UNSIGNED_SHORT_1_5_5_5_REV
return VK_FORMAT_A1R5G5B5_UNORM_PACK16;
case 0x8035: // UNSIGNED_INT_8_8_8_8 uint
return VK_FORMAT_R8G8B8A8_UINT;
case 0x8367: // UNSIGNED_INT_8_8_8_8_REV
return VK_FORMAT_A8B8G8R8_UINT_PACK32;
// UNSIGNED_INT_10_10_10_2 not supported
case 0x8368: // UNSIGNED_INT_2_10_10_10_REV
return VK_FORMAT_A2R10G10B10_UINT_PACK32;
// UNSIGNED_INT_5_9_9_9_REV not supported
default:
return VK_FORMAT_UNDEFINED;
}
default: default:
return VK_FORMAT_UNDEFINED; return VK_FORMAT_UNDEFINED;
} }
} }
*/
// Uncompressed formats // Uncompressed formats
switch (m_header.glInternalFormat) { switch (m_header.glInternalFormat) {