diff --git a/plugins/GSdx/GLLoader.cpp b/plugins/GSdx/GLLoader.cpp index 2d327b5f10..9cf4f74bbf 100644 --- a/plugins/GSdx/GLLoader.cpp +++ b/plugins/GSdx/GLLoader.cpp @@ -192,6 +192,7 @@ namespace GLLoader { bool nvidia_buggy_driver = false; bool intel_buggy_driver = false; bool in_replayer = false; + bool buggy_sso_dual_src = false; bool found_geometry_shader = true; // we require GL3.3 so geometry must be supported by default @@ -268,6 +269,12 @@ namespace GLLoader { if (strstr(vendor, "VMware")) // Assume worst case because I don't know the real status mesa_amd_buggy_driver = intel_buggy_driver = true; +#ifdef _WIN32 + buggy_sso_dual_src = intel_buggy_driver || fglrx_buggy_driver || legacy_fglrx_buggy_driver; +#else + buggy_sso_dual_src = fglrx_buggy_driver || legacy_fglrx_buggy_driver; +#endif + if (theApp.GetConfigI("override_geometry_shader") != -1) { found_geometry_shader = theApp.GetConfigB("override_geometry_shader"); fprintf(stderr, "Overriding geometry shaders detection\n"); diff --git a/plugins/GSdx/GLLoader.h b/plugins/GSdx/GLLoader.h index 0dc3f0ef3d..27f929d376 100644 --- a/plugins/GSdx/GLLoader.h +++ b/plugins/GSdx/GLLoader.h @@ -340,6 +340,7 @@ namespace GLLoader { extern bool mesa_amd_buggy_driver; extern bool nvidia_buggy_driver; extern bool intel_buggy_driver; + extern bool buggy_sso_dual_src; extern bool in_replayer; // GL diff --git a/plugins/GSdx/GSDeviceOGL.cpp b/plugins/GSdx/GSDeviceOGL.cpp index addd2ee0e1..8bd38abe34 100644 --- a/plugins/GSdx/GSDeviceOGL.cpp +++ b/plugins/GSdx/GSDeviceOGL.cpp @@ -758,7 +758,10 @@ void GSDeviceOGL::Barrier(GLbitfield b) /* Note: must be here because tfx_glsl is static */ GLuint GSDeviceOGL::CompileVS(VSSelector sel) { - return m_shader->Compile("tfx_vgs.glsl", "vs_main", GL_VERTEX_SHADER, tfx_vgs_glsl, ""); + if (GLLoader::buggy_sso_dual_src) + return m_shader->CompileShader("tfx_vgs.glsl", "vs_main", GL_VERTEX_SHADER, tfx_vgs_glsl, ""); + else + return m_shader->Compile("tfx_vgs.glsl", "vs_main", GL_VERTEX_SHADER, tfx_vgs_glsl, ""); } /* Note: must be here because tfx_glsl is static */ @@ -766,7 +769,10 @@ GLuint GSDeviceOGL::CompileGS(GSSelector sel) { std::string macro = format("#define GS_POINT %d\n", sel.point); - return m_shader->Compile("tfx_vgs.glsl", "gs_main", GL_GEOMETRY_SHADER, tfx_vgs_glsl, macro); + if (GLLoader::buggy_sso_dual_src) + return m_shader->CompileShader("tfx_vgs.glsl", "gs_main", GL_GEOMETRY_SHADER, tfx_vgs_glsl, macro); + else + return m_shader->Compile("tfx_vgs.glsl", "gs_main", GL_GEOMETRY_SHADER, tfx_vgs_glsl, macro); } /* Note: must be here because tfx_glsl is static */ @@ -804,9 +810,12 @@ GLuint GSDeviceOGL::CompilePS(PSSelector sel) + format("#define PS_FBMASK %d\n", sel.fbmask) + format("#define PS_HDR %d\n", sel.hdr) + format("#define PS_PABE %d\n", sel.pabe); - ; + ; - return m_shader->Compile("tfx.glsl", "ps_main", GL_FRAGMENT_SHADER, tfx_fs_all_glsl, macro); + if (GLLoader::buggy_sso_dual_src) + return m_shader->CompileShader("tfx.glsl", "ps_main", GL_FRAGMENT_SHADER, tfx_fs_all_glsl, macro); + else + return m_shader->Compile("tfx.glsl", "ps_main", GL_FRAGMENT_SHADER, tfx_fs_all_glsl, macro); } void GSDeviceOGL::SelfShaderTest() @@ -1576,7 +1585,10 @@ void GSDeviceOGL::SetupPipeline(const VSSelector& vsel, const GSSelector& gsel, // ************************************************************* // Dynamic // ************************************************************* - m_shader->BindPipeline(m_vs[vsel], m_gs[gsel], ps); + if (GLLoader::buggy_sso_dual_src) + m_shader->BindProgram(m_vs[vsel], m_gs[gsel], ps); + else + m_shader->BindPipeline(m_vs[vsel], m_gs[gsel], ps); } void GSDeviceOGL::SetupSampler(PSSamplerSelector ssel)