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;
......
...@@ -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