diff --git a/plugins/GSdx/GLLoader.cpp b/plugins/GSdx/GLLoader.cpp index c81b9b56a5..b2b40852bd 100644 --- a/plugins/GSdx/GLLoader.cpp +++ b/plugins/GSdx/GLLoader.cpp @@ -84,6 +84,8 @@ PFNGLFENCESYNCPROC gl_FenceSync = NU PFNGLDELETESYNCPROC gl_DeleteSync = NULL; PFNGLCLIENTWAITSYNCPROC gl_ClientWaitSync = NULL; PFNGLFLUSHMAPPEDBUFFERRANGEPROC gl_FlushMappedBufferRange = NULL; +PFNGLBLENDEQUATIONSEPARATEPROC gl_BlendEquationSeparate = NULL; +PFNGLBLENDFUNCSEPARATEPROC gl_BlendFuncSeparate = NULL; // GL4.0 PFNGLUNIFORMSUBROUTINESUIVPROC gl_UniformSubroutinesuiv = NULL; // GL4.1 @@ -326,6 +328,7 @@ namespace GLLoader { bool found_geometry_shader = true; // we require GL3.3 so geometry must be supported by default bool found_GL_EXT_texture_filter_anisotropic = false; bool found_GL_ARB_clear_texture = false; // Don't know if GL3 GPU can support it + bool found_GL_ARB_draw_buffers_blend = false; // DX10 GPU limited driver on windows! // Note: except Apple, all drivers support explicit uniform location bool found_GL_ARB_explicit_uniform_location = false; // need by subroutine and bindless texture @@ -345,7 +348,6 @@ namespace GLLoader { // Mandatory bool found_GL_ARB_texture_storage = false; bool found_GL_ARB_shading_language_420pack = false; - bool found_GL_ARB_draw_buffers_blend = false; // could be easily be optional, but I'm lazy static bool status_and_override(bool& found, const std::string& name, bool mandatory = false) { @@ -475,7 +477,7 @@ namespace GLLoader { status &= status_and_override(found_GL_EXT_texture_filter_anisotropic, "GL_EXT_texture_filter_anisotropic"); // GL4.0 status &= status_and_override(found_GL_ARB_gpu_shader5, "GL_ARB_gpu_shader5"); - status &= status_and_override(found_GL_ARB_draw_buffers_blend, "GL_ARB_draw_buffers_blend", true); + status &= status_and_override(found_GL_ARB_draw_buffers_blend, "GL_ARB_draw_buffers_blend"); // GL4.1 status &= status_and_override(found_GL_ARB_separate_shader_objects, "GL_ARB_separate_shader_objects"); status &= status_and_override(found_GL_ARB_shader_subroutine, "GL_ARB_shader_subroutine"); diff --git a/plugins/GSdx/GLLoader.h b/plugins/GSdx/GLLoader.h index 0b7a633fa8..d107a48218 100644 --- a/plugins/GSdx/GLLoader.h +++ b/plugins/GSdx/GLLoader.h @@ -268,6 +268,8 @@ extern PFNGLFENCESYNCPROC gl_FenceSync; extern PFNGLDELETESYNCPROC gl_DeleteSync; extern PFNGLCLIENTWAITSYNCPROC gl_ClientWaitSync; extern PFNGLFLUSHMAPPEDBUFFERRANGEPROC gl_FlushMappedBufferRange; +extern PFNGLBLENDEQUATIONSEPARATEPROC gl_BlendEquationSeparate; +extern PFNGLBLENDFUNCSEPARATEPROC gl_BlendFuncSeparate; // GL4.0 extern PFNGLUNIFORMSUBROUTINESUIVPROC gl_UniformSubroutinesuiv; // GL4.1 diff --git a/plugins/GSdx/GSDeviceOGL.h b/plugins/GSdx/GSDeviceOGL.h index 91c5db197e..d10f553e35 100644 --- a/plugins/GSdx/GSDeviceOGL.h +++ b/plugins/GSdx/GSDeviceOGL.h @@ -99,12 +99,18 @@ public: if (GLState::eq_RGB != m_equation_RGB) { GLState::eq_RGB = m_equation_RGB; - gl_BlendEquationSeparateiARB(0, m_equation_RGB, GL_FUNC_ADD); + if (gl_BlendEquationSeparateiARB) + gl_BlendEquationSeparateiARB(0, m_equation_RGB, GL_FUNC_ADD); + else + gl_BlendEquationSeparate(m_equation_RGB, GL_FUNC_ADD); } if (GLState::f_sRGB != m_func_sRGB || GLState::f_dRGB != m_func_dRGB) { GLState::f_sRGB = m_func_sRGB; GLState::f_dRGB = m_func_dRGB; - gl_BlendFuncSeparateiARB(0, m_func_sRGB, m_func_dRGB, GL_ONE, GL_ZERO); + if (gl_BlendFuncSeparateiARB) + gl_BlendFuncSeparateiARB(0, m_func_sRGB, m_func_dRGB, GL_ONE, GL_ZERO); + else + gl_BlendFuncSeparate(m_func_sRGB, m_func_dRGB, GL_ONE, GL_ZERO); } } } diff --git a/plugins/GSdx/GSWnd.cpp b/plugins/GSdx/GSWnd.cpp index f4f58f2d8e..0751f46ef5 100644 --- a/plugins/GSdx/GSWnd.cpp +++ b/plugins/GSdx/GSWnd.cpp @@ -27,14 +27,14 @@ void GSWndGL::PopulateGlFunction() { *(void**)&(gl_ActiveTexture) = GetProcAddress("glActiveTexture"); *(void**)&(gl_BlendColor) = GetProcAddress("glBlendColor"); + *(void**)&(gl_BlendEquationSeparate) = GetProcAddress("glBlendEquationSeparate"); + *(void**)&(gl_BlendFuncSeparate) = GetProcAddress("glBlendFuncSeparate"); *(void**)&(gl_AttachShader) = GetProcAddress("glAttachShader"); *(void**)&(gl_BindBuffer) = GetProcAddress("glBindBuffer"); *(void**)&(gl_BindBufferBase) = GetProcAddress("glBindBufferBase"); *(void**)&(gl_BindFramebuffer) = GetProcAddress("glBindFramebuffer"); *(void**)&(gl_BindSampler) = GetProcAddress("glBindSampler"); *(void**)&(gl_BindVertexArray) = GetProcAddress("glBindVertexArray"); - *(void**)&(gl_BlendEquationSeparateiARB) = GetProcAddress("glBlendEquationSeparateiARB"); - *(void**)&(gl_BlendFuncSeparateiARB) = GetProcAddress("glBlendFuncSeparateiARB"); *(void**)&(gl_BlitFramebuffer) = GetProcAddress("glBlitFramebuffer"); *(void**)&(gl_BufferData) = GetProcAddress("glBufferData"); *(void**)&(gl_CheckFramebufferStatus) = GetProcAddress("glCheckFramebufferStatus"); @@ -81,6 +81,8 @@ void GSWndGL::PopulateGlFunction() *(void**)&(gl_FlushMappedBufferRange) = GetProcAddress("glFlushMappedBufferRange"); // GL4.0 *(void**)&(gl_UniformSubroutinesuiv) = GetProcAddress("glUniformSubroutinesuiv", true); + *(void**)&(gl_BlendEquationSeparateiARB) = GetProcAddress("glBlendEquationSeparateiARB", true); + *(void**)&(gl_BlendFuncSeparateiARB) = GetProcAddress("glBlendFuncSeparateiARB", true); // GL4.1 *(void**)&(gl_CreateShaderProgramv) = GetProcAddress("glCreateShaderProgramv", true); *(void**)&(gl_BindProgramPipeline) = GetProcAddress("glBindProgramPipeline", true);