Permalink
Browse files

gsdx ogl: As Intel is too cheap to provide GL_ARB_direct_state_access…

… on theirs expensive iGPUs

Add a "slower" emulation of the extension...

Hopefully it will allow to start openGL on haswell (maybe broadwell) and later.
1 parent 2699338 commit cdb71101a1f666b429df48dea845cca3b5c4ab7c @gregory38 gregory38 committed Feb 17, 2017
Showing with 127 additions and 25 deletions.
  1. +85 −1 plugins/GSdx/GLLoader.cpp
  2. +9 −0 plugins/GSdx/GLLoader.h
  3. +32 −24 plugins/GSdx/GSWnd.cpp
  4. +1 −0 plugins/GSdx/GSdx.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;
@@ -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();
@@ -136,38 +136,46 @@ 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);
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
}
@@ -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";

0 comments on commit cdb7110

Please sign in to comment.