Commit 2f294c9a by Jamie Madill Committed by Commit Bot

Add constructors for TMemoryQualifier and TLayoutQualifier.

These replace the ::create methods, to facilitate constexpr versions. Also adds a constructor of WorkGroupSize that can be made to be constexpr. Bug: angleproject:1432 Change-Id: I413d1a56102c94d6a383775110a2b850a7532ea0 Reviewed-on: https://chromium-review.googlesource.com/776279 Commit-Queue: Jamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarKai Ninomiya <kainino@chromium.org>
parent 416a23e8
...@@ -25,7 +25,7 @@ ...@@ -25,7 +25,7 @@
// Version number for shader translation API. // Version number for shader translation API.
// It is incremented every time the API changes. // It is incremented every time the API changes.
#define ANGLE_SH_VERSION 188 #define ANGLE_SH_VERSION 189
enum ShShaderSpec enum ShShaderSpec
{ {
......
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#define GLSLANG_SHADERVARS_H_ #define GLSLANG_SHADERVARS_H_
#include <algorithm> #include <algorithm>
#include <array>
#include <string> #include <string>
#include <vector> #include <vector>
...@@ -251,6 +252,13 @@ struct InterfaceBlock ...@@ -251,6 +252,13 @@ struct InterfaceBlock
struct WorkGroupSize struct WorkGroupSize
{ {
// Must have a trivial default constructor since it is used in YYSTYPE.
WorkGroupSize() = default;
explicit constexpr WorkGroupSize(int initialSize)
: localSizeQualifiers{initialSize, initialSize, initialSize}
{
}
void fill(int fillValue); void fill(int fillValue);
void setLocalSize(int localSizeX, int localSizeY, int localSizeZ); void setLocalSize(int localSizeX, int localSizeY, int localSizeZ);
...@@ -272,7 +280,7 @@ struct WorkGroupSize ...@@ -272,7 +280,7 @@ struct WorkGroupSize
// Checks whether either all of the values are set, or none of them are. // Checks whether either all of the values are set, or none of them are.
bool isLocalSizeValid() const; bool isLocalSizeValid() const;
int localSizeQualifiers[3]; std::array<int, 3> localSizeQualifiers;
}; };
} // namespace sh } // namespace sh
......
...@@ -747,54 +747,10 @@ enum TLayoutPrimitiveType ...@@ -747,54 +747,10 @@ enum TLayoutPrimitiveType
struct TLayoutQualifier struct TLayoutQualifier
{ {
int location; // Must have a trivial default constructor since it is used in YYSTYPE.
unsigned int locationsSpecified; TLayoutQualifier() = default;
TLayoutMatrixPacking matrixPacking;
TLayoutBlockStorage blockStorage;
// Compute shader layout qualifiers.
sh::WorkGroupSize localSize;
int binding;
int offset;
// Image format layout qualifier
TLayoutImageInternalFormat imageInternalFormat;
// OVR_multiview num_views.
int numViews;
// EXT_YUV_target yuv layout qualifier.
bool yuv;
// OES_geometry_shader layout qualifiers.
TLayoutPrimitiveType primitiveType;
int invocations;
int maxVertices;
static TLayoutQualifier create()
{
TLayoutQualifier layoutQualifier;
layoutQualifier.location = -1;
layoutQualifier.locationsSpecified = 0;
layoutQualifier.matrixPacking = EmpUnspecified;
layoutQualifier.blockStorage = EbsUnspecified;
layoutQualifier.localSize.fill(-1); constexpr static TLayoutQualifier Create() { return TLayoutQualifier(0); }
layoutQualifier.binding = -1;
layoutQualifier.offset = -1;
layoutQualifier.numViews = -1;
layoutQualifier.yuv = false;
layoutQualifier.imageInternalFormat = EiifUnspecified;
layoutQualifier.primitiveType = EptUndefined;
layoutQualifier.invocations = 0;
layoutQualifier.maxVertices = -1;
return layoutQualifier;
}
bool isEmpty() const bool isEmpty() const
{ {
...@@ -825,10 +781,63 @@ struct TLayoutQualifier ...@@ -825,10 +781,63 @@ struct TLayoutQualifier
{ {
return localSize.isWorkGroupSizeMatching(localSizeIn); return localSize.isWorkGroupSizeMatching(localSizeIn);
} }
int location;
unsigned int locationsSpecified;
TLayoutMatrixPacking matrixPacking;
TLayoutBlockStorage blockStorage;
// Compute shader layout qualifiers.
sh::WorkGroupSize localSize;
int binding;
int offset;
// Image format layout qualifier
TLayoutImageInternalFormat imageInternalFormat;
// OVR_multiview num_views.
int numViews;
// EXT_YUV_target yuv layout qualifier.
bool yuv;
// OES_geometry_shader layout qualifiers.
TLayoutPrimitiveType primitiveType;
int invocations;
int maxVertices;
private:
explicit constexpr TLayoutQualifier(int /*placeholder*/)
: location(-1),
locationsSpecified(0),
matrixPacking(EmpUnspecified),
blockStorage(EbsUnspecified),
localSize(-1),
binding(-1),
offset(-1),
imageInternalFormat(EiifUnspecified),
numViews(-1),
yuv(false),
primitiveType(EptUndefined),
invocations(0),
maxVertices(-1)
{
}
}; };
struct TMemoryQualifier struct TMemoryQualifier
{ {
// Must have a trivial default constructor since it is used in YYSTYPE.
TMemoryQualifier() = default;
bool isEmpty() const
{
return !readonly && !writeonly && !coherent && !restrictQualifier && !volatileQualifier;
}
constexpr static TMemoryQualifier Create() { return TMemoryQualifier(0); }
// GLSL ES 3.10 Revision 4, 4.9 Memory Access Qualifiers // GLSL ES 3.10 Revision 4, 4.9 Memory Access Qualifiers
// An image can be qualified as both readonly and writeonly. It still can be can be used with // An image can be qualified as both readonly and writeonly. It still can be can be used with
// imageSize(). // imageSize().
...@@ -839,22 +848,15 @@ struct TMemoryQualifier ...@@ -839,22 +848,15 @@ struct TMemoryQualifier
// restrict and volatile are reserved keywords in C/C++ // restrict and volatile are reserved keywords in C/C++
bool restrictQualifier; bool restrictQualifier;
bool volatileQualifier; bool volatileQualifier;
static TMemoryQualifier create()
{
TMemoryQualifier memoryQualifier;
memoryQualifier.readonly = false; private:
memoryQualifier.writeonly = false; explicit constexpr TMemoryQualifier(int /*placeholder*/)
memoryQualifier.coherent = false; : readonly(false),
memoryQualifier.restrictQualifier = false; writeonly(false),
memoryQualifier.volatileQualifier = false; coherent(false),
restrictQualifier(false),
return memoryQualifier; volatileQualifier(false)
}
bool isEmpty()
{ {
return !readonly && !writeonly && !coherent && !restrictQualifier && !volatileQualifier;
} }
}; };
......
...@@ -254,12 +254,12 @@ TCompiler::TCompiler(sh::GLenum type, ShShaderSpec spec, ShShaderOutput output) ...@@ -254,12 +254,12 @@ TCompiler::TCompiler(sh::GLenum type, ShShaderSpec spec, ShShaderOutput output)
mDiagnostics(infoSink.info), mDiagnostics(infoSink.info),
mSourcePath(nullptr), mSourcePath(nullptr),
mComputeShaderLocalSizeDeclared(false), mComputeShaderLocalSizeDeclared(false),
mComputeShaderLocalSize(1),
mGeometryShaderMaxVertices(-1), mGeometryShaderMaxVertices(-1),
mGeometryShaderInvocations(0), mGeometryShaderInvocations(0),
mGeometryShaderInputPrimitiveType(EptUndefined), mGeometryShaderInputPrimitiveType(EptUndefined),
mGeometryShaderOutputPrimitiveType(EptUndefined) mGeometryShaderOutputPrimitiveType(EptUndefined)
{ {
mComputeShaderLocalSize.fill(1);
} }
TCompiler::~TCompiler() TCompiler::~TCompiler()
......
...@@ -1021,17 +1021,17 @@ void IdentifyBuiltIns(sh::GLenum type, ...@@ -1021,17 +1021,17 @@ void IdentifyBuiltIns(sh::GLenum type,
fieldList->push_back(glPositionField); fieldList->push_back(glPositionField);
TInterfaceBlock *glInBlock = new TInterfaceBlock( TInterfaceBlock *glInBlock = new TInterfaceBlock(
glPerVertexString, fieldList, NewPoolTString("gl_in"), TLayoutQualifier::create()); glPerVertexString, fieldList, NewPoolTString("gl_in"), TLayoutQualifier::Create());
// The array size of gl_in is undefined until we get a valid input primitive // The array size of gl_in is undefined until we get a valid input primitive
// declaration. // declaration.
TType glInType(glInBlock, EvqPerVertexIn, TLayoutQualifier::create()); TType glInType(glInBlock, EvqPerVertexIn, TLayoutQualifier::Create());
glInType.makeArray(0u); glInType.makeArray(0u);
symbolTable.insertVariableExt(ESSL3_1_BUILTINS, extension, "gl_in", glInType); symbolTable.insertVariableExt(ESSL3_1_BUILTINS, extension, "gl_in", glInType);
TType glPositionType(EbtFloat, EbpHigh, EvqPosition, 4); TType glPositionType(EbtFloat, EbpHigh, EvqPosition, 4);
glPositionType.setInterfaceBlock(new TInterfaceBlock( glPositionType.setInterfaceBlock(new TInterfaceBlock(
glPerVertexString, fieldList, nullptr, TLayoutQualifier::create())); glPerVertexString, fieldList, nullptr, TLayoutQualifier::Create()));
symbolTable.insertVariableExt(ESSL3_1_BUILTINS, extension, "gl_Position", symbolTable.insertVariableExt(ESSL3_1_BUILTINS, extension, "gl_Position",
glPositionType); glPositionType);
symbolTable.insertVariableExt(ESSL3_1_BUILTINS, extension, "gl_PrimitiveIDIn", symbolTable.insertVariableExt(ESSL3_1_BUILTINS, extension, "gl_PrimitiveIDIn",
......
...@@ -218,6 +218,7 @@ TParseContext::TParseContext(TSymbolTable &symt, ...@@ -218,6 +218,7 @@ TParseContext::TParseContext(TSymbolTable &symt,
mMinProgramTextureGatherOffset(resources.MinProgramTextureGatherOffset), mMinProgramTextureGatherOffset(resources.MinProgramTextureGatherOffset),
mMaxProgramTextureGatherOffset(resources.MaxProgramTextureGatherOffset), mMaxProgramTextureGatherOffset(resources.MaxProgramTextureGatherOffset),
mComputeShaderLocalSizeDeclared(false), mComputeShaderLocalSizeDeclared(false),
mComputeShaderLocalSize(-1),
mNumViews(-1), mNumViews(-1),
mMaxNumViews(resources.MaxViewsOVR), mMaxNumViews(resources.MaxViewsOVR),
mMaxImageUnits(resources.MaxImageUnits), mMaxImageUnits(resources.MaxImageUnits),
...@@ -235,7 +236,6 @@ TParseContext::TParseContext(TSymbolTable &symt, ...@@ -235,7 +236,6 @@ TParseContext::TParseContext(TSymbolTable &symt,
mMaxGeometryShaderMaxVertices(resources.MaxGeometryOutputVertices), mMaxGeometryShaderMaxVertices(resources.MaxGeometryOutputVertices),
mGeometryShaderInputArraySize(0u) mGeometryShaderInputArraySize(0u)
{ {
mComputeShaderLocalSize.fill(-1);
} }
TParseContext::~TParseContext() TParseContext::~TParseContext()
...@@ -1757,7 +1757,7 @@ void TParseContext::handlePragmaDirective(const TSourceLoc &loc, ...@@ -1757,7 +1757,7 @@ void TParseContext::handlePragmaDirective(const TSourceLoc &loc,
sh::WorkGroupSize TParseContext::getComputeShaderLocalSize() const sh::WorkGroupSize TParseContext::getComputeShaderLocalSize() const
{ {
sh::WorkGroupSize result; sh::WorkGroupSize result(-1);
for (size_t i = 0u; i < result.size(); ++i) for (size_t i = 0u; i < result.size(); ++i)
{ {
if (mComputeShaderLocalSizeDeclared && mComputeShaderLocalSize[i] == -1) if (mComputeShaderLocalSizeDeclared && mComputeShaderLocalSize[i] == -1)
...@@ -4208,7 +4208,7 @@ TIntermTyped *TParseContext::addFieldSelectionExpression(TIntermTyped *baseExpre ...@@ -4208,7 +4208,7 @@ TIntermTyped *TParseContext::addFieldSelectionExpression(TIntermTyped *baseExpre
TLayoutQualifier TParseContext::parseLayoutQualifier(const TString &qualifierType, TLayoutQualifier TParseContext::parseLayoutQualifier(const TString &qualifierType,
const TSourceLoc &qualifierTypeLine) const TSourceLoc &qualifierTypeLine)
{ {
TLayoutQualifier qualifier = TLayoutQualifier::create(); TLayoutQualifier qualifier = TLayoutQualifier::Create();
if (qualifierType == "shared") if (qualifierType == "shared")
{ {
...@@ -4449,7 +4449,7 @@ TLayoutQualifier TParseContext::parseLayoutQualifier(const TString &qualifierTyp ...@@ -4449,7 +4449,7 @@ TLayoutQualifier TParseContext::parseLayoutQualifier(const TString &qualifierTyp
int intValue, int intValue,
const TSourceLoc &intValueLine) const TSourceLoc &intValueLine)
{ {
TLayoutQualifier qualifier = TLayoutQualifier::create(); TLayoutQualifier qualifier = TLayoutQualifier::Create();
std::string intValueString = Str(intValue); std::string intValueString = Str(intValue);
......
...@@ -691,8 +691,8 @@ unsigned int TPrecisionQualifierWrapper::getRank() const ...@@ -691,8 +691,8 @@ unsigned int TPrecisionQualifierWrapper::getRank() const
} }
TTypeQualifier::TTypeQualifier(TQualifier scope, const TSourceLoc &loc) TTypeQualifier::TTypeQualifier(TQualifier scope, const TSourceLoc &loc)
: layoutQualifier(TLayoutQualifier::create()), : layoutQualifier(TLayoutQualifier::Create()),
memoryQualifier(TMemoryQualifier::create()), memoryQualifier(TMemoryQualifier::Create()),
precision(EbpUndefined), precision(EbpUndefined),
qualifier(scope), qualifier(scope),
invariant(false), invariant(false),
......
...@@ -119,8 +119,8 @@ TType::TType() ...@@ -119,8 +119,8 @@ TType::TType()
precision(EbpUndefined), precision(EbpUndefined),
qualifier(EvqGlobal), qualifier(EvqGlobal),
invariant(false), invariant(false),
memoryQualifier(TMemoryQualifier::create()), memoryQualifier(TMemoryQualifier::Create()),
layoutQualifier(TLayoutQualifier::create()), layoutQualifier(TLayoutQualifier::Create()),
primarySize(0), primarySize(0),
secondarySize(0), secondarySize(0),
mInterfaceBlock(nullptr), mInterfaceBlock(nullptr),
...@@ -135,8 +135,8 @@ TType::TType(TBasicType t, unsigned char ps, unsigned char ss) ...@@ -135,8 +135,8 @@ TType::TType(TBasicType t, unsigned char ps, unsigned char ss)
precision(EbpUndefined), precision(EbpUndefined),
qualifier(EvqGlobal), qualifier(EvqGlobal),
invariant(false), invariant(false),
memoryQualifier(TMemoryQualifier::create()), memoryQualifier(TMemoryQualifier::Create()),
layoutQualifier(TLayoutQualifier::create()), layoutQualifier(TLayoutQualifier::Create()),
primarySize(ps), primarySize(ps),
secondarySize(ss), secondarySize(ss),
mInterfaceBlock(0), mInterfaceBlock(0),
...@@ -151,8 +151,8 @@ TType::TType(TBasicType t, TPrecision p, TQualifier q, unsigned char ps, unsigne ...@@ -151,8 +151,8 @@ TType::TType(TBasicType t, TPrecision p, TQualifier q, unsigned char ps, unsigne
precision(p), precision(p),
qualifier(q), qualifier(q),
invariant(false), invariant(false),
memoryQualifier(TMemoryQualifier::create()), memoryQualifier(TMemoryQualifier::Create()),
layoutQualifier(TLayoutQualifier::create()), layoutQualifier(TLayoutQualifier::Create()),
primarySize(ps), primarySize(ps),
secondarySize(ss), secondarySize(ss),
mInterfaceBlock(0), mInterfaceBlock(0),
...@@ -194,8 +194,8 @@ TType::TType(TStructure *userDef) ...@@ -194,8 +194,8 @@ TType::TType(TStructure *userDef)
precision(EbpUndefined), precision(EbpUndefined),
qualifier(EvqTemporary), qualifier(EvqTemporary),
invariant(false), invariant(false),
memoryQualifier(TMemoryQualifier::create()), memoryQualifier(TMemoryQualifier::Create()),
layoutQualifier(TLayoutQualifier::create()), layoutQualifier(TLayoutQualifier::Create()),
primarySize(1), primarySize(1),
secondarySize(1), secondarySize(1),
mInterfaceBlock(nullptr), mInterfaceBlock(nullptr),
...@@ -212,7 +212,7 @@ TType::TType(TInterfaceBlock *interfaceBlockIn, ...@@ -212,7 +212,7 @@ TType::TType(TInterfaceBlock *interfaceBlockIn,
precision(EbpUndefined), precision(EbpUndefined),
qualifier(qualifierIn), qualifier(qualifierIn),
invariant(false), invariant(false),
memoryQualifier(TMemoryQualifier::create()), memoryQualifier(TMemoryQualifier::Create()),
layoutQualifier(layoutQualifierIn), layoutQualifier(layoutQualifierIn),
primarySize(1), primarySize(1),
secondarySize(1), secondarySize(1),
...@@ -927,8 +927,8 @@ int TStructure::calculateDeepestNesting() const ...@@ -927,8 +927,8 @@ int TStructure::calculateDeepestNesting() const
void TPublicType::initialize(const TTypeSpecifierNonArray &typeSpecifier, TQualifier q) void TPublicType::initialize(const TTypeSpecifierNonArray &typeSpecifier, TQualifier q)
{ {
typeSpecifierNonArray = typeSpecifier; typeSpecifierNonArray = typeSpecifier;
layoutQualifier = TLayoutQualifier::create(); layoutQualifier = TLayoutQualifier::Create();
memoryQualifier = TMemoryQualifier::create(); memoryQualifier = TMemoryQualifier::Create();
qualifier = q; qualifier = q;
invariant = false; invariant = false;
precision = EbpUndefined; precision = EbpUndefined;
...@@ -941,8 +941,8 @@ void TPublicType::initializeBasicType(TBasicType basicType) ...@@ -941,8 +941,8 @@ void TPublicType::initializeBasicType(TBasicType basicType)
typeSpecifierNonArray.type = basicType; typeSpecifierNonArray.type = basicType;
typeSpecifierNonArray.primarySize = 1; typeSpecifierNonArray.primarySize = 1;
typeSpecifierNonArray.secondarySize = 1; typeSpecifierNonArray.secondarySize = 1;
layoutQualifier = TLayoutQualifier::create(); layoutQualifier = TLayoutQualifier::Create();
memoryQualifier = TMemoryQualifier::create(); memoryQualifier = TMemoryQualifier::Create();
qualifier = EvqTemporary; qualifier = EvqTemporary;
invariant = false; invariant = false;
precision = EbpUndefined; precision = EbpUndefined;
......
...@@ -455,6 +455,9 @@ struct TTypeSpecifierNonArray ...@@ -455,6 +455,9 @@ struct TTypeSpecifierNonArray
// //
struct TPublicType struct TPublicType
{ {
// Must have a trivial default constructor since it is used in YYSTYPE.
TPublicType() = default;
void initialize(const TTypeSpecifierNonArray &typeSpecifier, TQualifier q); void initialize(const TTypeSpecifierNonArray &typeSpecifier, TQualifier q);
void initializeBasicType(TBasicType basicType); void initializeBasicType(TBasicType basicType);
......
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