mirror of
https://github.com/MobileGL-Dev/MobileGL
synced 2026-09-12 06:08:30 +09:00
[Fix] (DirectVulkan): map RGB10_A2(UI) to A2B10G10R10 - GL 2_10_10_10_REV puts R in bits 0-9 so the A2R10G10B10 mapping silently swapped R/B on upload; also decode both 1010102 variants in readback
This commit is contained in:
@@ -1951,6 +1951,8 @@ void main() {
|
|||||||
// --- packed / special ---
|
// --- packed / special ---
|
||||||
case VK_FORMAT_A2B10G10R10_UNORM_PACK32:
|
case VK_FORMAT_A2B10G10R10_UNORM_PACK32:
|
||||||
case VK_FORMAT_A2B10G10R10_UINT_PACK32:
|
case VK_FORMAT_A2B10G10R10_UINT_PACK32:
|
||||||
|
case VK_FORMAT_A2R10G10B10_UNORM_PACK32:
|
||||||
|
case VK_FORMAT_A2R10G10B10_UINT_PACK32:
|
||||||
case VK_FORMAT_B10G11R11_UFLOAT_PACK32:
|
case VK_FORMAT_B10G11R11_UFLOAT_PACK32:
|
||||||
case VK_FORMAT_E5B9G9R9_UFLOAT_PACK32:
|
case VK_FORMAT_E5B9G9R9_UFLOAT_PACK32:
|
||||||
case VK_FORMAT_R5G6B5_UNORM_PACK16:
|
case VK_FORMAT_R5G6B5_UNORM_PACK16:
|
||||||
@@ -1960,7 +1962,8 @@ void main() {
|
|||||||
case VK_FORMAT_B5G5R5A1_UNORM_PACK16:
|
case VK_FORMAT_B5G5R5A1_UNORM_PACK16:
|
||||||
case VK_FORMAT_R4G4B4A4_UNORM_PACK16:
|
case VK_FORMAT_R4G4B4A4_UNORM_PACK16:
|
||||||
case VK_FORMAT_B4G4R4A4_UNORM_PACK16:
|
case VK_FORMAT_B4G4R4A4_UNORM_PACK16:
|
||||||
out.sourceClass = format == VK_FORMAT_A2B10G10R10_UINT_PACK32 ?
|
out.sourceClass = (format == VK_FORMAT_A2B10G10R10_UINT_PACK32 ||
|
||||||
|
format == VK_FORMAT_A2R10G10B10_UINT_PACK32) ?
|
||||||
ReadbackSourceClass::UnsignedInt : ReadbackSourceClass::Float;
|
ReadbackSourceClass::UnsignedInt : ReadbackSourceClass::Float;
|
||||||
out.special = format;
|
out.special = format;
|
||||||
return true;
|
return true;
|
||||||
@@ -2036,6 +2039,15 @@ void main() {
|
|||||||
rgba[3] = static_cast<Float>((word >> 30) & 0x3u) / 3.0f;
|
rgba[3] = static_cast<Float>((word >> 30) & 0x3u) / 3.0f;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
case VK_FORMAT_A2R10G10B10_UNORM_PACK32: {
|
||||||
|
Uint32 word = 0;
|
||||||
|
Memcpy(&word, source, sizeof(word));
|
||||||
|
rgba[2] = static_cast<Float>(word & 0x3FFu) / 1023.0f;
|
||||||
|
rgba[1] = static_cast<Float>((word >> 10) & 0x3FFu) / 1023.0f;
|
||||||
|
rgba[0] = static_cast<Float>((word >> 20) & 0x3FFu) / 1023.0f;
|
||||||
|
rgba[3] = static_cast<Float>((word >> 30) & 0x3u) / 3.0f;
|
||||||
|
return;
|
||||||
|
}
|
||||||
case VK_FORMAT_B10G11R11_UFLOAT_PACK32: {
|
case VK_FORMAT_B10G11R11_UFLOAT_PACK32: {
|
||||||
Uint32 word = 0;
|
Uint32 word = 0;
|
||||||
Memcpy(&word, source, sizeof(word));
|
Memcpy(&word, source, sizeof(word));
|
||||||
@@ -2187,6 +2199,13 @@ void main() {
|
|||||||
rgba[1] = (word >> 10) & 0x3FFu;
|
rgba[1] = (word >> 10) & 0x3FFu;
|
||||||
rgba[2] = (word >> 20) & 0x3FFu;
|
rgba[2] = (word >> 20) & 0x3FFu;
|
||||||
rgba[3] = (word >> 30) & 0x3u;
|
rgba[3] = (word >> 30) & 0x3u;
|
||||||
|
} else if (srcFormat == VK_FORMAT_A2R10G10B10_UINT_PACK32) {
|
||||||
|
Uint32 word = 0;
|
||||||
|
Memcpy(&word, source, sizeof(word));
|
||||||
|
rgba[2] = word & 0x3FFu;
|
||||||
|
rgba[1] = (word >> 10) & 0x3FFu;
|
||||||
|
rgba[0] = (word >> 20) & 0x3FFu;
|
||||||
|
rgba[3] = (word >> 30) & 0x3u;
|
||||||
} else {
|
} else {
|
||||||
for (Int c = 0; c < desc.channels; ++c) {
|
for (Int c = 0; c < desc.channels; ++c) {
|
||||||
if (desc.componentBits == 8) {
|
if (desc.componentBits == 8) {
|
||||||
|
|||||||
@@ -133,9 +133,11 @@ namespace MobileGL {
|
|||||||
case TextureInternalFormat::RGBA8Snorm:
|
case TextureInternalFormat::RGBA8Snorm:
|
||||||
return VK_FORMAT_R8G8B8A8_SNORM;
|
return VK_FORMAT_R8G8B8A8_SNORM;
|
||||||
case TextureInternalFormat::RGB10A2:
|
case TextureInternalFormat::RGB10A2:
|
||||||
return VK_FORMAT_A2R10G10B10_UNORM_PACK32;
|
// GL_UNSIGNED_INT_2_10_10_10_REV puts R in bits 0-9, which is Vulkan's
|
||||||
|
// A2B10G10R10 layout - A2R10G10B10 silently swaps R and B on upload.
|
||||||
|
return VK_FORMAT_A2B10G10R10_UNORM_PACK32;
|
||||||
case TextureInternalFormat::RGB10A2UI:
|
case TextureInternalFormat::RGB10A2UI:
|
||||||
return VK_FORMAT_A2R10G10B10_UINT_PACK32;
|
return VK_FORMAT_A2B10G10R10_UINT_PACK32;
|
||||||
case TextureInternalFormat::RGBA16:
|
case TextureInternalFormat::RGBA16:
|
||||||
return VK_FORMAT_R16G16B16A16_UNORM;
|
return VK_FORMAT_R16G16B16A16_UNORM;
|
||||||
case TextureInternalFormat::RGBA16Snorm:
|
case TextureInternalFormat::RGBA16Snorm:
|
||||||
|
|||||||
Reference in New Issue
Block a user