From b247fc135e8a0e21f33586e61ea262de9b453a78 Mon Sep 17 00:00:00 2001 From: Yong He Date: Mon, 27 Nov 2023 13:43:54 -0800 Subject: Fix spirv intrinsics for partial derivatives. (#3355) Co-authored-by: Yong He --- source/slang/hlsl.meta.slang | 164 ++++++++++++++++++------------------------- 1 file changed, 69 insertions(+), 95 deletions(-) (limited to 'source/slang') diff --git a/source/slang/hlsl.meta.slang b/source/slang/hlsl.meta.slang index 2bac47fd6..ac8c59ac6 100644 --- a/source/slang/hlsl.meta.slang +++ b/source/slang/hlsl.meta.slang @@ -3811,150 +3811,124 @@ int4 D3DCOLORtoUBYTE4(float4 color) } // Partial-difference derivatives +${{{{ +const char* diffDimensions[2] = {"x", "y"}; +for (auto xOrY : diffDimensions) { +}}}} __generic -__target_intrinsic(glsl, dFdx) -[__readNone] -T ddx(T x); - -__generic -__target_intrinsic(hlsl) -__target_intrinsic(glsl, dFdx) -[__readNone] -vector ddx(vector x) -{ - VECTOR_MAP_UNARY(T, N, ddx, x); -} - -__generic -__target_intrinsic(hlsl) [__readNone] -matrix ddx(matrix x) +T dd$(xOrY)(T x) { - MATRIX_MAP_UNARY(T, N, M, ddx, x); + __target_switch + { + case hlsl: + case cpp: + case cuda: + __intrinsic_asm "dd$(xOrY)"; + case glsl: + __intrinsic_asm "dFd$(xOrY)"; + case spirv: + return spirv_asm {OpDPd$(xOrY) $$T result $x}; + } } -__generic -__target_intrinsic(hlsl) -__glsl_extension(GL_ARB_derivative_control) -__target_intrinsic(glsl, dFdxCoarse) -[__readNone] -T ddx_coarse(T x); - __generic -__target_intrinsic(hlsl) -__glsl_extension(GL_ARB_derivative_control) -__target_intrinsic(glsl, dFdxCoarse) [__readNone] -vector ddx_coarse(vector x) +vector dd$(xOrY)(vector x) { - VECTOR_MAP_UNARY(T, N, ddx_coarse, x); + __target_switch + { + case hlsl: + case cpp: + case cuda: + __intrinsic_asm "dd$(xOrY)"; + case glsl: + __intrinsic_asm "dFd$(xOrY)"; + case spirv: + return spirv_asm {OpDPd$(xOrY) $$vector result $x}; + } } __generic __target_intrinsic(hlsl) [__readNone] -matrix ddx_coarse(matrix x) +matrix dd$(xOrY)(matrix x) { - MATRIX_MAP_UNARY(T, N, M, ddx_coarse, x); + MATRIX_MAP_UNARY(T, N, M, dd$(xOrY), x); } __generic -__target_intrinsic(hlsl) -__glsl_extension(GL_ARB_derivative_control) -__target_intrinsic(glsl, dFdxFine) -[__readNone] -T ddx_fine(T x); - -__generic -__target_intrinsic(hlsl) __glsl_extension(GL_ARB_derivative_control) -__target_intrinsic(glsl, dFdxFine) [__readNone] -vector ddx_fine(vector x) +T dd$(xOrY)_coarse(T x) { - VECTOR_MAP_UNARY(T, N, ddx_fine, x); -} - -__generic -__target_intrinsic(hlsl) -[__readNone] -matrix ddx_fine(matrix x) -{ - MATRIX_MAP_UNARY(T, N, M, ddx_fine, x); + __target_switch + { + case hlsl: __intrinsic_asm "dd$(xOrY)_coarse"; + case glsl: __intrinsic_asm "dFd$(xOrY)Coarse"; + case spirv: return spirv_asm {OpCapability DerivativeControl; result:$$T = OpDPd$(xOrY)Coarse $x}; + } } -__generic -__target_intrinsic(hlsl) -__target_intrinsic(glsl, dFdy) -[__readNone] -T ddy(T x); - __generic -__target_intrinsic(hlsl) -__target_intrinsic(glsl, dFdy) +__glsl_extension(GL_ARB_derivative_control) [__readNone] -vector ddy(vector x) +vector dd$(xOrY)_coarse(vector x) { - VECTOR_MAP_UNARY(T, N, ddy, x); + __target_switch + { + case hlsl: __intrinsic_asm "dd$(xOrY)_coarse"; + case glsl: __intrinsic_asm "dFd$(xOrY)Coarse"; + case spirv: return spirv_asm {OpCapability DerivativeControl; result:$$vector = OpDPd$(xOrY)Coarse $x}; + } } __generic __target_intrinsic(hlsl) [__readNone] -matrix ddy(matrix x) +matrix dd$(xOrY)_coarse(matrix x) { - MATRIX_MAP_UNARY(T, N, M, ddy, x); + MATRIX_MAP_UNARY(T, N, M, dd$(xOrY)_coarse, x); } __generic __glsl_extension(GL_ARB_derivative_control) -__target_intrinsic(glsl, dFdyCoarse) -[__readNone] -T ddy_coarse(T x); - -__generic -__target_intrinsic(hlsl) -__glsl_extension(GL_ARB_derivative_control) -__target_intrinsic(glsl, dFdyCoarse) [__readNone] -vector ddy_coarse(vector x) +T dd$(xOrY)_fine(T x) { - VECTOR_MAP_UNARY(T, N, ddy_coarse, x); -} - -__generic -__target_intrinsic(hlsl) -[__readNone] -matrix ddy_coarse(matrix x) -{ - MATRIX_MAP_UNARY(T, N, M, ddy_coarse, x); + __target_switch + { + case hlsl: __intrinsic_asm "dd$(xOrY)_fine"; + case glsl: __intrinsic_asm "dFd$(xOrY)Fine"; + case spirv: return spirv_asm {OpCapability DerivativeControl; result:$$T = OpDPd$(xOrY)Fine $x}; + } } -__generic -__target_intrinsic(hlsl) -__glsl_extension(GL_ARB_derivative_control) -__target_intrinsic(glsl, dFdyFine) -[__readNone] -T ddy_fine(T x); - __generic -__target_intrinsic(hlsl) __glsl_extension(GL_ARB_derivative_control) -__target_intrinsic(glsl, dFdyFine) [__readNone] -vector ddy_fine(vector x) +vector dd$(xOrY)_fine(vector x) { - VECTOR_MAP_UNARY(T, N, ddy_fine, x); + __target_switch + { + case hlsl: __intrinsic_asm "dd$(xOrY)_fine"; + case glsl: __intrinsic_asm "dFd$(xOrY)Fine"; + case spirv: return spirv_asm {OpCapability DerivativeControl; result:$$vector = OpDPd$(xOrY)Fine $x}; + } } __generic __target_intrinsic(hlsl) [__readNone] -matrix ddy_fine(matrix x) +matrix dd$(xOrY)_fine(matrix x) { - MATRIX_MAP_UNARY(T, N, M, ddy_fine, x); + MATRIX_MAP_UNARY(T, N, M, dd$(xOrY)_fine, x); } +${{{{ +} // for (xOrY) +}}}} + // Radians to degrees @@ -4541,13 +4515,13 @@ __generic [__readNone] __target_intrinsic(hlsl) __target_intrinsic(glsl) -__target_intrinsic(spirv, "OpFWidth resultType resultId _0") +__target_intrinsic(spirv, "OpFwidth resultType resultId _0") T fwidth(T x); __generic __target_intrinsic(hlsl) __target_intrinsic(glsl) -__target_intrinsic(spirv, "OpFWidth resultType resultId _0") +__target_intrinsic(spirv, "OpFwidth resultType resultId _0") [__readNone] vector fwidth(vector x) { -- cgit v1.2.3