From d4804208f37e787ec880306aaf04d540a501eb5c Mon Sep 17 00:00:00 2001 From: arcum42 Date: Wed, 24 Dec 2008 11:55:51 +0000 Subject: [PATCH] Add Zeydlitz's OGL patch to ZeroGS, plus the fix from issue 4. git-svn-id: http://pcsx2-playground.googlecode.com/svn/trunk@486 a6443dda-0b58-4228-96e9-037be469359c --- plugins/zerogs/opengl/GS.h | 3 ++ plugins/zerogs/opengl/GSmain.cpp | 68 ++++++++++++----------- plugins/zerogs/opengl/Linux/Linux.cpp | 78 +++++++++++++-------------- plugins/zerogs/opengl/targets.cpp | 41 +++++++------- plugins/zerogs/opengl/zerogs.cpp | 5 +- 5 files changed, 99 insertions(+), 96 deletions(-) diff --git a/plugins/zerogs/opengl/GS.h b/plugins/zerogs/opengl/GS.h index 428d0683c2..39ada87aaa 100644 --- a/plugins/zerogs/opengl/GS.h +++ b/plugins/zerogs/opengl/GS.h @@ -49,6 +49,9 @@ extern HWND GShwnd; #include #include +extern u32 THR_KeyEvent; // value for passing out key events beetwen threads +extern bool THR_bShift; + #define __inline inline #if !defined(_MSC_VER) && !defined(HAVE_ALIGNED_MALLOC) diff --git a/plugins/zerogs/opengl/GSmain.cpp b/plugins/zerogs/opengl/GSmain.cpp index c740e340fc..7ec1a6c9e1 100644 --- a/plugins/zerogs/opengl/GSmain.cpp +++ b/plugins/zerogs/opengl/GSmain.cpp @@ -123,6 +123,8 @@ void SysMessage(char *fmt, ...) { #else GLWindow GLWin; +u32 THR_KeyEvent = 0; // Value for key event processing between threads +bool THR_bShift = false; #endif @@ -251,7 +253,7 @@ void CALLBACK GSreset() { gs.q = 1; } -void CALLBACK GSgifSoftReset(int mask) +void CALLBACK GSgifSoftReset(u32 mask) { if( mask & 1 ) memset(&gs.path1, 0, sizeof(gs.path1)); if( mask & 2 ) memset(&gs.path2, 0, sizeof(gs.path2)); @@ -644,41 +646,36 @@ s32 CALLBACK GSopen(void *pDsp, char *Title, int multithread) void ProcessMessages() { - XEvent event; -// KeySym key; -// vector keyevents; + + XEvent event; + // check resizing + while(XCheckTypedEvent(GLWin.dpy, ConfigureNotify, &event)) { + if ((event.xconfigure.width != GLWin.width) || (event.xconfigure.height != GLWin.height)) { + ZeroGS::ChangeWindowSize(event.xconfigure.width, event.xconfigure.height); + GLWin.width = event.xconfigure.width; + GLWin.height = event.xconfigure.height; + } + } - // check resizing - while(XCheckTypedEvent(GLWin.dpy, ConfigureNotify, &event)) { - if ((event.xconfigure.width != GLWin.width) || (event.xconfigure.height != GLWin.height)) { - ZeroGS::ChangeWindowSize(event.xconfigure.width, event.xconfigure.height); - GLWin.width = event.xconfigure.width; - GLWin.height = event.xconfigure.height; - } - } - -// while (XPending(GLWin.dpy) > 0) { -// XNextEvent(GLWin.dpy, &event); -// keyevents.push_back(event); -// -// switch (event.type) { -// case ConfigureNotify: -// if ((event.xconfigure.width != GLWin.width) || -// (event.xconfigure.height != GLWin.height)) -// { -// ZeroGS::ChangeWindowSize(event.xconfigure.width, event.xconfigure.height); -// GLWin.width = event.xconfigure.width; -// GLWin.height = event.xconfigure.height; -// } -// break; -// default: -// break; -// } -// } -// -// // push back all the key events for the PAD plugins, etc -// for(vector::iterator it = keyevents.begin(); it != keyevents.end(); ++it) -// XPutBackEvent(GLWin.dpy, &(*it)); + if ( THR_KeyEvent ) { // This values was passed from GSKeyEvents witch could be in another thread + int my_KeyEvent = THR_KeyEvent; + bool my_bShift = THR_bShift; + THR_KeyEvent = 0; + switch ( my_KeyEvent ) { + case XK_F5: + OnKeyboardF5(my_bShift); + break; + case XK_F6: + OnKeyboardF6(my_bShift); + break; + case XK_F7: + OnKeyboardF7(my_bShift); + break; + case XK_F9: + OnKeyboardF9(my_bShift); + break; + } + } } #endif // linux @@ -1067,6 +1064,7 @@ void _GSgifTransfer(pathInfo *path, u32 *pMem, u32 size) break; } case 3: // GIF_IMAGE (FROM_VFRAM) + case 4: // Used in the DirectX version, so we'll use it here too. { if(gs.imageTransfer >= 0 && gs.imageTransfer <= 1) { diff --git a/plugins/zerogs/opengl/Linux/Linux.cpp b/plugins/zerogs/opengl/Linux/Linux.cpp index a9d3b7b201..a117862c05 100644 --- a/plugins/zerogs/opengl/Linux/Linux.cpp +++ b/plugins/zerogs/opengl/Linux/Linux.cpp @@ -49,48 +49,44 @@ extern void OnKeyboardF9(int); void CALLBACK GSkeyEvent(keyEvent *ev) { - static bool bShift = false; - static bool bAlt = false; + //static bool bShift = false; + static bool bAlt = false; - switch(ev->event) { - case KEYPRESS: - switch(ev->key) { - case XK_F5: - OnKeyboardF5(bShift); - break; - case XK_F6: - OnKeyboardF6(bShift); - break; - case XK_F7: - OnKeyboardF7(bShift); - break; - case XK_F9: - OnKeyboardF9(bShift); - break; - case XK_Escape: - break; - case XK_Shift_L: - case XK_Shift_R: - bShift = true; - break; - case XK_Alt_L: - case XK_Alt_R: - bAlt = true; - break; - } - break; - case KEYRELEASE: - switch(ev->key) { - case XK_Shift_L: - case XK_Shift_R: - bShift = false; - break; - case XK_Alt_L: - case XK_Alt_R: - bAlt = false; - break; - } - } + switch(ev->event) { + case KEYPRESS: + switch(ev->key) { + case XK_F5: + case XK_F6: + case XK_F7: + case XK_F9: + THR_KeyEvent = ev->key ; + break; + case XK_Escape: + break; + case XK_Shift_L: + case XK_Shift_R: + //bShift = true; + THR_bShift = true; + break; + case XK_Alt_L: + case XK_Alt_R: + bAlt = true; + break; + } + break; + case KEYRELEASE: + switch(ev->key) { + case XK_Shift_L: + case XK_Shift_R: + //bShift = false; + THR_bShift = false; + break; + case XK_Alt_L: + case XK_Alt_R: + bAlt = false; + break; + } + } } GtkWidget *Conf; diff --git a/plugins/zerogs/opengl/targets.cpp b/plugins/zerogs/opengl/targets.cpp index 8d9e7b9de2..66868e9674 100644 --- a/plugins/zerogs/opengl/targets.cpp +++ b/plugins/zerogs/opengl/targets.cpp @@ -828,27 +828,30 @@ bool ZeroGS::CDepthTarget::Create(const frameInfo& frame) void ZeroGS::CDepthTarget::Destroy() { - ResetRenderTarget(1); - glFramebufferRenderbufferEXT( GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, 0 ); - glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, 0 ); - GL_REPORT_ERRORD(); - - CRenderTarget::Destroy(); - - if( pstencil != 0 ) { - - if( pstencil != pdepth ) - glDeleteRenderbuffersEXT( 1, &pstencil ); - pstencil = 0; - } - if( pdepth != 0 ) { - glDeleteRenderbuffersEXT( 1, &pdepth ); - pdepth = 0; - } - - GL_REPORT_ERRORD(); + if ( status ) { // In this case Framebuffer extension is off-use and lead to segfault + ResetRenderTarget(1); + glFramebufferRenderbufferEXT( GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, 0 ); + glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, 0 ); + GL_REPORT_ERRORD(); + + if( pstencil != 0 ) { + if( pstencil != pdepth ) + glDeleteRenderbuffersEXT( 1, &pstencil ); + pstencil = 0; + } + + if( pdepth != 0 ) { + glDeleteRenderbuffersEXT( 1, &pdepth ); + pdepth = 0; + } + GL_REPORT_ERRORD(); + } + + CRenderTarget::Destroy(); + } + extern int g_nDepthUsed; // > 0 if depth is used void ZeroGS::CDepthTarget::Resolve() diff --git a/plugins/zerogs/opengl/zerogs.cpp b/plugins/zerogs/opengl/zerogs.cpp index 51f51028a8..1f02849d53 100644 --- a/plugins/zerogs/opengl/zerogs.cpp +++ b/plugins/zerogs/opengl/zerogs.cpp @@ -4863,7 +4863,10 @@ void ZeroGS::SetTexVariablesInt(int context, int bilinear, const tex0Info& tex0, v.y = (float)fh; v.z = 1.0f / (float)fw; v.w = 1.0f / (float)fh; - cgGLSetParameter4fv(pfragment->fRealTexDims, v); + if (pfragment->fRealTexDims) + cgGLSetParameter4fv(pfragment->fRealTexDims, v); + else + cgGLSetParameter4fv(cgGetNamedParameter(pfragment->prog,"g_fRealTexDims"),v); } if( m_Blocks[tex0.psm].bpp == 0 ) {