summaryrefslogtreecommitdiff
path: root/tools/gfx/metal/metal-util.cpp
diff options
context:
space:
mode:
authorSimon Kallweit <simon.kallweit@gmail.com>2024-05-27 06:03:13 -0700
committerGitHub <noreply@github.com>2024-05-27 15:03:13 +0200
commitd9443d670ef8413971fe7c3f02368b60a7fc5904 (patch)
tree001e763846b23814b0e4960991fc457d7b580a0f /tools/gfx/metal/metal-util.cpp
parent4f1cbf6f4d561320b8e3c73b871cc95dd13c6207 (diff)
[gfx] metal backend skeleton (#4223)
* add metal-cpp submodule * add metal-cpp cmake target * gfx metal backend skeleton * add premake support * add foundation framework * add metal-cpp include to premake * update vs project file --------- Co-authored-by: Simon Kallweit <skallweit@nvidia.com> Co-authored-by: Jay Kwak <82421531+jkwak-work@users.noreply.github.com>
Diffstat (limited to 'tools/gfx/metal/metal-util.cpp')
-rw-r--r--tools/gfx/metal/metal-util.cpp181
1 files changed, 181 insertions, 0 deletions
diff --git a/tools/gfx/metal/metal-util.cpp b/tools/gfx/metal/metal-util.cpp
new file mode 100644
index 000000000..a8c8da6b6
--- /dev/null
+++ b/tools/gfx/metal/metal-util.cpp
@@ -0,0 +1,181 @@
+// metal-util.cpp
+#include "metal-util.h"
+#include "core/slang-math.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+
+namespace gfx {
+
+using namespace MTL;
+
+MTL::VertexFormat MetalUtil::getMetalVertexFormat(Format format)
+{
+ switch (format)
+ {
+ case Format::R8G8_UINT: return VertexFormatUChar2;
+ // VertexFormatUChar3
+ case Format::R8G8B8A8_UINT: return VertexFormatUChar4;
+ case Format::R8G8_SINT: return VertexFormatChar2;
+ // return VertexFormatChar3
+ case Format::R8G8B8A8_SINT: return VertexFormatChar4;
+ case Format::R8G8_UNORM: return VertexFormatUChar2Normalized;
+ // return VertexFormatUChar3Normalized;
+ case Format::R8G8B8A8_UNORM: return VertexFormatUChar4Normalized;
+ case Format::R8G8_SNORM: return VertexFormatChar2Normalized;
+ // return VertexFormatChar3Normalized
+ case Format::R8G8B8A8_SNORM: return VertexFormatChar4Normalized;
+ case Format::R16G16_UINT: return VertexFormatUShort2;
+ // return VertexFormatUShort3;
+ case Format::R16G16B16A16_UINT: return VertexFormatUShort4;
+ case Format::R16G16_SINT: return VertexFormatShort2;
+ // return VertexFormatShort3;
+ case Format::R16G16B16A16_SINT: return VertexFormatShort4;
+ case Format::R16G16_UNORM: return VertexFormatUShort2Normalized;
+ // return VertexFormatUShort3Normalized;
+ case Format::R16G16B16A16_UNORM: return VertexFormatUShort4Normalized;
+ case Format::R16G16_SNORM: return VertexFormatShort2Normalized;
+ // return VertexFormatShort3Normalized;
+ case Format::R16G16B16A16_SNORM: return VertexFormatShort4Normalized;
+ case Format::R16G16_FLOAT: return VertexFormatHalf2;
+ // return VertexFormatHalf3;
+ case Format::R16G16B16A16_FLOAT: return VertexFormatHalf4;
+ case Format::R32_FLOAT: return VertexFormatFloat;
+ case Format::R32G32_FLOAT: return VertexFormatFloat2;
+ case Format::R32G32B32_FLOAT: return VertexFormatFloat3;
+ case Format::R32G32B32A32_FLOAT: return VertexFormatFloat4;
+ case Format::R32_SINT: return VertexFormatInt;
+ case Format::R32G32_SINT: return VertexFormatInt2;
+ case Format::R32G32B32_SINT: return VertexFormatInt3;
+ case Format::R32G32B32A32_SINT: return VertexFormatInt4;
+ case Format::R32_UINT: return VertexFormatUInt;
+ case Format::R32G32_UINT: return VertexFormatUInt2;
+ case Format::R32G32B32_UINT: return VertexFormatUInt3;
+ case Format::R32G32B32A32_UINT: return VertexFormatUInt4;
+ // return VertexFormatInt1010102Normalized;
+ case Format::R10G10B10A2_UNORM: return VertexFormatUInt1010102Normalized;
+ case Format::B4G4R4A4_UNORM: return VertexFormatUChar4Normalized_BGRA;
+ case Format::R8_UINT: return VertexFormatUChar;
+ case Format::R8_SINT: return VertexFormatChar;
+ case Format::R8_UNORM: return VertexFormatUCharNormalized;
+ case Format::R8_SNORM: return VertexFormatCharNormalized;
+ case Format::R16_UINT: return VertexFormatUShort;
+ case Format::R16_SINT: return VertexFormatShort;
+ case Format::R16_UNORM: return VertexFormatUShortNormalized;
+ case Format::R16_SNORM: return VertexFormatShortNormalized;
+ case Format::R16_FLOAT: return VertexFormatHalf;
+ case Format::R11G11B10_FLOAT: return VertexFormatFloatRG11B10;
+ case Format::R9G9B9E5_SHAREDEXP: return VertexFormatFloatRGB9E5;
+ default: return VertexFormatInvalid;
+ }
+}
+
+/* static */MTL::PixelFormat MetalUtil::getMetalPixelFormat(Format format)
+{
+ switch (format)
+ {
+ case Format::R32G32B32A32_TYPELESS: return PixelFormatRGBA32Float;
+ case Format::R32G32B32_TYPELESS: return PixelFormatInvalid;
+ case Format::R32G32_TYPELESS: return PixelFormatRG32Float;
+ case Format::R32_TYPELESS: return PixelFormatR32Float;
+
+ case Format::R16G16B16A16_TYPELESS: return PixelFormatRGBA16Float;
+ case Format::R16G16_TYPELESS: return PixelFormatRG16Float;
+ case Format::R16_TYPELESS: return PixelFormatR16Float;
+
+ case Format::R8G8B8A8_TYPELESS: return PixelFormatRGBA8Unorm;
+ case Format::R8G8_TYPELESS: return PixelFormatRG8Unorm;
+ case Format::R8_TYPELESS: return PixelFormatR8Unorm;
+ case Format::B8G8R8A8_TYPELESS: return PixelFormatBGRA8Unorm;
+
+ case Format::R32G32B32A32_FLOAT: return PixelFormatRGBA32Float;
+ case Format::R32G32B32_FLOAT: return PixelFormatInvalid;
+ case Format::R32G32_FLOAT: return PixelFormatRG32Float;
+ case Format::R32_FLOAT: return PixelFormatR32Float;
+
+ case Format::R16G16B16A16_FLOAT: return PixelFormatRGBA16Float;
+ case Format::R16G16_FLOAT: return PixelFormatRG16Float;
+ case Format::R16_FLOAT: return PixelFormatR16Float;
+
+ case Format::R32G32B32A32_UINT: return PixelFormatRGBA32Uint;
+ case Format::R32G32B32_UINT: return PixelFormatInvalid;
+ case Format::R32G32_UINT: return PixelFormatRG32Uint;
+ case Format::R32_UINT: return PixelFormatR32Uint;
+
+ case Format::R16G16B16A16_UINT: return PixelFormatRGBA16Uint;
+ case Format::R16G16_UINT: return PixelFormatRG16Uint;
+ case Format::R16_UINT: return PixelFormatR16Uint;
+
+ case Format::R8G8B8A8_UINT: return PixelFormatRGBA8Uint;
+ case Format::R8G8_UINT: return PixelFormatRG8Uint;
+ case Format::R8_UINT: return PixelFormatR8Uint;
+
+ case Format::R32G32B32A32_SINT: return PixelFormatRGBA32Sint;
+ case Format::R32G32B32_SINT: return PixelFormatInvalid;
+ case Format::R32G32_SINT: return PixelFormatRG32Sint;
+ case Format::R32_SINT: return PixelFormatR32Sint;
+
+ case Format::R16G16B16A16_SINT: return PixelFormatRGBA16Sint;
+ case Format::R16G16_SINT: return PixelFormatRG16Sint;
+ case Format::R16_SINT: return PixelFormatR16Sint;
+
+ case Format::R8G8B8A8_SINT: return PixelFormatRGBA8Sint;
+ case Format::R8G8_SINT: return PixelFormatRG8Sint;
+ case Format::R8_SINT: return PixelFormatR8Sint;
+
+ case Format::R16G16B16A16_UNORM: return PixelFormatRGBA16Unorm;
+ case Format::R16G16_UNORM: return PixelFormatRG16Unorm;
+ case Format::R16_UNORM: return PixelFormatR16Unorm;
+
+ case Format::R8G8B8A8_UNORM: return PixelFormatRGBA8Unorm;
+ case Format::R8G8B8A8_UNORM_SRGB: return PixelFormatRGBA8Unorm_sRGB;
+ case Format::R8G8_UNORM: return PixelFormatRG8Unorm;
+ case Format::R8_UNORM: return PixelFormatR8Unorm;
+ case Format::B8G8R8A8_UNORM: return PixelFormatBGRA8Unorm;
+ case Format::B8G8R8A8_UNORM_SRGB: return PixelFormatBGRA8Unorm_sRGB;
+ case Format::B8G8R8X8_UNORM: return PixelFormatInvalid;
+ case Format::B8G8R8X8_UNORM_SRGB: return PixelFormatInvalid;
+
+ case Format::R16G16B16A16_SNORM: return PixelFormatRGBA16Snorm;
+ case Format::R16G16_SNORM: return PixelFormatRG16Snorm;
+ case Format::R16_SNORM: return PixelFormatR16Snorm;
+
+ case Format::R8G8B8A8_SNORM: return PixelFormatRGBA8Snorm;
+ case Format::R8G8_SNORM: return PixelFormatRG8Snorm;
+ case Format::R8_SNORM: return PixelFormatR8Snorm;
+
+ case Format::D32_FLOAT: return PixelFormatDepth32Float;
+ case Format::D16_UNORM: return PixelFormatDepth16Unorm;
+ case Format::D32_FLOAT_S8_UINT: return PixelFormatDepth32Float_Stencil8;
+ case Format::R32_FLOAT_X32_TYPELESS: return PixelFormatInvalid;
+
+ case Format::B4G4R4A4_UNORM: return PixelFormatABGR4Unorm;
+ case Format::B5G6R5_UNORM: return PixelFormatB5G6R5Unorm;
+ case Format::B5G5R5A1_UNORM: return PixelFormatA1BGR5Unorm;
+
+ case Format::R9G9B9E5_SHAREDEXP: return PixelFormatRGB9E5Float;
+ case Format::R10G10B10A2_TYPELESS: return PixelFormatInvalid;
+ case Format::R10G10B10A2_UINT: return PixelFormatRGB10A2Uint;
+ case Format::R10G10B10A2_UNORM: return PixelFormatRGB10A2Unorm;
+ case Format::R11G11B10_FLOAT: return PixelFormatRG11B10Float;
+
+ case Format::BC1_UNORM: return PixelFormatBC1_RGBA;
+ case Format::BC1_UNORM_SRGB: return PixelFormatBC1_RGBA_sRGB;
+ case Format::BC2_UNORM: return PixelFormatBC2_RGBA;
+ case Format::BC2_UNORM_SRGB: return PixelFormatBC2_RGBA_sRGB;
+ case Format::BC3_UNORM: return PixelFormatBC3_RGBA;
+ case Format::BC3_UNORM_SRGB: return PixelFormatBC3_RGBA_sRGB;
+ case Format::BC4_UNORM: return PixelFormatBC4_RUnorm;
+ case Format::BC4_SNORM: return PixelFormatBC4_RSnorm;
+ case Format::BC5_UNORM: return PixelFormatBC5_RGUnorm;
+ case Format::BC5_SNORM: return PixelFormatBC5_RGSnorm;
+ case Format::BC6H_UF16: return PixelFormatBC6H_RGBUfloat;
+ case Format::BC6H_SF16: return PixelFormatBC6H_RGBFloat;
+ case Format::BC7_UNORM: return PixelFormatBC7_RGBAUnorm;
+ case Format::BC7_UNORM_SRGB: return PixelFormatBC7_RGBAUnorm_sRGB;
+
+ default: return PixelFormatInvalid;
+ }
+}
+
+} // namespace gfx