diff options
author | Johannes Schickel | 2016-01-03 11:58:50 +0100 |
---|---|---|
committer | Johannes Schickel | 2016-03-16 20:29:26 +0100 |
commit | 2319fcd2289f604f2a9c00942a9cd2e88ea2acc8 (patch) | |
tree | f106404fda0e183dab7de0b2926d37d2ad8adcc7 /backends | |
parent | e66e9e44d358b0cc90d128c31e695a8ace4177fa (diff) | |
download | scummvm-rg350-2319fcd2289f604f2a9c00942a9cd2e88ea2acc8.tar.gz scummvm-rg350-2319fcd2289f604f2a9c00942a9cd2e88ea2acc8.tar.bz2 scummvm-rg350-2319fcd2289f604f2a9c00942a9cd2e88ea2acc8.zip |
OPENGL: Handle GLES2 and GL shaders uniformly.
GLES2 requires precision qualifiers to be set and allows use of precision
qualifiers. For GLES2 we define a default precision now. Since precision
qualifiers are not supported in the GLSL version we use for GL, we
introduce compatibility #defines.
Diffstat (limited to 'backends')
-rw-r--r-- | backends/graphics/opengl/opengl-graphics.cpp | 4 | ||||
-rw-r--r-- | backends/graphics/opengl/shader.cpp | 40 | ||||
-rw-r--r-- | backends/graphics/opengl/shader.h | 7 |
3 files changed, 28 insertions, 23 deletions
diff --git a/backends/graphics/opengl/opengl-graphics.cpp b/backends/graphics/opengl/opengl-graphics.cpp index df939fb3d8..7f4fcf73bb 100644 --- a/backends/graphics/opengl/opengl-graphics.cpp +++ b/backends/graphics/opengl/opengl-graphics.cpp @@ -905,14 +905,14 @@ void OpenGLGraphicsManager::notifyContextCreate(const Graphics::PixelFormat &def if (g_context.type == kContextGLES2) { #endif #if !USE_FORCED_GL - _shader = new Shader(g_defaultVertexShader, g_defaultFragmentShaderGLES2); + _shader = new Shader(g_defaultVertexShader, g_defaultFragmentShader); #endif #if !USE_FORCED_GL && !USE_FORCED_GLES2 } else { #endif #if !USE_FORCED_GLES2 if (g_context.shadersSupported) { - _shader = new Shader(g_defaultVertexShader, g_defaultFragmentShaderGL); + _shader = new Shader(g_defaultVertexShader, g_defaultFragmentShader); } #endif #if !USE_FORCED_GL && !USE_FORCED_GLES2 diff --git a/backends/graphics/opengl/shader.cpp b/backends/graphics/opengl/shader.cpp index c251ec1ed9..e699262b8d 100644 --- a/backends/graphics/opengl/shader.cpp +++ b/backends/graphics/opengl/shader.cpp @@ -25,6 +25,7 @@ #if !USE_FORCED_GLES #include "common/textconsole.h" +#include "common/util.h" namespace OpenGL { @@ -44,8 +45,7 @@ const char *const g_defaultVertexShader = "\tgl_Position = projection * position;\n" "}\n"; -#if !USE_FORCED_GLES2 -const char *const g_defaultFragmentShaderGL = +const char *const g_defaultFragmentShader = "varying vec2 texCoord;\n" "varying vec4 blendColor;\n" "\n" @@ -54,19 +54,24 @@ const char *const g_defaultFragmentShaderGL = "void main(void) {\n" "\tgl_FragColor = blendColor * texture2D(texture, texCoord);\n" "}\n"; -#endif -#if !USE_FORCED_GL -const char *const g_defaultFragmentShaderGLES2 = - "varying lowp vec2 texCoord;\n" - "varying lowp vec4 blendColor;\n" - "\n" - "uniform sampler2D texture;\n" - "\n" - "void main(void) {\n" - "\tgl_FragColor = blendColor * texture2D(texture, texCoord);\n" - "}\n"; -#endif +namespace { + +// Taken from: https://en.wikibooks.org/wiki/OpenGL_Programming/Modern_OpenGL_Tutorial_03#OpenGL_ES_2_portability +const char *const g_precisionDefines = + "#ifdef GL_ES\n" + "\t#if defined(GL_FRAGMENT_PRECISION_HIGH) && GL_FRAGMENT_PRECISION_HIGH == 1\n" + "\t\tprecision highp float;\n" + "\t#else\n" + "\t\tprecision mediump float;\n" + "\t#endif\n" + "#else\n" + "\t#define highp\n" + "\t#define mediump\n" + "\t#define lowp\n" + "#endif\n"; + +} // End of anonymous namespace Shader::Shader(const Common::String &vertex, const Common::String &fragment) : _vertex(vertex), _fragment(fragment), _program(0), _projectionLocation(-1), _textureLocation(-1) { @@ -188,7 +193,12 @@ GLshader Shader::compileShader(const char *source, GLenum shaderType) { return 0; } - GL_CALL(glShaderSource(handle, 1, &source, nullptr)); + const char *const sources[2] = { + g_precisionDefines, + source + }; + + GL_CALL(glShaderSource(handle, ARRAYSIZE(sources), sources, nullptr)); GL_CALL(glCompileShader(handle)); GLint result; diff --git a/backends/graphics/opengl/shader.h b/backends/graphics/opengl/shader.h index 458ecb9f16..98a2a2859b 100644 --- a/backends/graphics/opengl/shader.h +++ b/backends/graphics/opengl/shader.h @@ -38,12 +38,7 @@ enum { }; extern const char *const g_defaultVertexShader; -#if !USE_FORCED_GLES2 -extern const char *const g_defaultFragmentShaderGL; -#endif -#if !USE_FORCED_GL -extern const char *const g_defaultFragmentShaderGLES2; -#endif +extern const char *const g_defaultFragmentShader; class Shader { public: |