all this to make stop work without message passing
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@744 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
parent
55226f7ec4
commit
4923da76d7
|
@ -184,7 +184,7 @@ void Stop() // - Hammertime!
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
PostMessage((HWND)g_pWindowHandle, WM_QUIT, 0, 0);
|
PostMessage((HWND)g_pWindowHandle, WM_QUIT, 0, 0);
|
||||||
#else
|
#else
|
||||||
// TODO(ector) : post message exit
|
PluginVideo::Video_Stop();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
delete g_pThread; //Wait for emuthread to close
|
delete g_pThread; //Wait for emuthread to close
|
||||||
|
|
|
@ -35,7 +35,8 @@ TVideo_Screenshot Video_Screenshot = 0;
|
||||||
TVideo_EnterLoop Video_EnterLoop = 0;
|
TVideo_EnterLoop Video_EnterLoop = 0;
|
||||||
TVideo_AddMessage Video_AddMessage = 0;
|
TVideo_AddMessage Video_AddMessage = 0;
|
||||||
TVideo_DoState Video_DoState = 0;
|
TVideo_DoState Video_DoState = 0;
|
||||||
|
TVideo_Stop Video_Stop = 0;
|
||||||
|
|
||||||
// Library Instance
|
// Library Instance
|
||||||
DynamicLibrary plugin;
|
DynamicLibrary plugin;
|
||||||
|
|
||||||
|
@ -57,6 +58,7 @@ void UnloadPlugin()
|
||||||
Video_UpdateXFB = 0;
|
Video_UpdateXFB = 0;
|
||||||
Video_AddMessage = 0;
|
Video_AddMessage = 0;
|
||||||
Video_DoState = 0;
|
Video_DoState = 0;
|
||||||
|
Video_Stop = 0;
|
||||||
|
|
||||||
plugin.Unload();
|
plugin.Unload();
|
||||||
}
|
}
|
||||||
|
@ -77,6 +79,7 @@ bool LoadPlugin(const char *_Filename)
|
||||||
Video_EnterLoop = reinterpret_cast<TVideo_EnterLoop> (plugin.Get("Video_EnterLoop"));
|
Video_EnterLoop = reinterpret_cast<TVideo_EnterLoop> (plugin.Get("Video_EnterLoop"));
|
||||||
Video_AddMessage = reinterpret_cast<TVideo_AddMessage> (plugin.Get("Video_AddMessage"));
|
Video_AddMessage = reinterpret_cast<TVideo_AddMessage> (plugin.Get("Video_AddMessage"));
|
||||||
Video_DoState = reinterpret_cast<TVideo_DoState> (plugin.Get("Video_DoState"));
|
Video_DoState = reinterpret_cast<TVideo_DoState> (plugin.Get("Video_DoState"));
|
||||||
|
Video_Stop = reinterpret_cast<TVideo_Stop> (plugin.Get("Video_Stop"));
|
||||||
if ((GetDllInfo != 0) &&
|
if ((GetDllInfo != 0) &&
|
||||||
(DllAbout != 0) &&
|
(DllAbout != 0) &&
|
||||||
(DllConfig != 0) &&
|
(DllConfig != 0) &&
|
||||||
|
@ -88,7 +91,8 @@ bool LoadPlugin(const char *_Filename)
|
||||||
(Video_EnterLoop != 0) &&
|
(Video_EnterLoop != 0) &&
|
||||||
(Video_Screenshot != 0) &&
|
(Video_Screenshot != 0) &&
|
||||||
(Video_AddMessage != 0) &&
|
(Video_AddMessage != 0) &&
|
||||||
(Video_DoState != 0) )
|
(Video_DoState != 0) &&
|
||||||
|
(Video_Stop != 0))
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -43,7 +43,8 @@ typedef BOOL (__cdecl* TVideo_Screenshot)(TCHAR*);
|
||||||
typedef void (__cdecl* TVideo_EnterLoop)();
|
typedef void (__cdecl* TVideo_EnterLoop)();
|
||||||
typedef void (__cdecl* TVideo_AddMessage)(const char* pstr, unsigned int milliseconds);
|
typedef void (__cdecl* TVideo_AddMessage)(const char* pstr, unsigned int milliseconds);
|
||||||
typedef void (__cdecl* TVideo_DoState)(unsigned char **ptr, int mode);
|
typedef void (__cdecl* TVideo_DoState)(unsigned char **ptr, int mode);
|
||||||
|
typedef void (__cdecl* TVideo_Stop)();
|
||||||
|
|
||||||
// Function Pointers
|
// Function Pointers
|
||||||
extern TGetDllInfo GetDllInfo;
|
extern TGetDllInfo GetDllInfo;
|
||||||
extern TDllAbout DllAbout;
|
extern TDllAbout DllAbout;
|
||||||
|
@ -57,6 +58,7 @@ extern TVideo_Screenshot Video_Screenshot;
|
||||||
extern TVideo_EnterLoop Video_EnterLoop;
|
extern TVideo_EnterLoop Video_EnterLoop;
|
||||||
extern TVideo_AddMessage Video_AddMessage;
|
extern TVideo_AddMessage Video_AddMessage;
|
||||||
extern TVideo_DoState Video_DoState;
|
extern TVideo_DoState Video_DoState;
|
||||||
|
extern TVideo_Stop Video_Stop;
|
||||||
|
|
||||||
} // end of namespace PluginVideo
|
} // end of namespace PluginVideo
|
||||||
|
|
||||||
|
|
|
@ -29,6 +29,8 @@ extern u32 g_pVideoData;
|
||||||
FifoReader fifo;
|
FifoReader fifo;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
bool fifoStateRun = true;
|
||||||
|
|
||||||
// STATE_TO_SAVE
|
// STATE_TO_SAVE
|
||||||
static u8 *videoBuffer;
|
static u8 *videoBuffer;
|
||||||
static int size = 0;
|
static int size = 0;
|
||||||
|
@ -46,11 +48,17 @@ void Fifo_Init()
|
||||||
#ifndef DATAREADER_INLINE
|
#ifndef DATAREADER_INLINE
|
||||||
fifo.Init(videoBuffer, videoBuffer); //zero length. there is no data yet.
|
fifo.Init(videoBuffer, videoBuffer); //zero length. there is no data yet.
|
||||||
#endif
|
#endif
|
||||||
|
fifoStateRun = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Fifo_Shutdown()
|
void Fifo_Shutdown()
|
||||||
{
|
{
|
||||||
FreeMemoryPages(videoBuffer, FIFO_SIZE);
|
FreeMemoryPages(videoBuffer, FIFO_SIZE);
|
||||||
|
fifoStateRun = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Fifo_Stop() {
|
||||||
|
fifoStateRun = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
u32 FAKE_GetFifoStartPtr()
|
u32 FAKE_GetFifoStartPtr()
|
||||||
|
@ -161,7 +169,7 @@ void Fifo_EnterLoop(const SVideoInitialize &video_initialize)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// TODO(ector): Don't peek so often!
|
// TODO(ector): Don't peek so often!
|
||||||
while (video_initialize.pPeekMessages())
|
while (fifoStateRun || video_initialize.pPeekMessages())
|
||||||
{
|
{
|
||||||
#if defined(THREAD_VIDEO_WAKEUP_ONIDLE) && defined(_WIN32)
|
#if defined(THREAD_VIDEO_WAKEUP_ONIDLE) && defined(_WIN32)
|
||||||
if (MsgWaitForMultipleObjects(1, &hEventOnIdle, FALSE, 1L, QS_ALLEVENTS) == WAIT_ABANDONED)
|
if (MsgWaitForMultipleObjects(1, &hEventOnIdle, FALSE, 1L, QS_ALLEVENTS) == WAIT_ABANDONED)
|
||||||
|
|
|
@ -71,6 +71,7 @@ void Fifo_Init();
|
||||||
void Fifo_Shutdown();
|
void Fifo_Shutdown();
|
||||||
void Fifo_EnterLoop(const SVideoInitialize &video_initialize);
|
void Fifo_EnterLoop(const SVideoInitialize &video_initialize);
|
||||||
void Fifo_DoState(PointerWrap &f);
|
void Fifo_DoState(PointerWrap &f);
|
||||||
|
void Fifo_Stop();
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -182,5 +182,13 @@ EXPORT void CALL Video_AddMessage(const char* pstr, unsigned int milliseconds);
|
||||||
//
|
//
|
||||||
EXPORT void CALL Video_DoState(unsigned char **ptr, int mode);
|
EXPORT void CALL Video_DoState(unsigned char **ptr, int mode);
|
||||||
|
|
||||||
|
// __________________________________________________________________________________________________
|
||||||
|
// Function: Video_Stop
|
||||||
|
// Purpose: Stop the video plugin before shutdown
|
||||||
|
// input/output:
|
||||||
|
// input:
|
||||||
|
//
|
||||||
|
EXPORT void CALL Video_Stop();
|
||||||
|
|
||||||
#include "ExportEpilog.h"
|
#include "ExportEpilog.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -192,6 +192,7 @@ void Video_DoState(unsigned char **ptr, int mode) {
|
||||||
//PanicAlert("Saving/Loading state from DirectX9");
|
//PanicAlert("Saving/Loading state from DirectX9");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Video_EnterLoop()
|
void Video_EnterLoop()
|
||||||
{
|
{
|
||||||
Fifo_EnterLoop(g_VideoInitialize);
|
Fifo_EnterLoop(g_VideoInitialize);
|
||||||
|
@ -219,6 +220,10 @@ void Video_Shutdown(void)
|
||||||
DeInit();
|
DeInit();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Video_Stop(void)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
void Video_UpdateXFB(u8* /*_pXFB*/, u32 /*_dwWidth*/, u32 /*_dwHeight*/)
|
void Video_UpdateXFB(u8* /*_pXFB*/, u32 /*_dwWidth*/, u32 /*_dwHeight*/)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -76,10 +76,10 @@ void OpenGL_SetWindowText(const char *text)
|
||||||
BOOL Callback_PeekMessages()
|
BOOL Callback_PeekMessages()
|
||||||
{
|
{
|
||||||
#if USE_SDL
|
#if USE_SDL
|
||||||
// TODO: There is no documentation of this function and the calling code
|
// TODO: There is no documentation of this function and the calling code
|
||||||
// ignores the return value, so I have no idea what would be the
|
// ignores the return value, so I have no idea what would be the
|
||||||
// proper value to return.
|
// proper value to return.
|
||||||
return TRUE;
|
return FALSE;
|
||||||
#elif defined(_WIN32)
|
#elif defined(_WIN32)
|
||||||
//TODO: peekmessage
|
//TODO: peekmessage
|
||||||
MSG msg;
|
MSG msg;
|
||||||
|
@ -94,7 +94,7 @@ BOOL Callback_PeekMessages()
|
||||||
#else // GLX
|
#else // GLX
|
||||||
// This is called from Outside of our video thread, from EmuThread
|
// This is called from Outside of our video thread, from EmuThread
|
||||||
// The calls are NOT thread safe, so it breaks everything
|
// The calls are NOT thread safe, so it breaks everything
|
||||||
return TRUE;
|
return FALSE;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -427,8 +427,8 @@ bool OpenGL_Create(SVideoInitialize &_VideoInitialize, int _iwidth, int _iheight
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool OpenGL_MakeCurrent()
|
bool OpenGL_MakeCurrent()
|
||||||
{
|
{
|
||||||
#if USE_SDL
|
#if USE_SDL
|
||||||
// Note: The reason for having the call to SDL_SetVideoMode in here instead
|
// Note: The reason for having the call to SDL_SetVideoMode in here instead
|
||||||
// of in OpenGL_Create() is that "make current" is part of the video
|
// of in OpenGL_Create() is that "make current" is part of the video
|
||||||
|
@ -504,70 +504,70 @@ void OpenGL_Update()
|
||||||
nBackbufferWidth = width;
|
nBackbufferWidth = width;
|
||||||
nBackbufferHeight = height;
|
nBackbufferHeight = height;
|
||||||
|
|
||||||
#else // GLX
|
#else // GLX
|
||||||
// We just check all of our events here
|
// We just check all of our events here
|
||||||
XEvent event;
|
XEvent event;
|
||||||
KeySym key;
|
KeySym key;
|
||||||
static bool ShiftPressed = false;
|
static bool ShiftPressed = false;
|
||||||
static bool ControlPressed = false;
|
static bool ControlPressed = false;
|
||||||
static int FKeyPressed = -1;
|
static int FKeyPressed = -1;
|
||||||
int num_events;
|
int num_events;
|
||||||
for (num_events = XPending(GLWin.dpy);num_events > 0;num_events--) {
|
for (num_events = XPending(GLWin.dpy);num_events > 0;num_events--) {
|
||||||
XNextEvent(GLWin.dpy, &event);
|
XNextEvent(GLWin.dpy, &event);
|
||||||
switch(event.type) {
|
switch(event.type) {
|
||||||
case KeyRelease:
|
case KeyRelease:
|
||||||
key = XLookupKeysym((XKeyEvent*)&event, 0);
|
key = XLookupKeysym((XKeyEvent*)&event, 0);
|
||||||
if(key >= XK_F1 && key <= XK_F9) {
|
if(key >= XK_F1 && key <= XK_F9) {
|
||||||
g_VideoInitialize.pKeyPress(FKeyPressed, ShiftPressed, ControlPressed);
|
g_VideoInitialize.pKeyPress(FKeyPressed, ShiftPressed, ControlPressed);
|
||||||
FKeyPressed = -1;
|
FKeyPressed = -1;
|
||||||
} else {
|
} else {
|
||||||
if(key == XK_Shift_L || key == XK_Shift_R)
|
if(key == XK_Shift_L || key == XK_Shift_R)
|
||||||
ShiftPressed = false;
|
ShiftPressed = false;
|
||||||
else if(key == XK_Control_L || key == XK_Control_R)
|
else if(key == XK_Control_L || key == XK_Control_R)
|
||||||
ControlPressed = false;
|
ControlPressed = false;
|
||||||
else
|
else
|
||||||
XPutBackEvent(GLWin.dpy, &event);
|
XPutBackEvent(GLWin.dpy, &event);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case KeyPress:
|
case KeyPress:
|
||||||
key = XLookupKeysym((XKeyEvent*)&event, 0);
|
key = XLookupKeysym((XKeyEvent*)&event, 0);
|
||||||
if(key >= XK_F1 && key <= XK_F9)
|
if(key >= XK_F1 && key <= XK_F9)
|
||||||
FKeyPressed = key - 0xff4e;
|
FKeyPressed = key - 0xff4e;
|
||||||
else {
|
else {
|
||||||
if(key == XK_Shift_L || key == XK_Shift_R)
|
if(key == XK_Shift_L || key == XK_Shift_R)
|
||||||
ShiftPressed = true;
|
ShiftPressed = true;
|
||||||
else if(key == XK_Control_L || key == XK_Control_R)
|
else if(key == XK_Control_L || key == XK_Control_R)
|
||||||
ControlPressed = true;
|
ControlPressed = true;
|
||||||
else
|
else
|
||||||
XPutBackEvent(GLWin.dpy, &event);
|
XPutBackEvent(GLWin.dpy, &event);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case ButtonPress:
|
case ButtonPress:
|
||||||
case ButtonRelease:
|
case ButtonRelease:
|
||||||
XPutBackEvent(GLWin.dpy, &event);
|
XPutBackEvent(GLWin.dpy, &event);
|
||||||
break;
|
break;
|
||||||
case ConfigureNotify:
|
case ConfigureNotify:
|
||||||
Window winDummy;
|
Window winDummy;
|
||||||
unsigned int borderDummy;
|
unsigned int borderDummy;
|
||||||
XGetGeometry(GLWin.dpy, GLWin.win, &winDummy, &GLWin.x, &GLWin.y,
|
XGetGeometry(GLWin.dpy, GLWin.win, &winDummy, &GLWin.x, &GLWin.y,
|
||||||
&GLWin.width, &GLWin.height, &borderDummy, &GLWin.depth);
|
&GLWin.width, &GLWin.height, &borderDummy, &GLWin.depth);
|
||||||
nBackbufferWidth = GLWin.width;
|
nBackbufferWidth = GLWin.width;
|
||||||
nBackbufferHeight = GLWin.height;
|
nBackbufferHeight = GLWin.height;
|
||||||
break;
|
break;
|
||||||
case ClientMessage: //TODO: We aren't reading this correctly, It could be anything, highest change is that it's a close event though
|
case ClientMessage: //TODO: We aren't reading this correctly, It could be anything, highest change is that it's a close event though
|
||||||
Video_Shutdown(); // Calling from here since returning false does nothing
|
Video_Shutdown(); // Calling from here since returning false does nothing
|
||||||
return;
|
return;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
//TODO: Should we put the event back if we don't handle it?
|
//TODO: Should we put the event back if we don't handle it?
|
||||||
// I think we handle all the needed ones, the rest shouldn't matter
|
// I think we handle all the needed ones, the rest shouldn't matter
|
||||||
// But to be safe, let's but them back anyway
|
// But to be safe, let's but them back anyway
|
||||||
//XPutBackEvent(GLWin.dpy, &event);
|
//XPutBackEvent(GLWin.dpy, &event);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
float FactorW = 640.0f / (float)nBackbufferWidth;
|
float FactorW = 640.0f / (float)nBackbufferWidth;
|
||||||
float FactorH = 480.0f / (float)nBackbufferHeight;
|
float FactorH = 480.0f / (float)nBackbufferHeight;
|
||||||
|
|
|
@ -218,9 +218,13 @@ void Video_Shutdown(void)
|
||||||
TextureMngr::Shutdown();
|
TextureMngr::Shutdown();
|
||||||
OpcodeDecoder_Shutdown();
|
OpcodeDecoder_Shutdown();
|
||||||
Renderer::Shutdown();
|
Renderer::Shutdown();
|
||||||
OpenGL_Shutdown();
|
OpenGL_Shutdown();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Video_Stop(void)
|
||||||
|
{
|
||||||
|
Fifo_Stop();
|
||||||
|
}
|
||||||
|
|
||||||
void Video_EnterLoop()
|
void Video_EnterLoop()
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue