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
This commit is contained in:
arcum42 2008-12-24 11:55:51 +00:00 committed by Gregory Hainaut
parent 661c529443
commit d4804208f3
5 changed files with 99 additions and 96 deletions

View File

@ -49,6 +49,9 @@ extern HWND GShwnd;
#include <sys/stat.h> #include <sys/stat.h>
#include <sys/types.h> #include <sys/types.h>
extern u32 THR_KeyEvent; // value for passing out key events beetwen threads
extern bool THR_bShift;
#define __inline inline #define __inline inline
#if !defined(_MSC_VER) && !defined(HAVE_ALIGNED_MALLOC) #if !defined(_MSC_VER) && !defined(HAVE_ALIGNED_MALLOC)

View File

@ -123,6 +123,8 @@ void SysMessage(char *fmt, ...) {
#else #else
GLWindow GLWin; GLWindow GLWin;
u32 THR_KeyEvent = 0; // Value for key event processing between threads
bool THR_bShift = false;
#endif #endif
@ -251,7 +253,7 @@ void CALLBACK GSreset() {
gs.q = 1; 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 & 1 ) memset(&gs.path1, 0, sizeof(gs.path1));
if( mask & 2 ) memset(&gs.path2, 0, sizeof(gs.path2)); 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() void ProcessMessages()
{ {
XEvent event;
// KeySym key; XEvent event;
// vector<XEvent> keyevents; // 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 if ( THR_KeyEvent ) { // This values was passed from GSKeyEvents witch could be in another thread
while(XCheckTypedEvent(GLWin.dpy, ConfigureNotify, &event)) { int my_KeyEvent = THR_KeyEvent;
if ((event.xconfigure.width != GLWin.width) || (event.xconfigure.height != GLWin.height)) { bool my_bShift = THR_bShift;
ZeroGS::ChangeWindowSize(event.xconfigure.width, event.xconfigure.height); THR_KeyEvent = 0;
GLWin.width = event.xconfigure.width; switch ( my_KeyEvent ) {
GLWin.height = event.xconfigure.height; case XK_F5:
} OnKeyboardF5(my_bShift);
} break;
case XK_F6:
// while (XPending(GLWin.dpy) > 0) { OnKeyboardF6(my_bShift);
// XNextEvent(GLWin.dpy, &event); break;
// keyevents.push_back(event); case XK_F7:
// OnKeyboardF7(my_bShift);
// switch (event.type) { break;
// case ConfigureNotify: case XK_F9:
// if ((event.xconfigure.width != GLWin.width) || OnKeyboardF9(my_bShift);
// (event.xconfigure.height != GLWin.height)) break;
// { }
// 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<XEvent>::iterator it = keyevents.begin(); it != keyevents.end(); ++it)
// XPutBackEvent(GLWin.dpy, &(*it));
} }
#endif // linux #endif // linux
@ -1067,6 +1064,7 @@ void _GSgifTransfer(pathInfo *path, u32 *pMem, u32 size)
break; break;
} }
case 3: // GIF_IMAGE (FROM_VFRAM) 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) if(gs.imageTransfer >= 0 && gs.imageTransfer <= 1)
{ {

View File

@ -49,48 +49,44 @@ extern void OnKeyboardF9(int);
void CALLBACK GSkeyEvent(keyEvent *ev) void CALLBACK GSkeyEvent(keyEvent *ev)
{ {
static bool bShift = false; //static bool bShift = false;
static bool bAlt = false; static bool bAlt = false;
switch(ev->event) { switch(ev->event) {
case KEYPRESS: case KEYPRESS:
switch(ev->key) { switch(ev->key) {
case XK_F5: case XK_F5:
OnKeyboardF5(bShift); case XK_F6:
break; case XK_F7:
case XK_F6: case XK_F9:
OnKeyboardF6(bShift); THR_KeyEvent = ev->key ;
break; break;
case XK_F7: case XK_Escape:
OnKeyboardF7(bShift); break;
break; case XK_Shift_L:
case XK_F9: case XK_Shift_R:
OnKeyboardF9(bShift); //bShift = true;
break; THR_bShift = true;
case XK_Escape: break;
break; case XK_Alt_L:
case XK_Shift_L: case XK_Alt_R:
case XK_Shift_R: bAlt = true;
bShift = true; break;
break; }
case XK_Alt_L: break;
case XK_Alt_R: case KEYRELEASE:
bAlt = true; switch(ev->key) {
break; case XK_Shift_L:
} case XK_Shift_R:
break; //bShift = false;
case KEYRELEASE: THR_bShift = false;
switch(ev->key) { break;
case XK_Shift_L: case XK_Alt_L:
case XK_Shift_R: case XK_Alt_R:
bShift = false; bAlt = false;
break; break;
case XK_Alt_L: }
case XK_Alt_R: }
bAlt = false;
break;
}
}
} }
GtkWidget *Conf; GtkWidget *Conf;

View File

@ -828,27 +828,30 @@ bool ZeroGS::CDepthTarget::Create(const frameInfo& frame)
void ZeroGS::CDepthTarget::Destroy() void ZeroGS::CDepthTarget::Destroy()
{ {
ResetRenderTarget(1); if ( status ) { // In this case Framebuffer extension is off-use and lead to segfault
glFramebufferRenderbufferEXT( GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, 0 ); ResetRenderTarget(1);
glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, 0 ); glFramebufferRenderbufferEXT( GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, 0 );
GL_REPORT_ERRORD(); glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, 0 );
GL_REPORT_ERRORD();
CRenderTarget::Destroy();
if( pstencil != 0 ) {
if( pstencil != 0 ) { if( pstencil != pdepth )
glDeleteRenderbuffersEXT( 1, &pstencil );
if( pstencil != pdepth ) pstencil = 0;
glDeleteRenderbuffersEXT( 1, &pstencil ); }
pstencil = 0;
} if( pdepth != 0 ) {
if( pdepth != 0 ) { glDeleteRenderbuffersEXT( 1, &pdepth );
glDeleteRenderbuffersEXT( 1, &pdepth ); pdepth = 0;
pdepth = 0; }
} GL_REPORT_ERRORD();
}
GL_REPORT_ERRORD();
CRenderTarget::Destroy();
} }
extern int g_nDepthUsed; // > 0 if depth is used extern int g_nDepthUsed; // > 0 if depth is used
void ZeroGS::CDepthTarget::Resolve() void ZeroGS::CDepthTarget::Resolve()

View File

@ -4863,7 +4863,10 @@ void ZeroGS::SetTexVariablesInt(int context, int bilinear, const tex0Info& tex0,
v.y = (float)fh; v.y = (float)fh;
v.z = 1.0f / (float)fw; v.z = 1.0f / (float)fw;
v.w = 1.0f / (float)fh; 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 ) { if( m_Blocks[tex0.psm].bpp == 0 ) {