Commit 68754bf1 by Nicolas Capens

Make the GLSL compiler independent of the API shader class.

Bug 18962347 Change-Id: I1a45c5572a45a16ae04ab77e7029ab31905ac702 Reviewed-on: https://swiftshader-review.googlesource.com/1750Reviewed-by: 's avatarNicolas Capens <capn@google.com> Tested-by: 's avatarNicolas Capens <capn@google.com>
parent cbeb51f4
......@@ -99,7 +99,17 @@ namespace sh
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 @@ namespace sh
{
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 @@ namespace sh
}
}
activeVaryings.push_back(es2::Varying(glVariableType(type), name, varying->getArraySize(), reg, 0));
activeVaryings.push_back(sh::Varying(glVariableType(type), name, varying->getArraySize(), reg, 0));
}
}
......
......@@ -57,6 +57,49 @@ namespace sh
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 @@ namespace sh
};
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 @@ namespace sh
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;
......
......@@ -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)
{
}
......
......@@ -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 @@ namespace es2
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_
......@@ -940,9 +940,9 @@ namespace es2
// 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 @@ namespace es2
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 @@ namespace es2
}
}
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)
{
......
......@@ -133,7 +133,7 @@ namespace es2
private:
void unlink();
int packVaryings(const Varying *packing[][4]);
int packVaryings(const sh::Varying *packing[][4]);
bool linkVaryings();
bool linkAttributes();
......
......@@ -197,16 +197,6 @@ bool Shader::isCompiled()
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 @@ GLenum Shader::parseType(const std::string &type)
}
// 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)
{
......
......@@ -34,37 +34,10 @@ namespace sh
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 @@ public:
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 @@ protected:
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
......
......@@ -940,9 +940,9 @@ namespace es2
// 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 @@ namespace es2
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 @@ namespace es2
}
}
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)
{
......
......@@ -133,7 +133,7 @@ namespace es2
private:
void unlink();
int packVaryings(const Varying *packing[][4]);
int packVaryings(const sh::Varying *packing[][4]);
bool linkVaryings();
bool linkAttributes();
......
......@@ -197,16 +197,6 @@ bool Shader::isCompiled()
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 @@ GLenum Shader::parseType(const std::string &type)
}
// 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)
{
......
......@@ -34,37 +34,10 @@ namespace sh
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 @@ public:
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 @@ protected:
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
......
......@@ -940,9 +940,9 @@ namespace es2
// 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 @@ namespace es2
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 @@ namespace es2
}
}
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)
{
......
......@@ -142,7 +142,7 @@ namespace es2
private:
void unlink();
int packVaryings(const Varying *packing[][4]);
int packVaryings(const sh::Varying *packing[][4]);
bool linkVaryings();
bool linkAttributes();
......
......@@ -197,16 +197,6 @@ bool Shader::isCompiled()
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 @@ void Shader::release()
{
mRefCount--;
if(mRefCount == 0)
{
delete this;
if(mRefCount == 0)
{
delete this;
}
}
......@@ -279,7 +269,7 @@ GLenum Shader::parseType(const std::string &type)
}
// 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)
{
......
......@@ -32,37 +32,10 @@ namespace sh
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 @@ public:
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 @@ protected:
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
......
......@@ -47,7 +47,7 @@ namespace sw
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;
......
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