Commit 20b06c3c by Nicolas Capens

Centralize shader compilation.

Bug 19331817 Change-Id: Ib5df377bf8f715e008f9d4e5efd0e97c6e2f2570 Reviewed-on: https://swiftshader-review.googlesource.com/2290Reviewed-by: 's avatarAlexis Hétu <sugoi@google.com> Reviewed-by: 's avatarNicolas Capens <capn@google.com> Tested-by: 's avatarNicolas Capens <capn@google.com>
parent 08ca3c6e
...@@ -189,6 +189,47 @@ void Shader::clear() ...@@ -189,6 +189,47 @@ void Shader::clear()
activeAttributes.clear(); activeAttributes.clear();
} }
void Shader::compile()
{
clear();
createShader();
TranslatorASM *compiler = createCompiler(getType());
// Ensure we don't pass a NULL source to the compiler
char *source = "\0";
if(mSource)
{
source = mSource;
}
bool success = compiler->compile(&source, 1, SH_OBJECT_CODE);
if(false)
{
static int serial = 1;
char buffer[256];
sprintf(buffer, "shader-input-%d-%d.txt", getName(), serial);
FILE *file = fopen(buffer, "wt");
fprintf(file, mSource);
fclose(file);
getShader()->print("shader-output-%d-%d.txt", getName(), serial);
serial++;
}
if(!success)
{
deleteShader();
int infoLogLen = compiler->getInfoSink().info.size() + 1;
mInfoLog = new char[infoLogLen];
strcpy(mInfoLog, compiler->getInfoSink().info.c_str());
TRACE("\n%s", mInfoLog);
}
delete compiler;
}
bool Shader::isCompiled() bool Shader::isCompiled()
{ {
return getShader() != 0; return getShader() != 0;
...@@ -363,50 +404,6 @@ GLenum VertexShader::getType() ...@@ -363,50 +404,6 @@ GLenum VertexShader::getType()
return GL_VERTEX_SHADER; return GL_VERTEX_SHADER;
} }
void VertexShader::compile()
{
clear();
delete vertexShader;
vertexShader = new sw::VertexShader();
TranslatorASM *compiler = createCompiler(GL_VERTEX_SHADER);
// Ensure we don't pass a NULL source to the compiler
char *source = "\0";
if(mSource)
{
source = mSource;
}
bool success = compiler->compile(&source, 1, SH_OBJECT_CODE);
if(false)
{
static int serial = 1;
char buffer[256];
sprintf(buffer, "vertex-input-%d-%d.txt", getName(), serial);
FILE *file = fopen(buffer, "wt");
fprintf(file, mSource);
fclose(file);
vertexShader->print("vertex-output-%d-%d.txt", getName(), serial);
serial++;
}
if(!success)
{
delete vertexShader;
vertexShader = 0;
int infoLogLen = compiler->getInfoSink().info.size() + 1;
mInfoLog = new char[infoLogLen];
strcpy(mInfoLog, compiler->getInfoSink().info.c_str());
TRACE("\n%s", mInfoLog);
}
delete compiler;
}
int VertexShader::getSemanticIndex(const std::string &attributeName) int VertexShader::getSemanticIndex(const std::string &attributeName)
{ {
if(!attributeName.empty()) if(!attributeName.empty())
...@@ -433,6 +430,18 @@ sw::VertexShader *VertexShader::getVertexShader() const ...@@ -433,6 +430,18 @@ sw::VertexShader *VertexShader::getVertexShader() const
return vertexShader; return vertexShader;
} }
void VertexShader::createShader()
{
delete vertexShader;
vertexShader = new sw::VertexShader();
}
void VertexShader::deleteShader()
{
delete vertexShader;
vertexShader = nullptr;
}
FragmentShader::FragmentShader(ResourceManager *manager, GLuint handle) : Shader(manager, handle) FragmentShader::FragmentShader(ResourceManager *manager, GLuint handle) : Shader(manager, handle)
{ {
pixelShader = 0; pixelShader = 0;
...@@ -448,50 +457,6 @@ GLenum FragmentShader::getType() ...@@ -448,50 +457,6 @@ GLenum FragmentShader::getType()
return GL_FRAGMENT_SHADER; return GL_FRAGMENT_SHADER;
} }
void FragmentShader::compile()
{
clear();
delete pixelShader;
pixelShader = new sw::PixelShader();
TranslatorASM *compiler = createCompiler(GL_FRAGMENT_SHADER);
// Ensure we don't pass a NULL source to the compiler
char *source = "\0";
if(mSource)
{
source = mSource;
}
bool success = compiler->compile(&source, 1, SH_OBJECT_CODE);
if(false)
{
static int serial = 1;
char buffer[256];
sprintf(buffer, "pixel-input-%d-%d.txt", getName(), serial);
FILE *file = fopen(buffer, "wt");
fprintf(file, mSource);
fclose(file);
pixelShader->print("pixel-output-%d-%d.txt", getName(), serial);
serial++;
}
if(!success)
{
delete pixelShader;
pixelShader = 0;
int infoLogLen = compiler->getInfoSink().info.size() + 1;
mInfoLog = new char[infoLogLen];
strcpy(mInfoLog, compiler->getInfoSink().info.c_str());
TRACE("\n%s", mInfoLog);
}
delete compiler;
}
sw::Shader *FragmentShader::getShader() const sw::Shader *FragmentShader::getShader() const
{ {
return pixelShader; return pixelShader;
...@@ -501,4 +466,17 @@ sw::PixelShader *FragmentShader::getPixelShader() const ...@@ -501,4 +466,17 @@ sw::PixelShader *FragmentShader::getPixelShader() const
{ {
return pixelShader; return pixelShader;
} }
void FragmentShader::createShader()
{
delete pixelShader;
pixelShader = new sw::PixelShader();
}
void FragmentShader::deleteShader()
{
delete pixelShader;
pixelShader = nullptr;
}
} }
...@@ -57,7 +57,7 @@ public: ...@@ -57,7 +57,7 @@ public:
int getSourceLength() const; int getSourceLength() const;
void getSource(GLsizei bufSize, GLsizei *length, char *source); void getSource(GLsizei bufSize, GLsizei *length, char *source);
virtual void compile() = 0; void compile();
bool isCompiled(); bool isCompiled();
void addRef(); void addRef();
...@@ -80,6 +80,9 @@ protected: ...@@ -80,6 +80,9 @@ protected:
char *mInfoLog; char *mInfoLog;
private: private:
virtual void createShader() = 0;
virtual void deleteShader() = 0;
const GLuint mHandle; const GLuint mHandle;
unsigned int mRefCount; // Number of program objects this shader is attached to unsigned int mRefCount; // Number of program objects this shader is attached to
bool mDeleteStatus; // Flag to indicate that the shader can be deleted when no longer in use bool mDeleteStatus; // Flag to indicate that the shader can be deleted when no longer in use
...@@ -97,13 +100,15 @@ public: ...@@ -97,13 +100,15 @@ public:
~VertexShader(); ~VertexShader();
virtual GLenum getType(); virtual GLenum getType();
virtual void compile();
int getSemanticIndex(const std::string &attributeName); int getSemanticIndex(const std::string &attributeName);
virtual sw::Shader *getShader() const; virtual sw::Shader *getShader() const;
virtual sw::VertexShader *getVertexShader() const; virtual sw::VertexShader *getVertexShader() const;
private: private:
virtual void createShader();
virtual void deleteShader();
sw::VertexShader *vertexShader; sw::VertexShader *vertexShader;
}; };
...@@ -115,12 +120,14 @@ public: ...@@ -115,12 +120,14 @@ public:
~FragmentShader(); ~FragmentShader();
virtual GLenum getType(); virtual GLenum getType();
virtual void compile();
virtual sw::Shader *getShader() const; virtual sw::Shader *getShader() const;
virtual sw::PixelShader *getPixelShader() const; virtual sw::PixelShader *getPixelShader() const;
private: private:
virtual void createShader();
virtual void deleteShader();
sw::PixelShader *pixelShader; sw::PixelShader *pixelShader;
}; };
} }
......
...@@ -189,6 +189,47 @@ void Shader::clear() ...@@ -189,6 +189,47 @@ void Shader::clear()
activeAttributes.clear(); activeAttributes.clear();
} }
void Shader::compile()
{
clear();
createShader();
TranslatorASM *compiler = createCompiler(getType());
// Ensure we don't pass a NULL source to the compiler
char *source = "\0";
if(mSource)
{
source = mSource;
}
bool success = compiler->compile(&source, 1, SH_OBJECT_CODE);
if(false)
{
static int serial = 1;
char buffer[256];
sprintf(buffer, "shader-input-%d-%d.txt", getName(), serial);
FILE *file = fopen(buffer, "wt");
fprintf(file, mSource);
fclose(file);
getShader()->print("shader-output-%d-%d.txt", getName(), serial);
serial++;
}
if(!success)
{
deleteShader();
int infoLogLen = compiler->getInfoSink().info.size() + 1;
mInfoLog = new char[infoLogLen];
strcpy(mInfoLog, compiler->getInfoSink().info.c_str());
TRACE("\n%s", mInfoLog);
}
delete compiler;
}
bool Shader::isCompiled() bool Shader::isCompiled()
{ {
return getShader() != 0; return getShader() != 0;
...@@ -363,50 +404,6 @@ GLenum VertexShader::getType() ...@@ -363,50 +404,6 @@ GLenum VertexShader::getType()
return GL_VERTEX_SHADER; return GL_VERTEX_SHADER;
} }
void VertexShader::compile()
{
clear();
delete vertexShader;
vertexShader = new sw::VertexShader();
TranslatorASM *compiler = createCompiler(GL_VERTEX_SHADER);
// Ensure we don't pass a NULL source to the compiler
char *source = "\0";
if(mSource)
{
source = mSource;
}
bool success = compiler->compile(&source, 1, SH_OBJECT_CODE);
if(false)
{
static int serial = 1;
char buffer[256];
sprintf(buffer, "vertex-input-%d-%d.txt", getName(), serial);
FILE *file = fopen(buffer, "wt");
fprintf(file, mSource);
fclose(file);
vertexShader->print("vertex-output-%d-%d.txt", getName(), serial);
serial++;
}
if(!success)
{
delete vertexShader;
vertexShader = 0;
int infoLogLen = compiler->getInfoSink().info.size() + 1;
mInfoLog = new char[infoLogLen];
strcpy(mInfoLog, compiler->getInfoSink().info.c_str());
TRACE("\n%s", mInfoLog);
}
delete compiler;
}
int VertexShader::getSemanticIndex(const std::string &attributeName) int VertexShader::getSemanticIndex(const std::string &attributeName)
{ {
if(!attributeName.empty()) if(!attributeName.empty())
...@@ -433,6 +430,18 @@ sw::VertexShader *VertexShader::getVertexShader() const ...@@ -433,6 +430,18 @@ sw::VertexShader *VertexShader::getVertexShader() const
return vertexShader; return vertexShader;
} }
void VertexShader::createShader()
{
delete vertexShader;
vertexShader = new sw::VertexShader();
}
void VertexShader::deleteShader()
{
delete vertexShader;
vertexShader = nullptr;
}
FragmentShader::FragmentShader(ResourceManager *manager, GLuint handle) : Shader(manager, handle) FragmentShader::FragmentShader(ResourceManager *manager, GLuint handle) : Shader(manager, handle)
{ {
pixelShader = 0; pixelShader = 0;
...@@ -448,50 +457,6 @@ GLenum FragmentShader::getType() ...@@ -448,50 +457,6 @@ GLenum FragmentShader::getType()
return GL_FRAGMENT_SHADER; return GL_FRAGMENT_SHADER;
} }
void FragmentShader::compile()
{
clear();
delete pixelShader;
pixelShader = new sw::PixelShader();
TranslatorASM *compiler = createCompiler(GL_FRAGMENT_SHADER);
// Ensure we don't pass a NULL source to the compiler
char *source = "\0";
if(mSource)
{
source = mSource;
}
bool success = compiler->compile(&source, 1, SH_OBJECT_CODE);
if(false)
{
static int serial = 1;
char buffer[256];
sprintf(buffer, "pixel-input-%d-%d.txt", getName(), serial);
FILE *file = fopen(buffer, "wt");
fprintf(file, mSource);
fclose(file);
pixelShader->print("pixel-output-%d-%d.txt", getName(), serial);
serial++;
}
if(!success)
{
delete pixelShader;
pixelShader = 0;
int infoLogLen = compiler->getInfoSink().info.size() + 1;
mInfoLog = new char[infoLogLen];
strcpy(mInfoLog, compiler->getInfoSink().info.c_str());
TRACE("\n%s", mInfoLog);
}
delete compiler;
}
sw::Shader *FragmentShader::getShader() const sw::Shader *FragmentShader::getShader() const
{ {
return pixelShader; return pixelShader;
...@@ -501,4 +466,17 @@ sw::PixelShader *FragmentShader::getPixelShader() const ...@@ -501,4 +466,17 @@ sw::PixelShader *FragmentShader::getPixelShader() const
{ {
return pixelShader; return pixelShader;
} }
void FragmentShader::createShader()
{
delete pixelShader;
pixelShader = new sw::PixelShader();
}
void FragmentShader::deleteShader()
{
delete pixelShader;
pixelShader = nullptr;
}
} }
...@@ -54,7 +54,7 @@ public: ...@@ -54,7 +54,7 @@ public:
int getSourceLength() const; int getSourceLength() const;
void getSource(GLsizei bufSize, GLsizei *length, char *source); void getSource(GLsizei bufSize, GLsizei *length, char *source);
virtual void compile() = 0; void compile();
bool isCompiled(); bool isCompiled();
void addRef(); void addRef();
...@@ -77,6 +77,9 @@ protected: ...@@ -77,6 +77,9 @@ protected:
char *mInfoLog; char *mInfoLog;
private: private:
virtual void createShader() = 0;
virtual void deleteShader() = 0;
const GLuint mHandle; const GLuint mHandle;
unsigned int mRefCount; // Number of program objects this shader is attached to unsigned int mRefCount; // Number of program objects this shader is attached to
bool mDeleteStatus; // Flag to indicate that the shader can be deleted when no longer in use bool mDeleteStatus; // Flag to indicate that the shader can be deleted when no longer in use
...@@ -94,13 +97,15 @@ public: ...@@ -94,13 +97,15 @@ public:
~VertexShader(); ~VertexShader();
virtual GLenum getType(); virtual GLenum getType();
virtual void compile();
int getSemanticIndex(const std::string &attributeName); int getSemanticIndex(const std::string &attributeName);
virtual sw::Shader *getShader() const; virtual sw::Shader *getShader() const;
virtual sw::VertexShader *getVertexShader() const; virtual sw::VertexShader *getVertexShader() const;
private: private:
virtual void createShader();
virtual void deleteShader();
sw::VertexShader *vertexShader; sw::VertexShader *vertexShader;
}; };
...@@ -112,12 +117,14 @@ public: ...@@ -112,12 +117,14 @@ public:
~FragmentShader(); ~FragmentShader();
virtual GLenum getType(); virtual GLenum getType();
virtual void compile();
virtual sw::Shader *getShader() const; virtual sw::Shader *getShader() const;
virtual sw::PixelShader *getPixelShader() const; virtual sw::PixelShader *getPixelShader() const;
private: private:
virtual void createShader();
virtual void deleteShader();
sw::PixelShader *pixelShader; sw::PixelShader *pixelShader;
}; };
} }
......
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