From ed99c36851920a9021d494ea0077e8baa6220986 Mon Sep 17 00:00:00 2001 From: Rob Loach Date: Wed, 29 Nov 2017 11:46:11 -0500 Subject: [PATCH 01/85] Use retroarch-assets makefile to install assets --- Makefile | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/Makefile b/Makefile index 8e70dd430d..f9f1876a9a 100644 --- a/Makefile +++ b/Makefile @@ -201,17 +201,7 @@ install: $(TARGET) install -m644 media/retroarch.svg $(DESTDIR)$(PREFIX)/share/pixmaps @if test -d media/assets; then \ echo "Installing media assets..."; \ - mkdir -p $(DESTDIR)$(ASSETS_DIR)/retroarch/assets/xmb; \ - mkdir -p $(DESTDIR)$(ASSETS_DIR)/retroarch/assets/glui; \ - cp -r media/assets/xmb/ $(DESTDIR)$(ASSETS_DIR)/retroarch/assets; \ - cp -r media/assets/glui/ $(DESTDIR)$(ASSETS_DIR)/retroarch/assets; \ - echo "Removing unneeded source image files.."; \ - rm -rf $(DESTDIR)$(ASSETS_DIR)/retroarch/assets/xmb/flatui/src; \ - rm -rf $(DESTDIR)$(ASSETS_DIR)/retroarch/assets/xmb/monochrome/src; \ - rm -rf $(DESTDIR)$(ASSETS_DIR)/retroarch/assets/xmb/retroactive/src; \ - rm -rf $(DESTDIR)$(ASSETS_DIR)/retroarch/assets/xmb/neoactive/src; \ - rm -rf $(DESTDIR)$(ASSETS_DIR)/retroarch/assets/xmb/retrosystem/src; \ - rm -rf $(DESTDIR)$(ASSETS_DIR)/retroarch/assets/xmb/dot-art/src; \ + $(MAKE) install -C media/assets INSTALLDIR=$(ASSETS_DIR)/retroarch/assets; \ echo "Asset copying done."; \ fi From 7dfcc169de9016eb3db440c20351963c43c83071 Mon Sep 17 00:00:00 2001 From: David Walters Date: Wed, 29 Nov 2017 18:32:58 +0000 Subject: [PATCH 02/85] Add new lighgun/mouse-bind features to X11 driver --- input/drivers/x11_input.c | 197 ++++++++++++++++++++++++++++++-------- 1 file changed, 157 insertions(+), 40 deletions(-) diff --git a/input/drivers/x11_input.c b/input/drivers/x11_input.c index 40842f0719..e21e9a100e 100644 --- a/input/drivers/x11_input.c +++ b/input/drivers/x11_input.c @@ -30,6 +30,7 @@ #include "../../gfx/video_driver.h" #include "../common/input_x11_common.h" +#include "../../configuration.h" #include "../../verbosity.h" typedef struct x11_input @@ -72,6 +73,78 @@ static void *x_input_init(const char *joypad_driver) return x11; } +static bool x_keyboard_pressed(x11_input_t *x11, unsigned key) +{ + int keycode = XKeysymToKeycode(x11->display, rarch_keysym_lut[(enum retro_key)key]); + return x11->state[keycode >> 3] & (1 << (keycode & 7)); +} + +static bool x_mbutton_pressed(x11_input_t *x11, unsigned port, unsigned key) +{ + bool result; + settings_t *settings = config_get_ptr(); + + if (port >= MAX_USERS) + return false; + + /* the driver only supports one mouse */ + if ( settings->uints.input_mouse_index[ port ] != 0 ) + return false; + + switch ( key ) + { + + case RETRO_DEVICE_ID_MOUSE_LEFT: + return x11->mouse_l; + case RETRO_DEVICE_ID_MOUSE_RIGHT: + return x11->mouse_r; + case RETRO_DEVICE_ID_MOUSE_MIDDLE: + return x11->mouse_m; +/* case RETRO_DEVICE_ID_MOUSE_BUTTON_4: + return x11->mouse_b4;*/ +/* case RETRO_DEVICE_ID_MOUSE_BUTTON_5: + return x11->mouse_b5;*/ + + case RETRO_DEVICE_ID_MOUSE_WHEELUP: + case RETRO_DEVICE_ID_MOUSE_WHEELDOWN: + return x_mouse_state_wheel( key ); + +/* case RETRO_DEVICE_ID_MOUSE_HORIZ_WHEELUP: + result = x11->mouse_hwu; + x11->mouse_hwu = false; + return result; + + case RETRO_DEVICE_ID_MOUSE_HORIZ_WHEELDOWN: + result = x11->mouse_hwd; + x11->mouse_hwd = false; + return result; +*/ + } + + return false; +} + +static bool x_is_pressed(x11_input_t *x11, + rarch_joypad_info_t joypad_info, + const struct retro_keybind *binds, + unsigned port, unsigned id) +{ + const struct retro_keybind *bind = &binds[id]; + + if ( (bind->key < RETROK_LAST) && x_keyboard_pressed(x11, bind->key) ) + return true; + + if (binds && binds[id].valid) + { + if (x_mbutton_pressed(x11, port, bind->mbutton)) + return true; + if (input_joypad_pressed(x11->joypad, joypad_info, port, binds, id)) + return true; + } + + return false; +} + static int16_t x_pressed_analog(x11_input_t *x11, const struct retro_keybind *binds, unsigned idx, unsigned id) { @@ -111,6 +184,44 @@ static bool x_input_meta_key_pressed(void *data, int key) return false; } +static int16_t x_lightgun_aiming_state( x11_input_t *x11, unsigned idx, unsigned id ) +{ + const int edge_detect = 32700; + struct video_viewport vp; + bool inside = false; + int16_t res_x = 0; + int16_t res_y = 0; + int16_t res_screen_x = 0; + int16_t res_screen_y = 0; + + vp.x = 0; + vp.y = 0; + vp.width = 0; + vp.height = 0; + vp.full_width = 0; + vp.full_height = 0; + + if (!(video_driver_translate_coord_viewport_wrap(&vp, x11->mouse_x, x11->mouse_y, + &res_x, &res_y, &res_screen_x, &res_screen_y))) + return 0; + + inside = (res_x >= -edge_detect) && (res_y >= -edge_detect) && (res_x <= edge_detect) && (res_y <= edge_detect); + + switch ( id ) + { + case RETRO_DEVICE_ID_LIGHTGUN_SCREEN_X: + return inside ? res_x : 0; + case RETRO_DEVICE_ID_LIGHTGUN_SCREEN_Y: + return inside ? res_y : 0; + case RETRO_DEVICE_ID_LIGHTGUN_IS_OFFSCREEN: + return !inside; + default: + break; + } + + return 0; +} + static int16_t x_mouse_state(x11_input_t *x11, unsigned id) { switch (id) @@ -193,29 +304,6 @@ static int16_t x_pointer_state(x11_input_t *x11, return 0; } -static int16_t x_lightgun_state(x11_input_t *x11, unsigned id) -{ - switch (id) - { - case RETRO_DEVICE_ID_LIGHTGUN_X: - return x11->mouse_x - x11->mouse_last_x; - case RETRO_DEVICE_ID_LIGHTGUN_Y: - return x11->mouse_y - x11->mouse_last_y; - case RETRO_DEVICE_ID_LIGHTGUN_TRIGGER: - return x11->mouse_l; - case RETRO_DEVICE_ID_LIGHTGUN_CURSOR: - return x11->mouse_m; - case RETRO_DEVICE_ID_LIGHTGUN_TURBO: - return x11->mouse_r; - case RETRO_DEVICE_ID_LIGHTGUN_START: - return x11->mouse_m && x11->mouse_r; - case RETRO_DEVICE_ID_LIGHTGUN_PAUSE: - return x11->mouse_m && x11->mouse_l; - } - - return 0; -} - static int16_t x_input_state(void *data, rarch_joypad_info_t joypad_info, const struct retro_keybind **binds, unsigned port, @@ -227,23 +315,11 @@ static int16_t x_input_state(void *data, switch (device) { case RETRO_DEVICE_JOYPAD: - { - int keycode = XKeysymToKeycode(x11->display, - rarch_keysym_lut[(enum retro_key)binds[port][id].key]); - ret = (binds[port][id].key < RETROK_LAST) && (x11->state[keycode >> 3] & (1 << (keycode & 7))); - if (!ret) - ret = input_joypad_pressed(x11->joypad, - joypad_info, port, binds[port], id); - } - return ret; + if (id < RARCH_BIND_LIST_END) + return x_is_pressed(x11, joypad_info, binds[port], port, id); + break; case RETRO_DEVICE_KEYBOARD: - if (id < RETROK_LAST) - { - int keycode = XKeysymToKeycode(x11->display, - rarch_keysym_lut[(enum retro_key)id]); - ret = x11->state[keycode >> 3] & (1 << (keycode & 7)); - } - return ret; + return (id < RETROK_LAST) && x_keyboard_pressed(x11, id); case RETRO_DEVICE_ANALOG: ret = x_pressed_analog(x11, binds[port], idx, id); if (!ret && binds[port]) @@ -263,7 +339,48 @@ static int16_t x_input_state(void *data, device == RARCH_DEVICE_POINTER_SCREEN); break; case RETRO_DEVICE_LIGHTGUN: - return x_lightgun_state(x11, id); + switch ( id ) + { + /*aiming*/ + case RETRO_DEVICE_ID_LIGHTGUN_SCREEN_X: + case RETRO_DEVICE_ID_LIGHTGUN_SCREEN_Y: + case RETRO_DEVICE_ID_LIGHTGUN_IS_OFFSCREEN: + return x_lightgun_aiming_state( x11, idx, id ); + + /*buttons*/ + case RETRO_DEVICE_ID_LIGHTGUN_TRIGGER: + return x_is_pressed(x11, joypad_info, binds[port], port, RARCH_LIGHTGUN_TRIGGER); + case RETRO_DEVICE_ID_LIGHTGUN_RELOAD: + return x_is_pressed(x11, joypad_info, binds[port], port, RARCH_LIGHTGUN_RELOAD); + case RETRO_DEVICE_ID_LIGHTGUN_AUX_A: + return x_is_pressed(x11, joypad_info, binds[port], port, RARCH_LIGHTGUN_AUX_A); + case RETRO_DEVICE_ID_LIGHTGUN_AUX_B: + return x_is_pressed(x11, joypad_info, binds[port], port, RARCH_LIGHTGUN_AUX_B); + case RETRO_DEVICE_ID_LIGHTGUN_AUX_C: + return x_is_pressed(x11, joypad_info, binds[port], port, RARCH_LIGHTGUN_AUX_C); + case RETRO_DEVICE_ID_LIGHTGUN_START: + return x_is_pressed(x11, joypad_info, binds[port], port, RARCH_LIGHTGUN_START); + case RETRO_DEVICE_ID_LIGHTGUN_SELECT: + return x_is_pressed(x11, joypad_info, binds[port], port, RARCH_LIGHTGUN_SELECT); + case RETRO_DEVICE_ID_LIGHTGUN_DPAD_UP: + return x_is_pressed(x11, joypad_info, binds[port], port, RARCH_LIGHTGUN_DPAD_UP); + case RETRO_DEVICE_ID_LIGHTGUN_DPAD_DOWN: + return x_is_pressed(x11, joypad_info, binds[port], port, RARCH_LIGHTGUN_DPAD_DOWN); + case RETRO_DEVICE_ID_LIGHTGUN_DPAD_LEFT: + return x_is_pressed(x11, joypad_info, binds[port], port, RARCH_LIGHTGUN_DPAD_LEFT); + case RETRO_DEVICE_ID_LIGHTGUN_DPAD_RIGHT: + return x_is_pressed(x11, joypad_info, binds[port], port, RARCH_LIGHTGUN_DPAD_RIGHT); + + /*deprecated*/ + case RETRO_DEVICE_ID_LIGHTGUN_X: + return x11->mouse_x - x11->mouse_last_x; + case RETRO_DEVICE_ID_LIGHTGUN_Y: + return x11->mouse_y - x11->mouse_last_y; + case RETRO_DEVICE_ID_LIGHTGUN_PAUSE: + return x_is_pressed(x11, joypad_info, binds[port], port, RARCH_LIGHTGUN_START); + + } + break; } return 0; From 562f7071f069a277c98622874fbf958a8ffc2762 Mon Sep 17 00:00:00 2001 From: radius Date: Wed, 29 Nov 2017 17:16:04 -0500 Subject: [PATCH 03/85] allow building and debugging RetroArch from Visual Studio code automatically on a MINGW64 (MSYS2) installation this works if MSYS2 is installed in the default path allow building RetroArch from the command pallete Allow building, and starting RetroArch via vscode Tasks use 3 whitespaces for tabs --- .vscode/launch.json | 28 +++++++++++++ .vscode/settings.json | 12 ++++++ .vscode/tasks.json | 91 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 131 insertions(+) create mode 100644 .vscode/launch.json create mode 100644 .vscode/settings.json create mode 100644 .vscode/tasks.json diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000000..53837e538f --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,28 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "MINGW64 (MSYS2) debug", + "type": "cppdbg", + "request": "launch", + "program": "${workspaceFolder}/retroarch.exe", + "args": [], + "stopAtEntry": false, + "cwd": "${workspaceFolder}", + "environment": [], + "externalConsole": true, + "MIMode": "gdb", + "miDebuggerPath": "c:\\msys64\\mingw64\\bin\\gdb.exe", + "setupCommands": [ + { + "description": "Enable pretty-printing for gdb", + "text": "-enable-pretty-printing", + "ignoreFailures": true + } + ] + } + ] +} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000000..1fdc2bf309 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,12 @@ +{ + "terminal.integrated.shell.windows": "C:\\msys64\\usr\\bin\\bash.exe", + "terminal.integrated.env.windows": { + "PATH": "/mingw64/lib/ccache/bin:/mingw64/lib/ccache/bin:/mingw64/lib/ccache/bin:/mingw64/bin:/usr/local/bin:/usr/bin:/bin:$PATH", + "MSYSTEM": "MINGW64", + }, + "terminal.integrated.cursorBlinking": true, + + "editor.tabSize": 3, + "editor.renderWhitespace": "all", + "editor.insertSpaces": true, +} \ No newline at end of file diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000000..496810ecfa --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,91 @@ +{ + // See https://go.microsoft.com/fwlink/?LinkId=733558 + // for the documentation about the tasks.json format + "version": "2.0.0", + "tasks": [ + { + "taskName": "Build", + "type": "shell", + + "group": { + "kind": "build", + "isDefault": true }, + + "command": "./configure; make -j2", + "options": { + "shell": { + "executable": "C:\\msys64\\usr\\bin\\bash.exe", + "args": [ + "-c" + ] + } + } + } + { + "taskName": "Build with debugging symbols", + "type": "shell", + + "group": "build", + + "command": "./configure; DEBUG=1 make -j2", + "options": { + "shell": { + "executable": "C:\\msys64\\usr\\bin\\bash.exe", + "args": [ + "-c" + ] + } + } + } + { + "taskName": "Build without reconfiguring", + "type": "shell", + + "group": "build", + + "command": "make -j2", + "options": { + "shell": { + "executable": "C:\\msys64\\usr\\bin\\bash.exe", + "args": [ + "-c" + ] + } + } + } + { + "taskName": "Clean", + "type": "shell", + + "group": "build", + + "command": "make clean", + "options": { + "shell": { + "executable": "C:\\msys64\\usr\\bin\\bash.exe", + "args": [ + "-c" + ] + } + } + } + { + "taskName": "Start", + "type": "shell", + + "group": { + "kind": "test", + "isDefault": true }, + + "command": "./retroarch -v", + "options": { + "shell": { + "executable": "C:\\msys64\\usr\\bin\\bash.exe", + "args": [ + "-c" + ] + } + } + } + ] +} \ No newline at end of file From 9aeddb781a775696a8ba435db78ab9ddc5922ab0 Mon Sep 17 00:00:00 2001 From: Brad Parker Date: Wed, 29 Nov 2017 19:33:39 -0500 Subject: [PATCH 04/85] GlobalMemoryStatusEx only exists for 2000 and up --- frontend/drivers/platform_win32.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/drivers/platform_win32.c b/frontend/drivers/platform_win32.c index 02ae1dd7d3..2988b75c4e 100644 --- a/frontend/drivers/platform_win32.c +++ b/frontend/drivers/platform_win32.c @@ -340,7 +340,7 @@ static uint64_t frontend_win32_get_mem_total(void) { /* OSes below 2000 don't have the Ex version, * and non-Ex cannot work with >4GB RAM */ -#if _WIN32_WINNT > 0x0400 +#if _WIN32_WINNT >= 0x0500 MEMORYSTATUSEX mem_info; mem_info.dwLength = sizeof(MEMORYSTATUSEX); GlobalMemoryStatusEx(&mem_info); @@ -357,7 +357,7 @@ static uint64_t frontend_win32_get_mem_used(void) { /* OSes below 2000 don't have the Ex version, * and non-Ex cannot work with >4GB RAM */ -#if _WIN32_WINNT > 0x0400 +#if _WIN32_WINNT >= 0x0500 MEMORYSTATUSEX mem_info; mem_info.dwLength = sizeof(MEMORYSTATUSEX); GlobalMemoryStatusEx(&mem_info); From 2203deb499bef0bdef886d2f0415711ae6c3d62c Mon Sep 17 00:00:00 2001 From: twinaphex Date: Thu, 30 Nov 2017 03:43:35 +0100 Subject: [PATCH 05/85] Need to include config.h here --- libretro-common/file/nbio/nbio_unixmmap.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/libretro-common/file/nbio/nbio_unixmmap.c b/libretro-common/file/nbio/nbio_unixmmap.c index 25ec106cd8..40703ae138 100644 --- a/libretro-common/file/nbio/nbio_unixmmap.c +++ b/libretro-common/file/nbio/nbio_unixmmap.c @@ -20,13 +20,17 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +#include +#include + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + #include #if defined(HAVE_MMAP) && defined(BSD) -#include -#include - #ifdef _WIN32 #include #else From 62280439b774eb4d1aac55ef7e0b769fb69eecc5 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Thu, 30 Nov 2017 07:00:09 +0100 Subject: [PATCH 06/85] Rename epfd to fd --- input/drivers/udev_input.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/input/drivers/udev_input.c b/input/drivers/udev_input.c index 01600ecdea..9f7686dc36 100644 --- a/input/drivers/udev_input.c +++ b/input/drivers/udev_input.c @@ -117,7 +117,7 @@ struct udev_input const input_device_driver_t *joypad; - int epfd; + int fd; udev_input_device_t **devices; unsigned num_devices; @@ -522,7 +522,7 @@ static bool udev_input_add_device(udev_input_t *udev, event.data.ptr = device; /* Shouldn't happen, but just check it. */ - if (epoll_ctl(udev->epfd, EPOLL_CTL_ADD, fd, &event) < 0) + if (epoll_ctl(udev->fd, EPOLL_CTL_ADD, fd, &event) < 0) { RARCH_ERR("Failed to add FD (%d) to epoll list (%s).\n", fd, strerror(errno)); @@ -666,7 +666,7 @@ static void udev_input_poll(void *data) while (udev->monitor && udev_input_poll_hotplug_available(udev->monitor)) udev_input_handle_hotplug(udev); - ret = epoll_wait(udev->epfd, events, ARRAY_SIZE(events), 0); + ret = epoll_wait(udev->fd, events, ARRAY_SIZE(events), 0); for (i = 0; i < ret; i++) { @@ -874,10 +874,10 @@ static void udev_input_free(void *data) if (udev->joypad) udev->joypad->destroy(); - if (udev->epfd >= 0) - close(udev->epfd); + if (udev->fd >= 0) + close(udev->fd); - udev->epfd = -1; + udev->fd = -1; for (i = 0; i < udev->num_devices; i++) { @@ -985,7 +985,7 @@ static void *udev_input_init(const char *joypad_driver) goto error; } - udev->epfd = fd; + udev->fd = fd; if (!open_devices(udev, UDEV_INPUT_KEYBOARD, udev_handle_keyboard)) { From 6c69002ab4b63b0f841ee0b5786f72f30b48f54a Mon Sep 17 00:00:00 2001 From: twinaphex Date: Thu, 30 Nov 2017 07:28:59 +0100 Subject: [PATCH 07/85] Start adding not-complete kqueue codepaths - bparker - see if you can finish this up --- input/drivers/udev_input.c | 60 +++++++++++++++++++++++++++++++++++++- 1 file changed, 59 insertions(+), 1 deletion(-) diff --git a/input/drivers/udev_input.c b/input/drivers/udev_input.c index 9f7686dc36..a22ba8636d 100644 --- a/input/drivers/udev_input.c +++ b/input/drivers/udev_input.c @@ -14,6 +14,19 @@ * If not, see . */ +/* TODO/FIXME - set this once the kqueue codepath is implemented and working properly */ +#if 1 +#define HAVE_EPOLL +#else +#ifdef __linux__ +#define HAVE_EPOLL 1 +#endif + +#if defined(__APPLE__) || defined(__FreeBSD__) || defined(__OpenBSD__) || defined (__NetBSD__) +#define HAVE_KQUEUE 1 +#endif +#endif + #include #include @@ -25,7 +38,11 @@ #include #include +#if defined(HAVE_EPOLL) #include +#elif defined(HAVE_KQUEUE) +#include +#endif #include #include @@ -450,7 +467,11 @@ static bool udev_input_add_device(udev_input_t *udev, { int fd; struct stat st; +#if defined(HAVE_EPOLL) struct epoll_event event; +#elif defined(HAVE_KQUEUE) + struct kevent event; +#endif struct input_absinfo absinfo; udev_input_device_t **tmp; udev_input_device_t *device = NULL; @@ -518,6 +539,7 @@ static bool udev_input_add_device(udev_input_t *udev, tmp[udev->num_devices++] = device; udev->devices = tmp; +#if defined(HAVE_EPOLL) event.events = EPOLLIN; event.data.ptr = device; @@ -527,6 +549,14 @@ static bool udev_input_add_device(udev_input_t *udev, RARCH_ERR("Failed to add FD (%d) to epoll list (%s).\n", fd, strerror(errno)); } +#elif defined(HAVE_KQUEUE) + EV_SET(&event, fd, EVFILT_READ, EV_ADD, 0, 0, LISTENSOCKET); + if (kevent(udev->fd, &event, 1, NULL, 0, NULL) == -1) + { + RARCH_ERR("Failed to add FD (%d) to kqueue list (%s).\n", + fd, strerror(errno)); + } +#endif return true; @@ -639,7 +669,11 @@ static bool udev_input_poll_hotplug_available(struct udev_monitor *dev) static void udev_input_poll(void *data) { int i, ret; +#if defined(HAVE_EPOLL) struct epoll_event events[32]; +#elif defined(HAVE_KQUEUE) + struct kevent events[32]; +#endif udev_input_mouse_t *mouse = NULL; udev_input_t *udev = (udev_input_t*)data; @@ -666,15 +700,30 @@ static void udev_input_poll(void *data) while (udev->monitor && udev_input_poll_hotplug_available(udev->monitor)) udev_input_handle_hotplug(udev); +#if defined(HAVE_EPOLL) ret = epoll_wait(udev->fd, events, ARRAY_SIZE(events), 0); +#elif defined(HAVE_KQUEUE) + { + struct timespec timeoutspec; + timeoutspec.tv_sec = timeout; + timeoutspec.tv_nsec = 0; + ret = kevent(udev->fd, NULL, 0, events, + ARRAY_SIZE(events), &timeoutspec); + } +#endif for (i = 0; i < ret; i++) { + /* TODO/FIXME - add HAVE_EPOLL/HAVE_KQUEUE codepaths here */ if (events[i].events & EPOLLIN) { int j, len; struct input_event input_events[32]; +#if defined(HAVE_EPOLL) udev_input_device_t *device = (udev_input_device_t*)events[i].data.ptr; +#elif defined(HAVE_KQUEUE) + udev_input_device_t *device = (udev_input_device_t*)events[i].udata; +#endif while ((len = read(device->fd, input_events, sizeof(input_events))) > 0) @@ -978,12 +1027,21 @@ static void *udev_input_init(const char *joypad_driver) udev->xkb_handling = string_is_equal(ctx_ident.ident, "kms"); #endif +#if defined(HAVE_EPOLL) fd = epoll_create(32); if (fd < 0) { - RARCH_ERR("Failed to create epoll FD.\n"); + RARCH_ERR("Failed to create poll file descriptor.\n"); goto error; } +#elif defined(HAVE_KQUEUE) + fd = kqueue(); + if (fd == -1) + { + RARCH_ERR("Failed to create poll file descriptor.\n"); + goto error; + } +#endif udev->fd = fd; From a9451822b5415951be9021b7f0ac1cc03778fa82 Mon Sep 17 00:00:00 2001 From: David Walters Date: Thu, 30 Nov 2017 15:30:46 +0000 Subject: [PATCH 08/85] Improved handling of libusb hotplug capability (#5830) * Improved handling of libusb hotplug capability * Only deregister hotplug callback if registration happened. --- input/drivers_hid/libusb_hid.c | 61 ++++++++++++++++++++++------------ 1 file changed, 39 insertions(+), 22 deletions(-) diff --git a/input/drivers_hid/libusb_hid.c b/input/drivers_hid/libusb_hid.c index 4165762b16..257b4819cc 100644 --- a/input/drivers_hid/libusb_hid.c +++ b/input/drivers_hid/libusb_hid.c @@ -42,6 +42,7 @@ typedef struct libusb_hid libusb_context *ctx; joypad_connection_t *slots; sthread_t *poll_thread; + int can_hotplug; #if defined(__FreeBSD__) && LIBUSB_API_VERSION <= 0x01000102 libusb_hotplug_callback_handle hp; #else @@ -523,7 +524,8 @@ static void libusb_hid_free(void *data) if (hid->slots) pad_connection_destroy(hid->slots); - libusb_hotplug_deregister_callback(hid->ctx, hid->hp); + if (hid->can_hotplug) + libusb_hotplug_deregister_callback(hid->ctx, hid->hp); libusb_exit(hid->ctx); free(hid); @@ -556,13 +558,21 @@ static void *libusb_hid_init(void) if (ret < 0) goto error; -#if 0 - /* Don't use this for now since it requires a newer API - * version than FreeBSD has, and always returns false on Windows anyway. - * https://github.com/libusb/libusb/issues/86 +#if LIBUSB_API_VERSION <= 0x01000102 + /* API is too old, so libusb_has_capability function does not exist. + * Since we can't be sure, we assume for now there might be hot-plugging + * capability and continue on until we're told otherwise. */ - if (!libusb_has_capability(LIBUSB_CAP_HAS_HOTPLUG)) - goto error; + hid->can_hotplug = 1; +#else + /* Ask libusb if it supports hotplug and store the result. + * Note: On Windows this will probably be false, see: + * https://github.com/libusb/libusb/issues/86 + */ + if (libusb_has_capability(LIBUSB_CAP_HAS_HOTPLUG)) + hid->can_hotplug = 1; + else + hid->can_hotplug = 0; #endif hid->slots = pad_connection_init(MAX_USERS); @@ -584,22 +594,29 @@ static void *libusb_hid_init(void) if (count > 0) libusb_free_device_list(devices, 1); - ret = libusb_hotplug_register_callback( - hid->ctx, - (libusb_hotplug_event)(LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED | - LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT), - (libusb_hotplug_flag)LIBUSB_HOTPLUG_ENUMERATE, - LIBUSB_HOTPLUG_MATCH_ANY, - LIBUSB_HOTPLUG_MATCH_ANY, - LIBUSB_HOTPLUG_MATCH_ANY, - libusb_hid_hotplug_callback, - hid, - &hid->hp); - - if (ret != LIBUSB_SUCCESS) + if (hid->can_hotplug) { - RARCH_ERR("Error creating a hotplug callback.\n"); - goto error; + ret = libusb_hotplug_register_callback( + hid->ctx, + (libusb_hotplug_event)(LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED | + LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT), + (libusb_hotplug_flag)LIBUSB_HOTPLUG_ENUMERATE, + LIBUSB_HOTPLUG_MATCH_ANY, + LIBUSB_HOTPLUG_MATCH_ANY, + LIBUSB_HOTPLUG_MATCH_ANY, + libusb_hid_hotplug_callback, + hid, + &hid->hp); + + if (ret != LIBUSB_SUCCESS) + { + /* Creating the hotplug callback has failed. We assume libusb + * is still okay to continue and just update our knowledge of + * the situation accordingly. + */ + RARCH_WARN("[libusb] Failed to create a hotplug callback.\n"); + hid->can_hotplug = 0; + } } hid->poll_thread = sthread_create(poll_thread, hid); From fa3aab97687bee086005f8c6e40a54f99cdfa836 Mon Sep 17 00:00:00 2001 From: q3cpma Date: Thu, 30 Nov 2017 16:53:55 +0100 Subject: [PATCH 09/85] Fixes compilation on FreeBSD (and hopefully on other POSIX platforms) --- gfx/common/x11_common.c | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/gfx/common/x11_common.c b/gfx/common/x11_common.c index 20eebf8da3..5189cb3792 100644 --- a/gfx/common/x11_common.c +++ b/gfx/common/x11_common.c @@ -21,6 +21,7 @@ #include #include +#include #include #include @@ -159,19 +160,27 @@ static void x11_set_window_class(Display *dpy, Window win) static void x11_set_window_pid(Display *dpy, Window win) { + long scret; + char *hostname; pid_t pid = getpid(); - char hostname[HOST_NAME_MAX + 1]; - XChangeProperty(dpy, win, XInternAtom(dpy, "_NET_WM_PID", False), - XA_CARDINAL, 32, PropModeReplace, (unsigned char *)&pid, 1); + XChangeProperty(dpy, win, XInternAtom(dpy, "_NET_WM_PID", False), + XA_CARDINAL, 32, PropModeReplace, (unsigned char *)&pid, 1); - if(gethostname(hostname, HOST_NAME_MAX + 1) == -1) - RARCH_WARN("Failed to get hostname.\n"); - else - { - XChangeProperty(dpy, win, XA_WM_CLIENT_MACHINE, XA_STRING, 8, - PropModeReplace, (unsigned char *)hostname, strlen(hostname)); - } + errno = 0; + if((scret = sysconf(_SC_HOST_NAME_MAX)) == -1 && errno) + return; + if((hostname = malloc(scret + 1)) == NULL) + return; + + if(gethostname(hostname, HOST_NAME_MAX + 1) == -1) + RARCH_WARN("Failed to get hostname.\n"); + else + { + XChangeProperty(dpy, win, XA_WM_CLIENT_MACHINE, XA_STRING, 8, + PropModeReplace, (unsigned char *)hostname, strlen(hostname)); + } + free(hostname); } void x11_set_window_attr(Display *dpy, Window win) From 9ee5ef0f7432b3ae092a14a4d82ec9c296706571 Mon Sep 17 00:00:00 2001 From: theheroGAC Date: Thu, 30 Nov 2017 21:54:59 +0100 Subject: [PATCH 10/85] Update msg_hash_it.h --- intl/msg_hash_it.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/intl/msg_hash_it.h b/intl/msg_hash_it.h index dfa0290a1e..d6b420f08b 100644 --- a/intl/msg_hash_it.h +++ b/intl/msg_hash_it.h @@ -3292,8 +3292,8 @@ MSG_HASH(MSG_INPUT_KIOSK_MODE_PASSWORD_OK, MSG_HASH(MSG_INPUT_KIOSK_MODE_PASSWORD_NOK, "Password non corretta.") MSG_HASH(MENU_ENUM_LABEL_VALUE_AUTOMATICALLY_ADD_CONTENT_TO_PLAYLIST, - "Automatically add content to playlist") + "Aggiungi automaticamente il contenuto alla playlist") MSG_HASH(MENU_ENUM_SUBLABEL_AUTOMATICALLY_ADD_CONTENT_TO_PLAYLIST, - "Automatically scans loaded content so they appear inside playlists.") + "Esegue automaticamente la scansione dei contenuti caricati in modo che vengano visualizzati all'interno delle playlist.") MSG_HASH(MSG_SCANNING_OF_FILE_FINISHED, - "Scanning of file finished") + "Scansione del file completata") From 6e8fb49d05e9ca063956f26db075ae08fd8f6efd Mon Sep 17 00:00:00 2001 From: q3cpma Date: Fri, 1 Dec 2017 00:17:50 +0100 Subject: [PATCH 11/85] Whoops --- gfx/common/x11_common.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gfx/common/x11_common.c b/gfx/common/x11_common.c index 5189cb3792..1375fd1186 100644 --- a/gfx/common/x11_common.c +++ b/gfx/common/x11_common.c @@ -173,7 +173,7 @@ static void x11_set_window_pid(Display *dpy, Window win) if((hostname = malloc(scret + 1)) == NULL) return; - if(gethostname(hostname, HOST_NAME_MAX + 1) == -1) + if(gethostname(hostname, scret + 1) == -1) RARCH_WARN("Failed to get hostname.\n"); else { From a79d3aa8aa5b60029e55169854b94e4e985e6024 Mon Sep 17 00:00:00 2001 From: Ash Date: Wed, 22 Nov 2017 10:39:04 +1100 Subject: [PATCH 12/85] [WiiU] Exception handler: fix coreinit handles, add opcode to DSIs Coreinit seems to get special handles, so adding a special case should make its relative addresses actually become helpful again. Let's just hope __PPCExit stays at 0x180! Also added the violating opcode to the DSI message; may have to move it in case it pushes stuff off the end of the screen. Untested at time of commit. Hopefully this should make debugging #5357 a bit easier... --- wiiu/system/exception_handler.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/wiiu/system/exception_handler.c b/wiiu/system/exception_handler.c index 7ec7dc3f90..1169c078a2 100644 --- a/wiiu/system/exception_handler.c +++ b/wiiu/system/exception_handler.c @@ -90,9 +90,8 @@ void __attribute__((__noreturn__)) exception_cb(OSContext* ctx, OSExceptionType /* First up, the pretty header that tells you wtf just happened */ if (type == OS_EXCEPTION_TYPE_DSI) { - /* Exception type and offending instruction location - Also initializes exception_msgbuf, use buf_add from now on */ - buf_add("DSI: Instr at %08" PRIX32, ctx->srr0); + /* Exception type and offending instruction location + opcode */ + buf_add("DSI: Instr at %08" PRIX32 " (%08 " PRIX32 ")", ctx->srr0, *(unsigned int*)(ctx->srr0)); /* Was this a read or a write? */ if (ctx->dsisr & DSISR_WRITE_ATTEMPTED) { buf_add(" bad write to"); @@ -216,6 +215,12 @@ void exception_print_symbol(uint32_t addr) { /* Try for a base address */ void* libAddr; OSDynLoad_Acquire(symbolName, &libAddr); + /* Special case for coreinit; which has broken handles */ + if (strcmp(symbolName, "coreinit.rpl")) { + void* PPCExit_addr; + OSDynLoad_FindExport(libAddr, 0, "__PPCExit", &PPCExit_addr); + libAddr = PPCExit_addr - 0x180; + } *seperator = '|'; /* We got one! */ if (libAddr) { From 469662345ff275f892986283e66fdfad59c05311 Mon Sep 17 00:00:00 2001 From: Ash Date: Fri, 1 Dec 2017 10:56:54 +1100 Subject: [PATCH 13/85] [WiiU] Exception handler: remove opcodes; fix strcmp misuse Thanks for @gblues for finding the strcmp bug. I've removed the opcode display since it's a bit unsafe - if the exception handler causes a DSI; Cafe OS will take over and freeze up the console. This is obviously not a good thing. There are possible situations where memory is executable and not readable; so this is just about covering all bases until a better solution can be implemented. Maybe we can experiment a bit more once this handler isn't being used so often ;) --- wiiu/system/exception_handler.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/wiiu/system/exception_handler.c b/wiiu/system/exception_handler.c index 1169c078a2..7e01e648f6 100644 --- a/wiiu/system/exception_handler.c +++ b/wiiu/system/exception_handler.c @@ -91,7 +91,7 @@ void __attribute__((__noreturn__)) exception_cb(OSContext* ctx, OSExceptionType /* First up, the pretty header that tells you wtf just happened */ if (type == OS_EXCEPTION_TYPE_DSI) { /* Exception type and offending instruction location + opcode */ - buf_add("DSI: Instr at %08" PRIX32 " (%08 " PRIX32 ")", ctx->srr0, *(unsigned int*)(ctx->srr0)); + buf_add("DSI: Instr at %08" PRIX32, ctx->srr0); /* Was this a read or a write? */ if (ctx->dsisr & DSISR_WRITE_ATTEMPTED) { buf_add(" bad write to"); @@ -216,7 +216,7 @@ void exception_print_symbol(uint32_t addr) { void* libAddr; OSDynLoad_Acquire(symbolName, &libAddr); /* Special case for coreinit; which has broken handles */ - if (strcmp(symbolName, "coreinit.rpl")) { + if (!strcmp(symbolName, "coreinit.rpl")) { void* PPCExit_addr; OSDynLoad_FindExport(libAddr, 0, "__PPCExit", &PPCExit_addr); libAddr = PPCExit_addr - 0x180; From 52fb8276d7609fe30f640687c3ce218bf75cc9fa Mon Sep 17 00:00:00 2001 From: Ash Date: Fri, 1 Dec 2017 11:03:09 +1100 Subject: [PATCH 14/85] [WiiU] Exception handler: minor comment tweak --- wiiu/system/exception_handler.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wiiu/system/exception_handler.c b/wiiu/system/exception_handler.c index 7e01e648f6..b867a77a2e 100644 --- a/wiiu/system/exception_handler.c +++ b/wiiu/system/exception_handler.c @@ -90,7 +90,7 @@ void __attribute__((__noreturn__)) exception_cb(OSContext* ctx, OSExceptionType /* First up, the pretty header that tells you wtf just happened */ if (type == OS_EXCEPTION_TYPE_DSI) { - /* Exception type and offending instruction location + opcode */ + /* Exception type and offending instruction location */ buf_add("DSI: Instr at %08" PRIX32, ctx->srr0); /* Was this a read or a write? */ if (ctx->dsisr & DSISR_WRITE_ATTEMPTED) { From 26a006cfac4e044fab5062b7baeed12ef982f68c Mon Sep 17 00:00:00 2001 From: Ash Date: Fri, 1 Dec 2017 18:18:02 +1100 Subject: [PATCH 15/85] [WiiU] Toolchain: Fix C++ constructor/destructor handling The old setup relied on there being at least one constructor *or* the value of *__CTOR_LIST__ being NULL. Neither of these are guaranteed; and having no C++ constructors actually resulted in a random value being read (which passed the NULL check!). This new setup uses the __CTOR_END__ symbol; which is a pointer to just after the end of the list. When there are no constructors, it has the same value as __CTOR_LIST__; so the while loop is never entered. This fix also allows us to re-enable destructors; in case they're ever needed. --- frontend/drivers/platform_wiiu.c | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/frontend/drivers/platform_wiiu.c b/frontend/drivers/platform_wiiu.c index c97ec97139..c975df3b16 100644 --- a/frontend/drivers/platform_wiiu.c +++ b/frontend/drivers/platform_wiiu.c @@ -523,22 +523,26 @@ void __eabi() __attribute__((weak)) void __init(void) { - extern void(*__CTOR_LIST__[])(void); - void(**ctor)(void) = __CTOR_LIST__; + extern void (**const __CTOR_LIST__)(void); + extern void (**const __CTOR_END__)(void); - while (*ctor) + void (**ctor)(void) = __CTOR_LIST__; + while (ctor < __CTOR_END__) { (*ctor++)(); + } } __attribute__((weak)) void __fini(void) { - extern void(*__DTOR_LIST__[])(void); - void(**ctor)(void) = __DTOR_LIST__; + extern void (**const __DTOR_LIST__)(void); + extern void (**const __DTOR_END__)(void); - while (*ctor) - (*ctor++)(); + void (**dtor)(void) = __DTOR_LIST__; + while (dtor < __DTOR_END__) { + (*dtor++)(); + } } /* libiosuhax related */ @@ -633,7 +637,7 @@ int __entry_menu(int argc, char **argv) int ret = main(argc, argv); fsdev_exit(); -// __fini(); + __fini(); memoryRelease(); return ret; } From bf3e256a43ace7b4b3fa8ee32e6818a71f6a640f Mon Sep 17 00:00:00 2001 From: Ash Date: Fri, 1 Dec 2017 18:29:21 +1100 Subject: [PATCH 16/85] [WiiU] Input: Make controller_patcher a compile-time option As discussed in libretro#5357; controller_patcher is now optional. It's off by default; though this could be changed with a simple makefile tweak (ENABLE_CONTROLLER_PATCHER ?= 1, perhaps?) To re-enable controller_patcher; append ENABLE_CONTROLLER_PATCHER=1 to your usual make command. controller_patcher was the only user of c++ constructors in the Wii U port, so you'll need 26a006c in your tree otherwise you will have a blackscreen on startup. --- Makefile.wiiu | 36 ++++++----- frontend/drivers/platform_wiiu.c | 8 ++- input/drivers_joypad/wiiu_joypad.c | 97 ++++++++++++++++++------------ input/input_autodetect_builtin.c | 6 +- 4 files changed, 88 insertions(+), 59 deletions(-) diff --git a/Makefile.wiiu b/Makefile.wiiu index b83d1caae7..00881ed117 100644 --- a/Makefile.wiiu +++ b/Makefile.wiiu @@ -18,24 +18,27 @@ OBJ += wiiu/system/exception_handler.o OBJ += wiiu/system/missing_libc_functions.o OBJ += wiiu/fs/sd_fat_devoptab.o OBJ += wiiu/fs/fs_utils.o -OBJ += wiiu/controller_patcher/ControllerPatcher.o -OBJ += wiiu/controller_patcher/ControllerPatcherWrapper.o -OBJ += wiiu/controller_patcher/ConfigReader.o -OBJ += wiiu/controller_patcher/config/ConfigParser.o -OBJ += wiiu/controller_patcher/config/ConfigValues.o -OBJ += wiiu/controller_patcher/network/ControllerPatcherNet.o -OBJ += wiiu/controller_patcher/network/TCPServer.o -OBJ += wiiu/controller_patcher/network/UDPClient.o -OBJ += wiiu/controller_patcher/network/UDPServer.o -OBJ += wiiu/controller_patcher/patcher/ControllerPatcherUtils.o -OBJ += wiiu/controller_patcher/patcher/ControllerPatcherHID.o -OBJ += wiiu/controller_patcher/utils/CPRetainVars.o -OBJ += wiiu/controller_patcher/utils/CPStringTools.o -OBJ += wiiu/controller_patcher/utils/PadConst.o -OBJ += wiiu/controller_patcher/utils/FSHelper.o OBJ += wiiu/tex_shader.o OBJ += wiiu/hbl.o +ifeq ($(ENABLE_CONTROLLER_PATCHER), 1) + OBJ += wiiu/controller_patcher/ControllerPatcher.o + OBJ += wiiu/controller_patcher/ControllerPatcherWrapper.o + OBJ += wiiu/controller_patcher/ConfigReader.o + OBJ += wiiu/controller_patcher/config/ConfigParser.o + OBJ += wiiu/controller_patcher/config/ConfigValues.o + OBJ += wiiu/controller_patcher/network/ControllerPatcherNet.o + OBJ += wiiu/controller_patcher/network/TCPServer.o + OBJ += wiiu/controller_patcher/network/UDPClient.o + OBJ += wiiu/controller_patcher/network/UDPServer.o + OBJ += wiiu/controller_patcher/patcher/ControllerPatcherUtils.o + OBJ += wiiu/controller_patcher/patcher/ControllerPatcherHID.o + OBJ += wiiu/controller_patcher/utils/CPRetainVars.o + OBJ += wiiu/controller_patcher/utils/CPStringTools.o + OBJ += wiiu/controller_patcher/utils/PadConst.o + OBJ += wiiu/controller_patcher/utils/FSHelper.o +endif + DEFINES := ifeq ($(GRIFFIN_BUILD), 1) @@ -158,6 +161,9 @@ CFLAGS += -DWIIU -DMSB_FIRST CFLAGS += -DHAVE_MAIN CFLAGS += -DHAVE_UPDATE_ASSETS CFLAGS += -DRARCH_INTERNAL -DRARCH_CONSOLE +ifeq ($(ENABLE_CONTROLLER_PATCHER), 1) + CFLAGS += -DENABLE_CONTROLLER_PATCHER +endif CFLAGS += -DHAVE_FILTERS_BUILTIN $(DEFINES) ifneq ($(PC_DEVELOPMENT_IP_ADDRESS),) diff --git a/frontend/drivers/platform_wiiu.c b/frontend/drivers/platform_wiiu.c index c975df3b16..ab8a62f115 100644 --- a/frontend/drivers/platform_wiiu.c +++ b/frontend/drivers/platform_wiiu.c @@ -58,7 +58,9 @@ #include #include -#include "wiiu/controller_patcher/ControllerPatcherWrapper.h" +#if defined(ENABLE_CONTROLLER_PATCHER) + #include "wiiu/controller_patcher/ControllerPatcherWrapper.h" +#endif #include #include @@ -430,7 +432,7 @@ int main(int argc, char **argv) KPADInit(); #endif verbosity_enable(); -#ifndef IS_SALAMANDER +#if !defined(IS_SALAMANDER) && defined(ENABLE_CONTROLLER_PATCHER) ControllerPatcherInit(); #endif fflush(stdout); @@ -492,7 +494,7 @@ int main(int argc, char **argv) } while (1); -#ifndef IS_SALAMANDER +#if !defined(IS_SALAMANDER) && defined(ENABLE_CONTROLLER_PATCHER) ControllerPatcherDeInit(); #endif main_exit(NULL); diff --git a/input/drivers_joypad/wiiu_joypad.c b/input/drivers_joypad/wiiu_joypad.c index 957e736241..ed62f14e09 100644 --- a/input/drivers_joypad/wiiu_joypad.c +++ b/input/drivers_joypad/wiiu_joypad.c @@ -21,7 +21,9 @@ #include #include -#include "wiiu/controller_patcher/ControllerPatcherWrapper.h" +#if defined(ENABLE_CONTROLLER_PATCHER) + #include "wiiu/controller_patcher/ControllerPatcherWrapper.h" +#endif #include "../input_driver.h" @@ -33,8 +35,12 @@ #include "wiiu_dbg.h" -#ifndef MAX_PADS -#define MAX_PADS 16 +#if !defined(MAX_PADS) + #if defined(ENABLE_CONTROLLER_PATCHER) + #define MAX_PADS 16 + #else + #define MAX_PADS 5 + #endif #endif #define WIIUINPUT_TYPE_WIIMOTE 0x00 @@ -45,22 +51,27 @@ #define GAMEPAD_COUNT 1 #define KPAD_COUNT 4 -#define HID_COUNT (MAX_PADS - GAMEPAD_COUNT - KPAD_COUNT) #define GAMEPAD_OFFSET 0 #define KPAD_OFFSET (GAMEPAD_OFFSET + GAMEPAD_COUNT) -#define HID_OFFSET (KPAD_OFFSET + KPAD_COUNT) + +#if defined(ENABLE_CONTROLLER_PATCHER) + #define HID_COUNT (MAX_PADS - GAMEPAD_COUNT - KPAD_COUNT) + #define HID_OFFSET (KPAD_OFFSET + KPAD_COUNT) +#endif static uint64_t pad_state[MAX_PADS]; static uint8_t pad_type[KPAD_COUNT] = {WIIUINPUT_TYPE_NONE, WIIUINPUT_TYPE_NONE, WIIUINPUT_TYPE_NONE, WIIUINPUT_TYPE_NONE}; +#if defined(ENABLE_CONTROLLER_PATCHER) static uint8_t hid_status[HID_COUNT]; static InputData hid_data[HID_COUNT]; +static char hidName[HID_COUNT][255]; +#endif + /* 3 axis - one for touch/future IR support? */ static int16_t analog_state[MAX_PADS][3][2]; static bool wiiu_pad_inited = false; -static char hidName[HID_COUNT][255]; - static const char* wiiu_joypad_name(unsigned pad) { if (pad > MAX_PADS) return "N/A"; @@ -91,12 +102,14 @@ static const char* wiiu_joypad_name(unsigned pad) } } - if (pad >= HID_OFFSET && pad < HID_OFFSET + HID_COUNT) - { - s32 hid_index = pad - HID_OFFSET; - sprintf(hidName[hid_index], "HID %04X/%04X(%02X)", hid_data[hid_index].device_info.vidpid.vid, hid_data[hid_index].device_info.vidpid.pid, hid_data[hid_index].pad); - return hidName[hid_index]; - } + #if defined(ENABLE_CONTROLLER_PATCHER) + if (pad >= HID_OFFSET && pad < HID_OFFSET + HID_COUNT) + { + s32 hid_index = pad - HID_OFFSET; + sprintf(hidName[hid_index], "HID %04X/%04X(%02X)", hid_data[hid_index].device_info.vidpid.vid, hid_data[hid_index].device_info.vidpid.pid, hid_data[hid_index].pad); + return hidName[hid_index]; + } + #endif //defined(ENABLE_CONTROLLER_PATCHER) return "unknown"; } @@ -194,9 +207,12 @@ static int16_t scaleTP(int16_t oldMin, int16_t oldMax, int16_t newMin, int16_t n static void wiiu_joypad_poll(void) { - int i, c, result; + int i, c; VPADStatus vpad; VPADReadError vpadError; + #if defined(ENABLE_CONTROLLER_PATCHER) + int result; + #endif VPADRead(0, &vpad, 1, &vpadError); @@ -311,41 +327,46 @@ static void wiiu_joypad_poll(void) } } - memset(hid_data,0,sizeof(hid_data)); - result = gettingInputAllDevices(hid_data,HID_COUNT); + #if defined(ENABLE_CONTROLLER_PATCHER) + memset(hid_data,0,sizeof(hid_data)); + result = gettingInputAllDevices(hid_data,HID_COUNT); - if (result + HID_OFFSET > MAX_PADS) - result = MAX_PADS - HID_OFFSET; + if (result + HID_OFFSET > MAX_PADS) + result = MAX_PADS - HID_OFFSET; - for(i = HID_OFFSET;i < result + HID_OFFSET; i++) - { - int hid_index = i-HID_OFFSET; - uint8_t old_status = hid_status[hid_index]; - uint8_t new_status = hid_data[hid_index].status;/* TODO: defines for the status. */ - - if (old_status == 1 || new_status == 1) + for(i = HID_OFFSET;i < result + HID_OFFSET; i++) { - hid_status[hid_index] = new_status; - if (old_status == 0 && new_status == 1) /* Pad was attached */ - wiiu_joypad_autodetect_add(i); - else if (old_status == 1 && new_status == 0) /* Pad was detached */ - input_autoconfigure_disconnect(i, wiiu_joypad.ident); - else if (old_status == 1 && new_status == 1) /* Pad still connected */ + int hid_index = i-HID_OFFSET; + uint8_t old_status = hid_status[hid_index]; + uint8_t new_status = hid_data[hid_index].status;/* TODO: defines for the status. */ + + if (old_status == 1 || new_status == 1) { - pad_state[i] = hid_data[hid_index].button_data.hold & ~0x7F800000; /* clear out emulated analog sticks */ - analog_state[i][RETRO_DEVICE_INDEX_ANALOG_LEFT] [RETRO_DEVICE_ID_ANALOG_X] = hid_data[hid_index].stick_data.leftStickX * 0x7FF0; - analog_state[i][RETRO_DEVICE_INDEX_ANALOG_LEFT] [RETRO_DEVICE_ID_ANALOG_Y] = hid_data[hid_index].stick_data.leftStickY * 0x7FF0; - analog_state[i][RETRO_DEVICE_INDEX_ANALOG_RIGHT] [RETRO_DEVICE_ID_ANALOG_X] = hid_data[hid_index].stick_data.rightStickX * 0x7FF0; - analog_state[i][RETRO_DEVICE_INDEX_ANALOG_RIGHT] [RETRO_DEVICE_ID_ANALOG_Y] = hid_data[hid_index].stick_data.rightStickY * 0x7FF0; + hid_status[hid_index] = new_status; + if (old_status == 0 && new_status == 1) /* Pad was attached */ + wiiu_joypad_autodetect_add(i); + else if (old_status == 1 && new_status == 0) /* Pad was detached */ + input_autoconfigure_disconnect(i, wiiu_joypad.ident); + else if (old_status == 1 && new_status == 1) /* Pad still connected */ + { + pad_state[i] = hid_data[hid_index].button_data.hold & ~0x7F800000; /* clear out emulated analog sticks */ + analog_state[i][RETRO_DEVICE_INDEX_ANALOG_LEFT] [RETRO_DEVICE_ID_ANALOG_X] = hid_data[hid_index].stick_data.leftStickX * 0x7FF0; + analog_state[i][RETRO_DEVICE_INDEX_ANALOG_LEFT] [RETRO_DEVICE_ID_ANALOG_Y] = hid_data[hid_index].stick_data.leftStickY * 0x7FF0; + analog_state[i][RETRO_DEVICE_INDEX_ANALOG_RIGHT] [RETRO_DEVICE_ID_ANALOG_X] = hid_data[hid_index].stick_data.rightStickX * 0x7FF0; + analog_state[i][RETRO_DEVICE_INDEX_ANALOG_RIGHT] [RETRO_DEVICE_ID_ANALOG_Y] = hid_data[hid_index].stick_data.rightStickY * 0x7FF0; + } } } - } + #endif //defined(ENABLE_CONTROLLER_PATCHER) } static bool wiiu_joypad_init(void* data) { wiiu_joypad_autodetect_add(0); - memset(hid_status,0,sizeof(hid_status)); + + #if defined(ENABLE_CONTROLLER_PATCHER) + memset(hid_status,0,sizeof(hid_status)); + #endif wiiu_joypad_poll(); wiiu_pad_inited = true; diff --git a/input/input_autodetect_builtin.c b/input/input_autodetect_builtin.c index ba55e1ecbd..bd6fdaf768 100644 --- a/input/input_autodetect_builtin.c +++ b/input/input_autodetect_builtin.c @@ -544,16 +544,16 @@ const char* const input_builtin_autoconfs[] = #endif #ifdef WIIU DECL_AUTOCONF_DEVICE("WIIU Gamepad", "wiiu", WIIUINPUT_GAMEPAD_DEFAULT_BINDS), - DECL_AUTOCONF_DEVICE("HID Controller", "wiiu", WIIUINPUT_GAMEPAD_DEFAULT_BINDS), DECL_AUTOCONF_DEVICE("WIIU Pro Controller", "wiiu", WIIUINPUT_PRO_CONTROLLER_DEFAULT_BINDS), DECL_AUTOCONF_DEVICE("Wiimote Controller", "wiiu", WIIUINPUT_WIIMOTE_DEFAULT_BINDS), DECL_AUTOCONF_DEVICE("Nunchuk Controller", "wiiu", WIIUINPUT_NUNCHUK_DEFAULT_BINDS), DECL_AUTOCONF_DEVICE("Classic Controller", "wiiu", WIIUINPUT_CLASSIC_CONTROLLER_DEFAULT_BINDS), + #if defined(ENABLE_CONTROLLER_PATCHER) + DECL_AUTOCONF_DEVICE("HID Controller", "wiiu", WIIUINPUT_GAMEPAD_DEFAULT_BINDS), + #endif #endif #ifdef __CELLOS_LV2__ DECL_AUTOCONF_DEVICE("SixAxis Controller", "ps3", PS3INPUT_DEFAULT_BINDS), #endif NULL }; - - From 5d5aa7ca608c97fa6c1367aeb4e041c5123738ff Mon Sep 17 00:00:00 2001 From: orbea Date: Fri, 1 Dec 2017 06:26:02 -0800 Subject: [PATCH 17/85] Revert "Use RetroArch Assets' Makefile to install Assets" --- Makefile | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index f9f1876a9a..8e70dd430d 100644 --- a/Makefile +++ b/Makefile @@ -201,7 +201,17 @@ install: $(TARGET) install -m644 media/retroarch.svg $(DESTDIR)$(PREFIX)/share/pixmaps @if test -d media/assets; then \ echo "Installing media assets..."; \ - $(MAKE) install -C media/assets INSTALLDIR=$(ASSETS_DIR)/retroarch/assets; \ + mkdir -p $(DESTDIR)$(ASSETS_DIR)/retroarch/assets/xmb; \ + mkdir -p $(DESTDIR)$(ASSETS_DIR)/retroarch/assets/glui; \ + cp -r media/assets/xmb/ $(DESTDIR)$(ASSETS_DIR)/retroarch/assets; \ + cp -r media/assets/glui/ $(DESTDIR)$(ASSETS_DIR)/retroarch/assets; \ + echo "Removing unneeded source image files.."; \ + rm -rf $(DESTDIR)$(ASSETS_DIR)/retroarch/assets/xmb/flatui/src; \ + rm -rf $(DESTDIR)$(ASSETS_DIR)/retroarch/assets/xmb/monochrome/src; \ + rm -rf $(DESTDIR)$(ASSETS_DIR)/retroarch/assets/xmb/retroactive/src; \ + rm -rf $(DESTDIR)$(ASSETS_DIR)/retroarch/assets/xmb/neoactive/src; \ + rm -rf $(DESTDIR)$(ASSETS_DIR)/retroarch/assets/xmb/retrosystem/src; \ + rm -rf $(DESTDIR)$(ASSETS_DIR)/retroarch/assets/xmb/dot-art/src; \ echo "Asset copying done."; \ fi From b9394846dc506ebe1785e2ee4b70fc5bb96faf5c Mon Sep 17 00:00:00 2001 From: Brad Parker Date: Fri, 1 Dec 2017 14:07:40 -0500 Subject: [PATCH 18/85] blissbox: use win32 HID API to get pad type on windows, libusb seems broken there --- Makefile.common | 2 +- tasks/task_autodetect.c | 277 +++++++++++++++++++++++++++++++++++++++- 2 files changed, 277 insertions(+), 2 deletions(-) diff --git a/Makefile.common b/Makefile.common index cac0ea4aaf..58158f33aa 100644 --- a/Makefile.common +++ b/Makefile.common @@ -1531,7 +1531,7 @@ ifneq ($(findstring Win32,$(OS)),) gfx/drivers_font/gdi_font.o \ menu/drivers_display/menu_display_gdi.o - LIBS += -lmsimg32 + LIBS += -lmsimg32 -lhid -lsetupapi endif ifeq ($(HAVE_AVFOUNDATION), 1) diff --git a/tasks/task_autodetect.c b/tasks/task_autodetect.c index 364cffea8a..fffc0fb7d0 100644 --- a/tasks/task_autodetect.c +++ b/tasks/task_autodetect.c @@ -33,6 +33,16 @@ #endif #endif +#if defined(_WIN32) && !defined(_XBOX) && !defined(_MSC_VER) && _WIN32_WINNT >= 0x0500 +/* MinGW Win32 HID API */ +#include +#include +#include +#include +/* Why doesn't including cguid.h work to get a GUID_NULL instead? */ +const GUID GUID_NULL = {0, 0, 0, {0, 0, 0, 0, 0, 0, 0, 0}}; +#endif + #include "../input/input_driver.h" #include "../input/include/blissbox.h" @@ -359,7 +369,256 @@ static void input_autoconfigure_params_free(autoconfig_params_t *params) params->autoconfig_directory = NULL; } -static const blissbox_pad_type_t* input_autoconfigure_get_blissbox_pad_type(int vid, int pid) +#ifdef _WIN32 +static const blissbox_pad_type_t* input_autoconfigure_get_blissbox_pad_type_win32(int vid, int pid) +{ + /* TODO: Remove the check for !defined(_MSC_VER) after making sure this builds on MSVC */ + + /* HID API is available since Windows 2000 */ +#if defined(_WIN32) && !defined(_XBOX) && !defined(_MSC_VER) && _WIN32_WINNT >= 0x0500 + HANDLE hDeviceHandle = INVALID_HANDLE_VALUE; + GUID guidDeviceInterface = {0}; + BOOL bResult = TRUE; + BOOL success = FALSE; + HDEVINFO hDeviceInfo; + SP_DEVINFO_DATA DeviceInfoData; + SP_DEVICE_INTERFACE_DATA deviceInterfaceData; + PSP_DEVICE_INTERFACE_DETAIL_DATA pInterfaceDetailData = NULL; + ULONG requiredLength = 0; + LPTSTR lpDevicePath = NULL; + char *devicePath = NULL; + DWORD index = 0; + DWORD intIndex = 0; + size_t nLength = 0; + unsigned len = 0; + unsigned i = 0; + char vidPidString[32] = {0}; + char vidString[5] = {0}; + char pidString[5] = {0}; + char report[USB_PACKET_CTRL_LEN + 1] = {0}; + + snprintf(vidString, sizeof(vidString), "%04x", vid); + snprintf(pidString, sizeof(pidString), "%04x", pid); + + strlcat(vidPidString, "vid_", sizeof(vidPidString)); + strlcat(vidPidString, vidString, sizeof(vidPidString)); + strlcat(vidPidString, "&pid_", sizeof(vidPidString)); + strlcat(vidPidString, pidString, sizeof(vidPidString)); + + HidD_GetHidGuid(&guidDeviceInterface); + + if (!memcmp(&guidDeviceInterface, &GUID_NULL, sizeof(GUID_NULL))) + { + RARCH_ERR("[Autoconf]: null guid\n"); + return NULL; + } + + /* Get information about all the installed devices for the specified + * device interface class. + */ + hDeviceInfo = SetupDiGetClassDevs( + &guidDeviceInterface, + NULL, + NULL, + DIGCF_PRESENT | DIGCF_DEVICEINTERFACE); + + if (hDeviceInfo == INVALID_HANDLE_VALUE) + { + RARCH_ERR("[Autoconf]: Error in SetupDiGetClassDevs: %d.\n", GetLastError()); + goto done; + } + + /* Enumerate all the device interfaces in the device information set. */ + DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA); + + while (!success) + { + success = SetupDiEnumDeviceInfo(hDeviceInfo, index, &DeviceInfoData); + + /* Reset for this iteration */ + if (lpDevicePath) + { + LocalFree(lpDevicePath); + lpDevicePath = NULL; + } + + if (pInterfaceDetailData) + { + LocalFree(pInterfaceDetailData); + pInterfaceDetailData = NULL; + } + + /* Check if this is the last item */ + if (GetLastError() == ERROR_NO_MORE_ITEMS) + break; + + deviceInterfaceData.cbSize = sizeof(SP_INTERFACE_DEVICE_DATA); + + /* Get information about the device interface. */ + for (intIndex = 0; (bResult = SetupDiEnumDeviceInterfaces( + hDeviceInfo, + &DeviceInfoData, + &guidDeviceInterface, + intIndex, + &deviceInterfaceData)); intIndex++) + { + /* Check if this is the last item */ + if (GetLastError() == ERROR_NO_MORE_ITEMS) + break; + + /* Check for some other error */ + if (!bResult) + { + RARCH_ERR("[Autoconf]: Error in SetupDiEnumDeviceInterfaces: %d.\n", GetLastError()); + goto done; + } + + /* Interface data is returned in SP_DEVICE_INTERFACE_DETAIL_DATA + * which we need to allocate, so we have to call this function twice. + * First to get the size so that we know how much to allocate, and + * second to do the actual call with the allocated buffer. + */ + + bResult = SetupDiGetDeviceInterfaceDetail( + hDeviceInfo, + &deviceInterfaceData, + NULL, 0, + &requiredLength, + NULL); + + /* Check for some other error */ + if (!bResult) + { + if ((ERROR_INSUFFICIENT_BUFFER == GetLastError()) && (requiredLength > 0)) + { + /* we got the size, now allocate buffer */ + pInterfaceDetailData = (PSP_DEVICE_INTERFACE_DETAIL_DATA)LocalAlloc(LPTR, requiredLength); + + if (!pInterfaceDetailData) + { + RARCH_ERR("[Autoconf]: Error allocating memory for the device detail buffer.\n"); + goto done; + } + } + else + { + RARCH_ERR("[Autoconf]: Other error: %d.\n", GetLastError()); + goto done; + } + } + + /* get the interface detailed data */ + pInterfaceDetailData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA); + + /* Now call it with the correct size and allocated buffer */ + bResult = SetupDiGetDeviceInterfaceDetail( + hDeviceInfo, + &deviceInterfaceData, + pInterfaceDetailData, + requiredLength, + NULL, + &DeviceInfoData); + + /* Check for some other error */ + if (!bResult) + { + RARCH_LOG("[Autoconf]: Error in SetupDiGetDeviceInterfaceDetail: %d.\n", GetLastError()); + goto done; + } + + /* copy device path */ + nLength = _tcslen(pInterfaceDetailData->DevicePath) + 1; + lpDevicePath = (TCHAR*)LocalAlloc(LPTR, nLength * sizeof(TCHAR)); + + StringCchCopy(lpDevicePath, nLength, pInterfaceDetailData->DevicePath); + + devicePath = (char*)malloc(nLength); + + for (len = 0; len < nLength; len++) + { + devicePath[len] = lpDevicePath[len]; + } + + lpDevicePath[nLength - 1] = 0; + + if (strstr(devicePath, vidPidString)) + goto found; + } + + success = FALSE; + index++; + } + + if (!lpDevicePath) + { + RARCH_ERR("[Autoconf]: No devicepath. Error %d.", GetLastError()); + goto done; + } + +found: + /* Open the device */ + hDeviceHandle = CreateFileA( + devicePath, + GENERIC_READ, /* | GENERIC_WRITE,*/ + FILE_SHARE_READ, /* | FILE_SHARE_WRITE,*/ + NULL, + OPEN_EXISTING, + 0, /*FILE_FLAG_OVERLAPPED,*/ + NULL); + + if (hDeviceHandle == INVALID_HANDLE_VALUE) + { + RARCH_ERR("[Autoconf]: Can't open device: %d.", GetLastError()); + goto done; + } + +done: + free(devicePath); + LocalFree(lpDevicePath); + LocalFree(pInterfaceDetailData); + bResult = SetupDiDestroyDeviceInfoList(hDeviceInfo); + + devicePath = NULL; + lpDevicePath = NULL; + pInterfaceDetailData = NULL; + + if (!bResult) + RARCH_ERR("[Autoconf]: Could not destroy device info list.\n"); + + if (!hDeviceHandle || hDeviceHandle == INVALID_HANDLE_VALUE) + { + /* device is not connected */ + return NULL; + } + + report[0] = BLISSBOX_USB_FEATURE_REPORT_ID; + + HidD_GetFeature(hDeviceHandle, report, sizeof(report)); + + CloseHandle(hDeviceHandle); + + for (i = 0; i < sizeof(blissbox_pad_types) / sizeof(blissbox_pad_types[0]); i++) + { + const blissbox_pad_type_t *pad = &blissbox_pad_types[i]; + + if (!pad || string_is_empty(pad->name)) + continue; + + if (pad->index == report[0]) + return pad; + } + + RARCH_LOG("[Autoconf]: Could not find connected pad in Bliss-Box port#%d.\n", pid - BLISSBOX_PID); + + return NULL; +#else + return NULL; +#endif +} +#endif + +#ifndef _WIN32 +static const blissbox_pad_type_t* input_autoconfigure_get_blissbox_pad_type_libusb(int vid, int pid) { #ifdef HAVE_LIBUSB unsigned char answer[USB_PACKET_CTRL_LEN] = {0}; @@ -437,6 +696,22 @@ error: return NULL; #endif } +#endif + +static const blissbox_pad_type_t* input_autoconfigure_get_blissbox_pad_type(int vid, int pid) +{ +#if defined(_WIN32) +#if defined(_MSC_VER) || defined(_XBOX) + /* no MSVC/XBOX support */ + return NULL; +#else + /* MinGW */ + return input_autoconfigure_get_blissbox_pad_type_win32(vid, pid); +#endif +#else + return input_autoconfigure_get_blissbox_pad_type_libusb(vid, pid); +#endif +} static void input_autoconfigure_override_handler(autoconfig_params_t *params) { From 0eb8c471665a1423faac948a02079933f4fb68c6 Mon Sep 17 00:00:00 2001 From: Brad Parker Date: Fri, 1 Dec 2017 14:38:13 -0500 Subject: [PATCH 19/85] try to fix lack of GUID type on buildbot that I cannot reproduce --- tasks/task_autodetect.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tasks/task_autodetect.c b/tasks/task_autodetect.c index fffc0fb7d0..fc402668d5 100644 --- a/tasks/task_autodetect.c +++ b/tasks/task_autodetect.c @@ -37,6 +37,8 @@ /* MinGW Win32 HID API */ #include #include +#include +#include #include #include /* Why doesn't including cguid.h work to get a GUID_NULL instead? */ From 067f5bcd16d5d8830ae33e23096d4ef36a4c4472 Mon Sep 17 00:00:00 2001 From: Brad Parker Date: Fri, 1 Dec 2017 22:40:17 -0500 Subject: [PATCH 20/85] blissbox: add 4-Play to overridden hid name --- tasks/task_autodetect.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasks/task_autodetect.c b/tasks/task_autodetect.c index fc402668d5..81dae25c86 100644 --- a/tasks/task_autodetect.c +++ b/tasks/task_autodetect.c @@ -744,7 +744,7 @@ static void input_autoconfigure_override_handler(autoconfig_params_t *params) free(params->name); /* override name given to autoconfig so it knows what kind of pad this is */ - strlcat(name, "Bliss-Box ", sizeof(name)); + strlcat(name, "Bliss-Box 4-Play ", sizeof(name)); strlcat(name, pad->name, sizeof(name)); params->name = strdup(name); From a132e33231051d30e19eca9d7aa0f12f5e64af1b Mon Sep 17 00:00:00 2001 From: twinaphex Date: Sat, 2 Dec 2017 05:17:14 +0100 Subject: [PATCH 21/85] Add copyright headers to ps3py --- tools/ps3/ps3py/LICENSE | 19 +++++++++++++++++++ tools/ps3/ps3py/crypt.c | 25 +++++++++++++++++++++++-- 2 files changed, 42 insertions(+), 2 deletions(-) create mode 100644 tools/ps3/ps3py/LICENSE diff --git a/tools/ps3/ps3py/LICENSE b/tools/ps3/ps3py/LICENSE new file mode 100644 index 0000000000..1580af9d38 --- /dev/null +++ b/tools/ps3/ps3py/LICENSE @@ -0,0 +1,19 @@ + Copyright (c) 2011 PSL1GHT Development Team + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. diff --git a/tools/ps3/ps3py/crypt.c b/tools/ps3/ps3py/crypt.c index f128b47e02..01bb770e8b 100644 --- a/tools/ps3/ps3py/crypt.c +++ b/tools/ps3/ps3py/crypt.c @@ -1,3 +1,24 @@ +/* Copyright (c) 2011 PSL1GHT Development Team + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + #include static PyObject *sha1_callback = NULL; @@ -81,10 +102,10 @@ static PyObject *register_sha1_callback(PyObject *self, PyObject *args) PyErr_SetString(PyExc_TypeError, "parameter must be callable"); return NULL; } - Py_XINCREF(temp); /* Add a reference to new callback */ + Py_XINCREF(temp); /* Add a reference to new callback */ Py_XDECREF(sha1_callback); /* Dispose of previous callback */ sha1_callback = temp; /* Remember new callback */ - /* Boilerplate to return "None" */ + /* Boilerplate to return "None" */ Py_INCREF(Py_None); result = Py_None; } From 2608fd1550fea040729c3b932b260d2f7e935c24 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Sat, 2 Dec 2017 11:36:22 +0100 Subject: [PATCH 22/85] (task_autodetect.c) Cleanups --- tasks/task_autodetect.c | 58 +++++++++++++++++++---------------------- 1 file changed, 27 insertions(+), 31 deletions(-) diff --git a/tasks/task_autodetect.c b/tasks/task_autodetect.c index 81dae25c86..4c2b454e3c 100644 --- a/tasks/task_autodetect.c +++ b/tasks/task_autodetect.c @@ -378,25 +378,26 @@ static const blissbox_pad_type_t* input_autoconfigure_get_blissbox_pad_type_win3 /* HID API is available since Windows 2000 */ #if defined(_WIN32) && !defined(_XBOX) && !defined(_MSC_VER) && _WIN32_WINNT >= 0x0500 - HANDLE hDeviceHandle = INVALID_HANDLE_VALUE; - GUID guidDeviceInterface = {0}; - BOOL bResult = TRUE; - BOOL success = FALSE; HDEVINFO hDeviceInfo; SP_DEVINFO_DATA DeviceInfoData; SP_DEVICE_INTERFACE_DATA deviceInterfaceData; - PSP_DEVICE_INTERFACE_DETAIL_DATA pInterfaceDetailData = NULL; - ULONG requiredLength = 0; - LPTSTR lpDevicePath = NULL; - char *devicePath = NULL; - DWORD index = 0; - DWORD intIndex = 0; - size_t nLength = 0; - unsigned len = 0; - unsigned i = 0; - char vidPidString[32] = {0}; - char vidString[5] = {0}; - char pidString[5] = {0}; + HANDLE hDeviceHandle = INVALID_HANDLE_VALUE; + BOOL bResult = TRUE; + BOOL success = FALSE; + GUID guidDeviceInterface = {0}; + PSP_DEVICE_INTERFACE_DETAIL_DATA + pInterfaceDetailData = NULL; + ULONG requiredLength = 0; + LPTSTR lpDevicePath = NULL; + char *devicePath = NULL; + DWORD index = 0; + DWORD intIndex = 0; + size_t nLength = 0; + unsigned len = 0; + unsigned i = 0; + char vidPidString[32] = {0}; + char vidString[5] = {0}; + char pidString[5] = {0}; char report[USB_PACKET_CTRL_LEN + 1] = {0}; snprintf(vidString, sizeof(vidString), "%04x", vid); @@ -529,17 +530,15 @@ static const blissbox_pad_type_t* input_autoconfigure_get_blissbox_pad_type_win3 } /* copy device path */ - nLength = _tcslen(pInterfaceDetailData->DevicePath) + 1; + nLength = _tcslen(pInterfaceDetailData->DevicePath) + 1; lpDevicePath = (TCHAR*)LocalAlloc(LPTR, nLength * sizeof(TCHAR)); StringCchCopy(lpDevicePath, nLength, pInterfaceDetailData->DevicePath); - devicePath = (char*)malloc(nLength); + devicePath = (char*)malloc(nLength); for (len = 0; len < nLength; len++) - { devicePath[len] = lpDevicePath[len]; - } lpDevicePath[nLength - 1] = 0; @@ -578,10 +577,10 @@ done: free(devicePath); LocalFree(lpDevicePath); LocalFree(pInterfaceDetailData); - bResult = SetupDiDestroyDeviceInfoList(hDeviceInfo); + bResult = SetupDiDestroyDeviceInfoList(hDeviceInfo); - devicePath = NULL; - lpDevicePath = NULL; + devicePath = NULL; + lpDevicePath = NULL; pInterfaceDetailData = NULL; if (!bResult) @@ -611,11 +610,9 @@ done: } RARCH_LOG("[Autoconf]: Could not find connected pad in Bliss-Box port#%d.\n", pid - BLISSBOX_PID); +#endif return NULL; -#else - return NULL; -#endif } #endif @@ -623,9 +620,9 @@ done: static const blissbox_pad_type_t* input_autoconfigure_get_blissbox_pad_type_libusb(int vid, int pid) { #ifdef HAVE_LIBUSB - unsigned char answer[USB_PACKET_CTRL_LEN] = {0}; unsigned i; - int ret = libusb_init(NULL); + unsigned char answer[USB_PACKET_CTRL_LEN] = {0}; + int ret = libusb_init(NULL); if (ret < 0) { @@ -693,10 +690,9 @@ static const blissbox_pad_type_t* input_autoconfigure_get_blissbox_pad_type_libu error: libusb_close(autoconfig_libusb_handle); libusb_exit(NULL); - return NULL; -#else - return NULL; #endif + + return NULL; } #endif From 78bf72e29e10c85ef642ba4921fb6a45a5033ffc Mon Sep 17 00:00:00 2001 From: bparker06 Date: Sat, 2 Dec 2017 13:33:09 -0500 Subject: [PATCH 23/85] blissbox: add atari pad type --- input/include/blissbox.h | 1 + 1 file changed, 1 insertion(+) diff --git a/input/include/blissbox.h b/input/include/blissbox.h index fd515ee218..4ec18e500d 100644 --- a/input/include/blissbox.h +++ b/input/include/blissbox.h @@ -42,6 +42,7 @@ const blissbox_pad_type_t blissbox_pad_types[] = {"A5200_TB", 50}, {"A7800", 4}, {"ATARI_KEYPAD", 43}, + {"ATARI", 0}, {"ATMARK", 10}, {"BALLY", 42}, {"CD32", 24}, From b1911495adb7e0509f96ff75012a722851f95193 Mon Sep 17 00:00:00 2001 From: radius Date: Sat, 2 Dec 2017 13:59:44 -0500 Subject: [PATCH 24/85] reenable network gamepad --- menu/menu_displaylist.c | 2 +- menu/menu_setting.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/menu/menu_displaylist.c b/menu/menu_displaylist.c index 2622132870..b42384394d 100644 --- a/menu/menu_displaylist.c +++ b/menu/menu_displaylist.c @@ -4273,7 +4273,7 @@ bool menu_displaylist_process(menu_displaylist_info_t *info) MENU_SETTING_ACTION, 0, 0); #endif -#if defined(HAVE_NETWORKING) && defined(HAVE_NETWORKGAMEPAD) && defined(HAVE_NETWORKGAMEPAD_CORE) +#if defined(HAVE_NETWORKING) && defined(HAVE_NETWORKGAMEPAD) menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_START_NET_RETROPAD), msg_hash_to_str(MENU_ENUM_LABEL_START_NET_RETROPAD), diff --git a/menu/menu_setting.c b/menu/menu_setting.c index 22e36c4b68..86cca1a42a 100644 --- a/menu/menu_setting.c +++ b/menu/menu_setting.c @@ -2263,7 +2263,7 @@ static bool setting_append_list( parent_group); #endif -#if defined(HAVE_NETWORKING) && defined(HAVE_NETWORKGAMEPAD) && defined(HAVE_NETWORKGAMEPAD_CORE) +#if defined(HAVE_NETWORKING) && defined(HAVE_NETWORKGAMEPAD) CONFIG_ACTION( list, list_info, MENU_ENUM_LABEL_START_NET_RETROPAD, From 4efc8453c232996f3bfb2a83470fa5e14b54d44a Mon Sep 17 00:00:00 2001 From: Brad Parker Date: Sat, 2 Dec 2017 15:59:33 -0500 Subject: [PATCH 25/85] buildfix for certain mingw environments --- tasks/task_autodetect.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/tasks/task_autodetect.c b/tasks/task_autodetect.c index 4c2b454e3c..66080478f8 100644 --- a/tasks/task_autodetect.c +++ b/tasks/task_autodetect.c @@ -35,7 +35,15 @@ #if defined(_WIN32) && !defined(_XBOX) && !defined(_MSC_VER) && _WIN32_WINNT >= 0x0500 /* MinGW Win32 HID API */ +#include +#include #include +#ifdef __NO_INLINE__ +/* Workaround MinGW issue where compiling without -O2 (which sets __NO_INLINE__) causes the strsafe functions + * to never be defined (only declared). + */ +#define __CRT_STRSAFE_IMPL +#endif #include #include #include From e9a3088a795366929c5ff9c2757d64ae3d49ef6b Mon Sep 17 00:00:00 2001 From: Ash Date: Sun, 3 Dec 2017 11:31:30 +1100 Subject: [PATCH 26/85] [WiiU] Toolchain: Actually fix C++ constructors/destructors (oops!) Looks like I temporarily forgot how external symbols work. Fixes https://gbatemp.net/posts/7720955; hopefully we finally have C++ under control. --- frontend/drivers/platform_wiiu.c | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/frontend/drivers/platform_wiiu.c b/frontend/drivers/platform_wiiu.c index ab8a62f115..925f820652 100644 --- a/frontend/drivers/platform_wiiu.c +++ b/frontend/drivers/platform_wiiu.c @@ -525,24 +525,23 @@ void __eabi() __attribute__((weak)) void __init(void) { - extern void (**const __CTOR_LIST__)(void); - extern void (**const __CTOR_END__)(void); + extern void (*const __CTOR_LIST__)(void); + extern void (*const __CTOR_END__)(void); - void (**ctor)(void) = __CTOR_LIST__; - while (ctor < __CTOR_END__) { + void (*const *ctor)(void) = &__CTOR_LIST__; + while (ctor < &__CTOR_END__) { (*ctor++)(); } } - __attribute__((weak)) void __fini(void) { - extern void (**const __DTOR_LIST__)(void); - extern void (**const __DTOR_END__)(void); + extern void (*const __DTOR_LIST__)(void); + extern void (*const __DTOR_END__)(void); - void (**dtor)(void) = __DTOR_LIST__; - while (dtor < __DTOR_END__) { + void (*const *dtor)(void) = &__DTOR_LIST__; + while (dtor < &__DTOR_END__) { (*dtor++)(); } } @@ -654,7 +653,10 @@ void _start(int argc, char **argv) main(argc, argv); fsdev_exit(); -// __fini(); + +/* TODO: fix elf2rpl so it doesn't error with "Could not find matching symbol + for relocation" then uncomment this */ +// __fini(); memoryRelease(); SYSRelaunchTitle(0, 0); exit(0); From 69c2040e55755a8a093815a34a6c7f495fd12f8d Mon Sep 17 00:00:00 2001 From: radius Date: Sat, 2 Dec 2017 21:29:13 -0500 Subject: [PATCH 27/85] fix slow motion --- configuration.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/configuration.c b/configuration.c index 14b8d82c0a..30f985f4f3 100644 --- a/configuration.c +++ b/configuration.c @@ -2718,7 +2718,9 @@ static bool config_load_file(const char *path, bool set_defaults, *settings->paths.directory_system = '\0'; if (settings->floats.slowmotion_ratio < 1.0f) - configuration_set_float(settings, settings->floats.slowmotion_ratio, 1.0f); + { + configuration_set_float(settings, settings->floats.slowmotion_ratio, 15.0f); + } /* Sanitize fastforward_ratio value - previously range was -1 * and up (with 0 being skipped) */ @@ -2727,6 +2729,7 @@ static bool config_load_file(const char *path, bool set_defaults, configuration_set_float(settings, settings->floats.fastforward_ratio, 0.0f); } + #ifdef HAVE_LAKKA settings->bools.ssh_enable = path_file_exists(LAKKA_SSH_PATH); settings->bools.samba_enable = path_file_exists(LAKKA_SAMBA_PATH); From 0a3fb3ec40912211bbbafce8eb73fa61eef17c4b Mon Sep 17 00:00:00 2001 From: twinaphex Date: Sun, 3 Dec 2017 03:37:06 +0100 Subject: [PATCH 28/85] Change value to 1.0f --- configuration.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configuration.c b/configuration.c index 30f985f4f3..0af3f1e94a 100644 --- a/configuration.c +++ b/configuration.c @@ -2719,7 +2719,7 @@ static bool config_load_file(const char *path, bool set_defaults, if (settings->floats.slowmotion_ratio < 1.0f) { - configuration_set_float(settings, settings->floats.slowmotion_ratio, 15.0f); + configuration_set_float(settings, settings->floats.slowmotion_ratio, 1.0f); } /* Sanitize fastforward_ratio value - previously range was -1 From 04b26fe111d991eedfd4ee879bd962472dc0d1c4 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Sun, 3 Dec 2017 03:43:05 +0100 Subject: [PATCH 29/85] Put braces around macros --- configuration.c | 4 ---- configuration.h | 17 ++++++++++++----- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/configuration.c b/configuration.c index 0af3f1e94a..8edb392412 100644 --- a/configuration.c +++ b/configuration.c @@ -2718,16 +2718,12 @@ static bool config_load_file(const char *path, bool set_defaults, *settings->paths.directory_system = '\0'; if (settings->floats.slowmotion_ratio < 1.0f) - { configuration_set_float(settings, settings->floats.slowmotion_ratio, 1.0f); - } /* Sanitize fastforward_ratio value - previously range was -1 * and up (with 0 being skipped) */ if (settings->floats.fastforward_ratio < 0.0f) - { configuration_set_float(settings, settings->floats.fastforward_ratio, 0.0f); - } #ifdef HAVE_LAKKA diff --git a/configuration.h b/configuration.h index 31dbeebff3..c81a53f962 100644 --- a/configuration.h +++ b/configuration.h @@ -29,21 +29,28 @@ #include "input/input_defines.h" #define configuration_set_float(settings, var, newvar) \ +{ \ settings->modified = true; \ - var = newvar + var = newvar; \ +} #define configuration_set_bool(settings, var, newvar) \ +{ \ settings->modified = true; \ - var = newvar + var = newvar; \ +} #define configuration_set_uint(settings, var, newvar) \ +{ \ settings->modified = true; \ - var = newvar + var = newvar; \ +} #define configuration_set_int(settings, var, newvar) \ +{ \ settings->modified = true; \ - var = newvar - + var = newvar; \ +} enum override_type { From bada13a2152b2092e7c66e656b06f14bcd8ea07c Mon Sep 17 00:00:00 2001 From: radius Date: Sat, 2 Dec 2017 22:47:16 -0500 Subject: [PATCH 30/85] let it snow --- .../gl_shaders/pipeline_snowflake.glsl.frag.h | 65 +++++++++++++++++++ gfx/drivers_shader/shader_glsl.c | 16 +++++ gfx/video_driver.h | 1 + intl/msg_hash_us.h | 2 + menu/cbs/menu_cbs_get_value.c | 4 ++ menu/drivers/xmb.c | 3 + menu/drivers_display/menu_display_gl.c | 2 + menu/menu_driver.h | 1 + msg_hash.h | 1 + 9 files changed, 95 insertions(+) create mode 100644 gfx/drivers/gl_shaders/pipeline_snowflake.glsl.frag.h diff --git a/gfx/drivers/gl_shaders/pipeline_snowflake.glsl.frag.h b/gfx/drivers/gl_shaders/pipeline_snowflake.glsl.frag.h new file mode 100644 index 0000000000..f2bd97f6df --- /dev/null +++ b/gfx/drivers/gl_shaders/pipeline_snowflake.glsl.frag.h @@ -0,0 +1,65 @@ +/* credits to: TheTimJames + https://www.shadertoy.com/view/Md2GRw +*/ + +#include "shaders_common.h" + +static const char* stock_fragment_xmb_snowflake = GLSL( + uniform float time; + uniform float atime; + uniform vec2 OutputSize; + vec2 uv; + + float rand(vec2 co) + { + return fract(sin(dot(co.xy, vec2(12.9898, 78.233))) * 43758.5453); + } + + float snow(vec3 pos, vec2 uv, float o) + { + vec2 d = (pos.xy - uv); + float a = atan(d.y,d.x)+sin(atime*1.+o)*10.; + + float dist = d.x*d.x + d.y*d.y; + + if(dist < pos.z/400.){ + float col = 0.0; + if(sin(a*8.) < 0.0){col=1.0;} + if(distprg[VIDEO_SHADER_MENU_5].id, &glsl->uniforms[VIDEO_SHADER_MENU_5]); + +#if defined(HAVE_OPENGLES) + shader_prog_info.vertex = stock_vertex_xmb_snow_modern; +#else + shader_prog_info.vertex = glsl_core ? stock_vertex_xmb_snow_modern : stock_vertex_xmb_snow_legacy; +#endif + shader_prog_info.fragment = stock_fragment_xmb_snowflake; + + gl_glsl_compile_program( + glsl, + VIDEO_SHADER_MENU_6, + &glsl->prg[VIDEO_SHADER_MENU_6], + &shader_prog_info); + gl_glsl_find_uniforms(glsl, 0, glsl->prg[VIDEO_SHADER_MENU_6].id, + &glsl->uniforms[VIDEO_SHADER_MENU_6]); #endif gl_glsl_reset_attrib(glsl); diff --git a/gfx/video_driver.h b/gfx/video_driver.h index 0267c11e6d..6836ede817 100644 --- a/gfx/video_driver.h +++ b/gfx/video_driver.h @@ -56,6 +56,7 @@ #define VIDEO_SHADER_MENU_3 (GFX_MAX_SHADERS - 4) #define VIDEO_SHADER_MENU_4 (GFX_MAX_SHADERS - 5) #define VIDEO_SHADER_MENU_5 (GFX_MAX_SHADERS - 6) +#define VIDEO_SHADER_MENU_6 (GFX_MAX_SHADERS - 7) #endif diff --git a/intl/msg_hash_us.h b/intl/msg_hash_us.h index 5fb03ee34b..25a36dda4f 100644 --- a/intl/msg_hash_us.h +++ b/intl/msg_hash_us.h @@ -2542,6 +2542,8 @@ MSG_HASH( ) MSG_HASH(MENU_ENUM_LABEL_VALUE_SHADER_PIPELINE_BOKEH, "Bokeh") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SHADER_PIPELINE_SNOWFLAKE, + "Snowflake") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_REFRESH_ROOMS, "Refresh Room List") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_ROOM_NICKNAME, diff --git a/menu/cbs/menu_cbs_get_value.c b/menu/cbs/menu_cbs_get_value.c index 7c42baa346..5b98e95554 100644 --- a/menu/cbs/menu_cbs_get_value.c +++ b/menu/cbs/menu_cbs_get_value.c @@ -246,6 +246,10 @@ static void menu_action_setting_disp_set_label_pipeline( strlcpy(s, msg_hash_to_str( MENU_ENUM_LABEL_VALUE_SHADER_PIPELINE_BOKEH), len); + case XMB_SHADER_PIPELINE_SNOWFLAKE: + strlcpy(s, + msg_hash_to_str( + MENU_ENUM_LABEL_VALUE_SHADER_PIPELINE_SNOWFLAKE), len); break; } diff --git a/menu/drivers/xmb.c b/menu/drivers/xmb.c index 0392da6f34..0185ec76ee 100755 --- a/menu/drivers/xmb.c +++ b/menu/drivers/xmb.c @@ -2759,6 +2759,9 @@ static void xmb_draw_bg( case XMB_SHADER_PIPELINE_BOKEH: draw.pipeline.id = VIDEO_SHADER_MENU_5; break; + case XMB_SHADER_PIPELINE_SNOWFLAKE: + draw.pipeline.id = VIDEO_SHADER_MENU_6; + break; default: break; } diff --git a/menu/drivers_display/menu_display_gl.c b/menu/drivers_display/menu_display_gl.c index 65cf522115..d1d57b7075 100644 --- a/menu/drivers_display/menu_display_gl.c +++ b/menu/drivers_display/menu_display_gl.c @@ -185,6 +185,7 @@ static void menu_display_gl_draw_pipeline(void *data) case VIDEO_SHADER_MENU_3: case VIDEO_SHADER_MENU_4: case VIDEO_SHADER_MENU_5: + case VIDEO_SHADER_MENU_6: shader_info.data = NULL; shader_info.idx = draw->pipeline.id; shader_info.set_active = true; @@ -215,6 +216,7 @@ static void menu_display_gl_draw_pipeline(void *data) case VIDEO_SHADER_MENU_3: case VIDEO_SHADER_MENU_4: case VIDEO_SHADER_MENU_5: + case VIDEO_SHADER_MENU_6: #ifndef HAVE_PSGL uniform_param.type = UNIFORM_2F; uniform_param.lookup.ident = "OutputSize"; diff --git a/menu/menu_driver.h b/menu/menu_driver.h index d660ccbb4b..f2d3db313f 100644 --- a/menu/menu_driver.h +++ b/menu/menu_driver.h @@ -260,6 +260,7 @@ enum xmb_shader_pipeline XMB_SHADER_PIPELINE_SIMPLE_SNOW, XMB_SHADER_PIPELINE_SNOW, XMB_SHADER_PIPELINE_BOKEH, + XMB_SHADER_PIPELINE_SNOWFLAKE, XMB_SHADER_PIPELINE_LAST }; diff --git a/msg_hash.h b/msg_hash.h index fdd00470e1..f9e92af1d3 100644 --- a/msg_hash.h +++ b/msg_hash.h @@ -447,6 +447,7 @@ enum msg_hash_enums MENU_LABEL(SHADER_PIPELINE_SIMPLE_SNOW), MENU_LABEL(SHADER_PIPELINE_SNOW), MENU_LABEL(SHADER_PIPELINE_BOKEH), + MENU_LABEL(SHADER_PIPELINE_SNOWFLAKE), MENU_LABEL(MATERIALUI_MENU_HEADER_OPACITY), MENU_LABEL(MATERIALUI_MENU_FOOTER_OPACITY), From 3cd7026819286e2ced5adcfa267207290a73a9fd Mon Sep 17 00:00:00 2001 From: radius Date: Sun, 3 Dec 2017 12:19:00 -0500 Subject: [PATCH 31/85] fix the shader and the label --- gfx/drivers/gl_shaders/pipeline_snowflake.glsl.frag.h | 8 ++++---- menu/cbs/menu_cbs_get_value.c | 1 + 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/gfx/drivers/gl_shaders/pipeline_snowflake.glsl.frag.h b/gfx/drivers/gl_shaders/pipeline_snowflake.glsl.frag.h index f2bd97f6df..a5426710ba 100644 --- a/gfx/drivers/gl_shaders/pipeline_snowflake.glsl.frag.h +++ b/gfx/drivers/gl_shaders/pipeline_snowflake.glsl.frag.h @@ -15,6 +15,8 @@ static const char* stock_fragment_xmb_snowflake = GLSL( return fract(sin(dot(co.xy, vec2(12.9898, 78.233))) * 43758.5453); } + float rand(float x){ return rand(vec2(x,1.0));} + float snow(vec3 pos, vec2 uv, float o) { vec2 d = (pos.xy - uv); @@ -35,17 +37,15 @@ static const char* stock_fragment_xmb_snowflake = GLSL( float col(vec2 c) { float color = 0.0; - for (int i = 1; i < 15; i++) + for (int i = 1; i < 50; i++) { - float o = rand(float(i) / 3.) * 15 * 2.0; + float o = rand(float(i) / 3.0) * 15 * 2.0; float z = rand(float(i) + 13.0); float x = 1.8 - (3.6) * (rand(floor((time*((z+1.0)/2.0)+o)/2.0)) + sin(time*o/1000.0)/10.0); float y = 1.0-mod((time*((z+1.0)/2.0))+o, 2.0); color += snow(vec3(x,y,z),c,o); } - - return color; } diff --git a/menu/cbs/menu_cbs_get_value.c b/menu/cbs/menu_cbs_get_value.c index 5b98e95554..d58701f8e3 100644 --- a/menu/cbs/menu_cbs_get_value.c +++ b/menu/cbs/menu_cbs_get_value.c @@ -246,6 +246,7 @@ static void menu_action_setting_disp_set_label_pipeline( strlcpy(s, msg_hash_to_str( MENU_ENUM_LABEL_VALUE_SHADER_PIPELINE_BOKEH), len); + break; case XMB_SHADER_PIPELINE_SNOWFLAKE: strlcpy(s, msg_hash_to_str( From 2747067f6188d0e4f845c6ceb5d39a33ab193b87 Mon Sep 17 00:00:00 2001 From: radius Date: Sun, 3 Dec 2017 15:10:24 -0500 Subject: [PATCH 32/85] this probably fixes the shader on noveau and others --- .../gl_shaders/pipeline_snowflake.glsl.frag.h | 39 ++++++++++++------- 1 file changed, 25 insertions(+), 14 deletions(-) diff --git a/gfx/drivers/gl_shaders/pipeline_snowflake.glsl.frag.h b/gfx/drivers/gl_shaders/pipeline_snowflake.glsl.frag.h index a5426710ba..1b048d2223 100644 --- a/gfx/drivers/gl_shaders/pipeline_snowflake.glsl.frag.h +++ b/gfx/drivers/gl_shaders/pipeline_snowflake.glsl.frag.h @@ -6,29 +6,40 @@ static const char* stock_fragment_xmb_snowflake = GLSL( uniform float time; - uniform float atime; uniform vec2 OutputSize; vec2 uv; + float atime; + float rand(vec2 co) { return fract(sin(dot(co.xy, vec2(12.9898, 78.233))) * 43758.5453); } - float rand(float x){ return rand(vec2(x,1.0));} + float rand_float(float x) + { + return rand(vec2(x, 1.0)); + } float snow(vec3 pos, vec2 uv, float o) { vec2 d = (pos.xy - uv); - float a = atan(d.y,d.x)+sin(atime*1.+o)*10.; + float a = atan(d.y,d.x) + sin(atime*1.0 + o) * 10.0; float dist = d.x*d.x + d.y*d.y; - if(dist < pos.z/400.){ + if(dist < pos.z/400.0) + { float col = 0.0; - if(sin(a*8.) < 0.0){col=1.0;} - if(dist Date: Mon, 4 Dec 2017 02:48:08 +0100 Subject: [PATCH 33/85] OSX PowerPC might not define O_CLOEXEC --- libretro-common/file/nbio/nbio_unixmmap.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/libretro-common/file/nbio/nbio_unixmmap.c b/libretro-common/file/nbio/nbio_unixmmap.c index 40703ae138..80325da393 100644 --- a/libretro-common/file/nbio/nbio_unixmmap.c +++ b/libretro-common/file/nbio/nbio_unixmmap.c @@ -39,6 +39,20 @@ #include #include +#ifdef __APPLE__ + +#ifndef O_CLOEXEC +#define O_CLOEXEC 0x1000000 +#endif + +#else + +#ifndef O_CLOEXEC +#define O_CLOEXEC 0 +#endif + +#endif + struct nbio_mmap_unix_t { int fd; From 43f6a03110a03ec1216e645645fa087fd91ba96c Mon Sep 17 00:00:00 2001 From: neville Date: Mon, 4 Dec 2017 02:59:06 +0100 Subject: [PATCH 34/85] (OSX PPC) Buildfixes --- gfx/common/gl_common.h | 5 +---- input/input_driver.c | 3 +++ 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/gfx/common/gl_common.h b/gfx/common/gl_common.h index 5d5c1fa284..04f2d6e3f4 100644 --- a/gfx/common/gl_common.h +++ b/gfx/common/gl_common.h @@ -33,15 +33,12 @@ #include "../video_coord_array.h" #include "../video_driver.h" #include "../drivers/gl_symlinks.h" +#include RETRO_BEGIN_DECLS #define MAX_FENCES 4 -#ifndef ARB_sync -typedef struct __GLsync *GLsync; -#endif - typedef struct gl { GLenum internal_fmt; diff --git a/input/input_driver.c b/input/input_driver.c index abfba95a91..b2e216c191 100644 --- a/input/input_driver.c +++ b/input/input_driver.c @@ -806,6 +806,9 @@ void input_menu_keys_pressed(void *data, retro_bits_t* p_new_state) uint8_t port_max = settings->bools.input_all_users_control_menu ? max_users : 1; + + joypad_info.joy_idx = 0; + joypad_info.auto_binds = NULL; RARCH_INPUT_STATE_CLEAR_PTR( p_new_state ); From f53093de4d4e8e5893dd7bd20b30989ea6a2d9dd Mon Sep 17 00:00:00 2001 From: twinaphex Date: Mon, 4 Dec 2017 03:12:27 +0100 Subject: [PATCH 35/85] Default to nbio stdio for PowerPC Mac --- libretro-common/file/nbio/nbio_intf.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libretro-common/file/nbio/nbio_intf.c b/libretro-common/file/nbio/nbio_intf.c index 57d3eb6484..925cd6884e 100644 --- a/libretro-common/file/nbio/nbio_intf.c +++ b/libretro-common/file/nbio/nbio_intf.c @@ -36,7 +36,7 @@ extern nbio_intf_t nbio_stdio; #if defined(_linux__) static nbio_intf_t *internal_nbio = &nbio_linux; -#elif defined(HAVE_MMAP) && defined(BSD) +#elif defined(HAVE_MMAP) && defined(BSD) && !defined(__powerpc__) && !defined(__ppc__) static nbio_intf_t *internal_nbio = &nbio_mmap_unix; #elif defined(_WIN32) && !defined(_XBOX) static nbio_intf_t *internal_nbio = &nbio_mmap_win32; From 0bf461c40ff2a78dc6695f0a56bec8348ba11a93 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Mon, 4 Dec 2017 03:27:03 +0100 Subject: [PATCH 36/85] Try to get past OSX PowerPC crash on exit --- gfx/drivers_renderchain/gl2_renderchain.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/gfx/drivers_renderchain/gl2_renderchain.c b/gfx/drivers_renderchain/gl2_renderchain.c index 0c9733e35f..5f68e6005e 100644 --- a/gfx/drivers_renderchain/gl2_renderchain.c +++ b/gfx/drivers_renderchain/gl2_renderchain.c @@ -420,19 +420,25 @@ static void gl2_renderchain_deinit_fbo(void *data) { gl_t *gl = (gl_t*)data; + if (!gl) + return; + glDeleteTextures(gl->fbo_pass, gl->fbo_texture); - glDeleteFramebuffers(gl->fbo_pass, gl->fbo); + + if (gl->fbo) + glDeleteFramebuffers(gl->fbo_pass, gl->fbo); + memset(gl->fbo_texture, 0, sizeof(gl->fbo_texture)); - memset(gl->fbo, 0, sizeof(gl->fbo)); - gl->fbo_inited = false; - gl->fbo_pass = 0; + memset(gl->fbo, 0, sizeof(gl->fbo)); if (gl->fbo_feedback) glDeleteFramebuffers(1, &gl->fbo_feedback); if (gl->fbo_feedback_texture) glDeleteTextures(1, &gl->fbo_feedback_texture); + gl->fbo_inited = false; gl->fbo_feedback_enable = false; + gl->fbo_pass = 0; gl->fbo_feedback_pass = 0; gl->fbo_feedback_texture = 0; gl->fbo_feedback = 0; From 62215129115cf9e6f5bea6859a52f90cfd7eaad5 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Mon, 4 Dec 2017 04:04:07 +0100 Subject: [PATCH 37/85] use EXT version of Framebuffer/Renderbuffer functions for MacOS X PowerPC --- gfx/drivers/gl_symlinks.h | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/gfx/drivers/gl_symlinks.h b/gfx/drivers/gl_symlinks.h index 8628698f3e..fb84a8b182 100644 --- a/gfx/drivers/gl_symlinks.h +++ b/gfx/drivers/gl_symlinks.h @@ -38,6 +38,17 @@ #define glFramebufferRenderbuffer glFramebufferRenderbufferOES #define glRenderbufferStorage glRenderbufferStorageOES #define glDeleteRenderbuffers glDeleteRenderbuffersOES +#elif (defined(__MACH__) && (defined(__ppc__) || defined(__ppc64__))) +#define glGenFramebuffers glGenFramebuffersEXT +#define glBindFramebuffer glBindFramebufferEXT +#define glFramebufferTexture2D glFramebufferTexture2DEXT +#define glCheckFramebufferStatus glCheckFramebufferStatusEXT +#define glDeleteFramebuffers glDeleteFramebuffersEXT +#define glGenRenderbuffers glGenRenderbuffersEXT +#define glBindRenderbuffer glBindRenderbufferEXT +#define glFramebufferRenderbuffer glFramebufferRenderbufferEXT +#define glRenderbufferStorage glRenderbufferStorageEXT +#define glDeleteRenderbuffers glDeleteRenderbuffersEXT #endif #if defined(HAVE_PSGL) From 52e7a533f096dd71ada1cb3daf691414660fe0a5 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Mon, 4 Dec 2017 04:12:46 +0100 Subject: [PATCH 38/85] Improve FBO check --- libretro-common/gfx/gl_capabilities.c | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/libretro-common/gfx/gl_capabilities.c b/libretro-common/gfx/gl_capabilities.c index 221aa2a0b7..695650eee0 100644 --- a/libretro-common/gfx/gl_capabilities.c +++ b/libretro-common/gfx/gl_capabilities.c @@ -179,16 +179,13 @@ bool gl_check_capability(enum gl_capability_enum enum_idx) && !gl_query_extension("EXT_framebuffer_object")) return false; - if (glGenFramebuffers - && glBindFramebuffer - && glFramebufferTexture2D - && glCheckFramebufferStatus - && glDeleteFramebuffers - && glGenRenderbuffers - && glBindRenderbuffer - && glFramebufferRenderbuffer - && glRenderbufferStorage - && glDeleteRenderbuffers) + if (gl_query_extension("ARB_framebuffer_object")) + return true; + + if (gl_query_extension("EXT_framebuffer_object")) + return true; + + if (major >= 3) return true; break; #endif From b2fbb9aeda9bfb270920131ee76fe21464790f89 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Mon, 4 Dec 2017 04:18:28 +0100 Subject: [PATCH 39/85] Prepare to map DeleteFramebuffersEXT like this --- gfx/drivers/gl_symlinks.h | 11 ----------- gfx/drivers_renderchain/gl2_renderchain.c | 4 +--- libretro-common/glsym/glsym_gl.c | 4 ++++ 3 files changed, 5 insertions(+), 14 deletions(-) diff --git a/gfx/drivers/gl_symlinks.h b/gfx/drivers/gl_symlinks.h index fb84a8b182..8628698f3e 100644 --- a/gfx/drivers/gl_symlinks.h +++ b/gfx/drivers/gl_symlinks.h @@ -38,17 +38,6 @@ #define glFramebufferRenderbuffer glFramebufferRenderbufferOES #define glRenderbufferStorage glRenderbufferStorageOES #define glDeleteRenderbuffers glDeleteRenderbuffersOES -#elif (defined(__MACH__) && (defined(__ppc__) || defined(__ppc64__))) -#define glGenFramebuffers glGenFramebuffersEXT -#define glBindFramebuffer glBindFramebufferEXT -#define glFramebufferTexture2D glFramebufferTexture2DEXT -#define glCheckFramebufferStatus glCheckFramebufferStatusEXT -#define glDeleteFramebuffers glDeleteFramebuffersEXT -#define glGenRenderbuffers glGenRenderbuffersEXT -#define glBindRenderbuffer glBindRenderbufferEXT -#define glFramebufferRenderbuffer glFramebufferRenderbufferEXT -#define glRenderbufferStorage glRenderbufferStorageEXT -#define glDeleteRenderbuffers glDeleteRenderbuffersEXT #endif #if defined(HAVE_PSGL) diff --git a/gfx/drivers_renderchain/gl2_renderchain.c b/gfx/drivers_renderchain/gl2_renderchain.c index 5f68e6005e..69b70b71fa 100644 --- a/gfx/drivers_renderchain/gl2_renderchain.c +++ b/gfx/drivers_renderchain/gl2_renderchain.c @@ -424,9 +424,7 @@ static void gl2_renderchain_deinit_fbo(void *data) return; glDeleteTextures(gl->fbo_pass, gl->fbo_texture); - - if (gl->fbo) - glDeleteFramebuffers(gl->fbo_pass, gl->fbo); + glDeleteFramebuffers(gl->fbo_pass, gl->fbo); memset(gl->fbo_texture, 0, sizeof(gl->fbo_texture)); memset(gl->fbo, 0, sizeof(gl->fbo)); diff --git a/libretro-common/glsym/glsym_gl.c b/libretro-common/glsym/glsym_gl.c index 5aa92fdca2..41680ffcd1 100644 --- a/libretro-common/glsym/glsym_gl.c +++ b/libretro-common/glsym/glsym_gl.c @@ -308,7 +308,11 @@ const struct rglgen_sym_map rglgen_symbol_map[] = { SYM(GetRenderbufferParameteriv), SYM(IsFramebuffer), SYM(BindFramebuffer), +#if (defined(__MACH__) && (defined(__ppc__) || defined(__ppc64__))) + SYM(DeleteFramebuffersEXT), +#else SYM(DeleteFramebuffers), +#endif SYM(GenFramebuffers), SYM(CheckFramebufferStatus), SYM(FramebufferTexture1D), From e9af9f1b092a24699fc6023817d8ae21fc582a55 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Mon, 4 Dec 2017 04:20:54 +0100 Subject: [PATCH 40/85] Add EXT version --- libretro-common/glsym/glsym_gl.c | 1 + 1 file changed, 1 insertion(+) diff --git a/libretro-common/glsym/glsym_gl.c b/libretro-common/glsym/glsym_gl.c index 41680ffcd1..585e7c320c 100644 --- a/libretro-common/glsym/glsym_gl.c +++ b/libretro-common/glsym/glsym_gl.c @@ -1341,6 +1341,7 @@ RGLSYMGLGETRENDERBUFFERPARAMETERIVPROC __rglgen_glGetRenderbufferParameteriv; RGLSYMGLISFRAMEBUFFERPROC __rglgen_glIsFramebuffer; RGLSYMGLBINDFRAMEBUFFERPROC __rglgen_glBindFramebuffer; RGLSYMGLDELETEFRAMEBUFFERSPROC __rglgen_glDeleteFramebuffers; +RGLSYMGLDELETEFRAMEBUFFERSPROC __rglgen_glDeleteFramebuffersEXT; RGLSYMGLGENFRAMEBUFFERSPROC __rglgen_glGenFramebuffers; RGLSYMGLCHECKFRAMEBUFFERSTATUSPROC __rglgen_glCheckFramebufferStatus; RGLSYMGLFRAMEBUFFERTEXTURE1DPROC __rglgen_glFramebufferTexture1D; From 19d7afd0c26778fc1e50dab9f31fd72048c75c57 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Mon, 4 Dec 2017 04:30:28 +0100 Subject: [PATCH 41/85] remove --- libretro-common/glsym/glsym_gl.c | 5 ----- 1 file changed, 5 deletions(-) diff --git a/libretro-common/glsym/glsym_gl.c b/libretro-common/glsym/glsym_gl.c index 585e7c320c..5aa92fdca2 100644 --- a/libretro-common/glsym/glsym_gl.c +++ b/libretro-common/glsym/glsym_gl.c @@ -308,11 +308,7 @@ const struct rglgen_sym_map rglgen_symbol_map[] = { SYM(GetRenderbufferParameteriv), SYM(IsFramebuffer), SYM(BindFramebuffer), -#if (defined(__MACH__) && (defined(__ppc__) || defined(__ppc64__))) - SYM(DeleteFramebuffersEXT), -#else SYM(DeleteFramebuffers), -#endif SYM(GenFramebuffers), SYM(CheckFramebufferStatus), SYM(FramebufferTexture1D), @@ -1341,7 +1337,6 @@ RGLSYMGLGETRENDERBUFFERPARAMETERIVPROC __rglgen_glGetRenderbufferParameteriv; RGLSYMGLISFRAMEBUFFERPROC __rglgen_glIsFramebuffer; RGLSYMGLBINDFRAMEBUFFERPROC __rglgen_glBindFramebuffer; RGLSYMGLDELETEFRAMEBUFFERSPROC __rglgen_glDeleteFramebuffers; -RGLSYMGLDELETEFRAMEBUFFERSPROC __rglgen_glDeleteFramebuffersEXT; RGLSYMGLGENFRAMEBUFFERSPROC __rglgen_glGenFramebuffers; RGLSYMGLCHECKFRAMEBUFFERSTATUSPROC __rglgen_glCheckFramebufferStatus; RGLSYMGLFRAMEBUFFERTEXTURE1DPROC __rglgen_glFramebufferTexture1D; From 44f3341ffe20323e2ed4b357e5b0dc33cfc3131f Mon Sep 17 00:00:00 2001 From: twinaphex Date: Mon, 4 Dec 2017 04:42:40 +0100 Subject: [PATCH 42/85] Add EXT versions for OSX PPC --- gfx/drivers_renderchain/gl2_renderchain.c | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/gfx/drivers_renderchain/gl2_renderchain.c b/gfx/drivers_renderchain/gl2_renderchain.c index 69b70b71fa..22eb9bc558 100644 --- a/gfx/drivers_renderchain/gl2_renderchain.c +++ b/gfx/drivers_renderchain/gl2_renderchain.c @@ -67,7 +67,14 @@ typedef struct gl2_renderchain coords[5] = yamt; \ coords[7] = yamt -#define gl2_bind_fb(id) glBindFramebuffer(RARCH_GL_FRAMEBUFFER, id) +#if (defined(__MACH__) && (defined(__ppc__) || defined(__ppc64__))) +#define gl2_delete_fb(n, fb) glDeleteFramebuffersEXT(n, fb) +#define gl2_bind_fb(id) glBindFramebufferEXT(RARCH_GL_FRAMEBUFFER, id) +#else +#define gl2_delete_fb(n, fb) glDeleteFramebuffers(n, fb) +#define gl2_bind_fb(id) glBindFramebuffer(RARCH_GL_FRAMEBUFFER, id) +#endif + #ifndef GL_SYNC_GPU_COMMANDS_COMPLETE #define GL_SYNC_GPU_COMMANDS_COMPLETE 0x9117 @@ -424,13 +431,13 @@ static void gl2_renderchain_deinit_fbo(void *data) return; glDeleteTextures(gl->fbo_pass, gl->fbo_texture); - glDeleteFramebuffers(gl->fbo_pass, gl->fbo); + gl2_delete_fb(gl->fbo_pass, gl->fbo); memset(gl->fbo_texture, 0, sizeof(gl->fbo_texture)); memset(gl->fbo, 0, sizeof(gl->fbo)); if (gl->fbo_feedback) - glDeleteFramebuffers(1, &gl->fbo_feedback); + gl2_delete_fb(1, &gl->fbo_feedback); if (gl->fbo_feedback_texture) glDeleteTextures(1, &gl->fbo_feedback_texture); @@ -451,7 +458,7 @@ static void gl2_renderchain_deinit_hw_render(void *data) context_bind_hw_render(true); if (gl->hw_render_fbo_init) - glDeleteFramebuffers(gl->textures, gl->hw_render_fbo); + gl2_delete_fb(gl->textures, gl->hw_render_fbo); if (gl->hw_render_depth_init) glDeleteRenderbuffers(gl->textures, gl->hw_render_depth); gl->hw_render_fbo_init = false; @@ -510,9 +517,9 @@ static bool gl_create_fbo_targets(gl_t *gl) return true; error: - glDeleteFramebuffers(gl->fbo_pass, gl->fbo); + gl2_delete_fb(gl->fbo_pass, gl->fbo); if (gl->fbo_feedback) - glDeleteFramebuffers(1, &gl->fbo_feedback); + gl2_delete_fb(1, &gl->fbo_feedback); RARCH_ERR("[GL]: Failed to set up frame buffer objects. Multi-pass shading will not work.\n"); return false; } From 5a341acb5fe0dee96920ef2e7e32e1dbd8762985 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Mon, 4 Dec 2017 04:57:58 +0100 Subject: [PATCH 43/85] Wrap more GL framebuffer functions --- gfx/drivers_renderchain/gl2_renderchain.c | 28 ++++++++++++++--------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/gfx/drivers_renderchain/gl2_renderchain.c b/gfx/drivers_renderchain/gl2_renderchain.c index 22eb9bc558..82038df196 100644 --- a/gfx/drivers_renderchain/gl2_renderchain.c +++ b/gfx/drivers_renderchain/gl2_renderchain.c @@ -68,9 +68,15 @@ typedef struct gl2_renderchain coords[7] = yamt #if (defined(__MACH__) && (defined(__ppc__) || defined(__ppc64__))) +#define gl2_fb_texture_2d(a, b, c, d, e) glFramebufferTexture2DEXT(a, b, c, d, e) +#define gl2_check_fb_status(target) glCheckFramebufferStatusEXT(target) +#define gl2_gen_fb(n, ids) glGenFramebuffersEXT(n, ids) #define gl2_delete_fb(n, fb) glDeleteFramebuffersEXT(n, fb) #define gl2_bind_fb(id) glBindFramebufferEXT(RARCH_GL_FRAMEBUFFER, id) #else +#define gl2_fb_texture_2d(a, b, c, d, e) glFramebufferTexture2D(a, b, c, d, e) +#define gl2_check_fb_status(target) glCheckFramebufferStatus(target) +#define gl2_gen_fb(n, ids) glGenFramebuffers(n, ids) #define gl2_delete_fb(n, fb) glDeleteFramebuffers(n, fb) #define gl2_bind_fb(id) glBindFramebuffer(RARCH_GL_FRAMEBUFFER, id) #endif @@ -176,11 +182,11 @@ static bool gl_recreate_fbo( 0, RARCH_GL_TEXTURE_TYPE32, RARCH_GL_FORMAT32, NULL); - glFramebufferTexture2D(RARCH_GL_FRAMEBUFFER, + gl2_fb_texture_2d(RARCH_GL_FRAMEBUFFER, RARCH_GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, *texture, 0); - if (glCheckFramebufferStatus(RARCH_GL_FRAMEBUFFER) + if (gl2_check_fb_status(RARCH_GL_FRAMEBUFFER) == RARCH_GL_FRAMEBUFFER_COMPLETE) return true; @@ -479,17 +485,17 @@ static bool gl_create_fbo_targets(gl_t *gl) int i; glBindTexture(GL_TEXTURE_2D, 0); - glGenFramebuffers(gl->fbo_pass, gl->fbo); + gl2_gen_fb(gl->fbo_pass, gl->fbo); for (i = 0; i < gl->fbo_pass; i++) { GLenum status; gl2_bind_fb(gl->fbo[i]); - glFramebufferTexture2D(RARCH_GL_FRAMEBUFFER, + gl2_fb_texture_2d(RARCH_GL_FRAMEBUFFER, RARCH_GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, gl->fbo_texture[i], 0); - status = glCheckFramebufferStatus(RARCH_GL_FRAMEBUFFER); + status = gl2_check_fb_status(RARCH_GL_FRAMEBUFFER); if (status != RARCH_GL_FRAMEBUFFER_COMPLETE) goto error; } @@ -498,13 +504,13 @@ static bool gl_create_fbo_targets(gl_t *gl) { GLenum status; - glGenFramebuffers(1, &gl->fbo_feedback); + gl2_gen_fb(1, &gl->fbo_feedback); gl2_bind_fb(gl->fbo_feedback); - glFramebufferTexture2D(RARCH_GL_FRAMEBUFFER, + gl2_fb_texture_2d(RARCH_GL_FRAMEBUFFER, RARCH_GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, gl->fbo_feedback_texture, 0); - status = glCheckFramebufferStatus(RARCH_GL_FRAMEBUFFER); + status = gl2_check_fb_status(RARCH_GL_FRAMEBUFFER); if (status != RARCH_GL_FRAMEBUFFER_COMPLETE) goto error; @@ -883,7 +889,7 @@ static bool gl2_renderchain_init_hw_render( RARCH_LOG("[GL]: Supports FBO (render-to-texture).\n"); glBindTexture(GL_TEXTURE_2D, 0); - glGenFramebuffers(gl->textures, gl->hw_render_fbo); + gl2_gen_fb(gl->textures, gl->hw_render_fbo); depth = hwr->depth; stencil = hwr->stencil; @@ -897,7 +903,7 @@ static bool gl2_renderchain_init_hw_render( for (i = 0; i < gl->textures; i++) { gl2_bind_fb(gl->hw_render_fbo[i]); - glFramebufferTexture2D(RARCH_GL_FRAMEBUFFER, + gl2_fb_texture_2d(RARCH_GL_FRAMEBUFFER, RARCH_GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, gl->texture[i], 0); if (depth) @@ -934,7 +940,7 @@ static bool gl2_renderchain_init_hw_render( } } - status = glCheckFramebufferStatus(RARCH_GL_FRAMEBUFFER); + status = gl2_check_fb_status(RARCH_GL_FRAMEBUFFER); if (status != RARCH_GL_FRAMEBUFFER_COMPLETE) { RARCH_ERR("[GL]: Failed to create HW render FBO #%u, error: 0x%u.\n", From c869cc51025d7ac04ded8825c64720fd5aa74ce4 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Mon, 4 Dec 2017 05:55:18 +0100 Subject: [PATCH 44/85] Refactor GL code --- gfx/common/gl_common.c | 2 + gfx/drivers/gl.c | 1 + gfx/drivers/gl_symlinks.h | 15 -------- gfx/drivers_renderchain/gl2_renderchain.c | 46 ++++++++++++++++++----- 4 files changed, 39 insertions(+), 25 deletions(-) diff --git a/gfx/common/gl_common.c b/gfx/common/gl_common.c index f349938427..bf8aab5059 100644 --- a/gfx/common/gl_common.c +++ b/gfx/common/gl_common.c @@ -21,6 +21,8 @@ #include "../../config.h" #endif +#include + #include "../drivers/gl_symlinks.h" #include "../video_coord_array.h" diff --git a/gfx/drivers/gl.c b/gfx/drivers/gl.c index 8c2d230194..ba037d574d 100644 --- a/gfx/drivers/gl.c +++ b/gfx/drivers/gl.c @@ -40,6 +40,7 @@ #include #include +#include #include "../../configuration.h" #include "../../dynamic.h" diff --git a/gfx/drivers/gl_symlinks.h b/gfx/drivers/gl_symlinks.h index 8628698f3e..91d618776d 100644 --- a/gfx/drivers/gl_symlinks.h +++ b/gfx/drivers/gl_symlinks.h @@ -21,25 +21,10 @@ #include #include -#include - #ifdef HAVE_CONFIG_H #include "config.h" #endif -#if defined(HAVE_PSGL) -#define glGenFramebuffers glGenFramebuffersOES -#define glBindFramebuffer glBindFramebufferOES -#define glFramebufferTexture2D glFramebufferTexture2DOES -#define glCheckFramebufferStatus glCheckFramebufferStatusOES -#define glDeleteFramebuffers glDeleteFramebuffersOES -#define glGenRenderbuffers glGenRenderbuffersOES -#define glBindRenderbuffer glBindRenderbufferOES -#define glFramebufferRenderbuffer glFramebufferRenderbufferOES -#define glRenderbufferStorage glRenderbufferStorageOES -#define glDeleteRenderbuffers glDeleteRenderbuffersOES -#endif - #if defined(HAVE_PSGL) #define RARCH_GL_FRAMEBUFFER GL_FRAMEBUFFER_OES #define RARCH_GL_FRAMEBUFFER_COMPLETE GL_FRAMEBUFFER_COMPLETE_OES diff --git a/gfx/drivers_renderchain/gl2_renderchain.c b/gfx/drivers_renderchain/gl2_renderchain.c index 82038df196..a9320732b3 100644 --- a/gfx/drivers_renderchain/gl2_renderchain.c +++ b/gfx/drivers_renderchain/gl2_renderchain.c @@ -41,6 +41,7 @@ #include #include +#include #include "../video_driver.h" #include "../video_shader_parse.h" @@ -67,18 +68,43 @@ typedef struct gl2_renderchain coords[5] = yamt; \ coords[7] = yamt -#if (defined(__MACH__) && (defined(__ppc__) || defined(__ppc64__))) +#if defined(HAVE_PSGL) +#define gl2_fb_texture_2d(a, b, c, d, e) glFramebufferTexture2DOES(a, b, c, d, e) +#define gl2_check_fb_status(target) glCheckFramebufferStatusOES(target) +#define gl2_gen_fb(n, ids) glGenFramebuffersOES(n, ids) +#define gl2_delete_fb(n, fb) glDeleteFramebuffersOES(n, fb) +#define gl2_bind_fb(id) glBindFramebufferOES(RARCH_GL_FRAMEBUFFER, id) +#define gl2_gen_rb glGenRenderbuffersOES +#define gl2_bind_rb glBindRenderbufferOES +#define gl2_fb_rb glFramebufferRenderbufferOES +#define gl2_rb_storage glRenderbufferStorageOES +#define gl2_delete_rb glDeleteRenderbuffersOES + +#elif (defined(__MACH__) && (defined(__ppc__) || defined(__ppc64__))) #define gl2_fb_texture_2d(a, b, c, d, e) glFramebufferTexture2DEXT(a, b, c, d, e) #define gl2_check_fb_status(target) glCheckFramebufferStatusEXT(target) #define gl2_gen_fb(n, ids) glGenFramebuffersEXT(n, ids) #define gl2_delete_fb(n, fb) glDeleteFramebuffersEXT(n, fb) #define gl2_bind_fb(id) glBindFramebufferEXT(RARCH_GL_FRAMEBUFFER, id) +#define gl2_gen_rb glGenRenderbuffersEXT +#define gl2_bind_rb glBindRenderbufferEXT +#define gl2_fb_rb glFramebufferRenderbufferEXT +#define gl2_rb_storage glRenderbufferStorageEXT +#define gl2_delete_rb glDeleteRenderbuffersEXT + #else + #define gl2_fb_texture_2d(a, b, c, d, e) glFramebufferTexture2D(a, b, c, d, e) #define gl2_check_fb_status(target) glCheckFramebufferStatus(target) #define gl2_gen_fb(n, ids) glGenFramebuffers(n, ids) #define gl2_delete_fb(n, fb) glDeleteFramebuffers(n, fb) #define gl2_bind_fb(id) glBindFramebuffer(RARCH_GL_FRAMEBUFFER, id) +#define gl2_gen_rb glGenRenderbuffers +#define gl2_bind_rb glBindRenderbuffer +#define gl2_fb_rb glFramebufferRenderbuffer +#define gl2_rb_storage glRenderbufferStorage +#define gl2_delete_rb glDeleteRenderbuffers + #endif @@ -466,7 +492,7 @@ static void gl2_renderchain_deinit_hw_render(void *data) if (gl->hw_render_fbo_init) gl2_delete_fb(gl->textures, gl->hw_render_fbo); if (gl->hw_render_depth_init) - glDeleteRenderbuffers(gl->textures, gl->hw_render_depth); + gl2_delete_rb(gl->textures, gl->hw_render_depth); gl->hw_render_fbo_init = false; context_bind_hw_render(false); @@ -896,7 +922,7 @@ static bool gl2_renderchain_init_hw_render( if (depth) { - glGenRenderbuffers(gl->textures, gl->hw_render_depth); + gl2_gen_rb(gl->textures, gl->hw_render_depth); gl->hw_render_depth_init = true; } @@ -908,33 +934,33 @@ static bool gl2_renderchain_init_hw_render( if (depth) { - glBindRenderbuffer(RARCH_GL_RENDERBUFFER, gl->hw_render_depth[i]); - glRenderbufferStorage(RARCH_GL_RENDERBUFFER, + gl2_bind_rb(RARCH_GL_RENDERBUFFER, gl->hw_render_depth[i]); + gl2_rb_storage(RARCH_GL_RENDERBUFFER, stencil ? RARCH_GL_DEPTH24_STENCIL8 : GL_DEPTH_COMPONENT16, width, height); - glBindRenderbuffer(RARCH_GL_RENDERBUFFER, 0); + gl2_bind_rb(RARCH_GL_RENDERBUFFER, 0); if (stencil) { #if defined(HAVE_OPENGLES2) || defined(HAVE_OPENGLES1) || ((defined(__MACH__) && (defined(__ppc__) || defined(__ppc64__)))) /* GLES2 is a bit weird, as always. * There's no GL_DEPTH_STENCIL_ATTACHMENT like in desktop GL. */ - glFramebufferRenderbuffer(RARCH_GL_FRAMEBUFFER, + gl2_fb_rb(RARCH_GL_FRAMEBUFFER, RARCH_GL_DEPTH_ATTACHMENT, RARCH_GL_RENDERBUFFER, gl->hw_render_depth[i]); - glFramebufferRenderbuffer(RARCH_GL_FRAMEBUFFER, + gl2_fb_rb(RARCH_GL_FRAMEBUFFER, RARCH_GL_STENCIL_ATTACHMENT, RARCH_GL_RENDERBUFFER, gl->hw_render_depth[i]); #else /* We use ARB FBO extensions, no need to check. */ - glFramebufferRenderbuffer(RARCH_GL_FRAMEBUFFER, + gl2_fb_rb(RARCH_GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, RARCH_GL_RENDERBUFFER, gl->hw_render_depth[i]); #endif } else { - glFramebufferRenderbuffer(RARCH_GL_FRAMEBUFFER, + gl2_fb_rb(RARCH_GL_FRAMEBUFFER, RARCH_GL_DEPTH_ATTACHMENT, RARCH_GL_RENDERBUFFER, gl->hw_render_depth[i]); } From 9558e569f10f924321c6c9541144cd505b2573c9 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Mon, 4 Dec 2017 05:56:03 +0100 Subject: [PATCH 45/85] We can still make use of this for PowerPC Mac --- libretro-common/file/nbio/nbio_intf.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libretro-common/file/nbio/nbio_intf.c b/libretro-common/file/nbio/nbio_intf.c index 925cd6884e..57d3eb6484 100644 --- a/libretro-common/file/nbio/nbio_intf.c +++ b/libretro-common/file/nbio/nbio_intf.c @@ -36,7 +36,7 @@ extern nbio_intf_t nbio_stdio; #if defined(_linux__) static nbio_intf_t *internal_nbio = &nbio_linux; -#elif defined(HAVE_MMAP) && defined(BSD) && !defined(__powerpc__) && !defined(__ppc__) +#elif defined(HAVE_MMAP) && defined(BSD) static nbio_intf_t *internal_nbio = &nbio_mmap_unix; #elif defined(_WIN32) && !defined(_XBOX) static nbio_intf_t *internal_nbio = &nbio_mmap_win32; From 512a1b4cb65ac1294b84b0b3453ab4f5fc68262d Mon Sep 17 00:00:00 2001 From: twinaphex Date: Mon, 4 Dec 2017 06:03:11 +0100 Subject: [PATCH 46/85] Cleanups --- gfx/common/gl_common.c | 7 +- gfx/common/gl_common.h | 119 ++++++++++++++++++++++++++++++- gfx/drivers/gl_symlinks.h | 144 -------------------------------------- 3 files changed, 119 insertions(+), 151 deletions(-) delete mode 100644 gfx/drivers/gl_symlinks.h diff --git a/gfx/common/gl_common.c b/gfx/common/gl_common.c index bf8aab5059..10c139bef0 100644 --- a/gfx/common/gl_common.c +++ b/gfx/common/gl_common.c @@ -14,18 +14,13 @@ * If not, see . */ -#include #include #ifdef HAVE_CONFIG_H #include "../../config.h" #endif -#include - -#include "../drivers/gl_symlinks.h" -#include "../video_coord_array.h" - +#include "gl_common.h" static void gl_size_format(GLint* internalFormat) { diff --git a/gfx/common/gl_common.h b/gfx/common/gl_common.h index 04f2d6e3f4..7eb88af66e 100644 --- a/gfx/common/gl_common.h +++ b/gfx/common/gl_common.h @@ -17,7 +17,9 @@ #ifndef __GL_COMMON_H #define __GL_COMMON_H +#include #include +#include #ifdef HAVE_CONFIG_H #include "../../config.h" @@ -32,13 +34,128 @@ #include "../font_driver.h" #include "../video_coord_array.h" #include "../video_driver.h" -#include "../drivers/gl_symlinks.h" #include RETRO_BEGIN_DECLS #define MAX_FENCES 4 +#if defined(HAVE_PSGL) +#define RARCH_GL_FRAMEBUFFER GL_FRAMEBUFFER_OES +#define RARCH_GL_FRAMEBUFFER_COMPLETE GL_FRAMEBUFFER_COMPLETE_OES +#define RARCH_GL_COLOR_ATTACHMENT0 GL_COLOR_ATTACHMENT0_EXT +#elif (defined(__MACH__) && (defined(__ppc__) || defined(__ppc64__))) +#define RARCH_GL_FRAMEBUFFER GL_FRAMEBUFFER_EXT +#define RARCH_GL_FRAMEBUFFER_COMPLETE GL_FRAMEBUFFER_COMPLETE_EXT +#define RARCH_GL_COLOR_ATTACHMENT0 GL_COLOR_ATTACHMENT0_EXT +#else +#define RARCH_GL_FRAMEBUFFER GL_FRAMEBUFFER +#define RARCH_GL_FRAMEBUFFER_COMPLETE GL_FRAMEBUFFER_COMPLETE +#define RARCH_GL_COLOR_ATTACHMENT0 GL_COLOR_ATTACHMENT0 +#endif + +#if defined(HAVE_OPENGLES2) || defined(HAVE_OPENGLES3) || defined(HAVE_OPENGLES_3_1) || defined(HAVE_OPENGLES_3_2) +#define RARCH_GL_RENDERBUFFER GL_RENDERBUFFER +#if defined(HAVE_OPENGLES2) +#define RARCH_GL_DEPTH24_STENCIL8 GL_DEPTH24_STENCIL8_OES +#else +#define RARCH_GL_DEPTH24_STENCIL8 GL_DEPTH24_STENCIL8 +#endif +#define RARCH_GL_DEPTH_ATTACHMENT GL_DEPTH_ATTACHMENT +#define RARCH_GL_STENCIL_ATTACHMENT GL_STENCIL_ATTACHMENT +#elif (defined(__MACH__) && (defined(__ppc__) || defined(__ppc64__))) +#define RARCH_GL_RENDERBUFFER GL_RENDERBUFFER_EXT +#define RARCH_GL_DEPTH24_STENCIL8 GL_DEPTH24_STENCIL8_EXT +#define RARCH_GL_DEPTH_ATTACHMENT GL_DEPTH_ATTACHMENT_EXT +#define RARCH_GL_STENCIL_ATTACHMENT GL_STENCIL_ATTACHMENT_EXT +#elif defined(HAVE_PSGL) +#define RARCH_GL_RENDERBUFFER GL_RENDERBUFFER_OES +#define RARCH_GL_DEPTH24_STENCIL8 GL_DEPTH24_STENCIL8_SCE +#define RARCH_GL_DEPTH_ATTACHMENT GL_DEPTH_ATTACHMENT_OES +#define RARCH_GL_STENCIL_ATTACHMENT GL_STENCIL_ATTACHMENT_OES +#else +#define RARCH_GL_RENDERBUFFER GL_RENDERBUFFER +#define RARCH_GL_DEPTH24_STENCIL8 GL_DEPTH24_STENCIL8 +#define RARCH_GL_DEPTH_ATTACHMENT GL_DEPTH_ATTACHMENT +#define RARCH_GL_STENCIL_ATTACHMENT GL_STENCIL_ATTACHMENT +#endif + +#if (defined(__MACH__) && (defined(__ppc__) || defined(__ppc64__))) +#define RARCH_GL_MAX_RENDERBUFFER_SIZE GL_MAX_RENDERBUFFER_SIZE_EXT +#elif defined(HAVE_PSGL) +#define RARCH_GL_MAX_RENDERBUFFER_SIZE GL_MAX_RENDERBUFFER_SIZE_OES +#else +#define RARCH_GL_MAX_RENDERBUFFER_SIZE GL_MAX_RENDERBUFFER_SIZE +#endif + +#if defined(HAVE_PSGL) +#define glGenerateMipmap glGenerateMipmapOES +#endif + +#if defined(__APPLE__) || defined(HAVE_PSGL) +#define GL_RGBA32F GL_RGBA32F_ARB +#endif + +#if defined(HAVE_PSGL) +#define RARCH_GL_INTERNAL_FORMAT32 GL_ARGB_SCE +#define RARCH_GL_INTERNAL_FORMAT16 GL_RGB5 /* TODO: Verify if this is really 565 or just 555. */ +#define RARCH_GL_TEXTURE_TYPE32 GL_BGRA +#define RARCH_GL_TEXTURE_TYPE16 GL_BGRA +#define RARCH_GL_FORMAT32 GL_UNSIGNED_INT_8_8_8_8_REV +#define RARCH_GL_FORMAT16 GL_RGB5 +#elif defined(HAVE_OPENGLES) +/* Imgtec/SGX headers have this missing. */ +#ifndef GL_BGRA_EXT +#define GL_BGRA_EXT 0x80E1 +#endif +#ifndef GL_BGRA8_EXT +#define GL_BGRA8_EXT 0x93A1 +#endif +#ifdef IOS +/* Stupid Apple */ +#define RARCH_GL_INTERNAL_FORMAT32 GL_RGBA +#else +#define RARCH_GL_INTERNAL_FORMAT32 GL_BGRA_EXT +#endif +#define RARCH_GL_INTERNAL_FORMAT16 GL_RGB +#define RARCH_GL_TEXTURE_TYPE32 GL_BGRA_EXT +#define RARCH_GL_TEXTURE_TYPE16 GL_RGB +#define RARCH_GL_FORMAT32 GL_UNSIGNED_BYTE +#define RARCH_GL_FORMAT16 GL_UNSIGNED_SHORT_5_6_5 +#else +/* On desktop, we always use 32-bit. */ +#define RARCH_GL_INTERNAL_FORMAT32 GL_RGBA8 +#define RARCH_GL_INTERNAL_FORMAT16 GL_RGBA8 +#define RARCH_GL_TEXTURE_TYPE32 GL_BGRA +#define RARCH_GL_TEXTURE_TYPE16 GL_BGRA +#define RARCH_GL_FORMAT32 GL_UNSIGNED_INT_8_8_8_8_REV +#define RARCH_GL_FORMAT16 GL_UNSIGNED_INT_8_8_8_8_REV + +/* GL_RGB565 internal format isn't in desktop GL + * until 4.1 core (ARB_ES2_compatibility). + * Check for this. */ +#ifndef GL_RGB565 +#define GL_RGB565 0x8D62 +#endif +#define RARCH_GL_INTERNAL_FORMAT16_565 GL_RGB565 +#define RARCH_GL_TEXTURE_TYPE16_565 GL_RGB +#define RARCH_GL_FORMAT16_565 GL_UNSIGNED_SHORT_5_6_5 +#endif + +#if defined(HAVE_OPENGLES2) /* TODO: Figure out exactly what. */ +#define NO_GL_CLAMP_TO_BORDER +#endif + +#if defined(HAVE_OPENGLES) +#ifndef GL_UNPACK_ROW_LENGTH +#define GL_UNPACK_ROW_LENGTH 0x0CF2 +#endif + +#ifndef GL_SRGB_ALPHA_EXT +#define GL_SRGB_ALPHA_EXT 0x8C42 +#endif +#endif + typedef struct gl { GLenum internal_fmt; diff --git a/gfx/drivers/gl_symlinks.h b/gfx/drivers/gl_symlinks.h deleted file mode 100644 index 91d618776d..0000000000 --- a/gfx/drivers/gl_symlinks.h +++ /dev/null @@ -1,144 +0,0 @@ -/* RetroArch - A frontend for libretro. - * Copyright (C) 2010-2014 - Hans-Kristian Arntzen - * Copyright (C) 2011-2017 - Daniel De Matteis - * Copyright (C) 2012-2015 - Michael Lelli - * - * RetroArch is free software: you can redistribute it and/or modify it under the terms - * of the GNU General Public License as published by the Free Software Found- - * ation, either version 3 of the License, or (at your option) any later version. - * - * RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; - * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR - * PURPOSE. See the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with RetroArch. - * If not, see . - */ - -#ifndef _GL_SYMLINKS_H -#define _GL_SYMLINKS_H - -#include -#include - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#if defined(HAVE_PSGL) -#define RARCH_GL_FRAMEBUFFER GL_FRAMEBUFFER_OES -#define RARCH_GL_FRAMEBUFFER_COMPLETE GL_FRAMEBUFFER_COMPLETE_OES -#define RARCH_GL_COLOR_ATTACHMENT0 GL_COLOR_ATTACHMENT0_EXT -#elif (defined(__MACH__) && (defined(__ppc__) || defined(__ppc64__))) -#define RARCH_GL_FRAMEBUFFER GL_FRAMEBUFFER_EXT -#define RARCH_GL_FRAMEBUFFER_COMPLETE GL_FRAMEBUFFER_COMPLETE_EXT -#define RARCH_GL_COLOR_ATTACHMENT0 GL_COLOR_ATTACHMENT0_EXT -#else -#define RARCH_GL_FRAMEBUFFER GL_FRAMEBUFFER -#define RARCH_GL_FRAMEBUFFER_COMPLETE GL_FRAMEBUFFER_COMPLETE -#define RARCH_GL_COLOR_ATTACHMENT0 GL_COLOR_ATTACHMENT0 -#endif - -#if defined(HAVE_OPENGLES2) || defined(HAVE_OPENGLES3) || defined(HAVE_OPENGLES_3_1) || defined(HAVE_OPENGLES_3_2) -#define RARCH_GL_RENDERBUFFER GL_RENDERBUFFER -#if defined(HAVE_OPENGLES2) -#define RARCH_GL_DEPTH24_STENCIL8 GL_DEPTH24_STENCIL8_OES -#else -#define RARCH_GL_DEPTH24_STENCIL8 GL_DEPTH24_STENCIL8 -#endif -#define RARCH_GL_DEPTH_ATTACHMENT GL_DEPTH_ATTACHMENT -#define RARCH_GL_STENCIL_ATTACHMENT GL_STENCIL_ATTACHMENT -#elif (defined(__MACH__) && (defined(__ppc__) || defined(__ppc64__))) -#define RARCH_GL_RENDERBUFFER GL_RENDERBUFFER_EXT -#define RARCH_GL_DEPTH24_STENCIL8 GL_DEPTH24_STENCIL8_EXT -#define RARCH_GL_DEPTH_ATTACHMENT GL_DEPTH_ATTACHMENT_EXT -#define RARCH_GL_STENCIL_ATTACHMENT GL_STENCIL_ATTACHMENT_EXT -#elif defined(HAVE_PSGL) -#define RARCH_GL_RENDERBUFFER GL_RENDERBUFFER_OES -#define RARCH_GL_DEPTH24_STENCIL8 GL_DEPTH24_STENCIL8_SCE -#define RARCH_GL_DEPTH_ATTACHMENT GL_DEPTH_ATTACHMENT_OES -#define RARCH_GL_STENCIL_ATTACHMENT GL_STENCIL_ATTACHMENT_OES -#else -#define RARCH_GL_RENDERBUFFER GL_RENDERBUFFER -#define RARCH_GL_DEPTH24_STENCIL8 GL_DEPTH24_STENCIL8 -#define RARCH_GL_DEPTH_ATTACHMENT GL_DEPTH_ATTACHMENT -#define RARCH_GL_STENCIL_ATTACHMENT GL_STENCIL_ATTACHMENT -#endif - -#if (defined(__MACH__) && (defined(__ppc__) || defined(__ppc64__))) -#define RARCH_GL_MAX_RENDERBUFFER_SIZE GL_MAX_RENDERBUFFER_SIZE_EXT -#elif defined(HAVE_PSGL) -#define RARCH_GL_MAX_RENDERBUFFER_SIZE GL_MAX_RENDERBUFFER_SIZE_OES -#else -#define RARCH_GL_MAX_RENDERBUFFER_SIZE GL_MAX_RENDERBUFFER_SIZE -#endif - -#if defined(HAVE_PSGL) -#define glGenerateMipmap glGenerateMipmapOES -#endif - -#if defined(__APPLE__) || defined(HAVE_PSGL) -#define GL_RGBA32F GL_RGBA32F_ARB -#endif - -#if defined(HAVE_PSGL) -#define RARCH_GL_INTERNAL_FORMAT32 GL_ARGB_SCE -#define RARCH_GL_INTERNAL_FORMAT16 GL_RGB5 /* TODO: Verify if this is really 565 or just 555. */ -#define RARCH_GL_TEXTURE_TYPE32 GL_BGRA -#define RARCH_GL_TEXTURE_TYPE16 GL_BGRA -#define RARCH_GL_FORMAT32 GL_UNSIGNED_INT_8_8_8_8_REV -#define RARCH_GL_FORMAT16 GL_RGB5 -#elif defined(HAVE_OPENGLES) -/* Imgtec/SGX headers have this missing. */ -#ifndef GL_BGRA_EXT -#define GL_BGRA_EXT 0x80E1 -#endif -#ifndef GL_BGRA8_EXT -#define GL_BGRA8_EXT 0x93A1 -#endif -#ifdef IOS -/* Stupid Apple */ -#define RARCH_GL_INTERNAL_FORMAT32 GL_RGBA -#else -#define RARCH_GL_INTERNAL_FORMAT32 GL_BGRA_EXT -#endif -#define RARCH_GL_INTERNAL_FORMAT16 GL_RGB -#define RARCH_GL_TEXTURE_TYPE32 GL_BGRA_EXT -#define RARCH_GL_TEXTURE_TYPE16 GL_RGB -#define RARCH_GL_FORMAT32 GL_UNSIGNED_BYTE -#define RARCH_GL_FORMAT16 GL_UNSIGNED_SHORT_5_6_5 -#else -/* On desktop, we always use 32-bit. */ -#define RARCH_GL_INTERNAL_FORMAT32 GL_RGBA8 -#define RARCH_GL_INTERNAL_FORMAT16 GL_RGBA8 -#define RARCH_GL_TEXTURE_TYPE32 GL_BGRA -#define RARCH_GL_TEXTURE_TYPE16 GL_BGRA -#define RARCH_GL_FORMAT32 GL_UNSIGNED_INT_8_8_8_8_REV -#define RARCH_GL_FORMAT16 GL_UNSIGNED_INT_8_8_8_8_REV - -/* GL_RGB565 internal format isn't in desktop GL - * until 4.1 core (ARB_ES2_compatibility). - * Check for this. */ -#ifndef GL_RGB565 -#define GL_RGB565 0x8D62 -#endif -#define RARCH_GL_INTERNAL_FORMAT16_565 GL_RGB565 -#define RARCH_GL_TEXTURE_TYPE16_565 GL_RGB -#define RARCH_GL_FORMAT16_565 GL_UNSIGNED_SHORT_5_6_5 -#endif - -#if defined(HAVE_OPENGLES2) /* TODO: Figure out exactly what. */ -#define NO_GL_CLAMP_TO_BORDER -#endif - -#if defined(HAVE_OPENGLES) -#ifndef GL_UNPACK_ROW_LENGTH -#define GL_UNPACK_ROW_LENGTH 0x0CF2 -#endif - -#ifndef GL_SRGB_ALPHA_EXT -#define GL_SRGB_ALPHA_EXT 0x8C42 -#endif -#endif - -#endif From 4e342956c10e774363666157bfe58a6e97f83374 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Mon, 4 Dec 2017 06:13:01 +0100 Subject: [PATCH 47/85] Update comment --- gfx/drivers_renderchain/gl1_renderchain.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/gfx/drivers_renderchain/gl1_renderchain.c b/gfx/drivers_renderchain/gl1_renderchain.c index 04e8fa6199..9cc36d8a36 100644 --- a/gfx/drivers_renderchain/gl1_renderchain.c +++ b/gfx/drivers_renderchain/gl1_renderchain.c @@ -108,14 +108,12 @@ static bool gl1_renderchain_read_viewport( /* Use slow synchronous readbacks. Use this with plain screenshots as we don't really care about performance in this case. */ - /* GLES2 only guarantees GL_RGBA/GL_UNSIGNED_BYTE + /* GL1 only guarantees GL_RGBA/GL_UNSIGNED_BYTE * readbacks so do just that. - * GLES2 also doesn't support reading back data + * GL1 also doesn't support reading back data * from front buffer, so render a cached frame * and have gl_frame() do the readback while it's * in the back buffer. - * - * Keep codepath similar for GLES and desktop GL. */ gl->readback_buffer_screenshot = malloc(num_pixels * sizeof(uint32_t)); From 241df59771d5b9d1048162b15c7c53fdd38a48f8 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Mon, 4 Dec 2017 11:20:18 +0100 Subject: [PATCH 48/85] Get rid of include --- gfx/video_driver.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/gfx/video_driver.c b/gfx/video_driver.c index d06252fb90..c4174e6726 100644 --- a/gfx/video_driver.c +++ b/gfx/video_driver.c @@ -46,10 +46,6 @@ #include "../menu/menu_setting.h" #endif -#ifdef HAVE_OPENGL -#include "common/gl_common.h" -#endif - #include "video_thread_wrapper.h" #include "video_driver.h" From 05ab278aca22bdbf47773a53618a1598d93ae30a Mon Sep 17 00:00:00 2001 From: twinaphex Date: Mon, 4 Dec 2017 11:54:30 +0100 Subject: [PATCH 49/85] Pass chain userdata to renderchain driver --- gfx/drivers/gl.c | 80 +++++++++++++---------- gfx/drivers_renderchain/gl1_renderchain.c | 4 +- gfx/drivers_renderchain/gl2_renderchain.c | 77 +++++++++++++++------- gfx/video_driver.h | 56 +++++++++------- 4 files changed, 134 insertions(+), 83 deletions(-) diff --git a/gfx/drivers/gl.c b/gfx/drivers/gl.c index ba037d574d..3cc6adf629 100644 --- a/gfx/drivers/gl.c +++ b/gfx/drivers/gl.c @@ -595,7 +595,7 @@ static void gl_init_textures(gl_t *gl, const video_info_t *video) if (gl->renderchain_driver->init_texture_reference) gl->renderchain_driver->init_texture_reference( - gl, i, internal_fmt, + gl, gl->renderchain_data, i, internal_fmt, texture_fmt, texture_type); } @@ -894,11 +894,11 @@ static void gl_pbo_async_readback(gl_t *gl) gl->pbo_readback_valid[gl->pbo_readback_index] = true; if (gl->renderchain_driver->readback) - gl->renderchain_driver->readback(gl, + gl->renderchain_driver->readback(gl, gl->renderchain_data, video_pixel_get_alignment(gl->vp.width * sizeof(uint32_t)), fmt, type, NULL); if (gl->renderchain_driver->unbind_pbo) - gl->renderchain_driver->unbind_pbo(); + gl->renderchain_driver->unbind_pbo(gl, gl->renderchain_data); } static INLINE void gl_draw_texture(gl_t *gl, video_frame_info_t *video_info) @@ -983,7 +983,7 @@ static bool gl_frame(void *data, const void *frame, context_bind_hw_render(false); if (gl->core_context_in_use && gl->renderchain_driver->bind_vao) - gl->renderchain_driver->bind_vao(gl); + gl->renderchain_driver->bind_vao(gl, gl->renderchain_data); video_info->cb_shader_use(gl, video_info->shader_data, 1, true); @@ -997,11 +997,12 @@ static bool gl_frame(void *data, const void *frame, { if (gl->renderchain_driver->recompute_pass_sizes) gl->renderchain_driver->recompute_pass_sizes( - gl, frame_width, frame_height, + gl, gl->renderchain_data, frame_width, frame_height, gl->vp_out_width, gl->vp_out_height); if (gl->renderchain_driver->start_render) - gl->renderchain_driver->start_render(gl, video_info); + gl->renderchain_driver->start_render(gl, gl->renderchain_data, + video_info); } if (gl->should_resize) @@ -1019,12 +1020,14 @@ static bool gl_frame(void *data, const void *frame, if (gl->fbo_inited) { if (gl->renderchain_driver->check_fbo_dimensions) - gl->renderchain_driver->check_fbo_dimensions(gl); + gl->renderchain_driver->check_fbo_dimensions(gl, + gl->renderchain_data); /* Go back to what we're supposed to do, * render to FBO #0. */ if (gl->renderchain_driver->start_render) - gl->renderchain_driver->start_render(gl, video_info); + gl->renderchain_driver->start_render(gl, gl->renderchain_data, + video_info); } else gl_set_viewport(gl, video_info, width, height, false, true); @@ -1043,7 +1046,7 @@ static bool gl_frame(void *data, const void *frame, gl_update_input_size(gl, frame_width, frame_height, pitch, true); if (gl->renderchain_driver->copy_frame) - gl->renderchain_driver->copy_frame(gl, + gl->renderchain_driver->copy_frame(gl, gl->renderchain_data, video_info, frame, frame_width, frame_height, pitch); } @@ -1061,12 +1064,12 @@ static bool gl_frame(void *data, const void *frame, if (!gl->fbo_inited) { if (gl->renderchain_driver->bind_backbuffer) - gl->renderchain_driver->bind_backbuffer(); + gl->renderchain_driver->bind_backbuffer(gl, gl->renderchain_data); gl_set_viewport(gl, video_info, width, height, false, true); } if (gl->renderchain_driver->restore_default_state) - gl->renderchain_driver->restore_default_state(gl); + gl->renderchain_driver->restore_default_state(gl, gl->renderchain_data); glDisable(GL_STENCIL_TEST); glDisable(GL_BLEND); @@ -1128,12 +1131,14 @@ static bool gl_frame(void *data, const void *frame, glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); if (gl->fbo_inited && gl->renderchain_driver->renderchain_render) - gl->renderchain_driver->renderchain_render(gl, video_info, + gl->renderchain_driver->renderchain_render(gl, gl->renderchain_data, + video_info, frame_count, &gl->tex_info, &feedback_info); /* Set prev textures. */ if (gl->renderchain_driver->bind_prev_texture) - gl->renderchain_driver->bind_prev_texture(gl, &gl->tex_info); + gl->renderchain_driver->bind_prev_texture(gl, gl->renderchain_data, + &gl->tex_info); #if defined(HAVE_MENU) if (gl->menu_texture_enable) @@ -1168,7 +1173,8 @@ static bool gl_frame(void *data, const void *frame, glBindTexture(GL_TEXTURE_2D, 0); if (gl->renderchain_driver->disable_client_arrays) - gl->renderchain_driver->disable_client_arrays(); + gl->renderchain_driver->disable_client_arrays(gl, + gl->renderchain_data); } /* Screenshots. */ @@ -1176,6 +1182,7 @@ static bool gl_frame(void *data, const void *frame, { if (gl->renderchain_driver->readback) gl->renderchain_driver->readback(gl, + gl->renderchain_data, 4, GL_RGBA, GL_UNSIGNED_BYTE, gl->readback_buffer_screenshot); } @@ -1208,12 +1215,14 @@ static bool gl_frame(void *data, const void *frame, if (gl->renderchain_driver->fence_iterate) gl->renderchain_driver->fence_iterate(gl, + gl->renderchain_data, video_info->hard_sync_frames); } if (gl->core_context_in_use && gl->renderchain_driver->unbind_vao) - gl->renderchain_driver->unbind_vao(gl); + gl->renderchain_driver->unbind_vao(gl, + gl->renderchain_data); context_bind_hw_render(true); @@ -1243,7 +1252,7 @@ static void gl_deinit_chain(gl_t *gl) return; if (gl->renderchain_driver->chain_free) - gl->renderchain_driver->chain_free(gl->renderchain_data); + gl->renderchain_driver->chain_free(gl, gl->renderchain_data); gl->renderchain_driver = NULL; gl->renderchain_data = NULL; @@ -1260,14 +1269,14 @@ static void gl_free(void *data) if (gl->have_sync) { if (gl->renderchain_driver->fence_free) - gl->renderchain_driver->fence_free(gl); + gl->renderchain_driver->fence_free(gl, gl->renderchain_data); } font_driver_free_osd(); video_shader_driver_deinit(); if (gl->renderchain_driver->disable_client_arrays) - gl->renderchain_driver->disable_client_arrays(); + gl->renderchain_driver->disable_client_arrays(gl, gl->renderchain_data); glDeleteTextures(gl->textures, gl->texture); @@ -1296,13 +1305,13 @@ static void gl_free(void *data) if (gl->core_context_in_use) { if (gl->renderchain_driver->unbind_vao) - gl->renderchain_driver->unbind_vao(gl); + gl->renderchain_driver->unbind_vao(gl, gl->renderchain_data); if (gl->renderchain_driver->free_vao) - gl->renderchain_driver->free_vao(gl); + gl->renderchain_driver->free_vao(gl, gl->renderchain_data); } if (gl->renderchain_driver->free) - gl->renderchain_driver->free(gl); + gl->renderchain_driver->free(gl, gl->renderchain_data); gl_deinit_chain(gl); video_context_driver_free(); @@ -1464,7 +1473,7 @@ static bool gl_init_pbo_readback(gl_t *gl) gl->vp.height * sizeof(uint32_t), NULL); } if (gl->renderchain_driver->unbind_pbo) - gl->renderchain_driver->unbind_pbo(); + gl->renderchain_driver->unbind_pbo(gl, gl->renderchain_data); #ifndef HAVE_OPENGLES3 { @@ -1776,11 +1785,11 @@ static void *gl_init(const video_info_t *video, const input_driver_t **input, vo } if (gl->renderchain_driver->restore_default_state) - gl->renderchain_driver->restore_default_state(gl); + gl->renderchain_driver->restore_default_state(gl, gl->renderchain_data); if (hwr->context_type == RETRO_HW_CONTEXT_OPENGL_CORE) if (gl->renderchain_driver->new_vao) - gl->renderchain_driver->new_vao(gl); + gl->renderchain_driver->new_vao(gl, gl->renderchain_data); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glBlendEquation(GL_FUNC_ADD); @@ -1928,13 +1937,13 @@ static void *gl_init(const video_info_t *video, const input_driver_t **input, vo gl_init_textures_data(gl); if (gl->renderchain_driver->init) - gl->renderchain_driver->init(gl, gl->tex_w, gl->tex_h); + gl->renderchain_driver->init(gl, gl->renderchain_data, gl->tex_w, gl->tex_h); if (gl->has_fbo) { if (gl->hw_render_use && gl->renderchain_driver->init_hw_render && - !gl->renderchain_driver->init_hw_render(gl, gl->tex_w, gl->tex_h)) + !gl->renderchain_driver->init_hw_render(gl, gl->renderchain_data, gl->tex_w, gl->tex_h)) { RARCH_ERR("[GL]: Hardware rendering context initialization failed.\n"); goto error; @@ -2112,7 +2121,7 @@ static bool gl_set_shader(void *data, if (gl->fbo_inited) { if (gl->renderchain_driver->deinit_fbo) - gl->renderchain_driver->deinit_fbo(gl); + gl->renderchain_driver->deinit_fbo(gl, gl->renderchain_data); glBindTexture(GL_TEXTURE_2D, gl->texture[gl->tex_index]); } @@ -2144,7 +2153,7 @@ static bool gl_set_shader(void *data, { if (gl->hw_render_use && gl->fbo_inited && gl->renderchain_driver->deinit_hw_render) - gl->renderchain_driver->deinit_hw_render(gl); + gl->renderchain_driver->deinit_hw_render(gl, gl->renderchain_data); glDeleteTextures(gl->textures, gl->texture); #if defined(HAVE_PSGL) @@ -2158,11 +2167,13 @@ static bool gl_set_shader(void *data, gl_init_textures_data(gl); if (gl->hw_render_use && gl->renderchain_driver->init_hw_render) - gl->renderchain_driver->init_hw_render(gl, gl->tex_w, gl->tex_h); + gl->renderchain_driver->init_hw_render(gl, gl->renderchain_data, + gl->tex_w, gl->tex_h); } if (gl->renderchain_driver->init) - gl->renderchain_driver->init(gl, gl->tex_w, gl->tex_h); + gl->renderchain_driver->init(gl, gl->renderchain_data, + gl->tex_w, gl->tex_h); /* Apparently need to set viewport for passes when we aren't using FBOs. */ gl_set_shader_viewports(gl); @@ -2186,7 +2197,7 @@ static void gl_viewport_info(void *data, struct video_viewport *vp) gl_t *gl = (gl_t*)data; if (!gl->renderchain_driver || !gl->renderchain_driver->viewport_info) return; - gl->renderchain_driver->viewport_info(data, vp); + gl->renderchain_driver->viewport_info(gl, gl->renderchain_data, vp); } static bool gl_read_viewport(void *data, uint8_t *buffer, bool is_idle) @@ -2194,7 +2205,8 @@ static bool gl_read_viewport(void *data, uint8_t *buffer, bool is_idle) gl_t *gl = (gl_t*)data; if (!gl->renderchain_driver || !gl->renderchain_driver->read_viewport) return false; - return gl->renderchain_driver->read_viewport(data, buffer, is_idle); + return gl->renderchain_driver->read_viewport(gl, gl->renderchain_data, + buffer, is_idle); } #if 0 @@ -2525,7 +2537,7 @@ static void gl_set_coords(void *handle_data, void *shader_data, { gl_t *gl = (gl_t*)handle_data; if (gl && gl->renderchain_driver->set_coords) - gl->renderchain_driver->set_coords(handle_data, + gl->renderchain_driver->set_coords(gl, gl->renderchain_data, shader_data, coords); } @@ -2534,7 +2546,7 @@ static void gl_set_mvp(void *data, void *shader_data, { gl_t *gl = (gl_t*)data; if (gl && gl->renderchain_driver->set_mvp) - gl->renderchain_driver->set_mvp(data, + gl->renderchain_driver->set_mvp(gl, gl->renderchain_data, shader_data, mat_data); } diff --git a/gfx/drivers_renderchain/gl1_renderchain.c b/gfx/drivers_renderchain/gl1_renderchain.c index 9cc36d8a36..04a756db9f 100644 --- a/gfx/drivers_renderchain/gl1_renderchain.c +++ b/gfx/drivers_renderchain/gl1_renderchain.c @@ -57,9 +57,9 @@ typedef struct gl1_renderchain GLenum min_filter_to_mag(GLenum type); -void gl1_renderchain_free(void *data) +void gl1_renderchain_free(void *data, void *chain_data) { - gl_t *gl = (gl_t*)data; + (void)chain_data; (void)gl; } diff --git a/gfx/drivers_renderchain/gl2_renderchain.c b/gfx/drivers_renderchain/gl2_renderchain.c index a9320732b3..f52f77f5e7 100644 --- a/gfx/drivers_renderchain/gl2_renderchain.c +++ b/gfx/drivers_renderchain/gl2_renderchain.c @@ -117,7 +117,8 @@ typedef struct gl2_renderchain #endif /* Prototypes */ -static void gl2_renderchain_bind_backbuffer(void) +static void gl2_renderchain_bind_backbuffer(void *data, + void *chain_data) { #ifdef IOS /* There is no default frame buffer on iOS. */ @@ -257,7 +258,8 @@ static void gl_check_fbo_dimension(gl_t *gl, unsigned i, /* On resize, we might have to recreate our FBOs * due to "Viewport" scale, and set a new viewport. */ -static void gl2_renderchain_check_fbo_dimensions(void *data) +static void gl2_renderchain_check_fbo_dimensions(void *data, + void *chain_data) { int i; gl_t *gl = (gl_t*)data; @@ -280,6 +282,7 @@ static void gl2_renderchain_check_fbo_dimensions(void *data) static void gl2_renderchain_render( void *data, + void *chain_data, video_frame_info_t *video_info, uint64_t frame_count, const struct video_tex_info *tex_info, @@ -391,7 +394,7 @@ static void gl2_renderchain_render( set_texture_coords(fbo_tex_coords, xamt, yamt); /* Push final FBO to list. */ - fbo_info = &fbo_tex_info[gl->fbo_pass - 1]; + fbo_info = &fbo_tex_info[gl->fbo_pass - 1]; fbo_info->tex = gl->fbo_texture[gl->fbo_pass - 1]; fbo_info->input_size[0] = prev_rect->img_width; @@ -402,7 +405,7 @@ static void gl2_renderchain_render( fbo_tex_info_cnt++; /* Render our FBO texture to back buffer. */ - gl2_renderchain_bind_backbuffer(); + gl2_renderchain_bind_backbuffer(gl, chain_data); shader_info.data = gl; shader_info.idx = gl->fbo_pass + 1; @@ -455,7 +458,8 @@ static void gl2_renderchain_render( gl->coords.tex_coord = gl->tex_info.coord; } -static void gl2_renderchain_deinit_fbo(void *data) +static void gl2_renderchain_deinit_fbo(void *data, + void *chain_data) { gl_t *gl = (gl_t*)data; @@ -481,7 +485,9 @@ static void gl2_renderchain_deinit_fbo(void *data) gl->fbo_feedback = 0; } -static void gl2_renderchain_deinit_hw_render(void *data) +static void gl2_renderchain_deinit_hw_render( + void *data, + void *chain_data) { gl_t *gl = (gl_t*)data; if (!gl) @@ -498,12 +504,12 @@ static void gl2_renderchain_deinit_hw_render(void *data) context_bind_hw_render(false); } -void gl2_renderchain_free(void *data) +static void gl2_renderchain_free(void *data, void *chain_data) { gl_t *gl = (gl_t*)data; - gl2_renderchain_deinit_fbo(gl); - gl2_renderchain_deinit_hw_render(gl); + gl2_renderchain_deinit_fbo(gl, chain_data); + gl2_renderchain_deinit_hw_render(gl, chain_data); } static bool gl_create_fbo_targets(gl_t *gl) @@ -683,6 +689,7 @@ static void gl_create_fbo_textures(gl_t *gl) static void gl2_renderchain_recompute_pass_sizes( void *data, + void *chain_data, unsigned width, unsigned height, unsigned vp_width, unsigned vp_height) { @@ -745,6 +752,7 @@ static void gl2_renderchain_recompute_pass_sizes( } static void gl2_renderchain_start_render(void *data, + void *chain_data, video_frame_info_t *video_info) { /* Used when rendering to an FBO. @@ -779,7 +787,8 @@ static void gl2_renderchain_start_render(void *data, /* Set up render to texture. */ void gl2_renderchain_init( - void *data, unsigned fbo_width, unsigned fbo_height) + void *data, void *chain_data, + unsigned fbo_width, unsigned fbo_height) { int i; unsigned width, height; @@ -847,6 +856,7 @@ void gl2_renderchain_init( } gl2_renderchain_recompute_pass_sizes(gl, + chain_data, fbo_width, fbo_height, width, height); for (i = 0; i < gl->fbo_pass; i++) @@ -887,6 +897,7 @@ void gl2_renderchain_init( static bool gl2_renderchain_init_hw_render( void *data, + void *chain_data, unsigned width, unsigned height) { GLenum status; @@ -975,7 +986,7 @@ static bool gl2_renderchain_init_hw_render( } } - gl2_renderchain_bind_backbuffer(); + gl2_renderchain_bind_backbuffer(gl, chain_data); gl->hw_render_fbo_init = true; context_bind_hw_render(false); @@ -984,6 +995,7 @@ static bool gl2_renderchain_init_hw_render( static void gl2_renderchain_bind_prev_texture( void *data, + void *chain_data, const struct video_tex_info *tex_info) { gl_t *gl = (gl_t*)data; @@ -1007,7 +1019,8 @@ static void gl2_renderchain_bind_prev_texture( } static void gl2_renderchain_viewport_info( - void *data, struct video_viewport *vp) + void *data, void *chain_data, + struct video_viewport *vp) { unsigned width, height; unsigned top_y, top_dist; @@ -1026,7 +1039,9 @@ static void gl2_renderchain_viewport_info( } static bool gl2_renderchain_read_viewport( - void *data, uint8_t *buffer, bool is_idle) + void *data, + void *chain_data, + uint8_t *buffer, bool is_idle) { unsigned num_pixels = 0; gl_t *gl = (gl_t*)data; @@ -1127,9 +1142,9 @@ error: return false; } -void gl2_renderchain_free_internal(void *data) +void gl2_renderchain_free_internal(void *data, void *chain_data) { - gl2_renderchain_t *cg_data = (gl2_renderchain_t*)data; + gl2_renderchain_t *cg_data = (gl2_renderchain_t*)chain_data; if (!cg_data) return; @@ -1147,7 +1162,8 @@ static void *gl2_renderchain_new(void) } #ifndef HAVE_OPENGLES -static void gl2_renderchain_bind_vao(void *data) +static void gl2_renderchain_bind_vao(void *data, + void *chain_data) { gl_t *gl = (gl_t*)data; if (!gl) @@ -1155,7 +1171,8 @@ static void gl2_renderchain_bind_vao(void *data) glBindVertexArray(gl->vao); } -static void gl2_renderchain_unbind_vao(void *data) +static void gl2_renderchain_unbind_vao(void *data, + void *chain_data) { gl_t *gl = (gl_t*)data; if (!gl) @@ -1163,7 +1180,8 @@ static void gl2_renderchain_unbind_vao(void *data) glBindVertexArray(0); } -static void gl2_renderchain_new_vao(void *data) +static void gl2_renderchain_new_vao(void *data, + void *chain_data) { gl_t *gl = (gl_t*)data; if (!gl) @@ -1171,7 +1189,8 @@ static void gl2_renderchain_new_vao(void *data) glGenVertexArrays(1, &gl->vao); } -static void gl2_renderchain_free_vao(void *data) +static void gl2_renderchain_free_vao(void *data, + void *chain_data) { gl_t *gl = (gl_t*)data; if (!gl) @@ -1180,7 +1199,9 @@ static void gl2_renderchain_free_vao(void *data) } #endif -static void gl2_renderchain_restore_default_state(void *data) +static void gl2_renderchain_restore_default_state( + void *data, + void *chain_data) { gl_t *gl = (gl_t*)data; if (!gl) @@ -1196,6 +1217,7 @@ static void gl2_renderchain_restore_default_state(void *data) static void gl2_renderchain_copy_frame( void *data, + void *chain_data, video_frame_info_t *video_info, const void *frame, unsigned width, unsigned height, unsigned pitch) @@ -1338,7 +1360,8 @@ static void gl2_renderchain_bind_pbo(unsigned idx) glBindBuffer(GL_PIXEL_PACK_BUFFER, (GLuint)idx); } -static void gl2_renderchain_unbind_pbo(void) +static void gl2_renderchain_unbind_pbo(void *data, + void *chain_data) { glBindBuffer(GL_PIXEL_PACK_BUFFER, 0); } @@ -1352,6 +1375,7 @@ static void gl2_renderchain_init_pbo(unsigned size, #endif static void gl2_renderchain_readback(void *data, + void *chain_data, unsigned alignment, unsigned fmt, unsigned type, void *src) @@ -1370,8 +1394,10 @@ static void gl2_renderchain_readback(void *data, } #ifndef HAVE_OPENGLES -static void gl2_renderchain_fence_iterate(void *data, unsigned - hard_sync_frames) +static void gl2_renderchain_fence_iterate( + void *data, + void *chain_data, + unsigned hard_sync_frames) { gl_t *gl = (gl_t*)data; @@ -1390,7 +1416,8 @@ static void gl2_renderchain_fence_iterate(void *data, unsigned } } -static void gl2_renderchain_fence_free(void *data) +static void gl2_renderchain_fence_free(void *data, + void *chain_data) { unsigned i; gl_t *gl = (gl_t*)data; @@ -1406,7 +1433,7 @@ static void gl2_renderchain_fence_free(void *data) #endif static void gl2_renderchain_init_textures_reference( - void *data, unsigned i, + void *data, void *chain_data, unsigned i, unsigned internal_fmt, unsigned texture_fmt, unsigned texture_type) { diff --git a/gfx/video_driver.h b/gfx/video_driver.h index 6836ede817..33765da5dd 100644 --- a/gfx/video_driver.h +++ b/gfx/video_driver.h @@ -838,56 +838,68 @@ typedef struct d3d_renderchain_driver typedef struct gl_renderchain_driver { void (*set_coords)(void *handle_data, + void *chain_data, void *shader_data, const struct video_coords *coords); - void (*set_mvp)(void *data, void *shader_data, + void (*set_mvp)(void *data, + void *chain_data, + void *shader_data, const void *mat_data); void (*init_texture_reference)( - void *data, unsigned i, + void *data, void *chain_data, unsigned i, unsigned internal_fmt, unsigned texture_fmt, unsigned texture_type); - void (*fence_iterate)(void *data, unsigned hard_sync_frames); - void (*fence_free)(void *data); + void (*fence_iterate)(void *data, void *chain_data, + unsigned hard_sync_frames); + void (*fence_free)(void *data, void *chain_data); void (*readback)(void *data, + void *chain_data, unsigned alignment, unsigned fmt, unsigned type, void *src); void (*init_pbo)(unsigned size, const void *data); void (*bind_pbo)(unsigned idx); - void (*unbind_pbo)(void); + void (*unbind_pbo)(void *data, void *chain_data); void (*copy_frame)( void *data, + void *chain_data, video_frame_info_t *video_info, const void *frame, unsigned width, unsigned height, unsigned pitch); - void (*restore_default_state)(void *data); - void (*new_vao)(void *data); - void (*free_vao)(void *data); - void (*bind_vao)(void *data); - void (*unbind_vao)(void *data); - void (*disable_client_arrays)(void); + void (*restore_default_state)(void *data, void *chain_data); + void (*new_vao)(void *data, void *chain_data); + void (*free_vao)(void *data, void *chain_data); + void (*bind_vao)(void *data, void *chain_data); + void (*unbind_vao)(void *data, void *chain_data); + void (*disable_client_arrays)(void *data, void *chain_data); void (*ff_vertex)(const void *data); void (*ff_matrix)(const void *data); - void (*bind_backbuffer)(void); - void (*deinit_fbo)(void *data); + void (*bind_backbuffer)(void *data, void *chain_data); + void (*deinit_fbo)(void *data, void *chain_data); void (*viewport_info)( - void *data, struct video_viewport *vp); + void *data, void *chain_data, struct video_viewport *vp); bool (*read_viewport)( - void *data, uint8_t *buffer, bool is_idle); + void *data, void *chain_data, uint8_t *buffer, bool is_idle); void (*bind_prev_texture)( void *data, + void *chain_data, const struct video_tex_info *tex_info); - void (*chain_free)(void *data); + void (*chain_free)(void *data, void *chain_data); void *(*chain_new)(void); - void (*init)(void *data, unsigned fbo_width, unsigned fbo_height); - bool (*init_hw_render)(void *data, unsigned width, unsigned height); - void (*free)(void *data); - void (*deinit_hw_render)(void *data); - void (*start_render)(void *data, video_frame_info_t *video_info); - void (*check_fbo_dimensions)(void *data); + void (*init)(void *data, void *chain_data, + unsigned fbo_width, unsigned fbo_height); + bool (*init_hw_render)(void *data, void *chain_data, + unsigned width, unsigned height); + void (*free)(void *data, void *chain_data); + void (*deinit_hw_render)(void *data, void *chain_data); + void (*start_render)(void *data, void *chain_data, + video_frame_info_t *video_info); + void (*check_fbo_dimensions)(void *data, void *chain_data); void (*recompute_pass_sizes)(void *data, + void *chain_data, unsigned width, unsigned height, unsigned vp_width, unsigned vp_height); void (*renderchain_render)(void *data, + void *chain_data, video_frame_info_t *video_info, uint64_t frame_count, const struct video_tex_info *tex_info, From 072570bbf3f90273474c14380b50e77fd2429482 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Mon, 4 Dec 2017 11:58:16 +0100 Subject: [PATCH 50/85] (GL) Update GL1 renderchain too --- gfx/drivers_renderchain/gl1_renderchain.c | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/gfx/drivers_renderchain/gl1_renderchain.c b/gfx/drivers_renderchain/gl1_renderchain.c index 04a756db9f..a9762cf0ba 100644 --- a/gfx/drivers_renderchain/gl1_renderchain.c +++ b/gfx/drivers_renderchain/gl1_renderchain.c @@ -60,11 +60,12 @@ GLenum min_filter_to_mag(GLenum type); void gl1_renderchain_free(void *data, void *chain_data) { (void)chain_data; - (void)gl; + (void)data; } static void gl1_renderchain_bind_prev_texture( void *data, + void *chain_data, const struct video_tex_info *tex_info) { gl_t *gl = (gl_t*)data; @@ -76,7 +77,8 @@ static void gl1_renderchain_bind_prev_texture( } static void gl1_renderchain_viewport_info( - void *data, struct video_viewport *vp) + void *data, void *chain_data, + struct video_viewport *vp) { unsigned width, height; unsigned top_y, top_dist; @@ -95,7 +97,8 @@ static void gl1_renderchain_viewport_info( } static bool gl1_renderchain_read_viewport( - void *data, uint8_t *buffer, bool is_idle) + void *data, void *chain_data, + uint8_t *buffer, bool is_idle) { unsigned num_pixels = 0; gl_t *gl = (gl_t*)data; @@ -134,9 +137,9 @@ static bool gl1_renderchain_read_viewport( return true; } -void gl1_renderchain_free_internal(void *data) +void gl1_renderchain_free_internal(void *data, void *chain_data) { - gl1_renderchain_t *cg_data = (gl1_renderchain_t*)data; + gl1_renderchain_t *cg_data = (gl1_renderchain_t*)chain_data; if (!cg_data) return; @@ -183,7 +186,8 @@ static void gl1_renderchain_ff_matrix(const void *data) glLoadMatrixf(ident.data); } -static void gl1_renderchain_disable_client_arrays(void) +static void gl1_renderchain_disable_client_arrays(void *data, + void *chain_data) { if (gl_query_core_context_in_use()) return; @@ -196,7 +200,8 @@ static void gl1_renderchain_disable_client_arrays(void) glDisableClientState(GL_TEXTURE_COORD_ARRAY); } -static void gl1_renderchain_restore_default_state(void *data) +static void gl1_renderchain_restore_default_state(void *data, + void *chain_data) { gl_t *gl = (gl_t*)data; if (!gl) @@ -209,6 +214,7 @@ static void gl1_renderchain_restore_default_state(void *data) static void gl1_renderchain_copy_frame( void *data, + void *chain_data, video_frame_info_t *video_info, const void *frame, unsigned width, unsigned height, unsigned pitch) @@ -244,6 +250,7 @@ static void gl1_renderchain_copy_frame( } static void gl1_renderchain_readback(void *data, + void *chain_data, unsigned alignment, unsigned fmt, unsigned type, void *src) @@ -260,6 +267,7 @@ static void gl1_renderchain_readback(void *data, } static void gl1_renderchain_set_mvp(void *data, + void *chain_data, void *shader_data, const void *mat_data) { math_matrix_4x4 ident; @@ -274,6 +282,7 @@ static void gl1_renderchain_set_mvp(void *data, } static void gl1_renderchain_set_coords(void *handle_data, + void *chain_data, void *shader_data, const struct video_coords *coords) { /* Fall back to fixed function-style if needed and possible. */ From 267e6fe85fb45dd53adb9d7dc4b1b672401224c4 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Mon, 4 Dec 2017 12:02:53 +0100 Subject: [PATCH 51/85] Move fence variables to renderchain data struct --- gfx/common/gl_common.h | 3 -- gfx/drivers_renderchain/gl2_renderchain.c | 37 ++++++++++++----------- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/gfx/common/gl_common.h b/gfx/common/gl_common.h index 7eb88af66e..535dd15ada 100644 --- a/gfx/common/gl_common.h +++ b/gfx/common/gl_common.h @@ -38,8 +38,6 @@ RETRO_BEGIN_DECLS -#define MAX_FENCES 4 - #if defined(HAVE_PSGL) #define RARCH_GL_FRAMEBUFFER GL_FRAMEBUFFER_OES #define RARCH_GL_FRAMEBUFFER_COMPLETE GL_FRAMEBUFFER_COMPLETE_OES @@ -250,7 +248,6 @@ typedef struct gl struct video_fbo_rect fbo_rect[GFX_MAX_SHADERS]; struct gfx_fbo_scale fbo_scale[GFX_MAX_SHADERS]; - GLsync fences[MAX_FENCES]; const gl_renderchain_driver_t *renderchain_driver; void *renderchain_data; } gl_t; diff --git a/gfx/drivers_renderchain/gl2_renderchain.c b/gfx/drivers_renderchain/gl2_renderchain.c index f52f77f5e7..07934a6d52 100644 --- a/gfx/drivers_renderchain/gl2_renderchain.c +++ b/gfx/drivers_renderchain/gl2_renderchain.c @@ -51,9 +51,12 @@ #include "../../configuration.h" #include "../../verbosity.h" +#define MAX_FENCES 4 + typedef struct gl2_renderchain { - void *empty; + unsigned fence_count; + GLsync fences[MAX_FENCES]; } gl2_renderchain_t; #if (!defined(HAVE_OPENGLES) || defined(HAVE_OPENGLES3)) @@ -1144,12 +1147,12 @@ error: void gl2_renderchain_free_internal(void *data, void *chain_data) { - gl2_renderchain_t *cg_data = (gl2_renderchain_t*)chain_data; + gl2_renderchain_t *chain = (gl2_renderchain_t*)chain_data; - if (!cg_data) + if (!chain) return; - free(cg_data); + free(chain); } static void *gl2_renderchain_new(void) @@ -1399,20 +1402,20 @@ static void gl2_renderchain_fence_iterate( void *chain_data, unsigned hard_sync_frames) { - gl_t *gl = (gl_t*)data; + gl2_renderchain_t *chain = (gl2_renderchain_t*)chain_data; - gl->fences[gl->fence_count++] = + chain->fences[chain->fence_count++] = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0); - while (gl->fence_count > hard_sync_frames) + while (chain->fence_count > hard_sync_frames) { - glClientWaitSync(gl->fences[0], + glClientWaitSync(chain->fences[0], GL_SYNC_FLUSH_COMMANDS_BIT, 1000000000); - glDeleteSync(gl->fences[0]); + glDeleteSync(chain->fences[0]); - gl->fence_count--; - memmove(gl->fences, gl->fences + 1, - gl->fence_count * sizeof(GLsync)); + chain->fence_count--; + memmove(chain->fences, chain->fences + 1, + chain->fence_count * sizeof(GLsync)); } } @@ -1420,15 +1423,15 @@ static void gl2_renderchain_fence_free(void *data, void *chain_data) { unsigned i; - gl_t *gl = (gl_t*)data; + gl2_renderchain_t *chain = (gl2_renderchain_t*)chain_data; - for (i = 0; i < gl->fence_count; i++) + for (i = 0; i < chain->fence_count; i++) { - glClientWaitSync(gl->fences[i], + glClientWaitSync(chain->fences[i], GL_SYNC_FLUSH_COMMANDS_BIT, 1000000000); - glDeleteSync(gl->fences[i]); + glDeleteSync(chain->fences[i]); } - gl->fence_count = 0; + chain->fence_count = 0; } #endif From 69d3fd5047e4c0898e4082632ee56f3c4f87a9bc Mon Sep 17 00:00:00 2001 From: twinaphex Date: Mon, 4 Dec 2017 12:03:29 +0100 Subject: [PATCH 52/85] Get rid of fence_count in gl struct --- gfx/common/gl_common.h | 1 - 1 file changed, 1 deletion(-) diff --git a/gfx/common/gl_common.h b/gfx/common/gl_common.h index 535dd15ada..bf0a8b3ac4 100644 --- a/gfx/common/gl_common.h +++ b/gfx/common/gl_common.h @@ -222,7 +222,6 @@ typedef struct gl unsigned base_size; /* 2 or 4 */ unsigned overlays; unsigned pbo_readback_index; - unsigned fence_count; unsigned last_width[GFX_MAX_TEXTURES]; unsigned last_height[GFX_MAX_TEXTURES]; From 19ad9aa1cb58691c8a0188260b5799e823363094 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Mon, 4 Dec 2017 12:43:22 +0100 Subject: [PATCH 53/85] Add resolve extensions callback --- gfx/drivers/gl.c | 3 +++ gfx/drivers_renderchain/gl1_renderchain.c | 7 ++++--- gfx/drivers_renderchain/gl2_renderchain.c | 6 ++++++ gfx/video_driver.h | 4 ++++ 4 files changed, 17 insertions(+), 3 deletions(-) diff --git a/gfx/drivers/gl.c b/gfx/drivers/gl.c index 3cc6adf629..b7302756e8 100644 --- a/gfx/drivers/gl.c +++ b/gfx/drivers/gl.c @@ -1371,6 +1371,9 @@ static bool resolve_extensions(gl_t *gl, const char *context_ident) video_driver_unset_rgba(); + if (gl->renderchain_driver->resolve_extensions) + gl->renderchain_driver->resolve_extensions(gl, gl->renderchain_data, context_ident); + #if defined(HAVE_OPENGLES) && !defined(HAVE_PSGL) if (!gl_check_capability(GL_CAPS_BGRA8888)) { diff --git a/gfx/drivers_renderchain/gl1_renderchain.c b/gfx/drivers_renderchain/gl1_renderchain.c index a9762cf0ba..56a5d27650 100644 --- a/gfx/drivers_renderchain/gl1_renderchain.c +++ b/gfx/drivers_renderchain/gl1_renderchain.c @@ -327,10 +327,11 @@ gl_renderchain_driver_t gl2_renderchain = { NULL, /* renderchain_init */ NULL, /* init_hw_render */ gl1_renderchain_free, - NULL, /* deinit_hw_render */ - NULL, /* start_render */ + NULL, /* deinit_hw_render */ + NULL, /* start_render */ NULL, /* check_fbo_dimensions */ NULL, /* recompute_pass_sizes */ - NULL, /* renderchain_render */ + NULL, /* renderchain_render */ + NULL, /* resolve_extensions */ "gl1", }; diff --git a/gfx/drivers_renderchain/gl2_renderchain.c b/gfx/drivers_renderchain/gl2_renderchain.c index 07934a6d52..5e6d5bcad5 100644 --- a/gfx/drivers_renderchain/gl2_renderchain.c +++ b/gfx/drivers_renderchain/gl2_renderchain.c @@ -1461,6 +1461,11 @@ static void gl2_renderchain_init_textures_reference( #endif } +static void gl2_renderchain_resolve_extensions(void *data, + void *chain_data, const char *context_ident) +{ +} + gl_renderchain_driver_t gl2_renderchain = { NULL, /* set_coords */ NULL, /* set_mvp */ @@ -1513,5 +1518,6 @@ gl_renderchain_driver_t gl2_renderchain = { gl2_renderchain_check_fbo_dimensions, gl2_renderchain_recompute_pass_sizes, gl2_renderchain_render, + gl2_renderchain_resolve_extensions, "gl2", }; diff --git a/gfx/video_driver.h b/gfx/video_driver.h index 33765da5dd..1519bdc7a3 100644 --- a/gfx/video_driver.h +++ b/gfx/video_driver.h @@ -904,6 +904,10 @@ typedef struct gl_renderchain_driver uint64_t frame_count, const struct video_tex_info *tex_info, const struct video_tex_info *feedback_info); + void (*resolve_extensions)( + void *data, + void *chain_data, + const char *context_ident); const char *ident; } gl_renderchain_driver_t; From f47888aeda777a317f98e5125cf1e0ee7ab523df Mon Sep 17 00:00:00 2001 From: twinaphex Date: Mon, 4 Dec 2017 12:50:22 +0100 Subject: [PATCH 54/85] Move more variables to renderchain data --- gfx/common/gl_common.h | 3 -- gfx/drivers/gl.c | 7 ---- gfx/drivers_renderchain/gl2_renderchain.c | 42 +++++++++++++++++------ 3 files changed, 32 insertions(+), 20 deletions(-) diff --git a/gfx/common/gl_common.h b/gfx/common/gl_common.h index bf0a8b3ac4..8fe344e433 100644 --- a/gfx/common/gl_common.h +++ b/gfx/common/gl_common.h @@ -168,9 +168,6 @@ typedef struct gl bool hw_render_fbo_init; bool hw_render_depth_init; bool has_fbo; - bool has_srgb_fbo_gles3; - bool has_fp_fbo; - bool has_srgb_fbo; bool hw_render_use; bool core_context_in_use; diff --git a/gfx/drivers/gl.c b/gfx/drivers/gl.c index b7302756e8..262292ca93 100644 --- a/gfx/drivers/gl.c +++ b/gfx/drivers/gl.c @@ -1352,19 +1352,12 @@ static bool resolve_extensions(gl_t *gl, const char *context_ident) * * have_sync - Use ARB_sync to reduce latency. */ - gl->has_srgb_fbo = false; gl->has_fbo = gl_check_capability(GL_CAPS_FBO); gl->have_full_npot_support = gl_check_capability(GL_CAPS_FULL_NPOT_SUPPORT); gl->have_mipmap = gl_check_capability(GL_CAPS_MIPMAP); gl->have_es2_compat = gl_check_capability(GL_CAPS_ES2_COMPAT); - gl->has_fp_fbo = gl_check_capability(GL_CAPS_FP_FBO); gl->support_unpack_row_length = gl_check_capability(GL_CAPS_UNPACK_ROW_LENGTH); gl->have_sync = gl_check_capability(GL_CAPS_SYNC); - /* GLES3 has unpack_subimage and sRGB in core. */ - gl->has_srgb_fbo_gles3 = gl_check_capability(GL_CAPS_SRGB_FBO_ES3); - - if (!settings->bools.video_force_srgb_disable) - gl->has_srgb_fbo = gl_check_capability(GL_CAPS_SRGB_FBO); if (gl->have_sync && settings->bools.video_hard_sync) RARCH_LOG("[GL]: Using ARB_sync to reduce latency.\n"); diff --git a/gfx/drivers_renderchain/gl2_renderchain.c b/gfx/drivers_renderchain/gl2_renderchain.c index 5e6d5bcad5..97e1a36c45 100644 --- a/gfx/drivers_renderchain/gl2_renderchain.c +++ b/gfx/drivers_renderchain/gl2_renderchain.c @@ -55,6 +55,9 @@ typedef struct gl2_renderchain { + bool has_fp_fbo; + bool has_srgb_fbo_gles3; + bool has_srgb_fbo; unsigned fence_count; GLsync fences[MAX_FENCES]; } gl2_renderchain_t; @@ -296,6 +299,7 @@ static void gl2_renderchain_render( video_shader_ctx_params_t params; video_shader_ctx_info_t shader_info; gl_t *gl = (gl_t*)data; + gl2_renderchain_t *chain = (gl2_renderchain_t*)chain_data; static GLfloat fbo_tex_coords[8] = {0.0f}; struct video_tex_info fbo_tex_info[GFX_MAX_SHADERS]; struct video_tex_info *fbo_info = NULL; @@ -385,7 +389,7 @@ static void gl2_renderchain_render( } #if defined(GL_FRAMEBUFFER_SRGB) && !defined(HAVE_OPENGLES) - if (gl->has_srgb_fbo) + if (chain->has_srgb_fbo) glDisable(GL_FRAMEBUFFER_SRGB); #endif @@ -565,13 +569,15 @@ error: return false; } -static void gl_create_fbo_texture(gl_t *gl, unsigned i, GLuint texture) +static void gl_create_fbo_texture(gl_t *gl, + void *chain_data, unsigned i, GLuint texture) { GLenum mag_filter, wrap_enum; video_shader_ctx_filter_t filter_type; video_shader_ctx_wrap_t wrap = {0}; bool fp_fbo = false; bool smooth = false; + gl2_renderchain_t *chain = (gl2_renderchain_t*)chain_data; settings_t *settings = config_get_ptr(); GLuint base_filt = settings->bools.video_smooth ? GL_LINEAR : GL_NEAREST; GLuint base_mip_filt = settings->bools.video_smooth ? @@ -603,12 +609,12 @@ static void gl_create_fbo_texture(gl_t *gl, unsigned i, GLuint texture) if (fp_fbo) { - if (!gl->has_fp_fbo) + if (!chain->has_fp_fbo) RARCH_ERR("[GL]: Floating-point FBO was requested, but is not supported. Falling back to UNORM. Result may band/clip/etc.!\n"); } #if !defined(HAVE_OPENGLES2) - if (fp_fbo && gl->has_fp_fbo) + if (fp_fbo && chain->has_fp_fbo) { RARCH_LOG("[GL]: FBO pass #%d is floating-point.\n", i); gl_load_texture_image(GL_TEXTURE_2D, 0, GL_RGBA32F, @@ -623,14 +629,14 @@ static void gl_create_fbo_texture(gl_t *gl, unsigned i, GLuint texture) if (!fp_fbo && srgb_fbo) { - if (!gl->has_srgb_fbo) + if (!chain->has_srgb_fbo) RARCH_ERR("[GL]: sRGB FBO was requested, but it is not supported. Falling back to UNORM. Result may have banding!\n"); } if (settings->bools.video_force_srgb_disable) srgb_fbo = false; - if (srgb_fbo && gl->has_srgb_fbo) + if (srgb_fbo && chain->has_srgb_fbo) { RARCH_LOG("[GL]: FBO pass #%d is sRGB.\n", i); #ifdef HAVE_OPENGLES2 @@ -639,7 +645,7 @@ static void gl_create_fbo_texture(gl_t *gl, unsigned i, GLuint texture) glTexImage2D(GL_TEXTURE_2D, 0, GL_SRGB_ALPHA_EXT, gl->fbo_rect[i].width, gl->fbo_rect[i].height, 0, - gl->has_srgb_fbo_gles3 ? GL_RGBA : GL_SRGB_ALPHA_EXT, + chain->has_srgb_fbo_gles3 ? GL_RGBA : GL_SRGB_ALPHA_EXT, GL_UNSIGNED_BYTE, NULL); #else gl_load_texture_image(GL_TEXTURE_2D, @@ -674,12 +680,14 @@ static void gl_create_fbo_textures(gl_t *gl) glGenTextures(gl->fbo_pass, gl->fbo_texture); for (i = 0; i < gl->fbo_pass; i++) - gl_create_fbo_texture(gl, i, gl->fbo_texture[i]); + gl_create_fbo_texture(gl, gl->renderchain_data, + i, gl->fbo_texture[i]); if (gl->fbo_feedback_enable) { glGenTextures(1, &gl->fbo_feedback_texture); gl_create_fbo_texture(gl, + gl->renderchain_data, gl->fbo_feedback_pass, gl->fbo_feedback_texture); } @@ -767,7 +775,8 @@ static void gl2_renderchain_start_render(void *data, 0, 1, 1, 1 }; - gl_t *gl = (gl_t*)data; + gl_t *gl = (gl_t*)data; + gl2_renderchain_t *chain = (gl2_renderchain_t*)chain_data; glBindTexture(GL_TEXTURE_2D, gl->texture[gl->tex_index]); gl2_bind_fb(gl->fbo[0]); @@ -783,7 +792,7 @@ static void gl2_renderchain_start_render(void *data, gl->coords.vertex = fbo_vertexes; #if defined(GL_FRAMEBUFFER_SRGB) && !defined(HAVE_OPENGLES) - if (gl->has_srgb_fbo) + if (chain->has_srgb_fbo) glEnable(GL_FRAMEBUFFER_SRGB); #endif } @@ -1464,6 +1473,19 @@ static void gl2_renderchain_init_textures_reference( static void gl2_renderchain_resolve_extensions(void *data, void *chain_data, const char *context_ident) { + gl2_renderchain_t *chain = (gl2_renderchain_t*)chain_data; + settings_t *settings = config_get_ptr(); + + if (!chain) + return; + + chain->has_srgb_fbo = false; + chain->has_fp_fbo = gl_check_capability(GL_CAPS_FP_FBO); + /* GLES3 has unpack_subimage and sRGB in core. */ + chain->has_srgb_fbo_gles3 = gl_check_capability(GL_CAPS_SRGB_FBO_ES3); + + if (!settings->bools.video_force_srgb_disable) + chain->has_srgb_fbo = gl_check_capability(GL_CAPS_SRGB_FBO); } gl_renderchain_driver_t gl2_renderchain = { From 48c3a509320031a91a7de1bec2a358f972b9e33d Mon Sep 17 00:00:00 2001 From: twinaphex Date: Mon, 4 Dec 2017 13:03:14 +0100 Subject: [PATCH 55/85] Move more variables --- gfx/common/gl_common.h | 1 - gfx/drivers/gl.c | 18 ++++++------------ gfx/drivers_renderchain/gl2_renderchain.c | 16 ++++++++++++---- gfx/video_driver.h | 3 ++- 4 files changed, 20 insertions(+), 18 deletions(-) diff --git a/gfx/common/gl_common.h b/gfx/common/gl_common.h index 8fe344e433..db94c1a268 100644 --- a/gfx/common/gl_common.h +++ b/gfx/common/gl_common.h @@ -180,7 +180,6 @@ typedef struct gl bool have_full_npot_support; bool have_mipmap; - bool egl_images; bool overlay_enable; bool overlay_full_screen; bool menu_texture_enable; diff --git a/gfx/drivers/gl.c b/gfx/drivers/gl.c index 262292ca93..c717513f74 100644 --- a/gfx/drivers/gl.c +++ b/gfx/drivers/gl.c @@ -544,11 +544,9 @@ static void gl_init_textures_data(gl_t *gl) static void gl_init_textures(gl_t *gl, const video_info_t *video) { unsigned i; - GLenum internal_fmt, texture_type = 0, texture_fmt = 0; - - /* Use regular textures if we use HW render. */ - gl->egl_images = !gl->hw_render_use && gl_check_capability(GL_CAPS_EGLIMAGE) && - video_context_driver_init_image_buffer(video); + GLenum internal_fmt = gl->internal_fmt; + GLenum texture_type = gl->texture_type; + GLenum texture_fmt = gl->texture_fmt; #ifdef HAVE_PSGL if (!gl->pbo) @@ -560,10 +558,6 @@ static void gl_init_textures(gl_t *gl, const video_info_t *video) NULL, GL_STREAM_DRAW); #endif - internal_fmt = gl->internal_fmt; - texture_type = gl->texture_type; - texture_fmt = gl->texture_fmt; - #if defined(HAVE_OPENGLES) && !defined(HAVE_PSGL) /* GLES is picky about which format we use here. * Without extensions, we can *only* render to 16-bit FBOs. */ @@ -1339,7 +1333,7 @@ static void gl_set_nonblock_state(void *data, bool state) context_bind_hw_render(true); } -static bool resolve_extensions(gl_t *gl, const char *context_ident) +static bool resolve_extensions(gl_t *gl, const char *context_ident, const video_info_t *video) { settings_t *settings = config_get_ptr(); @@ -1365,7 +1359,7 @@ static bool resolve_extensions(gl_t *gl, const char *context_ident) video_driver_unset_rgba(); if (gl->renderchain_driver->resolve_extensions) - gl->renderchain_driver->resolve_extensions(gl, gl->renderchain_data, context_ident); + gl->renderchain_driver->resolve_extensions(gl, gl->renderchain_data, context_ident, video); #if defined(HAVE_OPENGLES) && !defined(HAVE_PSGL) if (!gl_check_capability(GL_CAPS_BGRA8888)) @@ -1790,7 +1784,7 @@ static void *gl_init(const video_info_t *video, const input_driver_t **input, vo glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glBlendEquation(GL_FUNC_ADD); - if (!resolve_extensions(gl, ctx_driver->ident)) + if (!resolve_extensions(gl, ctx_driver->ident, video)) goto error; #ifdef GL_DEBUG diff --git a/gfx/drivers_renderchain/gl2_renderchain.c b/gfx/drivers_renderchain/gl2_renderchain.c index 97e1a36c45..3ed9b0eb1e 100644 --- a/gfx/drivers_renderchain/gl2_renderchain.c +++ b/gfx/drivers_renderchain/gl2_renderchain.c @@ -55,6 +55,7 @@ typedef struct gl2_renderchain { + bool egl_images; bool has_fp_fbo; bool has_srgb_fbo_gles3; bool has_srgb_fbo; @@ -1253,7 +1254,7 @@ static void gl2_renderchain_copy_frame( } #elif defined(HAVE_OPENGLES) #if defined(HAVE_EGL) - if (gl->egl_images) + if (chain->egl_images) { gfx_ctx_image_t img_info; bool new_egl = false; @@ -1449,7 +1450,8 @@ static void gl2_renderchain_init_textures_reference( unsigned internal_fmt, unsigned texture_fmt, unsigned texture_type) { - gl_t *gl = (gl_t*)data; + gl_t *gl = (gl_t*)data; + gl2_renderchain_t *chain = (gl2_renderchain_t*)chain_data; #ifdef HAVE_PSGL glTextureReferenceSCE(GL_TEXTURE_2D, 1, gl->tex_w, gl->tex_h, 0, @@ -1457,7 +1459,7 @@ static void gl2_renderchain_init_textures_reference( gl->tex_w * gl->base_size, gl->tex_w * gl->tex_h * i * gl->base_size); #else - if (gl->egl_images) + if (chain->egl_images) return; gl_load_texture_image(GL_TEXTURE_2D, @@ -1471,8 +1473,10 @@ static void gl2_renderchain_init_textures_reference( } static void gl2_renderchain_resolve_extensions(void *data, - void *chain_data, const char *context_ident) + void *chain_data, const char *context_ident, + const video_info_t *video) { + gl_t *gl = (gl_t*)data; gl2_renderchain_t *chain = (gl2_renderchain_t*)chain_data; settings_t *settings = config_get_ptr(); @@ -1486,6 +1490,10 @@ static void gl2_renderchain_resolve_extensions(void *data, if (!settings->bools.video_force_srgb_disable) chain->has_srgb_fbo = gl_check_capability(GL_CAPS_SRGB_FBO); + + /* Use regular textures if we use HW render. */ + chain->egl_images = !gl->hw_render_use && gl_check_capability(GL_CAPS_EGLIMAGE) && + video_context_driver_init_image_buffer(video); } gl_renderchain_driver_t gl2_renderchain = { diff --git a/gfx/video_driver.h b/gfx/video_driver.h index 1519bdc7a3..43bbef97ca 100644 --- a/gfx/video_driver.h +++ b/gfx/video_driver.h @@ -907,7 +907,8 @@ typedef struct gl_renderchain_driver void (*resolve_extensions)( void *data, void *chain_data, - const char *context_ident); + const char *context_ident, + const video_info_t *video); const char *ident; } gl_renderchain_driver_t; From 9a8f73fb6cd472a7e5204464347344ba815d4df0 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Mon, 4 Dec 2017 13:18:34 +0100 Subject: [PATCH 56/85] Move variables --- gfx/common/gl_common.h | 5 - gfx/drivers_renderchain/gl2_renderchain.c | 152 +++++++++++++--------- 2 files changed, 88 insertions(+), 69 deletions(-) diff --git a/gfx/common/gl_common.h b/gfx/common/gl_common.h index db94c1a268..c413d653c0 100644 --- a/gfx/common/gl_common.h +++ b/gfx/common/gl_common.h @@ -166,7 +166,6 @@ typedef struct gl bool fbo_inited; bool fbo_feedback_enable; bool hw_render_fbo_init; - bool hw_render_depth_init; bool has_fbo; bool hw_render_use; bool core_context_in_use; @@ -190,7 +189,6 @@ typedef struct gl int version_major; int version_minor; - int fbo_pass; GLuint tex_mag_filter; GLuint tex_min_filter; @@ -199,13 +197,10 @@ typedef struct gl GLuint pbo; GLuint *overlay_tex; GLuint menu_texture; - GLuint vao; GLuint pbo_readback[4]; GLuint texture[GFX_MAX_TEXTURES]; GLuint fbo[GFX_MAX_SHADERS]; - GLuint fbo_texture[GFX_MAX_SHADERS]; GLuint hw_render_fbo[GFX_MAX_TEXTURES]; - GLuint hw_render_depth[GFX_MAX_TEXTURES]; unsigned tex_index; /* For use with PREV. */ unsigned textures; diff --git a/gfx/drivers_renderchain/gl2_renderchain.c b/gfx/drivers_renderchain/gl2_renderchain.c index 3ed9b0eb1e..0b0eff8ff3 100644 --- a/gfx/drivers_renderchain/gl2_renderchain.c +++ b/gfx/drivers_renderchain/gl2_renderchain.c @@ -59,7 +59,16 @@ typedef struct gl2_renderchain bool has_fp_fbo; bool has_srgb_fbo_gles3; bool has_srgb_fbo; + bool hw_render_depth_init; + + int fbo_pass; + + GLuint vao; + GLuint fbo_texture[GFX_MAX_SHADERS]; + GLuint hw_render_depth[GFX_MAX_TEXTURES]; + unsigned fence_count; + GLsync fences[MAX_FENCES]; } gl2_renderchain_t; @@ -228,12 +237,15 @@ static bool gl_recreate_fbo( return false; } -static void gl_check_fbo_dimension(gl_t *gl, unsigned i, +static void gl_check_fbo_dimension(gl_t *gl, + void *chain_data, + unsigned i, bool update_feedback) { struct video_fbo_rect *fbo_rect = &gl->fbo_rect[i]; /* Check proactively since we might suddently * get sizes of tex_w width or tex_h height. */ + gl2_renderchain_t *chain = (gl2_renderchain_t*)chain_data; unsigned img_width = fbo_rect->max_img_width; unsigned img_height = fbo_rect->max_img_height; unsigned max = img_width > img_height ? img_width : img_height; @@ -242,7 +254,7 @@ static void gl_check_fbo_dimension(gl_t *gl, unsigned i, fbo_rect->width = pow2_size; fbo_rect->height = pow2_size; - gl_recreate_fbo(fbo_rect, gl->fbo[i], &gl->fbo_texture[i]); + gl_recreate_fbo(fbo_rect, gl->fbo[i], &chain->fbo_texture[i]); /* Update feedback texture in-place so we avoid having to * juggle two different fbo_rect structs since they get updated here. */ @@ -269,10 +281,11 @@ static void gl2_renderchain_check_fbo_dimensions(void *data, void *chain_data) { int i; - gl_t *gl = (gl_t*)data; + gl_t *gl = (gl_t*)data; + gl2_renderchain_t *chain = (gl2_renderchain_t*)chain_data; /* Check if we have to recreate our FBO textures. */ - for (i = 0; i < gl->fbo_pass; i++) + for (i = 0; i < chain->fbo_pass; i++) { struct video_fbo_rect *fbo_rect = &gl->fbo_rect[i]; if (fbo_rect) @@ -282,7 +295,7 @@ static void gl2_renderchain_check_fbo_dimensions(void *data, if ((fbo_rect->max_img_width > fbo_rect->width) || (fbo_rect->max_img_height > fbo_rect->height)) - gl_check_fbo_dimension(gl, i, update_feedback); + gl_check_fbo_dimension(gl, chain_data, i, update_feedback); } } } @@ -317,7 +330,7 @@ static void gl2_renderchain_render( /* Calculate viewports, texture coordinates etc, * and render all passes from FBOs, to another FBO. */ - for (i = 1; i < gl->fbo_pass; i++) + for (i = 1; i < chain->fbo_pass; i++) { video_shader_ctx_coords_t coords; video_shader_ctx_params_t params; @@ -331,7 +344,7 @@ static void gl2_renderchain_render( set_texture_coords(fbo_tex_coords, xamt, yamt); - fbo_info->tex = gl->fbo_texture[i - 1]; + fbo_info->tex = chain->fbo_texture[i - 1]; fbo_info->input_size[0] = prev_rect->img_width; fbo_info->input_size[1] = prev_rect->img_height; fbo_info->tex_size[0] = prev_rect->width; @@ -346,7 +359,7 @@ static void gl2_renderchain_render( shader_info.set_active = true; video_shader_driver_use(shader_info); - glBindTexture(GL_TEXTURE_2D, gl->fbo_texture[i - 1]); + glBindTexture(GL_TEXTURE_2D, chain->fbo_texture[i - 1]); mip_level = i + 1; @@ -395,16 +408,16 @@ static void gl2_renderchain_render( #endif /* Render our last FBO texture directly to screen. */ - prev_rect = &gl->fbo_rect[gl->fbo_pass - 1]; + prev_rect = &gl->fbo_rect[chain->fbo_pass - 1]; xamt = (GLfloat)prev_rect->img_width / prev_rect->width; yamt = (GLfloat)prev_rect->img_height / prev_rect->height; set_texture_coords(fbo_tex_coords, xamt, yamt); /* Push final FBO to list. */ - fbo_info = &fbo_tex_info[gl->fbo_pass - 1]; + fbo_info = &fbo_tex_info[chain->fbo_pass - 1]; - fbo_info->tex = gl->fbo_texture[gl->fbo_pass - 1]; + fbo_info->tex = chain->fbo_texture[chain->fbo_pass - 1]; fbo_info->input_size[0] = prev_rect->img_width; fbo_info->input_size[1] = prev_rect->img_height; fbo_info->tex_size[0] = prev_rect->width; @@ -416,14 +429,14 @@ static void gl2_renderchain_render( gl2_renderchain_bind_backbuffer(gl, chain_data); shader_info.data = gl; - shader_info.idx = gl->fbo_pass + 1; + shader_info.idx = chain->fbo_pass + 1; shader_info.set_active = true; video_shader_driver_use(shader_info); - glBindTexture(GL_TEXTURE_2D, gl->fbo_texture[gl->fbo_pass - 1]); + glBindTexture(GL_TEXTURE_2D, chain->fbo_texture[chain->fbo_pass - 1]); - mip_level = gl->fbo_pass + 1; + mip_level = chain->fbo_pass + 1; if (video_shader_driver_mipmap_input(&mip_level) && gl->have_mipmap) @@ -469,15 +482,16 @@ static void gl2_renderchain_render( static void gl2_renderchain_deinit_fbo(void *data, void *chain_data) { - gl_t *gl = (gl_t*)data; + gl_t *gl = (gl_t*)data; + gl2_renderchain_t *chain = (gl2_renderchain_t*)chain_data; if (!gl) return; - glDeleteTextures(gl->fbo_pass, gl->fbo_texture); - gl2_delete_fb(gl->fbo_pass, gl->fbo); + glDeleteTextures(chain->fbo_pass, chain->fbo_texture); + gl2_delete_fb(chain->fbo_pass, gl->fbo); - memset(gl->fbo_texture, 0, sizeof(gl->fbo_texture)); + memset(chain->fbo_texture, 0, sizeof(chain->fbo_texture)); memset(gl->fbo, 0, sizeof(gl->fbo)); if (gl->fbo_feedback) @@ -485,9 +499,10 @@ static void gl2_renderchain_deinit_fbo(void *data, if (gl->fbo_feedback_texture) glDeleteTextures(1, &gl->fbo_feedback_texture); + chain->fbo_pass = 0; + gl->fbo_inited = false; gl->fbo_feedback_enable = false; - gl->fbo_pass = 0; gl->fbo_feedback_pass = 0; gl->fbo_feedback_texture = 0; gl->fbo_feedback = 0; @@ -497,7 +512,8 @@ static void gl2_renderchain_deinit_hw_render( void *data, void *chain_data) { - gl_t *gl = (gl_t*)data; + gl_t *gl = (gl_t*)data; + gl2_renderchain_t *chain = (gl2_renderchain_t*)chain_data; if (!gl) return; @@ -505,8 +521,8 @@ static void gl2_renderchain_deinit_hw_render( if (gl->hw_render_fbo_init) gl2_delete_fb(gl->textures, gl->hw_render_fbo); - if (gl->hw_render_depth_init) - gl2_delete_rb(gl->textures, gl->hw_render_depth); + if (chain->hw_render_depth_init) + gl2_delete_rb(gl->textures, chain->hw_render_depth); gl->hw_render_fbo_init = false; context_bind_hw_render(false); @@ -520,20 +536,21 @@ static void gl2_renderchain_free(void *data, void *chain_data) gl2_renderchain_deinit_hw_render(gl, chain_data); } -static bool gl_create_fbo_targets(gl_t *gl) +static bool gl_create_fbo_targets(gl_t *gl, void *chain_data) { int i; + gl2_renderchain_t *chain = (gl2_renderchain_t*)chain_data; glBindTexture(GL_TEXTURE_2D, 0); - gl2_gen_fb(gl->fbo_pass, gl->fbo); + gl2_gen_fb(chain->fbo_pass, gl->fbo); - for (i = 0; i < gl->fbo_pass; i++) + for (i = 0; i < chain->fbo_pass; i++) { GLenum status; gl2_bind_fb(gl->fbo[i]); gl2_fb_texture_2d(RARCH_GL_FRAMEBUFFER, - RARCH_GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, gl->fbo_texture[i], 0); + RARCH_GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, chain->fbo_texture[i], 0); status = gl2_check_fb_status(RARCH_GL_FRAMEBUFFER); if (status != RARCH_GL_FRAMEBUFFER_COMPLETE) @@ -563,7 +580,7 @@ static bool gl_create_fbo_targets(gl_t *gl) return true; error: - gl2_delete_fb(gl->fbo_pass, gl->fbo); + gl2_delete_fb(chain->fbo_pass, gl->fbo); if (gl->fbo_feedback) gl2_delete_fb(1, &gl->fbo_feedback); RARCH_ERR("[GL]: Failed to set up frame buffer objects. Multi-pass shading will not work.\n"); @@ -675,14 +692,16 @@ static void gl_create_fbo_texture(gl_t *gl, } } -static void gl_create_fbo_textures(gl_t *gl) +static void gl_create_fbo_textures(gl_t *gl, void *chain_data) { int i; - glGenTextures(gl->fbo_pass, gl->fbo_texture); + gl2_renderchain_t *chain = (gl2_renderchain_t*)chain_data; - for (i = 0; i < gl->fbo_pass; i++) + glGenTextures(chain->fbo_pass, chain->fbo_texture); + + for (i = 0; i < chain->fbo_pass; i++) gl_create_fbo_texture(gl, gl->renderchain_data, - i, gl->fbo_texture[i]); + i, chain->fbo_texture[i]); if (gl->fbo_feedback_enable) { @@ -707,6 +726,7 @@ static void gl2_renderchain_recompute_pass_sizes( { int i; gl_t *gl = (gl_t*)data; + gl2_renderchain_t *chain = (gl2_renderchain_t*)chain_data; bool size_modified = false; GLint max_size = 0; unsigned last_width = width; @@ -717,7 +737,7 @@ static void gl2_renderchain_recompute_pass_sizes( glGetIntegerv(GL_MAX_TEXTURE_SIZE, &max_size); /* Calculate viewports for FBOs. */ - for (i = 0; i < gl->fbo_pass; i++) + for (i = 0; i < chain->fbo_pass; i++) { struct video_fbo_rect *fbo_rect = &gl->fbo_rect[i]; struct gfx_fbo_scale *fbo_scale = &gl->fbo_scale[i]; @@ -808,7 +828,8 @@ void gl2_renderchain_init( video_shader_ctx_scale_t scaler; video_shader_ctx_info_t shader_info; struct gfx_fbo_scale scale, scale_last; - gl_t *gl = (gl_t*)data; + gl_t *gl = (gl_t*)data; + gl2_renderchain_t *chain = (gl2_renderchain_t*)chain_data; if (!video_shader_driver_info(&shader_info)) return; @@ -838,9 +859,9 @@ void gl2_renderchain_init( return; } - gl->fbo_pass = shader_info.num - 1; + chain->fbo_pass = shader_info.num - 1; if (scale_last.valid) - gl->fbo_pass++; + chain->fbo_pass++; if (!scale.valid) { @@ -852,7 +873,7 @@ void gl2_renderchain_init( gl->fbo_scale[0] = scale; - for (i = 1; i < gl->fbo_pass; i++) + for (i = 1; i < chain->fbo_pass; i++) { scaler.idx = i + 1; scaler.scale = &gl->fbo_scale[i]; @@ -872,7 +893,7 @@ void gl2_renderchain_init( chain_data, fbo_width, fbo_height, width, height); - for (i = 0; i < gl->fbo_pass; i++) + for (i = 0; i < chain->fbo_pass; i++) { gl->fbo_rect[i].width = next_pow2(gl->fbo_rect[i].img_width); gl->fbo_rect[i].height = next_pow2(gl->fbo_rect[i].img_height); @@ -884,7 +905,7 @@ void gl2_renderchain_init( &gl->fbo_feedback_pass); if (gl->fbo_feedback_enable && gl->fbo_feedback_pass - < (unsigned)gl->fbo_pass) + < (unsigned)chain->fbo_pass) { RARCH_LOG("[GL]: Creating feedback FBO %d @ %ux%u\n", i, gl->fbo_rect[gl->fbo_feedback_pass].width, @@ -893,14 +914,14 @@ void gl2_renderchain_init( else if (gl->fbo_feedback_enable) { RARCH_WARN("[GL]: Tried to create feedback FBO of pass #%u, but there are only %d FBO passes. Will use input texture as feedback texture.\n", - gl->fbo_feedback_pass, gl->fbo_pass); + gl->fbo_feedback_pass, chain->fbo_pass); gl->fbo_feedback_enable = false; } - gl_create_fbo_textures(gl); - if (!gl || !gl_create_fbo_targets(gl)) + gl_create_fbo_textures(gl, chain); + if (!gl || !gl_create_fbo_targets(gl, chain)) { - glDeleteTextures(gl->fbo_pass, gl->fbo_texture); + glDeleteTextures(chain->fbo_pass, chain->fbo_texture); RARCH_ERR("[GL]: Failed to create FBO targets. Will continue without FBO.\n"); return; } @@ -922,6 +943,7 @@ static bool gl2_renderchain_init_hw_render( struct retro_hw_render_callback *hwr = video_driver_get_hw_context(); gl_t *gl = (gl_t*)data; + gl2_renderchain_t *chain = (gl2_renderchain_t*)chain_data; /* We can only share texture objects through contexts. * FBOs are "abstract" objects and are not shared. */ @@ -946,8 +968,8 @@ static bool gl2_renderchain_init_hw_render( if (depth) { - gl2_gen_rb(gl->textures, gl->hw_render_depth); - gl->hw_render_depth_init = true; + gl2_gen_rb(gl->textures, chain->hw_render_depth); + chain->hw_render_depth_init = true; } for (i = 0; i < gl->textures; i++) @@ -958,7 +980,7 @@ static bool gl2_renderchain_init_hw_render( if (depth) { - gl2_bind_rb(RARCH_GL_RENDERBUFFER, gl->hw_render_depth[i]); + gl2_bind_rb(RARCH_GL_RENDERBUFFER, chain->hw_render_depth[i]); gl2_rb_storage(RARCH_GL_RENDERBUFFER, stencil ? RARCH_GL_DEPTH24_STENCIL8 : GL_DEPTH_COMPONENT16, width, height); @@ -971,22 +993,26 @@ static bool gl2_renderchain_init_hw_render( * There's no GL_DEPTH_STENCIL_ATTACHMENT like in desktop GL. */ gl2_fb_rb(RARCH_GL_FRAMEBUFFER, RARCH_GL_DEPTH_ATTACHMENT, - RARCH_GL_RENDERBUFFER, gl->hw_render_depth[i]); + RARCH_GL_RENDERBUFFER, + chain->hw_render_depth[i]); gl2_fb_rb(RARCH_GL_FRAMEBUFFER, RARCH_GL_STENCIL_ATTACHMENT, - RARCH_GL_RENDERBUFFER, gl->hw_render_depth[i]); + RARCH_GL_RENDERBUFFER, + chain->hw_render_depth[i]); #else /* We use ARB FBO extensions, no need to check. */ gl2_fb_rb(RARCH_GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, - RARCH_GL_RENDERBUFFER, gl->hw_render_depth[i]); + RARCH_GL_RENDERBUFFER, + chain->hw_render_depth[i]); #endif } else { gl2_fb_rb(RARCH_GL_FRAMEBUFFER, RARCH_GL_DEPTH_ATTACHMENT, - RARCH_GL_RENDERBUFFER, gl->hw_render_depth[i]); + RARCH_GL_RENDERBUFFER, + chain->hw_render_depth[i]); } } @@ -1011,7 +1037,8 @@ static void gl2_renderchain_bind_prev_texture( void *chain_data, const struct video_tex_info *tex_info) { - gl_t *gl = (gl_t*)data; + gl_t *gl = (gl_t*)data; + gl2_renderchain_t *chain = (gl2_renderchain_t*)chain_data; memmove(gl->prev_info + 1, gl->prev_info, sizeof(*tex_info) * (gl->textures - 1)); @@ -1025,9 +1052,9 @@ static void gl2_renderchain_bind_prev_texture( GLuint tmp_fbo = gl->fbo_feedback; GLuint tmp_tex = gl->fbo_feedback_texture; gl->fbo_feedback = gl->fbo[gl->fbo_feedback_pass]; - gl->fbo_feedback_texture = gl->fbo_texture[gl->fbo_feedback_pass]; + gl->fbo_feedback_texture = chain->fbo_texture[gl->fbo_feedback_pass]; gl->fbo[gl->fbo_feedback_pass] = tmp_fbo; - gl->fbo_texture[gl->fbo_feedback_pass] = tmp_tex; + chain->fbo_texture[gl->fbo_feedback_pass] = tmp_tex; } } @@ -1178,37 +1205,34 @@ static void *gl2_renderchain_new(void) static void gl2_renderchain_bind_vao(void *data, void *chain_data) { - gl_t *gl = (gl_t*)data; - if (!gl) + gl2_renderchain_t *chain = (gl2_renderchain_t*)chain_data; + if (!chain) return; - glBindVertexArray(gl->vao); + glBindVertexArray(chain->vao); } static void gl2_renderchain_unbind_vao(void *data, void *chain_data) { - gl_t *gl = (gl_t*)data; - if (!gl) - return; glBindVertexArray(0); } static void gl2_renderchain_new_vao(void *data, void *chain_data) { - gl_t *gl = (gl_t*)data; - if (!gl) + gl2_renderchain_t *chain = (gl2_renderchain_t*)chain_data; + if (!chain) return; - glGenVertexArrays(1, &gl->vao); + glGenVertexArrays(1, &chain->vao); } static void gl2_renderchain_free_vao(void *data, void *chain_data) { - gl_t *gl = (gl_t*)data; - if (!gl) + gl2_renderchain_t *chain = (gl2_renderchain_t*)chain_data; + if (!chain) return; - glDeleteVertexArrays(1, &gl->vao); + glDeleteVertexArrays(1, &chain->vao); } #endif From 2fd720bcb349043ae973ff4788deb8f0badb458b Mon Sep 17 00:00:00 2001 From: twinaphex Date: Mon, 4 Dec 2017 13:21:23 +0100 Subject: [PATCH 57/85] move more variables over --- gfx/common/gl_common.h | 1 - gfx/drivers_renderchain/gl2_renderchain.c | 20 +++++++++++--------- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/gfx/common/gl_common.h b/gfx/common/gl_common.h index c413d653c0..48458363c3 100644 --- a/gfx/common/gl_common.h +++ b/gfx/common/gl_common.h @@ -236,7 +236,6 @@ typedef struct gl video_info_t video_info; struct video_tex_info prev_info[GFX_MAX_TEXTURES]; struct video_fbo_rect fbo_rect[GFX_MAX_SHADERS]; - struct gfx_fbo_scale fbo_scale[GFX_MAX_SHADERS]; const gl_renderchain_driver_t *renderchain_driver; void *renderchain_data; diff --git a/gfx/drivers_renderchain/gl2_renderchain.c b/gfx/drivers_renderchain/gl2_renderchain.c index 0b0eff8ff3..972d93844c 100644 --- a/gfx/drivers_renderchain/gl2_renderchain.c +++ b/gfx/drivers_renderchain/gl2_renderchain.c @@ -70,6 +70,8 @@ typedef struct gl2_renderchain unsigned fence_count; GLsync fences[MAX_FENCES]; + + struct gfx_fbo_scale fbo_scale[GFX_MAX_SHADERS]; } gl2_renderchain_t; #if (!defined(HAVE_OPENGLES) || defined(HAVE_OPENGLES3)) @@ -623,7 +625,7 @@ static void gl_create_fbo_texture(gl_t *gl, gl_bind_texture(texture, wrap_enum, mag_filter, min_filter); - fp_fbo = gl->fbo_scale[i].fp_fbo; + fp_fbo = chain->fbo_scale[i].fp_fbo; if (fp_fbo) { @@ -643,7 +645,7 @@ static void gl_create_fbo_texture(gl_t *gl, #endif { #ifndef HAVE_OPENGLES - bool srgb_fbo = gl->fbo_scale[i].srgb_fbo; + bool srgb_fbo = chain->fbo_scale[i].srgb_fbo; if (!fp_fbo && srgb_fbo) { @@ -740,7 +742,7 @@ static void gl2_renderchain_recompute_pass_sizes( for (i = 0; i < chain->fbo_pass; i++) { struct video_fbo_rect *fbo_rect = &gl->fbo_rect[i]; - struct gfx_fbo_scale *fbo_scale = &gl->fbo_scale[i]; + struct gfx_fbo_scale *fbo_scale = &chain->fbo_scale[i]; gl2_renderchain_convert_geometry( gl, fbo_rect, fbo_scale, @@ -871,21 +873,21 @@ void gl2_renderchain_init( scale.valid = true; } - gl->fbo_scale[0] = scale; + chain->fbo_scale[0] = scale; for (i = 1; i < chain->fbo_pass; i++) { scaler.idx = i + 1; - scaler.scale = &gl->fbo_scale[i]; + scaler.scale = &chain->fbo_scale[i]; video_shader_driver_scale(&scaler); - if (!gl->fbo_scale[i].valid) + if (!chain->fbo_scale[i].valid) { - gl->fbo_scale[i].scale_x = gl->fbo_scale[i].scale_y = 1.0f; - gl->fbo_scale[i].type_x = gl->fbo_scale[i].type_y = + chain->fbo_scale[i].scale_x = chain->fbo_scale[i].scale_y = 1.0f; + chain->fbo_scale[i].type_x = chain->fbo_scale[i].type_y = RARCH_SCALE_INPUT; - gl->fbo_scale[i].valid = true; + chain->fbo_scale[i].valid = true; } } From f08b04952004397f51478184b5c3b63de314340e Mon Sep 17 00:00:00 2001 From: twinaphex Date: Mon, 4 Dec 2017 13:24:27 +0100 Subject: [PATCH 58/85] Move more variables --- gfx/common/gl_common.h | 1 - gfx/drivers_renderchain/gl2_renderchain.c | 21 +++++++++++---------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/gfx/common/gl_common.h b/gfx/common/gl_common.h index 48458363c3..7fb5527dcf 100644 --- a/gfx/common/gl_common.h +++ b/gfx/common/gl_common.h @@ -199,7 +199,6 @@ typedef struct gl GLuint menu_texture; GLuint pbo_readback[4]; GLuint texture[GFX_MAX_TEXTURES]; - GLuint fbo[GFX_MAX_SHADERS]; GLuint hw_render_fbo[GFX_MAX_TEXTURES]; unsigned tex_index; /* For use with PREV. */ diff --git a/gfx/drivers_renderchain/gl2_renderchain.c b/gfx/drivers_renderchain/gl2_renderchain.c index 972d93844c..a74e0d6637 100644 --- a/gfx/drivers_renderchain/gl2_renderchain.c +++ b/gfx/drivers_renderchain/gl2_renderchain.c @@ -64,6 +64,7 @@ typedef struct gl2_renderchain int fbo_pass; GLuint vao; + GLuint fbo[GFX_MAX_SHADERS]; GLuint fbo_texture[GFX_MAX_SHADERS]; GLuint hw_render_depth[GFX_MAX_TEXTURES]; @@ -256,7 +257,7 @@ static void gl_check_fbo_dimension(gl_t *gl, fbo_rect->width = pow2_size; fbo_rect->height = pow2_size; - gl_recreate_fbo(fbo_rect, gl->fbo[i], &chain->fbo_texture[i]); + gl_recreate_fbo(fbo_rect, chain->fbo[i], &chain->fbo_texture[i]); /* Update feedback texture in-place so we avoid having to * juggle two different fbo_rect structs since they get updated here. */ @@ -354,7 +355,7 @@ static void gl2_renderchain_render( memcpy(fbo_info->coord, fbo_tex_coords, sizeof(fbo_tex_coords)); fbo_tex_info_cnt++; - gl2_bind_fb(gl->fbo[i]); + gl2_bind_fb(chain->fbo[i]); shader_info.data = gl; shader_info.idx = i + 1; @@ -491,10 +492,10 @@ static void gl2_renderchain_deinit_fbo(void *data, return; glDeleteTextures(chain->fbo_pass, chain->fbo_texture); - gl2_delete_fb(chain->fbo_pass, gl->fbo); + gl2_delete_fb(chain->fbo_pass, chain->fbo); memset(chain->fbo_texture, 0, sizeof(chain->fbo_texture)); - memset(gl->fbo, 0, sizeof(gl->fbo)); + memset(chain->fbo, 0, sizeof(chain->fbo)); if (gl->fbo_feedback) gl2_delete_fb(1, &gl->fbo_feedback); @@ -544,13 +545,13 @@ static bool gl_create_fbo_targets(gl_t *gl, void *chain_data) gl2_renderchain_t *chain = (gl2_renderchain_t*)chain_data; glBindTexture(GL_TEXTURE_2D, 0); - gl2_gen_fb(chain->fbo_pass, gl->fbo); + gl2_gen_fb(chain->fbo_pass, chain->fbo); for (i = 0; i < chain->fbo_pass; i++) { GLenum status; - gl2_bind_fb(gl->fbo[i]); + gl2_bind_fb(chain->fbo[i]); gl2_fb_texture_2d(RARCH_GL_FRAMEBUFFER, RARCH_GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, chain->fbo_texture[i], 0); @@ -582,7 +583,7 @@ static bool gl_create_fbo_targets(gl_t *gl, void *chain_data) return true; error: - gl2_delete_fb(chain->fbo_pass, gl->fbo); + gl2_delete_fb(chain->fbo_pass, chain->fbo); if (gl->fbo_feedback) gl2_delete_fb(1, &gl->fbo_feedback); RARCH_ERR("[GL]: Failed to set up frame buffer objects. Multi-pass shading will not work.\n"); @@ -802,7 +803,7 @@ static void gl2_renderchain_start_render(void *data, gl2_renderchain_t *chain = (gl2_renderchain_t*)chain_data; glBindTexture(GL_TEXTURE_2D, gl->texture[gl->tex_index]); - gl2_bind_fb(gl->fbo[0]); + gl2_bind_fb(chain->fbo[0]); gl_set_viewport(gl, video_info, gl->fbo_rect[0].img_width, @@ -1053,9 +1054,9 @@ static void gl2_renderchain_bind_prev_texture( { GLuint tmp_fbo = gl->fbo_feedback; GLuint tmp_tex = gl->fbo_feedback_texture; - gl->fbo_feedback = gl->fbo[gl->fbo_feedback_pass]; + gl->fbo_feedback = chain->fbo[gl->fbo_feedback_pass]; gl->fbo_feedback_texture = chain->fbo_texture[gl->fbo_feedback_pass]; - gl->fbo[gl->fbo_feedback_pass] = tmp_fbo; + chain->fbo[gl->fbo_feedback_pass] = tmp_fbo; chain->fbo_texture[gl->fbo_feedback_pass] = tmp_tex; } } From 50148c03e27083af64f194ab32595566b9442718 Mon Sep 17 00:00:00 2001 From: Alcaro Date: Mon, 4 Dec 2017 13:27:05 +0100 Subject: [PATCH 59/85] not used anymore https://github.com/libretro/RetroArch/commit/4e66962ba83941b85b206778828596c6ad20be33 --- libretro-common/include/streams/file_stream.h | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/libretro-common/include/streams/file_stream.h b/libretro-common/include/streams/file_stream.h index e6d6bbca1c..c57731d76a 100644 --- a/libretro-common/include/streams/file_stream.h +++ b/libretro-common/include/streams/file_stream.h @@ -63,10 +63,9 @@ const char *filestream_get_ext(RFILE *stream); * @bufsize : optional buffer size (-1 or 0 to use default) * * Opens a file for reading or writing, depending on the requested mode. - * If bufsize is > 0 for unbuffered modes (like RFILE_MODE_WRITE), file will instead be fully buffered. * Returns a pointer to an RFILE if opened successfully, otherwise NULL. **/ -RFILE *filestream_open(const char *path, unsigned mode, ssize_t bufsize); +RFILE *filestream_open(const char *path, unsigned mode, ssize_t unused); ssize_t filestream_seek(RFILE *stream, ssize_t offset, int whence); From 89f7afdc8f28a3e28f6a14c707671ea62f44bfb3 Mon Sep 17 00:00:00 2001 From: Alcaro Date: Mon, 4 Dec 2017 13:28:38 +0100 Subject: [PATCH 60/85] silence warning --- libretro-common/streams/file_stream.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libretro-common/streams/file_stream.c b/libretro-common/streams/file_stream.c index c4dcddf0a7..ff742674b7 100644 --- a/libretro-common/streams/file_stream.c +++ b/libretro-common/streams/file_stream.c @@ -166,7 +166,6 @@ void filestream_set_size(RFILE *stream) * @bufsize : optional buffer size (-1 or 0 to use default) * * Opens a file for reading or writing, depending on the requested mode. - * If bufsize is > 0 for unbuffered modes (like RFILE_MODE_WRITE), file will instead be fully buffered. * Returns a pointer to an RFILE if opened successfully, otherwise NULL. **/ RFILE *filestream_open(const char *path, unsigned mode, ssize_t unused) @@ -192,6 +191,7 @@ RFILE *filestream_open(const char *path, unsigned mode, ssize_t unused) (void)mode_int; (void)flags; + (void)bufsize; stream->hints = mode; From df55e6b4d1b094794bc08356eea01468f2fa6e06 Mon Sep 17 00:00:00 2001 From: Alcaro Date: Mon, 4 Dec 2017 13:30:38 +0100 Subject: [PATCH 61/85] actually, let's just completely remove it --- libretro-common/streams/file_stream.c | 27 +++++++++++---------------- 1 file changed, 11 insertions(+), 16 deletions(-) diff --git a/libretro-common/streams/file_stream.c b/libretro-common/streams/file_stream.c index ff742674b7..f8db1c9442 100644 --- a/libretro-common/streams/file_stream.c +++ b/libretro-common/streams/file_stream.c @@ -170,7 +170,6 @@ void filestream_set_size(RFILE *stream) **/ RFILE *filestream_open(const char *path, unsigned mode, ssize_t unused) { - ssize_t bufsize = 0x4000; int flags = 0; int mode_int = 0; #if defined(HAVE_BUFFERED_IO) @@ -191,7 +190,6 @@ RFILE *filestream_open(const char *path, unsigned mode, ssize_t unused) (void)mode_int; (void)flags; - (void)bufsize; stream->hints = mode; @@ -298,20 +296,17 @@ RFILE *filestream_open(const char *path, unsigned mode, ssize_t unused) if (!stream->fp) goto error; - if (bufsize > 0) - { - /* Regarding setvbuf: - * - * https://www.freebsd.org/cgi/man.cgi?query=setvbuf&apropos=0&sektion=0&manpath=FreeBSD+11.1-RELEASE&arch=default&format=html - * - * If the size argument is not zero but buf is NULL, a buffer of the given size will be allocated immediately, and - * released on close. This is an extension to ANSI C. - * - * Since C89 does not support specifying a null buffer with a non-zero size, we create and track our own buffer for it. - */ - stream->buf = (char*)calloc(1, bufsize); - setvbuf(stream->fp, stream->buf, _IOFBF, bufsize); - } + /* Regarding setvbuf: + * + * https://www.freebsd.org/cgi/man.cgi?query=setvbuf&apropos=0&sektion=0&manpath=FreeBSD+11.1-RELEASE&arch=default&format=html + * + * If the size argument is not zero but buf is NULL, a buffer of the given size will be allocated immediately, and + * released on close. This is an extension to ANSI C. + * + * Since C89 does not support specifying a null buffer with a non-zero size, we create and track our own buffer for it. + */ + stream->buf = (char*)calloc(1, 0x4000); + setvbuf(stream->fp, stream->buf, _IOFBF, 0x4000); } else #endif From 0d4ac123100f8c473a30064eb0fa7ea9982f5a9c Mon Sep 17 00:00:00 2001 From: Alcaro Date: Mon, 4 Dec 2017 13:34:15 +0100 Subject: [PATCH 62/85] Update file_stream.c --- libretro-common/streams/file_stream.c | 1 + 1 file changed, 1 insertion(+) diff --git a/libretro-common/streams/file_stream.c b/libretro-common/streams/file_stream.c index f8db1c9442..5703a69b1d 100644 --- a/libretro-common/streams/file_stream.c +++ b/libretro-common/streams/file_stream.c @@ -305,6 +305,7 @@ RFILE *filestream_open(const char *path, unsigned mode, ssize_t unused) * * Since C89 does not support specifying a null buffer with a non-zero size, we create and track our own buffer for it. */ + /* TODO: this is only useful for a few platforms, find which and add ifdef */ stream->buf = (char*)calloc(1, 0x4000); setvbuf(stream->fp, stream->buf, _IOFBF, 0x4000); } From 2b3cc8898a0ae2312feba3c40d1ba7639b7fd9dc Mon Sep 17 00:00:00 2001 From: Alcaro Date: Mon, 4 Dec 2017 13:41:04 +0100 Subject: [PATCH 63/85] Fix this one for non-stdio backends Why does filestream_get_fp exist --- playlist.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/playlist.c b/playlist.c index 2c22d9243d..5ccc40cd2e 100644 --- a/playlist.c +++ b/playlist.c @@ -381,7 +381,6 @@ void playlist_write_file(playlist_t *playlist) { size_t i; RFILE *file = NULL; - FILE *fp = NULL; if (!playlist || !playlist->modified) return; @@ -394,10 +393,8 @@ void playlist_write_file(playlist_t *playlist) return; } - fp = filestream_get_fp(file); - for (i = 0; i < playlist->size; i++) - fprintf(fp, "%s\n%s\n%s\n%s\n%s\n%s\n", + filestream_printf(file, "%s\n%s\n%s\n%s\n%s\n%s\n", playlist->entries[i].path ? playlist->entries[i].path : "", playlist->entries[i].label ? playlist->entries[i].label : "", playlist->entries[i].core_path, From 130e4522e2c580dec7989736dfe898dcd9dc188c Mon Sep 17 00:00:00 2001 From: Alcaro Date: Mon, 4 Dec 2017 13:51:25 +0100 Subject: [PATCH 64/85] Update file_stream.h --- libretro-common/include/streams/file_stream.h | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/libretro-common/include/streams/file_stream.h b/libretro-common/include/streams/file_stream.h index c57731d76a..ee8cc8e0ba 100644 --- a/libretro-common/include/streams/file_stream.h +++ b/libretro-common/include/streams/file_stream.h @@ -99,8 +99,11 @@ int filestream_printf(RFILE *stream, const char* format, ...); int filestream_error(RFILE *stream); -int filestream_get_fd(RFILE *stream); +/* DO NOT put this function back, unless you want to deal with + the UNAVOIDABLE REGRESSIONS on platforms using unexpected rfile backends +int filestream_get_fd(RFILE *stream); */ +/* TODO: remove, for the same reason as the above */ FILE* filestream_get_fp(RFILE *stream); int filestream_flush(RFILE *stream); From e4bb8e7aeb286b2c3e4e0bc890b72ee2a435c3f0 Mon Sep 17 00:00:00 2001 From: Alcaro Date: Mon, 4 Dec 2017 13:52:11 +0100 Subject: [PATCH 65/85] Update file_stream.c --- libretro-common/streams/file_stream.c | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/libretro-common/streams/file_stream.c b/libretro-common/streams/file_stream.c index 5703a69b1d..fce0934a92 100644 --- a/libretro-common/streams/file_stream.c +++ b/libretro-common/streams/file_stream.c @@ -121,17 +121,6 @@ FILE* filestream_get_fp(RFILE *stream) return stream->fp; } -int filestream_get_fd(RFILE *stream) -{ - if (!stream) - return -1; -#if defined(HAVE_BUFFERED_IO) - if ((stream->hints & RFILE_HINT_UNBUFFERED) == 0) - return fileno(stream->fp); -#endif - return stream->fd; -} - const char *filestream_get_ext(RFILE *stream) { if (!stream) From 1aa6ae1b389c2a18ca2ec48161b9a5b4cd53e812 Mon Sep 17 00:00:00 2001 From: Alcaro Date: Mon, 4 Dec 2017 14:25:16 +0100 Subject: [PATCH 66/85] Use FILE* all the way Fixes platforms where RFILE isn't using the FILE* backend, needed for #5664 --- verbosity.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/verbosity.c b/verbosity.c index 83dca5d02f..368067fa96 100644 --- a/verbosity.c +++ b/verbosity.c @@ -49,8 +49,8 @@ /* If this is non-NULL. RARCH_LOG and friends * will write to this file. */ -static RFILE *log_file = NULL; static FILE *log_file_fp = NULL; +static void* log_file_buf = NULL; static bool main_verbosity = false; static bool log_file_initialized = false; @@ -96,17 +96,21 @@ void retro_main_log_file_init(const char *path) if (path == NULL) return; - log_file = filestream_open(path, RFILE_MODE_WRITE, -1); - log_file_fp = filestream_get_fp(log_file); + log_file_fp = fopen(path, "wb"); log_file_initialized = true; + + /* TODO: this is only useful for a few platforms, find which and add ifdef */ + log_file_buf = (char*)calloc(1, 0x4000); + setvbuf(log_file_fp, log_file_buf, _IOFBF, 0x4000); } void retro_main_log_file_deinit(void) { - if (log_file && log_file_fp != stderr) - filestream_close(log_file); - log_file = NULL; + if (log_file_fp && log_file_fp != stderr) + fclose(log_file_fp); + if (log_file_buf) free(log_file_buf); log_file_fp = NULL; + log_file_buf = NULL; } #if !defined(HAVE_LOGGER) From b9900b1fb8e7c570d338325dd827badc044e98ab Mon Sep 17 00:00:00 2001 From: Alcaro Date: Mon, 4 Dec 2017 14:27:36 +0100 Subject: [PATCH 67/85] This cast isn't needed, and probably breaks CXX_BUILD --- verbosity.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/verbosity.c b/verbosity.c index 368067fa96..2fb735e6bf 100644 --- a/verbosity.c +++ b/verbosity.c @@ -100,7 +100,7 @@ void retro_main_log_file_init(const char *path) log_file_initialized = true; /* TODO: this is only useful for a few platforms, find which and add ifdef */ - log_file_buf = (char*)calloc(1, 0x4000); + log_file_buf = calloc(1, 0x4000); setvbuf(log_file_fp, log_file_buf, _IOFBF, 0x4000); } From 300052626fc4db994a1e94a46c4ed93d3dd179b4 Mon Sep 17 00:00:00 2001 From: Alcaro Date: Mon, 4 Dec 2017 14:30:32 +0100 Subject: [PATCH 68/85] Use FILE* all the way Fixes platforms where RFILE isn't using the FILE* backend, needed for #5664 --- libretro-common/file/config_file.c | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/libretro-common/file/config_file.c b/libretro-common/file/config_file.c index 70f7b64aab..67c0703ff6 100644 --- a/libretro-common/file/config_file.c +++ b/libretro-common/file/config_file.c @@ -912,20 +912,28 @@ void config_set_bool(config_file_t *conf, const char *key, bool val) bool config_file_write(config_file_t *conf, const char *path) { - RFILE *file = NULL; + FILE* file = NULL; + void* buf = NULL; if (!string_is_empty(path)) { - file = filestream_open(path, RFILE_MODE_WRITE, 0x4000); + file = fopen(path, "wb"); if (!file) return false; - config_file_dump(conf, filestream_get_fp(file)); + + /* TODO: this is only useful for a few platforms, find which and add ifdef */ + buf = calloc(1, 0x4000); + setvbuf(file, buf, _IOFBF, 0x4000); + + config_file_dump(conf, file); } else config_file_dump(conf, stdout); - if (file) - filestream_close(file); + if (file && file != stdout) + fclose(file); + if (buf) + free(buf); return true; } From dca30d533fc415d04a03a79965e223f2f3a4d39e Mon Sep 17 00:00:00 2001 From: Alcaro Date: Mon, 4 Dec 2017 14:31:11 +0100 Subject: [PATCH 69/85] Update file_stream.h --- libretro-common/include/streams/file_stream.h | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/libretro-common/include/streams/file_stream.h b/libretro-common/include/streams/file_stream.h index ee8cc8e0ba..06cdf33ded 100644 --- a/libretro-common/include/streams/file_stream.h +++ b/libretro-common/include/streams/file_stream.h @@ -99,12 +99,10 @@ int filestream_printf(RFILE *stream, const char* format, ...); int filestream_error(RFILE *stream); -/* DO NOT put this function back, unless you want to deal with +/* DO NOT put these functions back, unless you want to deal with the UNAVOIDABLE REGRESSIONS on platforms using unexpected rfile backends -int filestream_get_fd(RFILE *stream); */ - -/* TODO: remove, for the same reason as the above */ -FILE* filestream_get_fp(RFILE *stream); +int filestream_get_fd(RFILE *stream); +FILE* filestream_get_fp(RFILE *stream); */ int filestream_flush(RFILE *stream); From c10859b745cfd902246b646c05e666c7461345a4 Mon Sep 17 00:00:00 2001 From: Alcaro Date: Mon, 4 Dec 2017 14:31:31 +0100 Subject: [PATCH 70/85] Update file_stream.c --- libretro-common/streams/file_stream.c | 7 ------- 1 file changed, 7 deletions(-) diff --git a/libretro-common/streams/file_stream.c b/libretro-common/streams/file_stream.c index fce0934a92..9fdf995d8f 100644 --- a/libretro-common/streams/file_stream.c +++ b/libretro-common/streams/file_stream.c @@ -114,13 +114,6 @@ struct RFILE char *buf; }; -FILE* filestream_get_fp(RFILE *stream) -{ - if (!stream) - return NULL; - return stream->fp; -} - const char *filestream_get_ext(RFILE *stream) { if (!stream) From fbd3a435d2f93ed6d217257b055e411d700a66c5 Mon Sep 17 00:00:00 2001 From: Alcaro Date: Mon, 4 Dec 2017 15:01:57 +0100 Subject: [PATCH 71/85] Turns out this is char*, let's cast because CXX_BUILD wants that --- verbosity.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/verbosity.c b/verbosity.c index 2fb735e6bf..734dcaba39 100644 --- a/verbosity.c +++ b/verbosity.c @@ -101,7 +101,7 @@ void retro_main_log_file_init(const char *path) /* TODO: this is only useful for a few platforms, find which and add ifdef */ log_file_buf = calloc(1, 0x4000); - setvbuf(log_file_fp, log_file_buf, _IOFBF, 0x4000); + setvbuf(log_file_fp, (char*)log_file_buf, _IOFBF, 0x4000); } void retro_main_log_file_deinit(void) From ff4dca86f95ab0cf34004ddca9cacc353127bda4 Mon Sep 17 00:00:00 2001 From: Alcaro Date: Mon, 4 Dec 2017 15:01:58 +0100 Subject: [PATCH 72/85] Turns out this is char*, let's cast because CXX_BUILD wants that --- libretro-common/file/config_file.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libretro-common/file/config_file.c b/libretro-common/file/config_file.c index 67c0703ff6..66e03f3f7b 100644 --- a/libretro-common/file/config_file.c +++ b/libretro-common/file/config_file.c @@ -923,7 +923,7 @@ bool config_file_write(config_file_t *conf, const char *path) /* TODO: this is only useful for a few platforms, find which and add ifdef */ buf = calloc(1, 0x4000); - setvbuf(file, buf, _IOFBF, 0x4000); + setvbuf(file, (char*)buf, _IOFBF, 0x4000); config_file_dump(conf, file); } From 059354de2f60e14c3894382d53641a1cb1d09845 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Mon, 4 Dec 2017 16:26:28 +0100 Subject: [PATCH 73/85] Cleanup for config_file_write --- libretro-common/file/config_file.c | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/libretro-common/file/config_file.c b/libretro-common/file/config_file.c index 66e03f3f7b..9e23012168 100644 --- a/libretro-common/file/config_file.c +++ b/libretro-common/file/config_file.c @@ -912,12 +912,10 @@ void config_set_bool(config_file_t *conf, const char *key, bool val) bool config_file_write(config_file_t *conf, const char *path) { - FILE* file = NULL; - void* buf = NULL; - if (!string_is_empty(path)) { - file = fopen(path, "wb"); + void* buf = NULL; + FILE *file = fopen(path, "wb"); if (!file) return false; @@ -926,15 +924,14 @@ bool config_file_write(config_file_t *conf, const char *path) setvbuf(file, (char*)buf, _IOFBF, 0x4000); config_file_dump(conf, file); + + if (file != stdout) + fclose(file); + free(buf); } else config_file_dump(conf, stdout); - if (file && file != stdout) - fclose(file); - if (buf) - free(buf); - return true; } From d74ad6cd5e9fe19bcba0e299369aaa9960533c0b Mon Sep 17 00:00:00 2001 From: Alcaro Date: Mon, 4 Dec 2017 16:32:40 +0100 Subject: [PATCH 74/85] Create fopen_utf8.h --- libretro-common/include/compat/fopen_utf8.h | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 libretro-common/include/compat/fopen_utf8.h diff --git a/libretro-common/include/compat/fopen_utf8.h b/libretro-common/include/compat/fopen_utf8.h new file mode 100644 index 0000000000..0c6d44d778 --- /dev/null +++ b/libretro-common/include/compat/fopen_utf8.h @@ -0,0 +1,5 @@ +#include +#ifdef _WIN32 +#define fopen fopen_utf8 +FILE* fopen_utf8(const char * filename, const char * mode); +#endif From 8df699984ea1820fa6ce64b0921db6689acbbf24 Mon Sep 17 00:00:00 2001 From: Alcaro Date: Mon, 4 Dec 2017 16:34:56 +0100 Subject: [PATCH 75/85] Update fopen_utf8.h --- libretro-common/include/compat/fopen_utf8.h | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/libretro-common/include/compat/fopen_utf8.h b/libretro-common/include/compat/fopen_utf8.h index 0c6d44d778..583b558a26 100644 --- a/libretro-common/include/compat/fopen_utf8.h +++ b/libretro-common/include/compat/fopen_utf8.h @@ -1,5 +1,9 @@ #include #ifdef _WIN32 -#define fopen fopen_utf8 +/* defined to error rather than fopen_utf8, to make clear to everyone reading the code that not worrying about utf16 is fine */ +/* TODO: enable */ +/* #define fopen (use fopen_utf8 instead) */ FILE* fopen_utf8(const char * filename, const char * mode); +#else +#define fopen_utf8 fopen #endif From 8a93a9eb8eac185850f79eb54653cdb4bec2de7c Mon Sep 17 00:00:00 2001 From: Alcaro Date: Mon, 4 Dec 2017 16:44:34 +0100 Subject: [PATCH 76/85] Create fopen_utf8.c --- libretro-common/compat/fopen_utf8.c | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 libretro-common/compat/fopen_utf8.c diff --git a/libretro-common/compat/fopen_utf8.c b/libretro-common/compat/fopen_utf8.c new file mode 100644 index 0000000000..a17ad81542 --- /dev/null +++ b/libretro-common/compat/fopen_utf8.c @@ -0,0 +1,25 @@ +#include +#include + +#ifdef _WIN32 +#undef fopen + +FILE* fopen_utf8(const char * filename, const char * mode) +{ +#if defined(_XBOX) + return fopen(filename, mode); +#elif defined(LEGACY_WIN32) + char * filename_local = utf8_to_local_string_alloc(path); + FILE* ret = fopen(filename_local, mode); + free(filename_local); + return ret; +#else + wchar_t * filename_w = utf8_to_utf16_string_alloc(filename); + wchar_t * mode_w = utf8_to_utf16_string_alloc(mode); + FILE* ret = _wfopen(filename_w, mode_w); + free(filename_w); + free(mode_w); + return ret; +#endif +} +#endif From cc2dd827b568a05f68bf6beeea2d90dff8bc5e75 Mon Sep 17 00:00:00 2001 From: Alcaro Date: Mon, 4 Dec 2017 16:46:59 +0100 Subject: [PATCH 77/85] Update Makefile.common --- Makefile.common | 1 + 1 file changed, 1 insertion(+) diff --git a/Makefile.common b/Makefile.common index 58158f33aa..14caf2e201 100644 --- a/Makefile.common +++ b/Makefile.common @@ -170,6 +170,7 @@ OBJ += frontend/frontend.o \ tasks/task_audio_mixer.o \ $(LIBRETRO_COMM_DIR)/encodings/encoding_utf.o \ $(LIBRETRO_COMM_DIR)/encodings/encoding_crc32.o \ + $(LIBRETRO_COMM_DIR)/compat/fopen_utf8.o \ $(LIBRETRO_COMM_DIR)/lists/file_list.o \ $(LIBRETRO_COMM_DIR)/lists/dir_list.o \ $(LIBRETRO_COMM_DIR)/file/retro_dirent.o \ From a6ef704369348a6cc57c35b847379d42d7e373ba Mon Sep 17 00:00:00 2001 From: Alcaro Date: Mon, 4 Dec 2017 16:47:27 +0100 Subject: [PATCH 78/85] Update config_file.c --- libretro-common/file/config_file.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/libretro-common/file/config_file.c b/libretro-common/file/config_file.c index 9e23012168..cf105bbc3a 100644 --- a/libretro-common/file/config_file.c +++ b/libretro-common/file/config_file.c @@ -38,6 +38,7 @@ #include #include #include +#include #include #include #include @@ -915,7 +916,7 @@ bool config_file_write(config_file_t *conf, const char *path) if (!string_is_empty(path)) { void* buf = NULL; - FILE *file = fopen(path, "wb"); + FILE *file = fopen_utf8(path, "wb"); if (!file) return false; From 486d5e77e3015e44c0df9334ca3b60b281ac7f25 Mon Sep 17 00:00:00 2001 From: Alcaro Date: Mon, 4 Dec 2017 16:48:17 +0100 Subject: [PATCH 79/85] Update verbosity.c --- verbosity.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/verbosity.c b/verbosity.c index 734dcaba39..a260f79949 100644 --- a/verbosity.c +++ b/verbosity.c @@ -35,6 +35,7 @@ #include #include +#include #ifdef HAVE_CONFIG_H #include "config.h" @@ -96,7 +97,7 @@ void retro_main_log_file_init(const char *path) if (path == NULL) return; - log_file_fp = fopen(path, "wb"); + log_file_fp = fopen_utf8(path, "wb"); log_file_initialized = true; /* TODO: this is only useful for a few platforms, find which and add ifdef */ From 6359aee509704c6488ef174d899b3d6233fafc9e Mon Sep 17 00:00:00 2001 From: Alcaro Date: Mon, 4 Dec 2017 17:03:53 +0100 Subject: [PATCH 80/85] Update fopen_utf8.c --- libretro-common/compat/fopen_utf8.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/libretro-common/compat/fopen_utf8.c b/libretro-common/compat/fopen_utf8.c index a17ad81542..843c449cc1 100644 --- a/libretro-common/compat/fopen_utf8.c +++ b/libretro-common/compat/fopen_utf8.c @@ -1,6 +1,12 @@ #include #include +#if defined(_MSC_VER) && _MSC_VER < 1400 || defined(_XBOX) +#ifndef LEGACY_WIN32 +#define LEGACY_WIN32 +#endif +#endif + #ifdef _WIN32 #undef fopen From 90dd2892b0449231f7d66eb33c85ec1ef8445b16 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francisco=20Jos=C3=A9=20Garc=C3=ADa=20Garc=C3=ADa?= Date: Mon, 4 Dec 2017 18:09:37 +0100 Subject: [PATCH 81/85] FIX sceIoOpen return error --- libretro-common/streams/file_stream.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libretro-common/streams/file_stream.c b/libretro-common/streams/file_stream.c index 9fdf995d8f..fd792bc40c 100644 --- a/libretro-common/streams/file_stream.c +++ b/libretro-common/streams/file_stream.c @@ -251,7 +251,7 @@ RFILE *filestream_open(const char *path, unsigned mode, ssize_t unused) #if defined(PSP) stream->fd = sceIoOpen(path, flags, mode_int); - if (stream->fd == -1) + if (stream->fd < 0) goto error; #else #if defined(HAVE_BUFFERED_IO) From 84691c7b9bb2c294b6cad03ca5096aa308238aa2 Mon Sep 17 00:00:00 2001 From: Alcaro Date: Mon, 4 Dec 2017 19:15:35 +0100 Subject: [PATCH 82/85] Update retro_miscellaneous.h --- libretro-common/include/retro_miscellaneous.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libretro-common/include/retro_miscellaneous.h b/libretro-common/include/retro_miscellaneous.h index bfa3fcb741..c2e11b021f 100644 --- a/libretro-common/include/retro_miscellaneous.h +++ b/libretro-common/include/retro_miscellaneous.h @@ -80,7 +80,7 @@ #define BIT128_SET(a, bit) ((a).data[(bit) >> 5] |= (1 << ((bit) & 31))) #define BIT128_CLEAR(a, bit) ((a).data[(bit) >> 5] &= ~(1 << ((bit) & 31))) #define BIT128_GET(a, bit) ((a).data[(bit) >> 5] & (1 << ((bit) & 31))) -#define BIT128_CLEAR_ALL(a) memset(&(a), 0, sizeof(a)); +#define BIT128_CLEAR_ALL(a) memset(&(a), 0, sizeof(a)) /* Helper macros and struct to keep track of many booleans. * To check for multiple bits, use &&, not &. From 908784b0ae3bc075382d9da41ac1d182bb3a79a1 Mon Sep 17 00:00:00 2001 From: Alcaro Date: Mon, 4 Dec 2017 20:19:35 +0100 Subject: [PATCH 83/85] Update griffin.c --- griffin/griffin.c | 1 + 1 file changed, 1 insertion(+) diff --git a/griffin/griffin.c b/griffin/griffin.c index 2bbb31a47b..8ac7762892 100644 --- a/griffin/griffin.c +++ b/griffin/griffin.c @@ -58,6 +58,7 @@ COMPATIBILITY #endif #include "../libretro-common/compat/compat_fnmatch.c" +#include "../libretro-common/compat/fopen_utf8.c" #include "../libretro-common/memmap/memalign.c" /*============================================================ From 2f1bcb64093e153561878fe33058e8db1033226f Mon Sep 17 00:00:00 2001 From: Alcaro Date: Mon, 4 Dec 2017 20:20:10 +0100 Subject: [PATCH 84/85] Update fopen_utf8.c --- libretro-common/compat/fopen_utf8.c | 1 + 1 file changed, 1 insertion(+) diff --git a/libretro-common/compat/fopen_utf8.c b/libretro-common/compat/fopen_utf8.c index 843c449cc1..1fd64187fb 100644 --- a/libretro-common/compat/fopen_utf8.c +++ b/libretro-common/compat/fopen_utf8.c @@ -1,5 +1,6 @@ #include #include +#include #if defined(_MSC_VER) && _MSC_VER < 1400 || defined(_XBOX) #ifndef LEGACY_WIN32 From 75c59aedcf6d45642bbd399aa7f348b96112123b Mon Sep 17 00:00:00 2001 From: Alcaro Date: Mon, 4 Dec 2017 20:23:45 +0100 Subject: [PATCH 85/85] Update fopen_utf8.h --- libretro-common/include/compat/fopen_utf8.h | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/libretro-common/include/compat/fopen_utf8.h b/libretro-common/include/compat/fopen_utf8.h index 583b558a26..67cc289aa6 100644 --- a/libretro-common/include/compat/fopen_utf8.h +++ b/libretro-common/include/compat/fopen_utf8.h @@ -1,9 +1,14 @@ +#ifndef __FOPEN_UTF8_H +#define __FOPEN_UTF8_H + #include + #ifdef _WIN32 -/* defined to error rather than fopen_utf8, to make clear to everyone reading the code that not worrying about utf16 is fine */ +/* defined to error rather than fopen_utf8, to make it clear to everyone reading the code that not worrying about utf16 is fine */ /* TODO: enable */ /* #define fopen (use fopen_utf8 instead) */ FILE* fopen_utf8(const char * filename, const char * mode); #else #define fopen_utf8 fopen #endif +#endif