gsdx wgl: retry to create a context without advance flag

Hopefully it will support more drivers #1813
This commit is contained in:
Gregory Hainaut 2017-02-10 22:26:41 +01:00
parent 213fa1c148
commit de962d3e7e
2 changed files with 22 additions and 19 deletions

View File

@ -45,7 +45,7 @@ LRESULT CALLBACK GSWndWGL::WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA
} }
bool GSWndWGL::CreateContext(int major, int minor) void GSWndWGL::CreateContext(int major, int minor)
{ {
if ( !m_NativeDisplay || !m_NativeWindow ) if ( !m_NativeDisplay || !m_NativeWindow )
{ {
@ -57,7 +57,7 @@ bool GSWndWGL::CreateContext(int major, int minor)
m_context = wglCreateContext(m_NativeDisplay); m_context = wglCreateContext(m_NativeDisplay);
if (!m_context) { if (!m_context) {
fprintf(stderr, "Failed to create a 2.0 context\n"); fprintf(stderr, "Failed to create a 2.0 context\n");
return false; throw GSDXRecoverableError();
} }
// FIXME test it // FIXME test it
@ -88,13 +88,20 @@ bool GSWndWGL::CreateContext(int major, int minor)
PFNWGLCREATECONTEXTATTRIBSARBPROC wglCreateContextAttribsARB = (PFNWGLCREATECONTEXTATTRIBSARBPROC)wglGetProcAddress("wglCreateContextAttribsARB"); PFNWGLCREATECONTEXTATTRIBSARBPROC wglCreateContextAttribsARB = (PFNWGLCREATECONTEXTATTRIBSARBPROC)wglGetProcAddress("wglCreateContextAttribsARB");
if (!wglCreateContextAttribsARB) { if (!wglCreateContextAttribsARB) {
fprintf(stderr, "Failed to init wglCreateContextAttribsARB function pointer\n"); fprintf(stderr, "Failed to init wglCreateContextAttribsARB function pointer\n");
return false; throw GSDXRecoverableError();
} }
HGLRC context30 = wglCreateContextAttribsARB(m_NativeDisplay, NULL, context_attribs); HGLRC context30 = wglCreateContextAttribsARB(m_NativeDisplay, NULL, context_attribs);
if (!context30) { if (!context30) {
fprintf(stderr, "Failed to create a 3.x context\n"); fprintf(stderr, "Failed to create a 3.x context with standard flags\n");
return false; // retry with more compatible option for (Mesa on Windows, OpenGL on WINE)
context_attribs[2*2+1] = 0;
context30 = wglCreateContextAttribsARB(m_NativeDisplay, NULL, context_attribs);
if (!context30) {
fprintf(stderr, "Failed to create a 3.x context with compatible flags\n");
throw GSDXRecoverableError();
}
} }
DetachContext(); DetachContext();
@ -103,8 +110,6 @@ bool GSWndWGL::CreateContext(int major, int minor)
m_context = context30; m_context = context30;
fprintf(stderr, "3.x GL context successfully created\n"); fprintf(stderr, "3.x GL context successfully created\n");
} }
return true;
} }
void GSWndWGL::AttachContext() void GSWndWGL::AttachContext()
@ -141,9 +146,9 @@ bool GSWndWGL::Attach(void* handle, bool managed)
m_NativeWindow = (HWND)handle; m_NativeWindow = (HWND)handle;
m_managed = managed; m_managed = managed;
if (!OpenWGLDisplay()) return false; OpenWGLDisplay();
if (!CreateContext(3, 3)) return false; CreateContext(3, 3);
AttachContext(); AttachContext();
@ -178,7 +183,7 @@ void GSWndWGL::Detach()
} }
bool GSWndWGL::OpenWGLDisplay() void GSWndWGL::OpenWGLDisplay()
{ {
GLuint PixelFormat; // Holds The Results After Searching For A Match GLuint PixelFormat; // Holds The Results After Searching For A Match
PIXELFORMATDESCRIPTOR pfd = // pfd Tells Windows How We Want Things To Be PIXELFORMATDESCRIPTOR pfd = // pfd Tells Windows How We Want Things To Be
@ -208,22 +213,20 @@ bool GSWndWGL::OpenWGLDisplay()
if (!m_NativeDisplay) if (!m_NativeDisplay)
{ {
MessageBox(NULL, "(1) Can't Create A GL Device Context.", "ERROR", MB_OK | MB_ICONEXCLAMATION); MessageBox(NULL, "(1) Can't Create A GL Device Context.", "ERROR", MB_OK | MB_ICONEXCLAMATION);
return false; throw GSDXRecoverableError();
} }
PixelFormat = ChoosePixelFormat(m_NativeDisplay, &pfd); PixelFormat = ChoosePixelFormat(m_NativeDisplay, &pfd);
if (!PixelFormat) if (!PixelFormat)
{ {
MessageBox(NULL, "(2) Can't Find A Suitable PixelFormat.", "ERROR", MB_OK | MB_ICONEXCLAMATION); MessageBox(NULL, "(2) Can't Find A Suitable PixelFormat.", "ERROR", MB_OK | MB_ICONEXCLAMATION);
return false; throw GSDXRecoverableError();
} }
if (!SetPixelFormat(m_NativeDisplay, PixelFormat, &pfd)) if (!SetPixelFormat(m_NativeDisplay, PixelFormat, &pfd))
{ {
MessageBox(NULL, "(3) Can't Set The PixelFormat.", "ERROR", MB_OK | MB_ICONEXCLAMATION); MessageBox(NULL, "(3) Can't Set The PixelFormat.", "ERROR", MB_OK | MB_ICONEXCLAMATION);
return false; throw GSDXRecoverableError();
} }
return true;
} }
void GSWndWGL::CloseWGLDisplay() void GSWndWGL::CloseWGLDisplay()
@ -296,9 +299,9 @@ bool GSWndWGL::Create(const string& title, int w, int h)
if (m_NativeWindow == NULL) return false; if (m_NativeWindow == NULL) return false;
if (!OpenWGLDisplay()) return false; OpenWGLDisplay();
if (!CreateContext(3, 3)) return false; CreateContext(3, 3);
AttachContext(); AttachContext();

View File

@ -31,11 +31,11 @@ class GSWndWGL : public GSWndGL
PFNWGLSWAPINTERVALEXTPROC m_swapinterval; PFNWGLSWAPINTERVALEXTPROC m_swapinterval;
bool CreateContext(int major, int minor); void CreateContext(int major, int minor);
void CheckContext(); void CheckContext();
void CloseWGLDisplay(); void CloseWGLDisplay();
bool OpenWGLDisplay(); void OpenWGLDisplay();
static LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); static LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);