Merge pull request #1484 from Squall-Leonhart/Correct24bit

24bit was prone to corrupting g_pix on all renderers
This commit is contained in:
Squall Leonhart
2025-08-02 07:50:07 +10:00
committed by GitHub
2 changed files with 102 additions and 73 deletions

View File

@@ -3932,7 +3932,7 @@ void gbDrawLine()
if (gbBorderOn)
dest += gbBorderColumnSkip;
#ifndef __LIBRETRO__
*dest++ = 0; // for filters that read one pixel more
* dest++ = 0; // for filters that read one pixel more
#endif
} break;
case 16: {
@@ -3970,48 +3970,62 @@ void gbDrawLine()
*dest++ = 0; // for filters that read one pixel more
#endif
} break;
case 24: {
uint8_t* dest = (uint8_t*)g_pix + 3 * (gbBorderLineSkip * (register_LY + gbBorderRowSkip) + gbBorderColumnSkip);
uint8_t* dest = (uint8_t*)g_pix + (gbBorderLineSkip * 3) * (register_LY + gbBorderRowSkip + 1)
+ (gbBorderColumnSkip * 3);
for (size_t x = 0; x < kGBWidth;) {
*((uint32_t*)dest) = systemColorMap32[gbLineMix[x++]];
dest += 3;
*((uint32_t*)dest) = systemColorMap32[gbLineMix[x++]];
dest += 3;
*((uint32_t*)dest) = systemColorMap32[gbLineMix[x++]];
dest += 3;
*((uint32_t*)dest) = systemColorMap32[gbLineMix[x++]];
dest += 3;
uint32_t color = systemColorMap32[gbLineMix[x++]];
*dest++ = (uint8_t)(color & 0xFF);
*dest++ = (uint8_t)((color >> 8) & 0xFF);
*dest++ = (uint8_t)((color >> 16) & 0xFF);
color = systemColorMap32[gbLineMix[x++]];
*dest++ = (uint8_t)(color & 0xFF);
*dest++ = (uint8_t)((color >> 8) & 0xFF);
*dest++ = (uint8_t)((color >> 16) & 0xFF);
color = systemColorMap32[gbLineMix[x++]];
*dest++ = (uint8_t)(color & 0xFF);
*dest++ = (uint8_t)((color >> 8) & 0xFF);
*dest++ = (uint8_t)((color >> 16) & 0xFF);
color = systemColorMap32[gbLineMix[x++]];
*dest++ = (uint8_t)(color & 0xFF);
*dest++ = (uint8_t)((color >> 8) & 0xFF);
*dest++ = (uint8_t)((color >> 16) & 0xFF);
*((uint32_t*)dest) = systemColorMap32[gbLineMix[x++]];
dest += 3;
*((uint32_t*)dest) = systemColorMap32[gbLineMix[x++]];
dest += 3;
*((uint32_t*)dest) = systemColorMap32[gbLineMix[x++]];
dest += 3;
*((uint32_t*)dest) = systemColorMap32[gbLineMix[x++]];
dest += 3;
color = systemColorMap32[gbLineMix[x++]];
*dest++ = (uint8_t)(color & 0xFF);
*dest++ = (uint8_t)((color >> 8) & 0xFF);
*dest++ = (uint8_t)((color >> 16) & 0xFF);
color = systemColorMap32[gbLineMix[x++]];
*dest++ = (uint8_t)(color & 0xFF);
*dest++ = (uint8_t)((color >> 8) & 0xFF);
*dest++ = (uint8_t)((color >> 16) & 0xFF);
color = systemColorMap32[gbLineMix[x++]];
*dest++ = (uint8_t)(color & 0xFF);
*dest++ = (uint8_t)((color >> 8) & 0xFF);
*dest++ = (uint8_t)((color >> 16) & 0xFF);
color = systemColorMap32[gbLineMix[x++]];
*dest++ = (uint8_t)(color & 0xFF);
*dest++ = (uint8_t)((color >> 8) & 0xFF);
*dest++ = (uint8_t)((color >> 16) & 0xFF);
*((uint32_t*)dest) = systemColorMap32[gbLineMix[x++]];
dest += 3;
*((uint32_t*)dest) = systemColorMap32[gbLineMix[x++]];
dest += 3;
*((uint32_t*)dest) = systemColorMap32[gbLineMix[x++]];
dest += 3;
*((uint32_t*)dest) = systemColorMap32[gbLineMix[x++]];
dest += 3;
*((uint32_t*)dest) = systemColorMap32[gbLineMix[x++]];
dest += 3;
*((uint32_t*)dest) = systemColorMap32[gbLineMix[x++]];
dest += 3;
*((uint32_t*)dest) = systemColorMap32[gbLineMix[x++]];
dest += 3;
*((uint32_t*)dest) = systemColorMap32[gbLineMix[x++]];
dest += 3;
color = systemColorMap32[gbLineMix[x++]];
*dest++ = (uint8_t)(color & 0xFF);
*dest++ = (uint8_t)((color >> 8) & 0xFF);
*dest++ = (uint8_t)((color >> 16) & 0xFF);
color = systemColorMap32[gbLineMix[x++]];
*dest++ = (uint8_t)(color & 0xFF);
*dest++ = (uint8_t)((color >> 8) & 0xFF);
*dest++ = (uint8_t)((color >> 16) & 0xFF);
color = systemColorMap32[gbLineMix[x++]];
*dest++ = (uint8_t)(color & 0xFF);
*dest++ = (uint8_t)((color >> 8) & 0xFF);
*dest++ = (uint8_t)((color >> 16) & 0xFF);
color = systemColorMap32[gbLineMix[x++]];
*dest++ = (uint8_t)(color & 0xFF);
*dest++ = (uint8_t)((color >> 8) & 0xFF);
*dest++ = (uint8_t)((color >> 16) & 0xFF);
}
} break;
case 32: {
#ifdef __LIBRETRO__
uint32_t* dest = (uint32_t*)g_pix + gbBorderLineSkip * (register_LY + gbBorderRowSkip)

View File

@@ -4234,9 +4234,9 @@ void CPULoop(int ticks)
*dest++ = systemColorMap8[g_lineMix[x++] & 0xFFFF];
*dest++ = systemColorMap8[g_lineMix[x++] & 0xFFFF];
}
// for filters that read past the screen
// for filters that read past the screen
#ifndef __LIBRETRO__
*dest++ = 0;
* dest++ = 0;
#endif
} break;
case 16: {
@@ -4272,43 +4272,58 @@ void CPULoop(int ticks)
#endif
} break;
case 24: {
uint8_t* dest = (uint8_t*)g_pix + 240 * VCOUNT * 3;
uint8_t* dest = (uint8_t*)g_pix + (240 * 3) * (VCOUNT + 1);
for (int x = 0; x < 240;) {
*((uint32_t*)dest) = systemColorMap32[g_lineMix[x++] & 0xFFFF];
dest += 3;
*((uint32_t*)dest) = systemColorMap32[g_lineMix[x++] & 0xFFFF];
dest += 3;
*((uint32_t*)dest) = systemColorMap32[g_lineMix[x++] & 0xFFFF];
dest += 3;
*((uint32_t*)dest) = systemColorMap32[g_lineMix[x++] & 0xFFFF];
dest += 3;
uint32_t color = systemColorMap32[g_lineMix[x++] & 0xFFFF];
*dest++ = (uint8_t)(color & 0xFF);
*dest++ = (uint8_t)((color >> 8) & 0xFF);
*dest++ = (uint8_t)((color >> 16) & 0xFF);
color = systemColorMap32[g_lineMix[x++] & 0xFFFF];
*dest++ = (uint8_t)(color & 0xFF);
*dest++ = (uint8_t)((color >> 8) & 0xFF);
*dest++ = (uint8_t)((color >> 16) & 0xFF);
color = systemColorMap32[g_lineMix[x++] & 0xFFFF];
*dest++ = (uint8_t)(color & 0xFF);
*dest++ = (uint8_t)((color >> 8) & 0xFF);
*dest++ = (uint8_t)((color >> 16) & 0xFF);
color = systemColorMap32[g_lineMix[x++] & 0xFFFF];
*dest++ = (uint8_t)(color & 0xFF);
*dest++ = (uint8_t)((color >> 8) & 0xFF);
*dest++ = (uint8_t)((color >> 16) & 0xFF);
*((uint32_t*)dest) = systemColorMap32[g_lineMix[x++] & 0xFFFF];
dest += 3;
*((uint32_t*)dest) = systemColorMap32[g_lineMix[x++] & 0xFFFF];
dest += 3;
*((uint32_t*)dest) = systemColorMap32[g_lineMix[x++] & 0xFFFF];
dest += 3;
*((uint32_t*)dest) = systemColorMap32[g_lineMix[x++] & 0xFFFF];
dest += 3;
color = systemColorMap32[g_lineMix[x++] & 0xFFFF];
*dest++ = (uint8_t)(color & 0xFF);
*dest++ = (uint8_t)((color >> 8) & 0xFF);
*dest++ = (uint8_t)((color >> 16) & 0xFF);
color = systemColorMap32[g_lineMix[x++] & 0xFFFF];
*dest++ = (uint8_t)(color & 0xFF);
*dest++ = (uint8_t)((color >> 8) & 0xFF);
*dest++ = (uint8_t)((color >> 16) & 0xFF);
color = systemColorMap32[g_lineMix[x++] & 0xFFFF];
*dest++ = (uint8_t)(color & 0xFF);
*dest++ = (uint8_t)((color >> 8) & 0xFF);
*dest++ = (uint8_t)((color >> 16) & 0xFF);
color = systemColorMap32[g_lineMix[x++] & 0xFFFF];
*dest++ = (uint8_t)(color & 0xFF);
*dest++ = (uint8_t)((color >> 8) & 0xFF);
*dest++ = (uint8_t)((color >> 16) & 0xFF);
*((uint32_t*)dest) = systemColorMap32[g_lineMix[x++] & 0xFFFF];
dest += 3;
*((uint32_t*)dest) = systemColorMap32[g_lineMix[x++] & 0xFFFF];
dest += 3;
*((uint32_t*)dest) = systemColorMap32[g_lineMix[x++] & 0xFFFF];
dest += 3;
*((uint32_t*)dest) = systemColorMap32[g_lineMix[x++] & 0xFFFF];
dest += 3;
*((uint32_t*)dest) = systemColorMap32[g_lineMix[x++] & 0xFFFF];
dest += 3;
*((uint32_t*)dest) = systemColorMap32[g_lineMix[x++] & 0xFFFF];
dest += 3;
*((uint32_t*)dest) = systemColorMap32[g_lineMix[x++] & 0xFFFF];
dest += 3;
*((uint32_t*)dest) = systemColorMap32[g_lineMix[x++] & 0xFFFF];
dest += 3;
color = systemColorMap32[g_lineMix[x++] & 0xFFFF];
*dest++ = (uint8_t)(color & 0xFF);
*dest++ = (uint8_t)((color >> 8) & 0xFF);
*dest++ = (uint8_t)((color >> 16) & 0xFF);
color = systemColorMap32[g_lineMix[x++] & 0xFFFF];
*dest++ = (uint8_t)(color & 0xFF);
*dest++ = (uint8_t)((color >> 8) & 0xFF);
*dest++ = (uint8_t)((color >> 16) & 0xFF);
color = systemColorMap32[g_lineMix[x++] & 0xFFFF];
*dest++ = (uint8_t)(color & 0xFF);
*dest++ = (uint8_t)((color >> 8) & 0xFF);
*dest++ = (uint8_t)((color >> 16) & 0xFF);
color = systemColorMap32[g_lineMix[x++] & 0xFFFF];
*dest++ = (uint8_t)(color & 0xFF);
*dest++ = (uint8_t)((color >> 8) & 0xFF);
*dest++ = (uint8_t)((color >> 16) & 0xFF);
}
} break;
case 32: {