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