Permalink
Browse files

Merge pull request #1814 from PCSX2/greg/gsdx-wgl-context

gsdx wgl: retry to create a context without advance flag
  • Loading branch information...
2 parents 213fa1c + de962d3 commit 0610690fa7d2c04da45d471ab4c34886553fb63e @gregory38 gregory38 committed on GitHub Feb 11, 2017
Showing with 22 additions and 19 deletions.
  1. +20 −17 plugins/GSdx/GSWndWGL.cpp
  2. +2 −2 plugins/GSdx/GSWndWGL.h
@@ -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 )
{
@@ -57,7 +57,7 @@ bool GSWndWGL::CreateContext(int major, int minor)
m_context = wglCreateContext(m_NativeDisplay);
if (!m_context) {
fprintf(stderr, "Failed to create a 2.0 context\n");
- return false;
+ throw GSDXRecoverableError();
}
// FIXME test it
@@ -88,13 +88,20 @@ bool GSWndWGL::CreateContext(int major, int minor)
PFNWGLCREATECONTEXTATTRIBSARBPROC wglCreateContextAttribsARB = (PFNWGLCREATECONTEXTATTRIBSARBPROC)wglGetProcAddress("wglCreateContextAttribsARB");
if (!wglCreateContextAttribsARB) {
fprintf(stderr, "Failed to init wglCreateContextAttribsARB function pointer\n");
- return false;
+ throw GSDXRecoverableError();
}
HGLRC context30 = wglCreateContextAttribsARB(m_NativeDisplay, NULL, context_attribs);
if (!context30) {
- fprintf(stderr, "Failed to create a 3.x context\n");
- return false;
+ fprintf(stderr, "Failed to create a 3.x context with standard flags\n");
+ // 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();
@@ -103,8 +110,6 @@ bool GSWndWGL::CreateContext(int major, int minor)
m_context = context30;
fprintf(stderr, "3.x GL context successfully created\n");
}
-
- return true;
}
void GSWndWGL::AttachContext()
@@ -141,9 +146,9 @@ bool GSWndWGL::Attach(void* handle, bool managed)
m_NativeWindow = (HWND)handle;
m_managed = managed;
- if (!OpenWGLDisplay()) return false;
+ OpenWGLDisplay();
- if (!CreateContext(3, 3)) return false;
+ CreateContext(3, 3);
AttachContext();
@@ -178,7 +183,7 @@ void GSWndWGL::Detach()
}
-bool GSWndWGL::OpenWGLDisplay()
+void GSWndWGL::OpenWGLDisplay()
{
GLuint PixelFormat; // Holds The Results After Searching For A Match
PIXELFORMATDESCRIPTOR pfd = // pfd Tells Windows How We Want Things To Be
@@ -208,22 +213,20 @@ bool GSWndWGL::OpenWGLDisplay()
if (!m_NativeDisplay)
{
MessageBox(NULL, "(1) Can't Create A GL Device Context.", "ERROR", MB_OK | MB_ICONEXCLAMATION);
- return false;
+ throw GSDXRecoverableError();
}
PixelFormat = ChoosePixelFormat(m_NativeDisplay, &pfd);
if (!PixelFormat)
{
MessageBox(NULL, "(2) Can't Find A Suitable PixelFormat.", "ERROR", MB_OK | MB_ICONEXCLAMATION);
- return false;
+ throw GSDXRecoverableError();
}
if (!SetPixelFormat(m_NativeDisplay, PixelFormat, &pfd))
{
MessageBox(NULL, "(3) Can't Set The PixelFormat.", "ERROR", MB_OK | MB_ICONEXCLAMATION);
- return false;
+ throw GSDXRecoverableError();
}
-
- return true;
}
void GSWndWGL::CloseWGLDisplay()
@@ -296,9 +299,9 @@ bool GSWndWGL::Create(const string& title, int w, int h)
if (m_NativeWindow == NULL) return false;
- if (!OpenWGLDisplay()) return false;
+ OpenWGLDisplay();
- if (!CreateContext(3, 3)) return false;
+ CreateContext(3, 3);
AttachContext();
@@ -31,11 +31,11 @@ class GSWndWGL : public GSWndGL
PFNWGLSWAPINTERVALEXTPROC m_swapinterval;
- bool CreateContext(int major, int minor);
+ void CreateContext(int major, int minor);
void CheckContext();
void CloseWGLDisplay();
- bool OpenWGLDisplay();
+ void OpenWGLDisplay();
static LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);

0 comments on commit 0610690

Please sign in to comment.