From b34bc67f6741f06c652945b790cd335fb2eebd2e Mon Sep 17 00:00:00 2001 From: Jeroen Bakker Date: Fri, 21 Feb 2025 13:46:10 +0100 Subject: [PATCH] Metal: Add support for packed_float3 as storage buffers Subdivision shaders currently fail to compile using Metal as it doesn't recognize packed_float3 as an internal data type. This PR includes packed_float3 as an internal data type. Without this `blender --debug-gpu-compile-shaders` will fail as it includes a namespace. ``` ERROR (gpu.shader): subdiv_normals_accumulate Compute Shader: | | source/blender/gpu/metal/mtl_shader_generator.mm:971:9: Error: no type named 'packed_float3' in 'MTLShaderComputeImpl'; did you mean simply 'packed_float3'? | | device MTLShaderComputeImpl::packed_float3* normals[[buffer(MTL_storage_buffer_base_index+4)]], | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | packed_float3 | | /System/Library/PrivateFrameworks/GPUCompiler.framework/Versions/32023/Libraries/lib/clang/32023.196/include/metal/metal_packed_vector:145:58: Note: 'packed_float3' declared here | | typedef __attribute__((__packed_vector_type__(3))) float packed_float3; | ^ ``` Pull Request: https://projects.blender.org/blender/blender/pulls/134925 --- source/blender/gpu/metal/mtl_shader_generator.hh | 1 + source/blender/gpu/metal/mtl_shader_interface_type.hh | 3 +++ 2 files changed, 4 insertions(+) diff --git a/source/blender/gpu/metal/mtl_shader_generator.hh b/source/blender/gpu/metal/mtl_shader_generator.hh index dc2a37a1fb6..930bc8a30c0 100644 --- a/source/blender/gpu/metal/mtl_shader_generator.hh +++ b/source/blender/gpu/metal/mtl_shader_generator.hh @@ -529,6 +529,7 @@ inline bool is_builtin_type(std::string type) {"uchar4", MTL_DATATYPE_UCHAR4}, {"vec3_1010102_Unorm", MTL_DATATYPE_UINT1010102_NORM}, {"vec3_1010102_Inorm", MTL_DATATYPE_INT1010102_NORM}, + {"packed_float3", MTL_DATATYPE_PACKED_FLOAT3}, }; return (glsl_builtin_types.find(type) != glsl_builtin_types.end()); } diff --git a/source/blender/gpu/metal/mtl_shader_interface_type.hh b/source/blender/gpu/metal/mtl_shader_interface_type.hh index da51e047d0f..501dd8acfae 100644 --- a/source/blender/gpu/metal/mtl_shader_interface_type.hh +++ b/source/blender/gpu/metal/mtl_shader_interface_type.hh @@ -50,6 +50,7 @@ enum eMTLDataType { MTL_DATATYPE_FLOAT2, MTL_DATATYPE_FLOAT3, MTL_DATATYPE_FLOAT4, + MTL_DATATYPE_PACKED_FLOAT3, MTL_DATATYPE_LONG, MTL_DATATYPE_LONG2, @@ -128,6 +129,7 @@ inline uint mtl_get_data_type_size(eMTLDataType type) return 8; case MTL_DATATYPE_HALF3x2: + case MTL_DATATYPE_PACKED_FLOAT3: return 12; case MTL_DATATYPE_INT3: @@ -229,6 +231,7 @@ inline uint mtl_get_data_type_alignment(eMTLDataType type) case MTL_DATATYPE_UINT3: case MTL_DATATYPE_UINT4: case MTL_DATATYPE_FLOAT3: + case MTL_DATATYPE_PACKED_FLOAT3: case MTL_DATATYPE_FLOAT4: case MTL_DATATYPE_LONG2: case MTL_DATATYPE_ULONG2: