diff options
| -rw-r--r-- | source/slang/hlsl.meta.slang | 55 | ||||
| -rw-r--r-- | source/slang/slang-emit-c-like.cpp | 12 | ||||
| -rw-r--r-- | tests/pipeline/rasterization/get-attribute-at-vertex.slang | 16 | ||||
| -rw-r--r-- | tests/pipeline/rasterization/get-attribute-at-vertex.slang.hlsl | 14 |
4 files changed, 97 insertions, 0 deletions
diff --git a/source/slang/hlsl.meta.slang b/source/slang/hlsl.meta.slang index a9280d9ad..adbe6f9c8 100644 --- a/source/slang/hlsl.meta.slang +++ b/source/slang/hlsl.meta.slang @@ -1805,6 +1805,61 @@ matrix<T, N, M> fwidth(matrix<T, N, M> x) MATRIX_MAP_UNARY(T, N, M, fwidth, x); } +/// Get the value of a vertex attribute at a specific vertex. +/// +/// The `GetAttributeAtVertex()` function can be used in a fragment shader +/// to get the value of the given `attribute` at the vertex of the primitive +/// that corresponds to the given `vertexIndex`. +/// +/// Note that the `attribute` must have been a declared varying input to +/// the fragment shader with the `nointerpolation` modifier. +/// +/// This function can be applied to scalars, vectors, and matrices of +/// built-in scalar types. +/// +/// Note: these functions are not curently implemented for Vulkan/SPIR-V output. +/// +__generic<T : __BuiltinType> +[__readNone] +T GetAttributeAtVertex(T attribute, uint vertexIndex); + +/// Get the value of a vertex attribute at a specific vertex. +/// +/// The `GetAttributeAtVertex()` function can be used in a fragment shader +/// to get the value of the given `attribute` at the vertex of the primitive +/// that corresponds to the given `vertexIndex`. +/// +/// Note that the `attribute` must have been a declared varying input to +/// the fragment shader with the `nointerpolation` modifier. +/// +/// This function can be applied to scalars, vectors, and matrices of +/// built-in scalar types. +/// +/// Note: these functions are not curently implemented for Vulkan/SPIR-V output. +/// +__generic<T : __BuiltinType, let N : int> +[__readNone] +vector<T,N> GetAttributeAtVertex(vector<T,N> attribute, uint vertexIndex); + +/// Get the value of a vertex attribute at a specific vertex. +/// +/// The `GetAttributeAtVertex()` function can be used in a fragment shader +/// to get the value of the given `attribute` at the vertex of the primitive +/// that corresponds to the given `vertexIndex`. +/// +/// Note that the `attribute` must have been a declared varying input to +/// the fragment shader with the `nointerpolation` modifier. +/// +/// This function can be applied to scalars, vectors, and matrices of +/// built-in scalar types. +/// +/// Note: these functions are not curently implemented for Vulkan/SPIR-V output. +/// +__generic<T : __BuiltinType, let N : int, let M : int> +[__readNone] +matrix<T,N,M> GetAttributeAtVertex(matrix<T,N,M> attribute, uint vertexIndex); + + // Get number of samples in render target uint GetRenderTargetSampleCount(); diff --git a/source/slang/slang-emit-c-like.cpp b/source/slang/slang-emit-c-like.cpp index 0bd6efad3..d099af255 100644 --- a/source/slang/slang-emit-c-like.cpp +++ b/source/slang/slang-emit-c-like.cpp @@ -2663,6 +2663,18 @@ void CLikeSourceEmitter::emitSimpleFuncParamImpl(IRParam* param) auto paramName = getName(param); auto paramType = param->getDataType(); + if(auto layoutDecoration = param->findDecoration<IRLayoutDecoration>() ) + { + auto layout = as<IRVarLayout>(layoutDecoration->getLayout()); + SLANG_ASSERT(layout); + + if(layout->usesResourceKind(LayoutResourceKind::VaryingInput) + || layout->usesResourceKind(LayoutResourceKind::VaryingOutput)) + { + emitInterpolationModifiers(param, paramType, layout); + } + } + emitParamType(paramType, paramName); emitSemantics(param); } diff --git a/tests/pipeline/rasterization/get-attribute-at-vertex.slang b/tests/pipeline/rasterization/get-attribute-at-vertex.slang new file mode 100644 index 000000000..56fbcce78 --- /dev/null +++ b/tests/pipeline/rasterization/get-attribute-at-vertex.slang @@ -0,0 +1,16 @@ +// get-attribute-at-vertex.slang + +// Basic test for `GetAttributeAtVertex` function + +//TEST:CROSS_COMPILE:-target dxil -entry main -stage fragment -profile sm_6_1 + +[shader("fragment")] +void main( + nointerpolation float4 color : COLOR, + float3 bary : SV_Barycentrics, + out float4 result : SV_Target) +{ + result = bary.x * GetAttributeAtVertex(color, 0) + + bary.y * GetAttributeAtVertex(color, 1) + + bary.z * GetAttributeAtVertex(color, 2); +} diff --git a/tests/pipeline/rasterization/get-attribute-at-vertex.slang.hlsl b/tests/pipeline/rasterization/get-attribute-at-vertex.slang.hlsl new file mode 100644 index 000000000..257b334bf --- /dev/null +++ b/tests/pipeline/rasterization/get-attribute-at-vertex.slang.hlsl @@ -0,0 +1,14 @@ +// get-attribute-at-vertex.slang.hlsl + +//TEST_IGNORE_FILE: + +[shader("pixel")] +void main( + nointerpolation vector<float,4> color_0 : COLOR, + vector<float,3> bary_0 : SV_BARYCENTRICS, + out vector<float,4> result_0 : SV_TARGET) +{ + result_0 = bary_0.x * GetAttributeAtVertex(color_0, (uint) int(0)) + + bary_0.y * GetAttributeAtVertex(color_0, (uint) int(1)) + + bary_0.z * GetAttributeAtVertex(color_0, (uint) int(2)); +} |
