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()
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()
{
return getShader() != 0;
......@@ -363,50 +404,6 @@ GLenum VertexShader::getType()
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)
{
if(!attributeName.empty())
......@@ -433,6 +430,18 @@ sw::VertexShader *VertexShader::getVertexShader() const
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)
{
pixelShader = 0;
......@@ -448,50 +457,6 @@ GLenum FragmentShader::getType()
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
{
return pixelShader;
......@@ -501,4 +466,17 @@ sw::PixelShader *FragmentShader::getPixelShader() const
{
return pixelShader;
}
void FragmentShader::createShader()
{
delete pixelShader;
pixelShader = new sw::PixelShader();
}
void FragmentShader::deleteShader()
{
delete pixelShader;
pixelShader = nullptr;
}
}
......@@ -57,7 +57,7 @@ public:
int getSourceLength() const;
void getSource(GLsizei bufSize, GLsizei *length, char *source);
virtual void compile() = 0;
void compile();
bool isCompiled();
void addRef();
......@@ -80,6 +80,9 @@ protected:
char *mInfoLog;
private:
virtual void createShader() = 0;
virtual void deleteShader() = 0;
const GLuint mHandle;
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
......@@ -97,13 +100,15 @@ public:
~VertexShader();
virtual GLenum getType();
virtual void compile();
int getSemanticIndex(const std::string &attributeName);
virtual sw::Shader *getShader() const;
virtual sw::VertexShader *getVertexShader() const;
private:
virtual void createShader();
virtual void deleteShader();
sw::VertexShader *vertexShader;
};
......@@ -115,12 +120,14 @@ public:
~FragmentShader();
virtual GLenum getType();
virtual void compile();
virtual sw::Shader *getShader() const;
virtual sw::PixelShader *getPixelShader() const;
private:
virtual void createShader();
virtual void deleteShader();
sw::PixelShader *pixelShader;
};
}
......
......@@ -189,6 +189,47 @@ void Shader::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()
{
return getShader() != 0;
......@@ -363,50 +404,6 @@ GLenum VertexShader::getType()
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)
{
if(!attributeName.empty())
......@@ -433,6 +430,18 @@ sw::VertexShader *VertexShader::getVertexShader() const
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)
{
pixelShader = 0;
......@@ -448,50 +457,6 @@ GLenum FragmentShader::getType()
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
{
return pixelShader;
......@@ -501,4 +466,17 @@ sw::PixelShader *FragmentShader::getPixelShader() const
{
return pixelShader;
}
void FragmentShader::createShader()
{
delete pixelShader;
pixelShader = new sw::PixelShader();
}
void FragmentShader::deleteShader()
{
delete pixelShader;
pixelShader = nullptr;
}
}
......@@ -54,7 +54,7 @@ public:
int getSourceLength() const;
void getSource(GLsizei bufSize, GLsizei *length, char *source);
virtual void compile() = 0;
void compile();
bool isCompiled();
void addRef();
......@@ -77,6 +77,9 @@ protected:
char *mInfoLog;
private:
virtual void createShader() = 0;
virtual void deleteShader() = 0;
const GLuint mHandle;
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
......@@ -94,13 +97,15 @@ public:
~VertexShader();
virtual GLenum getType();
virtual void compile();
int getSemanticIndex(const std::string &attributeName);
virtual sw::Shader *getShader() const;
virtual sw::VertexShader *getVertexShader() const;
private:
virtual void createShader();
virtual void deleteShader();
sw::VertexShader *vertexShader;
};
......@@ -112,12 +117,14 @@ public:
~FragmentShader();
virtual GLenum getType();
virtual void compile();
virtual sw::Shader *getShader() const;
virtual sw::PixelShader *getPixelShader() const;
private:
virtual void createShader();
virtual void deleteShader();
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