mirror of https://github.com/PCSX2/pcsx2.git
gsdx wgl: retry to create a context without advance flag
Hopefully it will support more drivers #1813
This commit is contained in:
parent
213fa1c148
commit
de962d3e7e
|
@ -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();
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue