Commit 8bb3ee53 by t.jung Committed by Tiemo Jung

added semantic handling and support for remapping variables with semantics

Change-Id: I3c6b5fc1d4f1da6ec6f436fea72849453a13559d
parent 7225a1cb
...@@ -392,6 +392,7 @@ public: ...@@ -392,6 +392,7 @@ public:
void clear() void clear()
{ {
semanticName = nullptr;
precision = EpqNone; precision = EpqNone;
invariant = false; invariant = false;
noContraction = false; noContraction = false;
...@@ -401,6 +402,7 @@ public: ...@@ -401,6 +402,7 @@ public:
// drop qualifiers that don't belong in a temporary variable // drop qualifiers that don't belong in a temporary variable
void makeTemporary() void makeTemporary()
{ {
semanticName = nullptr;
storage = EvqTemporary; storage = EvqTemporary;
builtIn = EbvNone; builtIn = EbvNone;
clearInterstage(); clearInterstage();
...@@ -445,10 +447,17 @@ public: ...@@ -445,10 +447,17 @@ public:
// If A, then nothing should change, if B, then everything should change, but this is half way. // If A, then nothing should change, if B, then everything should change, but this is half way.
void makePartialTemporary() void makePartialTemporary()
{ {
semanticName = nullptr;
storage = EvqTemporary; storage = EvqTemporary;
specConstant = false; specConstant = false;
} }
bool hasSemantic() const
{
return semanticName != nullptr;
}
const char* semanticName;
TStorageQualifier storage : 6; TStorageQualifier storage : 6;
TBuiltInVariable builtIn : 8; TBuiltInVariable builtIn : 8;
TPrecisionQualifier precision : 3; TPrecisionQualifier precision : 3;
......
...@@ -420,6 +420,11 @@ public: ...@@ -420,6 +420,11 @@ public:
bool getGeoPassthroughEXT() const { return geoPassthroughEXT; } bool getGeoPassthroughEXT() const { return geoPassthroughEXT; }
#endif #endif
const char* addSemanticName(const TString& name)
{
return semanticNameSet.insert(name).first->c_str();
}
protected: protected:
TIntermSymbol* addSymbol(int Id, const TString&, const TType&, const TConstUnionArray&, TIntermTyped* subtree, const TSourceLoc&); TIntermSymbol* addSymbol(int Id, const TString&, const TType&, const TConstUnionArray&, TIntermTyped* subtree, const TSourceLoc&);
void error(TInfoSink& infoSink, const char*); void error(TInfoSink& infoSink, const char*);
...@@ -497,6 +502,7 @@ protected: ...@@ -497,6 +502,7 @@ protected:
std::vector<TOffsetRange> usedAtomics; // sets of bindings used by atomic counters std::vector<TOffsetRange> usedAtomics; // sets of bindings used by atomic counters
std::vector<TXfbBuffer> xfbBuffers; // all the data we need to track per xfb buffer std::vector<TXfbBuffer> xfbBuffers; // all the data we need to track per xfb buffer
std::unordered_set<int> usedConstantId; // specialization constant ids used std::unordered_set<int> usedConstantId; // specialization constant ids used
std::set<TString> semanticNameSet;
private: private:
void operator=(TIntermediate&); // prevent assignments void operator=(TIntermediate&); // prevent assignments
......
...@@ -459,10 +459,12 @@ class TIoMapper; ...@@ -459,10 +459,12 @@ class TIoMapper;
// and resolveSet are invoked to resolve the binding and descriptor // and resolveSet are invoked to resolve the binding and descriptor
// set index respectively. // set index respectively.
// Invocations happen in a particular order: // Invocations happen in a particular order:
// 1) var with binding and set already defined // 1) all shader inputs
// 2) var with binding but no set defined // 2) all shader outputs
// 3) var with set but no binding defined // 3) all uniforms with binding and set already defined
// 4) var with no binding and no set defined // 4) all uniforms with binding but no set defined
// 5) all uniforms with set but no binding defined
// 6) all uniforms with no binding and no set defined
// //
// NOTE: that still limit checks are applied to bindings and sets // NOTE: that still limit checks are applied to bindings and sets
// and may result in an error. // and may result in an error.
...@@ -480,6 +482,18 @@ public: ...@@ -480,6 +482,18 @@ public:
// Should return a value >= 0 if the current set should be overriden. // Should return a value >= 0 if the current set should be overriden.
// Return -1 if the current set (including no set) should be kept. // Return -1 if the current set (including no set) should be kept.
virtual int resolveSet(EShLanguage stage, const char* name, const TType& type, bool is_live) = 0; virtual int resolveSet(EShLanguage stage, const char* name, const TType& type, bool is_live) = 0;
// Should return true if the resuling/current setup would be ok.
// Basic idea is to do aliasing checks and reject invalid semantic names.
virtual bool validateInOut(EShLanguage stage, const char* name, const TType& type, bool is_live) = 0;
// Should return a value >= 0 if the current location should be overriden.
// Return -1 if the current location (including no location) should be kept.
virtual int resolveInOutLocation(EShLanguage stage, const char* name, const TType& type, bool is_live) = 0;
// Should return a value >= 0 if the current component index should be overriden.
// Return -1 if the current component index (including no index) should be kept.
virtual int resolveInOutComponent(EShLanguage stage, const char* name, const TType& type, bool is_live) = 0;
// Should return a value >= 0 if the current color index should be overriden.
// Return -1 if the current color index (including no index) should be kept.
virtual int resolveInOutIndex(EShLanguage stage, const char* name, const TType& type, bool is_live) = 0;
}; };
// Make one TProgram per set of shaders that will get linked together. Add all // Make one TProgram per set of shaders that will get linked together. Add all
......
...@@ -3808,6 +3808,7 @@ void HlslParseContext::handleSemantic(TSourceLoc loc, TQualifier& qualifier, con ...@@ -3808,6 +3808,7 @@ void HlslParseContext::handleSemantic(TSourceLoc loc, TQualifier& qualifier, con
// Also, in DX10 if a SV value is present as the input of a stage, but isn't appropriate for that // Also, in DX10 if a SV value is present as the input of a stage, but isn't appropriate for that
// stage, it would just be ignored as it is likely there as part of an output struct from one stage // stage, it would just be ignored as it is likely there as part of an output struct from one stage
// to the next // to the next
qualifier.semanticName = intermediate.addSemanticName(semanticUpperCase);
bool bParseDX9 = false; bool bParseDX9 = false;
if (bParseDX9) { if (bParseDX9) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment