From 94dfb7a5238917d9a979e3c67dfbcf31cb81bcd3 Mon Sep 17 00:00:00 2001 From: John Kessenich Date: Wed, 18 Jan 2017 16:45:02 -0700 Subject: [PATCH] Non-functional: Factor out entry-point logic from handleFunctionDefinition(). --- glslang/Include/revision.h | 4 +-- hlsl/hlslParseHelper.cpp | 67 +++++++++++++++++++++++++++------------------- hlsl/hlslParseHelper.h | 1 + 3 files changed, 43 insertions(+), 29 deletions(-) diff --git a/glslang/Include/revision.h b/glslang/Include/revision.h index f66d302..64f0f1f 100644 --- a/glslang/Include/revision.h +++ b/glslang/Include/revision.h @@ -2,5 +2,5 @@ // For the version, it uses the latest git tag followed by the number of commits. // For the date, it uses the current date (when then script is run). -#define GLSLANG_REVISION "Overload400-PrecQual.1770" -#define GLSLANG_DATE "13-Jan-2017" +#define GLSLANG_REVISION "Overload400-PrecQual.1772" +#define GLSLANG_DATE "18-Jan-2017" diff --git a/hlsl/hlslParseHelper.cpp b/hlsl/hlslParseHelper.cpp index 2e5b733..45df546 100755 --- a/hlsl/hlslParseHelper.cpp +++ b/hlsl/hlslParseHelper.cpp @@ -1572,20 +1572,9 @@ TIntermAggregate* HlslParseContext::handleFunctionDefinition(const TSourceLoc& l currentFunctionType = new TType(EbtVoid); functionReturnsValue = false; - inEntryPoint = function.getName().compare(intermediate.getEntryPointName().c_str()) == 0; - if (inEntryPoint) { - intermediate.setEntryPointMangledName(function.getMangledName().c_str()); - intermediate.incrementEntryPointCount(); - remapEntryPointIO(function); - if (entryPointOutput) { - if (shouldFlatten(entryPointOutput->getType())) - flatten(loc, *entryPointOutput); - if (shouldSplit(entryPointOutput->getType())) - split(*entryPointOutput); - assignLocations(*entryPointOutput); - } - } else - remapNonEntryPointIO(function); + // Entry points need different I/O and other handling, transform it so the + // rest of this function doesn't care. + transformEntryPoint(loc, function, attributes); // Insert the $Global constant buffer. // TODO: this design fails if new members are declared between function definitions. @@ -1649,23 +1638,47 @@ TIntermAggregate* HlslParseContext::handleFunctionDefinition(const TSourceLoc& l controlFlowNestingLevel = 0; postEntryPointReturn = false; - // Handle function attributes - if (inEntryPoint) { - const TIntermAggregate* numThreads = attributes[EatNumThreads]; - if (numThreads != nullptr) { - const TIntermSequence& sequence = numThreads->getSequence(); + return paramNodes; +} - for (int lid = 0; lid < int(sequence.size()); ++lid) - intermediate.setLocalSize(lid, sequence[lid]->getAsConstantUnion()->getConstArray()[0].getIConst()); - } +// +// Do all special handling for the entry point. +// +void HlslParseContext::transformEntryPoint(const TSourceLoc& loc, TFunction& function, const TAttributeMap& attributes) +{ + inEntryPoint = function.getName().compare(intermediate.getEntryPointName().c_str()) == 0; - const TIntermAggregate* maxVertexCount = attributes[EatMaxVertexCount]; - if (maxVertexCount != nullptr) { - intermediate.setVertices(maxVertexCount->getSequence()[0]->getAsConstantUnion()->getConstArray()[0].getIConst()); - } + if (!inEntryPoint) { + remapNonEntryPointIO(function); + return; } - return paramNodes; + // entry point logic... + + intermediate.setEntryPointMangledName(function.getMangledName().c_str()); + intermediate.incrementEntryPointCount(); + + // Handle parameters and return value + remapEntryPointIO(function); + if (entryPointOutput) { + if (shouldFlatten(entryPointOutput->getType())) + flatten(loc, *entryPointOutput); + if (shouldSplit(entryPointOutput->getType())) + split(*entryPointOutput); + assignLocations(*entryPointOutput); + } + + // Handle function attributes + const TIntermAggregate* numThreads = attributes[EatNumThreads]; + if (numThreads != nullptr) { + const TIntermSequence& sequence = numThreads->getSequence(); + + for (int lid = 0; lid < int(sequence.size()); ++lid) + intermediate.setLocalSize(lid, sequence[lid]->getAsConstantUnion()->getConstArray()[0].getIConst()); + } + const TIntermAggregate* maxVertexCount = attributes[EatMaxVertexCount]; + if (maxVertexCount != nullptr) + intermediate.setVertices(maxVertexCount->getSequence()[0]->getAsConstantUnion()->getConstArray()[0].getIConst()); } void HlslParseContext::handleFunctionBody(const TSourceLoc& loc, TFunction& function, TIntermNode* functionBody, TIntermNode*& node) diff --git a/hlsl/hlslParseHelper.h b/hlsl/hlslParseHelper.h index cd3ac95..1bfca8f 100755 --- a/hlsl/hlslParseHelper.h +++ b/hlsl/hlslParseHelper.h @@ -73,6 +73,7 @@ public: void assignLocations(TVariable& variable); TFunction& handleFunctionDeclarator(const TSourceLoc&, TFunction& function, bool prototype); TIntermAggregate* handleFunctionDefinition(const TSourceLoc&, TFunction&, const TAttributeMap&); + void transformEntryPoint(const TSourceLoc&, TFunction&, const TAttributeMap&); void handleFunctionBody(const TSourceLoc&, TFunction&, TIntermNode* functionBody, TIntermNode*& node); void remapEntryPointIO(TFunction& function); void remapNonEntryPointIO(TFunction& function); -- 2.7.4