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 @@
// Version number for shader translation API.
// It is incremented every time the API changes.
#define ANGLE_SH_VERSION 188
#define ANGLE_SH_VERSION 189
enum ShShaderSpec
{
......
......@@ -11,6 +11,7 @@
#define GLSLANG_SHADERVARS_H_
#include <algorithm>
#include <array>
#include <string>
#include <vector>
......@@ -251,6 +252,13 @@ struct InterfaceBlock
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 setLocalSize(int localSizeX, int localSizeY, int localSizeZ);
......@@ -272,7 +280,7 @@ struct WorkGroupSize
// Checks whether either all of the values are set, or none of them are.
bool isLocalSizeValid() const;
int localSizeQualifiers[3];
std::array<int, 3> localSizeQualifiers;
};
} // namespace sh
......
......@@ -747,54 +747,10 @@ enum TLayoutPrimitiveType
struct TLayoutQualifier
{
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;
static TLayoutQualifier create()
{
TLayoutQualifier layoutQualifier;
layoutQualifier.location = -1;
layoutQualifier.locationsSpecified = 0;
layoutQualifier.matrixPacking = EmpUnspecified;
layoutQualifier.blockStorage = EbsUnspecified;
// Must have a trivial default constructor since it is used in YYSTYPE.
TLayoutQualifier() = default;
layoutQualifier.localSize.fill(-1);
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;
}
constexpr static TLayoutQualifier Create() { return TLayoutQualifier(0); }
bool isEmpty() const
{
......@@ -825,10 +781,63 @@ struct TLayoutQualifier
{
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
{
// 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
// An image can be qualified as both readonly and writeonly. It still can be can be used with
// imageSize().
......@@ -839,22 +848,15 @@ struct TMemoryQualifier
// restrict and volatile are reserved keywords in C/C++
bool restrictQualifier;
bool volatileQualifier;
static TMemoryQualifier create()
{
TMemoryQualifier memoryQualifier;
memoryQualifier.readonly = false;
memoryQualifier.writeonly = false;
memoryQualifier.coherent = false;
memoryQualifier.restrictQualifier = false;
memoryQualifier.volatileQualifier = false;
return memoryQualifier;
}
bool isEmpty()
private:
explicit constexpr TMemoryQualifier(int /*placeholder*/)
: readonly(false),
writeonly(false),
coherent(false),
restrictQualifier(false),
volatileQualifier(false)
{
return !readonly && !writeonly && !coherent && !restrictQualifier && !volatileQualifier;
}
};
......
......@@ -254,12 +254,12 @@ TCompiler::TCompiler(sh::GLenum type, ShShaderSpec spec, ShShaderOutput output)
mDiagnostics(infoSink.info),
mSourcePath(nullptr),
mComputeShaderLocalSizeDeclared(false),
mComputeShaderLocalSize(1),
mGeometryShaderMaxVertices(-1),
mGeometryShaderInvocations(0),
mGeometryShaderInputPrimitiveType(EptUndefined),
mGeometryShaderOutputPrimitiveType(EptUndefined)
{
mComputeShaderLocalSize.fill(1);
}
TCompiler::~TCompiler()
......
......@@ -1021,17 +1021,17 @@ void IdentifyBuiltIns(sh::GLenum type,
fieldList->push_back(glPositionField);
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
// declaration.
TType glInType(glInBlock, EvqPerVertexIn, TLayoutQualifier::create());
TType glInType(glInBlock, EvqPerVertexIn, TLayoutQualifier::Create());
glInType.makeArray(0u);
symbolTable.insertVariableExt(ESSL3_1_BUILTINS, extension, "gl_in", glInType);
TType glPositionType(EbtFloat, EbpHigh, EvqPosition, 4);
glPositionType.setInterfaceBlock(new TInterfaceBlock(
glPerVertexString, fieldList, nullptr, TLayoutQualifier::create()));
glPerVertexString, fieldList, nullptr, TLayoutQualifier::Create()));
symbolTable.insertVariableExt(ESSL3_1_BUILTINS, extension, "gl_Position",
glPositionType);
symbolTable.insertVariableExt(ESSL3_1_BUILTINS, extension, "gl_PrimitiveIDIn",
......
......@@ -218,6 +218,7 @@ TParseContext::TParseContext(TSymbolTable &symt,
mMinProgramTextureGatherOffset(resources.MinProgramTextureGatherOffset),
mMaxProgramTextureGatherOffset(resources.MaxProgramTextureGatherOffset),
mComputeShaderLocalSizeDeclared(false),
mComputeShaderLocalSize(-1),
mNumViews(-1),
mMaxNumViews(resources.MaxViewsOVR),
mMaxImageUnits(resources.MaxImageUnits),
......@@ -235,7 +236,6 @@ TParseContext::TParseContext(TSymbolTable &symt,
mMaxGeometryShaderMaxVertices(resources.MaxGeometryOutputVertices),
mGeometryShaderInputArraySize(0u)
{
mComputeShaderLocalSize.fill(-1);
}
TParseContext::~TParseContext()
......@@ -1757,7 +1757,7 @@ void TParseContext::handlePragmaDirective(const TSourceLoc &loc,
sh::WorkGroupSize TParseContext::getComputeShaderLocalSize() const
{
sh::WorkGroupSize result;
sh::WorkGroupSize result(-1);
for (size_t i = 0u; i < result.size(); ++i)
{
if (mComputeShaderLocalSizeDeclared && mComputeShaderLocalSize[i] == -1)
......@@ -4208,7 +4208,7 @@ TIntermTyped *TParseContext::addFieldSelectionExpression(TIntermTyped *baseExpre
TLayoutQualifier TParseContext::parseLayoutQualifier(const TString &qualifierType,
const TSourceLoc &qualifierTypeLine)
{
TLayoutQualifier qualifier = TLayoutQualifier::create();
TLayoutQualifier qualifier = TLayoutQualifier::Create();
if (qualifierType == "shared")
{
......@@ -4449,7 +4449,7 @@ TLayoutQualifier TParseContext::parseLayoutQualifier(const TString &qualifierTyp
int intValue,
const TSourceLoc &intValueLine)
{
TLayoutQualifier qualifier = TLayoutQualifier::create();
TLayoutQualifier qualifier = TLayoutQualifier::Create();
std::string intValueString = Str(intValue);
......
......@@ -691,8 +691,8 @@ unsigned int TPrecisionQualifierWrapper::getRank() const
}
TTypeQualifier::TTypeQualifier(TQualifier scope, const TSourceLoc &loc)
: layoutQualifier(TLayoutQualifier::create()),
memoryQualifier(TMemoryQualifier::create()),
: layoutQualifier(TLayoutQualifier::Create()),
memoryQualifier(TMemoryQualifier::Create()),
precision(EbpUndefined),
qualifier(scope),
invariant(false),
......
......@@ -119,8 +119,8 @@ TType::TType()
precision(EbpUndefined),
qualifier(EvqGlobal),
invariant(false),
memoryQualifier(TMemoryQualifier::create()),
layoutQualifier(TLayoutQualifier::create()),
memoryQualifier(TMemoryQualifier::Create()),
layoutQualifier(TLayoutQualifier::Create()),
primarySize(0),
secondarySize(0),
mInterfaceBlock(nullptr),
......@@ -135,8 +135,8 @@ TType::TType(TBasicType t, unsigned char ps, unsigned char ss)
precision(EbpUndefined),
qualifier(EvqGlobal),
invariant(false),
memoryQualifier(TMemoryQualifier::create()),
layoutQualifier(TLayoutQualifier::create()),
memoryQualifier(TMemoryQualifier::Create()),
layoutQualifier(TLayoutQualifier::Create()),
primarySize(ps),
secondarySize(ss),
mInterfaceBlock(0),
......@@ -151,8 +151,8 @@ TType::TType(TBasicType t, TPrecision p, TQualifier q, unsigned char ps, unsigne
precision(p),
qualifier(q),
invariant(false),
memoryQualifier(TMemoryQualifier::create()),
layoutQualifier(TLayoutQualifier::create()),
memoryQualifier(TMemoryQualifier::Create()),
layoutQualifier(TLayoutQualifier::Create()),
primarySize(ps),
secondarySize(ss),
mInterfaceBlock(0),
......@@ -194,8 +194,8 @@ TType::TType(TStructure *userDef)
precision(EbpUndefined),
qualifier(EvqTemporary),
invariant(false),
memoryQualifier(TMemoryQualifier::create()),
layoutQualifier(TLayoutQualifier::create()),
memoryQualifier(TMemoryQualifier::Create()),
layoutQualifier(TLayoutQualifier::Create()),
primarySize(1),
secondarySize(1),
mInterfaceBlock(nullptr),
......@@ -212,7 +212,7 @@ TType::TType(TInterfaceBlock *interfaceBlockIn,
precision(EbpUndefined),
qualifier(qualifierIn),
invariant(false),
memoryQualifier(TMemoryQualifier::create()),
memoryQualifier(TMemoryQualifier::Create()),
layoutQualifier(layoutQualifierIn),
primarySize(1),
secondarySize(1),
......@@ -927,8 +927,8 @@ int TStructure::calculateDeepestNesting() const
void TPublicType::initialize(const TTypeSpecifierNonArray &typeSpecifier, TQualifier q)
{
typeSpecifierNonArray = typeSpecifier;
layoutQualifier = TLayoutQualifier::create();
memoryQualifier = TMemoryQualifier::create();
layoutQualifier = TLayoutQualifier::Create();
memoryQualifier = TMemoryQualifier::Create();
qualifier = q;
invariant = false;
precision = EbpUndefined;
......@@ -941,8 +941,8 @@ void TPublicType::initializeBasicType(TBasicType basicType)
typeSpecifierNonArray.type = basicType;
typeSpecifierNonArray.primarySize = 1;
typeSpecifierNonArray.secondarySize = 1;
layoutQualifier = TLayoutQualifier::create();
memoryQualifier = TMemoryQualifier::create();
layoutQualifier = TLayoutQualifier::Create();
memoryQualifier = TMemoryQualifier::Create();
qualifier = EvqTemporary;
invariant = false;
precision = EbpUndefined;
......
......@@ -455,6 +455,9 @@ struct TTypeSpecifierNonArray
//
struct TPublicType
{
// Must have a trivial default constructor since it is used in YYSTYPE.
TPublicType() = default;
void initialize(const TTypeSpecifierNonArray &typeSpecifier, TQualifier q);
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