#include "gpuDraw.c"
#include "gpuTexture.c"
#include "gpuPrim.c"
+#include "hud.c"
static const short dispWidths[8] = {256,320,512,640,368,384,512,640};
short g_m1,g_m2,g_m3;
glEnable(GL_SCISSOR_TEST); glError();
}
+static void fps_update(void);
+
void updateDisplay(void)
{
bFakeFrontBuffer=FALSE;
}
if(iDrawnSomething)
+ {
+ fps_update();
eglSwapBuffers(display, surface);
- iDrawnSomething=0;
+ iDrawnSomething=0;
+ }
if(lClearOnSwap) // clear buffer after swap?
{
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(unsigned int *list, int list_len, 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)
{
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)
{
num_vertexes++;
}
- if(num_vertexes > 2)
- len += (num_vertexes - 2) * 2;
-
+ len += (num_vertexes - 2) * 2;
break;
}
#endif
}
}
+
+ 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)
}
}
+static struct rearmed_cbs *cbs;
+
long GPUopen(void **dpy)
{
- iResX = 800; iResY = 480;
+ int ret;
+
+ iResX = cbs->screen_w;
+ iResY = cbs->screen_h;
rRatioRect.left = rRatioRect.top=0;
rRatioRect.right = iResX;
rRatioRect.bottom = iResY;
CSTEXTURE = CSVERTEX = CSCOLOR = 0;
InitializeTextureStore(); // init texture mem
- is_opened = 1;
- return GLinitialize();
+ ret = GLinitialize();
+ MakeDisplayLists();
+
+ is_opened = 1;
+ return ret;
}
long GPUclose(void)
{
is_opened = 0;
+ KillDisplayLists();
GLcleanup(); // close OGL
return 0;
}
-//#include "../../frontend/plugin_lib.h"
-
-static const struct rearmed_cbs *cbs;
-
/* acting as both renderer and vout handler here .. */
void renderer_set_config(const struct rearmed_cbs *cbs_)
{
- cbs = cbs_;
+ cbs = (void *)cbs_; // ugh..
iOffscreenDrawing = 0;
iZBufferDepth = 0;
rRatioRect.right,rRatioRect.bottom);
glError();
}
+
+static void fps_update(void)
+{
+ char buf[16];
+
+ cbs->flip_cnt++;
+ if(cbs->flips_per_sec != 0)
+ {
+ snprintf(buf,sizeof(buf),"%2d %4.1f",cbs->flips_per_sec,cbs->vsps_cur);
+ DisplayText(buf, 0);
+ }
+ if(cbs->cpu_usage != 0)
+ {
+ snprintf(buf,sizeof(buf),"%3d",cbs->cpu_usage);
+ DisplayText(buf, 1);
+ }
+}