diff --git a/plugins/GSdx/GLLoader.cpp b/plugins/GSdx/GLLoader.cpp index a64b8f6396..f30f7fc3e3 100644 --- a/plugins/GSdx/GLLoader.cpp +++ b/plugins/GSdx/GLLoader.cpp @@ -168,6 +168,14 @@ PFNGLCLIPCONTROLPROC glClipControl = NUL PFNGLTEXTUREBARRIERPROC glTextureBarrier = NULL; PFNGLGETTEXTURESUBIMAGEPROC glGetTextureSubImage = NULL; +#ifdef _WIN32 +PFNGLACTIVETEXTUREPROC gl_ActiveTexture = NULL; +PFNGLTEXSTORAGE2DPROC glTexStorage2D = NULL; +PFNGLGENPROGRAMPIPELINESPROC glGenProgramPipelines = NULL; +PFNGLGENSAMPLERSPROC glGenSamplers = NULL; +PFNGLGENERATEMIPMAPPROC glGenerateMipmap = NULL; +#endif + namespace ReplaceGL { void APIENTRY ScissorIndexed(GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height) { @@ -185,6 +193,75 @@ namespace ReplaceGL { } +#ifdef _WIN32 +namespace Emulate_DSA { + // Texture entry point + void APIENTRY BindTextureUnit(GLuint unit, GLuint texture) { + gl_ActiveTexture(GL_TEXTURE0 + unit); + glBindTexture(GL_TEXTURE_2D, texture); + } + + void APIENTRY CreateTexture(GLenum target, GLsizei n, GLuint *textures) { + glGenTextures(1, textures); + } + + void APIENTRY TextureStorage(GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height) { + BindTextureUnit(7, texture); + glTexStorage2D(GL_TEXTURE_2D, levels, internalformat, width, height); + } + + void APIENTRY TextureSubImage(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels) { + BindTextureUnit(7, texture); + glTexSubImage2D(GL_TEXTURE_2D, level, xoffset, yoffset, width, height, format, type, pixels); + } + + void APIENTRY CopyTextureSubImage(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height) { + BindTextureUnit(7, texture); + glCopyTexSubImage2D(GL_TEXTURE_2D, level, xoffset, yoffset, x, y, width, height); + } + + void APIENTRY GetTexureImage(GLuint texture, GLint level, GLenum format, GLenum type, GLsizei bufSize, void *pixels) { + BindTextureUnit(7, texture); + glGetTexImage(GL_TEXTURE_2D, level, format, type, pixels); + } + + void APIENTRY TextureParameteri (GLuint texture, GLenum pname, GLint param) { + BindTextureUnit(7, texture); + glTexParameteri(GL_TEXTURE_2D, pname, param); + } + + void APIENTRY GenerateTextureMipmap(GLuint texture) { + BindTextureUnit(7, texture); + glGenerateMipmap(GL_TEXTURE_2D); + } + + // Misc entry point + // (only purpose is to have a consistent API otherwise it is useless) + void APIENTRY CreateProgramPipelines(GLsizei n, GLuint *pipelines) { + glGenProgramPipelines(n, pipelines); + } + + void APIENTRY CreateSamplers(GLsizei n, GLuint *samplers) { + glGenSamplers(n, samplers); + } + + // Replace function pointer to emulate DSA behavior + void Init() { + fprintf(stderr, "DSA is not supported. Expect slower performance\n"); + glBindTextureUnit = BindTextureUnit; + glCreateTextures = CreateTexture; + glTextureStorage2D = TextureStorage; + glTextureSubImage2D = TextureSubImage; + glCopyTextureSubImage2D = CopyTextureSubImage; + glGetTextureImage = GetTexureImage; + glTextureParameteri = TextureParameteri; + + glCreateProgramPipelines = CreateProgramPipelines; + glCreateSamplers = CreateSamplers; + } +} +#endif + namespace GLLoader { bool legacy_fglrx_buggy_driver = false; @@ -353,7 +430,7 @@ namespace GLLoader { status &= status_and_override(found_GL_ARB_clear_texture,"GL_ARB_clear_texture"); // GL4.5 status &= status_and_override(found_GL_ARB_clip_control, "GL_ARB_clip_control", true); - status &= status_and_override(found_GL_ARB_direct_state_access, "GL_ARB_direct_state_access", true); + status &= status_and_override(found_GL_ARB_direct_state_access, "GL_ARB_direct_state_access"); // Mandatory for the advance HW renderer effect. Unfortunately Mesa LLVMPIPE/SWR renderers doesn't support this extension. // Rendering might be corrupted but it could be good enough for test/virtual machine. status &= status_and_override(found_GL_ARB_texture_barrier, "GL_ARB_texture_barrier"); @@ -379,6 +456,13 @@ namespace GLLoader { glTextureBarrier = ReplaceGL::TextureBarrier; } +#ifdef _WIN32 + // Thanks you Intel to not provide support of basic feature on your iGPU + if (!found_GL_ARB_direct_state_access) { + Emulate_DSA::Init(); + } +#endif + fprintf(stdout, "\n"); return status; diff --git a/plugins/GSdx/GLLoader.h b/plugins/GSdx/GLLoader.h index bf3b962fbd..66fd7b4151 100644 --- a/plugins/GSdx/GLLoader.h +++ b/plugins/GSdx/GLLoader.h @@ -346,6 +346,15 @@ extern PFNGLCLIPCONTROLPROC glClipControl; extern PFNGLTEXTUREBARRIERPROC glTextureBarrier; extern PFNGLGETTEXTURESUBIMAGEPROC glGetTextureSubImage; +#ifdef _WIN32 +extern PFNGLACTIVETEXTUREPROC gl_ActiveTexture; +extern PFNGLTEXSTORAGE2DPROC glTexStorage2D; +extern PFNGLGENPROGRAMPIPELINESPROC glGenProgramPipelines; +extern PFNGLGENSAMPLERSPROC glGenSamplers; +extern PFNGLGENERATEMIPMAPPROC glGenerateMipmap; +#endif + + namespace GLLoader { bool check_gl_version(int major, int minor); void init_gl_function(); diff --git a/plugins/GSdx/GSWnd.cpp b/plugins/GSdx/GSWnd.cpp index 90a53c727d..081813eedb 100644 --- a/plugins/GSdx/GSWnd.cpp +++ b/plugins/GSdx/GSWnd.cpp @@ -136,33 +136,33 @@ void GSWndGL::PopulateGlFunction() GL_EXT_LOAD(glBufferStorage); // GL4.5 - GL_EXT_LOAD(glCreateTextures); - GL_EXT_LOAD(glTextureStorage2D); - GL_EXT_LOAD(glTextureSubImage2D); - GL_EXT_LOAD(glCopyTextureSubImage2D); - GL_EXT_LOAD(glBindTextureUnit); - GL_EXT_LOAD(glGetTextureImage); - GL_EXT_LOAD(glTextureParameteri); - GL_EXT_LOAD(glGenerateTextureMipmap); + GL_EXT_LOAD_OPT(glCreateTextures); + GL_EXT_LOAD_OPT(glTextureStorage2D); + GL_EXT_LOAD_OPT(glTextureSubImage2D); + GL_EXT_LOAD_OPT(glCopyTextureSubImage2D); + GL_EXT_LOAD_OPT(glBindTextureUnit); + GL_EXT_LOAD_OPT(glGetTextureImage); + GL_EXT_LOAD_OPT(glTextureParameteri); + GL_EXT_LOAD_OPT(glGenerateTextureMipmap); - GL_EXT_LOAD(glCreateFramebuffers); - GL_EXT_LOAD(glClearNamedFramebufferfv); - GL_EXT_LOAD(glClearNamedFramebufferuiv); - GL_EXT_LOAD(glClearNamedFramebufferiv); - GL_EXT_LOAD(glNamedFramebufferTexture); - GL_EXT_LOAD(glNamedFramebufferDrawBuffers); - GL_EXT_LOAD(glNamedFramebufferReadBuffer); + GL_EXT_LOAD_OPT(glCreateFramebuffers); + GL_EXT_LOAD_OPT(glClearNamedFramebufferfv); + GL_EXT_LOAD_OPT(glClearNamedFramebufferuiv); + GL_EXT_LOAD_OPT(glClearNamedFramebufferiv); + GL_EXT_LOAD_OPT(glNamedFramebufferTexture); + GL_EXT_LOAD_OPT(glNamedFramebufferDrawBuffers); + GL_EXT_LOAD_OPT(glNamedFramebufferReadBuffer); GL_EXT_LOAD_OPT(glNamedFramebufferParameteri); - GL_EXT_LOAD(glCheckNamedFramebufferStatus); + GL_EXT_LOAD_OPT(glCheckNamedFramebufferStatus); - GL_EXT_LOAD(glCreateBuffers); - GL_EXT_LOAD(glNamedBufferStorage); - GL_EXT_LOAD(glNamedBufferData); - GL_EXT_LOAD(glNamedBufferSubData); - GL_EXT_LOAD(glMapNamedBuffer); - GL_EXT_LOAD(glMapNamedBufferRange); - GL_EXT_LOAD(glUnmapNamedBuffer); - GL_EXT_LOAD(glFlushMappedNamedBufferRange); + GL_EXT_LOAD_OPT(glCreateBuffers); + GL_EXT_LOAD_OPT(glNamedBufferStorage); + GL_EXT_LOAD_OPT(glNamedBufferData); + GL_EXT_LOAD_OPT(glNamedBufferSubData); + GL_EXT_LOAD_OPT(glMapNamedBuffer); + GL_EXT_LOAD_OPT(glMapNamedBufferRange); + GL_EXT_LOAD_OPT(glUnmapNamedBuffer); + GL_EXT_LOAD_OPT(glFlushMappedNamedBufferRange); GL_EXT_LOAD(glCreateSamplers); GL_EXT_LOAD(glCreateProgramPipelines); @@ -170,4 +170,12 @@ void GSWndGL::PopulateGlFunction() GL_EXT_LOAD(glClipControl); GL_EXT_LOAD(glTextureBarrier); GL_EXT_LOAD_OPT(glGetTextureSubImage); + +#ifdef _WIN32 + *(void**)&(gl_ActiveTexture) = GetProcAddress("glActiveTexture"); + GL_EXT_LOAD(glTexStorage2D); + GL_EXT_LOAD(glGenSamplers); + GL_EXT_LOAD(glGenProgramPipelines); + GL_EXT_LOAD(glGenerateMipmap); +#endif } diff --git a/plugins/GSdx/GSdx.cpp b/plugins/GSdx/GSdx.cpp index 2b30dba4d3..2e922463dc 100644 --- a/plugins/GSdx/GSdx.cpp +++ b/plugins/GSdx/GSdx.cpp @@ -329,6 +329,7 @@ void GSdxApp::Init() m_default_configuration["osd_max_log_messages"] = "3"; m_default_configuration["override_geometry_shader"] = "-1"; m_default_configuration["override_GL_ARB_clear_texture"] = "-1"; + m_default_configuration["override_GL_ARB_direct_state_access"] = "-1"; m_default_configuration["override_GL_ARB_draw_buffers_blend"] = "-1"; m_default_configuration["override_GL_ARB_get_texture_sub_image"] = "-1"; m_default_configuration["override_GL_ARB_gpu_shader5"] = "-1";