Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
alexbevi
GitHub Repository: alexbevi/BizHawk
Path: blob/master/libmupen64plus/mupen64plus-video-glide64mk2/src/Glide64/Gfx_1.3.h
2 views
1
/*
2
* Glide64 - Glide video plugin for Nintendo 64 emulators.
3
* Copyright (c) 2002 Dave2001
4
* Copyright (c) 2003-2009 Sergey 'Gonetz' Lipski
5
*
6
* This program is free software; you can redistribute it and/or modify
7
* it under the terms of the GNU General Public License as published by
8
* the Free Software Foundation; either version 2 of the License, or
9
* any later version.
10
*
11
* This program is distributed in the hope that it will be useful,
12
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
* GNU General Public License for more details.
15
*
16
* You should have received a copy of the GNU General Public License
17
* along with this program; if not, write to the Free Software
18
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19
*/
20
21
//****************************************************************
22
//
23
// Glide64 - Glide Plugin for Nintendo 64 emulators
24
// Project started on December 29th, 2001
25
//
26
// Authors:
27
// Dave2001, original author, founded the project in 2001, left it in 2002
28
// Gugaman, joined the project in 2002, left it in 2002
29
// Sergey 'Gonetz' Lipski, joined the project in 2002, main author since fall of 2002
30
// Hiroshi 'KoolSmoky' Morii, joined the project in 2007
31
//
32
//****************************************************************
33
//
34
// To modify Glide64:
35
// * 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.
36
// * 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.
37
//
38
//****************************************************************
39
40
/**********************************************************************************
41
Common gfx plugin spec, version #1.3 maintained by zilmar ([email protected])
42
43
All questions or suggestions should go through the mailing list.
44
http://www.egroups.com/group/Plugin64-Dev
45
***********************************************************************************
46
47
Notes:
48
------
49
50
Setting the approprate bits in the MI_INTR_REG and calling CheckInterrupts which
51
are both passed to the DLL in InitiateGFX will generate an Interrupt from with in
52
the plugin.
53
54
The Setting of the RSP flags and generating an SP interrupt should not be done in
55
the plugin
56
57
**********************************************************************************/
58
59
// THIS FILE IS A PRECOMPILED HEADER TO DECREASE BUILD TIME. INCLUDE ALL STANDARD
60
// .H FILES HERE
61
62
#ifndef _GFX_H_INCLUDED__
63
#define _GFX_H_INCLUDED__
64
65
#include "winlnxdefs.h"
66
#include "m64p.h"
67
68
#include <stdio.h>
69
#include <SDL_mutex.h>
70
#include <fstream>
71
#include <stdlib.h>
72
#include <stddef.h> // offsetof
73
#include <string.h>
74
#include <stdarg.h>
75
#include <glide.h>
76
#include "GlideExtensions.h"
77
#include "rdp.h"
78
#include "Keys.h"
79
80
#include <iostream>
81
#include <fstream>
82
83
#if defined __VISUALC__
84
#define GLIDE64_TRY __try
85
#define GLIDE64_CATCH __except (EXCEPTION_EXECUTE_HANDLER)
86
#else
87
#define GLIDE64_TRY try
88
#define GLIDE64_CATCH catch (...)
89
#endif
90
91
#ifndef WIN32
92
typedef int HWND;
93
#endif
94
95
96
#if defined(__cplusplus)
97
extern "C" {
98
#endif
99
100
#define _ENDUSER_RELEASE_
101
102
//********
103
// Logging
104
105
// ********************************
106
// ** TAKE OUT BEFORE RELEASE!!! **
107
//#define LOGGING // log of spec functions called
108
//#define LOG_KEY // says "Key!!!" in the log when space bar is pressed
109
110
//#define LOG_UCODE
111
112
//#define ALTTAB_FIX
113
114
//#define EXTREME_LOGGING // lots of logging
115
// note that some of these things are inserted/removed
116
// from within the code & may not be changed by this define.
117
118
//#define TLUT_LOGGING // log every entry of the TLUT?
119
// ********************************
120
121
#define FPS // fps counter able? (not enabled necessarily)
122
123
#define LOGNOTKEY // Log if not pressing:
124
#define LOGKEY 0x11 // this key (CONTROL)
125
126
//#define LOG_COMMANDS // log the whole 64-bit command as (0x........, 0x........)
127
128
#define CATCH_EXCEPTIONS // catch exceptions so it doesn't freeze and will report
129
// "The gfx plugin has caused an exception" instead.
130
131
#define FLUSH // flush the file buffer. slower logging, but makes sure
132
// the command is logged before continuing (in case of
133
// crash or exception, the log will not be cut short)
134
#ifndef _ENDUSER_RELEASE_
135
#define RDP_LOGGING // Allow logging (will not log unless checked, but allows the option)
136
// Logging functions will not be compiled if this is not present.
137
//#define RDP_ERROR_LOG
138
#endif
139
140
#define FPS_FRAMES 10 // Number of frames in which to make an FPS count
141
142
//#define SHOW_FULL_TEXVIEWER // shows the entire contents of the texture in the cache viewer,
143
// usually used to debug clamping issues.
144
145
146
// Usually enabled
147
#define LARGE_TEXTURE_HANDLING // allow large-textured objects to be split?
148
149
#ifdef ALTTAB_FIX
150
extern HHOOK hhkLowLevelKybd;
151
extern LRESULT CALLBACK LowLevelKeyboardProc(int nCode,
152
WPARAM wParam, LPARAM lParam);
153
#endif
154
155
// Simulations
156
//#define SIMULATE_VOODOO1
157
//#define SIMULATE_BANSHEE
158
//********
159
160
#ifdef EXT_LOGGING
161
extern std::ofstream extlog;
162
#define EXT(x) extlog.open("ext.txt",std::ios::app); extlog << x; extlog.close();
163
#else
164
#define EXT(x)
165
#endif
166
167
#ifndef _ENDUSER_RELEASE_
168
#define UNIMP_LOG // Keep enabled, option in dialog
169
#define BRIGHT_RED // Keep enabled, option in dialog
170
#endif
171
172
#define COLORED_DEBUGGER // ;) pretty colors
173
174
#ifdef FPS
175
extern LARGE_INTEGER fps_last;
176
extern LARGE_INTEGER fps_next;
177
extern float fps;
178
extern wxUint32 fps_count;
179
#endif
180
181
// rdram mask at 0x400000 bytes (bah, not right for majora's mask)
182
//#define BMASK 0x7FFFFF
183
extern unsigned long BMASK;
184
#define WMASK 0x3FFFFF
185
#define DMASK 0x1FFFFF
186
187
extern wxUint32 update_screen_count;
188
extern wxUint32 resolutions[0x18][2];
189
190
int CheckKeyPressed(int key, int mask);
191
192
//#define PERFORMANCE
193
#ifdef PERFORMANCE
194
extern int64 perf_cur;
195
extern int64 perf_next;
196
#endif
197
198
//#ifdef LOGGING
199
//extern std::ofstream loga;
200
//#define LOG(X) loga.open("log.txt",std::ios::app); loga << (...); loga.flush(); loga.close();
201
202
//#else
203
#ifndef OLD_API
204
#define LOG(...) WriteLog(M64MSG_INFO, __VA_ARGS__)
205
#define VLOG(...) WriteLog(M64MSG_VERBOSE, __VA_ARGS__)
206
#define WARNLOG(...) WriteLog(M64MSG_WARNING, __VA_ARGS__)
207
#define ERRLOG(...) WriteLog(M64MSG_ERROR, __VA_ARGS__)
208
#else
209
#define LOG(...) printf(__VA_ARGS__)
210
#define VLOG(...)
211
#define WARNLOG(...) printf(__VA_ARGS__)
212
#define ERRLOG(X, ...) str.Printf(_T(X), __VA_ARGS__); wxMessageBox(str, _T("Error"), wxOK | wxICON_EXCLAMATION, GFXWindow)
213
#define ERRLOG(X) str.Printf(_T(X)); wxMessageBox(str, _T("Error"), wxOK | wxICON_EXCLAMATION, GFXWindow)
214
#endif
215
216
217
#ifdef RDP_LOGGING
218
extern int log_open;
219
extern std::ofstream rdp_log;
220
#define OPEN_RDP_LOG() EXT("OPEN_RDP_LOG ()\n"); if (settings.logging && !log_open) { rdp_log.open ("rdp.txt"); log_open=TRUE; }
221
#define CLOSE_RDP_LOG() EXT("CLOSE_RDP_LOG ()\n"); if (settings.logging && log_open) { rdp_log.close (); log_open=FALSE; }
222
223
#ifdef LOGNOTKEY
224
#define LRDP(x) EXT("RDP (...)\n"); if (settings.logging && log_open) { if (!CheckKeyPressed(LOGKEY,0x8000)) { rdp_log << x; rdp_log.flush(); } }
225
#else
226
#define LRDP(x) EXT("RDP (...)\n"); if (settings.logging && log_open) { rdp_log << x; rdp_log.flush(); }
227
#endif
228
229
#else
230
#define OPEN_RDP_LOG()
231
#define CLOSE_RDP_LOG()
232
#define LRDP(x)
233
#endif
234
235
236
#ifdef RDP_ERROR_LOG
237
extern int elog_open;
238
extern std::ofstream rdp_err;
239
#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; }
240
#define CLOSE_RDP_E_LOG() EXT("CLOSE_RDP_LOG ()\n"); if (settings.elogging && elog_open) { rdp_err.close (); elog_open=FALSE; }
241
#define RDP_E(x) if (settings.elogging) { FRDP_E (x); }
242
#else
243
#define OPEN_RDP_E_LOG()
244
#define CLOSE_RDP_E_LOG()
245
#define RDP_E(x)
246
#endif
247
248
__inline void FRDP (const char *fmt, ...)
249
{
250
#ifdef RDP_LOGGING
251
if (!settings.logging || !log_open) return;
252
253
#ifdef LOGNOTKEY
254
if (CheckKeyPressed(LOGKEY,0x8000)) return;
255
#endif
256
257
va_list ap;
258
va_start(ap, fmt);
259
vsprintf(out_buf, fmt, ap);
260
LRDP (out_buf);
261
va_end(ap);
262
#endif
263
}
264
__inline void FRDP_E (const char *fmt, ...)
265
{
266
#ifdef RDP_ERROR_LOG
267
if (!settings.elogging || !elog_open) return;
268
269
#ifdef LOGNOTKEY
270
if (CheckKeyPressed(LOGKEY,0x8000)) return;
271
#endif
272
273
sprintf (out_buf, "%08lx: (%08lx, %08lx) ", rdp.pc[rdp.pc_i]-8, rdp.cmd0, rdp.cmd1);
274
rdp_err << out_buf;
275
276
va_list ap2;
277
va_start(ap2, fmt);
278
vsprintf(out_buf, fmt, ap2);
279
rdp_err << out_buf;
280
rdp_err.flush();
281
va_end(ap2);
282
#endif
283
}
284
285
extern int fullscreen;
286
extern int romopen;
287
extern int to_fullscreen;
288
extern int debugging;
289
290
extern int evoodoo;
291
extern int ev_fullscreen;
292
293
extern SDL_sem *mutexProcessDList;
294
extern int exception;
295
296
// extern wxMutex *mutexProcessDList;
297
298
int InitGfx (int);
299
void ReleaseGfx ();
300
301
// The highest 8 bits are the segment # (1-16), and the lower 24 bits are the offset to
302
// add to it.
303
__inline wxUint32 segoffset (wxUint32 so)
304
{
305
return (rdp.segment[(so>>24)&0x0f] + (so&BMASK))&BMASK;
306
}
307
308
/* Plugin types */
309
#define PLUGIN_TYPE_GFX 2
310
311
// this is already defined in API
312
/*
313
#ifdef __WINDOWS__
314
#define EXPORT __declspec(dllexport)
315
#define CALL _cdecl
316
#else
317
#define EXPORT extern
318
#define CALL
319
#endif
320
*/
321
/***** Structures *****/
322
typedef struct {
323
wxUint16 Version; /* Set to 0x0103 */
324
wxUint16 Type; /* Set to PLUGIN_TYPE_GFX */
325
char Name[100]; /* Name of the DLL */
326
327
/* If DLL supports memory these memory options then set them to TRUE or FALSE
328
if it does not support it */
329
int NormalMemory; /* a normal wxUint8 array */
330
int MemoryBswaped; /* a normal wxUint8 array where the memory has been pre
331
bswap on a dword (32 bits) boundry */
332
} PLUGIN_INFO;
333
334
/*
335
typedef struct {
336
// <removed, already defined in API>
337
} GFX_INFO;
338
*/
339
extern GFX_INFO gfx;
340
// extern wxWindow * GFXWindow;
341
extern bool no_dlist;
342
343
typedef GrContext_t (FX_CALL *GRWINOPENEXT)( FxU32 hWnd,
344
GrScreenResolution_t resolution,
345
GrScreenRefresh_t refresh,
346
GrColorFormat_t format,
347
GrOriginLocation_t origin,
348
GrPixelFormat_t pixelformat,
349
int nColBuffers,
350
int nAuxBuffers) ;
351
352
typedef void (FX_CALL *GRTEXBUFFEREXT)( GrChipID_t tmu,
353
FxU32 startAddress,
354
GrLOD_t lodmin,
355
GrLOD_t lodmax,
356
GrAspectRatio_t aspect,
357
GrTextureFormat_t fmt,
358
FxU32 evenOdd) ;
359
360
typedef void (FX_CALL *GRAUXBUFFEREXT)( GrBuffer_t buffer ) ;
361
362
typedef void (FX_CALL *GRCOLORCOMBINEEXT) (GrCCUColor_t a,
363
GrCombineMode_t a_mode,
364
GrCCUColor_t b,
365
GrCombineMode_t b_mode,
366
GrCCUColor_t c,
367
FxBool c_invert,
368
GrCCUColor_t d,
369
FxBool d_invert,
370
FxU32 shift,
371
FxBool invert) ;
372
373
typedef void (FX_CALL *GRTEXCOLORCOMBINEEXT) (GrChipID_t tmu,
374
GrTCCUColor_t a,
375
GrCombineMode_t a_mode,
376
GrTCCUColor_t b,
377
GrCombineMode_t b_mode,
378
GrTCCUColor_t c,
379
FxBool c_invert,
380
GrTCCUColor_t d,
381
FxBool d_invert,
382
FxU32 shift,
383
FxBool invert);
384
385
typedef void (FX_CALL *GRCONSTANTCOLORVALUEEXT)
386
(GrChipID_t tmu,
387
GrColor_t value);
388
389
typedef void (FX_CALL *GRSTIPPLE)( FxI32 mode) ;
390
391
typedef void (FX_CALL *GRCONFIGWRAPPEREXT)(FxI32, FxI32, FxBool, FxBool);
392
393
typedef GrScreenResolution_t (FX_CALL *GRWRAPPERFULLSCREENRESOLUTIONEXT)(wxUint32*, wxUint32*);
394
395
typedef char ** (FX_CALL *GRQUERYRESOLUTIONSEXT)(FxI32*);
396
397
typedef int (*GETTEXADDR)(int tmu, int texsize);
398
399
extern GRTEXBUFFEREXT grTextureBufferExt;
400
extern GRTEXBUFFEREXT grTextureAuxBufferExt;
401
extern GRAUXBUFFEREXT grAuxBufferExt;
402
extern GRSTIPPLE grStippleModeExt;
403
extern GRSTIPPLE grStipplePatternExt;
404
extern GETTEXADDR GetTexAddr;
405
406
#ifndef GR_STIPPLE_DISABLE
407
#define GR_STIPPLE_DISABLE 0x0
408
#define GR_STIPPLE_PATTERN 0x1
409
#define GR_STIPPLE_ROTATE 0x2
410
#endif
411
412
void ReadSettings ();
413
void ReadSpecialSettings (const char * name);
414
void WriteSettings (bool saveEmulationSettings = false);
415
416
#if 0
417
//TODO: remove
418
/******************************************************************
419
Function: CaptureScreen
420
Purpose: This function dumps the current frame to a file
421
input: pointer to the directory to save the file to
422
output: none
423
*******************************************************************/
424
EXPORT void CALL CaptureScreen ( char * Directory );
425
426
/******************************************************************
427
Function: ChangeWindow
428
Purpose: to change the window between fullscreen and window
429
mode. If the window was in fullscreen this should
430
change the screen to window mode and vice vesa.
431
input: none
432
output: none
433
*******************************************************************/
434
EXPORT void CALL ChangeWindow (void);
435
436
/******************************************************************
437
Function: CloseDLL
438
Purpose: This function is called when the emulator is closing
439
down allowing the dll to de-initialise.
440
input: none
441
output: none
442
*******************************************************************/
443
EXPORT void CALL CloseDLL (void);
444
445
/******************************************************************
446
Function: DllAbout
447
Purpose: This function is optional function that is provided
448
to give further information about the DLL.
449
input: a handle to the window that calls this function
450
output: none
451
*******************************************************************/
452
EXPORT void CALL DllAbout ( HWND hParent );
453
454
/******************************************************************
455
Function: DllConfig
456
Purpose: This function is optional function that is provided
457
to allow the user to configure the dll
458
input: a handle to the window that calls this function
459
output: none
460
*******************************************************************/
461
EXPORT void CALL DllConfig ( HWND hParent );
462
463
/******************************************************************
464
Function: DllTest
465
Purpose: This function is optional function that is provided
466
to allow the user to test the dll
467
input: a handle to the window that calls this function
468
output: none
469
*******************************************************************/
470
EXPORT void CALL DllTest ( HWND hParent );
471
472
473
EXPORT void CALL ReadScreen(void **dest, int *width, int *height);
474
475
/******************************************************************
476
Function: DrawScreen
477
Purpose: This function is called when the emulator receives a
478
WM_PAINT message. This allows the gfx to fit in when
479
it is being used in the desktop.
480
input: none
481
output: none
482
*******************************************************************/
483
EXPORT void CALL DrawScreen (void);
484
485
/******************************************************************
486
Function: GetDllInfo
487
Purpose: This function allows the emulator to gather information
488
about the dll by filling in the PluginInfo structure.
489
input: a pointer to a PLUGIN_INFO stucture that needs to be
490
filled by the function. (see def above)
491
output: none
492
*******************************************************************/
493
EXPORT void CALL GetDllInfo ( PLUGIN_INFO * PluginInfo );
494
495
/******************************************************************
496
Function: InitiateGFX
497
Purpose: This function is called when the DLL is started to give
498
information from the emulator that the n64 graphics
499
uses. This is not called from the emulation thread.
500
Input: Gfx_Info is passed to this function which is defined
501
above.
502
Output: TRUE on success
503
FALSE on failure to initialise
504
505
** note on interrupts **:
506
To generate an interrupt set the appropriate bit in MI_INTR_REG
507
and then call the function CheckInterrupts to tell the emulator
508
that there is a waiting interrupt.
509
*******************************************************************/
510
EXPORT int CALL InitiateGFX (GFX_INFO Gfx_Info);
511
512
/******************************************************************
513
Function: MoveScreen
514
Purpose: This function is called in response to the emulator
515
receiving a WM_MOVE passing the xpos and ypos passed
516
from that message.
517
input: xpos - the x-coordinate of the upper-left corner of the
518
client area of the window.
519
ypos - y-coordinate of the upper-left corner of the
520
client area of the window.
521
output: none
522
*******************************************************************/
523
EXPORT void CALL MoveScreen (int xpos, int ypos);
524
525
/******************************************************************
526
Function: ProcessDList
527
Purpose: This function is called when there is a Dlist to be
528
processed. (High level GFX list)
529
input: none
530
output: none
531
*******************************************************************/
532
EXPORT void CALL ProcessDList(void);
533
534
/******************************************************************
535
Function: ProcessRDPList
536
Purpose: This function is called when there is a Dlist to be
537
processed. (Low level GFX list)
538
input: none
539
output: none
540
*******************************************************************/
541
EXPORT void CALL ProcessRDPList(void);
542
543
/******************************************************************
544
Function: RomClosed
545
Purpose: This function is called when a rom is closed.
546
input: none
547
output: none
548
*******************************************************************/
549
EXPORT void CALL RomClosed (void);
550
551
/******************************************************************
552
Function: RomOpen
553
Purpose: This function is called when a rom is open. (from the
554
emulation thread)
555
input: none
556
output: none
557
*******************************************************************/
558
EXPORT void CALL RomOpen (void);
559
560
/******************************************************************
561
Function: ShowCFB
562
Purpose: Useally once Dlists are started being displayed, cfb is
563
ignored. This function tells the dll to start displaying
564
them again.
565
input: none
566
output: none
567
*******************************************************************/
568
EXPORT void CALL ShowCFB (void);
569
570
/******************************************************************
571
Function: UpdateScreen
572
Purpose: This function is called in response to a vsync of the
573
screen were the VI bit in MI_INTR_REG has already been
574
set
575
input: none
576
output: none
577
*******************************************************************/
578
EXPORT void CALL UpdateScreen (void);
579
580
/******************************************************************
581
Function: ViStatusChanged
582
Purpose: This function is called to notify the dll that the
583
ViStatus registers value has been changed.
584
input: none
585
output: none
586
*******************************************************************/
587
EXPORT void CALL ViStatusChanged (void);
588
589
/******************************************************************
590
Function: ViWidthChanged
591
Purpose: This function is called to notify the dll that the
592
ViWidth registers value has been changed.
593
input: none
594
output: none
595
*******************************************************************/
596
EXPORT void CALL ViWidthChanged (void);
597
598
599
/******************************************************************
600
Function: FrameBufferWrite
601
Purpose: This function is called to notify the dll that the
602
frame buffer has been modified by CPU at the given address.
603
input: addr rdram address
604
val val
605
size 1 = wxUint8, 2 = wxUint16, 4 = wxUint32
606
output: none
607
*******************************************************************/
608
EXPORT void CALL FBWrite(wxUint32, wxUint32);
609
610
typedef struct
611
{
612
wxUint32 addr;
613
wxUint32 val;
614
wxUint32 size; // 1 = wxUint8, 2 = wxUint16, 4=wxUint32
615
} FrameBufferModifyEntry;
616
617
/******************************************************************
618
Function: FrameBufferWriteList
619
Purpose: This function is called to notify the dll that the
620
frame buffer has been modified by CPU at the given address.
621
input: FrameBufferModifyEntry *plist
622
size = size of the plist, max = 1024
623
output: none
624
*******************************************************************/
625
EXPORT void CALL FBWList(FrameBufferModifyEntry *plist, wxUint32 size);
626
627
/******************************************************************
628
Function: FrameBufferRead
629
Purpose: This function is called to notify the dll that the
630
frame buffer memory is beening read at the given address.
631
DLL should copy content from its render buffer to the frame buffer
632
in N64 RDRAM
633
DLL is responsible to maintain its own frame buffer memory addr list
634
DLL should copy 4KB block content back to RDRAM frame buffer.
635
Emulator should not call this function again if other memory
636
is read within the same 4KB range
637
input: addr rdram address
638
val val
639
size 1 = wxUint8, 2 = wxUint16, 4 = wxUint32
640
output: none
641
*******************************************************************/
642
EXPORT void CALL FBRead(wxUint32 addr);
643
644
/************************************************************************
645
Function: FBGetFrameBufferInfo
646
Purpose: This function is called by the emulator core to retrieve depth
647
buffer information from the video plugin in order to be able
648
to notify the video plugin about CPU depth buffer read/write
649
operations
650
651
size:
652
= 1 byte
653
= 2 word (16 bit) <-- this is N64 default depth buffer format
654
= 4 dword (32 bit)
655
656
when depth buffer information is not available yet, set all values
657
in the FrameBufferInfo structure to 0
658
659
input: FrameBufferInfo *pinfo
660
pinfo is pointed to a FrameBufferInfo structure which to be
661
filled in by this function
662
output: Values are return in the FrameBufferInfo structure
663
************************************************************************/
664
EXPORT void CALL FBGetFrameBufferInfo(void *pinfo);
665
666
/******************************************************************
667
NOTE: THIS HAS BEEN ADDED FOR MUPEN64PLUS AND IS NOT PART OF THE
668
ORIGINAL SPEC
669
Function: SetConfigDir
670
Purpose: To pass the location where config files should be read/
671
written to.
672
input: path to config directory
673
output: none
674
*******************************************************************/
675
EXPORT void CALL SetConfigDir(char *configDir);
676
#endif
677
678
#if defined(__cplusplus)
679
}
680
#endif
681
#endif //_GFX_H_INCLUDED__
682
683