diff --git a/src/rdp.cpp b/src/rdp.cpp index 15b397f..d6701fb 100644 --- a/src/rdp.cpp +++ b/src/rdp.cpp @@ -744,6 +744,11 @@ static void rdp_set_color_image(uint32_t w1, uint32_t w2) rdpFbSize = (w1 >> 19) & 0x3; rdpFbWidth = (w1 & 0x3ff) + 1; rdpFbAddress = w2 & 0x0ffffff; + + int start = rdpFbAddress >> 2; + for (int i = 0; i < 4; ++i) { + rdram[start++] = fingerprint[i]; + } } /*****************************************************************************/ diff --git a/src/rgl.cpp b/src/rgl.cpp index 552dc94..077157b 100644 --- a/src/rgl.cpp +++ b/src/rgl.cpp @@ -1159,19 +1159,33 @@ void rglClearChunks() void rglUpdate() { - int i; - - if (old_vi_origin == vi_origin) { - //printf("same\n"); - return; - } - old_vi_origin = vi_origin; + int i; - DUMP("updating vi_origin %x vi_hstart %d vi_vstart %d\n", - vi_origin, *gfx.VI_H_START_REG, *gfx.VI_V_START_REG); + if (old_vi_origin == vi_origin) { + //printf("same\n"); + return; + } + old_vi_origin = vi_origin; + + DUMP("updating vi_origin %x vi_hstart %d vi_vstart %d\n", + vi_origin, *gfx.VI_H_START_REG, *gfx.VI_V_START_REG); + + glPolygonMode(GL_FRONT_AND_BACK, wireframe ? GL_LINE : GL_FILL); + + for (i = nbRBuffers - 1; i >= 0; i--) { + int start = rBuffers[i].addressStart >> 2; + for (int j = 0; j < 4; ++j) { + if (rdram[start++] != fingerprint[j]) { + rBuffers[i].flags |= RGL_RB_RAMMOD; + break; + } + else + { + rBuffers[i].flags &= ~RGL_RB_RAMMOD; + } + } + } - glPolygonMode(GL_FRONT_AND_BACK, wireframe? GL_LINE : GL_FILL); - if (no_dlists) rglDisplayCFB(); else { diff --git a/src/rgl.h b/src/rgl.h index dd19ba5..3b8a227 100644 --- a/src/rgl.h +++ b/src/rgl.h @@ -59,6 +59,8 @@ extern PFNGLMULTITEXCOORD2FPROC xglMultiTexCoord2f; //#define RGL_USE_GLUT +const int fingerprint[4] = { 2, 6, 4, 3 }; + struct rglSettings_t { int hiresFb; int resX, resY; diff --git a/src/rgl_tiles.cpp b/src/rgl_tiles.cpp index ee09ec4..e0cc93a 100644 --- a/src/rgl_tiles.cpp +++ b/src/rgl_tiles.cpp @@ -208,6 +208,7 @@ void rglTile(rdpTile_t & tile, rglTile_t & rtile, int recth) //while (0) { CIRCLEQ_FOREACH(rglRenderBuffer_t, buffer, &rBufferHead, link) { //if (buffer->flags & RGL_RB_DEPTH) continue; + if (buffer->flags & RGL_RB_RAMMOD) continue; if (buffer->area.xh != 8192) buffer->addressStop = buffer->addressStart + buffer->line * ((buffer->area.yl >>2)+1);