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;
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())
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;
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;
{
return pixelShader;
}
+
+void FragmentShader::createShader()
+{
+ delete pixelShader;
+ pixelShader = new sw::PixelShader();
+}
+
+void FragmentShader::deleteShader()
+{
+ delete pixelShader;
+ pixelShader = nullptr;
+}
+
}
int getSourceLength() const;\r
void getSource(GLsizei bufSize, GLsizei *length, char *source);\r
\r
- virtual void compile() = 0;\r
+ void compile();\r
bool isCompiled();\r
\r
void addRef();\r
char *mInfoLog;\r
\r
private:\r
+ virtual void createShader() = 0;\r
+ virtual void deleteShader() = 0;\r
+\r
const GLuint mHandle;\r
unsigned int mRefCount; // Number of program objects this shader is attached to\r
bool mDeleteStatus; // Flag to indicate that the shader can be deleted when no longer in use\r
~VertexShader();\r
\r
virtual GLenum getType();\r
- virtual void compile();\r
int getSemanticIndex(const std::string &attributeName);\r
\r
virtual sw::Shader *getShader() const;\r
virtual sw::VertexShader *getVertexShader() const;\r
\r
private:\r
+ virtual void createShader();\r
+ virtual void deleteShader();\r
+\r
sw::VertexShader *vertexShader;\r
};\r
\r
~FragmentShader();\r
\r
virtual GLenum getType();\r
- virtual void compile();\r
\r
virtual sw::Shader *getShader() const;\r
virtual sw::PixelShader *getPixelShader() const;\r
\r
private:\r
+ virtual void createShader();\r
+ virtual void deleteShader();\r
+\r
sw::PixelShader *pixelShader;\r
};\r
}\r
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;
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())
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;
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;
{
return pixelShader;
}
+
+void FragmentShader::createShader()
+{
+ delete pixelShader;
+ pixelShader = new sw::PixelShader();
+}
+
+void FragmentShader::deleteShader()
+{
+ delete pixelShader;
+ pixelShader = nullptr;
+}
+
}
int getSourceLength() const;\r
void getSource(GLsizei bufSize, GLsizei *length, char *source);\r
\r
- virtual void compile() = 0;\r
+ void compile();\r
bool isCompiled();\r
\r
void addRef();\r
char *mInfoLog;\r
\r
private:\r
+ virtual void createShader() = 0;\r
+ virtual void deleteShader() = 0;\r
+\r
const GLuint mHandle;\r
unsigned int mRefCount; // Number of program objects this shader is attached to\r
bool mDeleteStatus; // Flag to indicate that the shader can be deleted when no longer in use\r
~VertexShader();\r
\r
virtual GLenum getType();\r
- virtual void compile();\r
int getSemanticIndex(const std::string &attributeName);\r
\r
virtual sw::Shader *getShader() const;\r
virtual sw::VertexShader *getVertexShader() const;\r
\r
private:\r
+ virtual void createShader();\r
+ virtual void deleteShader();\r
+\r
sw::VertexShader *vertexShader;\r
};\r
\r
~FragmentShader();\r
\r
virtual GLenum getType();\r
- virtual void compile();\r
\r
virtual sw::Shader *getShader() const;\r
virtual sw::PixelShader *getPixelShader() const;\r
\r
private:\r
+ virtual void createShader();\r
+ virtual void deleteShader();\r
+\r
sw::PixelShader *pixelShader;\r
};\r
}\r