* *
***************************************************************************/
+#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;
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;
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?
}
#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:
#include "../gpulib/gpu.c"
-static int is_opened;
-
static void set_vram(void *vram)
{
psxVub=vram;
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_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;
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;
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)
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;
long GPUclose(void)
{
+ if (!is_opened)
+ return 0;
is_opened = 0;
KillDisplayLists();
+ clear_gl_state_for_menu();
GLcleanup(); // close OGL
return 0;
}
cbs->pl_set_gpu_caps(GPU_CAP_OWNS_DISPLAY);
if (is_opened && cbs->gles_display != NULL && cbs->gles_surface != NULL) {
- // HACK..
- GPUclose();
- GPUopen(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);
DisplayText(buf, 1);
}
}
+
+void renderer_sync(void)
+{
+}
+
+void renderer_notify_update_lace(int updated)
+{
+}