From 7c8527d20e433c3a10736136d31e4cd882a3baaa Mon Sep 17 00:00:00 2001 From: jsmall-nvidia Date: Fri, 4 Oct 2019 09:46:03 -0400 Subject: IR types for subset of Attributes (#1067) * IROutputControlPointsDecoration * IROutputTopologyDecoration * IRPartitioningDecoration * IRDomainDecoration * Use IRPatchConstantDecoration alone for hlsl output. * IRMaxVertexCountDecoration * IRInstanceDecoration * Removed _emitHLSLAttributeSingleString and _emitHLSLAttributeSingleInt Removed GLSLBindingAttribute and just use NumThreadsAttribute * Added IRNumThreadsDecoration. * Added IRNumThreadsDecoration * Fix build problem on x86. Improve diagnostic text based on review. --- source/slang/slang-emit-hlsl.cpp | 127 ++++++++++++--------------------------- 1 file changed, 39 insertions(+), 88 deletions(-) (limited to 'source/slang/slang-emit-hlsl.cpp') diff --git a/source/slang/slang-emit-hlsl.cpp b/source/slang/slang-emit-hlsl.cpp index 4abd692f8..a5c4ae088 100644 --- a/source/slang/slang-emit-hlsl.cpp +++ b/source/slang/slang-emit-hlsl.cpp @@ -10,58 +10,29 @@ namespace Slang { - -void HLSLSourceEmitter::_emitHLSLAttributeSingleString(const char* name, FuncDecl* entryPoint, Attribute* attrib) +void HLSLSourceEmitter::_emitHLSLDecorationSingleString(const char* name, IRFunc* entryPoint, IRStringLit* val) { - assert(attrib); - - attrib->args.getCount(); - if (attrib->args.getCount() != 1) - { - SLANG_DIAGNOSE_UNEXPECTED(getSink(), entryPoint->loc, "Attribute expects single parameter"); - return; - } - - Expr* expr = attrib->args[0]; - - auto stringLitExpr = as(expr); - if (!stringLitExpr) - { - SLANG_DIAGNOSE_UNEXPECTED(getSink(), entryPoint->loc, "Attribute parameter expecting to be a string "); - return; - } + SLANG_UNUSED(entryPoint); + assert(val); m_writer->emit("["); m_writer->emit(name); m_writer->emit("(\""); - m_writer->emit(stringLitExpr->value); + m_writer->emit(val->getStringSlice()); m_writer->emit("\")]\n"); } -void HLSLSourceEmitter::_emitHLSLAttributeSingleInt(const char* name, FuncDecl* entryPoint, Attribute* attrib) +void HLSLSourceEmitter::_emitHLSLDecorationSingleInt(const char* name, IRFunc* entryPoint, IRIntLit* val) { - assert(attrib); + SLANG_UNUSED(entryPoint); + SLANG_ASSERT(val); - attrib->args.getCount(); - if (attrib->args.getCount() != 1) - { - SLANG_DIAGNOSE_UNEXPECTED(getSink(), entryPoint->loc, "Attribute expects single parameter"); - return; - } - - Expr* expr = attrib->args[0]; - - auto intLitExpr = as(expr); - if (!intLitExpr) - { - SLANG_DIAGNOSE_UNEXPECTED(getSink(), entryPoint->loc, "Attribute expects an int"); - return; - } + auto intVal = GetIntVal(val); m_writer->emit("["); m_writer->emit(name); m_writer->emit("("); - m_writer->emit(intLitExpr->value); + m_writer->emit(intVal); m_writer->emit(")]\n"); } @@ -272,19 +243,11 @@ void HLSLSourceEmitter::_emitHLSLEntryPointAttributes(IRFunc* irFunc, EntryPoint { case Stage::Compute: { - static const UInt kAxisCount = 3; - UInt sizeAlongAxis[kAxisCount]; - - // TODO: this is kind of gross because we are using a public - // reflection API function, rather than some kind of internal - // utility it forwards to... - spReflectionEntryPoint_getComputeThreadGroupSize( - (SlangReflectionEntryPoint*)entryPointLayout, - kAxisCount, - &sizeAlongAxis[0]); + Int sizeAlongAxis[kThreadGroupAxisCount]; + getComputeThreadGroupSize(irFunc, sizeAlongAxis); m_writer->emit("[numthreads("); - for (int ii = 0; ii < 3; ++ii) + for (int ii = 0; ii < kThreadGroupAxisCount; ++ii) { if (ii != 0) m_writer->emit(", "); m_writer->emit(sizeAlongAxis[ii]); @@ -294,29 +257,30 @@ void HLSLSourceEmitter::_emitHLSLEntryPointAttributes(IRFunc* irFunc, EntryPoint break; case Stage::Geometry: { - if (auto attrib = entryPointLayout->getFuncDecl()->FindModifier()) + if (auto decor = irFunc->findDecoration()) { + auto count = GetIntVal(decor->getCount()); m_writer->emit("[maxvertexcount("); - m_writer->emit(attrib->value); + m_writer->emit(Int(count)); m_writer->emit(")]\n"); } - if (auto attrib = entryPointLayout->getFuncDecl()->FindModifier()) + + if (auto decor = irFunc->findDecoration()) { + auto count = GetIntVal(decor->getCount()); m_writer->emit("[instance("); - m_writer->emit(attrib->value); + m_writer->emit(Int(count)); m_writer->emit(")]\n"); } break; } case Stage::Domain: { - FuncDecl* entryPoint = entryPointLayout->entryPoint; /* [domain("isoline")] */ - if (auto attrib = entryPoint->FindModifier()) + if (auto decor = irFunc->findDecoration()) { - _emitHLSLAttributeSingleString("domain", entryPoint, attrib); + _emitHLSLDecorationSingleString("domain", irFunc, decor->getDomain()); } - break; } case Stage::Hull: @@ -324,32 +288,38 @@ void HLSLSourceEmitter::_emitHLSLEntryPointAttributes(IRFunc* irFunc, EntryPoint // Lists these are only attributes for hull shader // https://docs.microsoft.com/en-us/windows/desktop/direct3d11/direct3d-11-advanced-stages-hull-shader-design - FuncDecl* entryPoint = entryPointLayout->entryPoint; - /* [domain("isoline")] */ - if (auto attrib = entryPoint->FindModifier()) + if (auto decor = irFunc->findDecoration()) { - _emitHLSLAttributeSingleString("domain", entryPoint, attrib); + _emitHLSLDecorationSingleString("domain", irFunc, decor->getDomain()); } + /* [domain("partitioning")] */ - if (auto attrib = entryPoint->FindModifier()) + if (auto decor = irFunc->findDecoration()) { - _emitHLSLAttributeSingleString("partitioning", entryPoint, attrib); + _emitHLSLDecorationSingleString("partitioning", irFunc, decor->getPartitioning()); } + /* [outputtopology("line")] */ - if (auto attrib = entryPoint->FindModifier()) + if (auto decor = irFunc->findDecoration()) { - _emitHLSLAttributeSingleString("outputtopology", entryPoint, attrib); + _emitHLSLDecorationSingleString("outputtopology", irFunc, decor->getTopology()); } + /* [outputcontrolpoints(4)] */ - if (auto attrib = entryPoint->FindModifier()) + if (auto decor = irFunc->findDecoration()) { - _emitHLSLAttributeSingleInt("outputcontrolpoints", entryPoint, attrib); + _emitHLSLDecorationSingleInt("outputcontrolpoints", irFunc, decor->getControlPointCount()); } + /* [patchconstantfunc("HSConst")] */ - if (auto attrib = entryPoint->FindModifier()) + if (auto decor = irFunc->findDecoration()) { - _emitHLSLFuncDeclPatchConstantFuncAttribute(irFunc, entryPoint, attrib); + const String irName = getName(decor->getFunc()); + + m_writer->emit("[patchconstantfunc(\""); + m_writer->emit(irName); + m_writer->emit("\")]\n"); } break; @@ -422,25 +392,6 @@ void HLSLSourceEmitter::_emitHLSLTextureType(IRTextureTypeBase* texType) m_writer->emit(" >"); } -void HLSLSourceEmitter::_emitHLSLFuncDeclPatchConstantFuncAttribute(IRFunc* irFunc, FuncDecl* entryPoint, PatchConstantFuncAttribute* attrib) -{ - SLANG_UNUSED(attrib); - - auto irPatchFunc = irFunc->findDecoration(); - assert(irPatchFunc); - if (!irPatchFunc) - { - SLANG_DIAGNOSE_UNEXPECTED(getSink(), entryPoint->loc, "Unable to find [patchConstantFunc(...)] decoration"); - return; - } - - const String irName = getName(irPatchFunc->getFunc()); - - m_writer->emit("[patchconstantfunc(\""); - m_writer->emit(irName); - m_writer->emit("\")]\n"); -} - void HLSLSourceEmitter::emitLayoutSemanticsImpl(IRInst* inst, char const* uniformSemanticSpelling) { auto layout = getVarLayout(inst); -- cgit v1.2.3