From da69cfd6685f9d564247ca259be0cc92b043417a Mon Sep 17 00:00:00 2001 From: Michael Parkin-White Date: Tue, 11 Apr 2023 13:37:24 +0100 Subject: [PATCH] Metal: Add textureGrad support. Authored by Apple: Michael Parkin-White --- .../gpu/shaders/metal/mtl_shader_defines.msl | 34 +++++++++++++++++-- 1 file changed, 31 insertions(+), 3 deletions(-) diff --git a/source/blender/gpu/shaders/metal/mtl_shader_defines.msl b/source/blender/gpu/shaders/metal/mtl_shader_defines.msl index a192e51a0ec..410cf41d116 100644 --- a/source/blender/gpu/shaders/metal/mtl_shader_defines.msl +++ b/source/blender/gpu/shaders/metal/mtl_shader_defines.msl @@ -83,9 +83,7 @@ struct constexp_uvec3 { uint3 xyz; }; - constexpr constexp_uvec3(uint _x, uint _y, uint _z) : x(_x), y(_y), z(_z) - { - } + constexpr constexp_uvec3(uint _x, uint _y, uint _z) : x(_x), y(_y), z(_z) {} constexpr uint operator[](int i) { /* Note: Need to switch on each elem value as array accessor triggers @@ -270,6 +268,8 @@ struct SStruct { #define textureGather3(__tex, __uv, __comp) _texture_gather_internal(__tex, __uv, __comp) #define textureGatherOffset(__tex, __offset, __uv, __comp) \ _texture_gather_internal(__tex, __uv, __comp, __offset) +#define textureGrad(__tex, __uv, __dpdx, __dpdy) \ + _texture_grad_internal(__tex, __uv, __dpdx, __dpdy) #define TEXURE_MACRO(_1, _2, _3, TEXNAME, ...) TEXNAME #define texture(...) TEXURE_MACRO(__VA_ARGS__, texture3, texture2)(__VA_ARGS__) @@ -825,6 +825,34 @@ inline vec _texture_gather_internal( return tex.texture->gather(*tex.samp, uva.xy, uint(uva.z), offset); } +/* Texture Grad. */ +inline float4 _texture_grad_internal( + thread _mtl_combined_image_sampler_2d tex, + float2 uv, + float2 dpdx, + float2 dpdy) +{ + return tex.texture->sample(*tex.samp, uv, gradient2d(dpdx, dpdy)); +} + +inline float4 _texture_grad_internal( + thread _mtl_combined_image_sampler_2d_array tex, + float3 uva, + float2 dpdx, + float2 dpdy) +{ + return tex.texture->sample(*tex.samp, uva.xy, uint(uva.z), gradient2d(dpdx, dpdy)); +} + +inline float4 _texture_grad_internal( + thread _mtl_combined_image_sampler_3d tex, + float3 uvw, + float3 dpdx, + float3 dpdy) +{ + return tex.texture->sample(*tex.samp, uvw, gradient3d(dpdx, dpdy)); +} + /* Texture write support. */ template inline void _texture_write_internal(thread _mtl_combined_image_sampler_1d tex, -- 2.30.2