gpu_neon: add peops as temp renderer
[pcsx_rearmed.git] / plugins / gpu_neon / peops_if.c
CommitLineData
b094071f 1/***************************************************************************
2 copyright : (C) 2001 by Pete Bernert, 2011 notaz
3
4 ***************************************************************************/
5/***************************************************************************
6 * *
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. *
12 * *
13 ***************************************************************************/
14
15#include <stdio.h>
16#include <stdlib.h>
17#include <string.h>
18#include "gpu.h"
19
20#define u32 uint32_t
21
22#define INFO_TW 0
23#define INFO_DRAWSTART 1
24#define INFO_DRAWEND 2
25#define INFO_DRAWOFF 3
26
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)
30
31#define DATAREGISTERMODES unsigned short
32
33#define DR_NORMAL 0
34#define DR_VRAMTRANSFER 1
35
36#define GPUSTATUS_READYFORVRAM 0x08000000
37
38// byteswappings
39
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)); })
42
43#ifdef __BIG_ENDIAN__
44
45// big endian config
46#define HOST2LE32(x) SWAP32(x)
47#define HOST2BE32(x) (x)
48#define LE2HOST32(x) SWAP32(x)
49#define BE2HOST32(x) (x)
50
51#define HOST2LE16(x) SWAP16(x)
52#define HOST2BE16(x) (x)
53#define LE2HOST16(x) SWAP16(x)
54#define BE2HOST16(x) (x)
55
56#else
57
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)
63
64#define HOST2LE16(x) (x)
65#define HOST2BE16(x) SWAP16(x)
66#define LE2HOST16(x) (x)
67#define BE2HOST16(x) SWAP16(x)
68
69#endif
70
71#define GETLEs16(X) ((int16_t)GETLE16((uint16_t *)X))
72#define GETLEs32(X) ((int16_t)GETLE32((uint16_t *)X))
73
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)
79#ifdef __arm__
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)
82#else
83#define GETLE32 GETLE32_
84#define PUTLE32 PUTLE32_
85#endif
86
87/////////////////////////////////////////////////////////////////////////////
88
89typedef struct VRAMLOADTTAG
90{
91 short x;
92 short y;
93 short Width;
94 short Height;
95 short RowsRemaining;
96 short ColsRemaining;
97 unsigned short *ImagePtr;
98} VRAMLoad_t;
99
100/////////////////////////////////////////////////////////////////////////////
101
102typedef struct PSXPOINTTAG
103{
104 int32_t x;
105 int32_t y;
106} PSXPoint_t;
107
108typedef struct PSXSPOINTTAG
109{
110 short x;
111 short y;
112} PSXSPoint_t;
113
114typedef struct PSXRECTTAG
115{
116 short x0;
117 short x1;
118 short y0;
119 short y1;
120} PSXRect_t;
121
122// linux defines for some windows stuff
123
124#define FALSE 0
125#define TRUE 1
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
132#ifndef __int64
133#define __int64 long long int
134#endif
135
136typedef struct RECTTAG
137{
138 int left;
139 int top;
140 int right;
141 int bottom;
142}RECT;
143
144/////////////////////////////////////////////////////////////////////////////
145
146typedef struct TWINTAG
147{
148 PSXRect_t Position;
149 int xmask, ymask;
150} TWin_t;
151
152/////////////////////////////////////////////////////////////////////////////
153
154typedef struct PSXDISPLAYTAG
155{
156 PSXPoint_t DisplayModeNew;
157 PSXPoint_t DisplayMode;
158 PSXPoint_t DisplayPosition;
159 PSXPoint_t DisplayEnd;
160
161 int32_t Double;
162 int32_t Height;
163 int32_t PAL;
164 int32_t InterlacedNew;
165 int32_t Interlaced;
166 int32_t RGB24New;
167 int32_t RGB24;
168 PSXSPoint_t DrawOffset;
169 int32_t Disabled;
170 PSXRect_t Range;
171
172} PSXDisplay_t;
173
174/////////////////////////////////////////////////////////////////////////////
175
176// draw.c
177
178extern int32_t GlobalTextAddrX,GlobalTextAddrY,GlobalTextTP;
179extern int32_t GlobalTextABR,GlobalTextPAGE;
180extern short ly0,lx0,ly1,lx1,ly2,lx2,ly3,lx3;
181extern long lLowerpart;
182extern BOOL bCheckMask;
183extern unsigned short sSetMask;
184extern unsigned long lSetMask;
185extern short g_m1;
186extern short g_m2;
187extern short g_m3;
188extern short DrawSemiTrans;
189
190// prim.c
191
192extern BOOL bUsingTWin;
193extern TWin_t TWin;
194extern void (*primTableJ[256])(unsigned char *);
195extern void (*primTableSkip[256])(unsigned char *);
196extern unsigned short usMirror;
197extern int iDither;
198extern uint32_t dwCfgFixes;
199extern uint32_t dwActFixes;
200extern int iUseFixes;
201extern int iUseDither;
202extern BOOL bDoVSyncUpdate;
203extern int32_t drawX;
204extern int32_t drawY;
205extern int32_t drawW;
206extern int32_t drawH;
207
208// gpu.h
209
210#define OPAQUEON 10
211#define OPAQUEOFF 11
212
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
221
222#if !defined(__BIG_ENDIAN__) || defined(__x86_64__) || defined(__i386__)
223#ifndef __LITTLE_ENDIAN__
224#define __LITTLE_ENDIAN__
225#endif
226#endif
227
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)
238#endif
239
240PSXDisplay_t PSXDisplay;
241unsigned char *psxVub;
242signed char *psxVsb;
243unsigned short *psxVuw;
244unsigned short *psxVuw_eom;
245signed short *psxVsw;
246uint32_t *psxVul;
247int32_t *psxVsl;
248
249long lGPUstatusRet;
250uint32_t lGPUInfoVals[16];
251
252VRAMLoad_t VRAMWrite;
253VRAMLoad_t VRAMRead;
254
255DATAREGISTERMODES DataWriteMode;
256DATAREGISTERMODES DataReadMode;
257
258BOOL bCheckMask = FALSE;
259unsigned short sSetMask = 0;
260unsigned long lSetMask = 0;
261long lLowerpart;
262
263#include "../dfxvideo/soft.c"
264#include "../dfxvideo/prim.c"
265
266/////////////////////////////////////////////////////////////////////////////
267
268int renderer_init(void)
269{
270 psxVub=(void *)gpu.vram;
271
272 psxVsb=(signed char *)psxVub; // different ways of accessing PSX VRAM
273 psxVsw=(signed short *)psxVub;
274 psxVsl=(int32_t *)psxVub;
275 psxVuw=(unsigned short *)psxVub;
276 psxVul=(uint32_t *)psxVub;
277
278 psxVuw_eom=psxVuw+1024*512; // pre-calc of end of vram
279
280 PSXDisplay.RGB24 = FALSE; // init some stuff
281 PSXDisplay.Interlaced = FALSE;
282 PSXDisplay.DrawOffset.x = 0;
283 PSXDisplay.DrawOffset.y = 0;
284 PSXDisplay.DisplayMode.x= 320;
285 PSXDisplay.DisplayMode.y= 240;
286 PSXDisplay.Disabled = FALSE;
287 PSXDisplay.Range.x0=0;
288 PSXDisplay.Range.x1=0;
289 PSXDisplay.Double = 1;
290
291 DataWriteMode = DR_NORMAL;
292 lGPUstatusRet = 0x14802000;
293
294 return 0;
295}
296
297extern const unsigned char cmd_lengths[256];
298
299void do_cmd_list(unsigned int *list, int list_len)
300{
301 unsigned int cmd, len;
302
303 unsigned int *list_end = list + list_len;
304
305 for (; list < list_end; list += 1 + len)
306 {
307 short *slist = (void *)list;
308 cmd = *list >> 24;
309 len = cmd_lengths[cmd];
310
311 primTableJ[cmd]((void *)list);
312
313 switch(cmd)
314 {
315 case 0x48 ... 0x4F:
316 {
317 u32 num_vertexes = 1;
318 u32 *list_position = &(list[2]);
319
320 while(1)
321 {
322 if((*list_position & 0xf000f000) == 0x50005000 || list_position >= list_end)
323 break;
324
325 list_position++;
326 num_vertexes++;
327 }
328
329 if(num_vertexes > 2)
330 len += (num_vertexes - 2);
331
332 break;
333 }
334
335 case 0x58 ... 0x5F:
336 {
337 u32 num_vertexes = 1;
338 u32 *list_position = &(list[2]);
339
340 while(1)
341 {
342 if((*list_position & 0xf000f000) == 0x50005000 || list_position >= list_end)
343 break;
344
345 list_position += 2;
346 num_vertexes++;
347 }
348
349 if(num_vertexes > 2)
350 len += ((num_vertexes * 2) - 2);
351
352 break;
353 }
354
355 case 0xA0: // sys -> vid
356 {
357 u32 load_width = slist[4];
358 u32 load_height = slist[5];
359 u32 load_size = load_width * load_height;
360
361 len += load_size / 2;
362 break;
363 }
364 }
365 }
366}
367
368void renderer_invalidate_caches(int x, int y, int w, int h)
369{
370}
371
372void renderer_flush_queues(void)
373{
374}