summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--source/slang/hlsl.meta.slang55
-rw-r--r--source/slang/slang-emit-c-like.cpp12
-rw-r--r--tests/pipeline/rasterization/get-attribute-at-vertex.slang16
-rw-r--r--tests/pipeline/rasterization/get-attribute-at-vertex.slang.hlsl14
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));
+}