diff options
author | Johannes Schickel | 2015-12-21 06:35:13 +0100 |
---|---|---|
committer | Johannes Schickel | 2016-03-16 20:29:25 +0100 |
commit | 8a3eecb73a9eb5d885e3585835db6bee738c1de5 (patch) | |
tree | 889dce2c22702c4aa5dd2cdde011240f17467a42 /backends/graphics/opengl/shader.cpp | |
parent | fc52f730506422ac99e44cd74f229e6a0c5c2121 (diff) | |
download | scummvm-rg350-8a3eecb73a9eb5d885e3585835db6bee738c1de5.tar.gz scummvm-rg350-8a3eecb73a9eb5d885e3585835db6bee738c1de5.tar.bz2 scummvm-rg350-8a3eecb73a9eb5d885e3585835db6bee738c1de5.zip |
OPENGL: Unify shader implementation for GL and GLES2.
Diffstat (limited to 'backends/graphics/opengl/shader.cpp')
-rw-r--r-- | backends/graphics/opengl/shader.cpp | 155 |
1 files changed, 13 insertions, 142 deletions
diff --git a/backends/graphics/opengl/shader.cpp b/backends/graphics/opengl/shader.cpp index 7fdebed493..9e106a81b8 100644 --- a/backends/graphics/opengl/shader.cpp +++ b/backends/graphics/opengl/shader.cpp @@ -68,166 +68,39 @@ const char *const g_defaultFragmentShaderGLES2 = "}\n"; #endif -#if !USE_FORCED_GLES2 - -ShaderARB::ShaderARB(const Common::String &vertex, const Common::String &fragment) - : Shader(vertex, fragment), _program(0), _projectionLocation(-1), _textureLocation(-1) { +Shader::Shader(const Common::String &vertex, const Common::String &fragment) + : _vertex(vertex), _fragment(fragment), _program(0), _projectionLocation(-1), _textureLocation(-1) { } -ShaderARB::~ShaderARB() { +Shader::~Shader() { // According to extension specification glDeleteObjectARB silently ignores // 0. However, with nVidia drivers this can cause GL_INVALID_VALUE, thus // we do not call it with 0 as parameter to avoid warnings. if (_program) { - GL_CALL_SAFE(glDeleteObjectARB, (_program)); + GL_CALL_SAFE(glDeleteProgram, (_program)); } } -void ShaderARB::destroy() { +void Shader::destroy() { // According to extension specification glDeleteObjectARB silently ignores // 0. However, with nVidia drivers this can cause GL_INVALID_VALUE, thus // we do not call it with 0 as parameter to avoid warnings. if (_program) { - GL_CALL(glDeleteObjectARB(_program)); + GL_CALL(glDeleteProgram(_program)); + _program = 0; } - _program = 0; } -bool ShaderARB::recreate() { +bool Shader::recreate() { // Make sure any old programs are destroyed properly. destroy(); - GLhandleARB vertexShader = compileShader(_vertex.c_str(), GL_VERTEX_SHADER_ARB); + GLshader vertexShader = compileShader(_vertex.c_str(), GL_VERTEX_SHADER); if (!vertexShader) { return false; } - GLhandleARB fragmentShader = compileShader(_fragment.c_str(), GL_FRAGMENT_SHADER_ARB); - if (!fragmentShader) { - GL_CALL(glDeleteObjectARB(vertexShader)); - return false; - } - - GL_ASSIGN(_program, glCreateProgramObjectARB()); - if (!_program) { - GL_CALL(glDeleteObjectARB(vertexShader)); - GL_CALL(glDeleteObjectARB(fragmentShader)); - return false; - } - - GL_CALL(glAttachObjectARB(_program, vertexShader)); - GL_CALL(glAttachObjectARB(_program, fragmentShader)); - - GL_CALL(glBindAttribLocationARB(_program, kPositionAttribLocation, "position")); - GL_CALL(glBindAttribLocationARB(_program, kTexCoordAttribLocation, "texCoordIn")); - GL_CALL(glBindAttribLocationARB(_program, kColorAttribLocation, "blendColorIn")); - - GL_CALL(glLinkProgramARB(_program)); - - GL_CALL(glDetachObjectARB(_program, fragmentShader)); - GL_CALL(glDeleteObjectARB(fragmentShader)); - - GL_CALL(glDetachObjectARB(_program, vertexShader)); - GL_CALL(glDeleteObjectARB(vertexShader)); - - GLint result; - GL_CALL(glGetObjectParameterivARB(_program, GL_OBJECT_LINK_STATUS_ARB, &result)); - if (result == GL_FALSE) { - GLint logSize; - GL_CALL(glGetObjectParameterivARB(_program, GL_OBJECT_INFO_LOG_LENGTH_ARB, &logSize)); - - GLchar *log = new GLchar[logSize]; - GL_CALL(glGetInfoLogARB(_program, logSize, nullptr, log)); - warning("Could not link shader: \"%s\"", log); - delete[] log; - - destroy(); - return false; - } - - GL_ASSIGN(_projectionLocation, glGetUniformLocationARB(_program, "projection")); - if (_projectionLocation == -1) { - warning("Shader misses \"projection\" uniform."); - destroy(); - return false; - } - - GL_ASSIGN(_textureLocation, glGetUniformLocationARB(_program, "texture")); - if (_textureLocation == -1) { - warning("Shader misses \"texture\" uniform."); - destroy(); - return false; - } - - return true; -} - -void ShaderARB::activate(const GLfloat *projectionMatrix) { - // Activate program. - GL_CALL(glUseProgramObjectARB(_program)); - - // Set projection matrix. - GL_CALL(glUniformMatrix4fv(_projectionLocation, 1, GL_FALSE, projectionMatrix)); - - // We always use texture unit 0. - GL_CALL(glUniform1i(_textureLocation, 0)); -} - -GLhandleARB ShaderARB::compileShader(const char *source, GLenum shaderType) { - GLuint handle; - GL_ASSIGN(handle, glCreateShaderObjectARB(shaderType)); - if (!handle) { - return 0; - } - - GL_CALL(glShaderSourceARB(handle, 1, &source, nullptr)); - GL_CALL(glCompileShaderARB(handle)); - - GLint result; - GL_CALL(glGetObjectParameterivARB(handle, GL_OBJECT_COMPILE_STATUS_ARB, &result)); - if (result == GL_FALSE) { - GLint logSize; - GL_CALL(glGetObjectParameterivARB(handle, GL_OBJECT_INFO_LOG_LENGTH_ARB, &logSize)); - - GLchar *log = new GLchar[logSize]; - GL_CALL(glGetInfoLogARB(handle, logSize, nullptr, log)); - warning("Could not compile shader \"%s\": \"%s\"", source, log); - delete[] log; - - GL_CALL(glDeleteObjectARB(handle)); - return 0; - } - - return handle; -} - -#endif // !USE_FORCED_GLES2 - -#if !USE_FORCED_GL - -ShaderGLES2::ShaderGLES2(const Common::String &vertex, const Common::String &fragment) - : Shader(vertex, fragment), _program(0), _projectionLocation(-1), _textureLocation(-1) { -} - -ShaderGLES2::~ShaderGLES2() { - GL_CALL_SAFE(glDeleteProgram, (_program)); -} - -void ShaderGLES2::destroy() { - GL_CALL(glDeleteProgram(_program)); - _program = 0; -} - -bool ShaderGLES2::recreate() { - // Make sure any old programs are destroyed properly. - destroy(); - - GLuint vertexShader = compileShader(_vertex.c_str(), GL_VERTEX_SHADER); - if (!vertexShader) { - return false; - } - - GLuint fragmentShader = compileShader(_fragment.c_str(), GL_FRAGMENT_SHADER); + GLshader fragmentShader = compileShader(_fragment.c_str(), GL_FRAGMENT_SHADER); if (!fragmentShader) { GL_CALL(glDeleteShader(vertexShader)); return false; @@ -287,7 +160,7 @@ bool ShaderGLES2::recreate() { return true; } -void ShaderGLES2::activate(const GLfloat *projectionMatrix) { +void Shader::activate(const GLfloat *projectionMatrix) { // Activate program. GL_CALL(glUseProgram(_program)); @@ -298,8 +171,8 @@ void ShaderGLES2::activate(const GLfloat *projectionMatrix) { GL_CALL(glUniform1i(_textureLocation, 0)); } -GLuint ShaderGLES2::compileShader(const char *source, GLenum shaderType) { - GLuint handle; +GLshader Shader::compileShader(const char *source, GLenum shaderType) { + GLshader handle; GL_ASSIGN(handle, glCreateShader(shaderType)); if (!handle) { return 0; @@ -326,8 +199,6 @@ GLuint ShaderGLES2::compileShader(const char *source, GLenum shaderType) { return handle; } -#endif // !!USE_FORCED_GL - } // End of namespace OpenGL #endif // !USE_FORCED_GLES |