Commit 4cff2477 by Jamie Madill

Make PackedVarying a D3D-only type.

The register assignment stuff only applies to the D3D back-end. Cleans up the GL back-ends use of PackedVarying, and will lead to future cleanups relating to packing varyings. BUG=angleproject:1123 Change-Id: Iaaa5fc03577e5b61ea6ae76ee1e15ad608037f34 Reviewed-on: https://chromium-review.googlesource.com/295190Reviewed-by: 's avatarCorentin Wallez <cwallez@chromium.org> Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org> Tested-by: 's avatarJamie Madill <jmadill@chromium.org>
parent 401d9fe6
...@@ -1204,10 +1204,10 @@ bool Program::linkVaryings(InfoLog &infoLog, ...@@ -1204,10 +1204,10 @@ bool Program::linkVaryings(InfoLog &infoLog,
const Shader *vertexShader, const Shader *vertexShader,
const Shader *fragmentShader) const Shader *fragmentShader)
{ {
const std::vector<PackedVarying> &vertexVaryings = vertexShader->getVaryings(); const std::vector<sh::Varying> &vertexVaryings = vertexShader->getVaryings();
const std::vector<PackedVarying> &fragmentVaryings = fragmentShader->getVaryings(); const std::vector<sh::Varying> &fragmentVaryings = fragmentShader->getVaryings();
for (const PackedVarying &output : fragmentVaryings) for (const sh::Varying &output : fragmentVaryings)
{ {
bool matched = false; bool matched = false;
...@@ -1217,7 +1217,7 @@ bool Program::linkVaryings(InfoLog &infoLog, ...@@ -1217,7 +1217,7 @@ bool Program::linkVaryings(InfoLog &infoLog,
continue; continue;
} }
for (const PackedVarying &input : vertexVaryings) for (const sh::Varying &input : vertexVaryings)
{ {
if (output.name == input.name) if (output.name == input.name)
{ {
......
...@@ -174,7 +174,7 @@ int Shader::getShaderVersion() const ...@@ -174,7 +174,7 @@ int Shader::getShaderVersion() const
return mShader->getShaderVersion(); return mShader->getShaderVersion();
} }
const std::vector<gl::PackedVarying> &Shader::getVaryings() const const std::vector<sh::Varying> &Shader::getVaryings() const
{ {
return mShader->getVaryings(); return mShader->getVaryings();
} }
...@@ -199,7 +199,7 @@ const std::vector<sh::Attribute> &Shader::getActiveOutputVariables() const ...@@ -199,7 +199,7 @@ const std::vector<sh::Attribute> &Shader::getActiveOutputVariables() const
return mShader->getActiveOutputVariables(); return mShader->getActiveOutputVariables();
} }
std::vector<gl::PackedVarying> &Shader::getVaryings() std::vector<sh::Varying> &Shader::getVaryings()
{ {
return mShader->getVaryings(); return mShader->getVaryings();
} }
......
...@@ -33,26 +33,6 @@ class Compiler; ...@@ -33,26 +33,6 @@ class Compiler;
class ResourceManager; class ResourceManager;
struct Data; struct Data;
struct PackedVarying : public sh::Varying
{
// TODO(jmadill): Make these D3D-only or otherwise clearly separate from GL.
unsigned int registerIndex; // Assigned during link
unsigned int columnIndex; // Assigned during link, defaults to 0
PackedVarying(const sh::Varying &varying)
: sh::Varying(varying),
registerIndex(GL_INVALID_INDEX),
columnIndex(0)
{}
bool registerAssigned() const { return registerIndex != GL_INVALID_INDEX; }
void resetRegisterAssignment()
{
registerIndex = GL_INVALID_INDEX;
}
};
class Shader : angle::NonCopyable class Shader : angle::NonCopyable
{ {
public: public:
...@@ -87,13 +67,13 @@ class Shader : angle::NonCopyable ...@@ -87,13 +67,13 @@ class Shader : angle::NonCopyable
int getShaderVersion() const; int getShaderVersion() const;
const std::vector<gl::PackedVarying> &getVaryings() const; const std::vector<sh::Varying> &getVaryings() const;
const std::vector<sh::Uniform> &getUniforms() const; const std::vector<sh::Uniform> &getUniforms() const;
const std::vector<sh::InterfaceBlock> &getInterfaceBlocks() const; const std::vector<sh::InterfaceBlock> &getInterfaceBlocks() const;
const std::vector<sh::Attribute> &getActiveAttributes() const; const std::vector<sh::Attribute> &getActiveAttributes() const;
const std::vector<sh::Attribute> &getActiveOutputVariables() const; const std::vector<sh::Attribute> &getActiveOutputVariables() const;
std::vector<gl::PackedVarying> &getVaryings(); std::vector<sh::Varying> &getVaryings();
std::vector<sh::Uniform> &getUniforms(); std::vector<sh::Uniform> &getUniforms();
std::vector<sh::InterfaceBlock> &getInterfaceBlocks(); std::vector<sh::InterfaceBlock> &getInterfaceBlocks();
std::vector<sh::Attribute> &getActiveAttributes(); std::vector<sh::Attribute> &getActiveAttributes();
......
...@@ -31,13 +31,13 @@ class ShaderImpl : angle::NonCopyable ...@@ -31,13 +31,13 @@ class ShaderImpl : angle::NonCopyable
int getShaderVersion() const { return mShaderVersion; } int getShaderVersion() const { return mShaderVersion; }
const std::vector<gl::PackedVarying> &getVaryings() const { return mVaryings; } const std::vector<sh::Varying> &getVaryings() const { return mVaryings; }
const std::vector<sh::Uniform> &getUniforms() const { return mUniforms; } const std::vector<sh::Uniform> &getUniforms() const { return mUniforms; }
const std::vector<sh::InterfaceBlock> &getInterfaceBlocks() const { return mInterfaceBlocks; } const std::vector<sh::InterfaceBlock> &getInterfaceBlocks() const { return mInterfaceBlocks; }
const std::vector<sh::Attribute> &getActiveAttributes() const { return mActiveAttributes; } const std::vector<sh::Attribute> &getActiveAttributes() const { return mActiveAttributes; }
const std::vector<sh::Attribute> &getActiveOutputVariables() const { return mActiveOutputVariables; } const std::vector<sh::Attribute> &getActiveOutputVariables() const { return mActiveOutputVariables; }
std::vector<gl::PackedVarying> &getVaryings() { return mVaryings; } std::vector<sh::Varying> &getVaryings() { return mVaryings; }
std::vector<sh::Uniform> &getUniforms() { return mUniforms; } std::vector<sh::Uniform> &getUniforms() { return mUniforms; }
std::vector<sh::InterfaceBlock> &getInterfaceBlocks() { return mInterfaceBlocks; } std::vector<sh::InterfaceBlock> &getInterfaceBlocks() { return mInterfaceBlocks; }
std::vector<sh::Attribute> &getActiveAttributes() { return mActiveAttributes; } std::vector<sh::Attribute> &getActiveAttributes() { return mActiveAttributes; }
...@@ -50,7 +50,7 @@ class ShaderImpl : angle::NonCopyable ...@@ -50,7 +50,7 @@ class ShaderImpl : angle::NonCopyable
// TODO(jmadill): make part of shared non-Impl state // TODO(jmadill): make part of shared non-Impl state
int mShaderVersion; int mShaderVersion;
std::vector<gl::PackedVarying> mVaryings; std::vector<sh::Varying> mVaryings;
std::vector<sh::Uniform> mUniforms; std::vector<sh::Uniform> mUniforms;
std::vector<sh::InterfaceBlock> mInterfaceBlocks; std::vector<sh::InterfaceBlock> mInterfaceBlocks;
std::vector<sh::Attribute> mActiveAttributes; std::vector<sh::Attribute> mActiveAttributes;
......
...@@ -86,31 +86,25 @@ const PixelShaderOutputVariable *FindOutputAtLocation(const std::vector<PixelSha ...@@ -86,31 +86,25 @@ const PixelShaderOutputVariable *FindOutputAtLocation(const std::vector<PixelSha
return NULL; return NULL;
} }
const std::string VERTEX_ATTRIBUTE_STUB_STRING = "@@ VERTEX ATTRIBUTES @@"; typedef const PackedVarying *VaryingPacking[gl::IMPLEMENTATION_MAX_VARYING_VECTORS][4];
const std::string PIXEL_OUTPUT_STUB_STRING = "@@ PIXEL OUTPUT @@";
}
DynamicHLSL::DynamicHLSL(RendererD3D *const renderer)
: mRenderer(renderer)
{
}
static bool packVarying(PackedVarying *varying, const int maxVaryingVectors, VaryingPacking packing) bool PackVarying(PackedVarying *packedVarying, const int maxVaryingVectors, VaryingPacking &packing)
{ {
// Make sure we use transposed matrix types to count registers correctly. // Make sure we use transposed matrix types to count registers correctly.
int registers = 0; int registers = 0;
int elements = 0; int elements = 0;
if (varying->isStruct()) const sh::Varying &varying = *packedVarying->varying;
if (varying.isStruct())
{ {
registers = HLSLVariableRegisterCount(*varying, true) * varying->elementCount(); registers = HLSLVariableRegisterCount(varying, true) * varying.elementCount();
elements = 4; elements = 4;
} }
else else
{ {
GLenum transposedType = TransposeMatrixType(varying->type); GLenum transposedType = TransposeMatrixType(varying.type);
registers = VariableRowCount(transposedType) * varying->elementCount(); registers = VariableRowCount(transposedType) * varying.elementCount();
elements = VariableColumnCount(transposedType); elements = VariableColumnCount(transposedType);
} }
...@@ -133,14 +127,14 @@ static bool packVarying(PackedVarying *varying, const int maxVaryingVectors, Var ...@@ -133,14 +127,14 @@ static bool packVarying(PackedVarying *varying, const int maxVaryingVectors, Var
if (available) if (available)
{ {
varying->registerIndex = r; packedVarying->registerIndex = r;
varying->columnIndex = 0; packedVarying->columnIndex = 0;
for (int y = 0; y < registers; y++) for (int y = 0; y < registers; y++)
{ {
for (int x = 0; x < elements; x++) for (int x = 0; x < elements; x++)
{ {
packing[r + y][x] = &*varying; packing[r + y][x] = packedVarying;
} }
} }
...@@ -167,14 +161,14 @@ static bool packVarying(PackedVarying *varying, const int maxVaryingVectors, Var ...@@ -167,14 +161,14 @@ static bool packVarying(PackedVarying *varying, const int maxVaryingVectors, Var
if (available) if (available)
{ {
varying->registerIndex = r; packedVarying->registerIndex = r;
varying->columnIndex = 2; packedVarying->columnIndex = 2;
for (int y = 0; y < registers; y++) for (int y = 0; y < registers; y++)
{ {
for (int x = 2; x < 4; x++) for (int x = 2; x < 4; x++)
{ {
packing[r + y][x] = &*varying; packing[r + y][x] = packedVarying;
} }
} }
...@@ -211,12 +205,12 @@ static bool packVarying(PackedVarying *varying, const int maxVaryingVectors, Var ...@@ -211,12 +205,12 @@ static bool packVarying(PackedVarying *varying, const int maxVaryingVectors, Var
{ {
if (!packing[r][column]) if (!packing[r][column])
{ {
varying->registerIndex = r; packedVarying->registerIndex = r;
varying->columnIndex = column; packedVarying->columnIndex = column;
for (int y = r; y < r + registers; y++) for (int y = r; y < r + registers; y++)
{ {
packing[y][column] = &*varying; packing[y][column] = packedVarying;
} }
break; break;
...@@ -231,38 +225,51 @@ static bool packVarying(PackedVarying *varying, const int maxVaryingVectors, Var ...@@ -231,38 +225,51 @@ static bool packVarying(PackedVarying *varying, const int maxVaryingVectors, Var
return false; return false;
} }
const std::string VERTEX_ATTRIBUTE_STUB_STRING = "@@ VERTEX ATTRIBUTES @@";
const std::string PIXEL_OUTPUT_STUB_STRING = "@@ PIXEL OUTPUT @@";
}
DynamicHLSL::DynamicHLSL(RendererD3D *const renderer) : mRenderer(renderer)
{
}
// Packs varyings into generic varying registers, using the algorithm from [OpenGL ES Shading Language 1.00 rev. 17] appendix A section 7 page 111 // Packs varyings into generic varying registers, using the algorithm from [OpenGL ES Shading Language 1.00 rev. 17] appendix A section 7 page 111
// Returns the number of used varying registers, or -1 if unsuccesful // Returns the number of used varying registers, or -1 if unsuccesful
int DynamicHLSL::packVaryings(InfoLog &infoLog, VaryingPacking packing, ShaderD3D *fragmentShader, int DynamicHLSL::packVaryings(InfoLog &infoLog,
ShaderD3D *vertexShader, const std::vector<std::string> &transformFeedbackVaryings) ShaderD3D *fragmentShader,
ShaderD3D *vertexShader,
const std::vector<std::string> &transformFeedbackVaryings)
{ {
// TODO (geofflang): Use context's caps // TODO (geofflang): Use context's caps
const int maxVaryingVectors = mRenderer->getRendererCaps().maxVaryingVectors; const int maxVaryingVectors = mRenderer->getRendererCaps().maxVaryingVectors;
VaryingPacking packing = {};
vertexShader->resetVaryingsRegisterAssignment(); vertexShader->resetVaryingsRegisterAssignment();
fragmentShader->resetVaryingsRegisterAssignment(); fragmentShader->resetVaryingsRegisterAssignment();
std::set<std::string> packedVaryings; std::set<std::string> packedVaryings;
std::vector<gl::PackedVarying> &fragmentVaryings = fragmentShader->getVaryings(); std::vector<PackedVarying> &vertexVaryings = vertexShader->getPackedVaryings();
std::vector<gl::PackedVarying> &vertexVaryings = vertexShader->getVaryings(); std::vector<PackedVarying> &fragmentVaryings = fragmentShader->getPackedVaryings();
for (unsigned int varyingIndex = 0; varyingIndex < fragmentVaryings.size(); varyingIndex++) for (unsigned int varyingIndex = 0; varyingIndex < fragmentVaryings.size(); varyingIndex++)
{ {
PackedVarying *varying = &fragmentVaryings[varyingIndex]; PackedVarying *packedVarying = &fragmentVaryings[varyingIndex];
const sh::Varying &varying = *packedVarying->varying;
// Do not assign registers to built-in or unreferenced varyings // Do not assign registers to built-in or unreferenced varyings
if (varying->isBuiltIn() || !varying->staticUse) if (varying.isBuiltIn() || !varying.staticUse)
{ {
continue; continue;
} }
if (packVarying(varying, maxVaryingVectors, packing)) if (PackVarying(packedVarying, maxVaryingVectors, packing))
{ {
packedVaryings.insert(varying->name); packedVaryings.insert(varying.name);
} }
else else
{ {
infoLog << "Could not pack varying " << varying->name; infoLog << "Could not pack varying " << varying.name;
return -1; return -1;
} }
} }
...@@ -282,12 +289,13 @@ int DynamicHLSL::packVaryings(InfoLog &infoLog, VaryingPacking packing, ShaderD3 ...@@ -282,12 +289,13 @@ int DynamicHLSL::packVaryings(InfoLog &infoLog, VaryingPacking packing, ShaderD3
bool found = false; bool found = false;
for (unsigned int varyingIndex = 0; varyingIndex < vertexVaryings.size(); varyingIndex++) for (unsigned int varyingIndex = 0; varyingIndex < vertexVaryings.size(); varyingIndex++)
{ {
PackedVarying *varying = &vertexVaryings[varyingIndex]; PackedVarying *packedVarying = &vertexVaryings[varyingIndex];
if (transformFeedbackVarying == varying->name) const sh::Varying &varying = *packedVarying->varying;
if (transformFeedbackVarying == varying.name)
{ {
if (!packVarying(varying, maxVaryingVectors, packing)) if (!PackVarying(packedVarying, maxVaryingVectors, packing))
{ {
infoLog << "Could not pack varying " << varying->name; infoLog << "Could not pack varying " << varying.name;
return -1; return -1;
} }
...@@ -325,13 +333,17 @@ std::string DynamicHLSL::generateVaryingHLSL(const ShaderD3D *shader) const ...@@ -325,13 +333,17 @@ std::string DynamicHLSL::generateVaryingHLSL(const ShaderD3D *shader) const
std::string varyingSemantic = getVaryingSemantic(shader->mUsesPointSize); std::string varyingSemantic = getVaryingSemantic(shader->mUsesPointSize);
std::string varyingHLSL; std::string varyingHLSL;
const std::vector<gl::PackedVarying> &varyings = shader->getVaryings(); const std::vector<PackedVarying> &varyings = shader->getPackedVaryings();
for (unsigned int varyingIndex = 0; varyingIndex < varyings.size(); varyingIndex++) for (const PackedVarying &packedVarying : varyings)
{ {
const PackedVarying &varying = varyings[varyingIndex]; if (!packedVarying.registerAssigned())
if (varying.registerAssigned())
{ {
continue;
}
const sh::Varying &varying = *packedVarying.varying;
ASSERT(!varying.isBuiltIn()); ASSERT(!varying.isBuiltIn());
GLenum transposedType = TransposeMatrixType(varying.type); GLenum transposedType = TransposeMatrixType(varying.type);
int variableRows = (varying.isStruct() ? 1 : VariableRowCount(transposedType)); int variableRows = (varying.isStruct() ? 1 : VariableRowCount(transposedType));
...@@ -340,21 +352,32 @@ std::string DynamicHLSL::generateVaryingHLSL(const ShaderD3D *shader) const ...@@ -340,21 +352,32 @@ std::string DynamicHLSL::generateVaryingHLSL(const ShaderD3D *shader) const
{ {
for (int row = 0; row < variableRows; row++) for (int row = 0; row < variableRows; row++)
{ {
// TODO: Add checks to ensure D3D interpolation modifiers don't result in too many registers being used. // TODO: Add checks to ensure D3D interpolation modifiers don't result in too many
// For example, if there are N registers, and we have N vec3 varyings and 1 float varying, then D3D will pack them into N registers. // registers being used.
// If the float varying has the 'nointerpolation' modifier on it then we would need N + 1 registers, and D3D compilation will fail. // For example, if there are N registers, and we have N vec3 varyings and 1 float
// varying, then D3D will pack them into N registers.
// If the float varying has the 'nointerpolation' modifier on it then we would need
// N + 1 registers, and D3D compilation will fail.
switch (varying.interpolation) switch (varying.interpolation)
{ {
case sh::INTERPOLATION_SMOOTH: varyingHLSL += " "; break; case sh::INTERPOLATION_SMOOTH:
case sh::INTERPOLATION_FLAT: varyingHLSL += " nointerpolation "; break; varyingHLSL += " ";
case sh::INTERPOLATION_CENTROID: varyingHLSL += " centroid "; break; break;
default: UNREACHABLE(); case sh::INTERPOLATION_FLAT:
varyingHLSL += " nointerpolation ";
break;
case sh::INTERPOLATION_CENTROID:
varyingHLSL += " centroid ";
break;
default:
UNREACHABLE();
} }
unsigned int semanticIndex = elementIndex * variableRows + unsigned int semanticIndex =
varying.columnIndex * mRenderer->getRendererCaps().maxVaryingVectors + elementIndex * variableRows +
varying.registerIndex + row; packedVarying.columnIndex * mRenderer->getRendererCaps().maxVaryingVectors +
packedVarying.registerIndex + row;
std::string n = Str(semanticIndex); std::string n = Str(semanticIndex);
std::string typeString; std::string typeString;
...@@ -374,7 +397,6 @@ std::string DynamicHLSL::generateVaryingHLSL(const ShaderD3D *shader) const ...@@ -374,7 +397,6 @@ std::string DynamicHLSL::generateVaryingHLSL(const ShaderD3D *shader) const
} }
} }
} }
}
return varyingHLSL; return varyingHLSL;
} }
...@@ -717,21 +739,20 @@ void DynamicHLSL::storeUserLinkedVaryings(const ShaderD3D *vertexShader, ...@@ -717,21 +739,20 @@ void DynamicHLSL::storeUserLinkedVaryings(const ShaderD3D *vertexShader,
std::vector<LinkedVarying> *linkedVaryings) const std::vector<LinkedVarying> *linkedVaryings) const
{ {
const std::string &varyingSemantic = getVaryingSemantic(vertexShader->mUsesPointSize); const std::string &varyingSemantic = getVaryingSemantic(vertexShader->mUsesPointSize);
const std::vector<PackedVarying> &varyings = vertexShader->getVaryings();
for (unsigned int varyingIndex = 0; varyingIndex < varyings.size(); varyingIndex++) for (const PackedVarying &packedVarying : vertexShader->getPackedVaryings())
{ {
const PackedVarying &varying = varyings[varyingIndex]; if (packedVarying.registerAssigned())
if (varying.registerAssigned())
{ {
const sh::Varying &varying = *packedVarying.varying;
ASSERT(!varying.isBuiltIn()); ASSERT(!varying.isBuiltIn());
GLenum transposedType = TransposeMatrixType(varying.type); GLenum transposedType = TransposeMatrixType(varying.type);
int variableRows = (varying.isStruct() ? 1 : VariableRowCount(transposedType)); int variableRows = (varying.isStruct() ? 1 : VariableRowCount(transposedType));
linkedVaryings->push_back(LinkedVarying(varying.name, varying.type, varying.elementCount(), linkedVaryings->push_back(
varyingSemantic, varying.registerIndex, LinkedVarying(varying.name, varying.type, varying.elementCount(), varyingSemantic,
variableRows * varying.elementCount())); packedVarying.registerIndex, variableRows * varying.elementCount()));
} }
} }
} }
...@@ -740,7 +761,6 @@ bool DynamicHLSL::generateShaderLinkHLSL(const gl::Data &data, ...@@ -740,7 +761,6 @@ bool DynamicHLSL::generateShaderLinkHLSL(const gl::Data &data,
const gl::Program::Data &programData, const gl::Program::Data &programData,
InfoLog &infoLog, InfoLog &infoLog,
int registers, int registers,
const VaryingPacking packing,
std::string &pixelHLSL, std::string &pixelHLSL,
std::string &vertexHLSL, std::string &vertexHLSL,
std::vector<LinkedVarying> *linkedVaryings, std::vector<LinkedVarying> *linkedVaryings,
...@@ -861,19 +881,26 @@ bool DynamicHLSL::generateShaderLinkHLSL(const gl::Data &data, ...@@ -861,19 +881,26 @@ bool DynamicHLSL::generateShaderLinkHLSL(const gl::Data &data,
vertexHLSL += " output.gl_FragCoord = gl_Position;\n"; vertexHLSL += " output.gl_FragCoord = gl_Position;\n";
} }
const std::vector<PackedVarying> &vertexVaryings = vertexShader->getVaryings(); const std::vector<PackedVarying> &vertexVaryings = vertexShader->getPackedVaryings();
for (unsigned int vertVaryingIndex = 0; vertVaryingIndex < vertexVaryings.size(); vertVaryingIndex++) for (const PackedVarying &packedVarying : vertexVaryings)
{ {
const PackedVarying &varying = vertexVaryings[vertVaryingIndex]; if (!packedVarying.registerAssigned())
if (varying.registerAssigned())
{ {
continue;
}
const sh::Varying &varying = *packedVarying.varying;
for (unsigned int elementIndex = 0; elementIndex < varying.elementCount(); elementIndex++) for (unsigned int elementIndex = 0; elementIndex < varying.elementCount(); elementIndex++)
{ {
int variableRows = (varying.isStruct() ? 1 : VariableRowCount(TransposeMatrixType(varying.type))); int variableRows =
(varying.isStruct() ? 1 : VariableRowCount(TransposeMatrixType(varying.type)));
for (int row = 0; row < variableRows; row++) for (int row = 0; row < variableRows; row++)
{ {
int r = varying.registerIndex + varying.columnIndex * data.caps->maxVaryingVectors + elementIndex * variableRows + row; int r = packedVarying.registerIndex +
packedVarying.columnIndex * data.caps->maxVaryingVectors +
elementIndex * variableRows + row;
vertexHLSL += " output.v" + Str(r); vertexHLSL += " output.v" + Str(r);
vertexHLSL += " = _" + varying.name; vertexHLSL += " = _" + varying.name;
...@@ -892,7 +919,6 @@ bool DynamicHLSL::generateShaderLinkHLSL(const gl::Data &data, ...@@ -892,7 +919,6 @@ bool DynamicHLSL::generateShaderLinkHLSL(const gl::Data &data,
} }
} }
} }
}
// Instanced PointSprite emulation requires additional entries to calculate // Instanced PointSprite emulation requires additional entries to calculate
// the final output vertex positions of the quad that represents each sprite. // the final output vertex positions of the quad that represents each sprite.
...@@ -1025,12 +1051,17 @@ bool DynamicHLSL::generateShaderLinkHLSL(const gl::Data &data, ...@@ -1025,12 +1051,17 @@ bool DynamicHLSL::generateShaderLinkHLSL(const gl::Data &data,
} }
} }
const std::vector<PackedVarying> &fragmentVaryings = fragmentShader->getVaryings(); const std::vector<PackedVarying> &fragmentVaryings = fragmentShader->getPackedVaryings();
for (unsigned int varyingIndex = 0; varyingIndex < fragmentVaryings.size(); varyingIndex++) for (const PackedVarying &packedVarying : fragmentVaryings)
{ {
const PackedVarying &varying = fragmentVaryings[varyingIndex]; const sh::Varying &varying = *packedVarying.varying;
if (varying.registerAssigned())
if (!packedVarying.registerAssigned())
{ {
ASSERT(varying.isBuiltIn() || !varying.staticUse);
continue;
}
ASSERT(!varying.isBuiltIn()); ASSERT(!varying.isBuiltIn());
for (unsigned int elementIndex = 0; elementIndex < varying.elementCount(); elementIndex++) for (unsigned int elementIndex = 0; elementIndex < varying.elementCount(); elementIndex++)
{ {
...@@ -1038,7 +1069,9 @@ bool DynamicHLSL::generateShaderLinkHLSL(const gl::Data &data, ...@@ -1038,7 +1069,9 @@ bool DynamicHLSL::generateShaderLinkHLSL(const gl::Data &data,
int variableRows = (varying.isStruct() ? 1 : VariableRowCount(transposedType)); int variableRows = (varying.isStruct() ? 1 : VariableRowCount(transposedType));
for (int row = 0; row < variableRows; row++) for (int row = 0; row < variableRows; row++)
{ {
std::string n = Str(varying.registerIndex + varying.columnIndex * data.caps->maxVaryingVectors + elementIndex * variableRows + row); std::string n = Str(packedVarying.registerIndex +
packedVarying.columnIndex * data.caps->maxVaryingVectors +
elementIndex * variableRows + row);
pixelHLSL += " _" + varying.name; pixelHLSL += " _" + varying.name;
if (varying.isArray()) if (varying.isArray())
...@@ -1053,25 +1086,30 @@ bool DynamicHLSL::generateShaderLinkHLSL(const gl::Data &data, ...@@ -1053,25 +1086,30 @@ bool DynamicHLSL::generateShaderLinkHLSL(const gl::Data &data,
if (varying.isStruct()) if (varying.isStruct())
{ {
pixelHLSL += " = input.v" + n + ";\n"; break; pixelHLSL += " = input.v" + n + ";\n";
break;
} }
else else
{ {
switch (VariableColumnCount(transposedType)) switch (VariableColumnCount(transposedType))
{ {
case 1: pixelHLSL += " = input.v" + n + ".x;\n"; break; case 1:
case 2: pixelHLSL += " = input.v" + n + ".xy;\n"; break; pixelHLSL += " = input.v" + n + ".x;\n";
case 3: pixelHLSL += " = input.v" + n + ".xyz;\n"; break; break;
case 4: pixelHLSL += " = input.v" + n + ";\n"; break; case 2:
default: UNREACHABLE(); pixelHLSL += " = input.v" + n + ".xy;\n";
} break;
} case 3:
pixelHLSL += " = input.v" + n + ".xyz;\n";
break;
case 4:
pixelHLSL += " = input.v" + n + ";\n";
break;
default:
UNREACHABLE();
} }
} }
} }
else
{
ASSERT(varying.isBuiltIn() || !varying.staticUse);
} }
} }
......
...@@ -30,7 +30,6 @@ class InfoLog; ...@@ -30,7 +30,6 @@ class InfoLog;
struct VariableLocation; struct VariableLocation;
struct LinkedVarying; struct LinkedVarying;
struct VertexAttribute; struct VertexAttribute;
struct PackedVarying;
struct Data; struct Data;
} }
...@@ -39,8 +38,6 @@ namespace rx ...@@ -39,8 +38,6 @@ namespace rx
class RendererD3D; class RendererD3D;
class ShaderD3D; class ShaderD3D;
typedef const gl::PackedVarying *VaryingPacking[gl::IMPLEMENTATION_MAX_VARYING_VECTORS][4];
struct PixelShaderOutputVariable struct PixelShaderOutputVariable
{ {
GLenum type; GLenum type;
...@@ -54,8 +51,10 @@ class DynamicHLSL : angle::NonCopyable ...@@ -54,8 +51,10 @@ class DynamicHLSL : angle::NonCopyable
public: public:
explicit DynamicHLSL(RendererD3D *const renderer); explicit DynamicHLSL(RendererD3D *const renderer);
int packVaryings(gl::InfoLog &infoLog, VaryingPacking packing, ShaderD3D *fragmentShader, int packVaryings(gl::InfoLog &infoLog,
ShaderD3D *vertexShader, const std::vector<std::string>& transformFeedbackVaryings); ShaderD3D *fragmentShader,
ShaderD3D *vertexShader,
const std::vector<std::string> &transformFeedbackVaryings);
std::string generateVertexShaderForInputLayout(const std::string &sourceShader, std::string generateVertexShaderForInputLayout(const std::string &sourceShader,
const gl::InputLayout &inputLayout, const gl::InputLayout &inputLayout,
const std::vector<sh::Attribute> &shaderAttributes) const; const std::vector<sh::Attribute> &shaderAttributes) const;
...@@ -65,7 +64,6 @@ class DynamicHLSL : angle::NonCopyable ...@@ -65,7 +64,6 @@ class DynamicHLSL : angle::NonCopyable
const gl::Program::Data &programData, const gl::Program::Data &programData,
gl::InfoLog &infoLog, gl::InfoLog &infoLog,
int registers, int registers,
const VaryingPacking packing,
std::string &pixelHLSL, std::string &pixelHLSL,
std::string &vertexHLSL, std::string &vertexHLSL,
std::vector<gl::LinkedVarying> *linkedVaryings, std::vector<gl::LinkedVarying> *linkedVaryings,
......
...@@ -131,19 +131,19 @@ bool LinkVaryingRegisters(gl::InfoLog &infoLog, ...@@ -131,19 +131,19 @@ bool LinkVaryingRegisters(gl::InfoLog &infoLog,
ShaderD3D *vertexShaderD3D, ShaderD3D *vertexShaderD3D,
ShaderD3D *fragmentShaderD3D) ShaderD3D *fragmentShaderD3D)
{ {
for (gl::PackedVarying &input : fragmentShaderD3D->getVaryings()) for (PackedVarying &input : fragmentShaderD3D->getPackedVaryings())
{ {
bool matched = false; bool matched = false;
// Built-in varyings obey special rules // Built-in varyings obey special rules
if (input.isBuiltIn()) if (input.varying->isBuiltIn())
{ {
continue; continue;
} }
for (gl::PackedVarying &output : vertexShaderD3D->getVaryings()) for (PackedVarying &output : vertexShaderD3D->getPackedVaryings())
{ {
if (output.name == input.name) if (output.varying->name == input.varying->name)
{ {
output.registerIndex = input.registerIndex; output.registerIndex = input.registerIndex;
output.columnIndex = input.columnIndex; output.columnIndex = input.columnIndex;
...@@ -154,7 +154,7 @@ bool LinkVaryingRegisters(gl::InfoLog &infoLog, ...@@ -154,7 +154,7 @@ bool LinkVaryingRegisters(gl::InfoLog &infoLog,
} }
// We permit unmatched, unreferenced varyings // We permit unmatched, unreferenced varyings
ASSERT(matched || !input.staticUse); ASSERT(matched || !input.varying->staticUse);
} }
return true; return true;
...@@ -1137,8 +1137,7 @@ LinkResult ProgramD3D::link(const gl::Data &data, ...@@ -1137,8 +1137,7 @@ LinkResult ProgramD3D::link(const gl::Data &data,
} }
// Map the varyings to the register file // Map the varyings to the register file
VaryingPacking packing = {}; int registers = mDynamicHLSL->packVaryings(infoLog, fragmentShaderD3D, vertexShaderD3D,
int registers = mDynamicHLSL->packVaryings(infoLog, packing, fragmentShaderD3D, vertexShaderD3D,
mData.getTransformFeedbackVaryingNames()); mData.getTransformFeedbackVaryingNames());
if (registers < 0) if (registers < 0)
...@@ -1149,7 +1148,7 @@ LinkResult ProgramD3D::link(const gl::Data &data, ...@@ -1149,7 +1148,7 @@ LinkResult ProgramD3D::link(const gl::Data &data,
LinkVaryingRegisters(infoLog, vertexShaderD3D, fragmentShaderD3D); LinkVaryingRegisters(infoLog, vertexShaderD3D, fragmentShaderD3D);
std::vector<gl::LinkedVarying> linkedVaryings; std::vector<gl::LinkedVarying> linkedVaryings;
if (!mDynamicHLSL->generateShaderLinkHLSL(data, mData, infoLog, registers, packing, mPixelHLSL, if (!mDynamicHLSL->generateShaderLinkHLSL(data, mData, infoLog, registers, mPixelHLSL,
mVertexHLSL, &linkedVaryings, &mPixelShaderKey, mVertexHLSL, &linkedVaryings, &mPixelShaderKey,
&mUsesFragDepth)) &mUsesFragDepth))
{ {
......
...@@ -35,6 +35,27 @@ const char *GetShaderTypeString(GLenum type) ...@@ -35,6 +35,27 @@ const char *GetShaderTypeString(GLenum type)
} }
} }
// true if varying x has a higher priority in packing than y
bool CompareVarying(const sh::Varying &x, const sh::Varying &y)
{
if (x.type == y.type)
{
return x.arraySize > y.arraySize;
}
// Special case for handling structs: we sort these to the end of the list
if (x.type == GL_STRUCT_ANGLEX)
{
return false;
}
if (y.type == GL_STRUCT_ANGLEX)
{
return true;
}
return gl::VariableSortOrder(x.type) < gl::VariableSortOrder(y.type);
}
} }
namespace rx namespace rx
...@@ -87,9 +108,11 @@ void ShaderD3D::parseVaryings(ShHandle compiler) ...@@ -87,9 +108,11 @@ void ShaderD3D::parseVaryings(ShHandle compiler)
const std::vector<sh::Varying> *varyings = ShGetVaryings(compiler); const std::vector<sh::Varying> *varyings = ShGetVaryings(compiler);
ASSERT(varyings); ASSERT(varyings);
mVaryings = *varyings;
for (size_t varyingIndex = 0; varyingIndex < varyings->size(); varyingIndex++) for (size_t varyingIndex = 0; varyingIndex < varyings->size(); varyingIndex++)
{ {
mVaryings.push_back(gl::PackedVarying((*varyings)[varyingIndex])); mPackedVaryings.push_back(PackedVarying(mVaryings[varyingIndex]));
} }
mUsesMultipleRenderTargets = mTranslatedSource.find("GL_USES_MRT") != std::string::npos; mUsesMultipleRenderTargets = mTranslatedSource.find("GL_USES_MRT") != std::string::npos;
...@@ -112,7 +135,7 @@ void ShaderD3D::resetVaryingsRegisterAssignment() ...@@ -112,7 +135,7 @@ void ShaderD3D::resetVaryingsRegisterAssignment()
{ {
for (size_t varyingIndex = 0; varyingIndex < mVaryings.size(); varyingIndex++) for (size_t varyingIndex = 0; varyingIndex < mVaryings.size(); varyingIndex++)
{ {
mVaryings[varyingIndex].resetRegisterAssignment(); mPackedVaryings[varyingIndex].resetRegisterAssignment();
} }
} }
...@@ -285,28 +308,6 @@ void ShaderD3D::generateWorkarounds(D3DCompilerWorkarounds *workarounds) const ...@@ -285,28 +308,6 @@ void ShaderD3D::generateWorkarounds(D3DCompilerWorkarounds *workarounds) const
} }
} }
// true if varying x has a higher priority in packing than y
bool ShaderD3D::compareVarying(const gl::PackedVarying &x, const gl::PackedVarying &y)
{
if (x.type == y.type)
{
return x.arraySize > y.arraySize;
}
// Special case for handling structs: we sort these to the end of the list
if (x.type == GL_STRUCT_ANGLEX)
{
return false;
}
if (y.type == GL_STRUCT_ANGLEX)
{
return true;
}
return gl::VariableSortOrder(x.type) < gl::VariableSortOrder(y.type);
}
unsigned int ShaderD3D::getUniformRegister(const std::string &uniformName) const unsigned int ShaderD3D::getUniformRegister(const std::string &uniformName) const
{ {
ASSERT(mUniformRegisterMap.count(uniformName) > 0); ASSERT(mUniformRegisterMap.count(uniformName) > 0);
...@@ -349,7 +350,7 @@ bool ShaderD3D::compile(gl::Compiler *compiler, const std::string &source) ...@@ -349,7 +350,7 @@ bool ShaderD3D::compile(gl::Compiler *compiler, const std::string &source)
if (mShaderType == GL_FRAGMENT_SHADER) if (mShaderType == GL_FRAGMENT_SHADER)
{ {
std::sort(mVaryings.begin(), mVaryings.end(), compareVarying); std::sort(mVaryings.begin(), mVaryings.end(), CompareVarying);
const std::string &hlsl = getTranslatedSource(); const std::string &hlsl = getTranslatedSource();
if (!hlsl.empty()) if (!hlsl.empty())
......
...@@ -20,6 +20,24 @@ namespace rx ...@@ -20,6 +20,24 @@ namespace rx
class DynamicHLSL; class DynamicHLSL;
class RendererD3D; class RendererD3D;
struct PackedVarying
{
PackedVarying(const sh::Varying &varyingIn)
: varying(&varyingIn), registerIndex(GL_INVALID_INDEX), columnIndex(0)
{
}
bool registerAssigned() const { return registerIndex != GL_INVALID_INDEX; }
void resetRegisterAssignment() { registerIndex = GL_INVALID_INDEX; }
const sh::Varying *varying;
// TODO(jmadill): Make these D3D-only or otherwise clearly separate from GL.
unsigned int registerIndex; // Assigned during link
unsigned int columnIndex; // Assigned during link, defaults to 0
};
class ShaderD3D : public ShaderImpl class ShaderD3D : public ShaderImpl
{ {
friend class DynamicHLSL; friend class DynamicHLSL;
...@@ -50,14 +68,17 @@ class ShaderD3D : public ShaderImpl ...@@ -50,14 +68,17 @@ class ShaderD3D : public ShaderImpl
virtual bool compile(gl::Compiler *compiler, const std::string &source); virtual bool compile(gl::Compiler *compiler, const std::string &source);
const std::vector<PackedVarying> &getPackedVaryings() const { return mPackedVaryings; }
// TODO(jmadill): remove this
std::vector<PackedVarying> &getPackedVaryings() { return mPackedVaryings; }
private: private:
void compileToHLSL(ShHandle compiler, const std::string &source); void compileToHLSL(ShHandle compiler, const std::string &source);
void parseVaryings(ShHandle compiler); void parseVaryings(ShHandle compiler);
void parseAttributes(ShHandle compiler); void parseAttributes(ShHandle compiler);
static bool compareVarying(const gl::PackedVarying &x, const gl::PackedVarying &y);
GLenum mShaderType; GLenum mShaderType;
bool mUsesMultipleRenderTargets; bool mUsesMultipleRenderTargets;
...@@ -79,6 +100,7 @@ class ShaderD3D : public ShaderImpl ...@@ -79,6 +100,7 @@ class ShaderD3D : public ShaderImpl
std::map<std::string, unsigned int> mUniformRegisterMap; std::map<std::string, unsigned int> mUniformRegisterMap;
std::map<std::string, unsigned int> mInterfaceBlockRegisterMap; std::map<std::string, unsigned int> mInterfaceBlockRegisterMap;
RendererD3D *mRenderer; RendererD3D *mRenderer;
std::vector<PackedVarying> mPackedVaryings;
}; };
} }
......
...@@ -123,12 +123,7 @@ bool ShaderGL::compile(gl::Compiler *compiler, const std::string &source) ...@@ -123,12 +123,7 @@ bool ShaderGL::compile(gl::Compiler *compiler, const std::string &source)
mActiveAttributes = GetFilteredShaderVariables(ShGetAttributes(compilerHandle)); mActiveAttributes = GetFilteredShaderVariables(ShGetAttributes(compilerHandle));
} }
const std::vector<sh::Varying> &varyings = GetShaderVariables(ShGetVaryings(compilerHandle)); mVaryings = GetShaderVariables(ShGetVaryings(compilerHandle));
for (size_t varyingIndex = 0; varyingIndex < varyings.size(); varyingIndex++)
{
mVaryings.push_back(gl::PackedVarying(varyings[varyingIndex]));
}
mUniforms = GetShaderVariables(ShGetUniforms(compilerHandle)); mUniforms = GetShaderVariables(ShGetUniforms(compilerHandle));
mInterfaceBlocks = GetShaderVariables(ShGetInterfaceBlocks(compilerHandle)); mInterfaceBlocks = GetShaderVariables(ShGetInterfaceBlocks(compilerHandle));
......
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