2008-09-04 00:30:13 -04:00
# ifndef __LINUX__ //Change me...
# include <windows.h>
# include <commctrl.h>
# include <process.h>
2008-09-03 19:31:53 -04:00
# else
2008-09-04 00:30:13 -04:00
# include <string.h>
# include "../main/winlnxdefs.h"
2008-09-03 19:31:53 -04:00
# endif
2008-09-07 18:32:06 -04:00
# ifdef QT4_GUI
# include <QMessageBox>
# endif
2008-09-04 00:30:13 -04:00
# include <SDL_opengl.h>
2008-03-15 10:33:00 -04:00
# include "glN64.h"
# include "Debug.h"
# include "Zilmar GFX 1.3.h"
# include "OpenGL.h"
# include "N64.h"
# include "RSP.h"
# include "RDP.h"
# include "VI.h"
# include "Config.h"
# include "Textures.h"
# include "Combiner.h"
2008-04-14 07:29:15 -04:00
# ifndef __LINUX__
2008-04-06 10:55:37 -04:00
HWND hWnd ;
HWND hStatusBar ;
2008-04-14 07:29:15 -04:00
//HWND hFullscreen;
2008-04-06 10:55:37 -04:00
HWND hToolBar ;
HINSTANCE hInstance ;
2008-04-14 07:29:15 -04:00
# endif // !__LINUX__
2008-03-15 10:33:00 -04:00
2008-04-06 10:55:37 -04:00
char pluginName [ ] = " glN64 v0.4.1 " ;
char * screenDirectory ;
2008-12-06 08:19:31 -05:00
u32 last_good_ucode = 0 ;
2008-03-15 10:33:00 -04:00
void ( * CheckInterrupts ) ( void ) ;
2008-04-06 10:55:37 -04:00
char configdir [ PATH_MAX ] = { 0 } ;
2008-05-16 00:46:48 -04:00
void ( * renderCallback ) ( ) = NULL ;
2008-03-15 10:33:00 -04:00
2008-04-14 07:29:15 -04:00
# ifndef __LINUX__
2008-04-06 10:55:37 -04:00
LONG windowedStyle ;
LONG windowedExStyle ;
RECT windowedRect ;
HMENU windowedMenu ;
2008-03-15 10:33:00 -04:00
BOOL WINAPI DllMain ( HINSTANCE hinstDLL , DWORD dwReason , LPVOID lpvReserved )
{
2008-04-06 10:55:37 -04:00
hInstance = hinstDLL ;
if ( dwReason = = DLL_PROCESS_ATTACH )
{
Config_LoadConfig ( ) ;
RSP . thread = NULL ;
OGL . hRC = NULL ;
OGL . hDC = NULL ;
/* OGL.hPbufferRC = NULL;
OGL . hPbufferDC = NULL ;
OGL . hPbuffer = NULL ; */
// hFullscreen = NULL;
}
return TRUE ;
2008-03-15 10:33:00 -04:00
}
# else
void
_init ( void )
{
2008-04-06 10:55:37 -04:00
Config_LoadConfig ( ) ;
OGL . hScreen = NULL ;
2008-03-15 10:33:00 -04:00
# ifdef RSPTHREAD
2008-04-06 10:55:37 -04:00
RSP . thread = NULL ;
2008-03-15 10:33:00 -04:00
# endif
}
# endif // !__LINUX__
EXPORT void CALL CaptureScreen ( char * Directory )
{
2008-04-06 10:55:37 -04:00
screenDirectory = Directory ;
2008-03-15 10:33:00 -04:00
# ifdef RSPTHREAD
2008-04-06 10:55:37 -04:00
if ( RSP . thread )
{
SetEvent ( RSP . threadMsg [ RSPMSG_CAPTURESCREEN ] ) ;
WaitForSingleObject ( RSP . threadFinished , INFINITE ) ;
}
2008-03-15 10:33:00 -04:00
# else
2008-04-06 10:55:37 -04:00
OGL_SaveScreenshot ( ) ;
2008-03-15 10:33:00 -04:00
# endif
}
EXPORT void CALL ChangeWindow ( void )
{
# ifdef RSPTHREAD
2008-04-06 10:55:37 -04:00
// Textures seem to get corrupted when changing video modes (at least on my Radeon), so destroy them
SetEvent ( RSP . threadMsg [ RSPMSG_DESTROYTEXTURES ] ) ;
WaitForSingleObject ( RSP . threadFinished , INFINITE ) ;
2008-03-15 10:33:00 -04:00
2008-04-06 10:55:37 -04:00
if ( ! OGL . fullscreen )
{
DEVMODE fullscreenMode ;
memset ( & fullscreenMode , 0 , sizeof ( DEVMODE ) ) ;
fullscreenMode . dmSize = sizeof ( DEVMODE ) ;
fullscreenMode . dmPelsWidth = OGL . fullscreenWidth ;
fullscreenMode . dmPelsHeight = OGL . fullscreenHeight ;
fullscreenMode . dmBitsPerPel = OGL . fullscreenBits ;
fullscreenMode . dmDisplayFrequency = OGL . fullscreenRefresh ;
fullscreenMode . dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT | DM_DISPLAYFREQUENCY ;
2008-03-15 10:33:00 -04:00
2008-04-06 10:55:37 -04:00
if ( ChangeDisplaySettings ( & fullscreenMode , CDS_FULLSCREEN ) ! = DISP_CHANGE_SUCCESSFUL )
{
MessageBox ( NULL , " Failed to change display mode " , pluginName , MB_ICONERROR | MB_OK ) ;
return ;
}
2008-03-15 10:33:00 -04:00
2008-04-06 10:55:37 -04:00
ShowCursor ( FALSE ) ;
2008-03-15 10:33:00 -04:00
2008-04-06 10:55:37 -04:00
windowedMenu = GetMenu ( hWnd ) ;
2008-03-15 10:33:00 -04:00
2008-04-06 10:55:37 -04:00
if ( windowedMenu )
SetMenu ( hWnd , NULL ) ;
2008-03-15 10:33:00 -04:00
2008-04-06 10:55:37 -04:00
if ( hStatusBar )
ShowWindow ( hStatusBar , SW_HIDE ) ;
2008-03-15 10:33:00 -04:00
2008-04-06 10:55:37 -04:00
windowedExStyle = GetWindowLong ( hWnd , GWL_EXSTYLE ) ;
windowedStyle = GetWindowLong ( hWnd , GWL_STYLE ) ;
2008-03-15 10:33:00 -04:00
2008-04-06 10:55:37 -04:00
SetWindowLong ( hWnd , GWL_EXSTYLE , WS_EX_APPWINDOW | WS_EX_TOPMOST ) ;
SetWindowLong ( hWnd , GWL_STYLE , WS_POPUP ) ;
2008-03-15 10:33:00 -04:00
2008-04-06 10:55:37 -04:00
GetWindowRect ( hWnd , & windowedRect ) ;
2008-03-15 10:33:00 -04:00
2008-04-06 10:55:37 -04:00
OGL . fullscreen = TRUE ;
OGL_ResizeWindow ( ) ;
}
else
{
ChangeDisplaySettings ( NULL , 0 ) ;
2008-03-15 10:33:00 -04:00
2008-04-06 10:55:37 -04:00
ShowCursor ( TRUE ) ;
2008-03-15 10:33:00 -04:00
2008-04-06 10:55:37 -04:00
if ( windowedMenu )
SetMenu ( hWnd , windowedMenu ) ;
2008-03-15 10:33:00 -04:00
2008-04-06 10:55:37 -04:00
if ( hStatusBar )
ShowWindow ( hStatusBar , SW_SHOW ) ;
2008-03-15 10:33:00 -04:00
2008-04-06 10:55:37 -04:00
SetWindowLong ( hWnd , GWL_STYLE , windowedStyle ) ;
SetWindowLong ( hWnd , GWL_EXSTYLE , windowedExStyle ) ;
SetWindowPos ( hWnd , NULL , windowedRect . left , windowedRect . top , 0 , 0 , SWP_NOZORDER | SWP_NOSIZE ) ;
2008-03-15 10:33:00 -04:00
2008-04-06 10:55:37 -04:00
OGL . fullscreen = FALSE ;
OGL_ResizeWindow ( ) ;
}
2008-03-15 10:33:00 -04:00
2008-04-06 10:55:37 -04:00
SetEvent ( RSP . threadMsg [ RSPMSG_INITTEXTURES ] ) ;
WaitForSingleObject ( RSP . threadFinished , INFINITE ) ;
2008-03-15 10:33:00 -04:00
# else // RSPTHREAD
2008-04-14 07:29:15 -04:00
# ifdef __LINUX__
2008-04-06 10:55:37 -04:00
SDL_WM_ToggleFullScreen ( OGL . hScreen ) ;
2008-03-15 10:33:00 -04:00
# endif // __LINUX__
# endif // !RSPTHREAD
}
EXPORT void CALL CloseDLL ( void )
{
}
EXPORT void CALL DllAbout ( HWND hParent )
{
2008-04-14 07:29:15 -04:00
# ifndef __LINUX__
2008-04-06 10:55:37 -04:00
MessageBox ( hParent , " glN64 v0.4 by Orkin \n \n Website: http://gln64.emulation64.com/ \n \n Thanks to Clements, Rice, Gonetz, Malcolm, Dave2001, cryhlove, icepir8, zilmar, Azimer, and StrmnNrmn " , pluginName , MB_OK | MB_ICONINFORMATION ) ;
2008-04-14 07:29:15 -04:00
# else
2008-09-07 18:32:06 -04:00
# ifdef QT4_GUI
QMessageBox : : about ( QWidget : : find ( hParent ) ,
" About glN64 " ,
" glN64 v0.4 by Orkin \n Website: http://gln64.emulation64.com/ \n \n Thanks to Clements, Rice, Gonetz, Malcolm, Dave2001, cryhlove, icepir8, zilmar, Azimer, and StrmnNrmn \n ported by blight \n Qt4 interface by slougi " ) ;
# else
2008-04-06 10:55:37 -04:00
puts ( " glN64 v0.4 by Orkin \n Website: http://gln64.emulation64.com/ \n \n Thanks to Clements, Rice, Gonetz, Malcolm, Dave2001, cryhlove, icepir8, zilmar, Azimer, and StrmnNrmn \n ported by blight " ) ;
2008-09-07 18:32:06 -04:00
# endif // QT4_GUI
2008-03-15 10:33:00 -04:00
# endif
}
EXPORT void CALL DllConfig ( HWND hParent )
{
2008-09-07 18:32:06 -04:00
Config_DoConfig ( hParent ) ;
2008-03-15 10:33:00 -04:00
}
EXPORT void CALL DllTest ( HWND hParent )
{
2008-09-07 18:32:06 -04:00
# ifdef QT4_GUI
QMessageBox : : information ( QWidget : : find ( hParent ) ,
" glN64 Test " ,
" This plugin has nothing to test. " ) ;
# endif
2008-03-15 10:33:00 -04:00
}
EXPORT void CALL DrawScreen ( void )
{
}
EXPORT void CALL GetDllInfo ( PLUGIN_INFO * PluginInfo )
{
2008-04-06 10:55:37 -04:00
PluginInfo - > Version = 0x103 ;
PluginInfo - > Type = PLUGIN_TYPE_GFX ;
strcpy ( PluginInfo - > Name , pluginName ) ;
PluginInfo - > NormalMemory = FALSE ;
PluginInfo - > MemoryBswaped = TRUE ;
2008-03-15 10:33:00 -04:00
}
2008-04-14 07:29:15 -04:00
# ifndef __LINUX__
2008-03-15 10:33:00 -04:00
BOOL CALLBACK FindToolBarProc ( HWND hWnd , LPARAM lParam )
{
2008-04-06 10:55:37 -04:00
if ( GetWindowLong ( hWnd , GWL_STYLE ) & RBS_VARHEIGHT )
{
hToolBar = hWnd ;
return FALSE ;
}
return TRUE ;
2008-03-15 10:33:00 -04:00
}
2008-04-14 07:29:15 -04:00
# endif // !__LINUX__
2008-03-15 10:33:00 -04:00
EXPORT BOOL CALL InitiateGFX ( GFX_INFO Gfx_Info )
{
2008-04-14 07:29:15 -04:00
# ifndef __LINUX__
2008-04-06 10:55:37 -04:00
hWnd = Gfx_Info . hWnd ;
hStatusBar = Gfx_Info . hStatusBar ;
hToolBar = NULL ;
2008-03-15 10:33:00 -04:00
2008-04-06 10:55:37 -04:00
EnumChildWindows ( hWnd , FindToolBarProc , 0 ) ;
2008-04-14 07:29:15 -04:00
# else // !__LINUX__
2008-04-06 10:55:37 -04:00
Config_LoadConfig ( ) ;
OGL . hScreen = NULL ;
2008-03-15 10:33:00 -04:00
# ifdef RSPTHREAD
2008-04-06 10:55:37 -04:00
RSP . thread = NULL ;
2008-03-15 10:33:00 -04:00
# endif
# endif // __LINUX__
2008-04-06 10:55:37 -04:00
DMEM = Gfx_Info . DMEM ;
IMEM = Gfx_Info . IMEM ;
RDRAM = Gfx_Info . RDRAM ;
2008-12-06 08:19:31 -05:00
REG . MI_INTR = ( u32 * ) Gfx_Info . MI_INTR_REG ;
REG . DPC_START = ( u32 * ) Gfx_Info . DPC_START_REG ;
REG . DPC_END = ( u32 * ) Gfx_Info . DPC_END_REG ;
REG . DPC_CURRENT = ( u32 * ) Gfx_Info . DPC_CURRENT_REG ;
REG . DPC_STATUS = ( u32 * ) Gfx_Info . DPC_STATUS_REG ;
REG . DPC_CLOCK = ( u32 * ) Gfx_Info . DPC_CLOCK_REG ;
REG . DPC_BUFBUSY = ( u32 * ) Gfx_Info . DPC_BUFBUSY_REG ;
REG . DPC_PIPEBUSY = ( u32 * ) Gfx_Info . DPC_PIPEBUSY_REG ;
REG . DPC_TMEM = ( u32 * ) Gfx_Info . DPC_TMEM_REG ;
REG . VI_STATUS = ( u32 * ) Gfx_Info . VI_STATUS_REG ;
REG . VI_ORIGIN = ( u32 * ) Gfx_Info . VI_ORIGIN_REG ;
REG . VI_WIDTH = ( u32 * ) Gfx_Info . VI_WIDTH_REG ;
REG . VI_INTR = ( u32 * ) Gfx_Info . VI_INTR_REG ;
REG . VI_V_CURRENT_LINE = ( u32 * ) Gfx_Info . VI_V_CURRENT_LINE_REG ;
REG . VI_TIMING = ( u32 * ) Gfx_Info . VI_TIMING_REG ;
REG . VI_V_SYNC = ( u32 * ) Gfx_Info . VI_V_SYNC_REG ;
REG . VI_H_SYNC = ( u32 * ) Gfx_Info . VI_H_SYNC_REG ;
REG . VI_LEAP = ( u32 * ) Gfx_Info . VI_LEAP_REG ;
REG . VI_H_START = ( u32 * ) Gfx_Info . VI_H_START_REG ;
REG . VI_V_START = ( u32 * ) Gfx_Info . VI_V_START_REG ;
REG . VI_V_BURST = ( u32 * ) Gfx_Info . VI_V_BURST_REG ;
REG . VI_X_SCALE = ( u32 * ) Gfx_Info . VI_X_SCALE_REG ;
REG . VI_Y_SCALE = ( u32 * ) Gfx_Info . VI_Y_SCALE_REG ;
2008-04-06 10:55:37 -04:00
CheckInterrupts = Gfx_Info . CheckInterrupts ;
return TRUE ;
2008-03-15 10:33:00 -04:00
}
EXPORT void CALL MoveScreen ( int xpos , int ypos )
{
}
EXPORT void CALL ProcessDList ( void )
{
# ifdef RSPTHREAD
2008-04-06 10:55:37 -04:00
if ( RSP . thread )
{
SetEvent ( RSP . threadMsg [ RSPMSG_PROCESSDLIST ] ) ;
WaitForSingleObject ( RSP . threadFinished , INFINITE ) ;
}
2008-03-15 10:33:00 -04:00
# else
2008-04-06 10:55:37 -04:00
RSP_ProcessDList ( ) ;
2008-03-15 10:33:00 -04:00
# endif
}
EXPORT void CALL ProcessRDPList ( void )
{
2008-04-06 10:55:37 -04:00
//*REG.DPC_CURRENT = *REG.DPC_START;
/* RSP.PCi = 0;
RSP . PC [ RSP . PCi ] = * REG . DPC_CURRENT ;
RSP . halt = FALSE ;
while ( RSP . PC [ RSP . PCi ] < * REG . DPC_END )
{
RSP . cmd0 = * ( DWORD * ) & RDRAM [ RSP . PC [ RSP . PCi ] ] ;
RSP . cmd1 = * ( DWORD * ) & RDRAM [ RSP . PC [ RSP . PCi ] + 4 ] ;
RSP . PC [ RSP . PCi ] + = 8 ;
2008-03-15 10:33:00 -04:00
*/
2008-04-06 10:55:37 -04:00
/* if ((RSP.cmd0 >> 24) == 0xE9)
{
* REG . MI_INTR | = MI_INTR_DP ;
CheckInterrupts ( ) ;
}
if ( ( RSP . cmd0 > > 24 ) = = 0xCD )
RSP . cmd0 = RSP . cmd0 ;
GFXOp [ RSP . cmd0 > > 24 ] ( ) ; */
//*REG.DPC_CURRENT += 8;
// }
2008-03-15 10:33:00 -04:00
}
EXPORT void CALL RomClosed ( void )
{
# ifdef RSPTHREAD
2008-04-06 10:55:37 -04:00
int i ;
if ( RSP . thread )
{
// if (OGL.fullscreen)
// ChangeWindow();
if ( RSP . busy )
{
RSP . halt = TRUE ;
WaitForSingleObject ( RSP . threadFinished , INFINITE ) ;
}
SetEvent ( RSP . threadMsg [ RSPMSG_CLOSE ] ) ;
WaitForSingleObject ( RSP . threadFinished , INFINITE ) ;
for ( i = 0 ; i < 4 ; i + + )
if ( RSP . threadMsg [ i ] )
CloseHandle ( RSP . threadMsg [ i ] ) ;
CloseHandle ( RSP . threadFinished ) ;
CloseHandle ( RSP . thread ) ;
}
RSP . thread = NULL ;
2008-03-15 10:33:00 -04:00
# else
2008-04-06 10:55:37 -04:00
OGL_Stop ( ) ;
2008-03-15 10:33:00 -04:00
# endif
# ifdef DEBUG
2008-04-06 10:55:37 -04:00
CloseDebugDlg ( ) ;
2008-03-15 10:33:00 -04:00
# endif
}
EXPORT void CALL RomOpen ( void )
{
# ifdef RSPTHREAD
# ifndef __LINUX__
2008-04-06 10:55:37 -04:00
DWORD threadID ;
int i ;
// Create RSP message events
for ( i = 0 ; i < 6 ; i + + )
{
RSP . threadMsg [ i ] = CreateEvent ( NULL , FALSE , FALSE , NULL ) ;
if ( RSP . threadMsg [ i ] = = NULL )
{
MessageBox ( hWnd , " Error creating video thread message events, closing video thread... " , " glN64 Error " , MB_OK | MB_ICONERROR ) ;
return ;
}
}
// Create RSP finished event
RSP . threadFinished = CreateEvent ( NULL , FALSE , FALSE , NULL ) ;
if ( RSP . threadFinished = = NULL )
{
MessageBox ( hWnd , " Error creating video thread finished event, closing video thread... " , " glN64 Error " , MB_OK | MB_ICONERROR ) ;
return ;
}
RSP . thread = CreateThread ( NULL , 4096 , RSP_ThreadProc , NULL , NULL , & threadID ) ;
WaitForSingleObject ( RSP . threadFinished , INFINITE ) ;
2008-03-15 10:33:00 -04:00
# else // !__LINUX__
# endif // __LINUX__
# else
2008-04-06 10:55:37 -04:00
RSP_Init ( ) ;
2008-03-15 10:33:00 -04:00
# endif
2008-04-06 10:55:37 -04:00
OGL_ResizeWindow ( ) ;
2008-03-15 10:33:00 -04:00
# ifdef DEBUG
2008-04-06 10:55:37 -04:00
OpenDebugDlg ( ) ;
2008-03-15 10:33:00 -04:00
# endif
}
EXPORT void CALL ShowCFB ( void )
2008-04-06 10:55:37 -04:00
{
2008-03-15 10:33:00 -04:00
}
EXPORT void CALL UpdateScreen ( void )
{
# ifdef RSPTHREAD
2008-04-06 10:55:37 -04:00
if ( RSP . thread )
{
SetEvent ( RSP . threadMsg [ RSPMSG_UPDATESCREEN ] ) ;
WaitForSingleObject ( RSP . threadFinished , INFINITE ) ;
}
2008-03-15 10:33:00 -04:00
# else
2008-04-06 10:55:37 -04:00
VI_UpdateScreen ( ) ;
2008-03-15 10:33:00 -04:00
# endif
}
EXPORT void CALL ViStatusChanged ( void )
{
}
EXPORT void CALL ViWidthChanged ( void )
{
}
EXPORT void CALL ReadScreen ( void * * dest , int * width , int * height )
{
2008-04-06 10:55:37 -04:00
OGL_ReadScreen ( dest , width , height ) ;
2008-03-15 10:33:00 -04:00
}
EXPORT void CALL SetConfigDir ( char * configDir )
{
2008-04-06 10:55:37 -04:00
strncpy ( configdir , configDir , PATH_MAX ) ;
2008-03-15 10:33:00 -04:00
}
2008-05-16 00:46:48 -04:00
EXPORT void CALL SetRenderingCallback ( void ( * callback ) ( ) )
{
renderCallback = callback ;
}