#include "../platform.h" #include "sh4.h" #define TA_SQ_ADDR (unsigned int *)(void *) \ (0xe0000000 | (((unsigned long)0x10000000) & 0x03ffffe0)) #define QACRTA ((((unsigned int)0x10000000)>>26)<<2)&0x1c #define PVR_VERTEX_BUF_SIZE 2560 * 256 void InitGPU(_Bool autosort, _Bool fsaa) { pvr_init_params_t params = { /* Enable opaque and translucent polygons with size 32 and 32 */ {PVR_BINSIZE_32, PVR_BINSIZE_0, PVR_BINSIZE_32, PVR_BINSIZE_0, PVR_BINSIZE_32}, PVR_VERTEX_BUF_SIZE, /* Vertex buffer size */ 0, /* No DMA */ fsaa, /* No FSAA */ (autosort) ? 0 : 1 /* Disable translucent auto-sorting to match traditional GL */ }; pvr_init(¶ms); } void SceneBegin() { pvr_wait_ready(); pvr_scene_begin(); QACR0 = QACRTA; QACR1 = QACRTA; } void SceneListBegin(GPUList list) { pvr_list_begin(list); } void SceneListSubmit(void* src, int n) { uint32_t *d = (uint32_t*) TA_SQ_ADDR; uint32_t *s = src; /* fill/write queues as many times necessary */ while(n--) { __asm__("pref @%0" : : "r"(s + 8)); /* prefetch 32 bytes for next loop */ d[0] = *(s++); d[1] = *(s++); d[2] = *(s++); d[3] = *(s++); d[4] = *(s++); d[5] = *(s++); d[6] = *(s++); d[7] = *(s++); __asm__("pref @%0" : : "r"(d)); d += 8; } /* Wait for both store queues to complete */ d = (uint32_t *)0xe0000000; d[0] = d[8] = 0; } void SceneListFinish() { pvr_list_finish(); } void SceneFinish() { pvr_scene_finish(); } const VideoMode* GetVideoMode() { static VideoMode mode; mode.width = vid_mode->width; mode.height = vid_mode->height; return &mode; }