From b69e8f3aca6ebe3c71f6ff1a858744c4cbaa3146 Mon Sep 17 00:00:00 2001 From: Roy Date: Mon, 2 Sep 2019 15:01:06 +0800 Subject: [PATCH] Adjusting code interface glslang/include/intermediate.h -> Add a new interface to set TIntermBranch's expression. glslang/include/Types.h -> Add interface to set Type's basicType and add interface to get basicType form a TSampler. glslang/MachineIndependent/intermediate.cpp -> Part of the code in createConversion been encapsulating as a new function called buildConvertOp glslang/MachineIndependent/localintermediate.h -> Export createConversion and buildConvertOp as a public function glslang/Public/ShaderLang.h -> Add interface to get shader object and shader source. --- glslang/Include/Types.h | 5 +- glslang/Include/intermediate.h | 1 + glslang/MachineIndependent/Intermediate.cpp | 149 +++++++++++++------------ glslang/MachineIndependent/localintermediate.h | 8 +- glslang/Public/ShaderLang.h | 4 +- 5 files changed, 92 insertions(+), 75 deletions(-) diff --git a/glslang/Include/Types.h b/glslang/Include/Types.h index 3140006..2093606 100644 --- a/glslang/Include/Types.h +++ b/glslang/Include/Types.h @@ -135,6 +135,8 @@ struct TSampler { // misnomer now; includes images, textures without sampler, bool isYuv() const { return yuv; } #endif void setCombined(bool c) { combined = c; } + void setBasicType(TBasicType t) { type = t; }; + TBasicType getBasicType() const { return type; }; bool isShadow() const { return shadow; } bool isArrayed() const { return arrayed; } @@ -2184,7 +2186,8 @@ public: const TTypeList* getStruct() const { assert(isStruct()); return structure; } void setStruct(TTypeList* s) { assert(isStruct()); structure = s; } TTypeList* getWritableStruct() const { assert(isStruct()); return structure; } // This should only be used when known to not be sharing with other threads - + void setBasicType(const TBasicType& t) { basicType = t; } + int computeNumComponents() const { int components = 0; diff --git a/glslang/Include/intermediate.h b/glslang/Include/intermediate.h index 3a7405a..079984f 100644 --- a/glslang/Include/intermediate.h +++ b/glslang/Include/intermediate.h @@ -1185,6 +1185,7 @@ public: virtual void traverse(TIntermTraverser*); TOperator getFlowOp() const { return flowOp; } TIntermTyped* getExpression() const { return expression; } + void setExpression(TIntermTyped* pExpression) { expression = pExpression; } protected: TOperator flowOp; TIntermTyped* expression; diff --git a/glslang/MachineIndependent/Intermediate.cpp b/glslang/MachineIndependent/Intermediate.cpp index 93d41f7..62af2b6 100644 --- a/glslang/MachineIndependent/Intermediate.cpp +++ b/glslang/MachineIndependent/Intermediate.cpp @@ -562,56 +562,12 @@ bool TIntermediate::isConversionAllowed(TOperator op, TIntermTyped* node) const return true; } -// This is 'mechanism' here, it does any conversion told. -// It is about basic type, not about shape. -// The policy comes from the shader or the calling code. -TIntermTyped* TIntermediate::createConversion(TBasicType convertTo, TIntermTyped* node) const +bool TIntermediate::buildConvertOp(TBasicType dst, TBasicType src, TOperator& newOp) const { - // - // Add a new newNode for the conversion. - // - TIntermUnary* newNode = nullptr; - - TOperator newOp = EOpNull; - - bool convertToIntTypes = (convertTo == EbtInt8 || convertTo == EbtUint8 || - convertTo == EbtInt16 || convertTo == EbtUint16 || - convertTo == EbtInt || convertTo == EbtUint || - convertTo == EbtInt64 || convertTo == EbtUint64); - - bool convertFromIntTypes = (node->getBasicType() == EbtInt8 || node->getBasicType() == EbtUint8 || - node->getBasicType() == EbtInt16 || node->getBasicType() == EbtUint16 || - node->getBasicType() == EbtInt || node->getBasicType() == EbtUint || - node->getBasicType() == EbtInt64 || node->getBasicType() == EbtUint64); - - bool convertToFloatTypes = (convertTo == EbtFloat16 || convertTo == EbtFloat || convertTo == EbtDouble); - - bool convertFromFloatTypes = (node->getBasicType() == EbtFloat16 || - node->getBasicType() == EbtFloat || - node->getBasicType() == EbtDouble); - - if (! getArithemeticInt8Enabled()) { - if (((convertTo == EbtInt8 || convertTo == EbtUint8) && ! convertFromIntTypes) || - ((node->getBasicType() == EbtInt8 || node->getBasicType() == EbtUint8) && ! convertToIntTypes)) - return nullptr; - } - - if (! getArithemeticInt16Enabled()) { - if (((convertTo == EbtInt16 || convertTo == EbtUint16) && ! convertFromIntTypes) || - ((node->getBasicType() == EbtInt16 || node->getBasicType() == EbtUint16) && ! convertToIntTypes)) - return nullptr; - } - - if (! getArithemeticFloat16Enabled()) { - if ((convertTo == EbtFloat16 && ! convertFromFloatTypes) || - (node->getBasicType() == EbtFloat16 && ! convertToFloatTypes)) - return nullptr; - } - - switch (convertTo) { + switch (dst) { #ifndef GLSLANG_WEB case EbtDouble: - switch (node->getBasicType()) { + switch (src) { case EbtUint: newOp = EOpConvUintToDouble; break; case EbtBool: newOp = EOpConvBoolToDouble; break; case EbtFloat: newOp = EOpConvFloatToDouble; break; @@ -624,12 +580,12 @@ TIntermTyped* TIntermediate::createConversion(TBasicType convertTo, TIntermTyped case EbtInt64: newOp = EOpConvInt64ToDouble; break; case EbtUint64: newOp = EOpConvUint64ToDouble; break; default: - return nullptr; + return false; } break; #endif case EbtFloat: - switch (node->getBasicType()) { + switch (src) { case EbtInt: newOp = EOpConvIntToFloat; break; case EbtUint: newOp = EOpConvUintToFloat; break; case EbtBool: newOp = EOpConvBoolToFloat; break; @@ -644,12 +600,12 @@ TIntermTyped* TIntermediate::createConversion(TBasicType convertTo, TIntermTyped case EbtUint64: newOp = EOpConvUint64ToFloat; break; #endif default: - return nullptr; + return false; } break; #ifndef GLSLANG_WEB case EbtFloat16: - switch (node->getBasicType()) { + switch (src) { case EbtInt8: newOp = EOpConvInt8ToFloat16; break; case EbtUint8: newOp = EOpConvUint8ToFloat16; break; case EbtInt16: newOp = EOpConvInt16ToFloat16; break; @@ -662,12 +618,12 @@ TIntermTyped* TIntermediate::createConversion(TBasicType convertTo, TIntermTyped case EbtInt64: newOp = EOpConvInt64ToFloat16; break; case EbtUint64: newOp = EOpConvUint64ToFloat16; break; default: - return nullptr; + return false; } break; #endif case EbtBool: - switch (node->getBasicType()) { + switch (src) { case EbtInt: newOp = EOpConvIntToBool; break; case EbtUint: newOp = EOpConvUintToBool; break; case EbtFloat: newOp = EOpConvFloatToBool; break; @@ -682,12 +638,12 @@ TIntermTyped* TIntermediate::createConversion(TBasicType convertTo, TIntermTyped case EbtUint64: newOp = EOpConvUint64ToBool; break; #endif default: - return nullptr; + return false; } break; #ifndef GLSLANG_WEB case EbtInt8: - switch (node->getBasicType()) { + switch (src) { case EbtUint8: newOp = EOpConvUint8ToInt8; break; case EbtInt16: newOp = EOpConvInt16ToInt8; break; case EbtUint16: newOp = EOpConvUint16ToInt8; break; @@ -700,11 +656,11 @@ TIntermTyped* TIntermediate::createConversion(TBasicType convertTo, TIntermTyped case EbtDouble: newOp = EOpConvDoubleToInt8; break; case EbtFloat16: newOp = EOpConvFloat16ToInt8; break; default: - return nullptr; + return false; } break; case EbtUint8: - switch (node->getBasicType()) { + switch (src) { case EbtInt8: newOp = EOpConvInt8ToUint8; break; case EbtInt16: newOp = EOpConvInt16ToUint8; break; case EbtUint16: newOp = EOpConvUint16ToUint8; break; @@ -717,12 +673,12 @@ TIntermTyped* TIntermediate::createConversion(TBasicType convertTo, TIntermTyped case EbtDouble: newOp = EOpConvDoubleToUint8; break; case EbtFloat16: newOp = EOpConvFloat16ToUint8; break; default: - return nullptr; + return false; } break; case EbtInt16: - switch (node->getBasicType()) { + switch (src) { case EbtUint8: newOp = EOpConvUint8ToInt16; break; case EbtInt8: newOp = EOpConvInt8ToInt16; break; case EbtUint16: newOp = EOpConvUint16ToInt16; break; @@ -735,11 +691,11 @@ TIntermTyped* TIntermediate::createConversion(TBasicType convertTo, TIntermTyped case EbtDouble: newOp = EOpConvDoubleToInt16; break; case EbtFloat16: newOp = EOpConvFloat16ToInt16; break; default: - return nullptr; + return false; } break; case EbtUint16: - switch (node->getBasicType()) { + switch (src) { case EbtInt8: newOp = EOpConvInt8ToUint16; break; case EbtUint8: newOp = EOpConvUint8ToUint16; break; case EbtInt16: newOp = EOpConvInt16ToUint16; break; @@ -752,13 +708,13 @@ TIntermTyped* TIntermediate::createConversion(TBasicType convertTo, TIntermTyped case EbtDouble: newOp = EOpConvDoubleToUint16; break; case EbtFloat16: newOp = EOpConvFloat16ToUint16; break; default: - return nullptr; + return false; } break; #endif case EbtInt: - switch (node->getBasicType()) { + switch (src) { case EbtUint: newOp = EOpConvUintToInt; break; case EbtBool: newOp = EOpConvBoolToInt; break; case EbtFloat: newOp = EOpConvFloatToInt; break; @@ -773,11 +729,11 @@ TIntermTyped* TIntermediate::createConversion(TBasicType convertTo, TIntermTyped case EbtUint64: newOp = EOpConvUint64ToInt; break; #endif default: - return nullptr; + return false; } break; case EbtUint: - switch (node->getBasicType()) { + switch (src) { case EbtInt: newOp = EOpConvIntToUint; break; case EbtBool: newOp = EOpConvBoolToUint; break; case EbtFloat: newOp = EOpConvFloatToUint; break; @@ -792,12 +748,12 @@ TIntermTyped* TIntermediate::createConversion(TBasicType convertTo, TIntermTyped case EbtUint64: newOp = EOpConvUint64ToUint; break; #endif default: - return nullptr; + return false; } break; #ifndef GLSLANG_WEB case EbtInt64: - switch (node->getBasicType()) { + switch (src) { case EbtInt8: newOp = EOpConvInt8ToInt64; break; case EbtUint8: newOp = EOpConvUint8ToInt64; break; case EbtInt16: newOp = EOpConvInt16ToInt64; break; @@ -810,11 +766,11 @@ TIntermTyped* TIntermediate::createConversion(TBasicType convertTo, TIntermTyped case EbtFloat16: newOp = EOpConvFloat16ToInt64; break; case EbtUint64: newOp = EOpConvUint64ToInt64; break; default: - return nullptr; + return false; } break; case EbtUint64: - switch (node->getBasicType()) { + switch (src) { case EbtInt8: newOp = EOpConvInt8ToUint64; break; case EbtUint8: newOp = EOpConvUint8ToUint64; break; case EbtInt16: newOp = EOpConvInt16ToUint64; break; @@ -827,11 +783,64 @@ TIntermTyped* TIntermediate::createConversion(TBasicType convertTo, TIntermTyped case EbtFloat16: newOp = EOpConvFloat16ToUint64; break; case EbtInt64: newOp = EOpConvInt64ToUint64; break; default: - return nullptr; + return false; } break; #endif default: + return false; + } + return true; +} + +// This is 'mechanism' here, it does any conversion told. +// It is about basic type, not about shape. +// The policy comes from the shader or the calling code. +TIntermTyped* TIntermediate::createConversion(TBasicType convertTo, TIntermTyped* node) const +{ + // + // Add a new newNode for the conversion. + // + TIntermUnary* newNode = nullptr; + + TOperator newOp = EOpNull; + + bool convertToIntTypes = (convertTo == EbtInt8 || convertTo == EbtUint8 || + convertTo == EbtInt16 || convertTo == EbtUint16 || + convertTo == EbtInt || convertTo == EbtUint || + convertTo == EbtInt64 || convertTo == EbtUint64); + + bool convertFromIntTypes = (node->getBasicType() == EbtInt8 || node->getBasicType() == EbtUint8 || + node->getBasicType() == EbtInt16 || node->getBasicType() == EbtUint16 || + node->getBasicType() == EbtInt || node->getBasicType() == EbtUint || + node->getBasicType() == EbtInt64 || node->getBasicType() == EbtUint64); + + bool convertToFloatTypes = (convertTo == EbtFloat16 || convertTo == EbtFloat || convertTo == EbtDouble); + + bool convertFromFloatTypes = (node->getBasicType() == EbtFloat16 || + node->getBasicType() == EbtFloat || + node->getBasicType() == EbtDouble); + + if (! getArithemeticInt8Enabled()) { + if (((convertTo == EbtInt8 || convertTo == EbtUint8) && ! convertFromIntTypes) || + ((node->getBasicType() == EbtInt8 || node->getBasicType() == EbtUint8) && ! convertToIntTypes)) + return nullptr; + } + + if (! getArithemeticInt16Enabled()) { + if (((convertTo == EbtInt16 || convertTo == EbtUint16) && ! convertFromIntTypes) || + ((node->getBasicType() == EbtInt16 || node->getBasicType() == EbtUint16) && ! convertToIntTypes)) + return nullptr; + } + + if (! getArithemeticFloat16Enabled()) { + if ((convertTo == EbtFloat16 && ! convertFromFloatTypes) || + (node->getBasicType() == EbtFloat16 && ! convertToFloatTypes)) + return nullptr; + } + + if (!buildConvertOp(convertTo, node->getBasicType(), newOp)) + { return nullptr; } diff --git a/glslang/MachineIndependent/localintermediate.h b/glslang/MachineIndependent/localintermediate.h index 77ed7c3..ad0b0fd 100644 --- a/glslang/MachineIndependent/localintermediate.h +++ b/glslang/MachineIndependent/localintermediate.h @@ -693,9 +693,9 @@ public: bool getPixelCenterInteger() const { return pixelCenterInteger; } void addBlendEquation(TBlendEquationShift b) { blendEquations |= (1 << b); } unsigned int getBlendEquations() const { return blendEquations; } - bool setXfbBufferStride(int buffer, unsigned stride) + bool setXfbBufferStride(int buffer, unsigned stride, bool force = false) { - if (xfbBuffers[buffer].stride != TQualifier::layoutXfbStrideEnd) + if (xfbBuffers[buffer].stride != TQualifier::layoutXfbStrideEnd && force == false) return xfbBuffers[buffer].stride == stride; xfbBuffers[buffer].stride = stride; return true; @@ -776,6 +776,9 @@ public: void merge(TInfoSink&, TIntermediate&); void finalCheck(TInfoSink&, bool keepUncalled); + bool buildConvertOp(TBasicType dst, TBasicType src, TOperator& convertOp) const; + TIntermTyped* createConversion(TBasicType convertTo, TIntermTyped* node) const; + void addIoAccessed(const TString& name) { ioAccessed.insert(name); } bool inIoAccessed(const TString& name) const { return ioAccessed.find(name) != ioAccessed.end(); } @@ -866,7 +869,6 @@ protected: bool specConstantPropagates(const TIntermTyped&, const TIntermTyped&); void performTextureUpgradeAndSamplerRemovalTransformation(TIntermNode* root); bool isConversionAllowed(TOperator op, TIntermTyped* node) const; - TIntermTyped* createConversion(TBasicType convertTo, TIntermTyped* node) const; std::tuple getConversionDestinatonType(TBasicType type0, TBasicType type1, TOperator op) const; // JohnK: I think this function should go away. diff --git a/glslang/Public/ShaderLang.h b/glslang/Public/ShaderLang.h index a3103c6..886282e 100755 --- a/glslang/Public/ShaderLang.h +++ b/glslang/Public/ShaderLang.h @@ -486,6 +486,8 @@ public: environment.target.version = version; } + void getStrings(const char* const* &s, int& n) { s = strings; n = numStrings; }; + #ifdef ENABLE_HLSL void setEnvTargetHlslFunctionality1() { environment.target.hlslFunctionality1 = true; } bool getEnvTargetHlslFunctionality1() const { return environment.target.hlslFunctionality1; } @@ -772,7 +774,7 @@ public: TProgram(); virtual ~TProgram(); void addShader(TShader* shader) { stages[shader->stage].push_back(shader); } - + std::list& getShaders(EShLanguage stage) { return stages[stage]; }; // Link Validation interface bool link(EShMessages); const char* getInfoLog(); -- 2.7.4