X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?p=pcsx_rearmed.git;a=blobdiff_plain;f=plugins%2Fgpu-gles%2Fgpulib_if.c;h=1f4a23db423022b6329e34261e92fb352b9b8b40;hp=a8daa5e9745fd1615a288182f2fd552d6d78cf22;hb=HEAD;hpb=7890a708c71f94c549b3e87f7471647a014d4038 diff --git a/plugins/gpu-gles/gpulib_if.c b/plugins/gpu-gles/gpulib_if.c index a8daa5e9..f00c4592 100644 --- a/plugins/gpu-gles/gpulib_if.c +++ b/plugins/gpu-gles/gpulib_if.c @@ -16,19 +16,21 @@ * * ***************************************************************************/ +#include "gpuStdafx.h" #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; 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; @@ -40,15 +42,15 @@ GLfloat gl_z=0.0f; 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; @@ -84,6 +86,8 @@ static void PaintBlackBorders(void) glEnable(GL_SCISSOR_TEST); glError(); } +static void fps_update(void); + void updateDisplay(void) { bFakeFrontBuffer=FALSE; @@ -120,8 +124,11 @@ void updateDisplay(void) } if(iDrawnSomething) + { + fps_update(); eglSwapBuffers(display, surface); - iDrawnSomething=0; + iDrawnSomething=0; + } if(lClearOnSwap) // clear buffer after swap? { @@ -189,13 +196,13 @@ void updateFrontDisplay(void) 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? @@ -306,7 +313,7 @@ if(bUp) updateDisplay(); // yeah, real update (swap } #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) { @@ -473,10 +480,15 @@ 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; @@ -494,18 +506,43 @@ int renderer_init(void) 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); @@ -513,41 +550,47 @@ 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) { - 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; } @@ -565,6 +608,13 @@ void do_cmd_list(unsigned int *list, int list_len) #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) @@ -577,7 +627,7 @@ 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; @@ -620,9 +670,22 @@ void vout_update(void) } } -long GPUopen(void **dpy) +void vout_blank(void) { - iResX = 800; iResY = 480; +} + +void vout_set_config(const struct rearmed_cbs *cbs) +{ +} + +static struct rearmed_cbs *cbs; + +long GPUopen(unsigned long *disp, char *cap, char *cfg) +{ + int ret; + + iResX = cbs->screen_w; + iResY = cbs->screen_h; rRatioRect.left = rRatioRect.top=0; rRatioRect.right = iResX; rRatioRect.bottom = iResY; @@ -632,27 +695,27 @@ long GPUopen(void **dpy) CSTEXTURE = CSVERTEX = CSCOLOR = 0; InitializeTextureStore(); // init texture mem - is_opened = 1; - return GLinitialize(); + ret = GLinitialize(cbs->gles_display, cbs->gles_surface); + 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; @@ -669,15 +732,23 @@ void renderer_set_config(const struct rearmed_cbs *cbs_) 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), @@ -687,3 +758,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); + } +}