Glide Plugin GLES2 port from mupen64plus-ae, but with special FrameSkip code
[mupen64plus-pandora.git] / source / gles2glide64 / src / Glide64 / Gfx_1.3.h
diff --git a/source/gles2glide64/src/Glide64/Gfx_1.3.h b/source/gles2glide64/src/Glide64/Gfx_1.3.h
new file mode 100755 (executable)
index 0000000..a0216dd
--- /dev/null
@@ -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 <stdio.h>
+#include <SDL_mutex.h>
+#include <fstream>
+#include <stdlib.h>
+#include <stddef.h>            // offsetof
+#include <string.h>
+#include <stdarg.h>
+#include <glide.h>
+#include "GlideExtensions.h"
+#include "rdp.h"
+#include "Keys.h"
+
+#include <iostream>
+#include <fstream>
+
+#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 {
+// <removed, already defined in API>
+} 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__