1 /***************************************************************************
2 copyright : (C) 2001 by Pete Bernert, 2011 notaz
4 ***************************************************************************/
5 /***************************************************************************
7 * This program is free software; you can redistribute it and/or modify *
8 * it under the terms of the GNU General Public License as published by *
9 * the Free Software Foundation; either version 2 of the License, or *
10 * (at your option) any later version. See also the license.txt file for *
11 * additional informations. *
13 ***************************************************************************/
18 #include "../gpulib/gpu.h"
23 #define INFO_DRAWSTART 1
24 #define INFO_DRAWEND 2
25 #define INFO_DRAWOFF 3
27 #define SHADETEXBIT(x) ((x>>24) & 0x1)
28 #define SEMITRANSBIT(x) ((x>>25) & 0x1)
29 #define PSXRGB(r,g,b) ((g<<10)|(b<<5)|r)
31 #define DATAREGISTERMODES unsigned short
34 #define DR_VRAMTRANSFER 1
36 #define GPUSTATUS_READYFORVRAM 0x08000000
40 #define SWAP16(x) ({ uint16_t y=(x); (((y)>>8 & 0xff) | ((y)<<8 & 0xff00)); })
41 #define SWAP32(x) ({ uint32_t y=(x); (((y)>>24 & 0xfful) | ((y)>>8 & 0xff00ul) | ((y)<<8 & 0xff0000ul) | ((y)<<24 & 0xff000000ul)); })
46 #define HOST2LE32(x) SWAP32(x)
47 #define HOST2BE32(x) (x)
48 #define LE2HOST32(x) SWAP32(x)
49 #define BE2HOST32(x) (x)
51 #define HOST2LE16(x) SWAP16(x)
52 #define HOST2BE16(x) (x)
53 #define LE2HOST16(x) SWAP16(x)
54 #define BE2HOST16(x) (x)
58 // little endian config
59 #define HOST2LE32(x) (x)
60 #define HOST2BE32(x) SWAP32(x)
61 #define LE2HOST32(x) (x)
62 #define BE2HOST32(x) SWAP32(x)
64 #define HOST2LE16(x) (x)
65 #define HOST2BE16(x) SWAP16(x)
66 #define LE2HOST16(x) (x)
67 #define BE2HOST16(x) SWAP16(x)
71 #define GETLEs16(X) ((int16_t)GETLE16((uint16_t *)X))
72 #define GETLEs32(X) ((int16_t)GETLE32((uint16_t *)X))
74 #define GETLE16(X) LE2HOST16(*(uint16_t *)X)
75 #define GETLE32_(X) LE2HOST32(*(uint32_t *)X)
76 #define GETLE16D(X) ({uint32_t val = GETLE32(X); (val<<16 | val >> 16);})
77 #define PUTLE16(X, Y) do{*((uint16_t *)X)=HOST2LE16((uint16_t)Y);}while(0)
78 #define PUTLE32_(X, Y) do{*((uint32_t *)X)=HOST2LE16((uint32_t)Y);}while(0)
80 #define GETLE32(X) (*(uint16_t *)(X)|(((uint16_t *)(X))[1]<<16))
81 #define PUTLE32(X, Y) do{uint16_t *p_=(uint16_t *)(X);uint32_t y_=Y;p_[0]=y_;p_[1]=y_>>16;}while(0)
83 #define GETLE32 GETLE32_
84 #define PUTLE32 PUTLE32_
87 /////////////////////////////////////////////////////////////////////////////
89 typedef struct VRAMLOADTTAG
97 unsigned short *ImagePtr;
100 /////////////////////////////////////////////////////////////////////////////
102 typedef struct PSXPOINTTAG
108 typedef struct PSXSPOINTTAG
114 typedef struct PSXRECTTAG
122 // linux defines for some windows stuff
126 #define BOOL unsigned short
127 #define LOWORD(l) ((unsigned short)(l))
128 #define HIWORD(l) ((unsigned short)(((uint32_t)(l) >> 16) & 0xFFFF))
129 #define max(a,b) (((a) > (b)) ? (a) : (b))
130 #define min(a,b) (((a) < (b)) ? (a) : (b))
131 #define DWORD uint32_t
133 #define __int64 long long int
136 typedef struct RECTTAG
144 /////////////////////////////////////////////////////////////////////////////
146 typedef struct TWINTAG
152 /////////////////////////////////////////////////////////////////////////////
154 typedef struct PSXDISPLAYTAG
156 PSXPoint_t DisplayModeNew;
157 PSXPoint_t DisplayMode;
158 PSXPoint_t DisplayPosition;
159 PSXPoint_t DisplayEnd;
164 int32_t InterlacedNew;
168 PSXSPoint_t DrawOffset;
174 /////////////////////////////////////////////////////////////////////////////
178 extern int32_t GlobalTextAddrX,GlobalTextAddrY,GlobalTextTP;
179 extern int32_t GlobalTextABR,GlobalTextPAGE;
180 extern short ly0,lx0,ly1,lx1,ly2,lx2,ly3,lx3;
181 extern long lLowerpart;
182 extern BOOL bCheckMask;
183 extern unsigned short sSetMask;
184 extern unsigned long lSetMask;
188 extern short DrawSemiTrans;
192 extern BOOL bUsingTWin;
194 extern void (*primTableJ[256])(unsigned char *);
195 extern void (*primTableSkip[256])(unsigned char *);
196 extern unsigned short usMirror;
198 extern uint32_t dwCfgFixes;
199 extern uint32_t dwActFixes;
200 extern int iUseFixes;
201 extern int iUseDither;
202 extern BOOL bDoVSyncUpdate;
203 extern int32_t drawX;
204 extern int32_t drawY;
205 extern int32_t drawW;
206 extern int32_t drawH;
213 #define KEY_RESETTEXSTORE 1
214 #define KEY_SHOWFPS 2
215 #define KEY_RESETOPAQUE 4
216 #define KEY_RESETDITHER 8
217 #define KEY_RESETFILTER 16
218 #define KEY_RESETADVBLEND 32
219 #define KEY_BADTEXTURES 128
220 #define KEY_CHECKTHISOUT 256
222 #if !defined(__BIG_ENDIAN__) || defined(__x86_64__) || defined(__i386__)
223 #ifndef __LITTLE_ENDIAN__
224 #define __LITTLE_ENDIAN__
228 #ifdef __LITTLE_ENDIAN__
229 #define RED(x) (x & 0xff)
230 #define BLUE(x) ((x>>16) & 0xff)
231 #define GREEN(x) ((x>>8) & 0xff)
232 #define COLOR(x) (x & 0xffffff)
233 #elif defined __BIG_ENDIAN__
234 #define RED(x) ((x>>24) & 0xff)
235 #define BLUE(x) ((x>>8) & 0xff)
236 #define GREEN(x) ((x>>16) & 0xff)
237 #define COLOR(x) SWAP32(x & 0xffffff)
240 PSXDisplay_t PSXDisplay;
241 unsigned char *psxVub;
243 unsigned short *psxVuw;
244 unsigned short *psxVuw_eom;
245 signed short *psxVsw;
250 uint32_t lGPUInfoVals[16];
252 VRAMLoad_t VRAMWrite;
255 DATAREGISTERMODES DataWriteMode;
256 DATAREGISTERMODES DataReadMode;
258 BOOL bCheckMask = FALSE;
259 unsigned short sSetMask = 0;
260 unsigned long lSetMask = 0;
263 #if defined(__GNUC__) && __GNUC__ >= 6
264 #pragma GCC diagnostic ignored "-Wmisleading-indentation"
270 /////////////////////////////////////////////////////////////////////////////
272 static void set_vram(void *vram)
276 psxVsb=(signed char *)psxVub; // different ways of accessing PSX VRAM
277 psxVsw=(signed short *)psxVub;
278 psxVsl=(int32_t *)psxVub;
279 psxVuw=(unsigned short *)psxVub;
280 psxVul=(uint32_t *)psxVub;
282 psxVuw_eom=psxVuw+1024*512; // pre-calc of end of vram
285 int renderer_init(void)
289 PSXDisplay.RGB24 = FALSE; // init some stuff
290 PSXDisplay.Interlaced = FALSE;
291 PSXDisplay.DrawOffset.x = 0;
292 PSXDisplay.DrawOffset.y = 0;
293 PSXDisplay.DisplayMode.x= 320;
294 PSXDisplay.DisplayMode.y= 240;
295 PSXDisplay.Disabled = FALSE;
296 PSXDisplay.Range.x0=0;
297 PSXDisplay.Range.x1=0;
298 PSXDisplay.Double = 1;
300 DataWriteMode = DR_NORMAL;
301 lGPUstatusRet = 0x14802000;
306 void renderer_finish(void)
310 void renderer_notify_res_change(void)
314 extern const unsigned char cmd_lengths[256];
316 int do_cmd_list(unsigned int *list, int list_len, int *last_cmd)
318 unsigned int cmd = 0, len;
319 unsigned int *list_start = list;
320 unsigned int *list_end = list + list_len;
322 for (; list < list_end; list += 1 + len)
325 len = cmd_lengths[cmd];
326 if (list + 1 + len > list_end) {
332 if (cmd == 0xa0 || cmd == 0xc0)
333 break; // image i/o, forward to upper layer
334 else if ((cmd & 0xf8) == 0xe0)
335 gpu.ex_regs[cmd & 7] = list[0];
338 primTableJ[cmd]((void *)list);
344 u32 num_vertexes = 2;
345 u32 *list_position = &(list[3]);
349 if(list_position >= list_end) {
354 if((*list_position & 0xf000f000) == 0x50005000)
361 len += (num_vertexes - 2);
367 u32 num_vertexes = 2;
368 u32 *list_position = &(list[4]);
372 if(list_position >= list_end) {
377 if((*list_position & 0xf000f000) == 0x50005000)
384 len += (num_vertexes - 2) * 2;
389 case 0xA0: // sys -> vid
391 short *slist = (void *)list;
392 u32 load_width = slist[4];
393 u32 load_height = slist[5];
394 u32 load_size = load_width * load_height;
396 len += load_size / 2;
404 gpu.ex_regs[1] &= ~0x1ff;
405 gpu.ex_regs[1] |= lGPUstatusRet & 0x1ff;
408 return list - list_start;
411 void renderer_sync_ecmds(uint32_t *ecmds)
413 cmdTexturePage((unsigned char *)&ecmds[1]);
414 cmdTextureWindow((unsigned char *)&ecmds[2]);
415 cmdDrawAreaStart((unsigned char *)&ecmds[3]);
416 cmdDrawAreaEnd((unsigned char *)&ecmds[4]);
417 cmdDrawOffset((unsigned char *)&ecmds[5]);
418 cmdSTP((unsigned char *)&ecmds[6]);
421 void renderer_update_caches(int x, int y, int w, int h)
425 void renderer_flush_queues(void)
429 void renderer_set_interlace(int enable, int is_odd)
433 #include "../../frontend/plugin_lib.h"
435 void renderer_set_config(const struct rearmed_cbs *cbs)
437 iUseDither = cbs->gpu_peops.iUseDither;
438 dwActFixes = cbs->gpu_peops.dwActFixes;
439 if (cbs->pl_set_gpu_caps)
440 cbs->pl_set_gpu_caps(0);