* *
***************************************************************************/
+#include "gpuStdafx.h"
#include "gpuDraw.c"
#include "gpuTexture.c"
#include "gpuPrim.c"
short DrawSemiTrans;
short ly0,lx0,ly1,lx1,ly2,lx2,ly3,lx3; // global psx vertex coords
-long GlobalTextAddrX,GlobalTextAddrY,GlobalTextTP;
-long GlobalTextREST,GlobalTextABR,GlobalTextPAGE;
+int GlobalTextAddrX,GlobalTextAddrY,GlobalTextTP;
+int GlobalTextREST,GlobalTextABR,GlobalTextPAGE;
-unsigned long dwGPUVersion;
+unsigned int dwGPUVersion;
int iGPUHeight=512;
int iGPUHeightMask=511;
int GlobalTextIL;
BOOL bNeedInterlaceUpdate;
BOOL bNeedRGB24Update;
BOOL bChangeWinMode;
-long lGPUstatusRet;
-unsigned long ulGPUInfoVals[16];
+int lGPUstatusRet;
+unsigned int ulGPUInfoVals[16];
VRAMLoad_t VRAMWrite;
VRAMLoad_t VRAMRead;
int iDataWriteMode;
int iDataReadMode;
-long lClearOnSwap;
-long lClearOnSwapColor;
+int lClearOnSwap;
+int lClearOnSwapColor;
BOOL bSkipNextFrame;
PSXDisplay_t PSXDisplay;
static void ChangeDispOffsetsX(void) // CENTER X
{
-long lx,l;short sO;
+int lx,l;short sO;
if(!PSXDisplay.Range.x1) return; // some range given?
l=PSXDisplay.DisplayMode.x;
-l*=(long)PSXDisplay.Range.x1; // some funky calculation
+l*=(int)PSXDisplay.Range.x1; // some funky calculation
l/=2560;lx=l;l&=0xfffffff8;
if(l==PreviousPSXDisplay.Range.x1) return; // some change?
}
#define GPUwriteStatus_ext GPUwriteStatus_ext // for gpulib to see this
-void GPUwriteStatus_ext(unsigned long gdata)
+void GPUwriteStatus_ext(unsigned int gdata)
{
switch((gdata>>24)&0xff)
{
static int is_opened;
-int renderer_init(void)
+static void set_vram(void *vram)
{
- psxVub=(void *)gpu.vram;
+ psxVub=vram;
psxVuw=(unsigned short *)psxVub;
+}
+
+int renderer_init(void)
+{
+ set_vram(gpu.vram);
PSXDisplay.RGB24 = FALSE; // init some stuff
PSXDisplay.Interlaced = FALSE;
return 0;
}
+void renderer_finish(void)
+{
+}
+
+void renderer_notify_res_change(void)
+{
+}
+
+void renderer_notify_scanout_change(int x, int y)
+{
+}
+
extern const unsigned char cmd_lengths[256];
-void do_cmd_list(unsigned int *list, int list_len)
+// XXX: mostly dupe code from soft peops
+int do_cmd_list(uint32_t *list, int list_len,
+ int *cycles_sum_out, int *cycles_last, int *last_cmd)
{
unsigned int cmd, len;
-
+ unsigned int *list_start = list;
unsigned int *list_end = list + list_len;
for (; list < list_end; list += 1 + len)
{
cmd = *list >> 24;
len = cmd_lengths[cmd];
+ if (list + 1 + len > list_end) {
+ cmd = -1;
+ break;
+ }
+
+#ifndef TEST
+ if (cmd == 0xa0 || cmd == 0xc0)
+ break; // image i/o, forward to upper layer
+ else if ((cmd & 0xf8) == 0xe0)
+ gpu.ex_regs[cmd & 7] = list[0];
+#endif
primTableJ[cmd]((void *)list);
{
case 0x48 ... 0x4F:
{
- uint32_t num_vertexes = 1;
- uint32_t *list_position = &(list[2]);
+ uint32_t num_vertexes = 2;
+ uint32_t *list_position = &(list[3]);
while(1)
{
- if((*list_position & 0xf000f000) == 0x50005000 || list_position >= list_end)
+ if(list_position >= list_end) {
+ cmd = -1;
+ goto breakloop;
+ }
+
+ if((*list_position & 0xf000f000) == 0x50005000)
break;
list_position++;
num_vertexes++;
}
- if(num_vertexes > 2)
- len += (num_vertexes - 2);
-
+ len += (num_vertexes - 2);
break;
}
case 0x58 ... 0x5F:
{
- uint32_t num_vertexes = 1;
- uint32_t *list_position = &(list[2]);
+ uint32_t num_vertexes = 2;
+ uint32_t *list_position = &(list[4]);
while(1)
{
- if((*list_position & 0xf000f000) == 0x50005000 || list_position >= list_end)
+ if(list_position >= list_end) {
+ cmd = -1;
+ goto breakloop;
+ }
+
+ if((*list_position & 0xf000f000) == 0x50005000)
break;
list_position += 2;
num_vertexes++;
}
- if(num_vertexes > 2)
- len += (num_vertexes - 2) * 2;
-
+ len += (num_vertexes - 2) * 2;
break;
}
#endif
}
}
+
+breakloop:
+ gpu.ex_regs[1] &= ~0x1ff;
+ gpu.ex_regs[1] |= lGPUstatusRet & 0x1ff;
+
+ *last_cmd = cmd;
+ return list - list_start;
}
void renderer_sync_ecmds(uint32_t *ecmds)
cmdSTP((unsigned char *)&ecmds[6]);
}
-void renderer_update_caches(int x, int y, int w, int h)
+void renderer_update_caches(int x, int y, int w, int h, int state_changed)
{
VRAMWrite.x = x;
VRAMWrite.y = y;
}
}
+void vout_blank(void)
+{
+}
+
+void vout_set_config(const struct rearmed_cbs *cbs)
+{
+}
+
static struct rearmed_cbs *cbs;
-long GPUopen(void **dpy)
+long GPUopen(unsigned long *disp, char *cap, char *cfg)
{
int ret;
InitializeTextureStore(); // init texture mem
- ret = GLinitialize();
+ ret = GLinitialize(cbs->gles_display, cbs->gles_surface);
MakeDisplayLists();
is_opened = 1;
bUseFastMdec = cbs->gpu_peopsgl.bUseFastMdec;
iTexGarbageCollection = cbs->gpu_peopsgl.iTexGarbageCollection;
iVRamSize = cbs->gpu_peopsgl.iVRamSize;
-}
-void vout_set_config(const struct rearmed_cbs *cbs)
-{
+ if (cbs->pl_set_gpu_caps)
+ cbs->pl_set_gpu_caps(GPU_CAP_OWNS_DISPLAY);
+
+ if (is_opened && cbs->gles_display != NULL && cbs->gles_surface != NULL) {
+ // HACK..
+ GPUclose();
+ GPUopen(NULL, NULL, NULL);
+ }
+
+ set_vram(gpu.vram);
}
void SetAspectRatio(void)
{
- cbs->pl_get_layer_pos(&rRatioRect.left, &rRatioRect.top, &rRatioRect.right, &rRatioRect.bottom);
+ if (cbs->pl_get_layer_pos)
+ cbs->pl_get_layer_pos(&rRatioRect.left, &rRatioRect.top, &rRatioRect.right, &rRatioRect.bottom);
glScissor(rRatioRect.left,
iResY-(rRatioRect.top+rRatioRect.bottom),