Commit 49351233 by Alexis Hetu Committed by Alexis Hétu

Struct varyings implementation

Varying variables can be structure in OpenGL ES3. This cl adds support for structure varyings. Change-Id: I4d1d80c6afed0a86a23b0a467d4764a4e08f133d Reviewed-on: https://swiftshader-review.googlesource.com/13529Tested-by: 's avatarAlexis Hétu <sugoi@google.com> Reviewed-by: 's avatarNicolas Capens <nicolascapens@google.com>
parent 7a8ed2e1
...@@ -2755,6 +2755,28 @@ namespace glsl ...@@ -2755,6 +2755,28 @@ namespace glsl
return allocate(temporaries, temporary); return allocate(temporaries, temporary);
} }
void OutputASM::setPixelShaderInputs(const TType& type, int var, bool flat)
{
if(type.isStruct())
{
const TFieldList &fields = type.getStruct()->fields();
int fieldVar = var;
for(size_t i = 0; i < fields.size(); i++)
{
const TType& fieldType = *(fields[i]->type());
setPixelShaderInputs(fieldType, fieldVar, flat);
fieldVar += fieldType.totalRegisterCount();
}
}
else
{
for(int i = 0; i < type.totalRegisterCount(); i++)
{
pixelShader->setInput(var + i, type.registerSize(), sw::Shader::Semantic(sw::Shader::USAGE_COLOR, var + i, flat));
}
}
}
int OutputASM::varyingRegister(TIntermTyped *varying) int OutputASM::varyingRegister(TIntermTyped *varying)
{ {
int var = lookup(varyings, varying); int var = lookup(varyings, varying);
...@@ -2762,7 +2784,6 @@ namespace glsl ...@@ -2762,7 +2784,6 @@ namespace glsl
if(var == -1) if(var == -1)
{ {
var = allocate(varyings, varying); var = allocate(varyings, varying);
int componentCount = varying->registerSize();
int registerCount = varying->totalRegisterCount(); int registerCount = varying->totalRegisterCount();
if(pixelShader) if(pixelShader)
...@@ -2776,16 +2797,11 @@ namespace glsl ...@@ -2776,16 +2797,11 @@ namespace glsl
if(varying->getQualifier() == EvqPointCoord) if(varying->getQualifier() == EvqPointCoord)
{ {
ASSERT(varying->isRegister()); ASSERT(varying->isRegister());
pixelShader->setInput(var, componentCount, sw::Shader::Semantic(sw::Shader::USAGE_TEXCOORD, var)); pixelShader->setInput(var, varying->registerSize(), sw::Shader::Semantic(sw::Shader::USAGE_TEXCOORD, var));
} }
else else
{ {
for(int i = 0; i < varying->totalRegisterCount(); i++) setPixelShaderInputs(varying->getType(), var, hasFlatQualifier(varying));
{
bool flat = hasFlatQualifier(varying);
pixelShader->setInput(var + i, componentCount, sw::Shader::Semantic(sw::Shader::USAGE_COLOR, var + i, flat));
}
} }
} }
else if(vertexShader) else if(vertexShader)
...@@ -2823,26 +2839,50 @@ namespace glsl ...@@ -2823,26 +2839,50 @@ namespace glsl
{ {
if(varying->getQualifier() != EvqPointCoord) // gl_PointCoord does not need linking if(varying->getQualifier() != EvqPointCoord) // gl_PointCoord does not need linking
{ {
const TType &type = varying->getType(); TIntermSymbol *symbol = varying->getAsSymbolNode();
const char *name = varying->getAsSymbolNode()->getSymbol().c_str(); declareVarying(varying->getType(), symbol->getSymbol(), reg);
VaryingList &activeVaryings = shaderObject->varyings; }
}
void OutputASM::declareVarying(const TType &type, const TString &varyingName, int registerIndex)
{
const char *name = varyingName.c_str();
VaryingList &activeVaryings = shaderObject->varyings;
TStructure* structure = type.getStruct();
if(structure)
{
int fieldRegisterIndex = registerIndex;
const TFieldList &fields = type.getStruct()->fields();
for(size_t i = 0; i < fields.size(); i++)
{
const TType& fieldType = *(fields[i]->type());
declareVarying(fieldType, varyingName + "." + fields[i]->name(), fieldRegisterIndex);
if(fieldRegisterIndex >= 0)
{
fieldRegisterIndex += fieldType.totalRegisterCount();
}
}
}
else
{
// Check if this varying has been declared before without having a register assigned // Check if this varying has been declared before without having a register assigned
for(VaryingList::iterator v = activeVaryings.begin(); v != activeVaryings.end(); v++) for(VaryingList::iterator v = activeVaryings.begin(); v != activeVaryings.end(); v++)
{ {
if(v->name == name) if(v->name == name)
{ {
if(reg >= 0) if(registerIndex >= 0)
{ {
ASSERT(v->reg < 0 || v->reg == reg); ASSERT(v->reg < 0 || v->reg == registerIndex);
v->reg = reg; v->reg = registerIndex;
} }
return; return;
} }
} }
activeVaryings.push_back(glsl::Varying(glVariableType(type), name, varying->getArraySize(), reg, 0)); activeVaryings.push_back(glsl::Varying(glVariableType(type), name, type.getArraySize(), registerIndex, 0));
} }
} }
......
...@@ -285,7 +285,9 @@ namespace glsl ...@@ -285,7 +285,9 @@ namespace glsl
int temporaryRegister(TIntermTyped *temporary); int temporaryRegister(TIntermTyped *temporary);
int varyingRegister(TIntermTyped *varying); int varyingRegister(TIntermTyped *varying);
void setPixelShaderInputs(const TType& type, int var, bool flat);
void declareVarying(TIntermTyped *varying, int reg); void declareVarying(TIntermTyped *varying, int reg);
void declareVarying(const TType &type, const TString &name, int registerIndex);
int uniformRegister(TIntermTyped *uniform); int uniformRegister(TIntermTyped *uniform);
int attributeRegister(TIntermTyped *attribute); int attributeRegister(TIntermTyped *attribute);
int fragmentOutputRegister(TIntermTyped *fragmentOutput); int fragmentOutputRegister(TIntermTyped *fragmentOutput);
......
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