Make the GLSL compiler independent of the API shader class.
Bug 18962347
Change-Id: I1a45c5572a45a16ae04ab77e7029ab31905ac702
Reviewed-on: https://swiftshader-review.googlesource.com/1750
Reviewed-by: Nicolas Capens <capn@google.com>
Tested-by: Nicolas Capens <capn@google.com>
diff --git a/src/OpenGL/compiler/OutputASM.cpp b/src/OpenGL/compiler/OutputASM.cpp
index 7a8462d..ba70fc0 100644
--- a/src/OpenGL/compiler/OutputASM.cpp
+++ b/src/OpenGL/compiler/OutputASM.cpp
@@ -99,7 +99,17 @@
this->registerIndex = registerIndex;
}
- OutputASM::OutputASM(TParseContext &context, es2::Shader *shaderObject) : TIntermTraverser(true, true, true), mContext(context), shaderObject(shaderObject)
+ sw::PixelShader *Shader::getPixelShader() const
+ {
+ return 0;
+ }
+
+ sw::VertexShader *Shader::getVertexShader() const
+ {
+ return 0;
+ }
+
+ OutputASM::OutputASM(TParseContext &context, Shader *shaderObject) : TIntermTraverser(true, true, true), mContext(context), shaderObject(shaderObject)
{
shader = 0;
pixelShader = 0;
@@ -2047,10 +2057,10 @@
{
const TType &type = varying->getType();
const char *name = varying->getAsSymbolNode()->getSymbol().c_str();
- es2::VaryingList &activeVaryings = shaderObject->varyings;
+ VaryingList &activeVaryings = shaderObject->varyings;
// Check if this varying has been declared before without having a register assigned
- for(es2::VaryingList::iterator v = activeVaryings.begin(); v != activeVaryings.end(); v++)
+ for(VaryingList::iterator v = activeVaryings.begin(); v != activeVaryings.end(); v++)
{
if(v->name == name)
{
@@ -2064,7 +2074,7 @@
}
}
- activeVaryings.push_back(es2::Varying(glVariableType(type), name, varying->getArraySize(), reg, 0));
+ activeVaryings.push_back(sh::Varying(glVariableType(type), name, varying->getArraySize(), reg, 0));
}
}
diff --git a/src/OpenGL/compiler/OutputASM.h b/src/OpenGL/compiler/OutputASM.h
index 0252421..54af409 100644
--- a/src/OpenGL/compiler/OutputASM.h
+++ b/src/OpenGL/compiler/OutputASM.h
@@ -57,6 +57,49 @@
int registerIndex;
};
+ typedef std::vector<Attribute> ActiveAttributes;
+
+ struct Varying
+ {
+ Varying(GLenum type, const std::string &name, int arraySize, int reg = -1, int col = -1)
+ : type(type), name(name), arraySize(arraySize), reg(reg), col(col)
+ {
+ }
+
+ bool isArray() const
+ {
+ return arraySize >= 1;
+ }
+
+ int size() const // Unify with es2::Uniform?
+ {
+ return arraySize > 0 ? arraySize : 1;
+ }
+
+ GLenum type;
+ std::string name;
+ int arraySize;
+
+ int reg; // First varying register, assigned during link
+ int col; // First register element, assigned during link
+ };
+
+ typedef std::list<Varying> VaryingList;
+
+ class Shader
+ {
+ friend class OutputASM;
+ public:
+ virtual sw::Shader *getShader() const = 0;
+ virtual sw::PixelShader *getPixelShader() const;
+ virtual sw::VertexShader *getVertexShader() const;
+
+ protected:
+ VaryingList varyings;
+ ActiveUniforms activeUniforms;
+ ActiveAttributes activeAttributes;
+ };
+
struct Function
{
Function(int label, const char *name, TIntermSequence *arg, TIntermTyped *ret) : label(label), name(name), arg(arg), ret(ret)
@@ -74,14 +117,13 @@
};
typedef sw::Shader::Instruction Instruction;
- typedef std::vector<Attribute> ActiveAttributes;
class Temporary;
class OutputASM : public TIntermTraverser
{
public:
- explicit OutputASM(TParseContext &context, es2::Shader *shaderObject);
+ explicit OutputASM(TParseContext &context, Shader *shaderObject);
~OutputASM();
void output();
@@ -145,7 +187,7 @@
static unsigned int loopCount(TIntermLoop *node);
static bool isSamplerRegister(TIntermTyped *operand);
- es2::Shader *const shaderObject;
+ Shader *const shaderObject;
sw::Shader *shader;
sw::PixelShader *pixelShader;
sw::VertexShader *vertexShader;
diff --git a/src/OpenGL/compiler/TranslatorASM.cpp b/src/OpenGL/compiler/TranslatorASM.cpp
index 8749900..0cf13d4 100644
--- a/src/OpenGL/compiler/TranslatorASM.cpp
+++ b/src/OpenGL/compiler/TranslatorASM.cpp
@@ -13,7 +13,7 @@
#include "InitializeParseContext.h"
-TranslatorASM::TranslatorASM(es2::Shader *shaderObject, ShShaderType type, ShShaderSpec spec) : TCompiler(type, spec), shaderObject(shaderObject)
+TranslatorASM::TranslatorASM(sh::Shader *shaderObject, ShShaderType type, ShShaderSpec spec) : TCompiler(type, spec), shaderObject(shaderObject)
{
}
diff --git a/src/OpenGL/compiler/TranslatorASM.h b/src/OpenGL/compiler/TranslatorASM.h
index 596c424..32739ec 100644
--- a/src/OpenGL/compiler/TranslatorASM.h
+++ b/src/OpenGL/compiler/TranslatorASM.h
@@ -14,10 +14,8 @@
#include "ShHandle.h"
#include "OutputASM.h"
-#include "Shader/PixelShader.hpp"
-#include "Shader/VertexShader.hpp"
-namespace es2
+namespace sh
{
class Shader;
}
@@ -25,13 +23,13 @@
class TranslatorASM : public TCompiler
{
public:
- TranslatorASM(es2::Shader *shaderObject, ShShaderType type, ShShaderSpec spec);
+ TranslatorASM(sh::Shader *shaderObject, ShShaderType type, ShShaderSpec spec);
protected:
virtual bool translate(TIntermNode* root);
private:
- es2::Shader *const shaderObject;
+ sh::Shader *const shaderObject;
};
#endif // COMPILER_TRANSLATORASM_H_
diff --git a/src/OpenGL/libGL/Program.cpp b/src/OpenGL/libGL/Program.cpp
index 03042fa..71573d5 100644
--- a/src/OpenGL/libGL/Program.cpp
+++ b/src/OpenGL/libGL/Program.cpp
@@ -940,9 +940,9 @@
// 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
- int Program::packVaryings(const Varying *packing[][4])
+ int Program::packVaryings(const sh::Varying *packing[][4])
{
- for(VaryingList::iterator varying = fragmentShader->varyings.begin(); varying != fragmentShader->varyings.end(); varying++)
+ for(sh::VaryingList::iterator varying = fragmentShader->varyings.begin(); varying != fragmentShader->varyings.end(); varying++)
{
int n = VariableRowCount(varying->type) * varying->size();
int m = VariableColumnCount(varying->type);
@@ -1087,11 +1087,11 @@
bool Program::linkVaryings()
{
- for(VaryingList::iterator input = fragmentShader->varyings.begin(); input != fragmentShader->varyings.end(); input++)
+ for(sh::VaryingList::iterator input = fragmentShader->varyings.begin(); input != fragmentShader->varyings.end(); input++)
{
bool matched = false;
- for(VaryingList::iterator output = vertexShader->varyings.begin(); output != vertexShader->varyings.end(); output++)
+ for(sh::VaryingList::iterator output = vertexShader->varyings.begin(); output != vertexShader->varyings.end(); output++)
{
if(output->name == input->name)
{
@@ -1115,12 +1115,12 @@
}
}
- VaryingList &psVaryings = fragmentShader->varyings;
- VaryingList &vsVaryings = vertexShader->varyings;
+ sh::VaryingList &psVaryings = fragmentShader->varyings;
+ sh::VaryingList &vsVaryings = vertexShader->varyings;
- for(VaryingList::iterator output = vsVaryings.begin(); output != vsVaryings.end(); output++)
+ for(sh::VaryingList::iterator output = vsVaryings.begin(); output != vsVaryings.end(); output++)
{
- for(VaryingList::iterator input = psVaryings.begin(); input != psVaryings.end(); input++)
+ for(sh::VaryingList::iterator input = psVaryings.begin(); input != psVaryings.end(); input++)
{
if(output->name == input->name)
{
diff --git a/src/OpenGL/libGL/Program.h b/src/OpenGL/libGL/Program.h
index eae96bd..4afb55b 100644
--- a/src/OpenGL/libGL/Program.h
+++ b/src/OpenGL/libGL/Program.h
@@ -133,7 +133,7 @@
private:
void unlink();
- int packVaryings(const Varying *packing[][4]);
+ int packVaryings(const sh::Varying *packing[][4]);
bool linkVaryings();
bool linkAttributes();
diff --git a/src/OpenGL/libGL/Shader.cpp b/src/OpenGL/libGL/Shader.cpp
index 335427a..fd09672 100644
--- a/src/OpenGL/libGL/Shader.cpp
+++ b/src/OpenGL/libGL/Shader.cpp
@@ -197,16 +197,6 @@
return getShader() != 0;
}
-sw::PixelShader *Shader::getPixelShader() const
-{
- return 0;
-}
-
-sw::VertexShader *Shader::getVertexShader() const
-{
- return 0;
-}
-
void Shader::addRef()
{
mRefCount++;
@@ -279,7 +269,7 @@
}
// 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::Varying &x, const sh::Varying &y)
{
if(x.type == y.type)
{
diff --git a/src/OpenGL/libGL/Shader.h b/src/OpenGL/libGL/Shader.h
index 871450c..05535e3 100644
--- a/src/OpenGL/libGL/Shader.h
+++ b/src/OpenGL/libGL/Shader.h
@@ -34,37 +34,10 @@
namespace es2
{
-struct Varying
-{
- Varying(GLenum type, const std::string &name, int arraySize, int reg = -1, int col = -1)
- : type(type), name(name), arraySize(arraySize), reg(reg), col(col)
- {
- }
- bool isArray() const
- {
- return arraySize >= 1;
- }
-
- int size() const // Unify with es2::Uniform?
- {
- return arraySize > 0 ? arraySize : 1;
- }
-
- GLenum type;
- std::string name;
- int arraySize;
-
- int reg; // First varying register, assigned during link
- int col; // First register element, assigned during link
-};
-
-typedef std::list<Varying> VaryingList;
-
-class Shader
+class Shader : public sh::Shader
{
friend class Program;
- friend class sh::OutputASM;
public:
Shader(ResourceManager *manager, GLuint handle);
@@ -84,10 +57,6 @@
virtual void compile() = 0;
bool isCompiled();
- virtual sw::Shader *getShader() const = 0;
- virtual sw::PixelShader *getPixelShader() const;
- virtual sw::VertexShader *getVertexShader() const;
-
void addRef();
void release();
unsigned int getRefCount() const;
@@ -102,15 +71,11 @@
void clear();
static GLenum parseType(const std::string &type);
- static bool compareVarying(const Varying &x, const Varying &y);
+ static bool compareVarying(const sh::Varying &x, const sh::Varying &y);
char *mSource;
char *mInfoLog;
- VaryingList varyings;
- sh::ActiveUniforms activeUniforms;
- sh::ActiveAttributes activeAttributes;
-
private:
const GLuint mHandle;
unsigned int mRefCount; // Number of program objects this shader is attached to
diff --git a/src/OpenGL/libGLESv2/Program.cpp b/src/OpenGL/libGLESv2/Program.cpp
index 03042fa..71573d5 100644
--- a/src/OpenGL/libGLESv2/Program.cpp
+++ b/src/OpenGL/libGLESv2/Program.cpp
@@ -940,9 +940,9 @@
// 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
- int Program::packVaryings(const Varying *packing[][4])
+ int Program::packVaryings(const sh::Varying *packing[][4])
{
- for(VaryingList::iterator varying = fragmentShader->varyings.begin(); varying != fragmentShader->varyings.end(); varying++)
+ for(sh::VaryingList::iterator varying = fragmentShader->varyings.begin(); varying != fragmentShader->varyings.end(); varying++)
{
int n = VariableRowCount(varying->type) * varying->size();
int m = VariableColumnCount(varying->type);
@@ -1087,11 +1087,11 @@
bool Program::linkVaryings()
{
- for(VaryingList::iterator input = fragmentShader->varyings.begin(); input != fragmentShader->varyings.end(); input++)
+ for(sh::VaryingList::iterator input = fragmentShader->varyings.begin(); input != fragmentShader->varyings.end(); input++)
{
bool matched = false;
- for(VaryingList::iterator output = vertexShader->varyings.begin(); output != vertexShader->varyings.end(); output++)
+ for(sh::VaryingList::iterator output = vertexShader->varyings.begin(); output != vertexShader->varyings.end(); output++)
{
if(output->name == input->name)
{
@@ -1115,12 +1115,12 @@
}
}
- VaryingList &psVaryings = fragmentShader->varyings;
- VaryingList &vsVaryings = vertexShader->varyings;
+ sh::VaryingList &psVaryings = fragmentShader->varyings;
+ sh::VaryingList &vsVaryings = vertexShader->varyings;
- for(VaryingList::iterator output = vsVaryings.begin(); output != vsVaryings.end(); output++)
+ for(sh::VaryingList::iterator output = vsVaryings.begin(); output != vsVaryings.end(); output++)
{
- for(VaryingList::iterator input = psVaryings.begin(); input != psVaryings.end(); input++)
+ for(sh::VaryingList::iterator input = psVaryings.begin(); input != psVaryings.end(); input++)
{
if(output->name == input->name)
{
diff --git a/src/OpenGL/libGLESv2/Program.h b/src/OpenGL/libGLESv2/Program.h
index dd87fb2..8fedcce 100644
--- a/src/OpenGL/libGLESv2/Program.h
+++ b/src/OpenGL/libGLESv2/Program.h
@@ -133,7 +133,7 @@
private:
void unlink();
- int packVaryings(const Varying *packing[][4]);
+ int packVaryings(const sh::Varying *packing[][4]);
bool linkVaryings();
bool linkAttributes();
diff --git a/src/OpenGL/libGLESv2/Shader.cpp b/src/OpenGL/libGLESv2/Shader.cpp
index 335427a..fd09672 100644
--- a/src/OpenGL/libGLESv2/Shader.cpp
+++ b/src/OpenGL/libGLESv2/Shader.cpp
@@ -197,16 +197,6 @@
return getShader() != 0;
}
-sw::PixelShader *Shader::getPixelShader() const
-{
- return 0;
-}
-
-sw::VertexShader *Shader::getVertexShader() const
-{
- return 0;
-}
-
void Shader::addRef()
{
mRefCount++;
@@ -279,7 +269,7 @@
}
// 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::Varying &x, const sh::Varying &y)
{
if(x.type == y.type)
{
diff --git a/src/OpenGL/libGLESv2/Shader.h b/src/OpenGL/libGLESv2/Shader.h
index 009d0dd..ce0ce9a 100644
--- a/src/OpenGL/libGLESv2/Shader.h
+++ b/src/OpenGL/libGLESv2/Shader.h
@@ -34,37 +34,10 @@
namespace es2
{
-struct Varying
-{
- Varying(GLenum type, const std::string &name, int arraySize, int reg = -1, int col = -1)
- : type(type), name(name), arraySize(arraySize), reg(reg), col(col)
- {
- }
- bool isArray() const
- {
- return arraySize >= 1;
- }
-
- int size() const // Unify with es2::Uniform?
- {
- return arraySize > 0 ? arraySize : 1;
- }
-
- GLenum type;
- std::string name;
- int arraySize;
-
- int reg; // First varying register, assigned during link
- int col; // First register element, assigned during link
-};
-
-typedef std::list<Varying> VaryingList;
-
-class Shader
+class Shader : public sh::Shader
{
friend class Program;
- friend class sh::OutputASM;
public:
Shader(ResourceManager *manager, GLuint handle);
@@ -84,10 +57,6 @@
virtual void compile() = 0;
bool isCompiled();
- virtual sw::Shader *getShader() const = 0;
- virtual sw::PixelShader *getPixelShader() const;
- virtual sw::VertexShader *getVertexShader() const;
-
void addRef();
void release();
unsigned int getRefCount() const;
@@ -102,15 +71,11 @@
void clear();
static GLenum parseType(const std::string &type);
- static bool compareVarying(const Varying &x, const Varying &y);
+ static bool compareVarying(const sh::Varying &x, const sh::Varying &y);
char *mSource;
char *mInfoLog;
- VaryingList varyings;
- sh::ActiveUniforms activeUniforms;
- sh::ActiveAttributes activeAttributes;
-
private:
const GLuint mHandle;
unsigned int mRefCount; // Number of program objects this shader is attached to
diff --git a/src/Radiance/libRAD/Program.cpp b/src/Radiance/libRAD/Program.cpp
index 5639f97..18e8af1 100644
--- a/src/Radiance/libRAD/Program.cpp
+++ b/src/Radiance/libRAD/Program.cpp
@@ -940,9 +940,9 @@
// 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
- int Program::packVaryings(const Varying *packing[][4])
+ int Program::packVaryings(const sh::Varying *packing[][4])
{
- for(VaryingList::iterator varying = fragmentShader->varyings.begin(); varying != fragmentShader->varyings.end(); varying++)
+ for(sh::VaryingList::iterator varying = fragmentShader->varyings.begin(); varying != fragmentShader->varyings.end(); varying++)
{
int n = VariableRowCount(varying->type) * varying->size();
int m = VariableColumnCount(varying->type);
@@ -1087,11 +1087,11 @@
bool Program::linkVaryings()
{
- for(VaryingList::iterator input = fragmentShader->varyings.begin(); input != fragmentShader->varyings.end(); input++)
+ for(sh::VaryingList::iterator input = fragmentShader->varyings.begin(); input != fragmentShader->varyings.end(); input++)
{
bool matched = false;
- for(VaryingList::iterator output = vertexShader->varyings.begin(); output != vertexShader->varyings.end(); output++)
+ for(sh::VaryingList::iterator output = vertexShader->varyings.begin(); output != vertexShader->varyings.end(); output++)
{
if(output->name == input->name)
{
@@ -1115,12 +1115,12 @@
}
}
- VaryingList &psVaryings = fragmentShader->varyings;
- VaryingList &vsVaryings = vertexShader->varyings;
+ sh::VaryingList &psVaryings = fragmentShader->varyings;
+ sh::VaryingList &vsVaryings = vertexShader->varyings;
- for(VaryingList::iterator output = vsVaryings.begin(); output != vsVaryings.end(); output++)
+ for(sh::VaryingList::iterator output = vsVaryings.begin(); output != vsVaryings.end(); output++)
{
- for(VaryingList::iterator input = psVaryings.begin(); input != psVaryings.end(); input++)
+ for(sh::VaryingList::iterator input = psVaryings.begin(); input != psVaryings.end(); input++)
{
if(output->name == input->name)
{
diff --git a/src/Radiance/libRAD/Program.h b/src/Radiance/libRAD/Program.h
index cac95ba..e07f275 100644
--- a/src/Radiance/libRAD/Program.h
+++ b/src/Radiance/libRAD/Program.h
@@ -142,7 +142,7 @@
private:
void unlink();
- int packVaryings(const Varying *packing[][4]);
+ int packVaryings(const sh::Varying *packing[][4]);
bool linkVaryings();
bool linkAttributes();
diff --git a/src/Radiance/libRAD/Shader.cpp b/src/Radiance/libRAD/Shader.cpp
index 13e3ab3..50ae334 100644
--- a/src/Radiance/libRAD/Shader.cpp
+++ b/src/Radiance/libRAD/Shader.cpp
@@ -197,16 +197,6 @@
return getShader() != 0;
}
-sw::PixelShader *Shader::getPixelShader() const
-{
- return 0;
-}
-
-sw::VertexShader *Shader::getVertexShader() const
-{
- return 0;
-}
-
void Shader::addRef()
{
mRefCount++;
@@ -216,9 +206,9 @@
{
mRefCount--;
- if(mRefCount == 0)
- {
- delete this;
+ if(mRefCount == 0)
+ {
+ delete this;
}
}
@@ -279,7 +269,7 @@
}
// 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::Varying &x, const sh::Varying &y)
{
if(x.type == y.type)
{
diff --git a/src/Radiance/libRAD/Shader.h b/src/Radiance/libRAD/Shader.h
index 2824384..9f910ce 100644
--- a/src/Radiance/libRAD/Shader.h
+++ b/src/Radiance/libRAD/Shader.h
@@ -32,37 +32,10 @@
namespace es2
{
-struct Varying
-{
- Varying(GLenum type, const std::string &name, int arraySize, int reg = -1, int col = -1)
- : type(type), name(name), arraySize(arraySize), reg(reg), col(col)
- {
- }
- bool isArray() const
- {
- return arraySize >= 1;
- }
-
- int size() const // Unify with es2::Uniform?
- {
- return arraySize > 0 ? arraySize : 1;
- }
-
- GLenum type;
- std::string name;
- int arraySize;
-
- int reg; // First varying register, assigned during link
- int col; // First register element, assigned during link
-};
-
-typedef std::list<Varying> VaryingList;
-
-class Shader
+class Shader : public sh::Shader
{
friend class Program;
- friend class sh::OutputASM;
public:
Shader(GLuint handle);
@@ -82,10 +55,6 @@
virtual void compile() = 0;
bool isCompiled();
- virtual sw::Shader *getShader() const = 0;
- virtual sw::PixelShader *getPixelShader() const;
- virtual sw::VertexShader *getVertexShader() const;
-
void addRef();
void release();
unsigned int getRefCount() const;
@@ -100,15 +69,11 @@
void clear();
static GLenum parseType(const std::string &type);
- static bool compareVarying(const Varying &x, const Varying &y);
+ static bool compareVarying(const sh::Varying &x, const sh::Varying &y);
char *mSource;
char *mInfoLog;
- VaryingList varyings;
- sh::ActiveUniforms activeUniforms;
- sh::ActiveAttributes activeAttributes;
-
private:
const GLuint mHandle;
unsigned int mRefCount; // Number of program objects this shader is attached to
diff --git a/src/Shader/VertexRoutine.cpp b/src/Shader/VertexRoutine.cpp
index 0e21eee..2b590f4 100644
--- a/src/Shader/VertexRoutine.cpp
+++ b/src/Shader/VertexRoutine.cpp
@@ -47,7 +47,7 @@
Pointer<Byte> vertexCache = cache + OFFSET(VertexCache,vertex);
Pointer<Byte> tagCache = cache + OFFSET(VertexCache,tag);
- UInt count = *Pointer<UInt>(task+ OFFSET(VertexTask,count));
+ UInt count = *Pointer<UInt>(task + OFFSET(VertexTask,count));
Registers r(shader);
r.data = data;