From 6d8782a1f9d9d9d51b8e5f5426895576d26fc1be Mon Sep 17 00:00:00 2001 From: notaz Date: Mon, 25 Sep 2017 03:00:20 +0300 Subject: [PATCH] don't miss the sprite check DrawAllSprites depends on HighLnSpr, so prepare in DrawAllSprites was a bad idea as lots of things may have changed --- pico/draw.c | 19 +++++++++---------- pico/draw_arm.S | 11 ----------- 2 files changed, 9 insertions(+), 21 deletions(-) diff --git a/pico/draw.c b/pico/draw.c index 9ad32da..7b4dd99 100644 --- a/pico/draw.c +++ b/pico/draw.c @@ -954,7 +954,7 @@ static void DrawSpritesHiAS(unsigned char *sprited, int sh) // Index + 0 : hhhhvvvv ----hhvv yyyyyyyy yyyyyyyy // v, h: vert./horiz. size // Index + 4 : xxxxxxxx xxxxxxxx pccvhnnn nnnnnnnn // x: x coord + 8 -void PrepareSprites(int full) +static NOINLINE void PrepareSprites(int full) { const struct PicoVideo *pvid=&Pico.video; const struct PicoEState *est=&Pico.est; @@ -1117,16 +1117,9 @@ found:; static void DrawAllSprites(unsigned char *sprited, int prio, int sh, struct PicoEState *est) { - int rs = est->rendstatus; unsigned char *p; int cnt; - if (rs & (PDRAW_SPRITES_MOVED|PDRAW_DIRTY_SPRITES)) { - //elprintf(EL_STATUS, "PrepareSprites(%i)", (rs>>4)&1); - PrepareSprites(rs & PDRAW_DIRTY_SPRITES); - est->rendstatus = rs & ~(PDRAW_SPRITES_MOVED|PDRAW_DIRTY_SPRITES); - } - cnt = sprited[0] & 0x7f; if (cnt == 0) return; @@ -1288,6 +1281,12 @@ static int DrawDisplay(int sh) int win=0,edge=0,hvwind=0; int maxw,maxcells; + if (est->rendstatus & (PDRAW_SPRITES_MOVED|PDRAW_DIRTY_SPRITES)) { + // elprintf(EL_STATUS, "PrepareSprites(%i)", (est->rendstatus>>4)&1); + PrepareSprites(est->rendstatus & PDRAW_DIRTY_SPRITES); + est->rendstatus &= ~(PDRAW_SPRITES_MOVED|PDRAW_DIRTY_SPRITES); + } + est->rendstatus &= ~(PDRAW_SHHI_DONE|PDRAW_PLANE_HI_PRIO); if (pvid->reg[12]&1) { @@ -1331,7 +1330,7 @@ static int DrawDisplay(int sh) DrawLayer(0|(sh<<1), HighCacheA, 0, maxcells, est); /* - sprites low - */ if (!(PicoDrawMask & PDRAW_SPRITES_LOW_ON)); - else if (Pico.est.rendstatus & PDRAW_INTERLACE) + else if (est->rendstatus & PDRAW_INTERLACE) DrawAllSpritesInterlace(0, sh); else if (sprited[1] & SPRL_HAVE_LO) DrawAllSprites(sprited, 0, sh, est); @@ -1352,7 +1351,7 @@ static int DrawDisplay(int sh) DrawTilesFromCache(HighCacheA, sh, maxw, est); /* - sprites hi - */ if (!(PicoDrawMask & PDRAW_SPRITES_HI_ON)); - else if (Pico.est.rendstatus & PDRAW_INTERLACE) + else if (est->rendstatus & PDRAW_INTERLACE) DrawAllSpritesInterlace(1, sh); // have sprites without layer pri bit ontop of sprites with that bit else if ((sprited[1] & 0xd0) == 0xd0 && (PicoOpt & POPT_ACC_SPRITES)) diff --git a/pico/draw_arm.S b/pico/draw_arm.S index 71db183..023b0a2 100644 --- a/pico/draw_arm.S +++ b/pico/draw_arm.S @@ -1101,17 +1101,6 @@ DrawSpriteSHi: DrawAllSprites: orr r1, r2, r1, lsl #1 - ldr r12,[r3, #OFS_rendstatus] - tst r12,#(PDRAW_DIRTY_SPRITES|PDRAW_SPRITES_MOVED) - beq das_no_prep - stmfd sp!, {r0,r1,r3,lr} - and r0, r12,#PDRAW_DIRTY_SPRITES - bic r12,r12,#(PDRAW_DIRTY_SPRITES|PDRAW_SPRITES_MOVED) - str r12,[r3, #OFS_rendstatus] - bl PrepareSprites - ldmfd sp!, {r0,r1,r3,lr} - -das_no_prep: ldr r2, [r0] ands r2, r2, #0x7f bxeq lr -- 2.39.2