X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=source%2Fgles2glide64%2Fsrc%2FGlide64%2FGfx_1.3.h;fp=source%2Fgles2glide64%2Fsrc%2FGlide64%2FGfx_1.3.h;h=a0216dd2bf12c6d212407ae942fa3c150d47dd57;hb=98e75f2d18c02c233da543560f76282f04fc796c;hp=0000000000000000000000000000000000000000;hpb=0ced54f867d36e8b324155bef49e8abfebfc3237;p=mupen64plus-pandora.git diff --git a/source/gles2glide64/src/Glide64/Gfx_1.3.h b/source/gles2glide64/src/Glide64/Gfx_1.3.h new file mode 100755 index 0000000..a0216dd --- /dev/null +++ b/source/gles2glide64/src/Glide64/Gfx_1.3.h @@ -0,0 +1,682 @@ +/* +* Glide64 - Glide video plugin for Nintendo 64 emulators. +* Copyright (c) 2002 Dave2001 +* Copyright (c) 2003-2009 Sergey 'Gonetz' Lipski +* +* This program is free software; you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation; either version 2 of the License, or +* any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software +* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +//**************************************************************** +// +// Glide64 - Glide Plugin for Nintendo 64 emulators +// Project started on December 29th, 2001 +// +// Authors: +// Dave2001, original author, founded the project in 2001, left it in 2002 +// Gugaman, joined the project in 2002, left it in 2002 +// Sergey 'Gonetz' Lipski, joined the project in 2002, main author since fall of 2002 +// Hiroshi 'KoolSmoky' Morii, joined the project in 2007 +// +//**************************************************************** +// +// To modify Glide64: +// * Write your name and (optional)email, commented by your work, so I know who did it, and so that you can find which parts you modified when it comes time to send it to me. +// * Do NOT send me the whole project or file that you modified. Take out your modified code sections, and tell me where to put them. If people sent the whole thing, I would have many different versions, but no idea how to combine them all. +// +//**************************************************************** + +/********************************************************************************** +Common gfx plugin spec, version #1.3 maintained by zilmar (zilmar@emulation64.com) + +All questions or suggestions should go through the mailing list. +http://www.egroups.com/group/Plugin64-Dev +*********************************************************************************** + +Notes: +------ + +Setting the approprate bits in the MI_INTR_REG and calling CheckInterrupts which +are both passed to the DLL in InitiateGFX will generate an Interrupt from with in +the plugin. + +The Setting of the RSP flags and generating an SP interrupt should not be done in +the plugin + +**********************************************************************************/ + +// THIS FILE IS A PRECOMPILED HEADER TO DECREASE BUILD TIME. INCLUDE ALL STANDARD +// .H FILES HERE + +#ifndef _GFX_H_INCLUDED__ +#define _GFX_H_INCLUDED__ + +#include "winlnxdefs.h" +#include "m64p.h" + +#include +#include +#include +#include +#include // offsetof +#include +#include +#include +#include "GlideExtensions.h" +#include "rdp.h" +#include "Keys.h" + +#include +#include + +#if defined __VISUALC__ +#define GLIDE64_TRY __try +#define GLIDE64_CATCH __except (EXCEPTION_EXECUTE_HANDLER) +#else +#define GLIDE64_TRY try +#define GLIDE64_CATCH catch (...) +#endif + +#ifndef WIN32 +typedef int HWND; +#endif + + +#if defined(__cplusplus) +extern "C" { +#endif + +#define _ENDUSER_RELEASE_ + +//******** +// Logging + +// ******************************** +// ** TAKE OUT BEFORE RELEASE!!! ** +//#define LOGGING // log of spec functions called +//#define LOG_KEY // says "Key!!!" in the log when space bar is pressed +//#define EXT_LOGGING +//#define PERFORMANCE + +//#define LOG_UCODE + +//#define ALTTAB_FIX + +//#define EXTREME_LOGGING // lots of logging + // note that some of these things are inserted/removed + // from within the code & may not be changed by this define. + +//#define TLUT_LOGGING // log every entry of the TLUT? +// ******************************** + +#define FPS // fps counter able? (not enabled necessarily) + +//#define LOGNOTKEY // Log if not pressing: +//#define LOGKEY 0x11 // this key (CONTROL) + +//#define LOG_COMMANDS // log the whole 64-bit command as (0x........, 0x........) + +#define CATCH_EXCEPTIONS // catch exceptions so it doesn't freeze and will report + // "The gfx plugin has caused an exception" instead. + +//#define FLUSH // flush the file buffer. slower logging, but makes sure + // the command is logged before continuing (in case of + // crash or exception, the log will not be cut short) +#ifndef _ENDUSER_RELEASE_ +#define RDP_LOGGING // Allow logging (will not log unless checked, but allows the option) + // Logging functions will not be compiled if this is not present. +//#define RDP_ERROR_LOG +#endif + +#define FPS_FRAMES 10 // Number of frames in which to make an FPS count + +//#define SHOW_FULL_TEXVIEWER // shows the entire contents of the texture in the cache viewer, + // usually used to debug clamping issues. + + +// Usually enabled +//#define LARGE_TEXTURE_HANDLING // allow large-textured objects to be split? + +#ifdef ALTTAB_FIX +extern HHOOK hhkLowLevelKybd; +extern LRESULT CALLBACK LowLevelKeyboardProc(int nCode, + WPARAM wParam, LPARAM lParam); +#endif + +// Simulations +//#define SIMULATE_VOODOO1 +//#define SIMULATE_BANSHEE +//******** + +#ifdef EXT_LOGGING +extern std::ofstream extlog; +#define EXT(x) extlog.open("ext.txt",std::ios::app); extlog << x; extlog.close(); +#else +#define EXT(x) +#endif + +#ifndef _ENDUSER_RELEASE_ +#define UNIMP_LOG // Keep enabled, option in dialog +#define BRIGHT_RED // Keep enabled, option in dialog +#endif + +#define COLORED_DEBUGGER // ;) pretty colors + +#ifdef FPS +extern LARGE_INTEGER fps_last; +extern LARGE_INTEGER fps_next; +extern float fps; +extern wxUint32 fps_count; +#endif + +// rdram mask at 0x400000 bytes (bah, not right for majora's mask) +//#define BMASK 0x7FFFFF +extern unsigned long BMASK; +#define WMASK 0x3FFFFF +#define DMASK 0x1FFFFF + +extern wxUint32 update_screen_count; +extern wxUint32 resolutions[0x18][2]; + +int CheckKeyPressed(int key, int mask); + +#ifdef PERFORMANCE +extern int64 perf_cur; +extern int64 perf_next; +#endif + +//#ifdef LOGGING +//extern std::ofstream loga; +//#define LOG(X) loga.open("log.txt",std::ios::app); loga << (...); loga.flush(); loga.close(); + +//#else + #ifndef OLD_API + #define LOG(...) WriteLog(M64MSG_INFO, __VA_ARGS__) + #define VLOG(...) WriteLog(M64MSG_VERBOSE, __VA_ARGS__) + #define WARNLOG(...) WriteLog(M64MSG_WARNING, __VA_ARGS__) + #define ERRLOG(...) WriteLog(M64MSG_ERROR, __VA_ARGS__) +#else + #define LOG(...) printf(__VA_ARGS__) + #define VLOG(...) + #define WARNLOG(...) printf(__VA_ARGS__) + #define ERRLOG(X, ...) str.Printf(_T(X), __VA_ARGS__); wxMessageBox(str, _T("Error"), wxOK | wxICON_EXCLAMATION, GFXWindow) + #define ERRLOG(X) str.Printf(_T(X)); wxMessageBox(str, _T("Error"), wxOK | wxICON_EXCLAMATION, GFXWindow) +#endif + + +#ifdef RDP_LOGGING +extern int log_open; +extern std::ofstream rdp_log; +#define OPEN_RDP_LOG() EXT("OPEN_RDP_LOG ()\n"); if (settings.logging && !log_open) { rdp_log.open ("rdp.txt"); log_open=TRUE; } +#define CLOSE_RDP_LOG() EXT("CLOSE_RDP_LOG ()\n"); if (settings.logging && log_open) { rdp_log.close (); log_open=FALSE; } + +#ifdef LOGNOTKEY +#define LRDP(x) EXT("RDP (...)\n"); if (settings.logging && log_open) { if (!CheckKeyPressed(LOGKEY,0x8000)) { rdp_log << x; rdp_log.flush(); } } +#else +#define LRDP(x) EXT("RDP (...)\n"); if (settings.logging && log_open) { rdp_log << x; rdp_log.flush(); } +#endif + +#else +#define OPEN_RDP_LOG() +#define CLOSE_RDP_LOG() +#define LRDP(x) +#endif + + +#ifdef RDP_ERROR_LOG +extern int elog_open; +extern std::ofstream rdp_err; +#define OPEN_RDP_E_LOG() EXT("OPEN_RDP_E_LOG ()\n"); if (settings.elogging && !elog_open) { rdp_err.open ("rdp_e.txt"); elog_open=TRUE; } +#define CLOSE_RDP_E_LOG() EXT("CLOSE_RDP_LOG ()\n"); if (settings.elogging && elog_open) { rdp_err.close (); elog_open=FALSE; } +#define RDP_E(x) if (settings.elogging) { FRDP_E (x); } +#else +#define OPEN_RDP_E_LOG() +#define CLOSE_RDP_E_LOG() +#define RDP_E(x) +#endif + +__inline void FRDP (const char *fmt, ...) +{ +#ifdef RDP_LOGGING + if (!settings.logging || !log_open) return; + +#ifdef LOGNOTKEY + if (CheckKeyPressed(LOGKEY,0x8000)) return; +#endif + + va_list ap; + va_start(ap, fmt); + vsprintf(out_buf, fmt, ap); + LRDP (out_buf); + va_end(ap); +#endif +} +__inline void FRDP_E (const char *fmt, ...) +{ +#ifdef RDP_ERROR_LOG + if (!settings.elogging || !elog_open) return; + +#ifdef LOGNOTKEY + if (CheckKeyPressed(LOGKEY,0x8000)) return; +#endif + + sprintf (out_buf, "%08lx: (%08lx, %08lx) ", rdp.pc[rdp.pc_i]-8, rdp.cmd0, rdp.cmd1); + rdp_err << out_buf; + + va_list ap2; + va_start(ap2, fmt); + vsprintf(out_buf, fmt, ap2); + rdp_err << out_buf; + rdp_err.flush(); + va_end(ap2); +#endif +} + +extern int fullscreen; +extern int romopen; +extern int to_fullscreen; +extern int debugging; + +extern int evoodoo; +extern int ev_fullscreen; + +extern SDL_sem *mutexProcessDList; +extern int exception; + +// extern wxMutex *mutexProcessDList; + +int InitGfx (int); +void ReleaseGfx (); + +// The highest 8 bits are the segment # (1-16), and the lower 24 bits are the offset to +// add to it. +__inline wxUint32 segoffset (wxUint32 so) +{ + return (rdp.segment[(so>>24)&0x0f] + (so&BMASK))&BMASK; +} + +/* Plugin types */ +#define PLUGIN_TYPE_GFX 2 + +// this is already defined in API +/* +#ifdef __WINDOWS__ +#define EXPORT __declspec(dllexport) +#define CALL _cdecl +#else +#define EXPORT extern +#define CALL +#endif +*/ +/***** Structures *****/ +typedef struct { + wxUint16 Version; /* Set to 0x0103 */ + wxUint16 Type; /* Set to PLUGIN_TYPE_GFX */ + char Name[100]; /* Name of the DLL */ + + /* If DLL supports memory these memory options then set them to TRUE or FALSE + if it does not support it */ + int NormalMemory; /* a normal wxUint8 array */ + int MemoryBswaped; /* a normal wxUint8 array where the memory has been pre + bswap on a dword (32 bits) boundry */ +} PLUGIN_INFO; + +/* +typedef struct { +// +} GFX_INFO; +*/ +extern GFX_INFO gfx; +// extern wxWindow * GFXWindow; +extern bool no_dlist; + +typedef GrContext_t (FX_CALL *GRWINOPENEXT)( FxU32 hWnd, + GrScreenResolution_t resolution, + GrScreenRefresh_t refresh, + GrColorFormat_t format, + GrOriginLocation_t origin, + GrPixelFormat_t pixelformat, + int nColBuffers, + int nAuxBuffers) ; + +typedef void (FX_CALL *GRTEXBUFFEREXT)( GrChipID_t tmu, + FxU32 startAddress, + GrLOD_t lodmin, + GrLOD_t lodmax, + GrAspectRatio_t aspect, + GrTextureFormat_t fmt, + FxU32 evenOdd) ; + +typedef void (FX_CALL *GRAUXBUFFEREXT)( GrBuffer_t buffer ) ; + +typedef void (FX_CALL *GRCOLORCOMBINEEXT) (GrCCUColor_t a, + GrCombineMode_t a_mode, + GrCCUColor_t b, + GrCombineMode_t b_mode, + GrCCUColor_t c, + FxBool c_invert, + GrCCUColor_t d, + FxBool d_invert, + FxU32 shift, + FxBool invert) ; + +typedef void (FX_CALL *GRTEXCOLORCOMBINEEXT) (GrChipID_t tmu, + GrTCCUColor_t a, + GrCombineMode_t a_mode, + GrTCCUColor_t b, + GrCombineMode_t b_mode, + GrTCCUColor_t c, + FxBool c_invert, + GrTCCUColor_t d, + FxBool d_invert, + FxU32 shift, + FxBool invert); + +typedef void (FX_CALL *GRCONSTANTCOLORVALUEEXT) + (GrChipID_t tmu, + GrColor_t value); + +typedef void (FX_CALL *GRSTIPPLE)( FxI32 mode) ; + +typedef void (FX_CALL *GRCONFIGWRAPPEREXT)(FxI32, FxI32, FxBool, FxBool); + +typedef GrScreenResolution_t (FX_CALL *GRWRAPPERFULLSCREENRESOLUTIONEXT)(wxUint32*, wxUint32*); + +typedef char ** (FX_CALL *GRQUERYRESOLUTIONSEXT)(FxI32*); + +typedef int (*GETTEXADDR)(int tmu, int texsize); + +extern GRTEXBUFFEREXT grTextureBufferExt; +extern GRTEXBUFFEREXT grTextureAuxBufferExt; +extern GRAUXBUFFEREXT grAuxBufferExt; +extern GRSTIPPLE grStippleModeExt; +extern GRSTIPPLE grStipplePatternExt; +extern GETTEXADDR GetTexAddr; + +#ifndef GR_STIPPLE_DISABLE +#define GR_STIPPLE_DISABLE 0x0 +#define GR_STIPPLE_PATTERN 0x1 +#define GR_STIPPLE_ROTATE 0x2 +#endif + +void ReadSettings (); +void ReadSpecialSettings (const char * name); +void WriteSettings (bool saveEmulationSettings = false); + +#if 0 +//TODO: remove +/****************************************************************** + Function: CaptureScreen + Purpose: This function dumps the current frame to a file + input: pointer to the directory to save the file to + output: none +*******************************************************************/ +EXPORT void CALL CaptureScreen ( char * Directory ); + +/****************************************************************** + Function: ChangeWindow + Purpose: to change the window between fullscreen and window + mode. If the window was in fullscreen this should + change the screen to window mode and vice vesa. + input: none + output: none +*******************************************************************/ +EXPORT void CALL ChangeWindow (void); + +/****************************************************************** + Function: CloseDLL + Purpose: This function is called when the emulator is closing + down allowing the dll to de-initialise. + input: none + output: none +*******************************************************************/ +EXPORT void CALL CloseDLL (void); + +/****************************************************************** + Function: DllAbout + Purpose: This function is optional function that is provided + to give further information about the DLL. + input: a handle to the window that calls this function + output: none +*******************************************************************/ +EXPORT void CALL DllAbout ( HWND hParent ); + +/****************************************************************** + Function: DllConfig + Purpose: This function is optional function that is provided + to allow the user to configure the dll + input: a handle to the window that calls this function + output: none +*******************************************************************/ +EXPORT void CALL DllConfig ( HWND hParent ); + +/****************************************************************** + Function: DllTest + Purpose: This function is optional function that is provided + to allow the user to test the dll + input: a handle to the window that calls this function + output: none +*******************************************************************/ +EXPORT void CALL DllTest ( HWND hParent ); + + +EXPORT void CALL ReadScreen(void **dest, int *width, int *height); + +/****************************************************************** + Function: DrawScreen + Purpose: This function is called when the emulator receives a + WM_PAINT message. This allows the gfx to fit in when + it is being used in the desktop. + input: none + output: none +*******************************************************************/ +EXPORT void CALL DrawScreen (void); + +/****************************************************************** + Function: GetDllInfo + Purpose: This function allows the emulator to gather information + about the dll by filling in the PluginInfo structure. + input: a pointer to a PLUGIN_INFO stucture that needs to be + filled by the function. (see def above) + output: none +*******************************************************************/ +EXPORT void CALL GetDllInfo ( PLUGIN_INFO * PluginInfo ); + +/****************************************************************** + Function: InitiateGFX + Purpose: This function is called when the DLL is started to give + information from the emulator that the n64 graphics + uses. This is not called from the emulation thread. + Input: Gfx_Info is passed to this function which is defined + above. + Output: TRUE on success + FALSE on failure to initialise + + ** note on interrupts **: + To generate an interrupt set the appropriate bit in MI_INTR_REG + and then call the function CheckInterrupts to tell the emulator + that there is a waiting interrupt. +*******************************************************************/ +EXPORT int CALL InitiateGFX (GFX_INFO Gfx_Info); + +/****************************************************************** + Function: MoveScreen + Purpose: This function is called in response to the emulator + receiving a WM_MOVE passing the xpos and ypos passed + from that message. + input: xpos - the x-coordinate of the upper-left corner of the + client area of the window. + ypos - y-coordinate of the upper-left corner of the + client area of the window. + output: none +*******************************************************************/ +EXPORT void CALL MoveScreen (int xpos, int ypos); + +/****************************************************************** + Function: ProcessDList + Purpose: This function is called when there is a Dlist to be + processed. (High level GFX list) + input: none + output: none +*******************************************************************/ +EXPORT void CALL ProcessDList(void); + +/****************************************************************** + Function: ProcessRDPList + Purpose: This function is called when there is a Dlist to be + processed. (Low level GFX list) + input: none + output: none +*******************************************************************/ +EXPORT void CALL ProcessRDPList(void); + +/****************************************************************** + Function: RomClosed + Purpose: This function is called when a rom is closed. + input: none + output: none +*******************************************************************/ +EXPORT void CALL RomClosed (void); + +/****************************************************************** + Function: RomOpen + Purpose: This function is called when a rom is open. (from the + emulation thread) + input: none + output: none +*******************************************************************/ +EXPORT void CALL RomOpen (void); + +/****************************************************************** + Function: ShowCFB + Purpose: Useally once Dlists are started being displayed, cfb is + ignored. This function tells the dll to start displaying + them again. + input: none + output: none +*******************************************************************/ +EXPORT void CALL ShowCFB (void); + +/****************************************************************** + Function: UpdateScreen + Purpose: This function is called in response to a vsync of the + screen were the VI bit in MI_INTR_REG has already been + set + input: none + output: none +*******************************************************************/ +EXPORT void CALL UpdateScreen (void); + +/****************************************************************** + Function: ViStatusChanged + Purpose: This function is called to notify the dll that the + ViStatus registers value has been changed. + input: none + output: none +*******************************************************************/ +EXPORT void CALL ViStatusChanged (void); + +/****************************************************************** + Function: ViWidthChanged + Purpose: This function is called to notify the dll that the + ViWidth registers value has been changed. + input: none + output: none +*******************************************************************/ +EXPORT void CALL ViWidthChanged (void); + + +/****************************************************************** + Function: FrameBufferWrite + Purpose: This function is called to notify the dll that the + frame buffer has been modified by CPU at the given address. + input: addr rdram address + val val + size 1 = wxUint8, 2 = wxUint16, 4 = wxUint32 + output: none +*******************************************************************/ +EXPORT void CALL FBWrite(wxUint32, wxUint32); + +typedef struct +{ + wxUint32 addr; + wxUint32 val; + wxUint32 size; // 1 = wxUint8, 2 = wxUint16, 4=wxUint32 +} FrameBufferModifyEntry; + +/****************************************************************** + Function: FrameBufferWriteList + Purpose: This function is called to notify the dll that the + frame buffer has been modified by CPU at the given address. + input: FrameBufferModifyEntry *plist + size = size of the plist, max = 1024 + output: none +*******************************************************************/ +EXPORT void CALL FBWList(FrameBufferModifyEntry *plist, wxUint32 size); + +/****************************************************************** + Function: FrameBufferRead + Purpose: This function is called to notify the dll that the + frame buffer memory is beening read at the given address. + DLL should copy content from its render buffer to the frame buffer + in N64 RDRAM + DLL is responsible to maintain its own frame buffer memory addr list + DLL should copy 4KB block content back to RDRAM frame buffer. + Emulator should not call this function again if other memory + is read within the same 4KB range + input: addr rdram address + val val + size 1 = wxUint8, 2 = wxUint16, 4 = wxUint32 + output: none +*******************************************************************/ +EXPORT void CALL FBRead(wxUint32 addr); + +/************************************************************************ +Function: FBGetFrameBufferInfo +Purpose: This function is called by the emulator core to retrieve depth +buffer information from the video plugin in order to be able +to notify the video plugin about CPU depth buffer read/write +operations + +size: += 1 byte += 2 word (16 bit) <-- this is N64 default depth buffer format += 4 dword (32 bit) + +when depth buffer information is not available yet, set all values +in the FrameBufferInfo structure to 0 + +input: FrameBufferInfo *pinfo +pinfo is pointed to a FrameBufferInfo structure which to be +filled in by this function +output: Values are return in the FrameBufferInfo structure +************************************************************************/ +EXPORT void CALL FBGetFrameBufferInfo(void *pinfo); + +/****************************************************************** + NOTE: THIS HAS BEEN ADDED FOR MUPEN64PLUS AND IS NOT PART OF THE + ORIGINAL SPEC + Function: SetConfigDir + Purpose: To pass the location where config files should be read/ + written to. + input: path to config directory + output: none +*******************************************************************/ +EXPORT void CALL SetConfigDir(char *configDir); +#endif + +#if defined(__cplusplus) +} +#endif +#endif //_GFX_H_INCLUDED__