Commit a6da33a1 by Jamie Madill

Remove the gl::Varying class, and replace all usages with sh::Varying.

TRAC #23746 Signed-off-by: Nicolas Capens Signed-off-by: Shannon Woods
parent 139b9091
...@@ -43,10 +43,18 @@ InterfaceBlockField::InterfaceBlockField(GLenum typeIn, GLenum precisionIn, cons ...@@ -43,10 +43,18 @@ InterfaceBlockField::InterfaceBlockField(GLenum typeIn, GLenum precisionIn, cons
Varying::Varying(GLenum typeIn, GLenum precisionIn, const char *nameIn, unsigned int arraySizeIn, InterpolationType interpolationIn) Varying::Varying(GLenum typeIn, GLenum precisionIn, const char *nameIn, unsigned int arraySizeIn, InterpolationType interpolationIn)
: ShaderVariable(typeIn, precisionIn, nameIn, arraySizeIn), : ShaderVariable(typeIn, precisionIn, nameIn, arraySizeIn),
interpolation(interpolationIn) interpolation(interpolationIn),
registerIndex(GL_INVALID_INDEX),
elementIndex(GL_INVALID_INDEX)
{ {
} }
void Varying::resetRegisterAssignment()
{
registerIndex = GL_INVALID_INDEX;
elementIndex = GL_INVALID_INDEX;
}
BlockMemberInfo::BlockMemberInfo(int offset, int arrayStride, int matrixStride, bool isRowMajorMatrix) BlockMemberInfo::BlockMemberInfo(int offset, int arrayStride, int matrixStride, bool isRowMajorMatrix)
: offset(offset), : offset(offset),
arrayStride(arrayStride), arrayStride(arrayStride),
......
...@@ -32,6 +32,8 @@ struct ShaderVariable ...@@ -32,6 +32,8 @@ struct ShaderVariable
unsigned int arraySize; unsigned int arraySize;
ShaderVariable(GLenum type, GLenum precision, const char *name, unsigned int arraySize); ShaderVariable(GLenum type, GLenum precision, const char *name, unsigned int arraySize);
bool isArray() const { return arraySize > 0; }
unsigned int elementCount() const { return std::max(1u, arraySize); }
}; };
struct Uniform : public ShaderVariable struct Uniform : public ShaderVariable
...@@ -66,10 +68,15 @@ struct Varying : public ShaderVariable ...@@ -66,10 +68,15 @@ struct Varying : public ShaderVariable
{ {
InterpolationType interpolation; InterpolationType interpolation;
std::vector<Varying> fields; std::vector<Varying> fields;
unsigned int registerIndex; // Assigned during link
unsigned int elementIndex; // First register element for varyings, assigned during link
Varying(GLenum typeIn, GLenum precisionIn, const char *nameIn, unsigned int arraySizeIn, InterpolationType interpolationIn); Varying(GLenum typeIn, GLenum precisionIn, const char *nameIn, unsigned int arraySizeIn, InterpolationType interpolationIn);
bool isStruct() const { return !fields.empty(); } bool isStruct() const { return !fields.empty(); }
bool registerAssigned() const { return registerIndex != GL_INVALID_INDEX; }
void resetRegisterAssignment();
}; };
struct BlockMemberInfo struct BlockMemberInfo
......
...@@ -926,7 +926,7 @@ bool ProgramBinary::applyUniformBuffers(const std::vector<gl::Buffer*> boundBuff ...@@ -926,7 +926,7 @@ bool ProgramBinary::applyUniformBuffers(const std::vector<gl::Buffer*> boundBuff
// 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 ProgramBinary::packVaryings(InfoLog &infoLog, const Varying *packing[][4], FragmentShader *fragmentShader) int ProgramBinary::packVaryings(InfoLog &infoLog, const sh::ShaderVariable *packing[][4], FragmentShader *fragmentShader)
{ {
const int maxVaryingVectors = mRenderer->getMaxVaryingVectors(); const int maxVaryingVectors = mRenderer->getMaxVaryingVectors();
...@@ -934,7 +934,7 @@ int ProgramBinary::packVaryings(InfoLog &infoLog, const Varying *packing[][4], F ...@@ -934,7 +934,7 @@ int ProgramBinary::packVaryings(InfoLog &infoLog, const Varying *packing[][4], F
for (unsigned int varyingIndex = 0; varyingIndex < fragmentShader->mVaryings.size(); varyingIndex++) for (unsigned int varyingIndex = 0; varyingIndex < fragmentShader->mVaryings.size(); varyingIndex++)
{ {
Varying *varying = &fragmentShader->mVaryings[varyingIndex]; sh::Varying *varying = &fragmentShader->mVaryings[varyingIndex];
GLenum transposedType = TransposeMatrixType(varying->type); GLenum transposedType = TransposeMatrixType(varying->type);
int n = VariableRowCount(transposedType) * varying->elementCount(); int n = VariableRowCount(transposedType) * varying->elementCount();
int m = VariableColumnCount(transposedType); int m = VariableColumnCount(transposedType);
...@@ -1103,7 +1103,7 @@ void ProgramBinary::defineOutputVariables(FragmentShader *fragmentShader) ...@@ -1103,7 +1103,7 @@ void ProgramBinary::defineOutputVariables(FragmentShader *fragmentShader)
} }
} }
bool ProgramBinary::linkVaryings(InfoLog &infoLog, int registers, const Varying *packing[][4], bool ProgramBinary::linkVaryings(InfoLog &infoLog, int registers, const sh::ShaderVariable *packing[][4],
std::string& pixelHLSL, std::string& vertexHLSL, std::string& pixelHLSL, std::string& vertexHLSL,
FragmentShader *fragmentShader, VertexShader *vertexShader) FragmentShader *fragmentShader, VertexShader *vertexShader)
{ {
...@@ -1144,12 +1144,12 @@ bool ProgramBinary::linkVaryings(InfoLog &infoLog, int registers, const Varying ...@@ -1144,12 +1144,12 @@ bool ProgramBinary::linkVaryings(InfoLog &infoLog, int registers, const Varying
for (unsigned int fragVaryingIndex = 0; fragVaryingIndex < fragmentShader->mVaryings.size(); fragVaryingIndex++) for (unsigned int fragVaryingIndex = 0; fragVaryingIndex < fragmentShader->mVaryings.size(); fragVaryingIndex++)
{ {
Varying *input = &fragmentShader->mVaryings[fragVaryingIndex]; sh::Varying *input = &fragmentShader->mVaryings[fragVaryingIndex];
bool matched = false; bool matched = false;
for (unsigned int vertVaryingIndex = 0; vertVaryingIndex < vertexShader->mVaryings.size(); vertVaryingIndex++) for (unsigned int vertVaryingIndex = 0; vertVaryingIndex < vertexShader->mVaryings.size(); vertVaryingIndex++)
{ {
Varying *output = &vertexShader->mVaryings[vertVaryingIndex]; sh::Varying *output = &vertexShader->mVaryings[vertVaryingIndex];
if (output->name == input->name) if (output->name == input->name)
{ {
if (output->type != input->type || output->arraySize != input->arraySize || output->interpolation != input->interpolation) if (output->type != input->type || output->arraySize != input->arraySize || output->interpolation != input->interpolation)
...@@ -1301,7 +1301,7 @@ bool ProgramBinary::linkVaryings(InfoLog &infoLog, int registers, const Varying ...@@ -1301,7 +1301,7 @@ bool ProgramBinary::linkVaryings(InfoLog &infoLog, int registers, const Varying
for (unsigned int vertVaryingIndex = 0; vertVaryingIndex < vertexShader->mVaryings.size(); vertVaryingIndex++) for (unsigned int vertVaryingIndex = 0; vertVaryingIndex < vertexShader->mVaryings.size(); vertVaryingIndex++)
{ {
Varying *varying = &vertexShader->mVaryings[vertVaryingIndex]; sh::Varying *varying = &vertexShader->mVaryings[vertVaryingIndex];
if (varying->registerAssigned()) if (varying->registerAssigned())
{ {
for (unsigned int elementIndex = 0; elementIndex < varying->elementCount(); elementIndex++) for (unsigned int elementIndex = 0; elementIndex < varying->elementCount(); elementIndex++)
...@@ -1500,7 +1500,7 @@ bool ProgramBinary::linkVaryings(InfoLog &infoLog, int registers, const Varying ...@@ -1500,7 +1500,7 @@ bool ProgramBinary::linkVaryings(InfoLog &infoLog, int registers, const Varying
for (unsigned int varyingIndex = 0; varyingIndex < fragmentShader->mVaryings.size(); varyingIndex++) for (unsigned int varyingIndex = 0; varyingIndex < fragmentShader->mVaryings.size(); varyingIndex++)
{ {
Varying *varying = &fragmentShader->mVaryings[varyingIndex]; sh::Varying *varying = &fragmentShader->mVaryings[varyingIndex];
if (varying->registerAssigned()) if (varying->registerAssigned())
{ {
for (unsigned int elementIndex = 0; elementIndex < varying->elementCount(); elementIndex++) for (unsigned int elementIndex = 0; elementIndex < varying->elementCount(); elementIndex++)
...@@ -1581,7 +1581,7 @@ std::string ProgramBinary::generateVaryingHLSL(FragmentShader *fragmentShader, c ...@@ -1581,7 +1581,7 @@ std::string ProgramBinary::generateVaryingHLSL(FragmentShader *fragmentShader, c
for (unsigned int varyingIndex = 0; varyingIndex < fragmentShader->mVaryings.size(); varyingIndex++) for (unsigned int varyingIndex = 0; varyingIndex < fragmentShader->mVaryings.size(); varyingIndex++)
{ {
Varying *varying = &fragmentShader->mVaryings[varyingIndex]; sh::Varying *varying = &fragmentShader->mVaryings[varyingIndex];
if (varying->registerAssigned()) if (varying->registerAssigned())
{ {
for (unsigned int elementIndex = 0; elementIndex < varying->elementCount(); elementIndex++) for (unsigned int elementIndex = 0; elementIndex < varying->elementCount(); elementIndex++)
...@@ -2004,7 +2004,7 @@ bool ProgramBinary::link(InfoLog &infoLog, const AttributeBindings &attributeBin ...@@ -2004,7 +2004,7 @@ bool ProgramBinary::link(InfoLog &infoLog, const AttributeBindings &attributeBin
std::string vertexHLSL = vertexShader->getHLSL(); std::string vertexHLSL = vertexShader->getHLSL();
// Map the varyings to the register file // Map the varyings to the register file
const Varying *packing[IMPLEMENTATION_MAX_VARYING_VECTORS][4] = {NULL}; const sh::ShaderVariable *packing[IMPLEMENTATION_MAX_VARYING_VECTORS][4] = {NULL};
int registers = packVaryings(infoLog, packing, fragmentShader); int registers = packVaryings(infoLog, packing, fragmentShader);
if (registers < 0) if (registers < 0)
...@@ -2691,14 +2691,14 @@ bool ProgramBinary::assignUniformBlockRegister(InfoLog &infoLog, UniformBlock *u ...@@ -2691,14 +2691,14 @@ bool ProgramBinary::assignUniformBlockRegister(InfoLog &infoLog, UniformBlock *u
return true; return true;
} }
std::string ProgramBinary::generateGeometryShaderHLSL(int registers, const Varying *packing[][4], FragmentShader *fragmentShader, VertexShader *vertexShader) const std::string ProgramBinary::generateGeometryShaderHLSL(int registers, const sh::ShaderVariable *packing[][4], FragmentShader *fragmentShader, VertexShader *vertexShader) const
{ {
// for now we only handle point sprite emulation // for now we only handle point sprite emulation
ASSERT(usesPointSpriteEmulation()); ASSERT(usesPointSpriteEmulation());
return generatePointSpriteHLSL(registers, packing, fragmentShader, vertexShader); return generatePointSpriteHLSL(registers, packing, fragmentShader, vertexShader);
} }
std::string ProgramBinary::generatePointSpriteHLSL(int registers, const Varying *packing[][4], FragmentShader *fragmentShader, VertexShader *vertexShader) const std::string ProgramBinary::generatePointSpriteHLSL(int registers, const sh::ShaderVariable *packing[][4], FragmentShader *fragmentShader, VertexShader *vertexShader) const
{ {
ASSERT(registers >= 0); ASSERT(registers >= 0);
ASSERT(vertexShader->mUsesPointSize); ASSERT(vertexShader->mUsesPointSize);
......
...@@ -39,7 +39,6 @@ class FragmentShader; ...@@ -39,7 +39,6 @@ class FragmentShader;
class VertexShader; class VertexShader;
class InfoLog; class InfoLog;
class AttributeBindings; class AttributeBindings;
struct Varying;
class Buffer; class Buffer;
// Struct used for correlating uniforms/elements of uniform arrays to handles // Struct used for correlating uniforms/elements of uniform arrays to handles
...@@ -148,8 +147,8 @@ class ProgramBinary : public RefCountObject ...@@ -148,8 +147,8 @@ class ProgramBinary : public RefCountObject
private: private:
DISALLOW_COPY_AND_ASSIGN(ProgramBinary); DISALLOW_COPY_AND_ASSIGN(ProgramBinary);
int packVaryings(InfoLog &infoLog, const Varying *packing[][4], FragmentShader *fragmentShader); int packVaryings(InfoLog &infoLog, const sh::ShaderVariable *packing[][4], FragmentShader *fragmentShader);
bool linkVaryings(InfoLog &infoLog, int registers, const Varying *packing[][4], bool linkVaryings(InfoLog &infoLog, int registers, const sh::ShaderVariable *packing[][4],
std::string& pixelHLSL, std::string& vertexHLSL, std::string& pixelHLSL, std::string& vertexHLSL,
FragmentShader *fragmentShader, VertexShader *vertexShader); FragmentShader *fragmentShader, VertexShader *vertexShader);
std::string generateVaryingHLSL(FragmentShader *fragmentShader, const std::string &varyingSemantic) const; std::string generateVaryingHLSL(FragmentShader *fragmentShader, const std::string &varyingSemantic) const;
...@@ -173,8 +172,8 @@ class ProgramBinary : public RefCountObject ...@@ -173,8 +172,8 @@ class ProgramBinary : public RefCountObject
bool assignUniformBlockRegister(InfoLog &infoLog, UniformBlock *uniformBlock, GLenum shader, unsigned int registerIndex); bool assignUniformBlockRegister(InfoLog &infoLog, UniformBlock *uniformBlock, GLenum shader, unsigned int registerIndex);
void defineOutputVariables(FragmentShader *fragmentShader); void defineOutputVariables(FragmentShader *fragmentShader);
std::string generateGeometryShaderHLSL(int registers, const Varying *packing[][4], FragmentShader *fragmentShader, VertexShader *vertexShader) const; std::string generateGeometryShaderHLSL(int registers, const sh::ShaderVariable *packing[][4], FragmentShader *fragmentShader, VertexShader *vertexShader) const;
std::string generatePointSpriteHLSL(int registers, const Varying *packing[][4], FragmentShader *fragmentShader, VertexShader *vertexShader) const; std::string generatePointSpriteHLSL(int registers, const sh::ShaderVariable *packing[][4], FragmentShader *fragmentShader, VertexShader *vertexShader) const;
template <typename T> template <typename T>
bool setUniform(GLint location, GLsizei count, const T* v, GLenum targetUniformType); bool setUniform(GLint location, GLsizei count, const T* v, GLenum targetUniformType);
......
...@@ -221,11 +221,7 @@ void Shader::parseVaryings(void *compiler) ...@@ -221,11 +221,7 @@ void Shader::parseVaryings(void *compiler)
{ {
std::vector<sh::Varying> *activeVaryings; std::vector<sh::Varying> *activeVaryings;
ShGetInfoPointer(compiler, SH_ACTIVE_VARYINGS_ARRAY, reinterpret_cast<void**>(&activeVaryings)); ShGetInfoPointer(compiler, SH_ACTIVE_VARYINGS_ARRAY, reinterpret_cast<void**>(&activeVaryings));
mVaryings = *activeVaryings;
for (unsigned int varyingIndex = 0; varyingIndex < activeVaryings->size(); varyingIndex++)
{
mVaryings.push_back(Varying((*activeVaryings)[varyingIndex]));
}
mUsesMultipleRenderTargets = mHlsl.find("GL_USES_MRT") != std::string::npos; mUsesMultipleRenderTargets = mHlsl.find("GL_USES_MRT") != std::string::npos;
mUsesFragColor = mHlsl.find("GL_USES_FRAG_COLOR") != std::string::npos; mUsesFragColor = mHlsl.find("GL_USES_FRAG_COLOR") != std::string::npos;
...@@ -414,7 +410,7 @@ static const GLenum varyingPriorityList[] = ...@@ -414,7 +410,7 @@ static const GLenum varyingPriorityList[] =
}; };
// true if varying x has a higher priority in packing than y // true if varying x has a higher priority in packing than y
bool Shader::compareVarying(const Varying &x, const Varying &y) bool Shader::compareVarying(const sh::ShaderVariable &x, const sh::ShaderVariable &y)
{ {
if (x.type == y.type) if (x.type == y.type)
{ {
......
...@@ -31,36 +31,6 @@ namespace gl ...@@ -31,36 +31,6 @@ namespace gl
{ {
class ResourceManager; class ResourceManager;
struct Varying
{
Varying(const sh::Varying &shaderVar)
: interpolation(shaderVar.interpolation),
type(shaderVar.type),
name(shaderVar.name),
arraySize(shaderVar.arraySize),
registerIndex(GL_INVALID_INDEX),
elementIndex(GL_INVALID_INDEX)
{}
sh::InterpolationType interpolation;
GLenum type;
std::string name;
unsigned int arraySize;
bool isArray() const { return arraySize > 0; }
unsigned int elementCount() const { return std::max(1u, arraySize); }
bool registerAssigned() const { return registerIndex != GL_INVALID_INDEX; }
void resetRegisterAssignment()
{
registerIndex = GL_INVALID_INDEX;
elementIndex = GL_INVALID_INDEX;
}
unsigned int registerIndex; // First varying register, assigned during link
unsigned int elementIndex; // First register element, assigned during link
};
class Shader class Shader
{ {
friend class ProgramBinary; friend class ProgramBinary;
...@@ -106,11 +76,11 @@ class Shader ...@@ -106,11 +76,11 @@ class Shader
void getSourceImpl(const std::string &source, GLsizei bufSize, GLsizei *length, char *buffer) const; void getSourceImpl(const std::string &source, GLsizei bufSize, GLsizei *length, char *buffer) const;
static bool compareVarying(const Varying &x, const Varying &y); static bool compareVarying(const sh::ShaderVariable &x, const sh::ShaderVariable &y);
const rx::Renderer *const mRenderer; const rx::Renderer *const mRenderer;
std::vector<Varying> mVaryings; std::vector<sh::Varying> mVaryings;
bool mUsesMultipleRenderTargets; bool mUsesMultipleRenderTargets;
bool mUsesFragColor; bool mUsesFragColor;
......
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