gpu_neon: add peops as temp renderer
authornotaz <notasas@gmail.com>
Fri, 12 Aug 2011 10:54:17 +0000 (13:54 +0300)
committernotaz <notasas@gmail.com>
Fri, 12 Aug 2011 21:57:33 +0000 (00:57 +0300)
plugins/gpu_neon/Makefile
plugins/gpu_neon/peops_if.c [new file with mode: 0644]

index a8872df..09c47d3 100644 (file)
@@ -3,6 +3,7 @@ CC = $(CROSS_COMPILE)gcc
 ARCH = $(shell $(CC) -v 2>&1 | grep -i 'target:' | awk '{print $$2}' | awk -F '-' '{print $$1}')
 
 CFLAGS += -ggdb -Wall -fPIC -O2
+CFLAGS += -fno-strict-aliasing
 
 LDFLAGS += -shared -Wl,-soname,$(TARGET)
 SRC += gpu.c
@@ -20,7 +21,7 @@ PEOPS=1
 ifndef PEOPS
 SRC += psx_gpu_if.c
 else
-SRC += peops.c
+SRC += peops_if.c
 endif
 
 all: $(TARGET)
diff --git a/plugins/gpu_neon/peops_if.c b/plugins/gpu_neon/peops_if.c
new file mode 100644 (file)
index 0000000..04c2595
--- /dev/null
@@ -0,0 +1,374 @@
+/***************************************************************************
+    copyright            : (C) 2001 by Pete Bernert, 2011 notaz
+
+ ***************************************************************************/
+/***************************************************************************
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version. See also the license.txt file for *
+ *   additional informations.                                              *
+ *                                                                         *
+ ***************************************************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "gpu.h"
+
+#define u32 uint32_t
+
+#define INFO_TW        0
+#define INFO_DRAWSTART 1
+#define INFO_DRAWEND   2
+#define INFO_DRAWOFF   3
+
+#define SHADETEXBIT(x) ((x>>24) & 0x1)
+#define SEMITRANSBIT(x) ((x>>25) & 0x1)
+#define PSXRGB(r,g,b) ((g<<10)|(b<<5)|r)
+
+#define DATAREGISTERMODES unsigned short
+
+#define DR_NORMAL        0
+#define DR_VRAMTRANSFER  1
+
+#define GPUSTATUS_READYFORVRAM        0x08000000
+
+// byteswappings
+
+#define SWAP16(x) ({ uint16_t y=(x); (((y)>>8 & 0xff) | ((y)<<8 & 0xff00)); })
+#define SWAP32(x) ({ uint32_t y=(x); (((y)>>24 & 0xfful) | ((y)>>8 & 0xff00ul) | ((y)<<8 & 0xff0000ul) | ((y)<<24 & 0xff000000ul)); })
+
+#ifdef __BIG_ENDIAN__
+
+// big endian config
+#define HOST2LE32(x) SWAP32(x)
+#define HOST2BE32(x) (x)
+#define LE2HOST32(x) SWAP32(x)
+#define BE2HOST32(x) (x)
+
+#define HOST2LE16(x) SWAP16(x)
+#define HOST2BE16(x) (x)
+#define LE2HOST16(x) SWAP16(x)
+#define BE2HOST16(x) (x)
+
+#else
+
+// little endian config
+#define HOST2LE32(x) (x)
+#define HOST2BE32(x) SWAP32(x)
+#define LE2HOST32(x) (x)
+#define BE2HOST32(x) SWAP32(x)
+
+#define HOST2LE16(x) (x)
+#define HOST2BE16(x) SWAP16(x)
+#define LE2HOST16(x) (x)
+#define BE2HOST16(x) SWAP16(x)
+
+#endif
+
+#define GETLEs16(X) ((int16_t)GETLE16((uint16_t *)X))
+#define GETLEs32(X) ((int16_t)GETLE32((uint16_t *)X))
+
+#define GETLE16(X) LE2HOST16(*(uint16_t *)X)
+#define GETLE32_(X) LE2HOST32(*(uint32_t *)X)
+#define GETLE16D(X) ({uint32_t val = GETLE32(X); (val<<16 | val >> 16);})
+#define PUTLE16(X, Y) do{*((uint16_t *)X)=HOST2LE16((uint16_t)Y);}while(0)
+#define PUTLE32_(X, Y) do{*((uint32_t *)X)=HOST2LE16((uint32_t)Y);}while(0)
+#ifdef __arm__
+#define GETLE32(X) (*(uint16_t *)(X)|(((uint16_t *)(X))[1]<<16))
+#define PUTLE32(X, Y) do{uint16_t *p_=(uint16_t *)(X);uint32_t y_=Y;p_[0]=y_;p_[1]=y_>>16;}while(0)
+#else
+#define GETLE32 GETLE32_
+#define PUTLE32 PUTLE32_
+#endif
+
+/////////////////////////////////////////////////////////////////////////////
+
+typedef struct VRAMLOADTTAG
+{
+ short x;
+ short y;
+ short Width;
+ short Height;
+ short RowsRemaining;
+ short ColsRemaining;
+ unsigned short *ImagePtr;
+} VRAMLoad_t;
+
+/////////////////////////////////////////////////////////////////////////////
+
+typedef struct PSXPOINTTAG
+{
+ int32_t x;
+ int32_t y;
+} PSXPoint_t;
+
+typedef struct PSXSPOINTTAG
+{
+ short x;
+ short y;
+} PSXSPoint_t;
+
+typedef struct PSXRECTTAG
+{
+ short x0;
+ short x1;
+ short y0;
+ short y1;
+} PSXRect_t;
+
+// linux defines for some windows stuff
+
+#define FALSE 0
+#define TRUE 1
+#define BOOL unsigned short
+#define LOWORD(l)           ((unsigned short)(l))
+#define HIWORD(l)           ((unsigned short)(((uint32_t)(l) >> 16) & 0xFFFF))
+#define max(a,b)            (((a) > (b)) ? (a) : (b))
+#define min(a,b)            (((a) < (b)) ? (a) : (b))
+#define DWORD uint32_t
+#ifndef __int64
+#define __int64 long long int
+#endif
+
+typedef struct RECTTAG
+{
+ int left;
+ int top;
+ int right;
+ int bottom;
+}RECT;
+
+/////////////////////////////////////////////////////////////////////////////
+
+typedef struct TWINTAG
+{
+ PSXRect_t  Position;
+ int xmask, ymask;
+} TWin_t;
+
+/////////////////////////////////////////////////////////////////////////////
+
+typedef struct PSXDISPLAYTAG
+{
+ PSXPoint_t  DisplayModeNew;
+ PSXPoint_t  DisplayMode;
+ PSXPoint_t  DisplayPosition;
+ PSXPoint_t  DisplayEnd;
+
+ int32_t        Double;
+ int32_t        Height;
+ int32_t        PAL;
+ int32_t        InterlacedNew;
+ int32_t        Interlaced;
+ int32_t        RGB24New;
+ int32_t        RGB24;
+ PSXSPoint_t DrawOffset;
+ int32_t        Disabled;
+ PSXRect_t   Range;
+
+} PSXDisplay_t;
+
+/////////////////////////////////////////////////////////////////////////////
+
+// draw.c
+
+extern int32_t           GlobalTextAddrX,GlobalTextAddrY,GlobalTextTP;
+extern int32_t           GlobalTextABR,GlobalTextPAGE;
+extern short          ly0,lx0,ly1,lx1,ly2,lx2,ly3,lx3;
+extern long           lLowerpart;
+extern BOOL           bCheckMask;
+extern unsigned short sSetMask;
+extern unsigned long  lSetMask;
+extern short          g_m1;
+extern short          g_m2;
+extern short          g_m3;
+extern short          DrawSemiTrans;
+
+// prim.c
+
+extern BOOL           bUsingTWin;
+extern TWin_t         TWin;
+extern void (*primTableJ[256])(unsigned char *);
+extern void (*primTableSkip[256])(unsigned char *);
+extern unsigned short  usMirror;
+extern int            iDither;
+extern uint32_t  dwCfgFixes;
+extern uint32_t  dwActFixes;
+extern int            iUseFixes;
+extern int            iUseDither;
+extern BOOL           bDoVSyncUpdate;
+extern int32_t           drawX;
+extern int32_t           drawY;
+extern int32_t           drawW;
+extern int32_t           drawH;
+
+// gpu.h
+
+#define OPAQUEON   10
+#define OPAQUEOFF  11
+
+#define KEY_RESETTEXSTORE 1
+#define KEY_SHOWFPS       2
+#define KEY_RESETOPAQUE   4
+#define KEY_RESETDITHER   8
+#define KEY_RESETFILTER   16
+#define KEY_RESETADVBLEND 32
+#define KEY_BADTEXTURES   128
+#define KEY_CHECKTHISOUT  256
+
+#if !defined(__BIG_ENDIAN__) || defined(__x86_64__) || defined(__i386__)
+#ifndef __LITTLE_ENDIAN__
+#define __LITTLE_ENDIAN__
+#endif
+#endif
+
+#ifdef __LITTLE_ENDIAN__
+#define RED(x) (x & 0xff)
+#define BLUE(x) ((x>>16) & 0xff)
+#define GREEN(x) ((x>>8) & 0xff)
+#define COLOR(x) (x & 0xffffff)
+#elif defined __BIG_ENDIAN__
+#define RED(x) ((x>>24) & 0xff)
+#define BLUE(x) ((x>>8) & 0xff)
+#define GREEN(x) ((x>>16) & 0xff)
+#define COLOR(x) SWAP32(x & 0xffffff)
+#endif
+
+PSXDisplay_t      PSXDisplay;
+unsigned char  *psxVub;
+signed   char  *psxVsb;
+unsigned short *psxVuw;
+unsigned short *psxVuw_eom;
+signed   short *psxVsw;
+uint32_t *psxVul;
+int32_t  *psxVsl;
+
+long              lGPUstatusRet;
+uint32_t          lGPUInfoVals[16];
+
+VRAMLoad_t        VRAMWrite;
+VRAMLoad_t        VRAMRead;
+
+DATAREGISTERMODES DataWriteMode;
+DATAREGISTERMODES DataReadMode;
+
+BOOL           bCheckMask = FALSE;
+unsigned short sSetMask = 0;
+unsigned long  lSetMask = 0;
+long           lLowerpart;
+
+#include "../dfxvideo/soft.c"
+#include "../dfxvideo/prim.c"
+
+/////////////////////////////////////////////////////////////////////////////
+
+int renderer_init(void)
+{
+ psxVub=(void *)gpu.vram;
+
+ psxVsb=(signed char *)psxVub;                         // different ways of accessing PSX VRAM
+ psxVsw=(signed short *)psxVub;
+ psxVsl=(int32_t *)psxVub;
+ psxVuw=(unsigned short *)psxVub;
+ psxVul=(uint32_t *)psxVub;
+
+ psxVuw_eom=psxVuw+1024*512;                           // pre-calc of end of vram
+
+ PSXDisplay.RGB24        = FALSE;                      // init some stuff
+ PSXDisplay.Interlaced   = FALSE;
+ PSXDisplay.DrawOffset.x = 0;
+ PSXDisplay.DrawOffset.y = 0;
+ PSXDisplay.DisplayMode.x= 320;
+ PSXDisplay.DisplayMode.y= 240;
+ PSXDisplay.Disabled     = FALSE;
+ PSXDisplay.Range.x0=0;
+ PSXDisplay.Range.x1=0;
+ PSXDisplay.Double = 1;
+
+ DataWriteMode = DR_NORMAL;
+ lGPUstatusRet = 0x14802000;
+
+ return 0;
+}
+
+extern const unsigned char cmd_lengths[256];
+
+void do_cmd_list(unsigned int *list, int list_len)
+{
+  unsigned int cmd, len;
+
+  unsigned int *list_end = list + list_len;
+
+  for (; list < list_end; list += 1 + len)
+  {
+    short *slist = (void *)list;
+    cmd = *list >> 24;
+    len = cmd_lengths[cmd];
+
+    primTableJ[cmd]((void *)list);
+
+    switch(cmd)
+    {
+      case 0x48 ... 0x4F:
+      {
+        u32 num_vertexes = 1;
+        u32 *list_position = &(list[2]);
+
+        while(1)
+        {
+          if((*list_position & 0xf000f000) == 0x50005000 || list_position >= list_end)
+            break;
+
+          list_position++;
+          num_vertexes++;
+        }
+
+        if(num_vertexes > 2)
+          len += (num_vertexes - 2);
+
+        break;
+      }
+
+      case 0x58 ... 0x5F:
+      {
+        u32 num_vertexes = 1;
+        u32 *list_position = &(list[2]);
+
+        while(1)
+        {
+          if((*list_position & 0xf000f000) == 0x50005000 || list_position >= list_end)
+            break;
+
+          list_position += 2;
+          num_vertexes++;
+        }
+
+        if(num_vertexes > 2)
+          len += ((num_vertexes * 2) - 2);
+
+        break;
+      }
+
+      case 0xA0:          //  sys -> vid
+      {
+        u32 load_width = slist[4];
+        u32 load_height = slist[5];
+        u32 load_size = load_width * load_height;
+
+        len += load_size / 2;
+        break;
+      }
+    }
+  }
+}
+
+void renderer_invalidate_caches(int x, int y, int w, int h)
+{
+}
+
+void renderer_flush_queues(void)
+{
+}