OSDN Git Service

Centralize shader compilation.
authorNicolas Capens <capn@google.com>
Fri, 13 Feb 2015 21:09:11 +0000 (16:09 -0500)
committerNicolas Capens <capn@google.com>
Mon, 23 Feb 2015 20:29:11 +0000 (20:29 +0000)
Bug 19331817

Change-Id: Ib5df377bf8f715e008f9d4e5efd0e97c6e2f2570
Reviewed-on: https://swiftshader-review.googlesource.com/2290
Reviewed-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Nicolas Capens <capn@google.com>
Tested-by: Nicolas Capens <capn@google.com>
src/OpenGL/libGL/Shader.cpp
src/OpenGL/libGL/Shader.h
src/OpenGL/libGLESv2/Shader.cpp
src/OpenGL/libGLESv2/Shader.h

index fe8cd04..f9229f0 100644 (file)
@@ -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;
+}
+
 }
index 096793e..b5d5a94 100644 (file)
@@ -57,7 +57,7 @@ public:
     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
@@ -80,6 +80,9 @@ protected:
        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
@@ -97,13 +100,15 @@ public:
     ~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
@@ -115,12 +120,14 @@ public:
     ~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
index 8157e95..aa5ddee 100644 (file)
@@ -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;
+}
+
 }
index feb7847..62f4751 100644 (file)
@@ -54,7 +54,7 @@ public:
     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
@@ -77,6 +77,9 @@ protected:
        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
@@ -94,13 +97,15 @@ public:
     ~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
@@ -112,12 +117,14 @@ public:
     ~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