diff options
| author | Yong He <yonghe@outlook.com> | 2017-10-23 10:44:08 -0400 |
|---|---|---|
| committer | Yong He <yonghe@outlook.com> | 2017-10-23 10:44:08 -0400 |
| commit | 4d6be3588ac5b5b62e19900b12de90ce1e1ff744 (patch) | |
| tree | 43fb004d9283849c670dfd869d75b8f621036b9e /source | |
| parent | cc6184ebc4d0611be892eaff119de99f8b9e1ca6 (diff) | |
| parent | 624d122a3a110922cd54aab7bbf13f1cac8fbbff (diff) | |
Merge https://github.com/shader-slang/slang
Diffstat (limited to 'source')
| -rw-r--r-- | source/slang/emit.cpp | 31 | ||||
| -rw-r--r-- | source/slang/ir.cpp | 25 | ||||
| -rw-r--r-- | source/slang/slang.cpp | 1 |
3 files changed, 57 insertions, 0 deletions
diff --git a/source/slang/emit.cpp b/source/slang/emit.cpp index da9489a75..f76ab1db1 100644 --- a/source/slang/emit.cpp +++ b/source/slang/emit.cpp @@ -5091,6 +5091,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/ir.cpp b/source/slang/ir.cpp index 4bf9de5d3..14639de7e 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 |
