Commit 7cbb1de2 by Nicolas Capens Committed by Nicolas Capens

Implement support for arrays of constants.

Arrays of constants can be dynamically indexed, so they can't be propagated by value and handled as literals like other constants. Instead we store them in the constant register file. Change-Id: Idcee033d694b20d047c70e2d13974e5a6dce127b Reviewed-on: https://swiftshader-review.googlesource.com/15488Tested-by: 's avatarNicolas Capens <nicolascapens@google.com> Reviewed-by: 's avatarAlexis Hétu <sugoi@google.com>
parent 4a4fe77c
...@@ -216,12 +216,12 @@ namespace glsl ...@@ -216,12 +216,12 @@ namespace glsl
sw::PixelShader *Shader::getPixelShader() const sw::PixelShader *Shader::getPixelShader() const
{ {
return 0; return nullptr;
} }
sw::VertexShader *Shader::getVertexShader() const sw::VertexShader *Shader::getVertexShader() const
{ {
return 0; return nullptr;
} }
OutputASM::TextureFunction::TextureFunction(const TString& nodeName) : method(IMPLICIT), proj(false), offset(false) OutputASM::TextureFunction::TextureFunction(const TString& nodeName) : method(IMPLICIT), proj(false), offset(false)
...@@ -306,9 +306,9 @@ namespace glsl ...@@ -306,9 +306,9 @@ namespace glsl
OutputASM::OutputASM(TParseContext &context, Shader *shaderObject) : TIntermTraverser(true, true, true), shaderObject(shaderObject), mContext(context) OutputASM::OutputASM(TParseContext &context, Shader *shaderObject) : TIntermTraverser(true, true, true), shaderObject(shaderObject), mContext(context)
{ {
shader = 0; shader = nullptr;
pixelShader = 0; pixelShader = nullptr;
vertexShader = 0; vertexShader = nullptr;
if(shaderObject) if(shaderObject)
{ {
...@@ -317,9 +317,9 @@ namespace glsl ...@@ -317,9 +317,9 @@ namespace glsl
vertexShader = shaderObject->getVertexShader(); vertexShader = shaderObject->getVertexShader();
} }
functionArray.push_back(Function(0, "main(", 0, 0)); functionArray.push_back(Function(0, "main(", nullptr, nullptr));
currentFunction = 0; currentFunction = 0;
outputQualifier = EvqOutput; // Set outputQualifier to any value other than EvqFragColor or EvqFragData outputQualifier = EvqOutput; // Initialize outputQualifier to any value other than EvqFragColor or EvqFragData
} }
OutputASM::~OutputASM() OutputASM::~OutputASM()
...@@ -514,8 +514,19 @@ namespace glsl ...@@ -514,8 +514,19 @@ namespace glsl
return false; return false;
case EOpInitialize: case EOpInitialize:
assert(visit == PreVisit); assert(visit == PreVisit);
right->traverse(this); // Constant arrays go into the constant register file.
copy(left, right); if(leftType.getQualifier() == EvqConstExpr && leftType.isArray() && leftType.getArraySize() > 1)
{
for(int i = 0; i < left->totalRegisterCount(); i++)
{
emit(sw::Shader::OPCODE_DEF, left, i, right, i);
}
}
else
{
right->traverse(this);
copy(left, right);
}
return false; return false;
case EOpMatrixTimesScalarAssign: case EOpMatrixTimesScalarAssign:
assert(visit == PreVisit); assert(visit == PreVisit);
...@@ -2544,7 +2555,15 @@ namespace glsl ...@@ -2544,7 +2555,15 @@ namespace glsl
if(qualifier == EvqConstExpr && (!operand->getAsConstantUnion() || !operand->getAsConstantUnion()->getUnionArrayPointer())) if(qualifier == EvqConstExpr && (!operand->getAsConstantUnion() || !operand->getAsConstantUnion()->getUnionArrayPointer()))
{ {
return sw::Shader::PARAMETER_TEMP; // Constant arrays are in the constant register file.
if(operand->isArray() && operand->getArraySize() > 1)
{
return sw::Shader::PARAMETER_CONST;
}
else
{
return sw::Shader::PARAMETER_TEMP;
}
} }
switch(qualifier) switch(qualifier)
......
...@@ -1297,15 +1297,21 @@ bool TParseContext::executeInitializer(const TSourceLoc& line, const TString& id ...@@ -1297,15 +1297,21 @@ bool TParseContext::executeInitializer(const TSourceLoc& line, const TString& id
} }
} }
if (!variable->isConstant()) { // Constants which aren't indexable arrays get propagated by value
// and thus don't need to initialize the symbol.
if (variable->isConstant() && !(type.isArray() && type.getArraySize() > 1))
{
*intermNode = nullptr;
}
else
{
TIntermSymbol* intermSymbol = intermediate.addSymbol(variable->getUniqueId(), variable->getName(), variable->getType(), line); TIntermSymbol* intermSymbol = intermediate.addSymbol(variable->getUniqueId(), variable->getName(), variable->getType(), line);
*intermNode = createAssign(EOpInitialize, intermSymbol, initializer, line); *intermNode = createAssign(EOpInitialize, intermSymbol, initializer, line);
if(*intermNode == nullptr) { if(*intermNode == nullptr) {
assignError(line, "=", intermSymbol->getCompleteString(), initializer->getCompleteString()); assignError(line, "=", intermSymbol->getCompleteString(), initializer->getCompleteString());
return true; return true;
} }
} else }
*intermNode = nullptr;
return false; return false;
} }
......
...@@ -233,8 +233,9 @@ variable_identifier ...@@ -233,8 +233,9 @@ variable_identifier
// don't delete $1.string, it's used by error recovery, and the pool // don't delete $1.string, it's used by error recovery, and the pool
// pop will reclaim the memory // pop will reclaim the memory
// Constants which aren't indexable arrays can be propagated by value.
ConstantUnion *constArray = variable->getConstPointer(); ConstantUnion *constArray = variable->getConstPointer();
if (constArray) { if (constArray && variable->getType().getArraySize() <= 1) {
TType t(variable->getType()); TType t(variable->getType());
$$ = context->intermediate.addConstantUnion(constArray, t, @1); $$ = context->intermediate.addConstantUnion(constArray, t, @1);
} else } else
......
...@@ -2373,8 +2373,9 @@ yyreduce: ...@@ -2373,8 +2373,9 @@ yyreduce:
// don't delete $1.string, it's used by error recovery, and the pool // don't delete $1.string, it's used by error recovery, and the pool
// pop will reclaim the memory // pop will reclaim the memory
// Constants which aren't indexable arrays can be propagated by value.
ConstantUnion *constArray = variable->getConstPointer(); ConstantUnion *constArray = variable->getConstPointer();
if (constArray) { if (constArray && variable->getType().getArraySize() <= 1) {
TType t(variable->getType()); TType t(variable->getType());
(yyval.interm.intermTypedNode) = context->intermediate.addConstantUnion(constArray, t, (yylsp[0])); (yyval.interm.intermTypedNode) = context->intermediate.addConstantUnion(constArray, t, (yylsp[0]));
} else } else
......
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