From aa6abace4097639f3bb4b7d8ccaee5659f9cb06f Mon Sep 17 00:00:00 2001 From: BearOso Date: Sun, 10 Apr 2022 16:41:16 -0500 Subject: [PATCH] Create output buffer in core. TODO: Fix Windows. --- gfx.cpp | 33 +-------------------------------- gfx.h | 7 ++++--- gtk/src/gtk_display.cpp | 5 ----- libretro/libretro.cpp | 13 +++++-------- snes9x.h | 2 -- unix/configure.ac | 25 ++++++++++--------------- unix/x11.cpp | 15 --------------- 7 files changed, 20 insertions(+), 80 deletions(-) diff --git a/gfx.cpp b/gfx.cpp index e73b7d1a..d33623ff 100644 --- a/gfx.cpp +++ b/gfx.cpp @@ -49,15 +49,13 @@ bool8 S9xGraphicsInit (void) S9xInitTileRenderer(); memset(BlackColourMap, 0, 256 * sizeof(uint16)); - GFX.RealPPL = GFX.Pitch >> 1; IPPU.OBJChanged = TRUE; Settings.BG_Forced = 0; S9xFixColourBrightness(); S9xBuildDirectColourMaps(); + GFX.Screen = &GFX.ScreenBuffer[GFX.RealPPL * 32]; GFX.ZERO = (uint16 *) malloc(sizeof(uint16) * 0x10000); - - GFX.ScreenSize = GFX.Pitch / 2 * SNES_HEIGHT_EXTENDED * (Settings.SupportHiRes ? 2 : 1); GFX.SubScreen = (uint16 *) malloc(GFX.ScreenSize * sizeof(uint16)); GFX.ZBuffer = (uint8 *) malloc(GFX.ScreenSize); GFX.SubZBuffer = (uint8 *) malloc(GFX.ScreenSize); @@ -121,19 +119,11 @@ void S9xGraphicsScreenResize (void) if (Settings.SupportHiRes && (PPU.BGMode == 5 || PPU.BGMode == 6 || IPPU.PseudoHires)) { - GFX.RealPPL = GFX.Pitch >> 1; IPPU.DoubleWidthPixels = TRUE; IPPU.RenderedScreenWidth = SNES_WIDTH << 1; } else { - #ifdef USE_OPENGL - if (Settings.OpenGLEnable) - GFX.RealPPL = SNES_WIDTH; - else - #endif - GFX.RealPPL = GFX.Pitch >> 1; - IPPU.DoubleWidthPixels = FALSE; IPPU.RenderedScreenWidth = SNES_WIDTH; } @@ -471,27 +461,6 @@ void S9xUpdateScreen (void) { if (!IPPU.DoubleWidthPixels && (PPU.BGMode == 5 || PPU.BGMode == 6 || IPPU.PseudoHires)) { - #ifdef USE_OPENGL - if (Settings.OpenGLEnable && GFX.RealPPL == 256) - { - // Have to back out of the speed up hack where the low res. - // SNES image was rendered into a 256x239 sized buffer, - // ignoring the true, larger size of the buffer. - GFX.RealPPL = GFX.Pitch >> 1; - - for (int32 y = (int32) GFX.StartY - 1; y >= 0; y--) - { - uint16 *p = GFX.Screen + y * GFX.PPL + 255; - uint16 *q = GFX.Screen + y * GFX.RealPPL + 510; - - for (int x = 255; x >= 0; x--, p--, q -= 2) - *q = *(q + 1) = *p; - } - - GFX.PPL = GFX.RealPPL; // = GFX.Pitch >> 1 above - } - else - #endif // Have to back out of the regular speed hack for (uint32 y = 0; y < GFX.StartY; y++) { diff --git a/gfx.h b/gfx.h index f4deca3b..5e78c266 100644 --- a/gfx.h +++ b/gfx.h @@ -11,16 +11,17 @@ struct SGFX { + const uint32 Pitch = sizeof(uint16) * MAX_SNES_WIDTH; + const uint32 RealPPL = MAX_SNES_WIDTH; // true PPL of Screen buffer + const uint32 ScreenSize = MAX_SNES_WIDTH * SNES_HEIGHT_EXTENDED; + uint16 ScreenBuffer[512 * (478 + 64)]; uint16 *Screen; uint16 *SubScreen; uint8 *ZBuffer; uint8 *SubZBuffer; - uint32 Pitch; - uint32 ScreenSize; uint16 *S; uint8 *DB; uint16 *ZERO; - uint32 RealPPL; // true PPL of Screen buffer uint32 PPL; // number of pixels on each of Screen buffer uint32 LinesPerTile; // number of lines in 1 tile (4 or 8 due to interlace) uint16 *ScreenColors; // screen colors for rendering main diff --git a/gtk/src/gtk_display.cpp b/gtk/src/gtk_display.cpp index b25cf0d5..572d9ffe 100644 --- a/gtk/src/gtk_display.cpp +++ b/gtk/src/gtk_display.cpp @@ -1624,12 +1624,7 @@ static void S9xGTKDisplayString(const char *string, int linesFromBottom, void S9xInitDisplay(int argc, char **argv) { - static uint16_t screen_buffer[512 * 1024]; - Settings.SupportHiRes = true; - GFX.Screen = (uint16_t *)&screen_buffer[512 * 256]; - GFX.Pitch = 512 * 2; - S9xBlit2xSaIFilterInit(); #ifdef USE_HQ2X S9xBlitHQ2xFilterInit(); diff --git a/libretro/libretro.cpp b/libretro/libretro.cpp index e49eda28..691b3331 100644 --- a/libretro/libretro.cpp +++ b/libretro/libretro.cpp @@ -1355,11 +1355,8 @@ void retro_init(void) S9xSetSoundMute(FALSE); S9xSetSamplesAvailableCallback(NULL, NULL); - GFX.Pitch = MAX_SNES_WIDTH_NTSC * sizeof(uint16); - screen_buffer = (uint16*) calloc(1, GFX.Pitch * (MAX_SNES_HEIGHT + 16)); - GFX.Screen = screen_buffer + (GFX.Pitch >> 1) * 16; - ntsc_screen_buffer = (uint16*) calloc(1, GFX.Pitch * (MAX_SNES_HEIGHT + 16)); - snes_ntsc_buffer = ntsc_screen_buffer + (GFX.Pitch >> 1) * 16; + ntsc_screen_buffer = (uint16*) calloc(1, MAX_SNES_WIDTH_NTSC * 2 * (MAX_SNES_HEIGHT + 16)); + snes_ntsc_buffer = ntsc_screen_buffer + (MAX_SNES_WIDTH_NTSC >> 1) * 16; S9xGraphicsInit(); S9xInitInputDevices(); @@ -2013,11 +2010,11 @@ bool8 S9xDeinitUpdate(int width, int height) burst_phase = (burst_phase + 1) % 3; if (width == 512) - snes_ntsc_blit_hires(snes_ntsc, GFX.Screen, GFX.Pitch / 2, burst_phase, width, height, snes_ntsc_buffer, GFX.Pitch); + snes_ntsc_blit_hires(snes_ntsc, GFX.Screen, GFX.Pitch / 2, burst_phase, width, height, snes_ntsc_buffer, MAX_SNES_WIDTH_NTSC * 2); else - snes_ntsc_blit(snes_ntsc, GFX.Screen, GFX.Pitch / 2, burst_phase, width, height, snes_ntsc_buffer, GFX.Pitch); + snes_ntsc_blit(snes_ntsc, GFX.Screen, GFX.Pitch / 2, burst_phase, width, height, snes_ntsc_buffer, MAX_SNES_WIDTH_NTSC * 2); - video_cb(snes_ntsc_buffer + ((int)(GFX.Pitch >> 1) * overscan_offset), SNES_NTSC_OUT_WIDTH(256), height, GFX.Pitch); + video_cb(snes_ntsc_buffer + ((int)(MAX_SNES_WIDTH_NTSC) * overscan_offset), SNES_NTSC_OUT_WIDTH(256), height, MAX_SNES_WIDTH_NTSC * 2); } else if (width == MAX_SNES_WIDTH && hires_blend) { diff --git a/snes9x.h b/snes9x.h index c3c6bac7..720d39ae 100644 --- a/snes9x.h +++ b/snes9x.h @@ -303,8 +303,6 @@ struct SSettings bool8 DontSaveOopsSnapshot; bool8 UpAndDown; - bool8 OpenGLEnable; - bool8 SeparateEchoBuffer; uint32 SuperFXClockMultiplier; int OverclockMode; diff --git a/unix/configure.ac b/unix/configure.ac index 18a5ebe1..3d78b40c 100644 --- a/unix/configure.ac +++ b/unix/configure.ac @@ -1,5 +1,5 @@ -AC_PREREQ([2.60]) -AC_INIT([Snes9x], [1.61], [], [snes9x]) +AC_PREREQ([2.71]) +AC_INIT([Snes9x],[1.61],[],[snes9x]) AC_REVISION([$Revision: 1.61 $]) AC_CONFIG_SRCDIR([unix.cpp]) @@ -23,8 +23,7 @@ AC_DEFUN([AC_S9X_COMPILER_FLAG], OLD_CXXFLAGS="[$]CXXFLAGS" CXXFLAGS="[$]OLD_CXXFLAGS $1" - AC_TRY_RUN( - [ + AC_RUN_IFELSE([AC_LANG_SOURCE([[ int foo; int main (int argc, char **argv) @@ -37,8 +36,7 @@ AC_DEFUN([AC_S9X_COMPILER_FLAG], return (argc); } - ], - [snes9x_cv_option_$2="yes"], [snes9x_cv_option_$2="no"]) + ]])],[snes9x_cv_option_$2="yes"],[snes9x_cv_option_$2="no"],[]) ]) CXXFLAGS="[$]OLD_CXXFLAGS" @@ -350,14 +348,12 @@ AC_CHECK_HEADERS([unistd.h sys/socket.h]) if test "x$snes9x_have_stdint_h" = "x"; then AC_MSG_CHECKING([whether the size of pointer is int]) - AC_TRY_RUN( - [ + AC_RUN_IFELSE([AC_LANG_SOURCE([[ int main (void) { return (!(sizeof(void *) == sizeof(int))); } - ], - [snes9x_ptr_is_int="yes"], [snes9x_ptr_is_int="no"]) + ]])],[snes9x_ptr_is_int="yes"],[snes9x_ptr_is_int="no"],[]) if test "x$snes9x_ptr_is_int" = "xyes"; then AC_MSG_RESULT(yes) @@ -376,8 +372,7 @@ AC_DEFUN([AC_S9X_CHECK_SAR], OLD_CXXFLAGS="[$]CXXFLAGS" CXXFLAGS="[$]OLD_CXXFLAGS $snes9x_have_stdint_h" - AC_TRY_RUN( - [ + AC_RUN_IFELSE([AC_LANG_SOURCE([[ #ifdef HAVE_STDINT_H #include typedef int8_t int8; @@ -403,8 +398,7 @@ AC_DEFUN([AC_S9X_CHECK_SAR], return (i < 0 ? 0 : 1); } - ], - [snes9x_sar_$1="yes"], [snes9x_sar_$1="no"]) + ]])],[snes9x_sar_$1="yes"],[snes9x_sar_$1="no"],[]) CXXFLAGS="[$]OLD_CXXFLAGS" @@ -581,4 +575,5 @@ EOF cat config.info -AC_OUTPUT(Makefile) +AC_CONFIG_FILES([Makefile]) +AC_OUTPUT diff --git a/unix/x11.cpp b/unix/x11.cpp index a21dd521..5f976d72 100644 --- a/unix/x11.cpp +++ b/unix/x11.cpp @@ -92,7 +92,6 @@ struct GUIData uint32 blue_size; Window window; Image *image; - uint8 *snes_buffer; uint8 *filter_buffer; uint8 *blit_screen; uint32 blit_screen_pitch; @@ -932,14 +931,6 @@ static void SetupImage (void) #endif SetupXImage(); - // Setup SNES buffers - GFX.Pitch = SNES_WIDTH * 2 * 2; - GUI.snes_buffer = (uint8 *) calloc(GFX.Pitch * ((SNES_HEIGHT_EXTENDED + 4) * 2), 1); - if (!GUI.snes_buffer) - FatalError("Failed to allocate GUI.snes_buffer."); - - GFX.Screen = (uint16 *) (GUI.snes_buffer + (GFX.Pitch * 2 * 2)); - GUI.filter_buffer = (uint8 *) calloc((SNES_WIDTH * 2) * 2 * (SNES_HEIGHT_EXTENDED * 2), 1); if (!GUI.filter_buffer) FatalError("Failed to allocate GUI.filter_buffer."); @@ -967,12 +958,6 @@ static void SetupImage (void) static void TakedownImage (void) { - if (GUI.snes_buffer) - { - free(GUI.snes_buffer); - GUI.snes_buffer = NULL; - } - if (GUI.filter_buffer) { free(GUI.filter_buffer);