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=c669b634286224694133d6b6223cfef136e92d1f;hb=HEAD;hpb=b243416b907e6ce366b051e77ed8a434f7668d5d diff --git a/plugins/gpu-gles/gpulib_if.c b/plugins/gpu-gles/gpulib_if.c index c669b634..a09b3fb1 100644 --- a/plugins/gpu-gles/gpulib_if.c +++ b/plugins/gpu-gles/gpulib_if.c @@ -16,20 +16,23 @@ * * ***************************************************************************/ +#include "gpuStdafx.h" #include "gpuDraw.c" #include "gpuTexture.c" #include "gpuPrim.c" #include "hud.c" +static int is_opened; + 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; @@ -41,15 +44,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; @@ -195,13 +198,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? @@ -312,8 +315,11 @@ 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) { + if (!is_opened) + return; + switch((gdata>>24)&0xff) { case 0x00: @@ -477,12 +483,15 @@ switch((gdata>>24)&0xff) #include "../gpulib/gpu.c" -static int is_opened; +static void set_vram(void *vram) +{ + psxVub=vram; + psxVuw=(unsigned short *)psxVub; +} int renderer_init(void) { - psxVub=(void *)gpu.vram; - psxVuw=(unsigned short *)psxVub; + set_vram(gpu.vram); PSXDisplay.RGB24 = FALSE; // init some stuff PSXDisplay.Interlaced = FALSE; @@ -500,10 +509,51 @@ int renderer_init(void) return 0; } +static void clear_gl_state_for_menu(void) +{ + static const GLenum caps[] = { + GL_ALPHA_TEST, GL_BLEND, GL_COLOR_LOGIC_OP, GL_COLOR_MATERIAL, + GL_CULL_FACE, GL_DEPTH_TEST, GL_FOG, GL_LIGHTING, GL_NORMALIZE, + GL_POLYGON_OFFSET_FILL, GL_RESCALE_NORMAL, GL_SAMPLE_ALPHA_TO_COVERAGE, + GL_SAMPLE_ALPHA_TO_ONE, GL_SAMPLE_COVERAGE, GL_SCISSOR_TEST, GL_STENCIL_TEST + }; + static const GLenum cstates[] = { + GL_COLOR_ARRAY, GL_NORMAL_ARRAY, GL_POINT_SIZE_ARRAY_OES + }; + size_t i; + for (i = 0; i < sizeof(caps) / sizeof(caps[0]); i++) + glDisable(caps[i]); + for (i = 0; i < 6; i++) + glDisable(GL_CLIP_PLANE0 + i); + for (i = 0; i < 8; i++) + glDisable(GL_LIGHT0 + i); + for (i = 0; i < sizeof(cstates) / sizeof(cstates[0]); i++) + glDisableClientState(cstates[i]); + + glColor4ub(255, 255, 255, 255); + glLoadIdentity(); + glEnable(GL_TEXTURE_2D); + glEnableClientState(GL_TEXTURE_COORD_ARRAY); + glEnableClientState(GL_VERTEX_ARRAY); +} + +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]; // XXX: mostly dupe code from soft peops -int do_cmd_list(unsigned int *list, int list_len, int *last_cmd) +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; @@ -536,7 +586,12 @@ int do_cmd_list(unsigned int *list, int list_len, int *last_cmd) 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++; @@ -554,7 +609,12 @@ int do_cmd_list(unsigned int *list, int list_len, int *last_cmd) 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; @@ -580,6 +640,7 @@ int do_cmd_list(unsigned int *list, int list_len, int *last_cmd) } } +breakloop: gpu.ex_regs[1] &= ~0x1ff; gpu.ex_regs[1] |= lGPUstatusRet & 0x1ff; @@ -597,7 +658,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; @@ -625,27 +686,42 @@ int vout_finish(void) return 0; } -void vout_update(void) +int vout_update(void) { if(PSXDisplay.Interlaced) // interlaced mode? { if(PSXDisplay.DisplayMode.x>0 && PSXDisplay.DisplayMode.y>0) { updateDisplay(); // -> swap buffers (new frame) + return 1; } } else if(bRenderFrontBuffer) // no interlace mode? and some stuff in front has changed? { updateFrontDisplay(); // -> update front buffer + return 1; } + return 0; +} + +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; + if (is_opened) { + fprintf(stderr, "double GPUopen\n"); + return -1; + } iResX = cbs->screen_w; iResY = cbs->screen_h; rRatioRect.left = rRatioRect.top=0; @@ -658,7 +734,7 @@ long GPUopen(void **dpy) InitializeTextureStore(); // init texture mem - ret = GLinitialize(); + ret = GLinitialize(cbs->gles_display, cbs->gles_surface); MakeDisplayLists(); is_opened = 1; @@ -667,9 +743,12 @@ long GPUopen(void **dpy) long GPUclose(void) { + if (!is_opened) + return 0; is_opened = 0; KillDisplayLists(); + clear_gl_state_for_menu(); GLcleanup(); // close OGL return 0; } @@ -694,15 +773,26 @@ 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) { + if (cbs->gles_display != display || cbs->gles_surface != surface) { + // HACK... + fprintf(stderr, "gles reinit hack\n"); + 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), @@ -729,3 +819,11 @@ static void fps_update(void) DisplayText(buf, 1); } } + +void renderer_sync(void) +{ +} + +void renderer_notify_update_lace(int updated) +{ +}