diff options
Diffstat (limited to 'Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp')
| -rw-r--r-- | Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp | 66 |
1 files changed, 38 insertions, 28 deletions
diff --git a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp index 3739af5a90..53eb41877e 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp @@ -21,6 +21,7 @@ #include "Debugger.h" #include "Statistics.h" #include "ImageWrite.h" +#include "Render.h" namespace OGL { @@ -122,8 +123,15 @@ void SHADER::SetProgramBindings() glBindFragDataLocationIndexed(glprogid, 0, 0, "ocol0"); glBindFragDataLocationIndexed(glprogid, 0, 1, "ocol1"); } - else + else if(g_ogl_config.eSupportedGLSLVersion > GLSL_120) + { glBindFragDataLocation(glprogid, 0, "ocol0"); + } + else + { + // ogl2 shaders don't need to bind output colors. + // gl_FragColor already point to color channel + } // Need to set some attribute locations glBindAttribLocation(glprogid, SHADER_POSITION_ATTRIB, "rawpos"); @@ -270,7 +278,7 @@ bool ProgramShaderCache::CompileShader ( SHADER& shader, const char* vcode, cons glAttachShader(pid, vsid); glAttachShader(pid, psid); - if (g_ActiveConfig.backend_info.bSupportsGLSLCache) + if (g_ogl_config.bSupportsGLSLCache) glProgramParameteri(pid, GL_PROGRAM_BINARY_RETRIEVABLE_HINT, GL_TRUE); shader.SetProgramBindings(); @@ -406,14 +414,14 @@ void ProgramShaderCache::Init(void) } // Read our shader cache, only if supported - if (g_ActiveConfig.backend_info.bSupportsGLSLCache) + if (g_ogl_config.bSupportsGLSLCache) { GLint Supported; glGetIntegerv(GL_NUM_PROGRAM_BINARY_FORMATS, &Supported); if(!Supported) { ERROR_LOG(VIDEO, "GL_ARB_get_program_binary is supported, but no binary format is known. So disable shader cache."); - g_ActiveConfig.backend_info.bSupportsGLSLCache = false; + g_ogl_config.bSupportsGLSLCache = false; } else { @@ -439,7 +447,7 @@ void ProgramShaderCache::Init(void) void ProgramShaderCache::Shutdown(void) { // store all shaders in cache on disk - if (g_ActiveConfig.backend_info.bSupportsGLSLCache) + if (g_ogl_config.bSupportsGLSLCache) { PCache::iterator iter = pshaders.begin(); for (; iter != pshaders.end(); ++iter) @@ -481,32 +489,17 @@ void ProgramShaderCache::Shutdown(void) void ProgramShaderCache::CreateHeader ( void ) { -#ifdef _WIN32 - // Intel Windows driver has a issue: - // their glsl doesn't know about the ubo extension, so we can't load it. - // but as version 140, ubo is in core and don't have to be loaded in glsl. - // as sandy do ogl3.1, glsl 140 is supported, so force it in this way. - // TODO: remove this again when the issue is fixed: - // see http://communities.intel.com/thread/36084 - char *vendor = (char*)glGetString(GL_VENDOR); - bool glsl140_hack = strcmp(vendor, "Intel") == 0; -#elif __APPLE__ - // as apple doesn't support glsl130 at all, we also have to use glsl140 - bool glsl140_hack = true; -#else - bool glsl140_hack = false; -#endif - + GLSL_VERSION v = g_ogl_config.eSupportedGLSLVersion; snprintf(s_glsl_header, sizeof(s_glsl_header), "#version %s\n" "%s\n" // tex_rect "%s\n" // ubo "\n"// A few required defines and ones that will make our lives a lot easier - "#define ATTRIN in\n" - "#define ATTROUT out\n" - "#define VARYIN centroid in\n" - "#define VARYOUT centroid out\n" + "#define ATTRIN %s\n" + "#define ATTROUT %s\n" + "#define VARYIN %s\n" + "#define VARYOUT %s\n" // Silly differences "#define float2 vec2\n" @@ -518,10 +511,27 @@ void ProgramShaderCache::CreateHeader ( void ) "#define saturate(x) clamp(x, 0.0f, 1.0f)\n" "#define lerp(x, y, z) mix(x, y, z)\n" + // glsl 120 hack + "%s\n" + "%s\n" + "%s\n" + "%s\n" + "%s\n" + "#define COLOROUT(name) %s\n" - , glsl140_hack ? "140" : "130" - , glsl140_hack ? "#define texture2DRect texture" : "#extension GL_ARB_texture_rectangle : enable" - , g_ActiveConfig.backend_info.bSupportsGLSLUBO && !glsl140_hack ? "#extension GL_ARB_uniform_buffer_object : enable" : "// ubo disabled" + , v==GLSL_120 ? "120" : v==GLSL_130 ? "130" : "140" + , v<=GLSL_130 ? "#extension GL_ARB_texture_rectangle : enable" : "#define texture2DRect texture" + , g_ActiveConfig.backend_info.bSupportsGLSLUBO && v!=GLSL_140 ? "#extension GL_ARB_uniform_buffer_object : enable" : "" + , v==GLSL_120 ? "attribute" : "in" + , v==GLSL_120 ? "attribute" : "out" + , v==GLSL_120 ? "varying" : "centroid in" + , v==GLSL_120 ? "varying" : "centroid out" + , v==GLSL_120 ? "#define texture texture2D" : "" + , v==GLSL_120 ? "#define round(x) floor((x)+0.5f)" : "" + , v==GLSL_120 ? "#define out " : "" + , v==GLSL_120 ? "#define ocol0 gl_FragColor" : "" + , v==GLSL_120 ? "#define ocol1 gl_FragColor" : "" //TODO: implemenet dual source blend + , v==GLSL_120 ? "" : "out vec4 name;" ); } |
