diff options
author | Arisotura <thetotalworm@gmail.com> | 2019-05-08 01:58:34 +0200 |
---|---|---|
committer | Arisotura <thetotalworm@gmail.com> | 2019-05-08 01:58:34 +0200 |
commit | fb4f972cad62d0c84b563b6b53e313b6cf2c9029 (patch) | |
tree | ecce2ec55adf6846a87d3a6a207ed48f82b463c4 | |
parent | 587d432677de5309724b3389d937e8a5bcece9a5 (diff) |
hires hax. somewhat functional
-rw-r--r-- | src/GPU2D.cpp | 366 | ||||
-rw-r--r-- | src/GPU2D.h | 22 | ||||
-rw-r--r-- | src/GPU3D.cpp | 6 | ||||
-rw-r--r-- | src/GPU3D.h | 3 | ||||
-rw-r--r-- | src/GPU3D_OpenGL43.cpp | 59 | ||||
-rw-r--r-- | src/GPU3D_Soft.cpp | 5 |
6 files changed, 248 insertions, 213 deletions
diff --git a/src/GPU2D.cpp b/src/GPU2D.cpp index 7f19833..d057a40 100644 --- a/src/GPU2D.cpp +++ b/src/GPU2D.cpp @@ -549,17 +549,81 @@ void GPU2D::Write32(u32 addr, u32 val) } +u32 GPU2D::ColorBlend4(u32 val1, u32 val2, u32 eva, u32 evb) +{ + u32 r = (((val1 & 0x00003F) * eva) + ((val2 & 0x00003F) * evb)) >> 4; + u32 g = ((((val1 & 0x003F00) * eva) + ((val2 & 0x003F00) * evb)) >> 4) & 0x007F00; + u32 b = ((((val1 & 0x3F0000) * eva) + ((val2 & 0x3F0000) * evb)) >> 4) & 0x7F0000; + + if (r > 0x00003F) r = 0x00003F; + if (g > 0x003F00) g = 0x003F00; + if (b > 0x3F0000) b = 0x3F0000; + + return r | g | b; +} + +u32 GPU2D::ColorBlend5(u32 val1, u32 val2) +{ + u32 eva = ((val1 >> 24) & 0x1F) + 1; + u32 evb = 32 - eva; + + u32 r = (((val1 & 0x00003F) * eva) + ((val2 & 0x00003F) * evb)) >> 5; + u32 g = ((((val1 & 0x003F00) * eva) + ((val2 & 0x003F00) * evb)) >> 5) & 0x007F00; + u32 b = ((((val1 & 0x3F0000) * eva) + ((val2 & 0x3F0000) * evb)) >> 5) & 0x7F0000; + + if (eva <= 16) + { + r += 0x000001; + g += 0x000100; + b += 0x010000; + } + + if (r > 0x00003F) r = 0x00003F; + if (g > 0x003F00) g = 0x003F00; + if (b > 0x3F0000) b = 0x3F0000; + + return r | g | b; +} + +u32 GPU2D::ColorBrightnessUp(u32 val, u32 factor) +{ + u32 r = val & 0x00003F; + u32 g = val & 0x003F00; + u32 b = val & 0x3F0000; + + r += (((0x00003F - r) * factor) >> 4); + g += ((((0x003F00 - g) * factor) >> 4) & 0x003F00); + b += ((((0x3F0000 - b) * factor) >> 4) & 0x3F0000); + + return r | g | b; +} + +u32 GPU2D::ColorBrightnessDown(u32 val, u32 factor) +{ + u32 r = val & 0x00003F; + u32 g = val & 0x003F00; + u32 b = val & 0x3F0000; + + r -= ((r * factor) >> 4); + g -= (((g * factor) >> 4) & 0x003F00); + b -= (((b * factor) >> 4) & 0x3F0000); + + return r | g | b; +} + + void GPU2D::DrawScanline(u32 line) { u32* dst = &Framebuffer[256*4*line]; - u32 mode1gfx[256]; + u32 mode1gfx[1024]; + u32* _3dgfx; - // request each 3D scanline in advance - // this is required for the threaded mode of the software renderer - // (alternately we could call GetLine() once and store the result somewhere) - if (Num == 0) - GPU3D::RequestLine(line); + // HAX + LineScale = 2; + LineStride = 1024; + DrawPixel = DrawPixel_2x; + int _3dline = line; line = GPU::VCount; bool forceblank = false; @@ -586,21 +650,23 @@ void GPU2D::DrawScanline(u32 line) u32 dispmode = DispCnt >> 16; dispmode &= (Num ? 0x1 : 0x3); + _3dgfx = GPU3D::GetLine(_3dline); + // always render regular graphics - DrawScanline_Mode1(line, mode1gfx); + DrawScanline_Mode1(line, mode1gfx, _3dgfx); switch (dispmode) { case 0: // screen off { - for (int i = 0; i < 256; i++) + for (int i = 0; i < LineStride; i++) dst[i] = 0xFF3F3F3F; } break; case 1: // regular display { - for (int i = 0; i < 256; i++) + for (int i = 0; i < LineStride; i++) dst[i] = mode1gfx[i]; } break; @@ -620,12 +686,19 @@ void GPU2D::DrawScanline(u32 line) u8 g = (color & 0x03E0) >> 4; u8 b = (color & 0x7C00) >> 9; - dst[i] = r | (g << 8) | (b << 16); + int d = i*LineScale; + dst[d] = r | (g << 8) | (b << 16); + if (LineScale >= 2) + { + dst[d+1] = dst[d]; + dst[d+512] = dst[d]; + dst[d+513] = dst[d]; + } } } else { - for (int i = 0; i < 256; i++) + for (int i = 0; i < LineStride; i++) { dst[i] = 0; } @@ -642,7 +715,14 @@ void GPU2D::DrawScanline(u32 line) u8 g = (color & 0x03E0) >> 4; u8 b = (color & 0x7C00) >> 9; - dst[i] = r | (g << 8) | (b << 16); + int d = i*LineScale; + dst[d] = r | (g << 8) | (b << 16); + if (LineScale >= 2) + { + dst[d+1] = dst[d]; + dst[d+512] = dst[d]; + dst[d+513] = dst[d]; + } } } break; @@ -661,7 +741,7 @@ void GPU2D::DrawScanline(u32 line) } if (line < capheight) - DoCapture(line, capwidth, mode1gfx); + DoCapture(line, capwidth, mode1gfx, _3dgfx); } // master brightness @@ -673,19 +753,9 @@ void GPU2D::DrawScanline(u32 line) u32 factor = MasterBrightness & 0x1F; if (factor > 16) factor = 16; - for (int i = 0; i < 256; i++) + for (int i = 0; i < LineStride; i++) { - u32 val = dst[i]; - - u32 r = val & 0x00003F; - u32 g = val & 0x003F00; - u32 b = val & 0x3F0000; - - r += (((0x00003F - r) * factor) >> 4); - g += ((((0x003F00 - g) * factor) >> 4) & 0x003F00); - b += ((((0x3F0000 - b) * factor) >> 4) & 0x3F0000); - - dst[i] = r | g | b; + dst[i] = ColorBrightnessUp(dst[i], factor); } } else if ((MasterBrightness >> 14) == 2) @@ -694,19 +764,9 @@ void GPU2D::DrawScanline(u32 line) u32 factor = MasterBrightness & 0x1F; if (factor > 16) factor = 16; - for (int i = 0; i < 256; i++) + for (int i = 0; i < LineStride; i++) { - u32 val = dst[i]; - - u32 r = val & 0x00003F; - u32 g = val & 0x003F00; - u32 b = val & 0x3F0000; - - r -= ((r * factor) >> 4); - g -= (((g * factor) >> 4) & 0x003F00); - b -= (((b * factor) >> 4) & 0x3F0000); - - dst[i] = r | g | b; + dst[i] = ColorBrightnessDown(dst[i], factor); } } } @@ -714,7 +774,7 @@ void GPU2D::DrawScanline(u32 line) // convert to 32-bit BGRA // note: 32-bit RGBA would be more straightforward, but // BGRA seems to be more compatible (Direct2D soft, cairo...) - for (int i = 0; i < 256; i++) + for (int i = 0; i < LineStride; i++) { u32 c = dst[i]; @@ -725,17 +785,6 @@ void GPU2D::DrawScanline(u32 line) dst[i] = c | ((c & 0x00C0C0C0) >> 6) | 0xFF000000; } - - // hax - for (int i = 255; i >= 0; i--) - { - u32 c = dst[i]; - - dst[i*2] = c; - dst[i*2+1] = c; - dst[i*2+512] = c; - dst[i*2+513] = c; - } } void GPU2D::VBlank() @@ -761,7 +810,7 @@ void GPU2D::VBlankEnd() } -void GPU2D::DoCapture(u32 line, u32 width, u32* src) +void GPU2D::DoCapture(u32 line, u32 width, u32* src, u32* _3dgfx) { u32 dstvram = (CaptureCnt >> 16) & 0x3; @@ -774,7 +823,7 @@ void GPU2D::DoCapture(u32 line, u32 width, u32* src) u32 dstaddr = (((CaptureCnt >> 18) & 0x3) << 14) + (line * width); if (CaptureCnt & (1<<24)) - src = (u32*)GPU3D::GetLine(line); + src = _3dgfx; u16* srcB = NULL; u32 srcBaddr = line * 256; @@ -803,7 +852,7 @@ void GPU2D::DoCapture(u32 line, u32 width, u32* src) { for (u32 i = 0; i < width; i++) { - u32 val = src[i]; + u32 val = src[i * LineScale]; // TODO: check what happens when alpha=0 @@ -854,7 +903,7 @@ void GPU2D::DoCapture(u32 line, u32 width, u32* src) { for (u32 i = 0; i < width; i++) { - u32 val = src[i]; + u32 val = src[i * LineScale]; // TODO: check what happens when alpha=0 @@ -888,7 +937,7 @@ void GPU2D::DoCapture(u32 line, u32 width, u32* src) { for (u32 i = 0; i < width; i++) { - u32 val = src[i]; + u32 val = src[i * LineScale]; // TODO: check what happens when alpha=0 @@ -1058,7 +1107,7 @@ void GPU2D::CalculateWindowMask(u32 line, u8* mask) template<u32 bgmode> -void GPU2D::DrawScanlineBGMode(u32 line, u32 nsprites, u32* spritebuf, u32* dst) +void GPU2D::DrawScanlineBGMode(u32 line, u32 nsprites, u32* spritebuf, u32* dst, u32* _3dgfx) { for (int i = 3; i >= 0; i--) { @@ -1098,7 +1147,7 @@ void GPU2D::DrawScanlineBGMode(u32 line, u32 nsprites, u32* spritebuf, u32* dst) if (DispCnt & 0x0100) { if ((!Num) && (DispCnt & 0x8)) - DrawBG_3D(line, dst); + DrawBG_3D(line, dst, _3dgfx); else DrawBG_Text(line, dst, 0); } @@ -1108,7 +1157,7 @@ void GPU2D::DrawScanlineBGMode(u32 line, u32 nsprites, u32* spritebuf, u32* dst) } } -void GPU2D::DrawScanlineBGMode6(u32 line, u32 nsprites, u32* spritebuf, u32* dst) +void GPU2D::DrawScanlineBGMode6(u32 line, u32 nsprites, u32* spritebuf, u32* dst, u32* _3dgfx) { if (Num) { @@ -1130,7 +1179,7 @@ void GPU2D::DrawScanlineBGMode6(u32 line, u32 nsprites, u32* spritebuf, u32* dst if (DispCnt & 0x0100) { if (DispCnt & 0x8) - DrawBG_3D(line, dst); + DrawBG_3D(line, dst, _3dgfx); } } if ((DispCnt & 0x1000) && nsprites) @@ -1138,10 +1187,10 @@ void GPU2D::DrawScanlineBGMode6(u32 line, u32 nsprites, u32* spritebuf, u32* dst } } -void GPU2D::DrawScanline_Mode1(u32 line, u32* dst) +void GPU2D::DrawScanline_Mode1(u32 line, u32* dst, u32* _3dgfx) { - u32 linebuf[256*2 + 64]; - u8* windowmask = (u8*)&linebuf[256*2]; + u32 linebuf[1024*2 + 64]; + u8* windowmask = (u8*)&linebuf[1024*2]; u32 backdrop; if (Num) backdrop = *(u16*)&GPU::Palette[0x400]; @@ -1154,7 +1203,7 @@ void GPU2D::DrawScanline_Mode1(u32 line, u32* dst) backdrop = r | (g << 8) | (b << 16) | 0x20000000; - for (int i = 0; i < 256; i++) + for (int i = 0; i < LineStride; i++) linebuf[i] = backdrop; } @@ -1171,13 +1220,13 @@ void GPU2D::DrawScanline_Mode1(u32 line, u32* dst) // TODO: what happens in mode 7? mode 6 on the sub engine? switch (DispCnt & 0x7) { - case 0: DrawScanlineBGMode<0>(line, nsprites, spritebuf, linebuf); break; - case 1: DrawScanlineBGMode<1>(line, nsprites, spritebuf, linebuf); break; - case 2: DrawScanlineBGMode<2>(line, nsprites, spritebuf, linebuf); break; - case 3: DrawScanlineBGMode<3>(line, nsprites, spritebuf, linebuf); break; - case 4: DrawScanlineBGMode<4>(line, nsprites, spritebuf, linebuf); break; - case 5: DrawScanlineBGMode<5>(line, nsprites, spritebuf, linebuf); break; - case 6: DrawScanlineBGMode6(line, nsprites, spritebuf, linebuf); break; + case 0: DrawScanlineBGMode<0>(line, nsprites, spritebuf, linebuf, _3dgfx); break; + case 1: DrawScanlineBGMode<1>(line, nsprites, spritebuf, linebuf, _3dgfx); break; + case 2: DrawScanlineBGMode<2>(line, nsprites, spritebuf, linebuf, _3dgfx); break; + case 3: DrawScanlineBGMode<3>(line, nsprites, spritebuf, linebuf, _3dgfx); break; + case 4: DrawScanlineBGMode<4>(line, nsprites, spritebuf, linebuf, _3dgfx); break; + case 5: DrawScanlineBGMode<5>(line, nsprites, spritebuf, linebuf, _3dgfx); break; + case 6: DrawScanlineBGMode6(line, nsprites, spritebuf, linebuf, _3dgfx); break; } // color special effects @@ -1185,10 +1234,10 @@ void GPU2D::DrawScanline_Mode1(u32 line, u32* dst) u32 bldcnteffect = (BlendCnt >> 6) & 0x3; - for (int i = 0; i < 256; i++) + for (int i = 0; i < LineStride; i++) { u32 val1 = linebuf[i]; - u32 val2 = linebuf[256+i]; + u32 val2 = linebuf[1024+i]; u32 coloreffect, eva, evb; @@ -1221,26 +1270,7 @@ void GPU2D::DrawScanline_Mode1(u32 line, u32* dst) { // 3D layer blending - eva = (flag1 & 0x1F) + 1; - evb = 32 - eva; - - u32 r = (((val1 & 0x00003F) * eva) + ((val2 & 0x00003F) * evb)) >> 5; - u32 g = ((((val1 & 0x003F00) * eva) + ((val2 & 0x003F00) * evb)) >> 5) & 0x007F00; - u32 b = ((((val1 & 0x3F0000) * eva) + ((val2 & 0x3F0000) * evb)) >> 5) & 0x7F0000; - - if (eva <= 16) - { - r += 0x000001; - g += 0x000100; - b += 0x010000; - } - - if (r > 0x00003F) r = 0x00003F; - if (g > 0x003F00) g = 0x003F00; - if (b > 0x3F0000) b = 0x3F0000; - - dst[i] = r | g | b | 0xFF000000; - + dst[i] = ColorBlend5(val1, val2); continue; } else @@ -1272,45 +1302,15 @@ void GPU2D::DrawScanline_Mode1(u32 line, u32* dst) break; case 1: - { - u32 r = (((val1 & 0x00003F) * eva) + ((val2 & 0x00003F) * evb)) >> 4; - u32 g = ((((val1 & 0x003F00) * eva) + ((val2 & 0x003F00) * evb)) >> 4) & 0x007F00; - u32 b = ((((val1 & 0x3F0000) * eva) + ((val2 & 0x3F0000) * evb)) >> 4) & 0x7F0000; - - if (r > 0x00003F) r = 0x00003F; - if (g > 0x003F00) g = 0x003F00; - if (b > 0x3F0000) b = 0x3F0000; - - dst[i] = r | g | b | 0xFF000000; - } + dst[i] = ColorBlend4(val1, val2, eva, evb); break; case 2: - { - u32 r = val1 & 0x00003F; - u32 g = val1 & 0x003F00; - u32 b = val1 & 0x3F0000; - - r += ((0x00003F - r) * EVY) >> 4; - g += (((0x003F00 - g) * EVY) >> 4) & 0x003F00; - b += (((0x3F0000 - b) * EVY) >> 4) & 0x3F0000; - - dst[i] = r | g | b | 0xFF000000; - } + dst[i] = ColorBrightnessUp(val1, EVY); break; case 3: - { - u32 r = val1 & 0x00003F; - u32 g = val1 & 0x003F00; - u32 b = val1 & 0x3F0000; - - r -= (r * EVY) >> 4; - g -= ((g * EVY) >> 4) & 0x003F00; - b -= ((b * EVY) >> 4) & 0x3F0000; - - dst[i] = r | g | b | 0xFF000000; - } + dst[i] = ColorBrightnessDown(val1, EVY); break; } } @@ -1333,20 +1333,35 @@ void GPU2D::DrawScanline_Mode1(u32 line, u32* dst) } -void GPU2D::DrawPixel(u32* dst, u16 color, u32 flag) +void GPU2D::DrawPixel_1x(u32* dst, u16 color, u32 flag) { u8 r = (color & 0x001F) << 1; u8 g = (color & 0x03E0) >> 4; u8 b = (color & 0x7C00) >> 9; - *(dst+256) = *dst; + *(dst+1024) = *dst; *dst = r | (g << 8) | (b << 16) | flag; } -void GPU2D::DrawBG_3D(u32 line, u32* dst) +void GPU2D::DrawPixel_2x(u32* dst, u16 color, u32 flag) { - u32* src = GPU3D::GetLine(line); - u8* windowmask = (u8*)&dst[256*2]; + u8 r = (color & 0x001F) << 1; + u8 g = (color & 0x03E0) >> 4; + u8 b = (color & 0x7C00) >> 9; + + u64 val = r | (g << 8) | (b << 16) | flag; + val |= (val << 32); + + *(u64*)(dst+1024) = *(u64*)dst; + *(u64*)(dst+1536) = *(u64*)(dst+512); + + *(u64*)dst = val; + *(u64*)(dst+512) = val; +} + +void GPU2D::DrawBG_3D(u32 line, u32* dst, u32* src) +{ + u8* windowmask = (u8*)&dst[1024*2]; u16 xoff = BGXPos[0]; int i = 0; @@ -1362,22 +1377,65 @@ void GPU2D::DrawBG_3D(u32 line, u32* dst) iend -= (xoff & 0xFF); } - for (; i < iend; i++) + if (LineScale == 1) + { + for (; i < iend; i++) + { + u32 c = src[xoff]; + xoff++; + + if ((c >> 24) == 0) continue; + if (!(windowmask[i] & 0x01)) continue; + + dst[i+1024] = dst[i]; + dst[i] = c | 0x40000000; + } + } + else if (LineScale == 2) { - u32 c = src[xoff]; - xoff++; + for (; i < iend; i++) + { + int is = i * 2; + int xs = xoff * 2; + u32 c; + + xoff++; + if (!(windowmask[i] & 0x01)) continue; + + c = src[xs]; + if ((c >> 24) != 0) + { + dst[is+1024] = dst[is]; + dst[is] = c | 0x40000000; + } + + c = src[xs+1]; is++; + if ((c >> 24) != 0) + { + dst[is+1024] = dst[is]; + dst[is] = c | 0x40000000; + } - if ((c >> 24) == 0) continue; - if (!(windowmask[i] & 0x01)) continue; + c = src[xs+512]; is += 511; + if ((c >> 24) != 0) + { + dst[is+1024] = dst[is]; + dst[is] = c | 0x40000000; + } - dst[i+256] = dst[i]; - dst[i] = c | 0x40000000; + c = src[xs+513]; is++; + if ((c >> 24) != 0) + { + dst[is+1024] = dst[is]; + dst[is] = c | 0x40000000; + } + } } } void GPU2D::DrawBG_Text(u32 line, u32* dst, u32 bgnum) { - u8* windowmask = (u8*)&dst[256*2]; + u8* windowmask = (u8*)&dst[1024*2]; u16 bgcnt = BGCnt[bgnum]; u32 xmos = 0, xmossize = 0; @@ -1474,7 +1532,7 @@ void GPU2D::DrawBG_Text(u32 line, u32* dst, u32 bgnum) xmos--; if (color) - DrawPixel(&dst[i], curpal[color], 0x01000000<<bgnum); + DrawPixel(&dst[i*LineScale], curpal[color], 0x01000000<<bgnum); } xoff++; @@ -1526,7 +1584,7 @@ void GPU2D::DrawBG_Text(u32 line, u32* dst, u32 bgnum) xmos--; if (color) - DrawPixel(&dst[i], curpal[color], 0x01000000<<bgnum); + DrawPixel(&dst[i*LineScale], curpal[color], 0x01000000<<bgnum); } xoff++; @@ -1536,7 +1594,7 @@ void GPU2D::DrawBG_Text(u32 line, u32* dst, u32 bgnum) void GPU2D::DrawBG_Affine(u32 line, u32* dst, u32 bgnum) { - u8* windowmask = (u8*)&dst[256*2]; + u8* windowmask = (u8*)&dst[1024*2]; u16 bgcnt = BGCnt[bgnum]; u32 xmos = 0, xmossize = 0; @@ -1600,7 +1658,7 @@ void GPU2D::DrawBG_Affine(u32 line, u32* dst, u32 bgnum) if (xmos > 0) { if (color) - DrawPixel(&dst[i], pal[color], 0x01000000<<bgnum); + DrawPixel(&dst[i*LineScale], pal[color], 0x01000000<<bgnum); xmos--; } @@ -1616,7 +1674,7 @@ void GPU2D::DrawBG_Affine(u32 line, u32* dst, u32 bgnum) color = GPU::ReadVRAM_BG<u8>(tilesetaddr + (curtile << 6) + (tileyoff << 3) + tilexoff); if (color) - DrawPixel(&dst[i], pal[color], 0x01000000<<bgnum); + DrawPixel(&dst[i*LineScale], pal[color], 0x01000000<<bgnum); xmos = xmossize; } @@ -1632,7 +1690,7 @@ void GPU2D::DrawBG_Affine(u32 line, u32* dst, u32 bgnum) void GPU2D::DrawBG_Extended(u32 line, u32* dst, u32 bgnum) { - u8* windowmask = (u8*)&dst[256*2]; + u8* windowmask = (u8*)&dst[1024*2]; u16 bgcnt = BGCnt[bgnum]; u32 xmos = 0, xmossize = 0; @@ -1700,7 +1758,7 @@ void GPU2D::DrawBG_Extended(u32 line, u32* dst, u32 bgnum) if (xmos > 0) { if (color & 0x8000) - DrawPixel(&dst[i], color, 0x01000000<<bgnum); + DrawPixel(&dst[i*LineScale], color, 0x01000000<<bgnum); xmos--; } @@ -1710,7 +1768,7 @@ void GPU2D::DrawBG_Extended(u32 line, u32* dst, u32 bgnum) color = GPU::ReadVRAM_BG<u16>(tilemapaddr + (((((rotY & ymask) >> 8) << yshift) + ((rotX & xmask) >> 8)) << 1)); if (color & 0x8000) - DrawPixel(&dst[i], color, 0x01000000<<bgnum); + DrawPixel(&dst[i*LineScale], color, 0x01000000<<bgnum); xmos = xmossize; } @@ -1736,7 +1794,7 @@ void GPU2D::DrawBG_Extended(u32 line, u32* dst, u32 bgnum) if (xmos > 0) { if (color) - DrawPixel(&dst[i], pal[color], 0x01000000<<bgnum); + DrawPixel(&dst[i*LineScale], pal[color], 0x01000000<<bgnum); xmos--; } @@ -1746,7 +1804,7 @@ void GPU2D::DrawBG_Extended(u32 line, u32* dst, u32 bgnum) color = GPU::ReadVRAM_BG<u8>(tilemapaddr + (((rotY & ymask) >> 8) << yshift) + ((rotX & xmask) >> 8)); if (color) - DrawPixel(&dst[i], pal[color], 0x01000000<<bgnum); + DrawPixel(&dst[i*LineScale], pal[color], 0x01000000<<bgnum); xmos = xmossize; } @@ -1803,7 +1861,7 @@ void GPU2D::DrawBG_Extended(u32 line, u32* dst, u32 bgnum) if (xmos > 0) { if (color) - DrawPixel(&dst[i], curpal[color], 0x01000000<<bgnum); + DrawPixel(&dst[i*LineScale], curpal[color], 0x01000000<<bgnum); xmos--; } @@ -1825,7 +1883,7 @@ void GPU2D::DrawBG_Extended(u32 line, u32* dst, u32 bgnum) color = GPU::ReadVRAM_BG<u8>(tilesetaddr + ((curtile & 0x03FF) << 6) + (tileyoff << 3) + tilexoff); if (color) - DrawPixel(&dst[i], curpal[color], 0x01000000<<bgnum); + DrawPixel(&dst[i*LineScale], curpal[color], 0x01000000<<bgnum); xmos = xmossize; } @@ -1842,7 +1900,7 @@ void GPU2D::DrawBG_Extended(u32 line, u32* dst, u32 bgnum) void GPU2D::DrawBG_Large(u32 line, u32* dst) // BG is always BG2 { - u8* windowmask = (u8*)&dst[256*2]; + u8* windowmask = (u8*)&dst[1024*2]; u16 bgcnt = BGCnt[2]; u32 xmos = 0, xmossize = 0; @@ -1904,7 +1962,7 @@ void GPU2D::DrawBG_Large(u32 line, u32* dst) // BG is always BG2 if (xmos > 0) { if (color) - DrawPixel(&dst[i], pal[color], 0x01000000<<2); + DrawPixel(&dst[i*LineScale], pal[color], 0x01000000<<2); xmos--; } @@ -1914,7 +1972,7 @@ void GPU2D::DrawBG_Large(u32 line, u32* dst) // BG is always BG2 color = GPU::ReadVRAM_BG<u8>(tilemapaddr + (((rotY & ymask) >> 8) << yshift) + ((rotX & xmask) >> 8)); if (color) - DrawPixel(&dst[i], pal[color], 0x01000000<<2); + DrawPixel(&dst[i*LineScale], pal[color], 0x01000000<<2); } } @@ -1928,13 +1986,13 @@ void GPU2D::DrawBG_Large(u32 line, u32* dst) // BG is always BG2 void GPU2D::InterleaveSprites(u32* buf, u32 prio, u32* dst) { - u8* windowmask = (u8*)&dst[256*2]; + u8* windowmask = (u8*)&dst[1024*2]; for (u32 i = 0; i < 256; i++) { if (((buf[i] & 0xF8000) == prio) && (windowmask[i] & 0x10)) { - DrawPixel(&dst[i], buf[i] & 0x7FFF, buf[i] & 0xFF000000); + DrawPixel(&dst[i*LineScale], buf[i] & 0x7FFF, buf[i] & 0xFF000000); } } } diff --git a/src/GPU2D.h b/src/GPU2D.h index d7c4e3f..7ffe798 100644 --- a/src/GPU2D.h +++ b/src/GPU2D.h @@ -68,6 +68,9 @@ private: bool Enabled; u32* Framebuffer; + u32 LineStride; + u32 LineScale; + u16 DispFIFO[16]; u32 DispFIFOReadPtr; u32 DispFIFOWritePtr; @@ -114,13 +117,20 @@ private: u32 BGExtPalStatus[4]; u32 OBJExtPalStatus; - template<u32 bgmode> void DrawScanlineBGMode(u32 line, u32 nsprites, u32* spritebuf, u32* dst); - void DrawScanlineBGMode6(u32 line, u32 nsprites, u32* spritebuf, u32* dst); - void DrawScanline_Mode1(u32 line, u32* dst); + u32 ColorBlend4(u32 val1, u32 val2, u32 eva, u32 evb); + u32 ColorBlend5(u32 val1, u32 val2); + u32 ColorBrightnessUp(u32 val, u32 factor); + u32 ColorBrightnessDown(u32 val, u32 factor); + + template<u32 bgmode> void DrawScanlineBGMode(u32 line, u32 nsprites, u32* spritebuf, u32* dst, u32* _3dgfx); + void DrawScanlineBGMode6(u32 line, u32 nsprites, u32* spritebuf, u32* dst, u32* _3dgfx); + void DrawScanline_Mode1(u32 line, u32* dst, u32* _3dgfx); - void DrawPixel(u32* dst, u16 color, u32 flag); + static void DrawPixel_1x(u32* dst, u16 color, u32 flag); + static void DrawPixel_2x(u32* dst, u16 color, u32 flag); + void (*DrawPixel)(u32* dst, u16 color, u32 flag); - void DrawBG_3D(u32 line, u32* dst); + void DrawBG_3D(u32 line, u32* dst, u32* src); void DrawBG_Text(u32 line, u32* dst, u32 bgnum); void DrawBG_Affine(u32 line, u32* dst, u32 bgnum); void DrawBG_Extended(u32 line, u32* dst, u32 bgnum); @@ -132,7 +142,7 @@ private: template<bool window> void DrawSprite_Rotscale(u16* attrib, u16* rotparams, u32 boundwidth, u32 boundheight, u32 width, u32 height, s32 xpos, s32 ypos, u32* dst); template<bool window> void DrawSprite_Normal(u16* attrib, u32 width, s32 xpos, s32 ypos, u32* dst); - void DoCapture(u32 line, u32 width, u32* src); + void DoCapture(u32 line, u32 width, u32* src, u32* _3dgfx); void CalculateWindowMask(u32 line, u8* mask); }; diff --git a/src/GPU3D.cpp b/src/GPU3D.cpp index b4211f0..68b9c7f 100644 --- a/src/GPU3D.cpp +++ b/src/GPU3D.cpp @@ -2420,12 +2420,6 @@ void VCount215() GLRenderer43::RenderFrame(); } -void RequestLine(int line) -{ - //return SoftRenderer::RequestLine(line); - return GLRenderer43::RequestLine(line); -} - u32* GetLine(int line) { //return SoftRenderer::GetLine(line); diff --git a/src/GPU3D.h b/src/GPU3D.h index f300da8..ecc23de 100644 --- a/src/GPU3D.h +++ b/src/GPU3D.h @@ -104,7 +104,6 @@ void CheckFIFODMA(); void VCount144(); void VBlank(); void VCount215(); -void RequestLine(int line); u32* GetLine(int line); void WriteToGXFIFO(u32 val); @@ -127,7 +126,6 @@ void SetupRenderThread(); void VCount144(); void RenderFrame(); -void RequestLine(int line); u32* GetLine(int line); } @@ -141,7 +139,6 @@ void Reset(); void VCount144(); void RenderFrame(); -void RequestLine(int line); u32* GetLine(int line); } diff --git a/src/GPU3D_OpenGL43.cpp b/src/GPU3D_OpenGL43.cpp index 5ef9c5f..50ff4c6 100644 --- a/src/GPU3D_OpenGL43.cpp +++ b/src/GPU3D_OpenGL43.cpp @@ -364,7 +364,7 @@ vec4 FinalColor() } )"; - +// TODO!!! NOT HARDCODE SCREEN SIZE!!!!!!! const char* kRenderVS_Z = R"( void main() @@ -373,8 +373,8 @@ void main() uint zshift = (attr >> 16) & 0x1F; vec4 fpos; - fpos.x = ((float(vPosition.x) * 2.0) / 256.0) - 1.0; - fpos.y = ((float(vPosition.y) * 2.0) / 192.0) - 1.0; + fpos.x = ((float(vPosition.x) * 2.0) / 512.0) - 1.0; + fpos.y = ((float(vPosition.y) * 2.0) / 384.0) - 1.0; fpos.z = (float(vPosition.z << zshift) / 8388608.0) - 1.0; fpos.w = float(vPosition.w) / 65536.0f; fpos.xyz *= fpos.w; @@ -397,8 +397,8 @@ void main() uint zshift = (attr >> 16) & 0x1F; vec4 fpos; - fpos.x = ((float(vPosition.x) * 2.0) / 256.0) - 1.0; - fpos.y = ((float(vPosition.y) * 2.0) / 192.0) - 1.0; + fpos.x = ((float(vPosition.x) * 2.0) / 512.0) - 1.0; + fpos.y = ((float(vPosition.y) * 2.0) / 384.0) - 1.0; fZ = float(vPosition.z << zshift) / 16777216.0; fpos.w = float(vPosition.w) / 65536.0f; fpos.xy *= fpos.w; @@ -578,8 +578,7 @@ GLuint TexPalMemID; GLuint FramebufferTex[3]; GLuint FramebufferID, PixelbufferID; -u8 Framebuffer[256*192*4]; -u8 CurLine[256*4]; +u8 Framebuffer[512*384*4]; bool InitGLExtensions() @@ -785,7 +784,7 @@ bool Init() // TODO: make configurable (hires, etc) - glViewport(0, 0, 256, 192); + glViewport(0, 0, 512, 384); glDepthRange(0, 1); glClearDepth(1.0); @@ -857,34 +856,16 @@ bool Init() glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 256, 192, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 512, 384, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, FramebufferTex[0], 0); - /*glGenTextures(1, &FramebufferTex[1]); - glBindTexture(GL_TEXTURE_2D, FramebufferTex[1]); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, 256, 192, 0, GL_DEPTH_COMPONENT, GL_FLOAT, NULL); // welp - glFramebufferTexture(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, FramebufferTex[1], 0); - - glGenTextures(1, &FramebufferTex[2]); - glBindTexture(GL_TEXTURE_2D, FramebufferTex[2]); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - glTexImage2D(GL_TEXTURE_2D, 0, GL_STENCIL_INDEX, 256, 192, 0, GL_STENCIL_INDEX, GL_UNSIGNED_BYTE, NULL); - glFramebufferTexture(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, FramebufferTex[2], 0);*/ - glGenTextures(1, &FramebufferTex[1]); glBindTexture(GL_TEXTURE_2D, FramebufferTex[1]); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH24_STENCIL8, 256, 192, 0, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8, NULL); + glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH24_STENCIL8, 512, 384, 0, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8, NULL); glFramebufferTexture(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, FramebufferTex[1], 0); glGenTextures(1, &FramebufferTex[2]); @@ -893,7 +874,7 @@ bool Init() glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RG8UI, 256, 192, 0, GL_RG_INTEGER, GL_UNSIGNED_BYTE, NULL); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RG8UI, 512, 384, 0, GL_RG_INTEGER, GL_UNSIGNED_BYTE, NULL); glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, FramebufferTex[2], 0); GLenum fbassign[2] = {GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1}; @@ -907,7 +888,7 @@ bool Init() glGenBuffers(1, &PixelbufferID); glBindBuffer(GL_PIXEL_PACK_BUFFER, PixelbufferID); //glBufferData(GL_PIXEL_PACK_BUFFER, 256*48*4, NULL, GL_DYNAMIC_READ); - glBufferData(GL_PIXEL_PACK_BUFFER, 256*192*4, NULL, GL_DYNAMIC_READ); + glBufferData(GL_PIXEL_PACK_BUFFER, 512*384*4, NULL, GL_DYNAMIC_READ); glActiveTexture(GL_TEXTURE0); glGenTextures(1, &TexMemID); @@ -1023,7 +1004,8 @@ void BuildPolygons(RendererPolygon* polygons, int npolys) while (z > 0xFFFF) { z >>= 1; zshift++; } // TODO hires-upgraded positions? - *vptr++ = vtx->FinalPosition[0] | (vtx->FinalPosition[1] << 16); + //*vptr++ = vtx->FinalPosition[0] | (vtx->FinalPosition[1] << 16); + *vptr++ = (vtx->FinalPosition[0] << 1) | (vtx->FinalPosition[1] << 17); *vptr++ = z | (w << 16); *vptr++ = (vtx->FinalColor[0] >> 1) | @@ -1342,16 +1324,16 @@ if (PolygonList[firsttrans].PolyData->IsShadow) printf("!! GLORG!!! %08X\n", Pol //glReadPixels(0, 0, 256, 48, GL_RGBA, GL_UNSIGNED_BYTE, Framebuffer); glBindBuffer(GL_PIXEL_PACK_BUFFER, PixelbufferID); //glReadPixels(0, 0, 256, 48, GL_BGRA, GL_UNSIGNED_BYTE, NULL); - glReadPixels(0, 0, 256, 192, GL_BGRA, GL_UNSIGNED_BYTE, NULL); + glReadPixels(0, 0, 512, 384, GL_BGRA, GL_UNSIGNED_BYTE, NULL); } -void RequestLine(int line) +u32* GetLine(int line) { if (line == 0) { u8* data = (u8*)glMapBuffer(GL_PIXEL_PACK_BUFFER, GL_READ_ONLY); //if (data) memcpy(&Framebuffer[4*256*0], data, 4*256*48); - if (data) memcpy(&Framebuffer[4*256*0], data, 4*256*192); + if (data) memcpy(&Framebuffer[4*256*0], data, 4*512*384); glUnmapBuffer(GL_PIXEL_PACK_BUFFER); //glReadPixels(0, 48, 256, 48, GL_BGRA, GL_UNSIGNED_BYTE, NULL); @@ -1379,19 +1361,16 @@ void RequestLine(int line) glUnmapBuffer(GL_PIXEL_PACK_BUFFER); }*/ - u32* ptr = (u32*)&Framebuffer[256*4 * line]; - for (int i = 0; i < 256; i++) + u32* ptr = (u32*)&Framebuffer[512*2*4 * line]; + for (int i = 0; i < 1024; i++) { u32 rgb = *ptr & 0x00FCFCFC; u32 a = *ptr & 0xF8000000; *ptr++ = (rgb >> 2) | (a >> 3); } -} -u32* GetLine(int line) -{ - return (u32*)&Framebuffer[256*4 * line]; + return (u32*)&Framebuffer[512*2*4 * line]; } } diff --git a/src/GPU3D_Soft.cpp b/src/GPU3D_Soft.cpp index 8d18a35..932b5d4 100644 --- a/src/GPU3D_Soft.cpp +++ b/src/GPU3D_Soft.cpp @@ -2106,17 +2106,14 @@ void RenderThreadFunc() } } -void RequestLine(int line) +u32* GetLine(int line) { if (RenderThreadRunning) { if (line < 192) Platform::Semaphore_Wait(Sema_ScanlineCount); } -} -u32* GetLine(int line) -{ return &ColorBuffer[(line * ScanlineWidth) + FirstPixelOffset]; } |