Commit b69e8f3a by Roy

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.
parent e8e138b9
...@@ -135,6 +135,8 @@ struct TSampler { // misnomer now; includes images, textures without sampler, ...@@ -135,6 +135,8 @@ struct TSampler { // misnomer now; includes images, textures without sampler,
bool isYuv() const { return yuv; } bool isYuv() const { return yuv; }
#endif #endif
void setCombined(bool c) { combined = c; } void setCombined(bool c) { combined = c; }
void setBasicType(TBasicType t) { type = t; };
TBasicType getBasicType() const { return type; };
bool isShadow() const { return shadow; } bool isShadow() const { return shadow; }
bool isArrayed() const { return arrayed; } bool isArrayed() const { return arrayed; }
...@@ -2184,6 +2186,7 @@ public: ...@@ -2184,6 +2186,7 @@ public:
const TTypeList* getStruct() const { assert(isStruct()); return structure; } const TTypeList* getStruct() const { assert(isStruct()); return structure; }
void setStruct(TTypeList* s) { assert(isStruct()); structure = s; } 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 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 computeNumComponents() const
{ {
......
...@@ -1185,6 +1185,7 @@ public: ...@@ -1185,6 +1185,7 @@ public:
virtual void traverse(TIntermTraverser*); virtual void traverse(TIntermTraverser*);
TOperator getFlowOp() const { return flowOp; } TOperator getFlowOp() const { return flowOp; }
TIntermTyped* getExpression() const { return expression; } TIntermTyped* getExpression() const { return expression; }
void setExpression(TIntermTyped* pExpression) { expression = pExpression; }
protected: protected:
TOperator flowOp; TOperator flowOp;
TIntermTyped* expression; TIntermTyped* expression;
......
...@@ -562,56 +562,12 @@ bool TIntermediate::isConversionAllowed(TOperator op, TIntermTyped* node) const ...@@ -562,56 +562,12 @@ bool TIntermediate::isConversionAllowed(TOperator op, TIntermTyped* node) const
return true; return true;
} }
// This is 'mechanism' here, it does any conversion told. bool TIntermediate::buildConvertOp(TBasicType dst, TBasicType src, TOperator& newOp) const
// 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
{ {
// switch (dst) {
// 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) {
#ifndef GLSLANG_WEB #ifndef GLSLANG_WEB
case EbtDouble: case EbtDouble:
switch (node->getBasicType()) { switch (src) {
case EbtUint: newOp = EOpConvUintToDouble; break; case EbtUint: newOp = EOpConvUintToDouble; break;
case EbtBool: newOp = EOpConvBoolToDouble; break; case EbtBool: newOp = EOpConvBoolToDouble; break;
case EbtFloat: newOp = EOpConvFloatToDouble; break; case EbtFloat: newOp = EOpConvFloatToDouble; break;
...@@ -624,12 +580,12 @@ TIntermTyped* TIntermediate::createConversion(TBasicType convertTo, TIntermTyped ...@@ -624,12 +580,12 @@ TIntermTyped* TIntermediate::createConversion(TBasicType convertTo, TIntermTyped
case EbtInt64: newOp = EOpConvInt64ToDouble; break; case EbtInt64: newOp = EOpConvInt64ToDouble; break;
case EbtUint64: newOp = EOpConvUint64ToDouble; break; case EbtUint64: newOp = EOpConvUint64ToDouble; break;
default: default:
return nullptr; return false;
} }
break; break;
#endif #endif
case EbtFloat: case EbtFloat:
switch (node->getBasicType()) { switch (src) {
case EbtInt: newOp = EOpConvIntToFloat; break; case EbtInt: newOp = EOpConvIntToFloat; break;
case EbtUint: newOp = EOpConvUintToFloat; break; case EbtUint: newOp = EOpConvUintToFloat; break;
case EbtBool: newOp = EOpConvBoolToFloat; break; case EbtBool: newOp = EOpConvBoolToFloat; break;
...@@ -644,12 +600,12 @@ TIntermTyped* TIntermediate::createConversion(TBasicType convertTo, TIntermTyped ...@@ -644,12 +600,12 @@ TIntermTyped* TIntermediate::createConversion(TBasicType convertTo, TIntermTyped
case EbtUint64: newOp = EOpConvUint64ToFloat; break; case EbtUint64: newOp = EOpConvUint64ToFloat; break;
#endif #endif
default: default:
return nullptr; return false;
} }
break; break;
#ifndef GLSLANG_WEB #ifndef GLSLANG_WEB
case EbtFloat16: case EbtFloat16:
switch (node->getBasicType()) { switch (src) {
case EbtInt8: newOp = EOpConvInt8ToFloat16; break; case EbtInt8: newOp = EOpConvInt8ToFloat16; break;
case EbtUint8: newOp = EOpConvUint8ToFloat16; break; case EbtUint8: newOp = EOpConvUint8ToFloat16; break;
case EbtInt16: newOp = EOpConvInt16ToFloat16; break; case EbtInt16: newOp = EOpConvInt16ToFloat16; break;
...@@ -662,12 +618,12 @@ TIntermTyped* TIntermediate::createConversion(TBasicType convertTo, TIntermTyped ...@@ -662,12 +618,12 @@ TIntermTyped* TIntermediate::createConversion(TBasicType convertTo, TIntermTyped
case EbtInt64: newOp = EOpConvInt64ToFloat16; break; case EbtInt64: newOp = EOpConvInt64ToFloat16; break;
case EbtUint64: newOp = EOpConvUint64ToFloat16; break; case EbtUint64: newOp = EOpConvUint64ToFloat16; break;
default: default:
return nullptr; return false;
} }
break; break;
#endif #endif
case EbtBool: case EbtBool:
switch (node->getBasicType()) { switch (src) {
case EbtInt: newOp = EOpConvIntToBool; break; case EbtInt: newOp = EOpConvIntToBool; break;
case EbtUint: newOp = EOpConvUintToBool; break; case EbtUint: newOp = EOpConvUintToBool; break;
case EbtFloat: newOp = EOpConvFloatToBool; break; case EbtFloat: newOp = EOpConvFloatToBool; break;
...@@ -682,12 +638,12 @@ TIntermTyped* TIntermediate::createConversion(TBasicType convertTo, TIntermTyped ...@@ -682,12 +638,12 @@ TIntermTyped* TIntermediate::createConversion(TBasicType convertTo, TIntermTyped
case EbtUint64: newOp = EOpConvUint64ToBool; break; case EbtUint64: newOp = EOpConvUint64ToBool; break;
#endif #endif
default: default:
return nullptr; return false;
} }
break; break;
#ifndef GLSLANG_WEB #ifndef GLSLANG_WEB
case EbtInt8: case EbtInt8:
switch (node->getBasicType()) { switch (src) {
case EbtUint8: newOp = EOpConvUint8ToInt8; break; case EbtUint8: newOp = EOpConvUint8ToInt8; break;
case EbtInt16: newOp = EOpConvInt16ToInt8; break; case EbtInt16: newOp = EOpConvInt16ToInt8; break;
case EbtUint16: newOp = EOpConvUint16ToInt8; break; case EbtUint16: newOp = EOpConvUint16ToInt8; break;
...@@ -700,11 +656,11 @@ TIntermTyped* TIntermediate::createConversion(TBasicType convertTo, TIntermTyped ...@@ -700,11 +656,11 @@ TIntermTyped* TIntermediate::createConversion(TBasicType convertTo, TIntermTyped
case EbtDouble: newOp = EOpConvDoubleToInt8; break; case EbtDouble: newOp = EOpConvDoubleToInt8; break;
case EbtFloat16: newOp = EOpConvFloat16ToInt8; break; case EbtFloat16: newOp = EOpConvFloat16ToInt8; break;
default: default:
return nullptr; return false;
} }
break; break;
case EbtUint8: case EbtUint8:
switch (node->getBasicType()) { switch (src) {
case EbtInt8: newOp = EOpConvInt8ToUint8; break; case EbtInt8: newOp = EOpConvInt8ToUint8; break;
case EbtInt16: newOp = EOpConvInt16ToUint8; break; case EbtInt16: newOp = EOpConvInt16ToUint8; break;
case EbtUint16: newOp = EOpConvUint16ToUint8; break; case EbtUint16: newOp = EOpConvUint16ToUint8; break;
...@@ -717,12 +673,12 @@ TIntermTyped* TIntermediate::createConversion(TBasicType convertTo, TIntermTyped ...@@ -717,12 +673,12 @@ TIntermTyped* TIntermediate::createConversion(TBasicType convertTo, TIntermTyped
case EbtDouble: newOp = EOpConvDoubleToUint8; break; case EbtDouble: newOp = EOpConvDoubleToUint8; break;
case EbtFloat16: newOp = EOpConvFloat16ToUint8; break; case EbtFloat16: newOp = EOpConvFloat16ToUint8; break;
default: default:
return nullptr; return false;
} }
break; break;
case EbtInt16: case EbtInt16:
switch (node->getBasicType()) { switch (src) {
case EbtUint8: newOp = EOpConvUint8ToInt16; break; case EbtUint8: newOp = EOpConvUint8ToInt16; break;
case EbtInt8: newOp = EOpConvInt8ToInt16; break; case EbtInt8: newOp = EOpConvInt8ToInt16; break;
case EbtUint16: newOp = EOpConvUint16ToInt16; break; case EbtUint16: newOp = EOpConvUint16ToInt16; break;
...@@ -735,11 +691,11 @@ TIntermTyped* TIntermediate::createConversion(TBasicType convertTo, TIntermTyped ...@@ -735,11 +691,11 @@ TIntermTyped* TIntermediate::createConversion(TBasicType convertTo, TIntermTyped
case EbtDouble: newOp = EOpConvDoubleToInt16; break; case EbtDouble: newOp = EOpConvDoubleToInt16; break;
case EbtFloat16: newOp = EOpConvFloat16ToInt16; break; case EbtFloat16: newOp = EOpConvFloat16ToInt16; break;
default: default:
return nullptr; return false;
} }
break; break;
case EbtUint16: case EbtUint16:
switch (node->getBasicType()) { switch (src) {
case EbtInt8: newOp = EOpConvInt8ToUint16; break; case EbtInt8: newOp = EOpConvInt8ToUint16; break;
case EbtUint8: newOp = EOpConvUint8ToUint16; break; case EbtUint8: newOp = EOpConvUint8ToUint16; break;
case EbtInt16: newOp = EOpConvInt16ToUint16; break; case EbtInt16: newOp = EOpConvInt16ToUint16; break;
...@@ -752,13 +708,13 @@ TIntermTyped* TIntermediate::createConversion(TBasicType convertTo, TIntermTyped ...@@ -752,13 +708,13 @@ TIntermTyped* TIntermediate::createConversion(TBasicType convertTo, TIntermTyped
case EbtDouble: newOp = EOpConvDoubleToUint16; break; case EbtDouble: newOp = EOpConvDoubleToUint16; break;
case EbtFloat16: newOp = EOpConvFloat16ToUint16; break; case EbtFloat16: newOp = EOpConvFloat16ToUint16; break;
default: default:
return nullptr; return false;
} }
break; break;
#endif #endif
case EbtInt: case EbtInt:
switch (node->getBasicType()) { switch (src) {
case EbtUint: newOp = EOpConvUintToInt; break; case EbtUint: newOp = EOpConvUintToInt; break;
case EbtBool: newOp = EOpConvBoolToInt; break; case EbtBool: newOp = EOpConvBoolToInt; break;
case EbtFloat: newOp = EOpConvFloatToInt; break; case EbtFloat: newOp = EOpConvFloatToInt; break;
...@@ -773,11 +729,11 @@ TIntermTyped* TIntermediate::createConversion(TBasicType convertTo, TIntermTyped ...@@ -773,11 +729,11 @@ TIntermTyped* TIntermediate::createConversion(TBasicType convertTo, TIntermTyped
case EbtUint64: newOp = EOpConvUint64ToInt; break; case EbtUint64: newOp = EOpConvUint64ToInt; break;
#endif #endif
default: default:
return nullptr; return false;
} }
break; break;
case EbtUint: case EbtUint:
switch (node->getBasicType()) { switch (src) {
case EbtInt: newOp = EOpConvIntToUint; break; case EbtInt: newOp = EOpConvIntToUint; break;
case EbtBool: newOp = EOpConvBoolToUint; break; case EbtBool: newOp = EOpConvBoolToUint; break;
case EbtFloat: newOp = EOpConvFloatToUint; break; case EbtFloat: newOp = EOpConvFloatToUint; break;
...@@ -792,12 +748,12 @@ TIntermTyped* TIntermediate::createConversion(TBasicType convertTo, TIntermTyped ...@@ -792,12 +748,12 @@ TIntermTyped* TIntermediate::createConversion(TBasicType convertTo, TIntermTyped
case EbtUint64: newOp = EOpConvUint64ToUint; break; case EbtUint64: newOp = EOpConvUint64ToUint; break;
#endif #endif
default: default:
return nullptr; return false;
} }
break; break;
#ifndef GLSLANG_WEB #ifndef GLSLANG_WEB
case EbtInt64: case EbtInt64:
switch (node->getBasicType()) { switch (src) {
case EbtInt8: newOp = EOpConvInt8ToInt64; break; case EbtInt8: newOp = EOpConvInt8ToInt64; break;
case EbtUint8: newOp = EOpConvUint8ToInt64; break; case EbtUint8: newOp = EOpConvUint8ToInt64; break;
case EbtInt16: newOp = EOpConvInt16ToInt64; break; case EbtInt16: newOp = EOpConvInt16ToInt64; break;
...@@ -810,11 +766,11 @@ TIntermTyped* TIntermediate::createConversion(TBasicType convertTo, TIntermTyped ...@@ -810,11 +766,11 @@ TIntermTyped* TIntermediate::createConversion(TBasicType convertTo, TIntermTyped
case EbtFloat16: newOp = EOpConvFloat16ToInt64; break; case EbtFloat16: newOp = EOpConvFloat16ToInt64; break;
case EbtUint64: newOp = EOpConvUint64ToInt64; break; case EbtUint64: newOp = EOpConvUint64ToInt64; break;
default: default:
return nullptr; return false;
} }
break; break;
case EbtUint64: case EbtUint64:
switch (node->getBasicType()) { switch (src) {
case EbtInt8: newOp = EOpConvInt8ToUint64; break; case EbtInt8: newOp = EOpConvInt8ToUint64; break;
case EbtUint8: newOp = EOpConvUint8ToUint64; break; case EbtUint8: newOp = EOpConvUint8ToUint64; break;
case EbtInt16: newOp = EOpConvInt16ToUint64; break; case EbtInt16: newOp = EOpConvInt16ToUint64; break;
...@@ -827,11 +783,64 @@ TIntermTyped* TIntermediate::createConversion(TBasicType convertTo, TIntermTyped ...@@ -827,11 +783,64 @@ TIntermTyped* TIntermediate::createConversion(TBasicType convertTo, TIntermTyped
case EbtFloat16: newOp = EOpConvFloat16ToUint64; break; case EbtFloat16: newOp = EOpConvFloat16ToUint64; break;
case EbtInt64: newOp = EOpConvInt64ToUint64; break; case EbtInt64: newOp = EOpConvInt64ToUint64; break;
default: default:
return nullptr; return false;
} }
break; break;
#endif #endif
default: 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; return nullptr;
} }
......
...@@ -693,9 +693,9 @@ public: ...@@ -693,9 +693,9 @@ public:
bool getPixelCenterInteger() const { return pixelCenterInteger; } bool getPixelCenterInteger() const { return pixelCenterInteger; }
void addBlendEquation(TBlendEquationShift b) { blendEquations |= (1 << b); } void addBlendEquation(TBlendEquationShift b) { blendEquations |= (1 << b); }
unsigned int getBlendEquations() const { return blendEquations; } 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; return xfbBuffers[buffer].stride == stride;
xfbBuffers[buffer].stride = stride; xfbBuffers[buffer].stride = stride;
return true; return true;
...@@ -776,6 +776,9 @@ public: ...@@ -776,6 +776,9 @@ public:
void merge(TInfoSink&, TIntermediate&); void merge(TInfoSink&, TIntermediate&);
void finalCheck(TInfoSink&, bool keepUncalled); 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); } void addIoAccessed(const TString& name) { ioAccessed.insert(name); }
bool inIoAccessed(const TString& name) const { return ioAccessed.find(name) != ioAccessed.end(); } bool inIoAccessed(const TString& name) const { return ioAccessed.find(name) != ioAccessed.end(); }
...@@ -866,7 +869,6 @@ protected: ...@@ -866,7 +869,6 @@ protected:
bool specConstantPropagates(const TIntermTyped&, const TIntermTyped&); bool specConstantPropagates(const TIntermTyped&, const TIntermTyped&);
void performTextureUpgradeAndSamplerRemovalTransformation(TIntermNode* root); void performTextureUpgradeAndSamplerRemovalTransformation(TIntermNode* root);
bool isConversionAllowed(TOperator op, TIntermTyped* node) const; bool isConversionAllowed(TOperator op, TIntermTyped* node) const;
TIntermTyped* createConversion(TBasicType convertTo, TIntermTyped* node) const;
std::tuple<TBasicType, TBasicType> getConversionDestinatonType(TBasicType type0, TBasicType type1, TOperator op) const; std::tuple<TBasicType, TBasicType> getConversionDestinatonType(TBasicType type0, TBasicType type1, TOperator op) const;
// JohnK: I think this function should go away. // JohnK: I think this function should go away.
......
...@@ -486,6 +486,8 @@ public: ...@@ -486,6 +486,8 @@ public:
environment.target.version = version; environment.target.version = version;
} }
void getStrings(const char* const* &s, int& n) { s = strings; n = numStrings; };
#ifdef ENABLE_HLSL #ifdef ENABLE_HLSL
void setEnvTargetHlslFunctionality1() { environment.target.hlslFunctionality1 = true; } void setEnvTargetHlslFunctionality1() { environment.target.hlslFunctionality1 = true; }
bool getEnvTargetHlslFunctionality1() const { return environment.target.hlslFunctionality1; } bool getEnvTargetHlslFunctionality1() const { return environment.target.hlslFunctionality1; }
...@@ -772,7 +774,7 @@ public: ...@@ -772,7 +774,7 @@ public:
TProgram(); TProgram();
virtual ~TProgram(); virtual ~TProgram();
void addShader(TShader* shader) { stages[shader->stage].push_back(shader); } void addShader(TShader* shader) { stages[shader->stage].push_back(shader); }
std::list<TShader*>& getShaders(EShLanguage stage) { return stages[stage]; };
// Link Validation interface // Link Validation interface
bool link(EShMessages); bool link(EShMessages);
const char* getInfoLog(); const char* getInfoLog();
......
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