frontend: initial libretro support
[pcsx_rearmed.git] / plugins / gpu-gles / gpulib_if.c
index a8daa5e..ce7f00d 100644 (file)
@@ -19,6 +19,7 @@
 #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;
@@ -84,6 +85,8 @@ static void PaintBlackBorders(void)
  glEnable(GL_SCISSOR_TEST); glError();
 }
 
+static void fps_update(void);
+
 void updateDisplay(void)
 {
  bFakeFrontBuffer=FALSE;
@@ -120,8 +123,11 @@ void updateDisplay(void)
  }
 
  if(iDrawnSomething)
+ {
+  fps_update();
   eglSwapBuffers(display, surface);
- iDrawnSomething=0;
+  iDrawnSomething=0;
+ }
 
  if(lClearOnSwap)                                     // clear buffer after swap?
  {
@@ -496,16 +502,28 @@ int renderer_init(void)
 
 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);
 
@@ -513,8 +531,8 @@ void do_cmd_list(unsigned int *list, int list_len)
     {
       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)
         {
@@ -525,16 +543,14 @@ void do_cmd_list(unsigned int *list, int list_len)
           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)
         {
@@ -545,9 +561,7 @@ void do_cmd_list(unsigned int *list, int list_len)
           num_vertexes++;
         }
 
-        if(num_vertexes > 2)
-          len += (num_vertexes - 2) * 2;
-
+        len += (num_vertexes - 2) * 2;
         break;
       }
 
@@ -565,6 +579,12 @@ void do_cmd_list(unsigned int *list, int list_len)
 #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)
@@ -620,9 +640,14 @@ void vout_update(void)
  }
 }
 
+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;
@@ -632,27 +657,27 @@ long GPUopen(void **dpy)
  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;
@@ -677,7 +702,8 @@ void vout_set_config(const struct rearmed_cbs *cbs)
 
 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),
@@ -687,3 +713,20 @@ void SetAspectRatio(void)
            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);
+ }
+}