summaryrefslogtreecommitdiff
path: root/Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp')
-rw-r--r--Source/Plugins/Plugin_VideoOGL/Src/ProgramShaderCache.cpp66
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;"
);
}