From: Nicolas Capens Date: Fri, 13 Feb 2015 21:09:11 +0000 (-0500) Subject: Centralize shader compilation. X-Git-Tag: android-x86-7.1-r1~1254 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=20b06c3c72ffddb2a67a8b52b63a3984040dc5b3;p=android-x86%2Fexternal-swiftshader.git Centralize shader compilation. Bug 19331817 Change-Id: Ib5df377bf8f715e008f9d4e5efd0e97c6e2f2570 Reviewed-on: https://swiftshader-review.googlesource.com/2290 Reviewed-by: Alexis Hétu Reviewed-by: Nicolas Capens Tested-by: Nicolas Capens --- diff --git a/src/OpenGL/libGL/Shader.cpp b/src/OpenGL/libGL/Shader.cpp index fe8cd0428..f9229f0b6 100644 --- a/src/OpenGL/libGL/Shader.cpp +++ b/src/OpenGL/libGL/Shader.cpp @@ -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; +} + } diff --git a/src/OpenGL/libGL/Shader.h b/src/OpenGL/libGL/Shader.h index 096793edc..b5d5a94b6 100644 --- a/src/OpenGL/libGL/Shader.h +++ b/src/OpenGL/libGL/Shader.h @@ -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; }; } diff --git a/src/OpenGL/libGLESv2/Shader.cpp b/src/OpenGL/libGLESv2/Shader.cpp index 8157e958b..aa5ddee69 100644 --- a/src/OpenGL/libGLESv2/Shader.cpp +++ b/src/OpenGL/libGLESv2/Shader.cpp @@ -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; +} + } diff --git a/src/OpenGL/libGLESv2/Shader.h b/src/OpenGL/libGLESv2/Shader.h index feb7847b8..62f4751c6 100644 --- a/src/OpenGL/libGLESv2/Shader.h +++ b/src/OpenGL/libGLESv2/Shader.h @@ -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; }; }