add watchdog thread to detect lockups
[pcsx_rearmed.git] / plugins / dfxvideo / gpu.h
1 /***************************************************************************
2                           gpu.h  -  description
3                              -------------------
4     begin                : Sun Oct 28 2001
5     copyright            : (C) 2001 by Pete Bernert
6     email                : BlackDove@addcom.de
7  ***************************************************************************/
8 /***************************************************************************
9  *                                                                         *
10  *   This program is free software; you can redistribute it and/or modify  *
11  *   it under the terms of the GNU General Public License as published by  *
12  *   the Free Software Foundation; either version 2 of the License, or     *
13  *   (at your option) any later version. See also the license.txt file for *
14  *   additional informations.                                              *
15  *                                                                         *
16  ***************************************************************************/
17
18 #ifndef _PSX_GPU_
19 #define _PSX_GPU_
20
21 #define INFO_TW        0
22 #define INFO_DRAWSTART 1
23 #define INFO_DRAWEND   2
24 #define INFO_DRAWOFF   3
25
26 #define SHADETEXBIT(x) ((x>>24) & 0x1)
27 #define SEMITRANSBIT(x) ((x>>25) & 0x1)
28 #define PSXRGB(r,g,b) ((g<<10)|(b<<5)|r)
29
30 #define DATAREGISTERMODES unsigned short
31
32 #define DR_NORMAL        0
33 #define DR_VRAMTRANSFER  1
34
35
36 #define GPUSTATUS_ODDLINES            0x80000000
37 #define GPUSTATUS_DMABITS             0x60000000 // Two bits
38 #define GPUSTATUS_READYFORCOMMANDS    0x10000000
39 #define GPUSTATUS_READYFORVRAM        0x08000000
40 #define GPUSTATUS_IDLE                0x04000000
41 #define GPUSTATUS_DISPLAYDISABLED     0x00800000
42 #define GPUSTATUS_INTERLACED          0x00400000
43 #define GPUSTATUS_RGB24               0x00200000
44 #define GPUSTATUS_PAL                 0x00100000
45 #define GPUSTATUS_DOUBLEHEIGHT        0x00080000
46 #define GPUSTATUS_WIDTHBITS           0x00070000 // Three bits
47 #define GPUSTATUS_MASKENABLED         0x00001000
48 #define GPUSTATUS_MASKDRAWN           0x00000800
49 #define GPUSTATUS_DRAWINGALLOWED      0x00000400
50 #define GPUSTATUS_DITHER              0x00000200
51
52 #define GPUIsBusy (lGPUstatusRet &= ~GPUSTATUS_IDLE)
53 #define GPUIsIdle (lGPUstatusRet |= GPUSTATUS_IDLE)
54
55 #define GPUIsNotReadyForCommands (lGPUstatusRet &= ~GPUSTATUS_READYFORCOMMANDS)
56 #define GPUIsReadyForCommands (lGPUstatusRet |= GPUSTATUS_READYFORCOMMANDS)
57
58 #define CALLBACK
59
60 #include <stdio.h>
61 #include <stdlib.h>
62 #include <string.h>
63 #include <sys/time.h>
64 #include <math.h>
65 #include <stdint.h>
66 #include <unistd.h>
67
68 /////////////////////////////////////////////////////////////////////////////
69
70 // byteswappings
71
72 #define SWAP16(x) ({ uint16_t y=(x); (((y)>>8 & 0xff) | ((y)<<8 & 0xff00)); })
73 #define SWAP32(x) ({ uint32_t y=(x); (((y)>>24 & 0xfful) | ((y)>>8 & 0xff00ul) | ((y)<<8 & 0xff0000ul) | ((y)<<24 & 0xff000000ul)); })
74
75 #ifdef __BIG_ENDIAN__
76
77 // big endian config
78 #define HOST2LE32(x) SWAP32(x)
79 #define HOST2BE32(x) (x)
80 #define LE2HOST32(x) SWAP32(x)
81 #define BE2HOST32(x) (x)
82
83 #define HOST2LE16(x) SWAP16(x)
84 #define HOST2BE16(x) (x)
85 #define LE2HOST16(x) SWAP16(x)
86 #define BE2HOST16(x) (x)
87
88 #else
89
90 // little endian config
91 #define HOST2LE32(x) (x)
92 #define HOST2BE32(x) SWAP32(x)
93 #define LE2HOST32(x) (x)
94 #define BE2HOST32(x) SWAP32(x)
95
96 #define HOST2LE16(x) (x)
97 #define HOST2BE16(x) SWAP16(x)
98 #define LE2HOST16(x) (x)
99 #define BE2HOST16(x) SWAP16(x)
100
101 #endif
102
103 #define GETLEs16(X) ((int16_t)GETLE16((uint16_t *)X))
104 #define GETLEs32(X) ((int16_t)GETLE32((uint16_t *)X))
105
106 #define GETLE16(X) LE2HOST16(*(uint16_t *)X)
107 #define GETLE32(X) LE2HOST32(*(uint32_t *)X)
108 #define GETLE16D(X) ({uint32_t val = GETLE32(X); (val<<16 | val >> 16);})
109 #define PUTLE16(X, Y) do{*((uint16_t *)X)=HOST2LE16((uint16_t)Y);}while(0)
110 #define PUTLE32(X, Y) do{*((uint32_t *)X)=HOST2LE16((uint32_t)Y);}while(0)
111
112 /////////////////////////////////////////////////////////////////////////////
113
114 typedef struct VRAMLOADTTAG
115 {
116  short x;
117  short y;
118  short Width;
119  short Height;
120  short RowsRemaining;
121  short ColsRemaining;
122  unsigned short *ImagePtr;
123 } VRAMLoad_t;
124
125 /////////////////////////////////////////////////////////////////////////////
126
127 typedef struct PSXPOINTTAG
128 {
129  int32_t x;
130  int32_t y;
131 } PSXPoint_t;
132
133 typedef struct PSXSPOINTTAG
134 {
135  short x;
136  short y;
137 } PSXSPoint_t;
138
139 typedef struct PSXRECTTAG
140 {
141  short x0;
142  short x1;
143  short y0;
144  short y1;
145 } PSXRect_t;
146
147 // linux defines for some windows stuff
148
149 #define FALSE 0
150 #define TRUE 1
151 #define BOOL unsigned short
152 #define LOWORD(l)           ((unsigned short)(l))
153 #define HIWORD(l)           ((unsigned short)(((uint32_t)(l) >> 16) & 0xFFFF))
154 #define max(a,b)            (((a) > (b)) ? (a) : (b))
155 #define min(a,b)            (((a) < (b)) ? (a) : (b))
156 #define DWORD uint32_t
157 #ifndef __int64
158 #define __int64 long long int 
159 #endif
160
161 typedef struct RECTTAG
162 {
163  int left;
164  int top;
165  int right;
166  int bottom;
167 }RECT;
168
169 /////////////////////////////////////////////////////////////////////////////
170
171 typedef struct TWINTAG
172 {
173  PSXRect_t  Position;
174 } TWin_t;
175
176 /////////////////////////////////////////////////////////////////////////////
177
178 typedef struct PSXDISPLAYTAG
179 {
180  PSXPoint_t  DisplayModeNew;
181  PSXPoint_t  DisplayMode;
182  PSXPoint_t  DisplayPosition;
183  PSXPoint_t  DisplayEnd;
184  
185  int32_t        Double;
186  int32_t        Height;
187  int32_t        PAL;
188  int32_t        InterlacedNew;
189  int32_t        Interlaced;
190  int32_t        RGB24New;
191  int32_t        RGB24;
192  PSXSPoint_t DrawOffset;
193  int32_t        Disabled;
194  PSXRect_t   Range;
195
196 } PSXDisplay_t;
197
198 /////////////////////////////////////////////////////////////////////////////
199
200 // draw.c
201
202 extern int32_t           GlobalTextAddrX,GlobalTextAddrY,GlobalTextTP;
203 extern int32_t           GlobalTextREST,GlobalTextABR,GlobalTextPAGE;
204 extern short          ly0,lx0,ly1,lx1,ly2,lx2,ly3,lx3;
205 extern long           lLowerpart;
206 extern BOOL           bCheckMask;
207 extern unsigned short sSetMask;
208 extern unsigned long  lSetMask;
209 extern short          g_m1;
210 extern short          g_m2;
211 extern short          g_m3;
212 extern short          DrawSemiTrans;
213
214 // prim.c
215
216 extern BOOL           bUsingTWin;
217 extern TWin_t         TWin;
218 extern void (*primTableJ[256])(unsigned char *);
219 extern void (*primTableSkip[256])(unsigned char *);
220 extern unsigned short  usMirror;
221 extern int            iDither;
222 extern uint32_t  dwCfgFixes;
223 extern uint32_t  dwActFixes;
224 extern int            iUseFixes;
225 extern int            iUseDither;
226 extern BOOL           bDoVSyncUpdate;
227 extern int32_t           drawX;
228 extern int32_t           drawY;
229 extern int32_t           drawW;
230 extern int32_t           drawH;
231
232 // gpu.h
233
234 #define OPAQUEON   10
235 #define OPAQUEOFF  11
236
237 #define KEY_RESETTEXSTORE 1
238 #define KEY_SHOWFPS       2
239 #define KEY_RESETOPAQUE   4
240 #define KEY_RESETDITHER   8
241 #define KEY_RESETFILTER   16
242 #define KEY_RESETADVBLEND 32
243 #define KEY_BADTEXTURES   128
244 #define KEY_CHECKTHISOUT  256
245
246 #if !defined(__BIG_ENDIAN__) || defined(__x86_64__) || defined(__i386__)
247 #ifndef __LITTLE_ENDIAN__
248 #define __LITTLE_ENDIAN__
249 #endif
250 #endif
251
252 #ifdef __LITTLE_ENDIAN__
253 #define RED(x) (x & 0xff)
254 #define BLUE(x) ((x>>16) & 0xff)
255 #define GREEN(x) ((x>>8) & 0xff)
256 #define COLOR(x) (x & 0xffffff)
257 #elif defined __BIG_ENDIAN__
258 #define RED(x) ((x>>24) & 0xff)
259 #define BLUE(x) ((x>>8) & 0xff)
260 #define GREEN(x) ((x>>16) & 0xff)
261 #define COLOR(x) SWAP32(x & 0xffffff)
262 #endif
263
264 // gpu.c
265
266 extern VRAMLoad_t     VRAMWrite;
267 extern VRAMLoad_t     VRAMRead;
268 extern DATAREGISTERMODES DataWriteMode;
269 extern DATAREGISTERMODES DataReadMode;
270 extern short          sDispWidths[];
271 extern BOOL           bDebugText;
272 extern PSXDisplay_t   PSXDisplay;
273 extern PSXDisplay_t   PreviousPSXDisplay;
274 extern BOOL           bSkipNextFrame;
275 extern long           lGPUstatusRet;
276 extern unsigned char  * psxVSecure;
277 extern unsigned char  * psxVub;
278 extern signed char    * psxVsb;
279 extern unsigned short * psxVuw;
280 extern signed short   * psxVsw;
281 extern uint32_t  * psxVul;
282 extern int32_t    * psxVsl;
283 extern unsigned short * psxVuw_eom;
284 extern BOOL           bChangeWinMode;
285 extern long           lSelectedSlot;
286 extern BOOL           bInitCap;
287 extern DWORD          dwLaceCnt;
288 extern uint32_t  lGPUInfoVals[];
289 extern uint32_t  ulStatusControl[];
290
291 // fps.c
292
293 extern int            UseFrameLimit;
294 extern int            UseFrameSkip;
295 extern float          fFrameRate;
296 extern int            iFrameLimit;
297 extern float          fFrameRateHz;
298 extern float          fps_skip;
299 extern float          fps_cur;
300
301 // draw.c
302
303 void          DoBufferSwap(void);
304 void          DoClearScreenBuffer(void);
305 void          DoClearFrontBuffer(void);
306 unsigned long ulInitDisplay(void);
307 void          CloseDisplay(void);
308
309 #endif