From ce8f66bc071f153e2a55d696a0cafa6f2b5787f6 Mon Sep 17 00:00:00 2001 From: OBattler Date: Fri, 17 Dec 2021 03:30:13 +0100 Subject: [PATCH 1/3] Reduced the texture size back 2048x2048. --- src/unix/unix_sdl.c | 6 +++--- src/video/video.c | 2 +- src/win/win_sdl.c | 6 +++--- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/unix/unix_sdl.c b/src/unix/unix_sdl.c index 4c309144f..356305d1c 100644 --- a/src/unix/unix_sdl.c +++ b/src/unix/unix_sdl.c @@ -134,9 +134,9 @@ sdl_blit_shim(int x, int y, int w, int h) params.w = w; params.h = h; if (!(!sdl_enabled || (x < 0) || (y < 0) || (w <= 0) || (h <= 0) || (w > 2048) || (h > 2048) || (buffer32 == NULL) || (sdl_render == NULL) || (sdl_tex == NULL))) - video_copy(interpixels, &(buffer32->line[y][x]), h * (2048 + 64) * sizeof(uint32_t)); + video_copy(interpixels, &(buffer32->line[y][x]), h * 2048 * sizeof(uint32_t)); if (screenshots) - video_screenshot(interpixels, 0, 0, (2048 + 64)); + video_screenshot(interpixels, 0, 0, 2048); blitreq = 1; video_blit_complete(); } @@ -198,7 +198,7 @@ sdl_blit(int x, int y, int w, int h) r_src.y = y; r_src.w = w; r_src.h = h; - SDL_UpdateTexture(sdl_tex, &r_src, interpixels, (2048 + 64) * 4); + SDL_UpdateTexture(sdl_tex, &r_src, interpixels, 2048 * 4); blitreq = 0; sdl_real_blit(&r_src); diff --git a/src/video/video.c b/src/video/video.c index 5118b886f..e3ff2200c 100644 --- a/src/video/video.c +++ b/src/video/video.c @@ -831,7 +831,7 @@ video_init(void) } /* Account for overscan. */ - buffer32 = create_bitmap(2048 + 64, 2048 + 64); + buffer32 = create_bitmap(2048, 2048); for (c = 0; c < 64; c++) { cgapal[c + 64].r = (((c & 4) ? 2 : 0) | ((c & 0x10) ? 1 : 0)) * 21; diff --git a/src/win/win_sdl.c b/src/win/win_sdl.c index af876540d..3a898f43c 100644 --- a/src/win/win_sdl.c +++ b/src/win/win_sdl.c @@ -244,10 +244,10 @@ sdl_blit(int x, int y, int w, int h) SDL_LockTexture(sdl_tex, 0, &pixeldata, &pitch); - video_copy(pixeldata, &(buffer32->line[y][x]), h * (2048 + 64) * sizeof(uint32_t)); + video_copy(pixeldata, &(buffer32->line[y][x]), h * 2048 * sizeof(uint32_t)); if (screenshots) - video_screenshot((uint32_t *) pixeldata, 0, 0, (2048 + 64)); + video_screenshot((uint32_t *) pixeldata, 0, 0, 2048); SDL_UnlockTexture(sdl_tex); @@ -358,7 +358,7 @@ sdl_init_texture(void) sdl_render = SDL_CreateRenderer(sdl_win, -1, SDL_RENDERER_SOFTWARE); sdl_tex = SDL_CreateTexture(sdl_render, SDL_PIXELFORMAT_ARGB8888, - SDL_TEXTUREACCESS_STREAMING, (2048 + 64), (2048 + 64)); + SDL_TEXTUREACCESS_STREAMING, 2048, 2048); } From 84ff7ab6ffb3b9473232312da9a68b3d95d42f9e Mon Sep 17 00:00:00 2001 From: OBattler Date: Fri, 17 Dec 2021 03:44:22 +0100 Subject: [PATCH 2/3] Fixed OpenGL 3.0 core. --- src/win/win_opengl.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/win/win_opengl.c b/src/win/win_opengl.c index 13b8c4fb7..bb9afd7be 100644 --- a/src/win/win_opengl.c +++ b/src/win/win_opengl.c @@ -62,10 +62,10 @@ typedef LONG atomic_flag; static const int INIT_WIDTH = 640; static const int INIT_HEIGHT = 400; -static const int BUFFERPIXELS = 4460544; /* Same size as render_buffer, pow(2048+64,2). */ -static const int BUFFERBYTES = 17842176; /* Pixel is 4 bytes. */ +static const int BUFFERPIXELS = 4194304; /* Same size as render_buffer, pow(2048+64,2). */ +static const int BUFFERBYTES = 16777216; /* Pixel is 4 bytes. */ static const int BUFFERCOUNT = 3; /* How many buffers to use for pixel transfer (2-3 is commonly recommended). */ -static const int ROW_LENGTH = 2112; /* Source buffer row lenght (including padding) */ +static const int ROW_LENGTH = 2048; /* Source buffer row lenght (including padding) */ /** * @brief A dedicated OpenGL thread. From 707acadd364eedaaba5bf28c597a0ef89cf1dd63 Mon Sep 17 00:00:00 2001 From: OBattler Date: Fri, 17 Dec 2021 03:49:54 +0100 Subject: [PATCH 3/3] Replaced the Win32 threads with the proven to be better performing C++11 threads. --- src/CMakeLists.txt | 2 +- src/cpp11_thread.cpp | 133 ++++++++++++++++++++++++++++++ src/win/CMakeLists.txt | 4 +- src/win/Makefile.mingw | 4 +- src/win/win_thread.c | 183 ----------------------------------------- 5 files changed, 138 insertions(+), 188 deletions(-) create mode 100644 src/cpp11_thread.cpp delete mode 100644 src/win/win_thread.c diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 7e815c5e9..f2d638c2c 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -34,7 +34,7 @@ endif() # WIN32 marks us as a GUI app on Windows # MACOSX_BUNDLE prepares a macOS application bundle including with the app icon -add_executable(86Box WIN32 MACOSX_BUNDLE 86box.c config.c log.c random.c timer.c io.c acpi.c apm.c +add_executable(86Box WIN32 MACOSX_BUNDLE 86box.c config.c cpp11_thread.cpp log.c random.c timer.c io.c acpi.c apm.c dma.c ddma.c nmi.c pic.c pit.c port_6x.c port_92.c ppi.c pci.c mca.c usb.c device.c nvr.c nvr_at.c nvr_ps2.c rtmidi_midi.cpp ${APP_ICON_MACOSX}) diff --git a/src/cpp11_thread.cpp b/src/cpp11_thread.cpp new file mode 100644 index 000000000..96eb4a2e1 --- /dev/null +++ b/src/cpp11_thread.cpp @@ -0,0 +1,133 @@ +#include +#include +#include + +#include <86box/plat.h> + +struct event_cpp11_t +{ + std::condition_variable cond; + std::mutex mutex; + bool state = false; +}; + +extern "C" { + +thread_t * +thread_create(void (*thread_rout)(void *param), void *param) +{ + auto thread = new std::thread([thread_rout, param] { + thread_rout(param); + }); + return thread; +} + +mutex_t * +thread_create_mutex_with_spin_count(unsigned int spin_count) +{ + /* Setting spin count of a mutex is not possible with pthreads. */ + return thread_create_mutex(); +} + +int +thread_wait(thread_t *arg, int timeout) +{ + (void) timeout; + auto thread = reinterpret_cast(arg); + thread->join(); + return 0; +} + +mutex_t * +thread_create_mutex(void) +{ + auto mutex = new std::mutex; + return mutex; +} + +int +thread_wait_mutex(mutex_t *_mutex) +{ + if (_mutex == nullptr) + return(0); + auto mutex = reinterpret_cast(_mutex); + mutex->lock(); + return 1; +} + + +int +thread_release_mutex(mutex_t *_mutex) +{ + if (_mutex == nullptr) + return(0); + auto mutex = reinterpret_cast(_mutex); + mutex->unlock(); + return 1; +} + + +void +thread_close_mutex(mutex_t *_mutex) +{ + auto mutex = reinterpret_cast(_mutex); + delete mutex; +} + +event_t * +thread_create_event() +{ + auto ev = new event_cpp11_t; + return ev; +} + +int +thread_wait_event(event_t *handle, int timeout) +{ + auto event = reinterpret_cast(handle); + auto lock = std::unique_lock(event->mutex); + + if (timeout < 0) { + event->cond.wait(lock, [event] { return event->state; }); + } else { + auto to = std::chrono::system_clock::now() + std::chrono::milliseconds(timeout); + std::cv_status status; + + do { + status = event->cond.wait_until(lock, to); + } while ((status != std::cv_status::timeout) && !event->state); + + if (status == std::cv_status::timeout) { + return 1; + } + } + return 0; +} + +void +thread_set_event(event_t *handle) +{ + auto event = reinterpret_cast(handle); + { + auto lock = std::unique_lock(event->mutex); + event->state = true; + } + event->cond.notify_all(); +} + +void +thread_reset_event(event_t *handle) +{ + auto event = reinterpret_cast(handle); + auto lock = std::unique_lock(event->mutex); + event->state = false; +} + +void +thread_destroy_event(event_t *handle) +{ + auto event = reinterpret_cast(handle); + delete event; +} + +} diff --git a/src/win/CMakeLists.txt b/src/win/CMakeLists.txt index 301544798..304ff8d68 100644 --- a/src/win/CMakeLists.txt +++ b/src/win/CMakeLists.txt @@ -15,8 +15,8 @@ enable_language(RC) -add_library(plat OBJECT win.c win_dynld.c win_cdrom.c win_thread.c - win_keyboard.c win_crashdump.c win_mouse.c) +add_library(plat OBJECT win.c win_dynld.c win_cdrom.c win_keyboard.c + win_crashdump.c win_mouse.c) add_library(ui OBJECT win_ui.c win_icon.c win_stbar.c win_sdl.c win_dialog.c win_about.c win_settings.c win_devconf.c win_snd_gain.c win_specify_dim.c win_new_floppy.c diff --git a/src/win/Makefile.mingw b/src/win/Makefile.mingw index e3199b319..4ef41f2e6 100644 --- a/src/win/Makefile.mingw +++ b/src/win/Makefile.mingw @@ -464,7 +464,7 @@ CXXFLAGS := $(CFLAGS) ######################################################################### # Create the (final) list of objects to build. # ######################################################################### -MAINOBJ := 86box.o config.o log.o random.o timer.o io.o acpi.o apm.o dma.o ddma.o \ +MAINOBJ := 86box.o config.o cpp11_thread.o log.o random.o timer.o io.o acpi.o apm.o dma.o ddma.o \ nmi.o pic.o pit.o port_6x.o port_92.o ppi.o pci.o mca.o \ usb.o device.o nvr.o nvr_at.o nvr_ps2.o rtmidi_midi.o \ $(VNCOBJ) @@ -672,7 +672,7 @@ VOODOOOBJ := vid_voodoo.o vid_voodoo_banshee.o \ vid_voodoo_texture.o PLATOBJ := win.o \ - win_dynld.o win_thread.o \ + win_dynld.o \ win_cdrom.o win_keyboard.o \ win_crashdump.o \ win_mouse.o diff --git a/src/win/win_thread.c b/src/win/win_thread.c deleted file mode 100644 index f8d81fa86..000000000 --- a/src/win/win_thread.c +++ /dev/null @@ -1,183 +0,0 @@ -/* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. - * - * This file is part of the 86Box distribution. - * - * Implement threads and mutexes for the Win32 platform. - * - * - * - * Authors: Sarah Walker, - * Fred N. van Kempen, - * - * Copyright 2008-2018 Sarah Walker. - * Copyright 2017,2018 Fred N. van Kempen. - */ -#define UNICODE -#define BITMAP WINDOWS_BITMAP -#include -#include -#include -#undef BITMAP -#include -#include -#include -#include -#include -#include <86box/86box.h> -#include <86box/plat.h> - - -typedef struct { - HANDLE handle; -} win_event_t; - - -thread_t * -thread_create(void (*func)(void *param), void *param) -{ - uintptr_t bt = _beginthread(func, 0, param); - return((thread_t *)bt); -} - - -int -thread_wait(thread_t *arg, int timeout) -{ - if (arg == NULL) return(0); - - if (timeout == -1) - timeout = INFINITE; - - if (WaitForSingleObject(arg, timeout)) return(1); - - return(0); -} - - -event_t * -thread_create_event(void) -{ - win_event_t *ev = malloc(sizeof(win_event_t)); - - ev->handle = CreateEvent(NULL, FALSE, FALSE, NULL); - - return((event_t *)ev); -} - - -void -thread_set_event(event_t *arg) -{ - win_event_t *ev = (win_event_t *)arg; - - if (arg == NULL) return; - - SetEvent(ev->handle); -} - - -void -thread_reset_event(event_t *arg) -{ - win_event_t *ev = (win_event_t *)arg; - - if (arg == NULL) return; - - ResetEvent(ev->handle); -} - - -int -thread_wait_event(event_t *arg, int timeout) -{ - win_event_t *ev = (win_event_t *)arg; - - if (arg == NULL) return(0); - - if (ev->handle == NULL) return(0); - - if (timeout == -1) - timeout = INFINITE; - - if (WaitForSingleObject(ev->handle, timeout)) return(1); - - return(0); -} - - -void -thread_destroy_event(event_t *arg) -{ - win_event_t *ev = (win_event_t *)arg; - - if (arg == NULL) return; - - CloseHandle(ev->handle); - - free(ev); -} - - -mutex_t * -thread_create_mutex(void) -{ - mutex_t *mutex = malloc(sizeof(CRITICAL_SECTION)); - - InitializeCriticalSection(mutex); - - return mutex; -} - - -mutex_t * -thread_create_mutex_with_spin_count(unsigned int spin_count) -{ - mutex_t *mutex = malloc(sizeof(CRITICAL_SECTION)); - - InitializeCriticalSectionAndSpinCount(mutex, spin_count); - - return mutex; -} - - -int -thread_wait_mutex(mutex_t *mutex) -{ - if (mutex == NULL) return(0); - - LPCRITICAL_SECTION critsec = (LPCRITICAL_SECTION)mutex; - - EnterCriticalSection(critsec); - - return 1; -} - - -int -thread_release_mutex(mutex_t *mutex) -{ - if (mutex == NULL) return(0); - - LPCRITICAL_SECTION critsec = (LPCRITICAL_SECTION)mutex; - - LeaveCriticalSection(critsec); - - return 1; -} - - -void -thread_close_mutex(mutex_t *mutex) -{ - if (mutex == NULL) return; - - LPCRITICAL_SECTION critsec = (LPCRITICAL_SECTION)mutex; - - DeleteCriticalSection(critsec); - - free(critsec); -}