summaryrefslogtreecommitdiffstats
path: root/source/slang/emit.cpp
diff options
context:
space:
mode:
authorTim Foley <tfoley@nvidia.com>2017-07-12 11:07:45 -0700
committerTim Foley <tfoley@nvidia.com>2017-07-12 11:07:45 -0700
commit74963469a169b49d61196e3a3b33a903ea8bfede (patch)
treea3d8f4f8873946f58111ae5e7f5034b071c1e824 /source/slang/emit.cpp
parent2c6c501b36db9e7991c3f7999451b70f12329ecc (diff)
Add basic reflection query for checking if entry point is "sample-rate"
- This really just checks two basic things: 1. Was there any global variable declared with `in` and `sample`? 2. Did any code encountered during lowering referenece `gl_SampleIndex`? - This doesn't cover what HLSL could need, nor what we would need for cross-compilation. Consider it GLSL-specific for now. - In order to generate the information with even a reasonable chance of being accurate (not giving a ton of false positives) I tried to integrate the checks into the lowering process (so they only see code that is referenced, one hopes). - For this to work with my testing setup, I needed to make sure that lowering is always performed, prior to emitting reflection info - This change broke several reflection tests, because they had been using code that wouldn't actually pass the downstream compiler. I checked in fixes for those.
Diffstat (limited to 'source/slang/emit.cpp')
-rw-r--r--source/slang/emit.cpp16
1 files changed, 11 insertions, 5 deletions
diff --git a/source/slang/emit.cpp b/source/slang/emit.cpp
index 0c39a98bd..03cc7d8aa 100644
--- a/source/slang/emit.cpp
+++ b/source/slang/emit.cpp
@@ -2833,7 +2833,10 @@ struct EmitVisitor
// Emit a single `regsiter` semantic, as appropriate for a given resource-type-specific layout info
void emitHLSLRegisterSemantic(
- VarLayout::ResourceInfo const& info)
+ VarLayout::ResourceInfo const& info,
+
+ // Keyword to use in the uniform case (`register` for globals, `packoffset` inside a `cbuffer`)
+ char const* uniformSemanticSpelling = "register")
{
if( info.kind == LayoutResourceKind::Uniform )
{
@@ -2845,7 +2848,9 @@ struct EmitVisitor
// units, and then a "component" within that register, based on 4-byte
// offsets from there. We cannot support more fine-grained offsets than that.
- Emit(": packoffset(c");
+ Emit(": ");
+ Emit(uniformSemanticSpelling);
+ Emit("(c");
// Size of a logical `c` register in bytes
auto registerSize = 16;
@@ -2907,7 +2912,8 @@ struct EmitVisitor
// Emit all the `register` semantics that are appropriate for a particular variable layout
void emitHLSLRegisterSemantics(
- RefPtr<VarLayout> layout)
+ RefPtr<VarLayout> layout,
+ char const* uniformSemanticSpelling = "register")
{
if (!layout) return;
@@ -2922,7 +2928,7 @@ struct EmitVisitor
for( auto rr : layout->resourceInfos )
{
- emitHLSLRegisterSemantic(rr);
+ emitHLSLRegisterSemantic(rr, uniformSemanticSpelling);
}
}
@@ -3026,7 +3032,7 @@ struct EmitVisitor
offsetResource.space += cbufferResource->space;
}
- emitHLSLRegisterSemantic(offsetResource);
+ emitHLSLRegisterSemantic(offsetResource, "packoffset");
}
Emit(";\n");