From 2111c94f1e6d579341feb56a2389a1b976bc73ac Mon Sep 17 00:00:00 2001 From: Samuliak Date: Tue, 11 Mar 2025 08:18:55 +0100 Subject: [PATCH] metal: check for format support --- include/renderer_mtl/texture_decoder.hpp | 1 + src/core/renderer_mtl/pica_to_mtl.cpp | 8 +++++--- src/core/renderer_mtl/texture_decoder.cpp | 10 ++++++++++ 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/include/renderer_mtl/texture_decoder.hpp b/include/renderer_mtl/texture_decoder.hpp index 29f88695..6fd5cfb5 100644 --- a/include/renderer_mtl/texture_decoder.hpp +++ b/include/renderer_mtl/texture_decoder.hpp @@ -16,6 +16,7 @@ void decodeTexelAI8ToRG8(OpenGL::uvec2 size, u32 u, u32 v, std::span i void decodeTexelGR8ToRG8(OpenGL::uvec2 size, u32 u, u32 v, std::span inData, std::vector& outData); void decodeTexelI8ToR8(OpenGL::uvec2 size, u32 u, u32 v, std::span inData, std::vector& outData); void decodeTexelA8ToA8(OpenGL::uvec2 size, u32 u, u32 v, std::span inData, std::vector& outData); +void decodeTexelAI4ToABGR4(OpenGL::uvec2 size, u32 u, u32 v, std::span inData, std::vector& outData); void decodeTexelAI4ToRG8(OpenGL::uvec2 size, u32 u, u32 v, std::span inData, std::vector& outData); void decodeTexelI4ToR8(OpenGL::uvec2 size, u32 u, u32 v, std::span inData, std::vector& outData); void decodeTexelA4ToA8(OpenGL::uvec2 size, u32 u, u32 v, std::span inData, std::vector& outData); diff --git a/src/core/renderer_mtl/pica_to_mtl.cpp b/src/core/renderer_mtl/pica_to_mtl.cpp index d527f000..10b3eda8 100644 --- a/src/core/renderer_mtl/pica_to_mtl.cpp +++ b/src/core/renderer_mtl/pica_to_mtl.cpp @@ -16,7 +16,7 @@ namespace PICA { {MTL::PixelFormatRG8Unorm, 2, decodeTexelGR8ToRG8}, // RG8 {MTL::PixelFormatR8Unorm, 1, decodeTexelI8ToR8}, // I8 {MTL::PixelFormatA8Unorm, 1, decodeTexelA8ToA8}, // A8 - {MTL::PixelFormatRG8Unorm, 2, decodeTexelAI4ToRG8}, // IA4 + {MTL::PixelFormatABGR4Unorm, 2, decodeTexelAI4ToABGR4}, // IA4 {MTL::PixelFormatR8Unorm, 1, decodeTexelI4ToR8}, // I4 {MTL::PixelFormatA8Unorm, 1, decodeTexelA4ToA8}, // A4 {MTL::PixelFormatRGBA8Unorm, 4, decodeTexelETC1ToRGBA8}, // ETC1 @@ -25,8 +25,10 @@ namespace PICA { void checkForPixelFormatSupport(MTL::Device* device) { if (!device->supportsFamily(MTL::GPUFamilyApple1)) { - // TODO - throw; + pixelFormatInfos[2] = {MTL::PixelFormatRGBA8Unorm, 4, decodeTexelA1BGR5ToRGBA8}; + pixelFormatInfos[3] = {MTL::PixelFormatRGBA8Unorm, 4, decodeTexelB5G6R5ToRGBA8}; + pixelFormatInfos[4] = {MTL::PixelFormatRGBA8Unorm, 4, decodeTexelABGR4ToRGBA8}; + pixelFormatInfos[9] = {MTL::PixelFormatRG8Unorm, 2, decodeTexelAI4ToRG8}; } } diff --git a/src/core/renderer_mtl/texture_decoder.cpp b/src/core/renderer_mtl/texture_decoder.cpp index d98eb06b..c758e8f1 100644 --- a/src/core/renderer_mtl/texture_decoder.cpp +++ b/src/core/renderer_mtl/texture_decoder.cpp @@ -176,6 +176,16 @@ void decodeTexelA8ToA8(OpenGL::uvec2 size, u32 u, u32 v, std::span inD outData.push_back(alpha); } +void decodeTexelAI4ToABGR4(OpenGL::uvec2 size, u32 u, u32 v, std::span inData, std::vector& outData) { + const u32 offset = getSwizzledOffset(u, v, size.u(), 1); + const u8 texel = inData[offset]; + const u8 alpha = texel & 0xf; + const u8 intensity = texel >> 4; + + outData.push_back((intensity << 4) | intensity); + outData.push_back((alpha << 4) | intensity); +} + void decodeTexelAI4ToRG8(OpenGL::uvec2 size, u32 u, u32 v, std::span inData, std::vector& outData) { const u32 offset = getSwizzledOffset(u, v, size.u(), 1); const u8 texel = inData[offset];