diff options
| author | Tim Foley <tfoleyNV@users.noreply.github.com> | 2017-10-20 15:16:10 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2017-10-20 15:16:10 -0700 |
| commit | 624d122a3a110922cd54aab7bbf13f1cac8fbbff (patch) | |
| tree | 098d3c7eb9e7561088f835c4bcea6efbacaf701c /source | |
| parent | 7ba937faa3f72b0f319150c3dde041d8a353c007 (diff) | |
Fix up emission of shader parameter semantics when using IR (#226)
* Fix up emission of shader parameter semantics when using IR
- Make sure to propagate entry point parameter layouts down to IR parameters when doing the initial cloning to form target-specific IR
- When layout information is present on an IR node, prefer to use that over the original high-level declaration for outputting semantics in final HLSL
- Fix up test runner to generate `.actual` files when running compute tests, in cases where the `render-test` application errors out (e.g., because of a Slang compilation error)
- Add a first test of generics functionality, to show that they generate valid code through the IR
- Right now this test is *not* using any "interesting" operations on the type parameter, so this is not a test that can confirm that interface constraints work
* fixup: skip compute tests when running on Linux
Diffstat (limited to 'source')
| -rw-r--r-- | source/slang/emit.cpp | 31 | ||||
| -rw-r--r-- | source/slang/glsl.meta.slang.h | 2 | ||||
| -rw-r--r-- | source/slang/ir.cpp | 25 | ||||
| -rw-r--r-- | source/slang/slang.cpp | 1 |
4 files changed, 58 insertions, 1 deletions
diff --git a/source/slang/emit.cpp b/source/slang/emit.cpp index 971f0345b..1b5db065f 100644 --- a/source/slang/emit.cpp +++ b/source/slang/emit.cpp @@ -5090,6 +5090,37 @@ emitDeclImpl(decl, nullptr); EmitContext* context, IRValue* inst) { + // Don't emit semantics if we aren't translating down to HLSL + switch (context->shared->target) + { + case CodeGenTarget::HLSL: + break; + + default: + return; + } + + if(auto layoutDecoration = inst->findDecoration<IRLayoutDecoration>()) + { + if(auto varLayout = layoutDecoration->layout.As<VarLayout>()) + { + if(varLayout->flags & VarLayoutFlag::HasSemantic) + { + Emit(" : "); + emit(varLayout->semanticName); + if(varLayout->semanticIndex) + { + Emit(varLayout->semanticIndex); + } + + return; + } + } + } + + // TODO(tfoley): should we ever need to use the high-level declaration + // for this? It seems like the wrong approach... + auto decoration = inst->findDecoration<IRHighLevelDeclDecoration>(); if( decoration ) { diff --git a/source/slang/glsl.meta.slang.h b/source/slang/glsl.meta.slang.h index e43a51ea9..a4aade3c2 100644 --- a/source/slang/glsl.meta.slang.h +++ b/source/slang/glsl.meta.slang.h @@ -173,7 +173,7 @@ sb << "syntax patch : GLSLPatchModifier;\n"; // [GLSL 4.5] Interpolation Qualifiers sb << "syntax smooth : SimpleModifier;\n"; sb << "syntax flat : SimpleModifier;\n"; -sb << "syntax noperspectie : SimpleModifier;\n"; +sb << "syntax noperspective : SimpleModifier;\n"; // [GLSL 4.3.2] Constant Qualifier diff --git a/source/slang/ir.cpp b/source/slang/ir.cpp index 5ace50397..4c01e4fc1 100644 --- a/source/slang/ir.cpp +++ b/source/slang/ir.cpp @@ -3094,6 +3094,31 @@ namespace Slang clonedFunc, entryPointLayout); + // We will also go on and attach layout information + // to the function parameters, so that we have it + // available directly on the parameters, rather + // than having to look it up on the original entry-point layout. + if( auto firstBlock = clonedFunc->getFirstBlock() ) + { + UInt paramLayoutCount = entryPointLayout->fields.Count(); + UInt paramCounter = 0; + for( auto pp = firstBlock->getFirstParam(); pp; pp = pp->getNextParam() ) + { + UInt paramIndex = paramCounter++; + if( paramIndex < paramLayoutCount ) + { + auto paramLayout = entryPointLayout->fields[paramIndex]; + context->builder->addLayoutDecoration( + pp, + paramLayout); + } + else + { + SLANG_UNEXPECTED("too many parameters"); + } + } + } + return clonedFunc; } diff --git a/source/slang/slang.cpp b/source/slang/slang.cpp index dff322c29..da7601d41 100644 --- a/source/slang/slang.cpp +++ b/source/slang/slang.cpp @@ -918,6 +918,7 @@ SLANG_API int spCompile( catch (...) { req->mSink.diagnose(Slang::SourceLoc(), Slang::Diagnostics::compilationAborted); + req->mDiagnosticOutput = req->mSink.outputBuffer.ProduceString(); return 1; } #else |
