summaryrefslogtreecommitdiff
path: root/source/slang/slang-emit-c-like.cpp
diff options
context:
space:
mode:
authorTim Foley <tfoleyNV@users.noreply.github.com>2021-02-24 08:21:37 -0800
committerGitHub <noreply@github.com>2021-02-24 08:21:37 -0800
commitd66b30729029bdb43892e05c9c80fd56ac95a24f (patch)
tree233af028104a224793fa5fa94b60c589b61d75ba /source/slang/slang-emit-c-like.cpp
parent55a5ccc559b34b8d2eb9c7b7a2d9efbae40619c2 (diff)
Add support for GetAttributeAtVertex for D3D (#1725)
This operation was added along with the `SV_Barycentrics` system-value input, and allows for a `nointerpolation` varying input to a fragment shader to be fetched at a specific vertex index within the primitive that is causing the fragment shader to be invoked. This change adds support for the new operations in the standard library, and also includes a test case to make sure that we emit it correctly when producing HLSL/DXIL. This change also includes a small bug fix to our emission logic for function parameters so that we properly emit layout-related attributes for varying parameters declared directly on an entry point. (Note that most attribute end up being declared in `struct` types in existing HLSL shaders, and our IR passes produce only global variables for attributes on GLSL; the only case this affects is inidividual scalar/vector attributes declared declared as entry-point parameters, when outputting HLSL) Note that this change only adds support for the new function on the HLSL/DXIL path, and doesn't yet add any cross-compilation support for GLSL/SPIR-V. The reason for this is that the equivalent GLSL feature(s) appear to use a different model to the HLSL version, and we need to invent a suitable approach to align them to make portable code possible.
Diffstat (limited to 'source/slang/slang-emit-c-like.cpp')
-rw-r--r--source/slang/slang-emit-c-like.cpp12
1 files changed, 12 insertions, 0 deletions
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);
}