diff --git a/CHANGES.md b/CHANGES.md index 6ba3083a84..5e9c075ff2 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,34 +1,55 @@ -# 1.6.8 (future) -- Test +# 1.6.9 (future) + +# 1.6.8 - Audio: Fix the Audio DSP picker +- CHEEVOS: Add support for Atari Lynx cheevos. +- CHEEVOS: Add support for RetroAchievements Leaderboards. - GUI: (MaterialUI) Fix crash that happened on context reset with Vulkan. - GUI: (MaterialUI) Skip querying and drawing items that are not visible; Cache content height and bbox calculation. +- GUI: (MaterialUI) Fix entry box highlight calculation. - GUI: (XMB) Skip drawing the fading list when it is already transparent. Optimization. - GUI: (XMB) Comment out visible item calculation in xmb_draw_items(). - GUI: (RGUI) Prevent crashes when using a non-English language reliant on UTF8. -- GUI: Add option for OSD background color. +- GUI: Add menu option for OSD background color. +- GUI: Add menu option for OSD text color. +- GUI: Add menu option to remove frame count from OSD. +- GUI: Allow wraparound of int/float settings when pressing the left key +- INPUT/LIBRETRO: Add support for more mouse buttons (buttons 4/5) +- INPUT/LIBRETRO: Add support for analog buttons - INPUT: Always show the controls menu even if descriptors are not set - INPUT: Fix input descriptors not being set on cores that don't implement the controllers interface - INPUT: Apply descriptors only for the amount of cores the core supports - INPUT: Implement keyboard to gamepad input remapping (limited to one gamepad device for now) - INPUT: Fix absolute mouse move handling on the winraw driver - INPUT: Ignore keyboard input if window is not active on udev driver +- INPUT: Sanitize the filenames of autoconfig profiles before saving - LOBBIES: Fix crash on navigating left / right from the lobby menu +- LOCALIZATION: Update Dutch translation - LOCALIZATION: Update Italian translation. - LOCALIZATION: Update Japanese translation. - LOCALIZATION: Update Portuguese-Brazilian translation. - LOCALIZATION: Update Russian translation. +- LINUX/ARMHF: Set buildbot updater URL to armhf location instead of blank string - LINUX/PI: Broadcom VC4: Add Videocore config option - LINUX/UDEV: Fix - RetroArch reads keyboard input when not focused with the udev input driver. - NETPLAY: Fix disconnection not fully deinitializing Netplay. +- NETPLAY: Fix lan rooms when there is more than one room +- NETPLAY: Fix lan rooms on systems where all addresses are treated as IPv6 - COMMON: Fix clear/free loop conditionals in playlists. - WINDOWS/GDI: Fix flickering of text. +- WINDOWS/GDI: Fix graphics corruption on Windows 98 +- WINDOWS/GDI: Allow compiling without DirectInput8 for NT support - WINDOWS/WGL: Try to use wglSwapLayerBuffers instead of SwapBuffers if possible (for more optimal performance). +- WINDOWS: Fix menubar text corruption on Japanese locale systems +- WINDOWS: Support Unicode file I/O (can now display CJK characters in file browser for example). +- WINDOWS: Support Windows 95, NT3.51, NT4 +- WINDOWS: add Makefile.griffin targets for msvc6,2003,2005,2010,2012,2013 - WII: Use custom, embedded libogc SDK. - WIIU: Initial touchscreen support for WiiU gamepad. - WIIU: Add Cheevos support. - SCANNER: Fix archive scanning. - SCANNER: Support CHD files. +- SCANNER: Support Gamecube ISO scanning. - SCANNER: Use primary data track of disc images for CRC lookups rather than cue files. This is slower but finds matches more reliably, and is necessary for CHD files to work at all. Update your databases! # 1.6.7 @@ -42,7 +63,7 @@ - GUI: Performance optimizations for XMB menu driver - only calculates visible items. - LOCALIZATION: Update Italian translation. -# 1.6.6 (future) +# 1.6.6 - 3DS: Fixes serious performance regression that affected every core; rewind was always implicitly enabled. - AUDIO: MOD/S3M/XM sound should now be properly mixed in with the core's sound. - GUI: Visual makeover of MaterialUI. @@ -54,7 +75,7 @@ - INPUT: Overlay controller response - when we press buttons on the gamepad or keyboard, the corresponding buttons on the overlay will be highlighted as well. - NETBSD: Silence some compilation warnings. - COMMON: Fixed bug 'Deleting an entry from a playlist would not update the list view inside XMB'. -- COMMON: Fix inet_ntop_compat on *nix +- COMMON: Fix inet_ntop_compat on Unix - LOBBY: Add skeleton to add help descriptions to lobbies # 1.6.5 diff --git a/Makefile b/Makefile index 058a923b19..caf65feb12 100644 --- a/Makefile +++ b/Makefile @@ -74,7 +74,7 @@ ifneq ($(findstring Win32,$(OS)),) LDFLAGS += -mwindows endif -CFLAGS += -Wall $(OPTIMIZE_FLAG) $(INCLUDE_DIRS) $(DEBUG_FLAG) -I. +CFLAGS += -Wall $(OPTIMIZE_FLAG) $(INCLUDE_DIRS) $(DEBUG_FLAG) -I. -Ideps -Ideps/stb APPEND_CFLAGS := $(CFLAGS) CXXFLAGS += $(APPEND_CFLAGS) -std=c++11 -D__STDC_CONSTANT_MACROS @@ -204,7 +204,7 @@ install: $(TARGET) 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/retroactive_marked/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 diff --git a/Makefile.common b/Makefile.common index 3ea1828a9c..95012320df 100644 --- a/Makefile.common +++ b/Makefile.common @@ -52,10 +52,6 @@ ifeq ($(HAVE_VITA2D), 1) DEFINES += -DHAVE_VITA2D endif -ifeq ($(HAVE_FBO), 1) - DEFINES += -DHAVE_FBO -endif - ifeq ($(HAVE_DYLIB), 1) DEFINES += -DHAVE_DYLIB endif @@ -1309,9 +1305,6 @@ ifeq ($(HAVE_FLAC),1) CFLAGS += -I$(DEPS_DIR)/libFLAC/include DEFINES += -DHAVE_FLAC -DHAVE_STDINT_H -DHAVE_LROUND -DFLAC__HAS_OGG=0 \ -DFLAC_PACKAGE_VERSION="\"retroarch\"" - ifneq ($(findstring Win32,$(OS)),) - DEFINES += -DHAVE_FSEEKO - endif FLACOBJ = $(DEPS_DIR)/libFLAC/bitmath.o \ $(DEPS_DIR)/libFLAC/bitreader.o \ $(DEPS_DIR)/libFLAC/cpu.o \ @@ -1327,6 +1320,12 @@ ifeq ($(HAVE_FLAC),1) $(DEPS_DIR)/libFLAC/md5.o \ $(DEPS_DIR)/libFLAC/memory.o \ $(DEPS_DIR)/libFLAC/stream_decoder.o + ifneq ($(findstring Win32,$(OS)),) + DEFINES += -DHAVE_FSEEKO + # make sure not to use this on legacy Windows versions that don't have W-functions implemented + DEFINES += -DNEED_UTF8_SUPPORT + FLACOBJ += $(DEPS_DIR)/libFLAC/windows_unicode_filenames.o + endif OBJ += $(FLACOBJ) endif diff --git a/Makefile.ctr b/Makefile.ctr index 34e658c347..308c5bf62f 100644 --- a/Makefile.ctr +++ b/Makefile.ctr @@ -142,7 +142,7 @@ ifeq ($(WHOLE_ARCHIVE_LINK), 1) WHOLE_END := -Wl,--no-whole-archive endif -CFLAGS += -I. -Ideps/libz -Ideps/7zip -Ilibretro-common/include +CFLAGS += -I. -Ideps -Ideps/libz -Ideps/7zip -Ideps/stb -Ilibretro-common/include CFLAGS += -DRARCH_INTERNAL -DRARCH_CONSOLE -DSINC_LOWEST_QUALITY CFLAGS += -DHAVE_FILTERS_BUILTIN $(DEFINES) diff --git a/Makefile.ctr.salamander b/Makefile.ctr.salamander index 98ce0ea170..b53a31ff43 100644 --- a/Makefile.ctr.salamander +++ b/Makefile.ctr.salamander @@ -74,7 +74,7 @@ else CFLAGS += -O3 endif -CFLAGS += -I. -Ideps/libz -Ideps/7zip -Ilibretro-common/include +CFLAGS += -I. -Ideps/libz -Ideps/7zip -Ideps/stb -Ilibretro-common/include #CFLAGS += -DRARCH_INTERNAL CFLAGS += -DRARCH_CONSOLE -DIS_SALAMANDER diff --git a/Makefile.emscripten b/Makefile.emscripten index 3b9bcf5775..fb3a215339 100644 --- a/Makefile.emscripten +++ b/Makefile.emscripten @@ -19,7 +19,6 @@ HAVE_RGUI = 1 HAVE_SDL = 0 HAVE_SDL2 = 1 HAVE_ZLIB = 1 -HAVE_FBO = 1 WANT_ZLIB = 1 MEMORY = 536870912 @@ -72,7 +71,7 @@ OBJ += libretro-common/audio/dsp_filters/phaser.o OBJ += libretro-common/audio/dsp_filters/reverb.o OBJ += libretro-common/audio/dsp_filters/wahwah.o -CFLAGS += -Ideps/libz/ +CFLAGS += -Ideps/libz -Ideps -Ideps/stb libretro = libretro_emscripten.bc ifneq ($(V), 1) diff --git a/Makefile.griffin b/Makefile.griffin index d4f9d6d5ea..fccba281b4 100644 --- a/Makefile.griffin +++ b/Makefile.griffin @@ -318,7 +318,6 @@ else ifeq ($(platform), windows_msvc6_x86) HAVE_STB_FONT := 1 HAVE_THREADS := 1 HAVE_LIBRETRODB := 1 - HAVE_FBO := 1 HAVE_COMMAND := 1 HAVE_STDIN_CMD := 1 HAVE_CMD := 1 @@ -342,7 +341,7 @@ else ifeq ($(platform), windows_msvc6_x86) INCLUDE := $(shell IFS=$$'\n'; cygpath -w "$(VCDIR)/Include") LIB := $(shell IFS=$$'\n'; cygpath -w "$(VCDIR)/Lib") - export INCLUDE := $(INCLUDE);$(INETSDK)\Include;libretro-common\include;libretro-common\include\compat\msvc + export INCLUDE := $(INCLUDE);$(INETSDK)\Include;libretro-common\include;libretro-common\include\compat\msvc;gfx\include;deps;deps\stb export LIB := $(LIB);$(INETSDK)\Lib else ifeq ($(platform), windows_msvc2003_x86) HAVE_RPNG := 1 @@ -360,7 +359,6 @@ else ifeq ($(platform), windows_msvc2003_x86) HAVE_STB_FONT := 1 HAVE_THREADS := 1 HAVE_LIBRETRODB := 1 - HAVE_FBO := 1 HAVE_COMMAND := 1 HAVE_STDIN_CMD := 1 HAVE_CMD := 1 @@ -385,10 +383,10 @@ else ifeq ($(platform), windows_msvc2003_x86) ifeq ($(HAVE_DIRECTX), 1) PLATCFLAGS += -DHAVE_DINPUT -DHAVE_DSOUND DXSDK_DIR := $(DXSDK_DIR:\=) - export INCLUDE := $(INCLUDE);$(INETSDK)\Include;$(DXSDK_DIR)\Include;libretro-common\include;libretro-common\include\compat\msvc + export INCLUDE := $(INCLUDE);$(INETSDK)\Include;$(DXSDK_DIR)\Include;libretro-common\include;libretro-common\include\compat\msvc;gfx\include;deps;deps\stb export LIB := $(LIB);$(INETSDK)\Lib;$(DXSDK_DIR)\Lib\x86 else - export INCLUDE := $(INCLUDE);$(INETSDK)\Include;libretro-common\include;libretro-common\include\compat\msvc + export INCLUDE := $(INCLUDE);$(INETSDK)\Include;libretro-common\include;libretro-common\include\compat\msvc;gfx\include;deps;deps\stb export LIB := $(LIB);$(INETSDK)\Lib endif else ifeq ($(platform), windows_msvc2005_x86) @@ -407,7 +405,6 @@ else ifeq ($(platform), windows_msvc2005_x86) HAVE_STB_FONT := 1 HAVE_THREADS := 1 HAVE_LIBRETRODB := 1 - HAVE_FBO := 1 HAVE_COMMAND := 1 HAVE_STDIN_CMD := 1 HAVE_CMD := 1 @@ -433,10 +430,10 @@ else ifeq ($(platform), windows_msvc2005_x86) ifeq ($(HAVE_DIRECTX), 1) PLATCFLAGS += -DHAVE_DINPUT -DHAVE_DSOUND DXSDK_DIR := $(DXSDK_DIR:\=) - export INCLUDE := $(INCLUDE);$(INETSDK)\Include;$(DXSDK_DIR)\Include;libretro-common\include;libretro-common\include\compat\msvc + export INCLUDE := $(INCLUDE);$(INETSDK)\Include;$(DXSDK_DIR)\Include;libretro-common\include;libretro-common\include\compat\msvc;gfx\include;deps;deps\stb export LIB := $(LIB);$(INETSDK)\Lib;$(DXSDK_DIR)\Lib\x86 else - export INCLUDE := $(INCLUDE);$(INETSDK)\Include;libretro-common\include;libretro-common\include\compat\msvc + export INCLUDE := $(INCLUDE);$(INETSDK)\Include;libretro-common\include;libretro-common\include\compat\msvc;gfx\include;deps;deps\stb export LIB := $(LIB);$(INETSDK)\Lib endif else ifneq (,$(findstring windows_msvc2010,$(platform))) @@ -455,7 +452,6 @@ else ifneq (,$(findstring windows_msvc2010,$(platform))) HAVE_STB_FONT := 1 HAVE_THREADS := 1 HAVE_LIBRETRODB := 1 - HAVE_FBO := 1 HAVE_COMMAND := 1 HAVE_STDIN_CMD := 1 HAVE_CMD := 1 @@ -504,10 +500,10 @@ else ifneq (,$(findstring windows_msvc2010,$(platform))) ifeq ($(HAVE_DIRECTX), 1) PLATCFLAGS += -DHAVE_DINPUT -DHAVE_DSOUND -DHAVE_D3D -DHAVE_D3D9 -DHAVE_XAUDIO -DHAVE_XINPUT DXSDK_DIR := $(DXSDK_DIR:\=) - export INCLUDE := $(INCLUDE);$(WindowsSdkDir)\Include;$(DXSDK_DIR)\Include;libretro-common\include;libretro-common\include\compat\msvc;gfx\include + export INCLUDE := $(INCLUDE);$(WindowsSdkDir)\Include;$(DXSDK_DIR)\Include;libretro-common\include;libretro-common\include\compat\msvc;gfx\include;deps;deps\stb export LIB := $(LIB);$(WindowsSdkDir)\$(PlatLib);$(DXSDK_DIR)\Lib\$(WinArch) else - export INCLUDE := $(INCLUDE);$(WindowsSdkDir)\Include;libretro-common\include;libretro-common\include\compat\msvc;gfx\include + export INCLUDE := $(INCLUDE);$(WindowsSdkDir)\Include;libretro-common\include;libretro-common\include\compat\msvc;gfx\include;deps;deps\stb export LIB := $(LIB);$(WindowsSdkDir)\$(PlatLib) endif else ifneq (,$(findstring windows_msvc2012,$(platform))) @@ -526,7 +522,6 @@ else ifneq (,$(findstring windows_msvc2012,$(platform))) HAVE_STB_FONT := 1 HAVE_THREADS := 1 HAVE_LIBRETRODB := 1 - HAVE_FBO := 1 HAVE_COMMAND := 1 HAVE_STDIN_CMD := 1 HAVE_CMD := 1 @@ -579,10 +574,10 @@ else ifneq (,$(findstring windows_msvc2012,$(platform))) ifeq ($(HAVE_DIRECTX), 1) PLATCFLAGS += -DHAVE_DINPUT -DHAVE_DSOUND -DHAVE_D3D -DHAVE_D3D9 -DHAVE_XAUDIO -DHAVE_XINPUT DXSDK_DIR := $(DXSDK_DIR:\=) - export INCLUDE := $(INCLUDE);$(WindowsSdkDir)\Include\um;$(WindowsSdkDir)\Include\shared;$(DXSDK_DIR)\Include;libretro-common\include;libretro-common\include\compat\msvc;gfx\include + export INCLUDE := $(INCLUDE);$(WindowsSdkDir)\Include\um;$(WindowsSdkDir)\Include\shared;$(DXSDK_DIR)\Include;libretro-common\include;libretro-common\include\compat\msvc;gfx\include;deps;deps\stb export LIB := $(LIB);$(WindowsSdkDir)\$(PlatLib);$(DXSDK_DIR)\Lib\$(WinArch) else - export INCLUDE := $(INCLUDE);$(WindowsSdkDir)\Include\um;$(WindowsSdkDir)\Include\shared;libretro-common\include;libretro-common\include\compat\msvc;gfx\include + export INCLUDE := $(INCLUDE);$(WindowsSdkDir)\Include\um;$(WindowsSdkDir)\Include\shared;libretro-common\include;libretro-common\include\compat\msvc;gfx\include;deps;deps\stb export LIB := $(LIB);$(WindowsSdkDir)\$(PlatLib) endif else ifneq (,$(findstring windows_msvc2013,$(platform))) @@ -601,7 +596,6 @@ else ifneq (,$(findstring windows_msvc2013,$(platform))) HAVE_STB_FONT := 1 HAVE_THREADS := 1 HAVE_LIBRETRODB := 1 - HAVE_FBO := 1 HAVE_COMMAND := 1 HAVE_STDIN_CMD := 1 HAVE_CMD := 1 @@ -654,10 +648,10 @@ else ifneq (,$(findstring windows_msvc2013,$(platform))) ifeq ($(HAVE_DIRECTX), 1) PLATCFLAGS += -DHAVE_DINPUT -DHAVE_DSOUND -DHAVE_D3D -DHAVE_D3D9 -DHAVE_XAUDIO -DHAVE_XINPUT DXSDK_DIR := $(DXSDK_DIR:\=) - export INCLUDE := $(INCLUDE);$(WindowsSdkDir)\Include\um;$(WindowsSdkDir)\Include\shared;$(DXSDK_DIR)\Include;libretro-common\include;libretro-common\include\compat\msvc;gfx\include + export INCLUDE := $(INCLUDE);$(WindowsSdkDir)\Include\um;$(WindowsSdkDir)\Include\shared;$(DXSDK_DIR)\Include;libretro-common\include;libretro-common\include\compat\msvc;gfx\include;deps;deps\stb export LIB := $(LIB);$(WindowsSdkDir)\$(PlatLib);$(DXSDK_DIR)\Lib\$(WinArch) else - export INCLUDE := $(INCLUDE);$(WindowsSdkDir)\Include\um;$(WindowsSdkDir)\Include\shared;libretro-common\include;libretro-common\include\compat\msvc;gfx\include + export INCLUDE := $(INCLUDE);$(WindowsSdkDir)\Include\um;$(WindowsSdkDir)\Include\shared;libretro-common\include;libretro-common\include\compat\msvc;gfx\include;deps;deps\stb export LIB := $(LIB);$(WindowsSdkDir)\$(PlatLib) endif endif @@ -666,7 +660,9 @@ ifneq (,$(findstring msvc,$(platform))) CFLAGS += -W2 $(MACHDEP) $(PLATCFLAGS) else CFLAGS += -Wall -std=gnu99 $(MACHDEP) $(PLATCFLAGS) $(INCLUDE) - INCLUDE += -I./libretro-common/include + INCLUDE += -I./libretro-common/include \ + -Ideps \ + -Ideps/stb endif OBJ = griffin/griffin.o $(PLATOBJS) @@ -810,10 +806,6 @@ ifeq ($(HAVE_GETOPT_LONG), 1) CFLAGS += -DHAVE_GETOPT_LONG=1 endif -ifeq ($(HAVE_FBO), 1) - CFLAGS += -DHAVE_FBO -endif - ifeq ($(HAVE_DYLIB), 1) CFLAGS += -DHAVE_DYLIB endif diff --git a/Makefile.ps3 b/Makefile.ps3 index 31d862d0d5..b23e55327a 100644 --- a/Makefile.ps3 +++ b/Makefile.ps3 @@ -33,7 +33,7 @@ EBOOT_PATH = pkg/ps3/USRDIR/EBOOT.BIN CORE_PATH = pkg/ps3/USRDIR/cores/CORE.SELF LDDIRS = -L. -L$(CELL_SDK)/target/ppu/lib/PSGL/RSX/ultra-opt -INCDIRS = -I. -Idefines -Ideps/libz -Ilibretro-common/include +INCDIRS = -I. -Idefines -Ideps/libz -Ilibretro-common/include -Ideps -Ideps/stb # system platform system_platform = unix @@ -101,7 +101,7 @@ PPU_LDLIBS = $(FONT_LIBS) $(GL_LIBS) $(WHOLE_START) -lretro_ps3 $(WHOLE_END) -l PPU_RANLIB = $(CELL_SDK)/host-win32/ppu/bin/ppu-lv2-ranlib.exe -DEFINES += -DHAVE_THREADS -DRARCH_CONSOLE -DHAVE_OPENGL -DHAVE_HEADSET -DHAVE_LANGEXTRA -DHAVE_OPENGLES -DHAVE_OPENGLES1 -DHAVE_PSGL -DHAVE_CG -DHAVE_CG_RUNTIME_COMPILER -DHAVE_FBO -DHAVE_SYSMODULES -DHAVE_SYSUTILS -DHAVE_RARCH_EXEC -DHAVE_RSOUND -DHAVE_ZLIB -DHAVE_RPNG -DHAVE_RJPEG -DHAVE_RBMP -DHAVE_RTGA -DHAVE_7Z -DWANT_ZLIB -DSINC_LOWER_QUALITY -D__CELLOS_LV2__ -DHAVE_NETWORKING=1 -DHAVE_SOCKET_LEGACY=1 -DHAVE_MOUSE -DHAVE_GRIFFIN=1 -DHAVE_MULTIMAN=1 -DPC_DEVELOPMENT_IP_ADDRESS=\"$(PC_DEVELOPMENT_IP_ADDRESS)\" -DPC_DEVELOPMENT_UDP_PORT=$(PC_DEVELOPMENT_UDP_PORT) -DHAVE_FILTERS_BUILTIN +DEFINES += -DHAVE_THREADS -DRARCH_CONSOLE -DHAVE_OPENGL -DHAVE_HEADSET -DHAVE_LANGEXTRA -DHAVE_OPENGLES -DHAVE_OPENGLES1 -DHAVE_PSGL -DHAVE_CG -DHAVE_CG_RUNTIME_COMPILER -DHAVE_SYSMODULES -DHAVE_SYSUTILS -DHAVE_RARCH_EXEC -DHAVE_RSOUND -DHAVE_ZLIB -DHAVE_RPNG -DHAVE_RJPEG -DHAVE_RBMP -DHAVE_RTGA -DHAVE_7Z -DWANT_ZLIB -DSINC_LOWER_QUALITY -D__CELLOS_LV2__ -DHAVE_NETWORKING=1 -DHAVE_SOCKET_LEGACY=1 -DHAVE_MOUSE -DHAVE_GRIFFIN=1 -DHAVE_MULTIMAN=1 -DPC_DEVELOPMENT_IP_ADDRESS=\"$(PC_DEVELOPMENT_IP_ADDRESS)\" -DPC_DEVELOPMENT_UDP_PORT=$(PC_DEVELOPMENT_UDP_PORT) -DHAVE_FILTERS_BUILTIN #DEFINES += -DHAVE_IMAGEVIEWER diff --git a/Makefile.ps3.cobra b/Makefile.ps3.cobra index 7b3ce395f9..d3f95fee52 100644 --- a/Makefile.ps3.cobra +++ b/Makefile.ps3.cobra @@ -31,7 +31,7 @@ EBOOT_PATH = pkg/ps3/USRDIR/EBOOT.BIN CORE_PATH = pkg/ps3/USRDIR/cores/CORE.SELF LDDIRS = -L. -L$(CELL_SDK)/target/ppu/lib/PSGL/RSX/ultra-opt -INCDIRS = -I. -Idefines +INCDIRS = -I. -Idefines -Ideps -Ideps/stb # system platform system_platform = unix @@ -99,7 +99,7 @@ PPU_LDLIBS = $(FONT_LIBS) $(GL_LIBS) $(WHOLE_START) -lretro_ps3 $(WHOLE_END) -l PPU_RANLIB = $(CELL_SDK)/host-win32/ppu/bin/ppu-lv2-ranlib.exe -DEFINES += -DHAVE_THREADS -DRARCH_CONSOLE -DHAVE_OPENGL -DHAVE_OVERLAY -DHAVE_HEADSET -DHAVE_OPENGLES -DHAVE_OPENGLES1 -DHAVE_PSGL -DHAVE_CG -DHAVE_CG_RUNTIME_COMPILER -DHAVE_FBO -DHAVE_SYSMODULES -DHAVE_SYSUTILS -DHAVE_RARCH_EXEC -DHAVE_RSOUND -DHAVE_ZLIB -DHAVE_RPNG -DWANT_ZLIB -DSINC_LOWER_QUALITY -D__CELLOS_LV2__ -DHAVE_NETWORKING=1 -DHAVE_SOCKET_LEGACY=1 -DHAVE_MOUSE -DHAVE_GRIFFIN=1 -DHAVE_MULTIMAN=0 -DPC_DEVELOPMENT_IP_ADDRESS=\"$(PC_DEVELOPMENT_IP_ADDRESS)\" -DPC_DEVELOPMENT_UDP_PORT=$(PC_DEVELOPMENT_UDP_PORT) -DHAVE_STB_VORBIS +DEFINES += -DHAVE_THREADS -DRARCH_CONSOLE -DHAVE_OPENGL -DHAVE_OVERLAY -DHAVE_HEADSET -DHAVE_OPENGLES -DHAVE_OPENGLES1 -DHAVE_PSGL -DHAVE_CG -DHAVE_CG_RUNTIME_COMPILER -DHAVE_SYSMODULES -DHAVE_SYSUTILS -DHAVE_RARCH_EXEC -DHAVE_RSOUND -DHAVE_ZLIB -DHAVE_RPNG -DWANT_ZLIB -DSINC_LOWER_QUALITY -D__CELLOS_LV2__ -DHAVE_NETWORKING=1 -DHAVE_SOCKET_LEGACY=1 -DHAVE_MOUSE -DHAVE_GRIFFIN=1 -DHAVE_MULTIMAN=0 -DPC_DEVELOPMENT_IP_ADDRESS=\"$(PC_DEVELOPMENT_IP_ADDRESS)\" -DPC_DEVELOPMENT_UDP_PORT=$(PC_DEVELOPMENT_UDP_PORT) -DHAVE_STB_VORBIS ifeq ($(DEBUG), 1) PPU_OPTIMIZE_LV := -O0 -g diff --git a/Makefile.psl1ght b/Makefile.psl1ght index f08a49317c..2676bac26d 100644 --- a/Makefile.psl1ght +++ b/Makefile.psl1ght @@ -17,7 +17,7 @@ ELF_TARGET := retroarch_psl1ght.elf EBOOT_PATH = pkg/ps3/USRDIR/EBOOT.BIN CORE_PATH = pkg/ps3/USRDIR/cores/CORE.SELF -INCLUDE := -I. -I$(PS3DEV)/ppu/include -Ideps/libz -Ips3/gcmgl/include/export -Ips3/include +INCLUDE := -I. -I$(PS3DEV)/ppu/include -Ideps/libz -Ips3/gcmgl/include/export -Ips3/include -Ideps -Ideps/stb LIBDIRS := -L$(PS3DEV)/ppu/lib -L$(PS3DEV)/portlibs/ppu/lib -L. MACHDEP := -D__CELLOS_LV2__ -D__PSL1GHT__ @@ -89,7 +89,7 @@ ifeq ($(HAVE_FILE_LOGGER), 1) CFLAGS += -DHAVE_FILE_LOGGER endif -SHARED_FLAGS := -DRARCH_CONSOLE -DHAVE_OPENGL -DHAVE_OVERLAY -DHAVE_HEADSET -DHAVE_OPENGLES -DHAVE_OPENGLES1 -DHAVE_PSGL -DHAVE_CG -DHAVE_CG_RUNTIME_COMPILER -DHAVE_GCMGL -DHAVE_FBO -DHAVE_SYSMODULES -DHAVE_SYSUTILS -DHAVE_RARCH_EXEC -DHAVE_MOUSE -DHAVE_ZLIB -DHAVE_RPNG -DWANT_ZLIB -DHAVE_GRIFFIN=1 -DHAVE_NETWORKING=1 -DHAVE_SOCKET_LEGACY=1 -DPC_DEVELOPMENT_IP_ADDRESS=\"$(PC_DEVELOPMENT_IP_ADDRESS)\" -DPC_DEVELOPMENT_UDP_PORT=$(PC_DEVELOPMENT_UDP_PORT) -Wno-char-subscripts -DHAVE_CC_RESAMPLER +SHARED_FLAGS := -DRARCH_CONSOLE -DHAVE_OPENGL -DHAVE_OVERLAY -DHAVE_HEADSET -DHAVE_OPENGLES -DHAVE_OPENGLES1 -DHAVE_PSGL -DHAVE_CG -DHAVE_CG_RUNTIME_COMPILER -DHAVE_GCMGL -DHAVE_SYSMODULES -DHAVE_SYSUTILS -DHAVE_RARCH_EXEC -DHAVE_MOUSE -DHAVE_ZLIB -DHAVE_RPNG -DWANT_ZLIB -DHAVE_GRIFFIN=1 -DHAVE_NETWORKING=1 -DHAVE_SOCKET_LEGACY=1 -DPC_DEVELOPMENT_IP_ADDRESS=\"$(PC_DEVELOPMENT_IP_ADDRESS)\" -DPC_DEVELOPMENT_UDP_PORT=$(PC_DEVELOPMENT_UDP_PORT) -Wno-char-subscripts -DHAVE_CC_RESAMPLER CFLAGS += -std=gnu99 $(SHARED_FLAGS) CXXFLAGS += $(SHARED_FLAGS) diff --git a/Makefile.psp1 b/Makefile.psp1 index 2127d3e3bb..a99c89e754 100644 --- a/Makefile.psp1 +++ b/Makefile.psp1 @@ -19,7 +19,7 @@ ifeq ($(WHOLE_ARCHIVE_LINK), 1) WHOLE_END := -Wl,--no-whole-archive endif -INCDIR = deps/libz deps/7zip libretro-common/include +INCDIR = deps deps/stb deps/libz deps/7zip libretro-common/include CFLAGS = $(OPTIMIZE_LV) -G0 -std=gnu99 -ffast-math ASFLAGS = $(CFLAGS) diff --git a/Makefile.vita b/Makefile.vita index 8e26452e33..3138442913 100644 --- a/Makefile.vita +++ b/Makefile.vita @@ -98,7 +98,7 @@ STRIP := $(PREFIX)strip NM := $(PREFIX)nm LD := $(CXX) -INCDIRS := -I. -Ideps/libz -Ideps/7zip -Ilibretro-common/include +INCDIRS := -I. -Ideps/libz -Ideps/7zip -Ilibretro-common/include -Ideps/stb LIBDIRS := -L. ARCHFLAGS := -march=armv7-a -mfpu=neon -mfloat-abi=hard -DVITA diff --git a/Makefile.wiiu b/Makefile.wiiu index bea5fbe164..b83d1caae7 100644 --- a/Makefile.wiiu +++ b/Makefile.wiiu @@ -5,6 +5,10 @@ DEBUG = 0 GRIFFIN_BUILD = 0 WHOLE_ARCHIVE_LINK = 0 +ifneq ($(V), 1) + Q := @ +endif + PC_DEVELOPMENT_IP_ADDRESS ?= PC_DEVELOPMENT_TCP_PORT ?= @@ -130,7 +134,7 @@ else endif -INCDIRS := -I. -Ideps/libz -Ideps/7zip -Ilibretro-common/include -Iwiiu -Iwiiu/include -I$(DEVKITPRO)/portlibs/ppc/include +INCDIRS := -I. -Ideps -Ideps/stb -Ideps/libz -Ideps/7zip -Ilibretro-common/include -Iwiiu -Iwiiu/include -I$(DEVKITPRO)/portlibs/ppc/include LIBDIRS := -L. -L$(DEVKITPRO)/portlibs/ppc/lib CFLAGS := -mwup -mcpu=750 -meabi -mhard-float @@ -202,41 +206,50 @@ all: $(TARGETS) %.o: %.cpp %.o: %.cpp %.depend - $(CXX) -c -o $@ $< $(CXXFLAGS) $(INCDIRS) $(DEPFLAGS) - $(POSTCOMPILE) + @$(if $(Q), echo CXX $<,) + $(Q)$(CXX) -c -o $@ $< $(CXXFLAGS) $(INCDIRS) $(DEPFLAGS) + $(Q)$(POSTCOMPILE) %.o: %.c %.o: %.c %.depend - $(CC) -c -o $@ $< $(CFLAGS) $(INCDIRS) $(DEPFLAGS) - $(POSTCOMPILE) + @$(if $(Q), echo CC $<,) + $(Q)$(CC) -c -o $@ $< $(CFLAGS) $(INCDIRS) $(DEPFLAGS) + $(Q)$(POSTCOMPILE) %.o: %.S %.o: %.S %.depend - $(CC) -c -o $@ $< $(ASFLAGS) $(INCDIRS) $(DEPFLAGS) - $(POSTCOMPILE) + @$(if $(Q), echo AS $<,) + $(Q)$(CC) -c -o $@ $< $(ASFLAGS) $(INCDIRS) $(DEPFLAGS) + $(Q)$(POSTCOMPILE) %.o: %.s %.o: %.s %.depend - $(CC) -c -o $@ $< $(ASFLAGS) $(INCDIRS) $(DEPFLAGS) - $(POSTCOMPILE) + @$(if $(Q), echo AS $<,) + $(Q)$(CC) -c -o $@ $< $(ASFLAGS) $(INCDIRS) $(DEPFLAGS) + $(Q)$(POSTCOMPILE) %.a: - $(AR) -rc $@ $^ + @$(if $(Q), echo AR $<,) + $(Q)$(AR) -rc $@ $^ %.depend: ; $(ELF2RPL): - $(MAKE) -C wiiu/wut/elf2rpl/ + @$(if $(Q), echo MAKE $@,) + $(Q)$(MAKE) -C wiiu/wut/elf2rpl/ $(TARGET).elf: $(OBJ) $(HBL_ELF_OBJ) libretro_wiiu.a wiiu/link_elf.ld - $(LD) $(OBJ) $(HBL_ELF_OBJ) $(LDFLAGS) $(HBL_ELF_LDFLAGS) $(LIBDIRS) $(LIBS) -o $@ + @$(if $(Q), echo LD $@,) + $(Q)$(LD) $(OBJ) $(HBL_ELF_OBJ) $(LDFLAGS) $(HBL_ELF_LDFLAGS) $(LIBDIRS) $(LIBS) -o $@ $(TARGET).rpx.elf: $(OBJ) $(RPX_OBJ) libretro_wiiu.a wiiu/link_elf.ld - $(LD) $(OBJ) $(RPX_OBJ) $(LDFLAGS) $(RPX_LDFLAGS) $(LIBDIRS) $(LIBS) -o $@ + @$(if $(Q), echo LD $@,) + $(Q)$(LD) $(OBJ) $(RPX_OBJ) $(LDFLAGS) $(RPX_LDFLAGS) $(LIBDIRS) $(LIBS) -o $@ $(TARGET).rpx: $(TARGET).rpx.elf $(ELF2RPL) - -$(ELF2RPL) $(TARGET).rpx.elf $@ + @$(if $(Q), echo ELF2RPL $@,) + $(Q)-$(ELF2RPL) $(TARGET).rpx.elf $@ clean: rm -f $(OBJ) $(RPX_OBJ) $(HBL_ELF_OBJ) $(TARGET).elf $(TARGET).rpx.elf $(TARGET).rpx diff --git a/Makefile.win b/Makefile.win index f3a1aaf466..26c3f7aa37 100644 --- a/Makefile.win +++ b/Makefile.win @@ -5,7 +5,6 @@ HAVE_XAUDIO = 1 HAVE_DSOUND = 1 HAVE_WASAPI = 1 HAVE_OPENGL = 1 -HAVE_FBO = 1 HAVE_DYLIB = 1 HAVE_D3D9 = 1 HAVE_NETWORKING = 1 @@ -122,8 +121,8 @@ else CXXFLAGS += -O3 -ffast-math endif -CFLAGS += -Wall -Wno-unused-result -Wno-unused-variable -I. -CXXFLAGS += -Wall -Wno-unused-result -Wno-unused-variable -I. -std=c++98 -D__STDC_CONSTANT_MACROS +CFLAGS += -Wall -Wno-unused-result -Wno-unused-variable -I. -Ideps +CXXFLAGS += -Wall -Wno-unused-result -Wno-unused-variable -I. -Ideps -std=c++98 -D__STDC_CONSTANT_MACROS ifeq ($(CXX_BUILD), 1) CFLAGS += -std=c++98 -xc++ -D__STDC_CONSTANT_MACROS else diff --git a/README.md b/README.md index 230bbb950a..c1f633fbd2 100644 --- a/README.md +++ b/README.md @@ -36,13 +36,16 @@ or visit our IRC channel: #retroarch @ irc.freenode.org. ## Documentation -See our [wiki](https://github.com/libretro/RetroArch/wiki). On Unix, man-pages are provided. +See our [Documentation Center](https://docs.libretro.com/). On Unix, man-pages are provided. More developer-centric stuff is found [here](https://github.com/libretro/libretro.github.com/wiki/Documentation-devs). ## Related projects - Cg/HLSL shaders: [common-shaders](https://github.com/libretro/common-shaders) + - slang shaders: [slang-shaders](https://github.com/libretro/slang-shaders) + - GLSL shaders: [glsl-shaders](https://github.com/libretro/glsl-shaders) - Helper scripts to build libretro implementations: [libretro-super](https://github.com/libretro/libretro-super) + - GitHub mirrors of projects, useful for generating diff files: [libretro-mirrors](https://github.com/libretro-mirrors/) ## Philosophy @@ -58,12 +61,19 @@ RetroArch also emphasizes on being easy to integrate into various launcher front ## Platforms -RetroArch has been ported to the following platforms outside PC: +RetroArch has been ported to the following platforms: + - Windows + - Linux + - FreeBSD + - NetBSD + - MacOS - PlayStation 3 + - PlayStation Portable + - Original Xbox - Xbox 360 (Libxenon/XeXDK) - - Xbox 1 - - Wii, Gamecube (Libogc) + - Wii, GameCube (Libogc) + - WiiU - Nintendo 3DS - Raspberry Pi - Android @@ -126,4 +136,4 @@ To configure joypads, use the built-in menu or the `retroarch-joyconfig` command ## Compiling and installing -Instructions for compiling and installing RetroArch can be found in the [Libretro/RetroArch Documentation Center](https://buildbot.libretro.com/docs). +Instructions for compiling and installing RetroArch can be found in the [Libretro/RetroArch Documentation Center](https://docs.libretro.com/). diff --git a/audio/drivers/wiiu_audio.c b/audio/drivers/wiiu_audio.c index e4dadd7362..437ee310bf 100644 --- a/audio/drivers/wiiu_audio.c +++ b/audio/drivers/wiiu_audio.c @@ -193,11 +193,11 @@ static bool ax_audio_start(void* data, bool is_shutdown) static ssize_t ax_audio_write(void* data, const void* buf, size_t size) { - int i; + uint32_t i; size_t countAvail = 0; ax_audio_t* ax = (ax_audio_t*)data; const uint16_t* src = buf; - int count = size >> 2; + size_t count = size >> 2; if(!size || (size & 0x3)) return 0; @@ -330,8 +330,8 @@ audio_driver_t audio_ax = ax_audio_free, ax_audio_use_float, "AX", - NULL, - NULL, -/* ax_audio_write_avail, */ -/* ax_audio_buffer_size */ + NULL, /* device_list_new */ + NULL, /* device_list_free */ + NULL, /* write_avail */ + NULL, /* buffer_size */ }; diff --git a/cheevos/cheevos.c b/cheevos/cheevos.c index 8fe4ddd6a7..d04aafaf16 100644 --- a/cheevos/cheevos.c +++ b/cheevos/cheevos.c @@ -99,27 +99,6 @@ #define CHEEVOS_EIGHT_MB ( 8 * 1024 * 1024) #define CHEEVOS_SIZE_LIMIT (64 * 1024 * 1024) -enum -{ - CHEEVOS_DIRTY_TITLE = 1 << 0, - CHEEVOS_DIRTY_DESC = 1 << 1, - CHEEVOS_DIRTY_POINTS = 1 << 2, - CHEEVOS_DIRTY_AUTHOR = 1 << 3, - CHEEVOS_DIRTY_ID = 1 << 4, - CHEEVOS_DIRTY_BADGE = 1 << 5, - CHEEVOS_DIRTY_CONDITIONS = 1 << 6, - CHEEVOS_DIRTY_VOTES = 1 << 7, - CHEEVOS_DIRTY_DESCRIPTION = 1 << 8, - - CHEEVOS_DIRTY_ALL = (1 << 9) - 1 -}; - -enum -{ - CHEEVOS_ACTIVE_SOFTCORE = 1 << 0, - CHEEVOS_ACTIVE_HARDCORE = 1 << 1 -}; - typedef struct { cheevos_cond_t *conds; @@ -208,18 +187,21 @@ typedef struct typedef struct { cheevos_var_t var; - int multiplier; + double multiplier; + bool compare_next; } cheevos_term_t; typedef struct { cheevos_term_t *terms; unsigned count; + unsigned compare_count; } cheevos_expr_t; typedef struct { unsigned id; + unsigned format; const char *title; const char *description; int active; @@ -231,6 +213,42 @@ typedef struct cheevos_expr_t value; } cheevos_leaderboard_t; +/* +typedef struct +{ + bool is_lookup; + char* prestring; + cheevos_expr_t expression; +} cheevos_rps_element_t; + +typedef struct +{ + char* name; + unsigned type; +} cheevos_rps_format_t; + +typedef struct +{ + unsigned compare; + char* result; +} cheevos_rps_lookup_value; + +typedef struct +{ + char* name; + cheevos_rps_lookup_value* values; +} cheevos_rps_lookup_t; + +typedef struct +{ + cheevos_rps_element_t* elements; + cheevos_rps_format_t* formats; + unsigned format_count; + cheevos_rps_lookup_t* lookups; + unsigned lookup_count; +} cheevos_rps_t; +*/ + typedef struct { int console_id; @@ -865,7 +883,9 @@ static int cheevos_parse_condition(cheevos_condition_t *condition, const char* m unsigned set = 0; cheevos_condset_t *condset = NULL; cheevos_condset_t *conds = NULL; - const cheevos_condset_t* end; + const cheevos_condset_t* end = NULL; + + (void)conds; condition->condsets = (cheevos_condset_t*) calloc(condition->count, sizeof(cheevos_condset_t)); @@ -895,9 +915,10 @@ static int cheevos_parse_condition(cheevos_condition_t *condition, const char* m { while (--condset >= condition->condsets) { - free((void*)condset->conds); + if ((void*)condset->conds) + free((void*)condset->conds); } - + return -1; } @@ -910,7 +931,6 @@ static int cheevos_parse_condition(cheevos_condition_t *condition, const char* m return 0; } -#ifdef CHEEVOS_ENABLE_LBOARDS static void cheevos_free_condition(cheevos_condition_t* condition) { unsigned i; @@ -918,54 +938,107 @@ static void cheevos_free_condition(cheevos_condition_t* condition) if (condition->condsets) { for (i = 0; i < condition->count; i++) - free((void*)condition->condsets[i].conds); + { + if (condition->condsets[i].conds) + { + free(condition->condsets[i].conds); + condition->condsets[i].conds = NULL; + } + } - free((void*)condition->condsets); + if (condition->condsets) + { + free(condition->condsets); + condition->condsets = NULL; + } } } -#endif /***************************************************************************** Parse the Mem field of leaderboards. *****************************************************************************/ -#ifdef CHEEVOS_ENABLE_LBOARDS static int cheevos_parse_expression(cheevos_expr_t *expr, const char* mem) { const char* aux; char* end; unsigned i; expr->count = 1; + expr->compare_count = 1; for (aux = mem; *aux != '"'; aux++) - { expr->count += *aux == '_'; - } expr->terms = (cheevos_term_t*)calloc(expr->count, sizeof(cheevos_term_t)); if (!expr->terms) return -1; - for (i = 0, aux = mem; i < expr->count; i++) + for (i = 0; i < expr->count; i++) + { + expr->terms[i].compare_next = false; + expr->terms[i].multiplier = 1; + } + + for (i = 0, aux = mem; i < expr->count;) { cheevos_var_parse(&expr->terms[i].var, &aux); if (*aux != '*') { - free((void*)expr->terms); - return -1; + /* expression has no multiplier */ + if (*aux == '_') + { + aux++; + i++; + } + else if (*aux == '$') + { + expr->terms[i].compare_next = true; + expr->compare_count++; + aux++; + i++; + } + + /* no multiplier at end of string */ + else if (*aux == '\0' || *aux == '"' || *aux == ',') + return 0; + + /* invalid character in expression */ + else + { + if (expr->terms) + { + free(expr->terms); + expr->terms = NULL; + } + return -1; + } } + else + { + if(aux[1] == 'h' || aux[1] == 'H') + expr->terms[i].multiplier = (double)strtol(aux + 2, &end, 16); + else + expr->terms[i].multiplier = strtod(aux + 1, &end); + aux = end; - expr->terms[i].multiplier = (int)strtol(aux + 1, &end, 10); - aux = end + 1; + if(*aux == '$') + { + aux++; + expr->terms[i].compare_next = true; + expr->compare_count++; + } + else + expr->terms[i].compare_next = false; + + aux++; + i++; + } } - return 0; } -#endif -#ifdef CHEEVOS_ENABLE_LBOARDS static int cheevos_parse_mem(cheevos_leaderboard_t *lb, const char* mem) { lb->start.condsets = NULL; @@ -1014,10 +1087,13 @@ error: cheevos_free_condition(&lb->start); cheevos_free_condition(&lb->cancel); cheevos_free_condition(&lb->submit); - free((void*)lb->value.terms); + if (lb->value.terms) + { + free((void*)lb->value.terms); + lb->value.terms = NULL; + } return -1; } -#endif /***************************************************************************** Load achievements from a JSON string. @@ -1073,19 +1149,104 @@ static int cheevos_new_cheevo(cheevos_readud_t *ud) return 0; error: - free((void*)cheevo->title); - free((void*)cheevo->description); - free((void*)cheevo->author); - free((void*)cheevo->badge); + if (cheevo->title) + { + free((void*)cheevo->title); + cheevo->title = NULL; + } + if (cheevo->description) + { + free((void*)cheevo->description); + cheevo->description = NULL; + } + if (cheevo->author) + { + free((void*)cheevo->author); + cheevo->author = NULL; + } + if (cheevo->badge) + { + free((void*)cheevo->badge); + cheevo->badge = NULL; + } return -1; } -#ifdef CHEEVOS_ENABLE_LBOARDS +/***************************************************************************** +Helper functions for displaying leaderboard values. +*****************************************************************************/ + +static void cheevos_format_value(const unsigned value, const unsigned type, + char* formatted_value, size_t formatted_size) +{ + unsigned mins, secs, millis; + + switch(type) + { + case CHEEVOS_FORMAT_VALUE: + snprintf(formatted_value, formatted_size, "%u", value); + break; + + case CHEEVOS_FORMAT_SCORE: + snprintf(formatted_value, formatted_size, "%06upts", value); + break; + + case CHEEVOS_FORMAT_FRAMES: + mins = value / 3600; + secs = (value % 3600) / 60; + millis = (int) (value % 60) * (10.00 / 6.00); + snprintf(formatted_value, formatted_size, "%02u:%02u.%02u", mins, secs, millis); + break; + + case CHEEVOS_FORMAT_MILLIS: + mins = value / 6000; + secs = (value % 6000) / 100; + millis = (int) (value % 100); + snprintf(formatted_value, formatted_size, "%02u:%02u.%02u", mins, secs, millis); + break; + + case CHEEVOS_FORMAT_SECS: + mins = value / 60; + secs = value % 60; + snprintf(formatted_value, formatted_size, "%02u:%02u", mins, secs); + break; + + default: + snprintf(formatted_value, formatted_size, "%u (?)", value); + } +} + +unsigned cheevos_parse_format(cheevos_field_t* format) +{ + /* Most likely */ + if (strncmp(format->string, "VALUE", format->length) == 0) + return CHEEVOS_FORMAT_VALUE; + else if (strncmp(format->string, "TIME", format->length) == 0) + return CHEEVOS_FORMAT_FRAMES; + else if (strncmp(format->string, "SCORE", format->length) == 0) + return CHEEVOS_FORMAT_SCORE; + + /* Less likely */ + else if (strncmp(format->string, "MILLISECS", format->length) == 0) + return CHEEVOS_FORMAT_MILLIS; + else if (strncmp(format->string, "TIMESECS", format->length) == 0) + return CHEEVOS_FORMAT_SECS; + + /* Rare (RPS only) */ + else if (strncmp(format->string, "POINTS", format->length) == 0) + return CHEEVOS_FORMAT_SCORE; + else if (strncmp(format->string, "FRAMES", format->length) == 0) + return CHEEVOS_FORMAT_FRAMES; + else + return CHEEVOS_FORMAT_OTHER; +} + static int cheevos_new_lboard(cheevos_readud_t *ud) { cheevos_leaderboard_t *lboard = cheevos_locals.leaderboards + ud->lboard_count++; lboard->id = strtol(ud->id.string, NULL, 10); + lboard->format = cheevos_parse_format(&ud->format); lboard->title = cheevos_dupstr(&ud->title); lboard->description = cheevos_dupstr(&ud->desc); @@ -1102,11 +1263,12 @@ static int cheevos_new_lboard(cheevos_readud_t *ud) return 0; error: - free((void*)lboard->title); - free((void*)lboard->description); + if ((void*)lboard->title) + free((void*)lboard->title); + if ((void*)lboard->description) + free((void*)lboard->description); return -1; } -#endif static int cheevos_read__json_key( void *userdata, const char *name, size_t length) @@ -1222,10 +1384,8 @@ static int cheevos_read__json_end_object(void *userdata) if (ud->in_cheevos) return cheevos_new_cheevo(ud); -#ifdef CHEEVOS_ENABLE_LBOARDS else if (ud->in_lboards) return cheevos_new_lboard(ud); -#endif return 0; } @@ -1282,9 +1442,12 @@ static int cheevos_parse(const char *json) if ( !cheevos_locals.core.cheevos || !cheevos_locals.unofficial.cheevos || !cheevos_locals.leaderboards) { - free((void*)cheevos_locals.core.cheevos); - free((void*)cheevos_locals.unofficial.cheevos); - free((void*)cheevos_locals.leaderboards); + if ((void*)cheevos_locals.core.cheevos) + free((void*)cheevos_locals.core.cheevos); + if ((void*)cheevos_locals.unofficial.cheevos) + free((void*)cheevos_locals.unofficial.cheevos); + if ((void*)cheevos_locals.leaderboards) + free((void*)cheevos_locals.leaderboards); cheevos_locals.core.count = cheevos_locals.unofficial.count = cheevos_locals.lboard_count = 0; @@ -1630,8 +1793,11 @@ static void cheevos_test_cheevo_set(const cheevoset_t *set) RARCH_LOG("[CHEEVOS]: awarding cheevo %u: %s (%s).\n", cheevo->id, cheevo->title, cheevo->description); - runloop_msg_queue_push(cheevo->title, 0, 3 * 60, false); - runloop_msg_queue_push(cheevo->description, 0, 5 * 60, false); + char msg[256]; + snprintf(msg, sizeof(msg), "Achievement Unlocked: %s", cheevo->title); + msg[sizeof(msg) - 1] = 0; + runloop_msg_queue_push(msg, 0, 2 * 60, false); + runloop_msg_queue_push(cheevo->description, 0, 3 * 60, false); cheevos_make_unlock_url(cheevo, url, sizeof(url)); task_push_http_transfer(url, true, NULL, cheevos_unlocked, cheevo); @@ -1642,7 +1808,6 @@ static void cheevos_test_cheevo_set(const cheevoset_t *set) } } -#ifdef CHEEVOS_ENABLE_LBOARDS static int cheevos_test_lboard_condition(const cheevos_condition_t* condition) { int dirty_conds = 0; @@ -1677,14 +1842,28 @@ static int cheevos_expr_value(cheevos_expr_t* expr) { cheevos_term_t* term = expr->terms; unsigned i; - int value = 0; + + /* Separate possible values with '$' operator, submit the largest */ + unsigned current_value = 0; + int values[expr->compare_count]; + memset(values, 0, sizeof values); for (i = expr->count; i != 0; i--, term++) { - value += cheevos_var_get_value(&term->var) * term->multiplier; + values[current_value] += cheevos_var_get_value(&term->var) * term->multiplier; + if (term->compare_next) + current_value++; } - return value; + if (expr->compare_count > 1) + { + int maximum = values[0]; + for (unsigned j = 1; j < expr->compare_count; j++) + maximum = values[j] > maximum ? values[j] : maximum; + + return maximum; + } + else return values[0]; } static void cheevos_make_lboard_url(const cheevos_leaderboard_t *lboard, @@ -1697,7 +1876,7 @@ static void cheevos_make_lboard_url(const cheevos_leaderboard_t *lboard, hash[0] = '\0'; - snprintf(signature, sizeof(signature), "%u%s%u", lboard->id, + snprintf(signature, sizeof(signature), "%u%s%u", lboard->id, settings->arrays.cheevos_username, lboard->id); @@ -1725,9 +1904,7 @@ static void cheevos_make_lboard_url(const cheevos_leaderboard_t *lboard, cheevos_log_url("[CHEEVOS]: url to submit the leaderboard: %s\n", url); #endif } -#endif -#ifdef CHEEVOS_ENABLE_LBOARDS static void cheevos_lboard_submit(void *task_data, void *user_data, const char *error) { cheevos_leaderboard_t *lboard = (cheevos_leaderboard_t *)user_data; @@ -1750,9 +1927,7 @@ static void cheevos_lboard_submit(void *task_data, void *user_data, const char * } #endif } -#endif -#ifdef CHEEVOS_ENABLE_LBOARDS static void cheevos_test_leaderboards(void) { cheevos_leaderboard_t* lboard = cheevos_locals.leaderboards; @@ -1774,18 +1949,35 @@ static void cheevos_test_leaderboards(void) if (cheevos_test_lboard_condition(&lboard->submit)) { - char url[256]; + lboard->active = 0; - cheevos_make_lboard_url(lboard, url, sizeof(url)); - task_push_http_transfer(url, true, NULL, cheevos_lboard_submit, lboard); + /* failsafe for improper LBs */ + if (value == 0) + { + RARCH_LOG("[CHEEVOS]: error: lboard %s tried to submit 0\n", lboard->title); + runloop_msg_queue_push("Leaderboard attempt cancelled!", 0, 2 * 60, false); + } + else + { + char url[256]; + cheevos_make_lboard_url(lboard, url, sizeof(url)); + task_push_http_transfer(url, true, NULL, cheevos_lboard_submit, lboard); + RARCH_LOG("[CHEEVOS]: submit lboard %s\n", lboard->title); - RARCH_LOG("[CHEEVOS]: submit lboard %s\n", lboard->title); + char msg[256]; + char formatted_value[16]; + cheevos_format_value(value, lboard->format, formatted_value, sizeof(formatted_value)); + snprintf(msg, sizeof(msg), "Submitted %s for %s", formatted_value, lboard->title); + msg[sizeof(msg) - 1] = 0; + runloop_msg_queue_push(msg, 0, 2 * 60, false); + } } if (cheevos_test_lboard_condition(&lboard->cancel)) { RARCH_LOG("[CHEEVOS]: cancel lboard %s\n", lboard->title); lboard->active = 0; + runloop_msg_queue_push("Leaderboard attempt cancelled!", 0, 2 * 60, false); } } else @@ -1795,11 +1987,16 @@ static void cheevos_test_leaderboards(void) RARCH_LOG("[CHEEVOS]: start lboard %s\n", lboard->title); lboard->active = 1; lboard->last_value = -1; + + char msg[256]; + snprintf(msg, sizeof(msg), "Leaderboard Active: %s", lboard->title); + msg[sizeof(msg) - 1] = 0; + runloop_msg_queue_push(msg, 0, 2 * 60, false); + runloop_msg_queue_push(lboard->description, 0, 3*60, false); } } } } -#endif /***************************************************************************** Free the loaded achievements. @@ -1807,15 +2004,20 @@ Free the loaded achievements. static void cheevos_free_condset(const cheevos_condset_t *set) { - free((void*)set->conds); + if (set->conds) + free((void*)set->conds); } static void cheevos_free_cheevo(const cheevo_t *cheevo) { - free((void*)cheevo->title); - free((void*)cheevo->description); - free((void*)cheevo->author); - free((void*)cheevo->badge); + if (cheevo->title) + free((void*)cheevo->title); + if (cheevo->description) + free((void*)cheevo->description); + if (cheevo->author) + free((void*)cheevo->author); + if (cheevo->badge) + free((void*)cheevo->badge); cheevos_free_condset(cheevo->condition.condsets); } @@ -1827,7 +2029,8 @@ static void cheevos_free_cheevo_set(const cheevoset_t *set) while (cheevo < end) cheevos_free_cheevo(cheevo++); - free((void*)set->cheevos); + if (set->cheevos) + free((void*)set->cheevos); } #ifndef CHEEVOS_DONT_DEACTIVATE @@ -2128,7 +2331,7 @@ static void cheevos_patch_addresses(cheevoset_t* set) case CHEEVOS_VAR_TYPE_DELTA_MEM: cheevos_var_patch_addr(&cond->source, cheevos_locals.console_id); #ifdef CHEEVOS_DUMP_ADDRS - RARCH_LOG("[CHEEVOS]: var %03d:%08X\n", cond->source.bank_id + 1, cond->source.value); + RARCH_LOG("[CHEEVOS]: s-var %03d:%08X\n", cond->source.bank_id + 1, cond->source.value); #endif break; @@ -2142,7 +2345,7 @@ static void cheevos_patch_addresses(cheevoset_t* set) case CHEEVOS_VAR_TYPE_DELTA_MEM: cheevos_var_patch_addr(&cond->target, cheevos_locals.console_id); #ifdef CHEEVOS_DUMP_ADDRS - RARCH_LOG("[CHEEVOS]: var %03d:%08X\n", cond->target.bank_id + 1, cond->target.value); + RARCH_LOG("[CHEEVOS]: t-var %03d:%08X\n", cond->target.bank_id + 1, cond->target.value); #endif break; @@ -2154,6 +2357,85 @@ static void cheevos_patch_addresses(cheevoset_t* set) } } +static void cheevos_patch_lb_conditions(cheevos_condition_t* condition) +{ + unsigned i, j; + cheevos_condset_t* condset = condition->condsets; + + for (i = condition->count; i != 0; i--, condset++) + { + cheevos_cond_t* cond = condset->conds; + + for (j = condset->count; j != 0; j--, cond++) + { + switch (cond->source.type) + { + case CHEEVOS_VAR_TYPE_ADDRESS: + case CHEEVOS_VAR_TYPE_DELTA_MEM: + cheevos_var_patch_addr(&cond->source, cheevos_locals.console_id); +#ifdef CHEEVOS_DUMP_ADDRS + RARCH_LOG("[CHEEVOS]: s-var %03d:%08X\n", cond->source.bank_id + 1, cond->source.value); +#endif + break; + default: + break; + } + switch (cond->target.type) + { + case CHEEVOS_VAR_TYPE_ADDRESS: + case CHEEVOS_VAR_TYPE_DELTA_MEM: + cheevos_var_patch_addr(&cond->target, cheevos_locals.console_id); +#ifdef CHEEVOS_DUMP_ADDRS + RARCH_LOG("[CHEEVOS]: t-var %03d:%08X\n", cond->target.bank_id + 1, cond->target.value); +#endif + break; + default: + break; + } + } + } +} + +static void cheevos_patch_lb_expressions(cheevos_expr_t* expression) +{ + unsigned i; + cheevos_term_t* term = expression->terms; + + for (i = expression->count; i != 0; i--, term++) + { + switch (term->var.type) + { + case CHEEVOS_VAR_TYPE_ADDRESS: + case CHEEVOS_VAR_TYPE_DELTA_MEM: + cheevos_var_patch_addr(&term->var, cheevos_locals.console_id); +#ifdef CHEEVOS_DUMP_ADDRS + RARCH_LOG("[CHEEVOS]: s-var %03d:%08X\n", term->var.bank_id + 1, term->var.value); +#endif + break; + default: + break; + } + } +} + +static void cheevos_patch_lbs(cheevos_leaderboard_t *leaderboard) +{ + unsigned i; + + for(i = 0; i < cheevos_locals.lboard_count; i++) + { + cheevos_condition_t* start = &leaderboard[i].start; + cheevos_condition_t* cancel = &leaderboard[i].cancel; + cheevos_condition_t* submit = &leaderboard[i].submit; + cheevos_expr_t* value = &leaderboard[i].value; + + cheevos_patch_lb_conditions(start); + cheevos_patch_lb_conditions(cancel); + cheevos_patch_lb_conditions(submit); + cheevos_patch_lb_expressions(value); + } +} + void cheevos_test(void) { settings_t *settings = config_get_ptr(); @@ -2162,6 +2444,7 @@ void cheevos_test(void) { cheevos_patch_addresses(&cheevos_locals.core); cheevos_patch_addresses(&cheevos_locals.unofficial); + cheevos_patch_lbs(cheevos_locals.leaderboards); cheevos_locals.addrs_patched = true; } @@ -2171,9 +2454,8 @@ void cheevos_test(void) if (settings->bools.cheevos_test_unofficial) cheevos_test_cheevo_set(&cheevos_locals.unofficial); -#ifdef CHEEVOS_ENABLE_LBOARDS - cheevos_test_leaderboards(); -#endif + if (settings->bools.cheevos_hardcore_mode_enable && settings->bools.cheevos_leaderboards_enable) + cheevos_test_leaderboards(); } bool cheevos_set_cheats(void) @@ -2369,7 +2651,7 @@ static int cheevos_iterate(coro_t* coro) /* Load the content into memory, or copy it over to our own buffer */ if (!CHEEVOS_VAR_DATA) { - CHEEVOS_VAR_STREAM = filestream_open(CHEEVOS_VAR_PATH, RFILE_MODE_READ, 0); + CHEEVOS_VAR_STREAM = filestream_open(CHEEVOS_VAR_PATH, RFILE_MODE_READ, -1); if (!CHEEVOS_VAR_STREAM) CORO_STOP(); @@ -2521,11 +2803,13 @@ static int cheevos_iterate(coro_t* coro) #endif if (cheevos_parse(CHEEVOS_VAR_JSON)) { - free((void*)CHEEVOS_VAR_JSON); + if ((void*)CHEEVOS_VAR_JSON) + free((void*)CHEEVOS_VAR_JSON); CORO_STOP(); } - free((void*)CHEEVOS_VAR_JSON); + if ((void*)CHEEVOS_VAR_JSON) + free((void*)CHEEVOS_VAR_JSON); cheevos_loaded = true; /* @@ -2633,7 +2917,7 @@ static int cheevos_iterate(coro_t* coro) * Output CHEEVOS_VAR_GAMEID the Retro Achievements game ID, or 0 if not found *************************************************************************/ CORO_SUB(LYNX_MD5) - + if (CHEEVOS_VAR_LEN < 0x0240) { CHEEVOS_VAR_GAMEID = 0; @@ -2816,12 +3100,14 @@ static int cheevos_iterate(coro_t* coro) if (cheevos_get_value(CHEEVOS_VAR_JSON, CHEEVOS_JSON_KEY_GAMEID, gameid, sizeof(gameid))) { - free((void*)CHEEVOS_VAR_JSON); + if ((void*)CHEEVOS_VAR_JSON) + free((void*)CHEEVOS_VAR_JSON); RARCH_ERR("[CHEEVOS]: error getting game_id.\n"); CORO_RET(); } - free((void*)CHEEVOS_VAR_JSON); + if ((void*)CHEEVOS_VAR_JSON) + free((void*)CHEEVOS_VAR_JSON); RARCH_LOG("[CHEEVOS]: got game id %s.\n", gameid); CHEEVOS_VAR_GAMEID = strtol(gameid, NULL, 10); CORO_RET(); @@ -2903,7 +3189,8 @@ static int cheevos_iterate(coro_t* coro) if (CHEEVOS_VAR_JSON) { int res = cheevos_get_value(CHEEVOS_VAR_JSON, CHEEVOS_JSON_KEY_TOKEN, cheevos_locals.token, sizeof(cheevos_locals.token)); - free((void*)CHEEVOS_VAR_JSON); + if ((void*)CHEEVOS_VAR_JSON) + free((void*)CHEEVOS_VAR_JSON); if (!res) { @@ -2952,7 +3239,7 @@ static int cheevos_iterate(coro_t* coro) { if (CHEEVOS_VAR_K != 0) RARCH_LOG("[CHEEVOS]: Retrying HTTP request: %u of 5\n", CHEEVOS_VAR_K + 1); - + CHEEVOS_VAR_JSON = NULL; CHEEVOS_VAR_CONN = net_http_connection_new(CHEEVOS_VAR_URL, "GET", NULL); @@ -3045,8 +3332,9 @@ static int cheevos_iterate(coro_t* coro) RARCH_LOG("[CHEEVOS]: deactivated unlocked achievements in softcore mode.\n"); else RARCH_ERR("[CHEEVOS]: error deactivating unlocked achievements in softcore mode.\n"); - - free((void*)CHEEVOS_VAR_JSON); + + if ((void*)CHEEVOS_VAR_JSON) + free((void*)CHEEVOS_VAR_JSON); } else RARCH_ERR("[CHEEVOS]: error retrieving list of unlocked achievements in softcore mode.\n"); @@ -3073,8 +3361,9 @@ static int cheevos_iterate(coro_t* coro) RARCH_LOG("[CHEEVOS]: deactivated unlocked achievements in hardcore mode.\n"); else RARCH_ERR("[CHEEVOS]: error deactivating unlocked achievements in hardcore mode.\n"); - - free((void*)CHEEVOS_VAR_JSON); + + if ((void*)CHEEVOS_VAR_JSON) + free((void*)CHEEVOS_VAR_JSON); } else RARCH_ERR("[CHEEVOS]: error retrieving list of unlocked achievements in hardcore mode.\n"); @@ -3107,7 +3396,8 @@ static int cheevos_iterate(coro_t* coro) if (CHEEVOS_VAR_JSON) { RARCH_LOG("[CHEEVOS]: posted playing activity.\n"); - free((void*)CHEEVOS_VAR_JSON); + if ((void*)CHEEVOS_VAR_JSON) + free((void*)CHEEVOS_VAR_JSON); } else RARCH_ERR("[CHEEVOS]: error posting playing activity.\n"); @@ -3122,11 +3412,16 @@ static void cheevos_task_handler(retro_task_t *task) { coro_t *coro = (coro_t*)task->state; + if (!coro) + return; + if (!cheevos_iterate(coro)) { task_set_finished(task, true); - free(CHEEVOS_VAR_DATA); - free((void*)CHEEVOS_VAR_PATH); + if (CHEEVOS_VAR_DATA) + free(CHEEVOS_VAR_DATA); + if ((void*)CHEEVOS_VAR_PATH) + free((void*)CHEEVOS_VAR_PATH); free((void*)coro); } } @@ -3134,8 +3429,8 @@ static void cheevos_task_handler(retro_task_t *task) bool cheevos_load(const void *data) { retro_task_t *task; - coro_t *coro; - const struct retro_game_info *info; + const struct retro_game_info *info = NULL; + coro_t *coro = NULL; cheevos_loaded = 0; @@ -3151,7 +3446,8 @@ bool cheevos_load(const void *data) if (!task) { - free((void*)coro); + if ((void*)coro) + free((void*)coro); return false; } @@ -3170,8 +3466,10 @@ bool cheevos_load(const void *data) if (!CHEEVOS_VAR_DATA) { - free((void*)task); - free((void*)coro); + if ((void*)task) + free((void*)task); + if ((void*)coro) + free((void*)coro); return false; } diff --git a/cheevos/cheevos.h b/cheevos/cheevos.h index 359d8a541b..dedc017ec3 100644 --- a/cheevos/cheevos.h +++ b/cheevos/cheevos.h @@ -60,10 +60,59 @@ typedef enum CHEEVOS_CONSOLE_SEGA_CD = 9, CHEEVOS_CONSOLE_SEGA_32X = 10, CHEEVOS_CONSOLE_MASTER_SYSTEM = 11, - CHEEVOS_CONSOLE_XBOX_360 = 12, - CHEEVOS_CONSOLE_ATARI_LYNX = 13 + CHEEVOS_CONSOLE_PLAYSTATION = 12, + CHEEVOS_CONSOLE_ATARI_LYNX = 13, + CHEEVOS_CONSOLE_NEOGEO = 14, + CHEEVOS_CONSOLE_XBOX_360 = 15, + CHEEVOS_CONSOLE_GAMECUBE = 16, + CHEEVOS_CONSOLE_ATARI_JAGUAR = 17, + CHEEVOS_CONSOLE_NINTENDO_DS = 18, + CHEEVOS_CONSOLE_WII = 19, + CHEEVOS_CONSOLE_WII_U = 20, + CHEEVOS_CONSOLE_PLAYSTATION_2 = 21, + CHEEVOS_CONSOLE_XBOX = 22, + CHEEVOS_CONSOLE_SKYNET = 23, + CHEEVOS_CONSOLE_XBOX_ONE = 24, + CHEEVOS_CONSOLE_ATARI_2600 = 25, + CHEEVOS_CONSOLE_MS_DOS = 26, + CHEEVOS_CONSOLE_ARCADE = 27, + CHEEVOS_CONSOLE_VIRTUAL_BOY = 28, + CHEEVOS_CONSOLE_MSX = 29, + CHEEVOS_CONSOLE_COMMODORE_64 = 30, + CHEEVOS_CONSOLE_ZX81 = 31 } cheevos_console_t; +enum +{ + CHEEVOS_DIRTY_TITLE = 1 << 0, + CHEEVOS_DIRTY_DESC = 1 << 1, + CHEEVOS_DIRTY_POINTS = 1 << 2, + CHEEVOS_DIRTY_AUTHOR = 1 << 3, + CHEEVOS_DIRTY_ID = 1 << 4, + CHEEVOS_DIRTY_BADGE = 1 << 5, + CHEEVOS_DIRTY_CONDITIONS = 1 << 6, + CHEEVOS_DIRTY_VOTES = 1 << 7, + CHEEVOS_DIRTY_DESCRIPTION = 1 << 8, + + CHEEVOS_DIRTY_ALL = (1 << 9) - 1 +}; + +enum +{ + CHEEVOS_ACTIVE_SOFTCORE = 1 << 0, + CHEEVOS_ACTIVE_HARDCORE = 1 << 1 +}; + +enum +{ + CHEEVOS_FORMAT_FRAMES = 0, + CHEEVOS_FORMAT_SECS, + CHEEVOS_FORMAT_MILLIS, + CHEEVOS_FORMAT_SCORE, + CHEEVOS_FORMAT_VALUE, + CHEEVOS_FORMAT_OTHER +}; + bool cheevos_load(const void *data); void cheevos_reset_game(void); diff --git a/cheevos/var.c b/cheevos/var.c index 282a4d8dc6..2b567bf21e 100644 --- a/cheevos/var.c +++ b/cheevos/var.c @@ -226,7 +226,7 @@ void cheevos_var_patch_addr(cheevos_var_t* var, cheevos_console_t console) unsigned addr = var->value; var->bank_id = (int)(desc - system->mmaps.descriptors); var->value = (unsigned)cheevos_var_reduce( - (var->value - desc->core.start) & desc->disconnect_mask, + (addr - desc->core.start) & desc->disconnect_mask, desc->core.disconnect); if (var->value >= desc->core.len) diff --git a/command.c b/command.c index 8666504be3..e458b1d640 100644 --- a/command.c +++ b/command.c @@ -2239,7 +2239,7 @@ TODO: Add a setting for these tweaks */ case CMD_EVENT_ADD_TO_FAVORITES: playlist_push( g_defaults.content_favorites, - path_get(RARCH_PATH_CONTENT), + (const char*)data, NULL, file_path_str(FILE_PATH_DETECT), file_path_str(FILE_PATH_DETECT), diff --git a/config.features.h b/config.features.h index 5e0ef72b6e..96b06539ba 100644 --- a/config.features.h +++ b/config.features.h @@ -260,12 +260,6 @@ static const bool _sdl_image_supp = true; static const bool _sdl_image_supp = false; #endif -#ifdef HAVE_FBO -static const bool _fbo_supp = true; -#else -static const bool _fbo_supp = false; -#endif - #ifdef HAVE_DYNAMIC static const bool _dynamic_supp = true; #else diff --git a/configuration.c b/configuration.c index ed096b10ae..21ce17f95d 100644 --- a/configuration.c +++ b/configuration.c @@ -25,6 +25,7 @@ #include #include #include +#include #ifdef HAVE_CONFIG_H #include "config.h" @@ -49,6 +50,12 @@ #include "tasks/tasks_internal.h" +static const char* invalid_filename_chars[] = { + /* https://support.microsoft.com/en-us/help/905231/information-about-the-characters-that-you-cannot-use-in-site-names--fo */ + "~", "#", "%", "&", "*", "{", "}", "\\", ":", "[", "]", "?", "/", "|", "\'", "\"", + NULL +}; + /* All config related settings go here. */ struct config_bool_setting @@ -1247,6 +1254,7 @@ static struct config_bool_setting *populate_settings_bool(settings_t *settings, SETTING_BOOL("cheevos_enable", &settings->bools.cheevos_enable, true, cheevos_enable, false); SETTING_BOOL("cheevos_test_unofficial", &settings->bools.cheevos_test_unofficial, true, false, false); SETTING_BOOL("cheevos_hardcore_mode_enable", &settings->bools.cheevos_hardcore_mode_enable, true, false, false); + SETTING_BOOL("cheevos_leaderboards_enable", &settings->bools.cheevos_leaderboards_enable, true, false, false); SETTING_BOOL("cheevos_verbose_enable", &settings->bools.cheevos_verbose_enable, true, false, false); #endif #ifdef HAVE_OVERLAY @@ -1890,6 +1898,8 @@ static config_file_t *open_default_config_file(void) application_data[0] = conf_path[0] = app_path[0] = '\0'; + (void)path_size; + #if defined(_WIN32) && !defined(_XBOX) fill_pathname_application_path(app_path, path_size); fill_pathname_resolve_relative(conf_path, app_path, @@ -2919,7 +2929,7 @@ bool config_load_override(void) /* Restore the libretro_path we're using * since it will be overwritten by the override when reloading. */ path_set(RARCH_PATH_CORE, buf); - runloop_msg_queue_push("Configuration override loaded.", 1, 100, true); + runloop_msg_queue_push(msg_hash_to_str(MSG_CONFIG_OVERRIDE_LOADED), 1, 100, true); /* Reset save paths. */ retroarch_override_setting_set(RARCH_OVERRIDE_SETTING_STATE_PATH, NULL); @@ -3036,7 +3046,7 @@ bool config_load_remap(void) RARCH_LOG("Remaps: game-specific remap found at %s.\n", game_path); if (input_remapping_load_file(new_conf, game_path)) { - runloop_msg_queue_push("Game remap file loaded.", 1, 100, true); + runloop_msg_queue_push(msg_hash_to_str(MSG_GAME_REMAP_FILE_LOADED), 1, 100, true); rarch_ctl(RARCH_CTL_SET_REMAPS_GAME_ACTIVE, NULL); goto success; } @@ -3056,7 +3066,7 @@ bool config_load_remap(void) RARCH_LOG("Remaps: core-specific remap found at %s.\n", core_path); if (input_remapping_load_file(new_conf, core_path)) { - runloop_msg_queue_push("Core remap file loaded.", 1, 100, true); + runloop_msg_queue_push(msg_hash_to_str(MSG_CORE_REMAP_FILE_LOADED), 1, 100, true); rarch_ctl(RARCH_CTL_SET_REMAPS_CORE_ACTIVE, NULL); goto success; } @@ -3440,6 +3450,7 @@ bool config_save_autoconf_profile(const char *path, unsigned user) unsigned i; char *buf = (char*)malloc(PATH_MAX_LENGTH * sizeof(char)); char *autoconf_file = (char*)malloc(PATH_MAX_LENGTH * sizeof(char)); + char *path_new = NULL; size_t path_size = PATH_MAX_LENGTH * sizeof(char); int32_t pid_user = 0; int32_t vid_user = 0; @@ -3451,6 +3462,26 @@ bool config_save_autoconf_profile(const char *path, unsigned user) buf[0] = autoconf_file[0] = '\0'; + if (string_is_empty(path)) + goto error; + + path_new = strdup(path); + + for (i = 0; invalid_filename_chars[i]; i++) + { + while (1) + { + char *tmp = strstr(path_new, invalid_filename_chars[i]); + + if (tmp) + *tmp = '_'; + else + break; + } + } + + path = path_new; + fill_pathname_join(buf, autoconf_dir, joypad_ident, path_size); if(path_is_directory(buf)) @@ -3476,7 +3507,7 @@ bool config_save_autoconf_profile(const char *path, unsigned user) path_size); } - conf = config_file_new(autoconf_file); + conf = config_file_new(autoconf_file); if (!conf) { @@ -3512,11 +3543,15 @@ bool config_save_autoconf_profile(const char *path, unsigned user) config_file_free(conf); free(buf); free(autoconf_file); + if (path_new) + free(path_new); return ret; error: free(buf); free(autoconf_file); + if (path_new) + free(path_new); return false; } @@ -3699,15 +3734,15 @@ bool config_save_file(const char *path) #ifdef HAVE_LAKKA if (settings->bools.ssh_enable) - fclose(fopen(LAKKA_SSH_PATH, "w")); + filestream_close(filestream_open(LAKKA_SSH_PATH, RFILE_MODE_WRITE, -1)); else path_file_remove(LAKKA_SSH_PATH); if (settings->bools.samba_enable) - fclose(fopen(LAKKA_SAMBA_PATH, "w")); + filestream_close(filestream_open(LAKKA_SAMBA_PATH, RFILE_MODE_WRITE, -1)); else path_file_remove(LAKKA_SAMBA_PATH); if (settings->bools.bluetooth_enable) - fclose(fopen(LAKKA_BLUETOOTH_PATH, "w")); + filestream_close(filestream_open(LAKKA_BLUETOOTH_PATH, RFILE_MODE_WRITE, -1)); else path_file_remove(LAKKA_BLUETOOTH_PATH); #endif diff --git a/configuration.h b/configuration.h index 5cb68b115e..ee2d29d5f7 100644 --- a/configuration.h +++ b/configuration.h @@ -183,6 +183,7 @@ typedef struct settings bool cheevos_enable; bool cheevos_test_unofficial; bool cheevos_hardcore_mode_enable; + bool cheevos_leaderboards_enable; bool cheevos_verbose_enable; /* Camera */ diff --git a/deps/libFLAC/include/share/win_utf8_io.h b/deps/libFLAC/include/share/win_utf8_io.h new file mode 100644 index 0000000000..13fd118660 --- /dev/null +++ b/deps/libFLAC/include/share/win_utf8_io.h @@ -0,0 +1,58 @@ +/* libFLAC - Free Lossless Audio Codec library + * Copyright (C) 2013-2016 Xiph.Org Foundation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of the Xiph.org Foundation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifdef _WIN32 + +#ifndef flac__win_utf8_io_h +#define flac__win_utf8_io_h + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +size_t strlen_utf8(const char *str); +int win_get_console_width(void); + +int get_utf8_argv(int *argc, char ***argv); + +int printf_utf8(const char *format, ...); +int fprintf_utf8(FILE *stream, const char *format, ...); +int vfprintf_utf8(FILE *stream, const char *format, va_list argptr); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif +#endif diff --git a/deps/libFLAC/include/share/windows_unicode_filenames.h b/deps/libFLAC/include/share/windows_unicode_filenames.h new file mode 100644 index 0000000000..86820ca157 --- /dev/null +++ b/deps/libFLAC/include/share/windows_unicode_filenames.h @@ -0,0 +1,67 @@ +/* libFLAC - Free Lossless Audio Codec library + * Copyright (C) 2013-2016 Xiph.Org Foundation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of the Xiph.org Foundation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifdef _WIN32 + +#ifndef flac__windows_unicode_filenames_h +#define flac__windows_unicode_filenames_h + +#include +#include +#include +#include "FLAC/ordinals.h" + +#ifdef __cplusplus +extern "C" { +#endif + +void flac_internal_set_utf8_filenames(FLAC__bool flag); +FLAC__bool flac_internal_get_utf8_filenames(void); +#define flac_set_utf8_filenames flac_internal_set_utf8_filenames +#define flac_get_utf8_filenames flac_internal_get_utf8_filenames + +FILE* flac_internal_fopen_utf8(const char *filename, const char *mode); +int flac_internal_stat64_utf8(const char *path, struct __stat64 *buffer); +int flac_internal_chmod_utf8(const char *filename, int pmode); +int flac_internal_utime_utf8(const char *filename, struct utimbuf *times); +int flac_internal_unlink_utf8(const char *filename); +int flac_internal_rename_utf8(const char *oldname, const char *newname); + +#include +HANDLE WINAPI flac_internal_CreateFile_utf8(const char *lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile); +#define CreateFile_utf8 flac_internal_CreateFile_utf8 + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif +#endif diff --git a/deps/libFLAC/windows_unicode_filenames.c b/deps/libFLAC/windows_unicode_filenames.c new file mode 100644 index 0000000000..306693e090 --- /dev/null +++ b/deps/libFLAC/windows_unicode_filenames.c @@ -0,0 +1,201 @@ +/* libFLAC - Free Lossless Audio Codec library + * Copyright (C) 2013-2016 Xiph.Org Foundation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of the Xiph.org Foundation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include "include/share/windows_unicode_filenames.h" + +/* convert UTF-8 back to WCHAR. Caller is responsible for freeing memory */ +static wchar_t *wchar_from_utf8(const char *str) +{ + wchar_t *widestr; + int len; + + if (!str) + return NULL; + if ((len = MultiByteToWideChar(CP_UTF8, 0, str, -1, NULL, 0)) == 0) + return NULL; + if ((widestr = (wchar_t *)malloc(len*sizeof(wchar_t))) == NULL) + return NULL; + if (MultiByteToWideChar(CP_UTF8, 0, str, -1, widestr, len) == 0) { + free(widestr); + widestr = NULL; + } + + return widestr; +} + + +static FLAC__bool utf8_filenames = false; + + +void flac_internal_set_utf8_filenames(FLAC__bool flag) +{ + utf8_filenames = flag ? true : false; +} + +FLAC__bool flac_internal_get_utf8_filenames(void) +{ + return utf8_filenames; +} + +/* file functions */ + +FILE* flac_internal_fopen_utf8(const char *filename, const char *mode) +{ + if (!utf8_filenames) { + return fopen(filename, mode); + } else { + wchar_t *wname = NULL; + wchar_t *wmode = NULL; + FILE *f = NULL; + + do { + if (!(wname = wchar_from_utf8(filename))) break; + if (!(wmode = wchar_from_utf8(mode))) break; + f = _wfopen(wname, wmode); + } while(0); + + free(wname); + free(wmode); + + return f; + } +} + +int flac_internal_stat64_utf8(const char *path, struct __stat64 *buffer) +{ + if (!utf8_filenames) { + return _stat64(path, buffer); + } else { + wchar_t *wpath; + int ret; + + if (!(wpath = wchar_from_utf8(path))) return -1; + ret = _wstat64(wpath, buffer); + free(wpath); + + return ret; + } +} + +int flac_internal_chmod_utf8(const char *filename, int pmode) +{ + if (!utf8_filenames) { + return _chmod(filename, pmode); + } else { + wchar_t *wname; + int ret; + + if (!(wname = wchar_from_utf8(filename))) return -1; + ret = _wchmod(wname, pmode); + free(wname); + + return ret; + } +} + +int flac_internal_utime_utf8(const char *filename, struct utimbuf *times) +{ + if (!utf8_filenames) { + return utime(filename, times); + } else { + wchar_t *wname; + struct __utimbuf64 ut; + int ret; + + if (!(wname = wchar_from_utf8(filename))) return -1; + ut.actime = times->actime; + ut.modtime = times->modtime; + ret = _wutime64(wname, &ut); + free(wname); + + return ret; + } +} + +int flac_internal_unlink_utf8(const char *filename) +{ + if (!utf8_filenames) { + return _unlink(filename); + } else { + wchar_t *wname; + int ret; + + if (!(wname = wchar_from_utf8(filename))) return -1; + ret = _wunlink(wname); + free(wname); + + return ret; + } +} + +int flac_internal_rename_utf8(const char *oldname, const char *newname) +{ + if (!utf8_filenames) { + return rename(oldname, newname); + } else { + wchar_t *wold = NULL; + wchar_t *wnew = NULL; + int ret = -1; + + do { + if (!(wold = wchar_from_utf8(oldname))) break; + if (!(wnew = wchar_from_utf8(newname))) break; + ret = _wrename(wold, wnew); + } while(0); + + free(wold); + free(wnew); + + return ret; + } +} + +HANDLE WINAPI flac_internal_CreateFile_utf8(const char *lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile) +{ + if (!utf8_filenames) { + return CreateFileA(lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile); + } else { + wchar_t *wname; + HANDLE handle = INVALID_HANDLE_VALUE; + + if ((wname = wchar_from_utf8(lpFileName)) != NULL) { + handle = CreateFileW(wname, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile); + free(wname); + } + + return handle; + } +} diff --git a/dist-scripts/dist-cores.sh b/dist-scripts/dist-cores.sh index d1fafaafab..0f10e57e95 100755 --- a/dist-scripts/dist-cores.sh +++ b/dist-scripts/dist-cores.sh @@ -134,32 +134,7 @@ if [ $SALAMANDER = "yes" ]; then vita-mksfoex -s TITLE_ID=RETROVITA "RetroArch" ../pkg/${platform}/retroarch.vpk/vpk/sce_sys/param.sfo cp ../pkg/${platform}/assets/ICON0.PNG ../pkg/${platform}/retroarch.vpk/vpk/sce_sys/icon0.png cp -R ../pkg/${platform}/assets/livearea ../pkg/${platform}/retroarch.vpk/vpk/sce_sys/ - mkdir -p ../pkg/${platform}/retroarch.vpk/vpk/assets - if [ -d ../media/assets/glui ]; then - cp -r ../media/assets/glui ../pkg/${platform}/retroarch.vpk/vpk/assets - fi - if [ -d ../media/assets/xmb ]; then - cp -r ../media/assets/xmb ../pkg/${platform}/retroarch.vpk/vpk/assets - # Strip source SVG files - rm -rf ../pkg/${platform}/retroarch.vpk/vpk/assets/xmb/flatui/src - rm -rf ../pkg/${platform}/retroarch.vpk/vpk/assets/xmb/monochrome/src - rm -rf ../pkg/${platform}/retroarch.vpk/vpk/assets/xmb/retroactive/src - rm -rf ../pkg/${platform}/retroarch.vpk/vpk/assets/xmb/retroactive_marked/src - rm -rf ../pkg/${platform}/retroarch.vpk/vpk/assets/xmb/dot-art/src - fi - if [ -d ../media/libretrodb/rdb ]; then - mkdir -p ../pkg/${platform}/retroarch.vpk/vpk/database/rdb - cp -r ../media/libretrodb/rdb/* ../pkg/${platform}/retroarch.vpk/vpk/database/rdb - fi - if [ -d ../media/libretrodb/cursors ]; then - mkdir -p ../pkg/${platform}/retroarch.vpk/vpk/database/cursors - cp -r ../media/libretrodb/cursors/* ../pkg/${platform}/retroarch.vpk/vpk/database/cursors - fi - if [ -d ../../dist/info ]; then - mkdir -p ../pkg/${platform}/retroarch.vpk/vpk/info - cp -fv ../../dist/info/*.info ../pkg/${platform}/retroarch.vpk/vpk/info/ - fi - make -C ../ -f Makefile.${platform}.salamander clean || exit 1 + make -C ../ -f Makefile.${platform}.salamander clean || exit 1 fi if [ $PLATFORM = "ctr" ] ; then mv -f ../retroarch_3ds_salamander.cia ../pkg/3ds/cia/retroarch_3ds.cia @@ -259,44 +234,10 @@ for f in `ls -v *_${platform}.${EXT}`; do elif [ $PLATFORM = "vita" ] ; then COUNTER=$((COUNTER + 1)) COUNTER_ID=`printf "%05d" ${COUNTER}` - mkdir -p ../pkg/${platform}/${name}_libretro.vpk/vpk/sce_sys/ - mkdir -p ../pkg/${platform}/${name}_libretro.vpk/vpk/sce_sys/livearea - mkdir -p ../pkg/${platform}/${name}_libretro.vpk/vpk/sce_sys/livearea/contents - mkdir -p ../pkg/${platform}/${name}_libretro.vpk/vpk/assets/ - mkdir -p ../pkg/${platform}/${name}_libretro.vpk/vpk/database/rdb - mkdir -p ../pkg/${platform}/${name}_libretro.vpk/vpk/database/cursors - mkdir -p ../pkg/${platform}/${name}_libretro.vpk/vpk/info - cp ../retroarch_${platform}.self ../pkg/${platform}/${name}_libretro.vpk/vpk/eboot.bin - cp ../pkg/${platform}/${name}_libretro.vpk/vpk/eboot.bin ../pkg/${platform}/retroarch.vpk/vpk/${name}_libretro.self - vita-mksfoex -s TITLE_ID=RETR${COUNTER_ID} "RetroArch ${name}" ../pkg/${platform}/${name}_libretro.vpk/vpk/sce_sys/param.sfo - cp ../pkg/${platform}/assets/ICON0.PNG ../pkg/${platform}/${name}_libretro.vpk/vpk/sce_sys/icon0.png - cp ../pkg/${platform}/assets/livearea/contents/bg.png ../pkg/${platform}/${name}_libretro.vpk/vpk/sce_sys/livearea/contents/bg.png - cp ../pkg/${platform}/assets/livearea/contents/startup.png ../pkg/${platform}/${name}_libretro.vpk/vpk/sce_sys/livearea/contents/startup.png - cp ../pkg/${platform}/assets/livearea/contents/website.png ../pkg/${platform}/${name}_libretro.vpk/vpk/sce_sys/livearea/contents/website.png - cp ../pkg/${platform}/assets/livearea/contents/template.xml ../pkg/${platform}/${name}_libretro.vpk/vpk/sce_sys/livearea/contents/template.xml - mkdir -p ../pkg/${platform}/${name}_libretro.vpk/vpk/assets - if [ -d ../media/assets/glui ]; then - cp -r ../media/assets/glui ../pkg/${platform}/${name}_libretro.vpk/vpk/assets - fi - if [ -d ../media/assets/xmb ]; then - cp -r ../media/assets/xmb ../pkg/${platform}/${name}_libretro.vpk/vpk/assets - # Strip source SVG files - rm -rf ../pkg/${platform}/${name}_libretro.vpk/vpk/assets/xmb/flatui/src - rm -rf ../pkg/${platform}/${name}_libretro.vpk/vpk/assets/xmb/monochrome/src - rm -rf ../pkg/${platform}/${name}_libretro.vpk/vpk/assets/xmb/retroactive/src - rm -rf ../pkg/${platform}/${name}_libretro.vpk/vpk/assets/xmb/retroactive_marked/src - fi - if [ -d ../media/libretrodb/rdb ]; then - mkdir -p ../pkg/${platform}/retroarch.vpk/vpk/database/rdb - cp -r ../media/libretrodb/rdb/* ../pkg/${platform}/${name}_libretro.vpk/vpk/database/rdb - fi - if [ -d ../media/libretrodb/cursors ]; then - mkdir -p ../pkg/${platform}/retroarch.vpk/vpk/database/cursors - cp -r ../media/libretrodb/cursors/* ../pkg/${platform}/${name}_libretro.vpk/vpk/database/cursors - fi + cp ../retroarch_${platform}.self ../pkg/${platform}/retroarch.vpk/vpk/${name}_libretro.self if [ -d ../../dist/info ]; then mkdir -p ../pkg/${platform}/retroarch.vpk/vpk/info - cp -fv ../../dist/info/"${name}_libretro.info" ../pkg/${platform}/${name}_libretro.vpk/vpk/info/"${name}_libretro.info" + cp -fv ../../dist/info/"${name}_libretro.info" ../pkg/${platform}/retroarch.vpk/vpk/info/"${name}_libretro.info" fi elif [ $PLATFORM = "ctr" ] ; then mv -f ../retroarch_3ds.cia ../pkg/3ds/cia/${name}_libretro.cia diff --git a/frontend/drivers/platform_psp.c b/frontend/drivers/platform_psp.c index 0fc89fd463..6a08e8e1bb 100644 --- a/frontend/drivers/platform_psp.c +++ b/frontend/drivers/platform_psp.c @@ -115,15 +115,15 @@ static void frontend_psp_get_environment_settings(int *argc, char *argv[], /* bundle data*/ fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_CORE], g_defaults.dirs[DEFAULT_DIR_PORT], "", sizeof(g_defaults.dirs[DEFAULT_DIR_CORE])); - fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_ASSETS], g_defaults.dirs[DEFAULT_DIR_PORT], - "assets", sizeof(g_defaults.dirs[DEFAULT_DIR_ASSETS])); - fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_CORE_INFO], g_defaults.dirs[DEFAULT_DIR_CORE], + fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_CORE_INFO], g_defaults.dirs[DEFAULT_DIR_PORT], "info", sizeof(g_defaults.dirs[DEFAULT_DIR_CORE_INFO])); - fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_DATABASE], g_defaults.dirs[DEFAULT_DIR_PORT], - "database/rdb", sizeof(g_defaults.dirs[DEFAULT_DIR_DATABASE])); - fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_CURSOR], g_defaults.dirs[DEFAULT_DIR_PORT], - "database/cursors", sizeof(g_defaults.dirs[DEFAULT_DIR_CURSOR])); /* user data*/ + fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_ASSETS], user_path, + "assets", sizeof(g_defaults.dirs[DEFAULT_DIR_ASSETS])); + fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_DATABASE], user_path, + "database/rdb", sizeof(g_defaults.dirs[DEFAULT_DIR_DATABASE])); + fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_CURSOR], user_path, + "database/cursors", sizeof(g_defaults.dirs[DEFAULT_DIR_CURSOR])); fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_CHEATS], user_path, "cheats", sizeof(g_defaults.dirs[DEFAULT_DIR_CHEATS])); fill_pathname_join(g_defaults.dirs[DEFAULT_DIR_MENU_CONFIG], user_path, diff --git a/frontend/drivers/platform_unix.c b/frontend/drivers/platform_unix.c index 23418e147d..80bd183322 100644 --- a/frontend/drivers/platform_unix.c +++ b/frontend/drivers/platform_unix.c @@ -616,7 +616,7 @@ static bool make_proc_acpi_key_val(char **_ptr, char **_key, char **_val) *(ptr++) = '\0'; /* terminate the key. */ - while ((*ptr == ' ') && (*ptr != '\0')) + while (*ptr == ' ') ptr++; /* skip whitespace. */ if (*ptr == '\0') diff --git a/frontend/drivers/platform_wiiu.c b/frontend/drivers/platform_wiiu.c index eb489d750c..c97ec97139 100644 --- a/frontend/drivers/platform_wiiu.c +++ b/frontend/drivers/platform_wiiu.c @@ -308,6 +308,7 @@ frontend_ctx_driver_t frontend_ctx_wiiu = NULL, /* attach_console */ NULL, /* detach_console */ "wiiu", + NULL, /* get_video_driver */ }; static int wiiu_log_socket = -1; @@ -379,6 +380,7 @@ void net_print_exp(const char *str) send(wiiu_log_socket, str, strlen(str), 0); } +#if defined(PC_DEVELOPMENT_IP_ADDRESS) && defined(PC_DEVELOPMENT_TCP_PORT) static devoptab_t dotab_stdout = { "stdout_net", // device name @@ -389,6 +391,7 @@ static devoptab_t dotab_stdout = NULL, /* ... */ }; +#endif void SaveCallback() { @@ -642,7 +645,7 @@ void _start(int argc, char **argv) __init(); fsdev_init(); - int ret = main(argc, argv); + main(argc, argv); fsdev_exit(); // __fini(); diff --git a/gfx/common/gl_common.h b/gfx/common/gl_common.h index b7a0389353..5d5c1fa284 100644 --- a/gfx/common/gl_common.h +++ b/gfx/common/gl_common.h @@ -38,6 +38,10 @@ RETRO_BEGIN_DECLS #define MAX_FENCES 4 +#ifndef ARB_sync +typedef struct __GLsync *GLsync; +#endif + typedef struct gl { GLenum internal_fmt; @@ -47,44 +51,34 @@ typedef struct gl bool vsync; bool tex_mipmap; -#ifdef HAVE_FBO bool fbo_inited; bool fbo_feedback_enable; bool hw_render_fbo_init; bool hw_render_depth_init; + bool has_fbo; bool has_srgb_fbo_gles3; -#endif bool has_fp_fbo; bool has_srgb_fbo; bool hw_render_use; + bool core_context_in_use; bool should_resize; bool quitting; bool fullscreen; bool keep_aspect; -#ifdef HAVE_OPENGLES bool support_unpack_row_length; -#else bool have_es2_compat; -#endif bool have_full_npot_support; + bool have_mipmap; bool egl_images; -#ifdef HAVE_OVERLAY bool overlay_enable; bool overlay_full_screen; -#endif -#ifdef HAVE_MENU bool menu_texture_enable; bool menu_texture_full_screen; -#endif -#ifdef HAVE_GL_SYNC bool have_sync; -#endif -#ifdef HAVE_GL_ASYNC_READBACK bool pbo_readback_valid[4]; bool pbo_readback_enable; -#endif int version_major; int version_minor; @@ -92,131 +86,77 @@ typedef struct gl GLuint tex_mag_filter; GLuint tex_min_filter; -#ifdef HAVE_FBO GLuint fbo_feedback; GLuint fbo_feedback_texture; -#endif GLuint pbo; -#ifdef HAVE_OVERLAY GLuint *overlay_tex; -#endif -#if defined(HAVE_MENU) GLuint menu_texture; -#endif GLuint vao; -#ifdef HAVE_GL_ASYNC_READBACK GLuint pbo_readback[4]; -#endif GLuint texture[GFX_MAX_TEXTURES]; -#ifdef HAVE_FBO 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]; -#endif unsigned tex_index; /* For use with PREV. */ unsigned textures; -#ifdef HAVE_FBO unsigned fbo_feedback_pass; -#endif unsigned rotation; unsigned vp_out_width; unsigned vp_out_height; unsigned tex_w; unsigned tex_h; unsigned base_size; /* 2 or 4 */ -#ifdef HAVE_OVERLAY unsigned overlays; -#endif -#ifdef HAVE_GL_ASYNC_READBACK unsigned pbo_readback_index; -#endif -#ifdef HAVE_GL_SYNC unsigned fence_count; -#endif unsigned last_width[GFX_MAX_TEXTURES]; unsigned last_height[GFX_MAX_TEXTURES]; -#if defined(HAVE_MENU) float menu_texture_alpha; -#endif void *empty_buf; void *conv_buffer; void *readback_buffer_screenshot; const float *vertex_ptr; const float *white_color_ptr; -#ifdef HAVE_OVERLAY float *overlay_vertex_coord; float *overlay_tex_coord; float *overlay_color_coord; -#endif struct video_tex_info tex_info; -#ifdef HAVE_GL_ASYNC_READBACK struct scaler_ctx pbo_readback_scaler; -#endif struct video_viewport vp; math_matrix_4x4 mvp, mvp_no_rot; struct video_coords coords; struct scaler_ctx scaler; video_info_t video_info; struct video_tex_info prev_info[GFX_MAX_TEXTURES]; -#ifdef HAVE_FBO struct video_fbo_rect fbo_rect[GFX_MAX_SHADERS]; struct gfx_fbo_scale fbo_scale[GFX_MAX_SHADERS]; -#endif -#ifdef HAVE_GL_SYNC GLsync fences[MAX_FENCES]; -#endif + const gl_renderchain_driver_t *renderchain_driver; + void *renderchain_data; } gl_t; -bool gl_load_luts(const struct video_shader *generic_shader, - GLuint *lut_textures); - -#ifdef NO_GL_FF_VERTEX -#define gl_ff_vertex(coords) ((void)0) -#else -static INLINE void gl_ff_vertex(const struct video_coords *coords) +static INLINE void gl_bind_texture(GLuint id, GLint wrap_mode, GLint mag_filter, + GLint min_filter) { - /* Fall back to fixed function-style if needed and possible. */ - glClientActiveTexture(GL_TEXTURE1); - glTexCoordPointer(2, GL_FLOAT, 0, coords->lut_tex_coord); - glEnableClientState(GL_TEXTURE_COORD_ARRAY); - glClientActiveTexture(GL_TEXTURE0); - glVertexPointer(2, GL_FLOAT, 0, coords->vertex); - glEnableClientState(GL_VERTEX_ARRAY); - glColorPointer(4, GL_FLOAT, 0, coords->color); - glEnableClientState(GL_COLOR_ARRAY); - glTexCoordPointer(2, GL_FLOAT, 0, coords->tex_coord); - glEnableClientState(GL_TEXTURE_COORD_ARRAY); + glBindTexture(GL_TEXTURE_2D, id); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, wrap_mode); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, wrap_mode); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, mag_filter); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, min_filter); } -#endif - -#ifdef NO_GL_FF_MATRIX -#define gl_ff_matrix(mat) ((void)0) -#else -static INLINE void gl_ff_matrix(const math_matrix_4x4 *mat) -{ - math_matrix_4x4 ident; - - /* Fall back to fixed function-style if needed and possible. */ - glMatrixMode(GL_PROJECTION); - glLoadMatrixf(mat->data); - glMatrixMode(GL_MODELVIEW); - matrix_4x4_identity(ident); - glLoadMatrixf(ident.data); -} -#endif static INLINE unsigned gl_wrap_type_to_enum(enum gfx_wrap_type type) { switch (type) { #ifndef HAVE_OPENGLES - case RARCH_WRAP_BORDER: + case RARCH_WRAP_BORDER: /* GL_CLAMP_TO_BORDER: Available since GL 1.3 */ return GL_CLAMP_TO_BORDER; #else case RARCH_WRAP_BORDER: @@ -232,8 +172,8 @@ static INLINE unsigned gl_wrap_type_to_enum(enum gfx_wrap_type type) return 0; } - bool gl_query_core_context_in_use(void); + void gl_load_texture_image(GLenum target, GLint level, GLint internalFormat, @@ -244,6 +184,14 @@ void gl_load_texture_image(GLenum target, GLenum type, const GLvoid * data); +void gl_load_texture_data( + uint32_t id_data, + enum gfx_wrap_type wrap_type, + enum texture_filter_type filter_type, + unsigned alignment, + unsigned width, unsigned height, + const void *frame, unsigned base_size); + RETRO_END_DECLS #endif diff --git a/gfx/drivers/caca_gfx.c b/gfx/drivers/caca_gfx.c index c558602666..a89cb63ed8 100644 --- a/gfx/drivers/caca_gfx.c +++ b/gfx/drivers/caca_gfx.c @@ -305,6 +305,8 @@ static void caca_set_osd_msg(void *data, } static const video_poke_interface_t caca_poke_interface = { + NULL, /* set_coords */ + NULL, /* set_mvp */ NULL, NULL, NULL, @@ -312,11 +314,7 @@ static const video_poke_interface_t caca_poke_interface = { NULL, NULL, NULL, -#ifdef HAVE_FBO NULL, -#else - NULL, -#endif NULL, NULL, NULL, diff --git a/gfx/drivers/ctr_gfx.c b/gfx/drivers/ctr_gfx.c index da134da326..0aabb51ccd 100644 --- a/gfx/drivers/ctr_gfx.c +++ b/gfx/drivers/ctr_gfx.c @@ -1120,14 +1120,16 @@ static void ctr_set_osd_msg(void *data, } static const video_poke_interface_t ctr_poke_interface = { + NULL, /* set_coords */ + NULL, /* set_mvp */ ctr_load_texture, ctr_unload_texture, NULL, ctr_set_filtering, - NULL, /* get_video_output_size */ - NULL, /* get_video_output_prev */ - NULL, /* get_video_output_next */ - NULL, /* get_current_framebuffer */ + NULL, /* get_video_output_size */ + NULL, /* get_video_output_prev */ + NULL, /* get_video_output_next */ + NULL, /* get_current_framebuffer */ NULL, ctr_set_aspect_ratio, ctr_apply_state_changes, diff --git a/gfx/drivers/d3d.c b/gfx/drivers/d3d.c index f45b7903fe..48aefd123e 100644 --- a/gfx/drivers/d3d.c +++ b/gfx/drivers/d3d.c @@ -66,40 +66,23 @@ #endif #endif +#ifdef _XBOX +#ifndef HAVE_FBO +#define HAVE_FBO +#endif + +#endif + static LPDIRECT3D g_pD3D; -static bool d3d_init_luts(d3d_video_t *d3d) -{ - unsigned i; - settings_t *settings = config_get_ptr(); - - if (!d3d->renderchain_driver || !d3d->renderchain_driver->add_lut) - return true; - - for (i = 0; i < d3d->shader.luts; i++) - { - if (!d3d->renderchain_driver->add_lut( - d3d->renderchain_data, - d3d->shader.lut[i].id, d3d->shader.lut[i].path, - d3d->shader.lut[i].filter == RARCH_FILTER_UNSPEC ? - settings->bools.video_smooth : - (d3d->shader.lut[i].filter == RARCH_FILTER_LINEAR))) - return false; - } - - return true; -} - static bool d3d_init_imports(d3d_video_t *d3d) { retro_ctx_memory_info_t mem_info; - state_tracker_t *state_tracker = NULL; + state_tracker_t *state_tracker = NULL; struct state_tracker_info tracker_info = {0}; if (!d3d->shader.variables) return true; - if (!d3d->renderchain_driver || !d3d->renderchain_driver->add_state_tracker) - return true; mem_info.id = RETRO_MEMORY_SYSTEM_RAM; @@ -205,15 +188,36 @@ static bool d3d_init_chain(d3d_video_t *d3d, const video_info_t *video_info) } #endif - if (!d3d_init_luts(d3d)) + if (d3d->renderchain_driver) { - RARCH_ERR("[D3D]: Failed to init LUTs.\n"); - return false; - } - if (!d3d_init_imports(d3d)) - { - RARCH_ERR("[D3D]: Failed to init imports.\n"); - return false; + if (d3d->renderchain_driver->add_lut) + { + unsigned i; + settings_t *settings = config_get_ptr(); + + for (i = 0; i < d3d->shader.luts; i++) + { + if (!d3d->renderchain_driver->add_lut( + d3d->renderchain_data, + d3d->shader.lut[i].id, d3d->shader.lut[i].path, + d3d->shader.lut[i].filter == RARCH_FILTER_UNSPEC ? + settings->bools.video_smooth : + (d3d->shader.lut[i].filter == RARCH_FILTER_LINEAR))) + { + RARCH_ERR("[D3D]: Failed to init LUTs.\n"); + return false; + } + } + } + + if (d3d->renderchain_driver->add_state_tracker) + { + if (!d3d_init_imports(d3d)) + { + RARCH_ERR("[D3D]: Failed to init imports.\n"); + return false; + } + } } return true; @@ -961,9 +965,7 @@ static void d3d_set_osd_msg(void *data, font_driver_render_msg(video_info, NULL, msg, params); } -/* Delay constructor due to lack of exceptions. */ - -static bool d3d_construct(d3d_video_t *d3d, +static bool d3d_init_internal(d3d_video_t *d3d, const video_info_t *info, const input_driver_t **input, void **input_data) { @@ -1062,11 +1064,20 @@ static bool d3d_construct(d3d_video_t *d3d, * later. */ type = video_shader_parse_type(settings->paths.path_shader, RARCH_SHADER_NONE); - if (settings->bools.video_shader_enable && type == RARCH_SHADER_CG) + + if (settings->bools.video_shader_enable) { - if (!string_is_empty(d3d->shader_path)) - free(d3d->shader_path); - d3d->shader_path = strdup(settings->paths.path_shader); + switch (type) + { + case RARCH_SHADER_CG: + if (!string_is_empty(d3d->shader_path)) + free(d3d->shader_path); + if (!string_is_empty(settings->paths.path_shader)) + d3d->shader_path = strdup(settings->paths.path_shader); + break; + default: + break; + } } if (!d3d_process_shader(d3d)) @@ -1171,7 +1182,7 @@ static void *d3d_init(const video_info_t *info, video_context_driver_set((const gfx_ctx_driver_t*)ctx_driver); - if (!d3d_construct(d3d, info, input, input_data)) + if (!d3d_init_internal(d3d, info, input, input_data)) { RARCH_ERR("[D3D]: Failed to init D3D.\n"); goto error; @@ -1708,7 +1719,21 @@ static void d3d_unload_texture(void *data, uintptr_t id) d3d_texture_free(texid); } +static void d3d_set_mvp(void *data, + void *shader_data, + const void *mat_data) +{ + d3d_video_t *d3d = (d3d_video_t*)data; + if (d3d && d3d->renderchain_driver->set_mvp) + d3d->renderchain_driver->set_mvp( + d3d->renderchain_data, + data, + 640, 480, 0); +} + static const video_poke_interface_t d3d_poke_interface = { + NULL, /* set_coords */ + d3d_set_mvp, d3d_load_texture, d3d_unload_texture, NULL, diff --git a/gfx/drivers/dispmanx_gfx.c b/gfx/drivers/dispmanx_gfx.c index 9058834402..18afe085ae 100644 --- a/gfx/drivers/dispmanx_gfx.c +++ b/gfx/drivers/dispmanx_gfx.c @@ -631,6 +631,8 @@ static void dispmanx_set_aspect_ratio (void *data, unsigned aspect_ratio_idx) } static const video_poke_interface_t dispmanx_poke_interface = { + NULL, /* set_coords */ + NULL, /* set_mvp */ NULL, NULL, NULL, /* set_video_mode */ diff --git a/gfx/drivers/drm_gfx.c b/gfx/drivers/drm_gfx.c index 7bf088e356..01fb0dec6a 100644 --- a/gfx/drivers/drm_gfx.c +++ b/gfx/drivers/drm_gfx.c @@ -959,6 +959,8 @@ static void drm_set_aspect_ratio (void *data, unsigned aspect_ratio_idx) } static const video_poke_interface_t drm_poke_interface = { + NULL, /* set_coords */ + NULL, /* set_mvp */ NULL, NULL, NULL, /* set_video_mode */ diff --git a/gfx/drivers/exynos_gfx.c b/gfx/drivers/exynos_gfx.c index f8b69d7668..4b0476f4b5 100644 --- a/gfx/drivers/exynos_gfx.c +++ b/gfx/drivers/exynos_gfx.c @@ -1478,6 +1478,8 @@ static void exynos_show_mouse(void *data, bool state) } static const video_poke_interface_t exynos_poke_interface = { + NULL, /* set_coords */ + NULL, /* set_mvp */ NULL, NULL, NULL, /* set_video_mode */ diff --git a/gfx/drivers/gdi_gfx.c b/gfx/drivers/gdi_gfx.c index 663449f1cb..59e18af6b8 100644 --- a/gfx/drivers/gdi_gfx.c +++ b/gfx/drivers/gdi_gfx.c @@ -531,6 +531,8 @@ static void gdi_set_video_mode(void *data, unsigned width, unsigned height, } static const video_poke_interface_t gdi_poke_interface = { + NULL, /* set_coords */ + NULL, /* set_mvp */ NULL, NULL, gdi_set_video_mode, @@ -538,11 +540,7 @@ static const video_poke_interface_t gdi_poke_interface = { gdi_get_video_output_size, gdi_get_video_output_prev, gdi_get_video_output_next, -#ifdef HAVE_FBO NULL, -#else - NULL, -#endif NULL, NULL, NULL, diff --git a/gfx/drivers/gl.c b/gfx/drivers/gl.c index 8ce706ed39..8c2d230194 100644 --- a/gfx/drivers/gl.c +++ b/gfx/drivers/gl.c @@ -41,8 +41,6 @@ #include #include -#include "../drivers_renderchain/gl2_renderchain.h" - #include "../../configuration.h" #include "../../dynamic.h" #include "../../record/record_driver.h" @@ -73,16 +71,8 @@ #include "../../menu/menu_driver.h" #endif -#if defined(_WIN32) && !defined(_XBOX) -#include "../common/win32_common.h" -#endif - -#ifndef GL_SYNC_GPU_COMMANDS_COMPLETE -#define GL_SYNC_GPU_COMMANDS_COMPLETE 0x9117 -#endif - -#ifndef GL_SYNC_FLUSH_COMMANDS_BIT -#define GL_SYNC_FLUSH_COMMANDS_BIT 0x00000001 +#ifndef GL_UNSIGNED_INT_8_8_8_8_REV +#define GL_UNSIGNED_INT_8_8_8_8_REV 0x8367 #endif #define set_texture_coords(coords, xamt, yamt) \ @@ -93,14 +83,6 @@ static struct video_ortho default_ortho = {0, 1, 0, 1, -1, 1}; -#ifdef IOS -/* There is no default frame buffer on iOS. */ -void cocoagl_bind_game_view_fbo(void); -#define gl_bind_backbuffer() cocoagl_bind_game_view_fbo() -#else -#define gl_bind_backbuffer() glBindFramebuffer(RARCH_GL_FRAMEBUFFER, 0) -#endif - /* Used for the last pass when rendering to the back buffer. */ static const GLfloat vertexes_flipped[] = { 0, 1, @@ -145,9 +127,6 @@ void context_bind_hw_render(bool enable) #ifdef HAVE_OVERLAY static void gl_free_overlay(gl_t *gl) { - if (!gl) - return; - glDeleteTextures(gl->overlays, gl->overlay_tex); free(gl->overlay_tex); @@ -241,9 +220,9 @@ static void gl_render_overlay(gl_t *gl, video_frame_info_t *video_info) coords.handle_data = NULL; coords.data = &gl->coords; - video_shader_driver_set_coords(coords); + video_driver_set_coords(&coords); - video_info->cb_shader_set_mvp(gl, + video_info->cb_set_mvp(gl, video_info->shader_data, &gl->mvp_no_rot); for (i = 0; i < gl->overlays; i++) @@ -393,35 +372,32 @@ static void gl_set_viewport_wrapper(void *data, unsigned viewport_width, /* Shaders */ -static bool gl_shader_init(gl_t *gl) +static bool gl_shader_init(gl_t *gl, const gfx_ctx_driver_t *ctx_driver, + struct retro_hw_render_callback *hwr + ) { video_shader_ctx_init_t init_data; - enum rarch_shader_type type; settings_t *settings = config_get_ptr(); const char *shader_path = (settings->bools.video_shader_enable && *settings->paths.path_shader) ? settings->paths.path_shader : NULL; - - if (!gl) - { - RARCH_ERR("[GL]: Invalid GL instance passed.\n"); - return false; - } - - type = video_shader_parse_type(shader_path, - gl_query_core_context_in_use() + enum rarch_shader_type type = video_shader_parse_type(shader_path, + gl->core_context_in_use ? RARCH_SHADER_GLSL : DEFAULT_SHADER_TYPE); switch (type) { #ifdef HAVE_CG case RARCH_SHADER_CG: - if (gl_query_core_context_in_use()) + if (gl->core_context_in_use) shader_path = NULL; break; #endif #ifdef HAVE_GLSL case RARCH_SHADER_GLSL: + gl_glsl_set_get_proc_address(ctx_driver->get_proc_address); + gl_glsl_set_context_type(gl->core_context_in_use, + hwr->version_major, hwr->version_minor); break; #endif @@ -430,7 +406,7 @@ static bool gl_shader_init(gl_t *gl) return true; } - init_data.gl.core_context_enabled = gl_query_core_context_in_use(); + init_data.gl.core_context_enabled = gl->core_context_in_use; init_data.shader_type = type; init_data.shader = NULL; init_data.data = gl; @@ -447,22 +423,6 @@ static bool gl_shader_init(gl_t *gl) return video_shader_driver_init(&init_data); } -#ifndef NO_GL_FF_VERTEX -static void gl_disable_client_arrays(void) -{ - if (gl_query_core_context_in_use()) - return; - - glClientActiveTexture(GL_TEXTURE1); - glDisableClientState(GL_TEXTURE_COORD_ARRAY); - glClientActiveTexture(GL_TEXTURE0); - glDisableClientState(GL_VERTEX_ARRAY); - glDisableClientState(GL_COLOR_ARRAY); - glDisableClientState(GL_TEXTURE_COORD_ARRAY); -} -#endif - - GLenum min_filter_to_mag(GLenum type) { switch (type) @@ -478,13 +438,13 @@ GLenum min_filter_to_mag(GLenum type) return type; } -#ifdef HAVE_FBO static uintptr_t gl_get_current_framebuffer(void *data) { gl_t *gl = (gl_t*)data; + if (!gl || !gl->has_fbo) + return 0; return gl->hw_render_fbo[(gl->tex_index + 1) % gl->textures]; } -#endif static void gl_set_rotation(void *data, unsigned rotation) { @@ -580,45 +540,14 @@ static void gl_init_textures_data(gl_t *gl) } } -static void gl_init_textures_reference(gl_t *gl, unsigned i, - GLenum internal_fmt, GLenum texture_fmt, GLenum texture_type) -{ - glBindTexture(GL_TEXTURE_2D, gl->texture[i]); - - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, gl->wrap_mode); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, gl->wrap_mode); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, gl->tex_mag_filter); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, gl->tex_min_filter); - -#ifdef HAVE_PSGL - glTextureReferenceSCE(GL_TEXTURE_2D, 1, - gl->tex_w, gl->tex_h, 0, - internal_fmt, - gl->tex_w * gl->base_size, - gl->tex_w * gl->tex_h * i * gl->base_size); -#else - if (gl->egl_images) - return; - - gl_load_texture_image(GL_TEXTURE_2D, - 0, internal_fmt, gl->tex_w, gl->tex_h, 0, texture_type, - texture_fmt, gl->empty_buf ? gl->empty_buf : NULL); -#endif -} - static void gl_init_textures(gl_t *gl, const video_info_t *video) { unsigned i; GLenum internal_fmt, texture_type = 0, texture_fmt = 0; - (void)texture_type; - (void)texture_fmt; - -#if defined(HAVE_EGL) && defined(HAVE_OPENGLES) /* 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((void*)video); -#endif + video_context_driver_init_image_buffer(video); #ifdef HAVE_PSGL if (!gl->pbo) @@ -631,10 +560,8 @@ static void gl_init_textures(gl_t *gl, const video_info_t *video) #endif internal_fmt = gl->internal_fmt; -#ifndef HAVE_PSGL texture_type = gl->texture_type; texture_fmt = gl->texture_fmt; -#endif #if defined(HAVE_OPENGLES) && !defined(HAVE_PSGL) /* GLES is picky about which format we use here. @@ -661,147 +588,19 @@ static void gl_init_textures(gl_t *gl, const video_info_t *video) glGenTextures(gl->textures, gl->texture); for (i = 0; i < gl->textures; i++) - gl_init_textures_reference(gl, i, internal_fmt, - texture_fmt, texture_type); + { + gl_bind_texture(gl->texture[i], gl->wrap_mode, gl->tex_mag_filter, + gl->tex_min_filter); + + if (gl->renderchain_driver->init_texture_reference) + gl->renderchain_driver->init_texture_reference( + gl, i, internal_fmt, + texture_fmt, texture_type); + } glBindTexture(GL_TEXTURE_2D, gl->texture[gl->tex_index]); } -static INLINE void gl_copy_frame(gl_t *gl, - video_frame_info_t *video_info, - const void *frame, - unsigned width, unsigned height, unsigned pitch) -{ -#if defined(HAVE_PSGL) - { - unsigned h; - size_t buffer_addr = gl->tex_w * gl->tex_h * - gl->tex_index * gl->base_size; - size_t buffer_stride = gl->tex_w * gl->base_size; - const uint8_t *frame_copy = frame; - size_t frame_copy_size = width * gl->base_size; - - uint8_t *buffer = (uint8_t*)glMapBuffer( - GL_TEXTURE_REFERENCE_BUFFER_SCE, GL_READ_WRITE) + buffer_addr; - for (h = 0; h < height; h++, buffer += buffer_stride, frame_copy += pitch) - memcpy(buffer, frame_copy, frame_copy_size); - - glUnmapBuffer(GL_TEXTURE_REFERENCE_BUFFER_SCE); - } -#elif defined(HAVE_OPENGLES) -#if defined(HAVE_EGL) - if (gl->egl_images) - { - gfx_ctx_image_t img_info; - bool new_egl = false; - EGLImageKHR img = 0; - - img_info.frame = frame; - img_info.width = width; - img_info.height = height; - img_info.pitch = pitch; - img_info.index = gl->tex_index; - img_info.rgb32 = (gl->base_size == 4); - img_info.handle = &img; - - new_egl = video_context_driver_write_to_image_buffer(&img_info); - - if (img == EGL_NO_IMAGE_KHR) - { - RARCH_ERR("[GL]: Failed to create EGL image.\n"); - return; - } - - if (new_egl) - glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, (GLeglImageOES)img); - } - else -#endif - { - glPixelStorei(GL_UNPACK_ALIGNMENT, - video_pixel_get_alignment(width * gl->base_size)); - - /* Fallback for GLES devices without GL_BGRA_EXT. */ - if (gl->base_size == 4 && video_info->use_rgba) - { - video_frame_convert_argb8888_to_abgr8888( - &gl->scaler, - gl->conv_buffer, - frame, width, height, pitch); - glTexSubImage2D(GL_TEXTURE_2D, - 0, 0, 0, width, height, gl->texture_type, - gl->texture_fmt, gl->conv_buffer); - } - else if (gl->support_unpack_row_length) - { - glPixelStorei(GL_UNPACK_ROW_LENGTH, pitch / gl->base_size); - glTexSubImage2D(GL_TEXTURE_2D, - 0, 0, 0, width, height, gl->texture_type, - gl->texture_fmt, frame); - - glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); - } - else - { - /* No GL_UNPACK_ROW_LENGTH. */ - - const GLvoid *data_buf = frame; - unsigned pitch_width = pitch / gl->base_size; - - if (width != pitch_width) - { - /* Slow path - conv_buffer is preallocated - * just in case we hit this path. */ - - unsigned h; - const unsigned line_bytes = width * gl->base_size; - uint8_t *dst = (uint8_t*)gl->conv_buffer; - const uint8_t *src = (const uint8_t*)frame; - - for (h = 0; h < height; h++, src += pitch, dst += line_bytes) - memcpy(dst, src, line_bytes); - - data_buf = gl->conv_buffer; - } - - glTexSubImage2D(GL_TEXTURE_2D, - 0, 0, 0, width, height, gl->texture_type, - gl->texture_fmt, data_buf); - } - } -#else - { - const GLvoid *data_buf = frame; - glPixelStorei(GL_UNPACK_ALIGNMENT, video_pixel_get_alignment(pitch)); - - if (gl->base_size == 2 && !gl->have_es2_compat) - { - /* Convert to 32-bit textures on desktop GL. - * - * It is *much* faster (order of magnitude on my setup) - * to use a custom SIMD-optimized conversion routine - * than letting GL do it. */ - video_frame_convert_rgb16_to_rgb32( - &gl->scaler, - gl->conv_buffer, - frame, - width, - height, - pitch); - data_buf = gl->conv_buffer; - } - else - glPixelStorei(GL_UNPACK_ROW_LENGTH, pitch / gl->base_size); - - glTexSubImage2D(GL_TEXTURE_2D, - 0, 0, 0, width, height, gl->texture_type, - gl->texture_fmt, data_buf); - - glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); - } -#endif -} - static INLINE void gl_set_shader_viewports(gl_t *gl) { unsigned width, height; @@ -814,6 +613,7 @@ static INLINE void gl_set_shader_viewports(gl_t *gl) shader_info.set_active = true; video_shader_driver_use(shader_info); + gl_set_viewport_wrapper(gl, width, height, false, true); shader_info.data = gl; @@ -838,12 +638,9 @@ void gl_load_texture_data( bool rgb32 = (base_size == (sizeof(uint32_t))); GLenum wrap = gl_wrap_type_to_enum(wrap_type); GLuint id = (GLuint)id_data; + bool have_mipmap = gl_check_capability(GL_CAPS_MIPMAP); - glBindTexture(GL_TEXTURE_2D, id); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, wrap); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, wrap); - - if (!gl_check_capability(GL_CAPS_MIPMAP)) + if (!have_mipmap) { /* Assume no mipmapping support. */ switch (filter_type) @@ -882,8 +679,7 @@ void gl_load_texture_data( break; } - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, mag_filter); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, min_filter); + gl_bind_texture(id, wrap, mag_filter, min_filter); glPixelStorei(GL_UNPACK_ALIGNMENT, alignment); glTexImage2D(GL_TEXTURE_2D, @@ -893,7 +689,7 @@ void gl_load_texture_data( (use_rgba || !rgb32) ? GL_RGBA : RARCH_GL_TEXTURE_TYPE32, (rgb32) ? RARCH_GL_FORMAT32 : GL_UNSIGNED_SHORT_4_4_4_4, frame); - if (want_mipmap && gl_check_capability(GL_CAPS_MIPMAP)) + if (want_mipmap && have_mipmap) glGenerateMipmap(GL_TEXTURE_2D); } @@ -945,89 +741,81 @@ static void gl_render_osd_background( gl_t *gl, video_frame_info_t *video_info, const char *msg) { - video_shader_ctx_mvp_t mvp; video_shader_ctx_coords_t coords_data; video_coords_t coords; - video_shader_ctx_info_t shader_info; struct uniform_info uniform_param; - const unsigned vertices_total = 6; float colors[4]; - float *dummy = (float*)calloc(4 * vertices_total, sizeof(float)); - float *verts = (float*)malloc(2 * vertices_total * sizeof(float)); - int msg_width; - float x, x2, y, y2, width, height; - settings_t *settings = config_get_ptr(); - - if (!gl || !settings) - goto end; - - msg_width = font_driver_get_message_width(NULL, msg, strlen(msg), 1.0f); + const unsigned + vertices_total = 6; + float *dummy = (float*)calloc(4 * vertices_total, sizeof(float)); + float *verts = (float*)malloc(2 * vertices_total * sizeof(float)); + settings_t *settings = config_get_ptr(); + int msg_width = + font_driver_get_message_width(NULL, msg, strlen(msg), 1.0f); /* shader driver expects vertex coords as 0..1 */ - x = video_info->font_msg_pos_x; - y = video_info->font_msg_pos_y; - width = msg_width / (float)video_info->width; - height = settings->floats.video_font_size / (float)video_info->height; + float x = video_info->font_msg_pos_x; + float y = video_info->font_msg_pos_y; + float width = msg_width / (float)video_info->width; + float height = + settings->floats.video_font_size / (float)video_info->height; - x2 = 0.005f; /* extend background around text */ - y2 = 0.005f; + float x2 = 0.005f; /* extend background around text */ + float y2 = 0.005f; - x -= x2; - y -= y2; - width += x2; - height += y2; + x -= x2; + y -= y2; + width += x2; + height += y2; - colors[0] = settings->uints.video_msg_bgcolor_red / 255.0f; - colors[1] = settings->uints.video_msg_bgcolor_green / 255.0f; - colors[2] = settings->uints.video_msg_bgcolor_blue / 255.0f; - colors[3] = settings->floats.video_msg_bgcolor_opacity; + colors[0] = settings->uints.video_msg_bgcolor_red / 255.0f; + colors[1] = settings->uints.video_msg_bgcolor_green / 255.0f; + colors[2] = settings->uints.video_msg_bgcolor_blue / 255.0f; + colors[3] = settings->floats.video_msg_bgcolor_opacity; /* triangle 1 */ - verts[0] = x; - verts[1] = y; /* bottom-left */ + verts[0] = x; + verts[1] = y; /* bottom-left */ - verts[2] = x; - verts[3] = y + height; /* top-left */ + verts[2] = x; + verts[3] = y + height; /* top-left */ - verts[4] = x + width; - verts[5] = y + height; /* top-right */ + verts[4] = x + width; + verts[5] = y + height; /* top-right */ /* triangle 2 */ - verts[6] = x; - verts[7] = y; /* bottom-left */ + verts[6] = x; + verts[7] = y; /* bottom-left */ - verts[8] = x + width; - verts[9] = y + height; /* top-right */ + verts[8] = x + width; + verts[9] = y + height; /* top-right */ - verts[10] = x + width; - verts[11] = y; /* bottom-right */ + verts[10] = x + width; + verts[11] = y; /* bottom-right */ - coords.color = dummy; - coords.vertex = verts; - coords.tex_coord = dummy; - coords.lut_tex_coord = dummy; - coords.vertices = vertices_total; + coords.color = dummy; + coords.vertex = verts; + coords.tex_coord = dummy; + coords.lut_tex_coord = dummy; + coords.vertices = vertices_total; coords_data.handle_data = NULL; coords_data.data = &coords; + + video_driver_set_viewport(video_info->width, + video_info->height, true, false); - shader_info.data = NULL; - shader_info.idx = VIDEO_SHADER_STOCK_BLEND; - shader_info.set_active = true; + video_info->cb_shader_use(gl, + video_info->shader_data, VIDEO_SHADER_STOCK_BLEND, true); - video_driver_set_viewport(video_info->width, video_info->height, true, false); - - video_shader_driver_use(shader_info); - video_shader_driver_set_coords(coords_data); + video_driver_set_coords(&coords_data); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glBlendEquation(GL_FUNC_ADD); - mvp.data = gl; - mvp.matrix = &gl->mvp_no_rot; - - video_shader_driver_set_mvp(mvp); + video_info->cb_set_mvp(gl, + video_info->shader_data, &gl->mvp_no_rot); uniform_param.type = UNIFORM_4F; uniform_param.enabled = true; @@ -1036,7 +824,7 @@ static void gl_render_osd_background( uniform_param.lookup.type = SHADER_PROGRAM_FRAGMENT; uniform_param.lookup.ident = "bgcolor"; - uniform_param.lookup.idx = shader_info.idx; + uniform_param.lookup.idx = VIDEO_SHADER_STOCK_BLEND; uniform_param.lookup.add_prefix = true; uniform_param.lookup.enable = true; @@ -1048,7 +836,7 @@ static void gl_render_osd_background( video_shader_driver_set_parameter(uniform_param); glDrawArrays(GL_TRIANGLES, 0, coords.vertices); -end: + /* reset uniform back to zero so it is not used for anything else */ uniform_param.result.f.v0 = 0.0f; uniform_param.result.f.v1 = 0.0f; @@ -1060,7 +848,8 @@ end: free(dummy); free(verts); - video_driver_set_viewport(video_info->width, video_info->height, false, true); + video_driver_set_viewport(video_info->width, + video_info->height, false, true); } static void gl_set_osd_msg(void *data, @@ -1085,35 +874,31 @@ static struct video_shader *gl_get_current_shader(void *data) return shader_info.data; } -#if defined(HAVE_GL_ASYNC_READBACK) static void gl_pbo_async_readback(gl_t *gl) { - glBindBuffer(GL_PIXEL_PACK_BUFFER, +#ifdef HAVE_OPENGLES + GLenum fmt = GL_RGBA; + GLenum type = GL_UNSIGNED_BYTE; +#else + GLenum fmt = GL_BGRA; + GLenum type = GL_UNSIGNED_INT_8_8_8_8_REV; +#endif + + if (gl->renderchain_driver->bind_pbo) + gl->renderchain_driver->bind_pbo( gl->pbo_readback[gl->pbo_readback_index++]); gl->pbo_readback_index &= 3; /* 4 frames back, we can readback. */ gl->pbo_readback_valid[gl->pbo_readback_index] = true; - glPixelStorei(GL_PACK_ROW_LENGTH, 0); - glPixelStorei(GL_PACK_ALIGNMENT, - video_pixel_get_alignment(gl->vp.width * sizeof(uint32_t))); - - /* Read asynchronously into PBO buffer. */ - glReadBuffer(GL_BACK); -#ifdef HAVE_OPENGLES3 - glReadPixels(gl->vp.x, gl->vp.y, - gl->vp.width, gl->vp.height, - GL_RGBA, GL_UNSIGNED_BYTE, NULL); -#else - glReadPixels(gl->vp.x, gl->vp.y, - gl->vp.width, gl->vp.height, - GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, NULL); -#endif - - glBindBuffer(GL_PIXEL_PACK_BUFFER, 0); + if (gl->renderchain_driver->readback) + gl->renderchain_driver->readback(gl, + video_pixel_get_alignment(gl->vp.width * sizeof(uint32_t)), + fmt, type, NULL); + if (gl->renderchain_driver->unbind_pbo) + gl->renderchain_driver->unbind_pbo(); } -#endif static INLINE void gl_draw_texture(gl_t *gl, video_frame_info_t *video_info) { @@ -1122,41 +907,41 @@ static INLINE void gl_draw_texture(gl_t *gl, video_frame_info_t *video_info) unsigned width = video_info->width; unsigned height = video_info->height; - color[ 0] = 1.0f; - color[ 1] = 1.0f; - color[ 2] = 1.0f; - color[ 3] = gl->menu_texture_alpha; - color[ 4] = 1.0f; - color[ 5] = 1.0f; - color[ 6] = 1.0f; - color[ 7] = gl->menu_texture_alpha; - color[ 8] = 1.0f; - color[ 9] = 1.0f; - color[10] = 1.0f; - color[11] = gl->menu_texture_alpha; - color[12] = 1.0f; - color[13] = 1.0f; - color[14] = 1.0f; - color[15] = gl->menu_texture_alpha; + color[ 0] = 1.0f; + color[ 1] = 1.0f; + color[ 2] = 1.0f; + color[ 3] = gl->menu_texture_alpha; + color[ 4] = 1.0f; + color[ 5] = 1.0f; + color[ 6] = 1.0f; + color[ 7] = gl->menu_texture_alpha; + color[ 8] = 1.0f; + color[ 9] = 1.0f; + color[10] = 1.0f; + color[11] = gl->menu_texture_alpha; + color[12] = 1.0f; + color[13] = 1.0f; + color[14] = 1.0f; + color[15] = gl->menu_texture_alpha; - if (!gl->menu_texture) - return; + gl->coords.vertex = vertexes_flipped; + gl->coords.tex_coord = tex_coords; + gl->coords.color = color; - gl->coords.vertex = vertexes_flipped; - gl->coords.tex_coord = tex_coords; - gl->coords.color = color; glBindTexture(GL_TEXTURE_2D, gl->menu_texture); - video_info->cb_shader_use(gl, video_info->shader_data, VIDEO_SHADER_STOCK_BLEND, true); + video_info->cb_shader_use(gl, + video_info->shader_data, VIDEO_SHADER_STOCK_BLEND, true); - gl->coords.vertices = 4; + gl->coords.vertices = 4; - coords.handle_data = NULL; - coords.data = &gl->coords; + coords.handle_data = NULL; + coords.data = &gl->coords; - video_shader_driver_set_coords(coords); + video_driver_set_coords(&coords); - video_info->cb_shader_set_mvp(gl, video_info->shader_data, &gl->mvp_no_rot); + video_info->cb_set_mvp(gl, + video_info->shader_data, &gl->mvp_no_rot); glEnable(GL_BLEND); @@ -1171,9 +956,9 @@ static INLINE void gl_draw_texture(gl_t *gl, video_frame_info_t *video_info) glDisable(GL_BLEND); - gl->coords.vertex = gl->vertex_ptr; - gl->coords.tex_coord = gl->tex_info.coord; - gl->coords.color = gl->white_color_ptr; + gl->coords.vertex = gl->vertex_ptr; + gl->coords.tex_coord = gl->tex_info.coord; + gl->coords.color = gl->white_color_ptr; } #endif @@ -1190,17 +975,14 @@ static bool gl_frame(void *data, const void *frame, gl_t *gl = (gl_t*)data; unsigned width = video_info->width; unsigned height = video_info->height; - settings_t *settings = config_get_ptr(); - if (!gl || !settings) + if (!gl) return false; context_bind_hw_render(false); -#ifndef HAVE_OPENGLES - if (gl_query_core_context_in_use()) - glBindVertexArray(gl->vao); -#endif + if (gl->core_context_in_use && gl->renderchain_driver->bind_vao) + gl->renderchain_driver->bind_vao(gl); video_info->cb_shader_use(gl, video_info->shader_data, 1, true); @@ -1209,16 +991,17 @@ static bool gl_frame(void *data, const void *frame, gl_set_viewport(gl, video_info, width, height, false, true); #endif -#ifdef HAVE_FBO /* Render to texture in first pass. */ if (gl->fbo_inited) { - gl2_renderchain_recompute_pass_sizes( - gl, frame_width, frame_height, - gl->vp_out_width, gl->vp_out_height); - gl2_renderchain_start_render(gl, video_info); + if (gl->renderchain_driver->recompute_pass_sizes) + gl->renderchain_driver->recompute_pass_sizes( + gl, 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); } -#endif if (gl->should_resize) { @@ -1229,19 +1012,20 @@ static bool gl_frame(void *data, const void *frame, mode.width = width; mode.height = height; - video_info->cb_set_resize(video_info->context_data, mode.width, mode.height); + video_info->cb_set_resize(video_info->context_data, + mode.width, mode.height); -#ifdef HAVE_FBO if (gl->fbo_inited) { - gl2_renderchain_check_fbo_dimensions(gl); + if (gl->renderchain_driver->check_fbo_dimensions) + gl->renderchain_driver->check_fbo_dimensions(gl); /* Go back to what we're supposed to do, * render to FBO #0. */ - gl2_renderchain_start_render(gl, video_info); + if (gl->renderchain_driver->start_render) + gl->renderchain_driver->start_render(gl, video_info); } else -#endif gl_set_viewport(gl, video_info, width, height, false, true); } @@ -1253,46 +1037,42 @@ static bool gl_frame(void *data, const void *frame, /* Can be NULL for frame dupe / NULL render. */ if (frame) { -#ifdef HAVE_FBO if (!gl->hw_render_fbo_init) -#endif { gl_update_input_size(gl, frame_width, frame_height, pitch, true); - gl_copy_frame(gl, video_info, frame, frame_width, frame_height, pitch); + + if (gl->renderchain_driver->copy_frame) + gl->renderchain_driver->copy_frame(gl, + video_info, frame, frame_width, frame_height, pitch); } /* No point regenerating mipmaps * if there are no new frames. */ - if (gl->tex_mipmap && gl_check_capability(GL_CAPS_MIPMAP)) + if (gl->tex_mipmap && gl->have_mipmap) glGenerateMipmap(GL_TEXTURE_2D); } /* Have to reset rendering state which libretro core * could easily have overridden. */ -#ifdef HAVE_FBO if (gl->hw_render_fbo_init) { gl_update_input_size(gl, frame_width, frame_height, pitch, false); if (!gl->fbo_inited) { - gl_bind_backbuffer(); + if (gl->renderchain_driver->bind_backbuffer) + gl->renderchain_driver->bind_backbuffer(); gl_set_viewport(gl, video_info, width, height, false, true); } -#ifndef HAVE_OPENGLES - if (!gl_query_core_context_in_use()) - glEnable(GL_TEXTURE_2D); -#endif - glDisable(GL_DEPTH_TEST); + if (gl->renderchain_driver->restore_default_state) + gl->renderchain_driver->restore_default_state(gl); + glDisable(GL_STENCIL_TEST); - glDisable(GL_CULL_FACE); - glDisable(GL_DITHER); glDisable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glBlendEquation(GL_FUNC_ADD); glClearColor(0.0f, 0.0f, 0.0f, 1.0f); } -#endif gl->tex_info.tex = gl->texture[gl->tex_index]; gl->tex_info.input_size[0] = frame_width; @@ -1302,10 +1082,10 @@ static bool gl_frame(void *data, const void *frame, feedback_info = gl->tex_info; -#ifdef HAVE_FBO if (gl->fbo_feedback_enable) { - const struct video_fbo_rect *rect = &gl->fbo_rect[gl->fbo_feedback_pass]; + const struct video_fbo_rect + *rect = &gl->fbo_rect[gl->fbo_feedback_pass]; GLfloat xamt = (GLfloat)rect->img_width / rect->width; GLfloat yamt = (GLfloat)rect->img_height / rect->height; @@ -1317,7 +1097,6 @@ static bool gl_frame(void *data, const void *frame, set_texture_coords(feedback_info.coord, xamt, yamt); } -#endif glClear(GL_COLOR_BUFFER_BIT); @@ -1337,84 +1116,76 @@ static bool gl_frame(void *data, const void *frame, video_shader_driver_set_parameters(params); - gl->coords.vertices = 4; + gl->coords.vertices = 4; coords.handle_data = NULL; coords.data = &gl->coords; - video_shader_driver_set_coords(coords); + video_driver_set_coords(&coords); - video_info->cb_shader_set_mvp(gl, video_info->shader_data, &gl->mvp); + video_info->cb_set_mvp(gl, video_info->shader_data, &gl->mvp); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); -#ifdef HAVE_FBO - if (gl->fbo_inited) - gl2_renderchain_render(gl, video_info, + if (gl->fbo_inited && gl->renderchain_driver->renderchain_render) + gl->renderchain_driver->renderchain_render(gl, video_info, frame_count, &gl->tex_info, &feedback_info); -#endif /* Set prev textures. */ - gl_renderchain_bind_prev_texture(gl, &gl->tex_info); + if (gl->renderchain_driver->bind_prev_texture) + gl->renderchain_driver->bind_prev_texture(gl, &gl->tex_info); #if defined(HAVE_MENU) if (gl->menu_texture_enable) { menu_driver_frame(video_info); - if (gl->menu_texture_enable) + if (gl->menu_texture) gl_draw_texture(gl, video_info); } #endif if (!string_is_empty(msg)) { - if (settings->bools.video_msg_bgcolor_enable) + settings_t *settings = config_get_ptr(); + if (settings && settings->bools.video_msg_bgcolor_enable) gl_render_osd_background(gl, video_info, msg); font_driver_render_msg(video_info, NULL, msg, NULL); } #ifdef HAVE_OVERLAY - if (gl && gl->overlay_enable) + if (gl->overlay_enable) gl_render_overlay(gl, video_info); #endif video_info->cb_update_window_title( video_info->context_data, video_info); -#ifdef HAVE_FBO /* Reset state which could easily mess up libretro core. */ if (gl->hw_render_fbo_init) { video_info->cb_shader_use(gl, video_info->shader_data, 0, true); glBindTexture(GL_TEXTURE_2D, 0); -#ifndef NO_GL_FF_VERTEX - gl_disable_client_arrays(); -#endif + if (gl->renderchain_driver->disable_client_arrays) + gl->renderchain_driver->disable_client_arrays(); } -#endif -#ifndef NO_GL_READ_PIXELS /* Screenshots. */ if (gl->readback_buffer_screenshot) { - glPixelStorei(GL_PACK_ALIGNMENT, 4); -#ifndef HAVE_OPENGLES - glPixelStorei(GL_PACK_ROW_LENGTH, 0); - glReadBuffer(GL_BACK); -#endif - glReadPixels(gl->vp.x, gl->vp.y, - gl->vp.width, gl->vp.height, - GL_RGBA, GL_UNSIGNED_BYTE, gl->readback_buffer_screenshot); + if (gl->renderchain_driver->readback) + gl->renderchain_driver->readback(gl, + 4, GL_RGBA, GL_UNSIGNED_BYTE, + gl->readback_buffer_screenshot); } -#ifdef HAVE_GL_ASYNC_READBACK -#ifdef HAVE_MENU + /* Don't readback if we're in menu mode. */ - else if (gl->pbo_readback_enable && !gl->menu_texture_enable) - gl_pbo_async_readback(gl); -#endif -#endif + else if (gl->pbo_readback_enable) +#ifdef HAVE_MENU + /* Don't readback if we're in menu mode. */ + if (!gl->menu_texture_enable) #endif + gl_pbo_async_readback(gl); /* Disable BFI during fast forward, slow-motion, * and pause to prevent flicker. */ @@ -1430,30 +1201,18 @@ static bool gl_frame(void *data, const void *frame, video_info->cb_swap_buffers(video_info->context_data, video_info); -#ifdef HAVE_GL_SYNC if (video_info->hard_sync && gl->have_sync) { glClear(GL_COLOR_BUFFER_BIT); - gl->fences[gl->fence_count++] = - glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0); - while (gl->fence_count > video_info->hard_sync_frames) - { - glClientWaitSync(gl->fences[0], - GL_SYNC_FLUSH_COMMANDS_BIT, 1000000000); - glDeleteSync(gl->fences[0]); - - gl->fence_count--; - memmove(gl->fences, gl->fences + 1, - gl->fence_count * sizeof(GLsync)); - } + if (gl->renderchain_driver->fence_iterate) + gl->renderchain_driver->fence_iterate(gl, + video_info->hard_sync_frames); } -#endif -#ifndef HAVE_OPENGLES - if (gl_query_core_context_in_use()) - glBindVertexArray(0); -#endif + if (gl->core_context_in_use && + gl->renderchain_driver->unbind_vao) + gl->renderchain_driver->unbind_vao(gl); context_bind_hw_render(true); @@ -1472,10 +1231,23 @@ static void gl_destroy_resources(gl_t *gl) free(gl); } - gl_shared_context_use = false; + gl_shared_context_use = false; + gl_query_core_context_unset(); } +static void gl_deinit_chain(gl_t *gl) +{ + if (!gl || !gl->renderchain_driver) + return; + + if (gl->renderchain_driver->chain_free) + gl->renderchain_driver->chain_free(gl->renderchain_data); + + gl->renderchain_driver = NULL; + gl->renderchain_data = NULL; +} + static void gl_free(void *data) { gl_t *gl = (gl_t*)data; @@ -1484,27 +1256,17 @@ static void gl_free(void *data) context_bind_hw_render(false); -#ifdef HAVE_GL_SYNC if (gl->have_sync) { - unsigned i; - - for (i = 0; i < gl->fence_count; i++) - { - glClientWaitSync(gl->fences[i], - GL_SYNC_FLUSH_COMMANDS_BIT, 1000000000); - glDeleteSync(gl->fences[i]); - } - gl->fence_count = 0; + if (gl->renderchain_driver->fence_free) + gl->renderchain_driver->fence_free(gl); } -#endif font_driver_free_osd(); video_shader_driver_deinit(); -#ifndef NO_GL_FF_VERTEX - gl_disable_client_arrays(); -#endif + if (gl->renderchain_driver->disable_client_arrays) + gl->renderchain_driver->disable_client_arrays(); glDeleteTextures(gl->textures, gl->texture); @@ -1524,25 +1286,23 @@ static void gl_free(void *data) scaler_ctx_gen_reset(&gl->scaler); -#ifdef HAVE_GL_ASYNC_READBACK if (gl->pbo_readback_enable) { glDeleteBuffers(4, gl->pbo_readback); scaler_ctx_gen_reset(&gl->pbo_readback_scaler); } -#endif -#ifdef HAVE_FBO - gl2_renderchain_free(gl); -#endif - -#ifndef HAVE_OPENGLES - if (gl_query_core_context_in_use()) + if (gl->core_context_in_use) { - glBindVertexArray(0); - glDeleteVertexArrays(1, &gl->vao); + if (gl->renderchain_driver->unbind_vao) + gl->renderchain_driver->unbind_vao(gl); + if (gl->renderchain_driver->free_vao) + gl->renderchain_driver->free_vao(gl); } -#endif + + if (gl->renderchain_driver->free) + gl->renderchain_driver->free(gl); + gl_deinit_chain(gl); video_context_driver_free(); @@ -1571,80 +1331,51 @@ static void gl_set_nonblock_state(void *data, bool state) static bool resolve_extensions(gl_t *gl, const char *context_ident) { - settings_t *settings = config_get_ptr(); -#ifndef HAVE_OPENGLES - struct retro_hw_render_callback *hwr = - video_driver_get_hw_context(); + settings_t *settings = config_get_ptr(); - if (hwr->context_type == RETRO_HW_CONTEXT_OPENGL_CORE) - { - gfx_ctx_flags_t flags; - - gl_query_core_context_set(true); - - /** - * Ensure that the rest of the frontend knows we have a core context - */ - flags.flags = 0; - BIT32_SET(flags.flags, GFX_CTX_FLAGS_GL_CORE_CONTEXT); - - video_context_driver_set_flags(&flags); - - RARCH_LOG("[GL]: Using Core GL context.\n"); - if (!gl_check_capability(GL_CAPS_VAO)) - { - RARCH_ERR("[GL]: Failed to initialize VAOs.\n"); - return false; - } - glGenVertexArrays(1, &gl->vao); - } - - /* GL_RGB565 internal format support. + /* have_es2_compat - GL_RGB565 internal format support. * Even though ES2 support is claimed, the format * is not supported on older ATI catalyst drivers. * * The speed gain from using GL_RGB565 is worth * adding some workarounds for. + * + * have_sync - Use ARB_sync to reduce latency. */ - gl->have_es2_compat = gl_check_capability(GL_CAPS_ES2_COMPAT); - gl->have_full_npot_support = gl_check_capability(GL_CAPS_FULL_NPOT_SUPPORT); -#endif + 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); -#ifdef HAVE_GL_SYNC - gl->have_sync = gl_check_capability(GL_CAPS_SYNC); if (gl->have_sync && settings->bools.video_hard_sync) RARCH_LOG("[GL]: Using ARB_sync to reduce latency.\n"); -#endif video_driver_unset_rgba(); -#if defined(HAVE_OPENGLES) && !defined(HAVE_PSGL) - gl->have_full_npot_support = gl_check_capability(GL_CAPS_FULL_NPOT_SUPPORT); +#if defined(HAVE_OPENGLES) && !defined(HAVE_PSGL) if (!gl_check_capability(GL_CAPS_BGRA8888)) { video_driver_set_rgba(); RARCH_WARN("[GL]: GLES implementation does not have BGRA8888 extension.\n" "32-bit path will require conversion.\n"); } - - /* GLES3 has unpack_subimage and sRGB in core. */ - gl->support_unpack_row_length = gl_check_capability(GL_CAPS_UNPACK_ROW_LENGTH); - gl->has_srgb_fbo_gles3 = gl_check_capability(GL_CAPS_SRGB_FBO_ES3); - /* TODO/FIXME - No extensions for float FBO currently. */ #endif - gl->has_fp_fbo = gl_check_capability(GL_CAPS_FP_FBO); - if (settings->bools.video_force_srgb_disable) - gl->has_srgb_fbo = false; - else - gl->has_srgb_fbo = gl_check_capability(GL_CAPS_SRGB_FBO); - #ifdef GL_DEBUG /* Useful for debugging, but kinda obnoxious otherwise. */ RARCH_LOG("[GL]: Supported extensions:\n"); - if (gl_query_core_context_in_use()) + if (gl->core_context_in_use) { #ifdef GL_NUM_EXTENSIONS GLint exts = 0; @@ -1709,60 +1440,56 @@ static INLINE void gl_set_texture_fmts(gl_t *gl, bool rgb32) #endif } -#ifdef HAVE_GL_ASYNC_READBACK -static void gl_init_pbo_readback(gl_t *gl) +static bool gl_init_pbo_readback(gl_t *gl) { unsigned i; - settings_t *settings = config_get_ptr(); - bool *recording_enabled = recording_is_enabled(); -#ifndef HAVE_OPENGLES3 - struct scaler_ctx *scaler = NULL; -#endif - /* Only bother with this if we're doing GPU recording. - * Check recording_is_enabled() and not - * driver.recording_data, because recording is - * not initialized yet. - */ - gl->pbo_readback_enable = settings->bools.video_gpu_record - && *recording_enabled; - - if (!gl->pbo_readback_enable) - return; - - RARCH_LOG("[GL]: Async PBO readback enabled.\n"); + /* If none of these are bound, we have to assume + * we are not going to use PBOs */ + if ( !gl->renderchain_driver->bind_pbo && + !gl->renderchain_driver->unbind_pbo && + !gl->renderchain_driver->init_pbo + ) + return false; glGenBuffers(4, gl->pbo_readback); + for (i = 0; i < 4; i++) { - glBindBuffer(GL_PIXEL_PACK_BUFFER, gl->pbo_readback[i]); - glBufferData(GL_PIXEL_PACK_BUFFER, gl->vp.width * - gl->vp.height * sizeof(uint32_t), - NULL, GL_STREAM_READ); + if (gl->renderchain_driver->bind_pbo) + gl->renderchain_driver->bind_pbo(gl->pbo_readback[i]); + if (gl->renderchain_driver->init_pbo) + gl->renderchain_driver->init_pbo(gl->vp.width * + gl->vp.height * sizeof(uint32_t), NULL); } - glBindBuffer(GL_PIXEL_PACK_BUFFER, 0); + if (gl->renderchain_driver->unbind_pbo) + gl->renderchain_driver->unbind_pbo(); #ifndef HAVE_OPENGLES3 - scaler = &gl->pbo_readback_scaler; - scaler->in_width = gl->vp.width; - scaler->in_height = gl->vp.height; - scaler->out_width = gl->vp.width; - scaler->out_height = gl->vp.height; - scaler->in_stride = gl->vp.width * sizeof(uint32_t); - scaler->out_stride = gl->vp.width * 3; - scaler->in_fmt = SCALER_FMT_ARGB8888; - scaler->out_fmt = SCALER_FMT_BGR24; - scaler->scaler_type = SCALER_TYPE_POINT; - - if (!scaler_ctx_gen_filter(scaler)) { - gl->pbo_readback_enable = false; - RARCH_ERR("[GL]: Failed to initialize pixel conversion for PBO.\n"); - glDeleteBuffers(4, gl->pbo_readback); + struct scaler_ctx *scaler = &gl->pbo_readback_scaler; + scaler->in_width = gl->vp.width; + scaler->in_height = gl->vp.height; + scaler->out_width = gl->vp.width; + scaler->out_height = gl->vp.height; + scaler->in_stride = gl->vp.width * sizeof(uint32_t); + scaler->out_stride = gl->vp.width * 3; + scaler->in_fmt = SCALER_FMT_ARGB8888; + scaler->out_fmt = SCALER_FMT_BGR24; + scaler->scaler_type = SCALER_TYPE_POINT; + + if (!scaler_ctx_gen_filter(scaler)) + { + gl->pbo_readback_enable = false; + RARCH_ERR("[GL]: Failed to initialize pixel conversion for PBO.\n"); + glDeleteBuffers(4, gl->pbo_readback); + return false; + } } #endif + + return true; } -#endif static const gfx_ctx_driver_t *gl_get_context(gl_t *gl) { @@ -1774,20 +1501,20 @@ static const gfx_ctx_driver_t *gl_get_context(gl_t *gl) unsigned minor = hwr->version_minor; #ifdef HAVE_OPENGLES - api = GFX_CTX_OPENGL_ES_API; - api_name = "OpenGL ES 2.0"; + api = GFX_CTX_OPENGL_ES_API; + api_name = "OpenGL ES 2.0"; if (hwr->context_type == RETRO_HW_CONTEXT_OPENGLES3) { - major = 3; - minor = 0; - api_name = "OpenGL ES 3.0"; + major = 3; + minor = 0; + api_name = "OpenGL ES 3.0"; } else if (hwr->context_type == RETRO_HW_CONTEXT_OPENGLES_VERSION) - api_name = "OpenGL ES 3.1+"; + api_name = "OpenGL ES 3.1+"; #else - api = GFX_CTX_OPENGL_API; - api_name = "OpenGL"; + api = GFX_CTX_OPENGL_API; + api_name = "OpenGL"; #endif (void)api_name; @@ -1795,10 +1522,12 @@ static const gfx_ctx_driver_t *gl_get_context(gl_t *gl) gl_shared_context_use = settings->bools.video_shared_context && hwr->context_type != RETRO_HW_CONTEXT_NONE; - if (libretro_get_shared_context() && (hwr->context_type != RETRO_HW_CONTEXT_NONE)) + if ( (libretro_get_shared_context()) + && (hwr->context_type != RETRO_HW_CONTEXT_NONE)) gl_shared_context_use = true; - return video_context_driver_init_first(gl, settings->arrays.video_context_driver, + return video_context_driver_init_first(gl, + settings->arrays.video_context_driver, api, major, minor, gl_shared_context_use); } @@ -1942,6 +1671,7 @@ static void *gl_init(const video_info_t *video, const input_driver_t **input, vo video_shader_ctx_filter_t shader_filter; video_shader_ctx_info_t shader_info; video_shader_ctx_ident_t ident_info; + settings_t *settings = config_get_ptr(); video_shader_ctx_wrap_t wrap_info = {0}; unsigned win_width = 0; unsigned win_height = 0; @@ -1960,25 +1690,27 @@ static void *gl_init(const video_info_t *video, const input_driver_t **input, vo video_context_driver_set((const gfx_ctx_driver_t*)ctx_driver); - gl->video_info = *video; + gl->video_info = *video; RARCH_LOG("[GL]: Found GL context: %s\n", ctx_driver->ident); video_context_driver_get_video_size(&mode); - full_x = mode.width; - full_y = mode.height; + full_x = mode.width; + full_y = mode.height; mode.width = 0; mode.height = 0; + interval = 0; RARCH_LOG("[GL]: Detecting screen resolution %ux%u.\n", full_x, full_y); - interval = video->vsync ? video->swap_interval : 0; + if (video->vsync) + interval = video->swap_interval; video_context_driver_swap_interval(&interval); - win_width = video->width; - win_height = video->height; + win_width = video->width; + win_height = video->height; if (video->fullscreen && (win_width == 0) && (win_height == 0)) { @@ -2010,6 +1742,45 @@ static void *gl_init(const video_info_t *video, const input_driver_t **input, vo rglgen_resolve_symbols(ctx_driver->get_proc_address); #endif + hwr = video_driver_get_hw_context(); + + if (hwr->context_type == RETRO_HW_CONTEXT_OPENGL_CORE) + { + gfx_ctx_flags_t flags; + + gl_query_core_context_set(true); + gl->core_context_in_use = true; + + /** + * Ensure that the rest of the frontend knows we have a core context + */ + flags.flags = 0; + BIT32_SET(flags.flags, GFX_CTX_FLAGS_GL_CORE_CONTEXT); + + video_context_driver_set_flags(&flags); + + RARCH_LOG("[GL]: Using Core GL context, setting up VAO...\n"); + if (!gl_check_capability(GL_CAPS_VAO)) + { + RARCH_ERR("[GL]: Failed to initialize VAOs.\n"); + goto error; + } + } + + if (!renderchain_gl_init_first(&gl->renderchain_driver, + &gl->renderchain_data)) + { + RARCH_ERR("[GL]: Renderchain could not be initialized.\n"); + goto error; + } + + if (gl->renderchain_driver->restore_default_state) + gl->renderchain_driver->restore_default_state(gl); + + if (hwr->context_type == RETRO_HW_CONTEXT_OPENGL_CORE) + if (gl->renderchain_driver->new_vao) + gl->renderchain_driver->new_vao(gl); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glBlendEquation(GL_FUNC_ADD); @@ -2042,18 +1813,18 @@ static void *gl_init(const video_info_t *video, const input_driver_t **input, vo RARCH_LOG("[GL]: Using resolution %ux%u\n", temp_width, temp_height); - hwr = video_driver_get_hw_context(); - - gl->vertex_ptr = hwr->bottom_left_origin + gl->vertex_ptr = hwr->bottom_left_origin ? vertexes : vertexes_flipped; /* Better pipelining with GPU due to synchronous glSubTexImage. * Multiple async PBOs would be an alternative, * but still need multiple textures with PREV. */ - gl->textures = 4; -#ifdef HAVE_FBO - gl->hw_render_use = hwr->context_type != RETRO_HW_CONTEXT_NONE; + gl->textures = 4; + gl->hw_render_use = false; + + if (gl->has_fbo && hwr->context_type != RETRO_HW_CONTEXT_NONE) + gl->hw_render_use = true; if (gl->hw_render_use) { @@ -2066,14 +1837,8 @@ static void *gl_init(const video_info_t *video, const input_driver_t **input, vo context_bind_hw_render(false); #endif } -#endif - gl->white_color_ptr = white_color; -#ifdef HAVE_GLSL - gl_glsl_set_get_proc_address(ctx_driver->get_proc_address); - gl_glsl_set_context_type(gl_query_core_context_in_use(), - hwr->version_major, hwr->version_minor); -#endif + gl->white_color_ptr = white_color; if (!video_shader_driver_init_first()) { @@ -2085,7 +1850,7 @@ static void *gl_init(const video_info_t *video, const input_driver_t **input, vo RARCH_LOG("[GL]: Default shader backend found: %s.\n", ident_info.ident); - if (!gl_shader_init(gl)) + if (!gl_shader_init(gl, ctx_driver, hwr)) { RARCH_ERR("[GL]: Shader initialization failed.\n"); goto error; @@ -2142,15 +1907,6 @@ static void *gl_init(const video_info_t *video, const input_driver_t **input, vo gl_set_texture_fmts(gl, video->rgb32); -#ifndef HAVE_OPENGLES - if (!gl_query_core_context_in_use()) - glEnable(GL_TEXTURE_2D); -#endif - - glDisable(GL_DEPTH_TEST); - glDisable(GL_CULL_FACE); - glDisable(GL_DITHER); - memcpy(gl->tex_info.coord, tex_coords, sizeof(gl->tex_info.coord)); gl->coords.vertex = gl->vertex_ptr; gl->coords.tex_coord = gl->tex_info.coord; @@ -2162,26 +1918,27 @@ static void *gl_init(const video_info_t *video, const input_driver_t **input, vo * the texture with on res change. */ gl->empty_buf = calloc(sizeof(uint32_t), gl->tex_w * gl->tex_h); -#if !defined(HAVE_PSGL) gl->conv_buffer = calloc(sizeof(uint32_t), gl->tex_w * gl->tex_h); if (!gl->conv_buffer) goto error; -#endif gl_init_textures(gl, video); gl_init_textures_data(gl); -#ifdef HAVE_FBO - gl2_renderchain_init(gl, gl->tex_w, gl->tex_h); + if (gl->renderchain_driver->init) + gl->renderchain_driver->init(gl, gl->tex_w, gl->tex_h); - if (gl->hw_render_use && - !gl2_renderchain_init_hw_render(gl, gl->tex_w, gl->tex_h)) + if (gl->has_fbo) { - RARCH_ERR("[GL]: Hardware rendering context initialization failed.\n"); - goto error; + if (gl->hw_render_use && + gl->renderchain_driver->init_hw_render && + !gl->renderchain_driver->init_hw_render(gl, gl->tex_w, gl->tex_h)) + { + RARCH_ERR("[GL]: Hardware rendering context initialization failed.\n"); + goto error; + } } -#endif inp.input = input; inp.input_data = input_data; @@ -2193,9 +1950,18 @@ static void *gl_init(const video_info_t *video, const input_driver_t **input, vo video->is_threaded, FONT_DRIVER_RENDER_OPENGL_API); -#ifdef HAVE_GL_ASYNC_READBACK - gl_init_pbo_readback(gl); -#endif + /* Only bother with PBO readback if we're doing GPU recording. + * Check recording_is_enabled() and not + * driver.recording_data, because recording is + * not initialized yet. + */ + gl->pbo_readback_enable = settings->bools.video_gpu_record + && recording_is_enabled(); + + if (gl->pbo_readback_enable && gl_init_pbo_readback(gl)) + { + RARCH_LOG("[GL]: Async PBO readback enabled.\n"); + } if (!gl_check_error(&error_string)) { @@ -2298,11 +2064,8 @@ static void gl_update_tex_filter_frame(gl_t *gl) if (!gl->texture[i]) continue; - glBindTexture(GL_TEXTURE_2D, gl->texture[i]); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, gl->wrap_mode); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, gl->wrap_mode); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, gl->tex_mag_filter); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, gl->tex_min_filter); + gl_bind_texture(gl->texture[i], gl->wrap_mode, gl->tex_mag_filter, + gl->tex_min_filter); } glBindTexture(GL_TEXTURE_2D, gl->texture[gl->tex_index]); @@ -2345,10 +2108,13 @@ static bool gl_set_shader(void *data, goto error; } -#ifdef HAVE_FBO - gl2_renderchain_deinit_fbo(gl); - glBindTexture(GL_TEXTURE_2D, gl->texture[gl->tex_index]); -#endif + if (gl->fbo_inited) + { + if (gl->renderchain_driver->deinit_fbo) + gl->renderchain_driver->deinit_fbo(gl); + + glBindTexture(GL_TEXTURE_2D, gl->texture[gl->tex_index]); + } init_data.shader_type = type; init_data.shader = NULL; @@ -2375,9 +2141,9 @@ static bool gl_set_shader(void *data, if (textures > gl->textures) /* Have to reinit a bit. */ { -#if defined(HAVE_FBO) - gl2_renderchain_deinit_hw_render(gl); -#endif + if (gl->hw_render_use && gl->fbo_inited && + gl->renderchain_driver->deinit_hw_render) + gl->renderchain_driver->deinit_hw_render(gl); glDeleteTextures(gl->textures, gl->texture); #if defined(HAVE_PSGL) @@ -2390,15 +2156,12 @@ static bool gl_set_shader(void *data, gl_init_textures(gl, &gl->video_info); gl_init_textures_data(gl); -#if defined(HAVE_FBO) - if (gl->hw_render_use) - gl2_renderchain_init_hw_render(gl, gl->tex_w, gl->tex_h); -#endif + if (gl->hw_render_use && gl->renderchain_driver->init_hw_render) + gl->renderchain_driver->init_hw_render(gl, gl->tex_w, gl->tex_h); } -#ifdef HAVE_FBO - gl2_renderchain_init(gl, gl->tex_w, gl->tex_h); -#endif + if (gl->renderchain_driver->init) + gl->renderchain_driver->init(gl, gl->tex_w, gl->tex_h); /* Apparently need to set viewport for passes when we aren't using FBOs. */ gl_set_shader_viewports(gl); @@ -2419,12 +2182,18 @@ error: static void gl_viewport_info(void *data, struct video_viewport *vp) { - gl_renderchain_viewport_info(data, vp); + gl_t *gl = (gl_t*)data; + if (!gl->renderchain_driver || !gl->renderchain_driver->viewport_info) + return; + gl->renderchain_driver->viewport_info(data, vp); } static bool gl_read_viewport(void *data, uint8_t *buffer, bool is_idle) { - return gl_renderchain_read_viewport(data, buffer, 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); } #if 0 @@ -2442,14 +2211,12 @@ unsigned *height_p, size_t *pitch_p) void* buffer = NULL; void* buffer_texture = NULL; -#ifdef HAVE_FBO if (gl->hw_render_use) { buffer = malloc(pitch * height); if (!buffer) return NULL; } -#endif buffer_texture = malloc(pitch * gl->tex_h); @@ -2468,7 +2235,6 @@ unsigned *height_p, size_t *pitch_p) *height_p = height; *pitch_p = pitch; -#ifdef HAVE_FBO if (gl->hw_render_use) { unsigned i; @@ -2480,33 +2246,11 @@ unsigned *height_p, size_t *pitch_p) free(buffer_texture); return buffer; } -#endif + return buffer_texture; } #endif - -bool gl_load_luts(const struct video_shader *shader, - GLuint *textures_lut) -{ - unsigned i; - unsigned num_luts = MIN(shader->luts, GFX_MAX_TEXTURES); - - if (!shader->luts) - return true; - - glGenTextures(num_luts, textures_lut); - - for (i = 0; i < num_luts; i++) - { - if (!gl2_renderchain_add_lut(shader, i, textures_lut)) - return false; - } - - glBindTexture(GL_TEXTURE_2D, 0); - return true; -} - #ifdef HAVE_OVERLAY static bool gl_overlay_load(void *data, const void *image_data, unsigned num_images) @@ -2522,7 +2266,8 @@ static bool gl_overlay_load(void *data, context_bind_hw_render(false); gl_free_overlay(gl); - gl->overlay_tex = (GLuint*)calloc(num_images, sizeof(*gl->overlay_tex)); + gl->overlay_tex = (GLuint*) + calloc(num_images, sizeof(*gl->overlay_tex)); if (!gl->overlay_tex) { @@ -2774,7 +2519,27 @@ static void gl_unload_texture(void *data, uintptr_t id) glDeleteTextures(1, &glid); } +static void gl_set_coords(void *handle_data, void *shader_data, + const struct video_coords *coords) +{ + gl_t *gl = (gl_t*)handle_data; + if (gl && gl->renderchain_driver->set_coords) + gl->renderchain_driver->set_coords(handle_data, + shader_data, coords); +} + +static void gl_set_mvp(void *data, void *shader_data, + const void *mat_data) +{ + gl_t *gl = (gl_t*)data; + if (gl && gl->renderchain_driver->set_mvp) + gl->renderchain_driver->set_mvp(data, + shader_data, mat_data); +} + static const video_poke_interface_t gl_poke_interface = { + gl_set_coords, + gl_set_mvp, gl_load_texture, gl_unload_texture, gl_set_video_mode, @@ -2782,11 +2547,7 @@ static const video_poke_interface_t gl_poke_interface = { gl_get_video_output_size, gl_get_video_output_prev, gl_get_video_output_next, -#ifdef HAVE_FBO gl_get_current_framebuffer, -#else - NULL, -#endif gl_get_proc_address, gl_set_aspect_ratio, gl_apply_state_changes, diff --git a/gfx/drivers/gl_symlinks.h b/gfx/drivers/gl_symlinks.h index 3af2df78c4..8628698f3e 100644 --- a/gfx/drivers/gl_symlinks.h +++ b/gfx/drivers/gl_symlinks.h @@ -27,7 +27,7 @@ #include "config.h" #endif -#if defined(HAVE_FBO) && defined(HAVE_PSGL) +#if defined(HAVE_PSGL) #define glGenFramebuffers glGenFramebuffersOES #define glBindFramebuffer glBindFramebufferOES #define glFramebufferTexture2D glFramebufferTexture2DOES @@ -40,12 +40,6 @@ #define glDeleteRenderbuffers glDeleteRenderbuffersOES #endif -#if (!defined(HAVE_OPENGLES) || defined(HAVE_OPENGLES3)) -#ifdef GL_PIXEL_PACK_BUFFER -#define HAVE_GL_ASYNC_READBACK -#endif -#endif - #if defined(HAVE_PSGL) #define RARCH_GL_FRAMEBUFFER GL_FRAMEBUFFER_OES #define RARCH_GL_FRAMEBUFFER_COMPLETE GL_FRAMEBUFFER_COMPLETE_OES @@ -98,14 +92,10 @@ #define glGenerateMipmap glGenerateMipmapOES #endif -#ifdef HAVE_FBO - #if defined(__APPLE__) || defined(HAVE_PSGL) #define GL_RGBA32F GL_RGBA32F_ARB #endif -#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. */ @@ -152,23 +142,6 @@ #define RARCH_GL_FORMAT16_565 GL_UNSIGNED_SHORT_5_6_5 #endif -/* Platform specific workarounds/hacks. */ -#if defined(__CELLOS_LV2__) -#define NO_GL_READ_PIXELS -#endif - -#if defined(HAVE_OPENGL_MODERN) || defined(HAVE_OPENGLES2) || defined(HAVE_OPENGLES3) || defined(HAVE_OPENGLES_3_1) || defined(HAVE_OPENGLES_3_2) || defined(HAVE_PSGL) - -#ifndef NO_GL_FF_VERTEX -#define NO_GL_FF_VERTEX -#endif - -#ifndef NO_GL_FF_MATRIX -#define NO_GL_FF_MATRIX -#endif - -#endif - #if defined(HAVE_OPENGLES2) /* TODO: Figure out exactly what. */ #define NO_GL_CLAMP_TO_BORDER #endif diff --git a/gfx/drivers/gx_gfx.c b/gfx/drivers/gx_gfx.c index b295c6931b..bf7727909e 100644 --- a/gfx/drivers/gx_gfx.c +++ b/gfx/drivers/gx_gfx.c @@ -1262,6 +1262,8 @@ static void gx_get_video_output_next(void *data) } static const video_poke_interface_t gx_poke_interface = { + NULL, /* set_coords */ + NULL, /* set_mvp */ NULL, NULL, gx_set_video_mode, diff --git a/gfx/drivers/omap_gfx.c b/gfx/drivers/omap_gfx.c index 1adb488de1..e18d582758 100644 --- a/gfx/drivers/omap_gfx.c +++ b/gfx/drivers/omap_gfx.c @@ -1130,6 +1130,8 @@ static void omap_gfx_set_texture_enable(void *data, bool state, bool full_screen } static const video_poke_interface_t omap_gfx_poke_interface = { + NULL, /* set_coords */ + NULL, /* set_mvp */ NULL, NULL, NULL, diff --git a/gfx/drivers/psp1_gfx.c b/gfx/drivers/psp1_gfx.c index 1789aea993..128fab83b5 100644 --- a/gfx/drivers/psp1_gfx.c +++ b/gfx/drivers/psp1_gfx.c @@ -831,6 +831,8 @@ static void psp_viewport_info(void *data, struct video_viewport *vp) } static const video_poke_interface_t psp_poke_interface = { + NULL, /* set_coords */ + NULL, /* set_mvp */ NULL, NULL, NULL, diff --git a/gfx/drivers/sdl2_gfx.c b/gfx/drivers/sdl2_gfx.c index d7c479d9e1..8431ebb531 100644 --- a/gfx/drivers/sdl2_gfx.c +++ b/gfx/drivers/sdl2_gfx.c @@ -718,6 +718,8 @@ static void sdl2_grab_mouse_toggle(void *data) #endif static video_poke_interface_t sdl2_video_poke_interface = { + NULL, /* set_coords */ + NULL, /* set_mvp */ NULL, NULL, NULL, diff --git a/gfx/drivers/sdl_gfx.c b/gfx/drivers/sdl_gfx.c index 9154acc628..7f2060296c 100644 --- a/gfx/drivers/sdl_gfx.c +++ b/gfx/drivers/sdl_gfx.c @@ -517,6 +517,8 @@ static void sdl_grab_mouse_toggle(void *data) } static const video_poke_interface_t sdl_poke_interface = { + NULL, /* set_coords */ + NULL, /* set_mvp */ NULL, NULL, NULL, diff --git a/gfx/drivers/sunxi_gfx.c b/gfx/drivers/sunxi_gfx.c index 845850b2b8..90a9eadbc5 100644 --- a/gfx/drivers/sunxi_gfx.c +++ b/gfx/drivers/sunxi_gfx.c @@ -932,6 +932,8 @@ static void sunxi_set_aspect_ratio (void *data, unsigned aspect_ratio_idx) } static const video_poke_interface_t sunxi_poke_interface = { + NULL, /* set_coords */ + NULL, /* set_mvp */ NULL, NULL, NULL, /* set_video_mode */ diff --git a/gfx/drivers/vga_gfx.c b/gfx/drivers/vga_gfx.c index 1d828e0d9c..9bbf431186 100644 --- a/gfx/drivers/vga_gfx.c +++ b/gfx/drivers/vga_gfx.c @@ -392,6 +392,8 @@ static void vga_set_osd_msg(void *data, } static const video_poke_interface_t vga_poke_interface = { + NULL, /* set_coords */ + NULL, /* set_mvp */ NULL, NULL, NULL, @@ -399,11 +401,7 @@ static const video_poke_interface_t vga_poke_interface = { NULL, NULL, NULL, -#ifdef HAVE_FBO NULL, -#else - NULL, -#endif NULL, NULL, NULL, diff --git a/gfx/drivers/vita2d_gfx.c b/gfx/drivers/vita2d_gfx.c index bd8af133e2..8cc1ba72be 100644 --- a/gfx/drivers/vita2d_gfx.c +++ b/gfx/drivers/vita2d_gfx.c @@ -779,6 +779,8 @@ static bool vita_get_current_sw_framebuffer(void *data, } static const video_poke_interface_t vita_poke_interface = { + NULL, /* set_coords */ + NULL, /* set_mvp */ vita_load_texture, vita_unload_texture, NULL, diff --git a/gfx/drivers/vulkan.c b/gfx/drivers/vulkan.c index b954d34cbe..45be4a4e70 100644 --- a/gfx/drivers/vulkan.c +++ b/gfx/drivers/vulkan.c @@ -2242,6 +2242,8 @@ static void vulkan_unload_texture(void *data, uintptr_t handle) } static const video_poke_interface_t vulkan_poke_interface = { + NULL, /* set_coords */ + NULL, /* set_mvp */ vulkan_load_texture, vulkan_unload_texture, vulkan_set_video_mode, diff --git a/gfx/drivers/wiiu_gfx.c b/gfx/drivers/wiiu_gfx.c index 069acfe3d4..16907200b4 100644 --- a/gfx/drivers/wiiu_gfx.c +++ b/gfx/drivers/wiiu_gfx.c @@ -51,7 +51,7 @@ static const wiiu_render_mode_t wiiu_render_mode_map[] = {1920, 1080, GX2_TV_RENDER_MODE_WIDE_1080P} /* GX2_TV_SCAN_MODE_1080P */ }; -static int wiiu_set_position(position_t* position, GX2ColorBuffer* draw_buffer, float x0, float y0, float x1, float y1) +static void wiiu_set_position(position_t* position, GX2ColorBuffer* draw_buffer, float x0, float y0, float x1, float y1) { position[0].x = (2.0f * x0 / draw_buffer->surface.width) - 1.0f; position[0].y = (2.0f * y0 / draw_buffer->surface.height) - 1.0f; @@ -194,7 +194,6 @@ static void wiiu_gfx_set_aspect_ratio(void* data, unsigned aspect_ratio_idx) static void* wiiu_gfx_init(const video_info_t* video, const input_driver_t** input, void** input_data) { - int i; float refresh_rate = 60.0f / 1.001f; u32 size = 0; u32 tmp = 0; @@ -387,9 +386,9 @@ static void* wiiu_gfx_init(const video_info_t* video, wiiu->vertex_cache.size = 0x1000; wiiu->vertex_cache.current = 0; - wiiu->vertex_cache.positions = MEM2_alloc(wiiu->vertex_cache.size + wiiu->vertex_cache.positions = MEM2_alloc(wiiu->vertex_cache.size * sizeof(position_t), GX2_VERTEX_BUFFER_ALIGNMENT); - wiiu->vertex_cache.tex_coords = MEM2_alloc(wiiu->vertex_cache.size + wiiu->vertex_cache.tex_coords = MEM2_alloc(wiiu->vertex_cache.size * sizeof(tex_coord_t), GX2_VERTEX_BUFFER_ALIGNMENT); /* Initialize samplers */ @@ -498,7 +497,7 @@ static bool wiiu_gfx_frame(void* data, const void* frame, static u32 lastTick , currentTick; u32 diff; #endif - int i; + uint32_t i; wiiu_video_t* wiiu = (wiiu_video_t*) data; (void)msg; @@ -572,7 +571,7 @@ static bool wiiu_gfx_frame(void* data, const void* frame, for (i = 0; i < height; i++) { - int j; + uint32_t j; for(j = 0; j < width; j++) dst[j] = src[j]; dst += wiiu->texture.surface.pitch; @@ -725,7 +724,7 @@ static bool wiiu_gfx_read_viewport(void* data, uint8_t* buffer, bool is_idle) static uintptr_t wiiu_gfx_load_texture(void* video_data, void* data, bool threaded, enum texture_filter_type filter_type) { - int i; + uint32_t i; wiiu_video_t* wiiu = (wiiu_video_t*) video_data; struct texture_image *image = (struct texture_image*)data; @@ -785,7 +784,7 @@ static void wiiu_gfx_apply_state_changes(void* data) static void wiiu_gfx_set_texture_frame(void* data, const void* frame, bool rgb32, unsigned width, unsigned height, float alpha) { - int i; + uint32_t i; const uint16_t *src = NULL; uint16_t *dst = NULL; wiiu_video_t* wiiu = (wiiu_video_t*) data; @@ -849,15 +848,17 @@ static void wiiu_gfx_set_osd_msg(void* data, static const video_poke_interface_t wiiu_poke_interface = { + NULL, /* set_coords */ + NULL, /* set_mvp */ wiiu_gfx_load_texture, wiiu_gfx_unload_texture, - NULL, + NULL, /* set_video_mode */ wiiu_gfx_set_filtering, NULL, /* get_video_output_size */ NULL, /* get_video_output_prev */ NULL, /* get_video_output_next */ NULL, /* get_current_framebuffer */ - NULL, + NULL, /* get_proc_address */ wiiu_gfx_set_aspect_ratio, wiiu_gfx_apply_state_changes, #ifdef HAVE_MENU @@ -865,9 +866,11 @@ static const video_poke_interface_t wiiu_poke_interface = #endif wiiu_gfx_set_texture_enable, wiiu_gfx_set_osd_msg, - NULL, - NULL, - NULL + NULL, /* show_mouse */ + NULL, /* grab_mouse_toggle */ + NULL, /* get_current_shader */ + NULL, /* get_current_software_framebuffer */ + NULL, /* get_hw_render_interface */ }; static void wiiu_gfx_get_poke_interface(void* data, @@ -898,4 +901,5 @@ video_driver_t video_wiiu = NULL, /* overlay_interface */ #endif wiiu_gfx_get_poke_interface, + NULL, /* wrap_type_to_enum */ }; diff --git a/gfx/drivers/xshm_gfx.c b/gfx/drivers/xshm_gfx.c index a2ca8416ec..75882f5f21 100644 --- a/gfx/drivers/xshm_gfx.c +++ b/gfx/drivers/xshm_gfx.c @@ -205,6 +205,8 @@ static void xshm_grab_mouse_toggle(void *data) #endif static video_poke_interface_t xshm_video_poke_interface = { + NULL, /* set_coords */ + NULL, /* set_mvp */ NULL, NULL, NULL, diff --git a/gfx/drivers_context/drm_ctx.c b/gfx/drivers_context/drm_ctx.c index 5c4882bd9d..e5eb203075 100644 --- a/gfx/drivers_context/drm_ctx.c +++ b/gfx/drivers_context/drm_ctx.c @@ -28,13 +28,13 @@ #include #include #include +#include #include #include #include #include -#include #include #include "../../configuration.h" @@ -80,7 +80,7 @@ typedef struct gfx_ctx_drm_data #ifdef HAVE_EGL egl_ctx_data_t egl; #endif - RFILE *drm; + int fd; unsigned interval; unsigned fb_width; unsigned fb_height; @@ -294,12 +294,14 @@ static void free_drm_resources(gfx_ctx_drm_data_t *drm) drm_free(); - if (drm->drm) + if (drm->fd >= 0) + { if (g_drm_fd >= 0) { drmDropMaster(g_drm_fd); - filestream_close(drm->drm); + close(drm->fd); } + } g_gbm_surface = NULL; g_gbm_dev = NULL; @@ -353,6 +355,7 @@ static void *gfx_ctx_drm_init(video_frame_info_t *video_info, void *video_driver if (!drm) return NULL; + drm->fd = -1; gpu_descriptors = dir_list_new("/dev/dri", NULL, false, true, false, false); @@ -366,14 +369,14 @@ nextgpu: } gpu = gpu_descriptors->elems[gpu_index++].data; - drm->drm = filestream_open(gpu, RFILE_MODE_READ_WRITE, -1); - if (!drm->drm) + drm->fd = open(gpu, O_RDWR); + if (drm->fd < 0) { RARCH_WARN("[KMS]: Couldn't open DRM device.\n"); goto nextgpu; } - fd = filestream_get_fd(drm->drm); + fd = drm->fd; if (!drm_get_resources(fd)) goto nextgpu; diff --git a/gfx/drivers_context/mali_fbdev_ctx.c b/gfx/drivers_context/mali_fbdev_ctx.c index 42234bfd56..e9b97dbe78 100644 --- a/gfx/drivers_context/mali_fbdev_ctx.c +++ b/gfx/drivers_context/mali_fbdev_ctx.c @@ -17,13 +17,13 @@ #include #include +#include +#include /* Includes and defines for framebuffer size retrieval */ #include #include -#include - #ifdef HAVE_CONFIG_H #include "../../config.h" #endif @@ -56,8 +56,7 @@ static enum gfx_ctx_api mali_api = GFX_CTX_NONE; static void gfx_ctx_mali_fbdev_destroy(void *data) { - int fb; - RFILE *fd = NULL; + int fd; mali_ctx_data_t *mali = (mali_ctx_data_t*)data; if (mali) @@ -71,12 +70,11 @@ static void gfx_ctx_mali_fbdev_destroy(void *data) } /* Clear framebuffer and set cursor on again */ - fd = filestream_open("/dev/tty", RFILE_MODE_READ_WRITE, -1); - fb = filestream_get_fd(fd); + fd = open("/dev/tty", O_RDWR); + ioctl(fd, VT_ACTIVATE, 5); + ioctl(fd, VT_ACTIVATE, 1); + close(fd); - ioctl(fb, VT_ACTIVATE,5); - ioctl(fb, VT_ACTIVATE,1); - filestream_close(fd); system("setterm -cursor on"); } @@ -160,16 +158,16 @@ static bool gfx_ctx_mali_fbdev_set_video_mode(void *data, EGL_NONE }; mali_ctx_data_t *mali = (mali_ctx_data_t*)data; - RFILE *fd = filestream_open("/dev/fb0", RFILE_MODE_READ_WRITE, -1); - int fb = filestream_get_fd(fd); + int fd = open("/dev/fb0", O_RDWR); - if (ioctl(fb, FBIOGET_VSCREENINFO, &vinfo) < 0) + if (ioctl(fd, FBIOGET_VSCREENINFO, &vinfo) < 0) { RARCH_ERR("Error obtaining framebuffer info.\n"); goto error; } - filestream_close(fd); + close(fd); + fd = -1; width = vinfo.xres; height = vinfo.yres; @@ -196,8 +194,8 @@ static bool gfx_ctx_mali_fbdev_set_video_mode(void *data, return true; error: - if (fd) - filestream_close(fd); + if (fd >= 0) + close(fd); RARCH_ERR("[Mali fbdev]: EGL error: %d.\n", eglGetError()); gfx_ctx_mali_fbdev_destroy(data); return false; diff --git a/gfx/drivers_context/vc_egl_ctx.c b/gfx/drivers_context/vc_egl_ctx.c index 911ba2d71e..26e1b695f4 100644 --- a/gfx/drivers_context/vc_egl_ctx.c +++ b/gfx/drivers_context/vc_egl_ctx.c @@ -198,11 +198,13 @@ static void *gfx_ctx_vc_init(video_frame_info_t *video_info, void *video_driver) /* If we set this env variable, Broadcom's EGL implementation will block * on vsync with a double buffer when we call eglSwapBuffers. Less input lag! - * Has to be done before any EGL call. */ - /*if (video_info->max_swapchain_images <= 2) + * Has to be done before any EGL call. + * NOTE this is commented out because it should be the right way to do it, but + * currently it doesn't work, so we are using an vsync callback based solution.*/ + /* if (video_info->max_swapchain_images <= 2) setenv("V3D_DOUBLE_BUFFER", "1", 1); else - setenv("V3D_DOUBLE_BUFFER", "0", 1);*/ + setenv("V3D_DOUBLE_BUFFER", "0", 1); */ bcm_host_init(); @@ -464,6 +466,10 @@ static void gfx_ctx_vc_destroy(void *data) vc->vgimage[i] = 0; } + /* Stop generating vsync callbacks if we are doing so. Don't destroy the context while cbs are being generated! */ + if (vc->vsync_callback_set) { + vc_dispmanx_vsync_callback(vc->dispman_display, NULL, NULL); + } /* Destroy mutexes and conditions. */ slock_free(vc->vsync_condition_mutex); scond_free(vc->vsync_condition); @@ -629,7 +635,7 @@ static void gfx_ctx_vc_swap_buffers(void *data, void *data2) #ifdef HAVE_EGL egl_swap_buffers(&vc->egl); - /* Wait for vsync immediately if we don't wait egl_swap_buffers to triple-buffer */ + /* Wait for vsync immediately if we don't want egl_swap_buffers to triple-buffer */ if (video_info->max_swapchain_images <= 2) { /* We DON'T wait to wait without callback function ready! */ if(!vc->vsync_callback_set) { diff --git a/gfx/drivers_context/wayland_ctx.c b/gfx/drivers_context/wayland_ctx.c index f4b272145a..6c7b8be4be 100644 --- a/gfx/drivers_context/wayland_ctx.c +++ b/gfx/drivers_context/wayland_ctx.c @@ -480,22 +480,22 @@ static void registry_handle_global(void *data, struct wl_registry *reg, (void)version; - if (string_is_equal_fast(interface, "wl_compositor", 13)) + if (string_is_equal(interface, "wl_compositor")) wl->compositor = (struct wl_compositor*)wl_registry_bind(reg, id, &wl_compositor_interface, 3); - else if (string_is_equal_fast(interface, "wl_output", 9)) + else if (string_is_equal(interface, "wl_output")) { output = (struct wl_output*)wl_registry_bind(reg, id, &wl_output_interface, 2); wl_output_add_listener(output, &output_listener, wl); wl_display_roundtrip(wl->input.dpy); } - else if (string_is_equal_fast(interface, "wl_shell", 8)) + else if (string_is_equal(interface, "wl_shell")) wl->shell = (struct wl_shell*) wl_registry_bind(reg, id, &wl_shell_interface, 1); - else if (string_is_equal_fast(interface, "wl_shm", 6)) + else if (string_is_equal(interface, "wl_shm")) wl->shm = (struct wl_shm*)wl_registry_bind(reg, id, &wl_shm_interface, 1); - else if (string_is_equal_fast(interface, "wl_seat", 7)) + else if (string_is_equal(interface, "wl_seat")) { wl->seat = (struct wl_seat*)wl_registry_bind(reg, id, &wl_seat_interface, 4); wl_seat_add_listener(wl->seat, &seat_listener, wl); diff --git a/gfx/drivers_font/caca_font.c b/gfx/drivers_font/caca_font.c index af2e17cf29..6d6f37196a 100644 --- a/gfx/drivers_font/caca_font.c +++ b/gfx/drivers_font/caca_font.c @@ -129,12 +129,6 @@ static void caca_render_msg(video_frame_info_t *video_info, caca_refresh_display(*font->caca->caca_display); } -static void caca_font_flush_block(unsigned width, unsigned height, - void* data) -{ - (void)data; -} - static void caca_font_bind_block(void* data, void* userdata) { (void)data; @@ -147,6 +141,6 @@ font_renderer_t caca_font = { "caca font", caca_font_get_glyph, /* get_glyph */ caca_font_bind_block, /* bind_block */ - caca_font_flush_block, /* flush */ + NULL, /* flush */ caca_get_message_width /* get_message_width */ }; diff --git a/gfx/drivers_font/ctr_font.c b/gfx/drivers_font/ctr_font.c index ea3b1e28c5..e78054768b 100644 --- a/gfx/drivers_font/ctr_font.c +++ b/gfx/drivers_font/ctr_font.c @@ -441,11 +441,6 @@ static const struct font_glyph* ctr_font_get_glyph( return font->font_driver->get_glyph((void*)font->font_driver, code); } -static void ctr_font_flush_block(unsigned width, unsigned height, void* data) -{ - (void)data; -} - static void ctr_font_bind_block(void* data, void* userdata) { (void)data; @@ -460,6 +455,6 @@ font_renderer_t ctr_font = "ctrfont", ctr_font_get_glyph, ctr_font_bind_block, - ctr_font_flush_block, + NULL, /* flush_block */ ctr_font_get_message_width, }; diff --git a/gfx/drivers_font/gdi_font.c b/gfx/drivers_font/gdi_font.c index 479a86f4d1..c89eb99df9 100644 --- a/gfx/drivers_font/gdi_font.c +++ b/gfx/drivers_font/gdi_font.c @@ -140,7 +140,8 @@ static void gdi_render_msg( SelectObject(font->gdi->memDC, font->gdi->bmp_old); } -static void gdi_font_flush_block(unsigned width, unsigned height, void* data) +static void gdi_font_flush_block(unsigned width, unsigned height, void* data, + video_frame_info_t *video_info) { (void)data; } diff --git a/gfx/drivers_font/gl_raster_font.c b/gfx/drivers_font/gl_raster_font.c index d9b110378f..16a2bbc55f 100644 --- a/gfx/drivers_font/gl_raster_font.c +++ b/gfx/drivers_font/gl_raster_font.c @@ -118,7 +118,7 @@ static bool gl_raster_font_upload_atlas(gl_raster_t *font) #if defined(GL_VERSION_3_0) struct retro_hw_render_callback *hwr = video_driver_get_hw_context(); - if (gl_query_core_context_in_use() || + if (font->gl->core_context_in_use || (hwr->context_type == RETRO_HW_CONTEXT_OPENGL && hwr->version_major >= 3)) { @@ -190,11 +190,8 @@ static void *gl_raster_font_init_font(void *data, video_context_driver_make_current(false); glGenTextures(1, &font->tex); - glBindTexture(GL_TEXTURE_2D, font->tex); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + + gl_bind_texture(font->tex, GL_CLAMP_TO_EDGE, GL_LINEAR, GL_LINEAR); font->atlas = font->font_driver->get_atlas(font->font_data); font->tex_width = next_pow2(font->atlas->width); @@ -247,9 +244,9 @@ static int gl_get_message_width(void *data, const char *msg, return delta_x * scale; } -static void gl_raster_font_draw_vertices(gl_raster_t *font, const video_coords_t *coords) +static void gl_raster_font_draw_vertices(gl_raster_t *font, const video_coords_t *coords, + video_frame_info_t *video_info) { - video_shader_ctx_mvp_t mvp; video_shader_ctx_coords_t coords_data; if (font->atlas->dirty) @@ -261,12 +258,10 @@ static void gl_raster_font_draw_vertices(gl_raster_t *font, const video_coords_t coords_data.handle_data = NULL; coords_data.data = coords; - video_shader_driver_set_coords(coords_data); + video_driver_set_coords(&coords_data); - mvp.data = font->gl; - mvp.matrix = &font->gl->mvp_no_rot; - - video_shader_driver_set_mvp(mvp); + video_info->cb_set_mvp(font->gl, + video_info->shader_data, &font->gl->mvp_no_rot); glDrawArrays(GL_TRIANGLES, 0, coords->vertices); } @@ -274,7 +269,8 @@ static void gl_raster_font_draw_vertices(gl_raster_t *font, const video_coords_t static void gl_raster_font_render_line( gl_raster_t *font, const char *msg, unsigned msg_len, GLfloat scale, const GLfloat color[4], GLfloat pos_x, - GLfloat pos_y, unsigned text_align) + GLfloat pos_y, unsigned text_align, + video_frame_info_t *video_info) { unsigned i; struct video_coords coords; @@ -349,14 +345,15 @@ static void gl_raster_font_render_line( if (font->block) video_coord_array_append(&font->block->carr, &coords, coords.vertices); else - gl_raster_font_draw_vertices(font, &coords); + gl_raster_font_draw_vertices(font, &coords, video_info); } } static void gl_raster_font_render_message( gl_raster_t *font, const char *msg, GLfloat scale, const GLfloat color[4], GLfloat pos_x, GLfloat pos_y, - unsigned text_align) + unsigned text_align, + video_frame_info_t *video_info) { float line_height; int lines = 0; @@ -366,7 +363,8 @@ static void gl_raster_font_render_message( { gl_raster_font_render_line(font, msg, (unsigned)strlen(msg), scale, color, pos_x, - pos_y, text_align); + pos_y, text_align, + video_info); return; } @@ -382,7 +380,8 @@ static void gl_raster_font_render_message( /* Draw the line */ gl_raster_font_render_line(font, msg, msg_len, scale, color, pos_x, - pos_y - (float)lines*line_height, text_align); + pos_y - (float)lines*line_height, text_align, + video_info); if (!delim) break; @@ -490,11 +489,13 @@ static void gl_raster_font_render_msg( if (font->gl) gl_raster_font_render_message(font, msg, scale, color_dark, x + scale * drop_x / font->gl->vp.width, y + - scale * drop_y / font->gl->vp.height, text_align); + scale * drop_y / font->gl->vp.height, text_align, + video_info); } if (font->gl) - gl_raster_font_render_message(font, msg, scale, color, x, y, text_align); + gl_raster_font_render_message(font, msg, scale, color, + x, y, text_align, video_info); } if (!font->block && font->gl) @@ -520,7 +521,7 @@ static const struct font_glyph *gl_raster_font_get_glyph( } static void gl_raster_font_flush_block(unsigned width, unsigned height, - void *data) + void *data, video_frame_info_t *video_info) { gl_raster_t *font = (gl_raster_t*)data; video_font_raster_block_t *block = font ? font->block : NULL; @@ -529,7 +530,8 @@ static void gl_raster_font_flush_block(unsigned width, unsigned height, return; gl_raster_font_setup_viewport(width, height, font, block->fullscreen); - gl_raster_font_draw_vertices(font, (video_coords_t*)&block->carr.coords); + gl_raster_font_draw_vertices(font, (video_coords_t*)&block->carr.coords, + video_info); if (font->gl) { diff --git a/gfx/drivers_font/vga_font.c b/gfx/drivers_font/vga_font.c index 2a8f032602..229186e3c7 100644 --- a/gfx/drivers_font/vga_font.c +++ b/gfx/drivers_font/vga_font.c @@ -129,12 +129,6 @@ static void vga_render_msg(video_frame_info_t *video_info, } } -static void vga_font_flush_block(unsigned width, unsigned height, - void* data) -{ - (void)data; -} - static void vga_font_bind_block(void* data, void* userdata) { (void)data; @@ -147,6 +141,6 @@ font_renderer_t vga_font = { "vga font", vga_font_get_glyph, /* get_glyph */ vga_font_bind_block, /* bind_block */ - vga_font_flush_block, /* flush */ + NULL, /* flush */ vga_get_message_width /* get_message_width */ }; diff --git a/gfx/drivers_font/vita2d_font.c b/gfx/drivers_font/vita2d_font.c index 87f903d27c..7a4777a3eb 100644 --- a/gfx/drivers_font/vita2d_font.c +++ b/gfx/drivers_font/vita2d_font.c @@ -346,12 +346,6 @@ static const struct font_glyph *vita2d_font_get_glyph( return font->font_driver->get_glyph((void*)font->font_driver, code); } -static void vita2d_font_flush_block(unsigned width, unsigned height, - void *data) -{ - (void)data; -} - static void vita2d_font_bind_block(void *data, void *userdata) { (void)data; @@ -364,6 +358,6 @@ font_renderer_t vita2d_vita_font = { "vita2dfont", vita2d_font_get_glyph, vita2d_font_bind_block, - vita2d_font_flush_block, + NULL, /* flush */ vita2d_font_get_message_width, }; diff --git a/gfx/drivers_font/vulkan_raster_font.c b/gfx/drivers_font/vulkan_raster_font.c index 871c5f6e4c..5897637f12 100644 --- a/gfx/drivers_font/vulkan_raster_font.c +++ b/gfx/drivers_font/vulkan_raster_font.c @@ -436,7 +436,7 @@ static const struct font_glyph *vulkan_raster_font_get_glyph( } static void vulkan_raster_font_flush_block(unsigned width, unsigned height, - void *data) + void *data, video_frame_info_t *video_info) { (void)data; } diff --git a/gfx/drivers_font/wiiu_font.c b/gfx/drivers_font/wiiu_font.c index cc0c1dc3e2..4efa3f7148 100644 --- a/gfx/drivers_font/wiiu_font.c +++ b/gfx/drivers_font/wiiu_font.c @@ -40,7 +40,7 @@ typedef struct static void* wiiu_font_init_font(void* data, const char* font_path, float font_size, bool is_threaded) { - int i; + uint32_t i; wiiu_font_t* font = (wiiu_font_t*)calloc(1, sizeof(*font)); if (!font) @@ -401,11 +401,6 @@ static const struct font_glyph* wiiu_font_get_glyph( return font->font_driver->get_glyph((void*)font->font_driver, code); } -static void wiiu_font_flush_block(unsigned width, unsigned height, void* data) -{ - (void)data; -} - static void wiiu_font_bind_block(void* data, void* userdata) { (void)data; @@ -420,6 +415,6 @@ font_renderer_t wiiu_font = "wiiufont", wiiu_font_get_glyph, wiiu_font_bind_block, - wiiu_font_flush_block, + NULL, /* flush */ wiiu_font_get_message_width, }; diff --git a/gfx/drivers_renderchain/d3d8_renderchain.c b/gfx/drivers_renderchain/d3d8_renderchain.c index 2dc9b4dcf9..faef44aee7 100644 --- a/gfx/drivers_renderchain/d3d8_renderchain.c +++ b/gfx/drivers_renderchain/d3d8_renderchain.c @@ -43,13 +43,17 @@ typedef struct d3d8_renderchain uint64_t frame_count; } d3d8_renderchain_t; -static void renderchain_set_mvp(void *data, unsigned vp_width, +static void d3d8_renderchain_set_mvp( + void *chain_data, + void *data, unsigned vp_width, unsigned vp_height, unsigned rotation) { d3d_video_t *d3d = (d3d_video_t*)data; LPDIRECT3DDEVICE d3dr = (LPDIRECT3DDEVICE)d3d->dev; D3DMATRIX p_out, p_rotate, mat; + (void)chain_data; + d3d_matrix_ortho_off_center_lh(&mat, 0, vp_width, vp_height, 0, 0.0f, 1.0f); d3d_matrix_identity(&p_out); d3d_matrix_rotation_z(&p_rotate, rotation * (M_PI / 2.0)); @@ -67,7 +71,7 @@ static void d3d8_renderchain_clear(void *data) d3d_vertex_buffer_free(chain->vertex_buf, chain->vertex_decl); } -static bool renderchain_create_first_pass(void *data, +static bool d3d8_renderchain_create_first_pass(void *data, const video_info_t *info) { d3d_video_t *d3d = (d3d_video_t*)data; @@ -106,7 +110,7 @@ static bool renderchain_create_first_pass(void *data, return true; } -static void renderchain_set_vertices(void *data, unsigned pass, +static void d3d8_renderchain_set_vertices(void *data, unsigned pass, unsigned vert_width, unsigned vert_height, uint64_t frame_count) { unsigned width, height; @@ -171,7 +175,7 @@ static void renderchain_set_vertices(void *data, unsigned pass, } } -static void renderchain_blit_to_texture(void *data, const void *frame, +static void d3d8_renderchain_blit_to_texture(void *data, const void *frame, unsigned width, unsigned height, unsigned pitch) { D3DLOCKED_RECT d3dlr; @@ -254,7 +258,7 @@ static bool d3d8_renderchain_init(void *data, chain->tex_w = link_info->tex_w; chain->tex_h = link_info->tex_h; - if (!renderchain_create_first_pass(d3d, video_info)) + if (!d3d8_renderchain_create_first_pass(d3d, video_info)) return false; /* FIXME */ @@ -283,17 +287,17 @@ static bool d3d8_renderchain_render(void *data, const void *frame, { unsigned i; unsigned width, height; - d3d_video_t *d3d = (d3d_video_t*)data; - LPDIRECT3DDEVICE d3dr = (LPDIRECT3DDEVICE)d3d->dev; - settings_t *settings = config_get_ptr(); + d3d_video_t *d3d = (d3d_video_t*)data; + LPDIRECT3DDEVICE d3dr = (LPDIRECT3DDEVICE)d3d->dev; + settings_t *settings = config_get_ptr(); d3d8_renderchain_t *chain = (d3d8_renderchain_t*)d3d->renderchain_data; chain->frame_count++; video_driver_get_size(&width, &height); - renderchain_blit_to_texture(chain, frame, frame_width, frame_height, pitch); - renderchain_set_vertices(d3d, 1, frame_width, frame_height, chain->frame_count); + d3d8_renderchain_blit_to_texture(chain, frame, frame_width, frame_height, pitch); + d3d8_renderchain_set_vertices(d3d, 1, frame_width, frame_height, chain->frame_count); d3d_set_texture(d3dr, 0, chain->tex); d3d_set_viewports(chain->dev, &d3d->final_viewport); @@ -307,7 +311,7 @@ static bool d3d8_renderchain_render(void *data, const void *frame, d3d_set_stream_source(d3dr, i, chain->vertex_buf, 0, sizeof(Vertex)); d3d_draw_primitive(d3dr, D3DPT_TRIANGLESTRIP, 0, 2); - renderchain_set_mvp(d3d, width, height, d3d->dev_rotation); + d3d8_renderchain_set_mvp(chain, d3d, width, height, d3d->dev_rotation); return true; } @@ -365,7 +369,8 @@ static bool d3d8_renderchain_reinit(void *data, return true; } -static void d3d8_renderchain_viewport_info(void *data, struct video_viewport *vp) +static void d3d8_renderchain_viewport_info(void *data, + struct video_viewport *vp) { unsigned width, height; d3d_video_t *d3d = (d3d_video_t*)data; @@ -385,6 +390,7 @@ static void d3d8_renderchain_viewport_info(void *data, struct video_viewport *vp } d3d_renderchain_driver_t d3d8_d3d_renderchain = { + d3d8_renderchain_set_mvp, d3d8_renderchain_free, d3d8_renderchain_new, d3d8_renderchain_reinit, diff --git a/gfx/drivers_renderchain/d3d9_cg_renderchain.c b/gfx/drivers_renderchain/d3d9_cg_renderchain.c index b153c8f177..5a83b9af75 100644 --- a/gfx/drivers_renderchain/d3d9_cg_renderchain.c +++ b/gfx/drivers_renderchain/d3d9_cg_renderchain.c @@ -1191,13 +1191,14 @@ static void d3d9_cg_renderchain_end_render(cg_renderchain_t *chain) } static void d3d9_cg_renderchain_set_mvp( - cg_renderchain_t *chain, - void *vertex_program, + void *chain_data, + void *data, unsigned vp_width, unsigned vp_height, unsigned rotation) { D3DMATRIX proj, ortho, rot, tmp; - CGprogram vPrg = (CGprogram)vertex_program; + CGprogram vPrg = (CGprogram)data; + cg_renderchain_t *chain = (cg_renderchain_t*)chain_data; d3d_matrix_ortho_off_center_lh(&ortho, 0, vp_width, 0, vp_height, 0, 1); d3d_matrix_identity(&rot); @@ -1686,6 +1687,7 @@ static void d3d9_cg_renderchain_viewport_info( } d3d_renderchain_driver_t cg_d3d9_renderchain = { + d3d9_cg_renderchain_set_mvp, d3d9_cg_renderchain_free, d3d9_cg_renderchain_new, NULL, diff --git a/gfx/drivers_renderchain/d3d9_hlsl_renderchain.cpp b/gfx/drivers_renderchain/d3d9_hlsl_renderchain.c similarity index 88% rename from gfx/drivers_renderchain/d3d9_hlsl_renderchain.cpp rename to gfx/drivers_renderchain/d3d9_hlsl_renderchain.c index 8b6284b493..8d96721d86 100644 --- a/gfx/drivers_renderchain/d3d9_hlsl_renderchain.cpp +++ b/gfx/drivers_renderchain/d3d9_hlsl_renderchain.c @@ -44,19 +44,22 @@ typedef struct hlsl_d3d9_renderchain /* TODO/FIXME - this forward declaration should not be necesary */ void hlsl_set_proj_matrix(void *data, XMMATRIX rotation_value); -static void renderchain_set_mvp(void *data, unsigned vp_width, +static void hlsl_d3d9_renderchain_set_mvp( + void *chain_data, + void *data, unsigned vp_width, unsigned vp_height, unsigned rotation) { video_shader_ctx_mvp_t mvp; d3d_video_t *d3d = (d3d_video_t*)data; LPDIRECT3DDEVICE d3dr = (LPDIRECT3DDEVICE)d3d->dev; - hlsl_set_proj_matrix((void*)&d3d->shader, XMMatrixRotationZ(rotation * (M_PI / 2.0))); + hlsl_set_proj_matrix((void*)&d3d->shader, + XMMatrixRotationZ(rotation * (M_PI / 2.0))); mvp.data = d3d; mvp.matrix = NULL; - video_shader_driver_set_mvp(mvp); + video_driver_set_mvp(&mvp); } static void hlsl_d3d9_renderchain_clear(void *data) @@ -75,10 +78,11 @@ static bool hlsl_d3d9_renderchain_init_shader_fvf(void *data, void *pass_data) { 0, 2 * sizeof(float), D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 0 }, D3DDECL_END() }; - d3d_video_t *d3d = (d3d_video_t*)data; - d3d_video_t *pass = (d3d_video_t*)data; - LPDIRECT3DDEVICE d3dr = (LPDIRECT3DDEVICE)d3d->dev; - hlsl_d3d9_renderchain_t *chain = (hlsl_d3d9_renderchain_t*)d3d->renderchain_data; + d3d_video_t *d3d = (d3d_video_t*)data; + d3d_video_t *pass = (d3d_video_t*)data; + LPDIRECT3DDEVICE d3dr = (LPDIRECT3DDEVICE)d3d->dev; + hlsl_d3d9_renderchain_t *chain = (hlsl_d3d9_renderchain_t*) + d3d->renderchain_data; (void)pass_data; @@ -86,14 +90,16 @@ static bool hlsl_d3d9_renderchain_init_shader_fvf(void *data, void *pass_data) VertexElements, (void**)&chain->vertex_decl); } -static bool renderchain_create_first_pass(void *data, +static bool hlsl_d3d9_renderchain_create_first_pass(void *data, const video_info_t *info) { d3d_video_t *d3d = (d3d_video_t*)data; LPDIRECT3DDEVICE d3dr = (LPDIRECT3DDEVICE)d3d->dev; - hlsl_d3d9_renderchain_t *chain = (hlsl_d3d9_renderchain_t*)d3d->renderchain_data; + hlsl_d3d9_renderchain_t *chain = (hlsl_d3d9_renderchain_t*) + d3d->renderchain_data; - chain->vertex_buf = d3d_vertex_buffer_new(d3dr, 4 * sizeof(Vertex), + chain->vertex_buf = d3d_vertex_buffer_new( + d3dr, 4 * sizeof(Vertex), D3DUSAGE_WRITEONLY, D3DFVF_CUSTOMVERTEX, D3DPOOL_MANAGED, NULL); @@ -123,7 +129,8 @@ static bool renderchain_create_first_pass(void *data, return true; } -static void renderchain_set_vertices(void *data, unsigned pass, +static void hlsl_d3d9_renderchain_set_vertices( + void *data, unsigned pass, unsigned vert_width, unsigned vert_height, uint64_t frame_count) { video_shader_ctx_params_t params; @@ -184,7 +191,8 @@ static void renderchain_set_vertices(void *data, unsigned pass, d3d_vertex_buffer_unlock(chain->vertex_buf); } - renderchain_set_mvp(d3d, width, height, d3d->dev_rotation); + hlsl_d3d9_renderchain_set_mvp(chain, + d3d, width, height, d3d->dev_rotation); shader_info.data = d3d; shader_info.idx = pass; @@ -209,8 +217,9 @@ static void renderchain_set_vertices(void *data, unsigned pass, video_shader_driver_set_parameters(params); } -static void renderchain_blit_to_texture(void *data, const void *frame, - unsigned width, unsigned height, unsigned pitch) +static void hlsl_d3d9_renderchain_blit_to_texture( + void *data, const void *frame, + unsigned width, unsigned height, unsigned pitch) { D3DLOCKED_RECT d3dlr; hlsl_d3d9_renderchain_t *chain = (hlsl_d3d9_renderchain_t*)data; @@ -258,7 +267,6 @@ static void hlsl_d3d9_renderchain_free(void *data) hlsl_d3d9_renderchain_clear(chain->renderchain_data); } - void *hlsl_d3d9_renderchain_new(void) { hlsl_d3d9_renderchain_t *renderchain = @@ -324,7 +332,7 @@ static bool hlsl_d3d9_renderchain_init(void *data, chain->tex_w = link_info->tex_w; chain->tex_h = link_info->tex_h; - if (!renderchain_create_first_pass(d3d, video_info)) + if (!hlsl_d3d9_renderchain_create_first_pass(d3d, video_info)) return false; /* FIXME */ @@ -363,8 +371,10 @@ static bool hlsl_d3d9_renderchain_render(void *data, const void *frame, video_driver_get_size(&width, &height); - renderchain_blit_to_texture(chain, frame, frame_width, frame_height, pitch); - renderchain_set_vertices(d3d, 1, frame_width, frame_height, chain->frame_count); + hlsl_d3d9_renderchain_blit_to_texture(chain, + frame, frame_width, frame_height, pitch); + hlsl_d3d9_renderchain_set_vertices(d3d, + 1, frame_width, frame_height, chain->frame_count); d3d_set_texture(d3dr, 0, chain->tex); d3d_set_viewports(chain->dev, &d3d->final_viewport); @@ -378,12 +388,14 @@ static bool hlsl_d3d9_renderchain_render(void *data, const void *frame, d3d_set_stream_source(d3dr, i, chain->vertex_buf, 0, sizeof(Vertex)); d3d_draw_primitive(d3dr, D3DPT_TRIANGLESTRIP, 0, 2); - renderchain_set_mvp(d3d, width, height, d3d->dev_rotation); + hlsl_d3d9_renderchain_set_mvp( + chain, d3d, width, height, d3d->dev_rotation); return true; } -static bool hlsl_d3d9_renderchain_add_pass(void *data, const void *info_data) +static bool hlsl_d3d9_renderchain_add_pass( + void *data, const void *info_data) { (void)data; (void)info_data; @@ -392,7 +404,8 @@ static bool hlsl_d3d9_renderchain_add_pass(void *data, const void *info_data) return true; } -static void hlsl_d3d9_renderchain_add_state_tracker(void *data, void *tracker_data) +static void hlsl_d3d9_renderchain_add_state_tracker( + void *data, void *tracker_data) { (void)data; (void)tracker_data; @@ -438,7 +451,8 @@ static bool hlsl_d3d9_renderchain_reinit(void *data, return true; } -static void hlsl_d3d9_renderchain_viewport_info(void *data, struct video_viewport *vp) +static void hlsl_d3d9_renderchain_viewport_info( + void *data, struct video_viewport *vp) { unsigned width, height; d3d_video_t *d3d = (d3d_video_t*)data; @@ -458,6 +472,7 @@ static void hlsl_d3d9_renderchain_viewport_info(void *data, struct video_viewpor } d3d_renderchain_driver_t hlsl_d3d9_renderchain = { + hlsl_d3d9_renderchain_set_mvp, hlsl_d3d9_renderchain_free, hlsl_d3d9_renderchain_new, hlsl_d3d9_renderchain_reinit, diff --git a/gfx/drivers_renderchain/gl1_renderchain.c b/gfx/drivers_renderchain/gl1_renderchain.c new file mode 100644 index 0000000000..04e8fa6199 --- /dev/null +++ b/gfx/drivers_renderchain/gl1_renderchain.c @@ -0,0 +1,329 @@ +/* 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 . + */ + +#ifdef _MSC_VER +#pragma comment(lib, "opengl32") +#endif + +#include +#include +#include +#include + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "../video_driver.h" +#include "../video_shader_parse.h" +#include "../common/gl_common.h" + +#include "../../driver.h" +#include "../../configuration.h" +#include "../../verbosity.h" + +typedef struct gl1_renderchain +{ + void *empty; +} gl1_renderchain_t; + +GLenum min_filter_to_mag(GLenum type); + +void gl1_renderchain_free(void *data) +{ + gl_t *gl = (gl_t*)data; + (void)gl; +} + +static void gl1_renderchain_bind_prev_texture( + void *data, + const struct video_tex_info *tex_info) +{ + gl_t *gl = (gl_t*)data; + + memmove(gl->prev_info + 1, gl->prev_info, + sizeof(*tex_info) * (gl->textures - 1)); + memcpy(&gl->prev_info[0], tex_info, + sizeof(*tex_info)); +} + +static void gl1_renderchain_viewport_info( + void *data, struct video_viewport *vp) +{ + unsigned width, height; + unsigned top_y, top_dist; + gl_t *gl = (gl_t*)data; + + video_driver_get_size(&width, &height); + + *vp = gl->vp; + vp->full_width = width; + vp->full_height = height; + + /* Adjust as GL viewport is bottom-up. */ + top_y = vp->y + vp->height; + top_dist = height - top_y; + vp->y = top_dist; +} + +static bool gl1_renderchain_read_viewport( + void *data, uint8_t *buffer, bool is_idle) +{ + unsigned num_pixels = 0; + gl_t *gl = (gl_t*)data; + + if (!gl) + return false; + + num_pixels = gl->vp.width * gl->vp.height; + + /* 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 + * readbacks so do just that. + * GLES2 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)); + + if (!gl->readback_buffer_screenshot) + return false; + + if (!is_idle) + video_driver_cached_frame(); + + video_frame_convert_rgba_to_bgr( + (const void*)gl->readback_buffer_screenshot, + buffer, + num_pixels); + + free(gl->readback_buffer_screenshot); + gl->readback_buffer_screenshot = NULL; + + return true; +} + +void gl1_renderchain_free_internal(void *data) +{ + gl1_renderchain_t *cg_data = (gl1_renderchain_t*)data; + + if (!cg_data) + return; + + free(cg_data); +} + +static void *gl1_renderchain_new(void) +{ + gl1_renderchain_t *renderchain = (gl1_renderchain_t*) + calloc(1, sizeof(*renderchain)); + if (!renderchain) + return NULL; + + return renderchain; +} + +static void gl1_renderchain_ff_vertex(const void *data) +{ + const struct video_coords *coords = (const struct video_coords*)data; + /* Fall back to fixed function-style if needed and possible. */ + glClientActiveTexture(GL_TEXTURE1); + glTexCoordPointer(2, GL_FLOAT, 0, coords->lut_tex_coord); + glEnableClientState(GL_TEXTURE_COORD_ARRAY); + glClientActiveTexture(GL_TEXTURE0); + glVertexPointer(2, GL_FLOAT, 0, coords->vertex); + glEnableClientState(GL_VERTEX_ARRAY); + glColorPointer(4, GL_FLOAT, 0, coords->color); + glEnableClientState(GL_COLOR_ARRAY); + glTexCoordPointer(2, GL_FLOAT, 0, coords->tex_coord); + glEnableClientState(GL_TEXTURE_COORD_ARRAY); +} + +static void gl1_renderchain_ff_matrix(const void *data) +{ + math_matrix_4x4 ident; + const math_matrix_4x4 *mat = (const math_matrix_4x4*)data; + + /* Fall back to fixed function-style if needed and possible. */ + glMatrixMode(GL_PROJECTION); + glLoadMatrixf(mat->data); + glMatrixMode(GL_MODELVIEW); + matrix_4x4_identity(ident); + glLoadMatrixf(ident.data); +} + +static void gl1_renderchain_disable_client_arrays(void) +{ + if (gl_query_core_context_in_use()) + return; + + glClientActiveTexture(GL_TEXTURE1); + glDisableClientState(GL_TEXTURE_COORD_ARRAY); + glClientActiveTexture(GL_TEXTURE0); + glDisableClientState(GL_VERTEX_ARRAY); + glDisableClientState(GL_COLOR_ARRAY); + glDisableClientState(GL_TEXTURE_COORD_ARRAY); +} + +static void gl1_renderchain_restore_default_state(void *data) +{ + gl_t *gl = (gl_t*)data; + if (!gl) + return; + glEnable(GL_TEXTURE_2D); + glDisable(GL_DEPTH_TEST); + glDisable(GL_CULL_FACE); + glDisable(GL_DITHER); +} + +static void gl1_renderchain_copy_frame( + void *data, + video_frame_info_t *video_info, + const void *frame, + unsigned width, unsigned height, unsigned pitch) +{ + gl_t *gl = (gl_t*)data; + const GLvoid *data_buf = frame; + glPixelStorei(GL_UNPACK_ALIGNMENT, video_pixel_get_alignment(pitch)); + + if (gl->base_size == 2 && !gl->have_es2_compat) + { + /* Convert to 32-bit textures on desktop GL. + * + * It is *much* faster (order of magnitude on my setup) + * to use a custom SIMD-optimized conversion routine + * than letting GL do it. */ + video_frame_convert_rgb16_to_rgb32( + &gl->scaler, + gl->conv_buffer, + frame, + width, + height, + pitch); + data_buf = gl->conv_buffer; + } + else + glPixelStorei(GL_UNPACK_ROW_LENGTH, pitch / gl->base_size); + + glTexSubImage2D(GL_TEXTURE_2D, + 0, 0, 0, width, height, gl->texture_type, + gl->texture_fmt, data_buf); + + glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); +} + +static void gl1_renderchain_readback(void *data, + unsigned alignment, + unsigned fmt, unsigned type, + void *src) +{ + gl_t *gl = (gl_t*)data; + + glPixelStorei(GL_PACK_ALIGNMENT, alignment); + glPixelStorei(GL_PACK_ROW_LENGTH, 0); + glReadBuffer(GL_BACK); + + glReadPixels(gl->vp.x, gl->vp.y, + gl->vp.width, gl->vp.height, + (GLenum)fmt, (GLenum)type, (GLvoid*)src); +} + +static void gl1_renderchain_set_mvp(void *data, + void *shader_data, const void *mat_data) +{ + math_matrix_4x4 ident; + const math_matrix_4x4 *mat = (const math_matrix_4x4*)mat_data; + + /* Fall back to fixed function-style if needed and possible. */ + glMatrixMode(GL_PROJECTION); + glLoadMatrixf(mat->data); + glMatrixMode(GL_MODELVIEW); + matrix_4x4_identity(ident); + glLoadMatrixf(ident.data); +} + +static void gl1_renderchain_set_coords(void *handle_data, + void *shader_data, const struct video_coords *coords) +{ + /* Fall back to fixed function-style if needed and possible. */ + glClientActiveTexture(GL_TEXTURE1); + glTexCoordPointer(2, GL_FLOAT, 0, coords->lut_tex_coord); + glEnableClientState(GL_TEXTURE_COORD_ARRAY); + glClientActiveTexture(GL_TEXTURE0); + glVertexPointer(2, GL_FLOAT, 0, coords->vertex); + glEnableClientState(GL_VERTEX_ARRAY); + glColorPointer(4, GL_FLOAT, 0, coords->color); + glEnableClientState(GL_COLOR_ARRAY); + glTexCoordPointer(2, GL_FLOAT, 0, coords->tex_coord); + glEnableClientState(GL_TEXTURE_COORD_ARRAY); +} + +gl_renderchain_driver_t gl2_renderchain = { + gl1_renderchain_set_coords, + gl1_renderchain_set_mvp, + NULL, /* init_textures_reference */ + NULL, /* fence_iterate */ + NULL, /* fence_free */ + gl1_renderchain_readback, + NULL, /* renderchain_init_pbo */ + NULL, /* renderchain_bind_pbo */ + NULL, /* renderchain_unbind_pbo */ + gl1_renderchain_copy_frame, + gl1_renderchain_restore_default_state, + NULL, /* new_vao */ + NULL, /* free_vao */ + NULL, /* bind_vao */ + NULL, /* unbind_vao */ + gl1_renderchain_disable_client_arrays, /* disable_client_arrays */ + gl1_renderchain_ff_vertex, /* ff_vertex */ + gl1_renderchain_ff_matrix, + NULL, /* bind_backbuffer */ + NULL, /* deinit_fbo */ + gl1_renderchain_viewport_info, + gl1_renderchain_read_viewport, + gl1_renderchain_bind_prev_texture, + gl1_renderchain_free_internal, + gl1_renderchain_new, + NULL, /* renderchain_init */ + NULL, /* init_hw_render */ + gl1_renderchain_free, + NULL, /* deinit_hw_render */ + NULL, /* start_render */ + NULL, /* check_fbo_dimensions */ + NULL, /* recompute_pass_sizes */ + NULL, /* renderchain_render */ + "gl1", +}; diff --git a/gfx/drivers_renderchain/gl2_renderchain.c b/gfx/drivers_renderchain/gl2_renderchain.c index f7530810ee..0c9733e35f 100644 --- a/gfx/drivers_renderchain/gl2_renderchain.c +++ b/gfx/drivers_renderchain/gl2_renderchain.c @@ -28,6 +28,9 @@ #include "config.h" #endif +#include +#include + #include #include #include @@ -39,16 +42,23 @@ #include #include -#include "gl2_renderchain.h" #include "../video_driver.h" +#include "../video_shader_parse.h" #include "../common/gl_common.h" #include "../../driver.h" #include "../../configuration.h" #include "../../verbosity.h" -#if defined(_WIN32) && !defined(_XBOX) -#include "../common/win32_common.h" +typedef struct gl2_renderchain +{ + void *empty; +} gl2_renderchain_t; + +#if (!defined(HAVE_OPENGLES) || defined(HAVE_OPENGLES3)) +#ifdef GL_PIXEL_PACK_BUFFER +#define HAVE_GL_ASYNC_READBACK +#endif #endif #define set_texture_coords(coords, xamt, yamt) \ @@ -57,24 +67,47 @@ coords[5] = yamt; \ coords[7] = yamt -#ifdef IOS -/* There is no default frame buffer on iOS. */ -void cocoagl_bind_game_view_fbo(void); -#define gl_bind_backbuffer() cocoagl_bind_game_view_fbo() -#else -#define gl_bind_backbuffer() glBindFramebuffer(RARCH_GL_FRAMEBUFFER, 0) +#define gl2_bind_fb(id) glBindFramebuffer(RARCH_GL_FRAMEBUFFER, id) + +#ifndef GL_SYNC_GPU_COMMANDS_COMPLETE +#define GL_SYNC_GPU_COMMANDS_COMPLETE 0x9117 +#endif + +#ifndef GL_SYNC_FLUSH_COMMANDS_BIT +#define GL_SYNC_FLUSH_COMMANDS_BIT 0x00000001 #endif /* Prototypes */ +static void gl2_renderchain_bind_backbuffer(void) +{ +#ifdef IOS + /* There is no default frame buffer on iOS. */ + void cocoagl_bind_game_view_fbo(void); + cocoagl_bind_game_view_fbo(); +#else + gl2_bind_fb(0); +#endif +} + +void context_bind_hw_render(bool enable); + GLenum min_filter_to_mag(GLenum type); + +void gl_load_texture_data( + uint32_t id_data, + enum gfx_wrap_type wrap_type, + enum texture_filter_type filter_type, + unsigned alignment, + unsigned width, unsigned height, + const void *frame, unsigned base_size); + void gl_set_viewport( void *data, video_frame_info_t *video_info, unsigned viewport_width, unsigned viewport_height, bool force_full, bool allow_rotate); -#ifdef HAVE_FBO -void gl2_renderchain_convert_geometry( +static void gl2_renderchain_convert_geometry( void *data, struct video_fbo_rect *fbo_rect, struct gfx_fbo_scale *fbo_scale, @@ -125,7 +158,7 @@ static bool gl_recreate_fbo( GLuint* texture ) { - glBindFramebuffer(RARCH_GL_FRAMEBUFFER, fbo); + gl2_bind_fb(fbo); glDeleteTextures(1, texture); glGenTextures(1, texture); glBindTexture(GL_TEXTURE_2D, *texture); @@ -185,7 +218,7 @@ 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. */ -void gl2_renderchain_check_fbo_dimensions(void *data) +static void gl2_renderchain_check_fbo_dimensions(void *data) { int i; gl_t *gl = (gl_t*)data; @@ -206,7 +239,7 @@ void gl2_renderchain_check_fbo_dimensions(void *data) } } -void gl2_renderchain_render( +static void gl2_renderchain_render( void *data, video_frame_info_t *video_info, uint64_t frame_count, @@ -214,7 +247,6 @@ void gl2_renderchain_render( const struct video_tex_info *feedback_info) { int i; - video_shader_ctx_mvp_t mvp; video_shader_ctx_coords_t coords; video_shader_ctx_params_t params; video_shader_ctx_info_t shader_info; @@ -237,7 +269,6 @@ void gl2_renderchain_render( * and render all passes from FBOs, to another FBO. */ for (i = 1; i < gl->fbo_pass; i++) { - video_shader_ctx_mvp_t mvp; video_shader_ctx_coords_t coords; video_shader_ctx_params_t params; const struct video_fbo_rect *rect = &gl->fbo_rect[i]; @@ -258,7 +289,7 @@ void gl2_renderchain_render( memcpy(fbo_info->coord, fbo_tex_coords, sizeof(fbo_tex_coords)); fbo_tex_info_cnt++; - glBindFramebuffer(RARCH_GL_FRAMEBUFFER, gl->fbo[i]); + gl2_bind_fb(gl->fbo[i]); shader_info.data = gl; shader_info.idx = i + 1; @@ -270,7 +301,7 @@ void gl2_renderchain_render( mip_level = i + 1; if (video_shader_driver_mipmap_input(&mip_level) - && gl_check_capability(GL_CAPS_MIPMAP)) + && gl->have_mipmap) glGenerateMipmap(GL_TEXTURE_2D); glClear(GL_COLOR_BUFFER_BIT); @@ -300,12 +331,10 @@ void gl2_renderchain_render( coords.handle_data = NULL; coords.data = &gl->coords; - video_shader_driver_set_coords(coords); + video_driver_set_coords(&coords); - mvp.data = gl; - mvp.matrix = &gl->mvp; - - video_shader_driver_set_mvp(mvp); + video_info->cb_set_mvp(gl, + video_info->shader_data, &gl->mvp); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); } @@ -334,7 +363,7 @@ void gl2_renderchain_render( fbo_tex_info_cnt++; /* Render our FBO texture to back buffer. */ - gl_bind_backbuffer(); + gl2_renderchain_bind_backbuffer(); shader_info.data = gl; shader_info.idx = gl->fbo_pass + 1; @@ -347,7 +376,7 @@ void gl2_renderchain_render( mip_level = gl->fbo_pass + 1; if (video_shader_driver_mipmap_input(&mip_level) - && gl_check_capability(GL_CAPS_MIPMAP)) + && gl->have_mipmap) glGenerateMipmap(GL_TEXTURE_2D); glClear(GL_COLOR_BUFFER_BIT); @@ -377,22 +406,19 @@ void gl2_renderchain_render( coords.handle_data = NULL; coords.data = &gl->coords; - video_shader_driver_set_coords(coords); + video_driver_set_coords(&coords); - mvp.data = gl; - mvp.matrix = &gl->mvp; + video_info->cb_set_mvp(gl, + video_info->shader_data, &gl->mvp); - video_shader_driver_set_mvp(mvp); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); gl->coords.tex_coord = gl->tex_info.coord; } -void gl2_renderchain_deinit_fbo(void *data) +static void gl2_renderchain_deinit_fbo(void *data) { gl_t *gl = (gl_t*)data; - if (!gl->fbo_inited) - return; glDeleteTextures(gl->fbo_pass, gl->fbo_texture); glDeleteFramebuffers(gl->fbo_pass, gl->fbo); @@ -412,7 +438,7 @@ void gl2_renderchain_deinit_fbo(void *data) gl->fbo_feedback = 0; } -void gl2_renderchain_deinit_hw_render(void *data) +static void gl2_renderchain_deinit_hw_render(void *data) { gl_t *gl = (gl_t*)data; if (!gl) @@ -448,7 +474,7 @@ static bool gl_create_fbo_targets(gl_t *gl) { GLenum status; - glBindFramebuffer(RARCH_GL_FRAMEBUFFER, gl->fbo[i]); + gl2_bind_fb(gl->fbo[i]); glFramebufferTexture2D(RARCH_GL_FRAMEBUFFER, RARCH_GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, gl->fbo_texture[i], 0); @@ -462,7 +488,7 @@ static bool gl_create_fbo_targets(gl_t *gl) GLenum status; glGenFramebuffers(1, &gl->fbo_feedback); - glBindFramebuffer(RARCH_GL_FRAMEBUFFER, gl->fbo_feedback); + gl2_bind_fb(gl->fbo_feedback); glFramebufferTexture2D(RARCH_GL_FRAMEBUFFER, RARCH_GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, gl->fbo_feedback_texture, 0); @@ -489,23 +515,19 @@ error: static void gl_create_fbo_texture(gl_t *gl, unsigned i, GLuint texture) { - unsigned mip_level; - GLenum min_filter, mag_filter, wrap_enum; + GLenum mag_filter, wrap_enum; video_shader_ctx_filter_t filter_type; video_shader_ctx_wrap_t wrap = {0}; bool fp_fbo = false; - bool mipmapped = false; bool smooth = false; 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 ? GL_LINEAR_MIPMAP_LINEAR : GL_NEAREST_MIPMAP_NEAREST; + unsigned mip_level = i + 2; + bool mipmapped = video_shader_driver_mipmap_input(&mip_level); + GLenum min_filter = mipmapped ? base_mip_filt : base_filt; - glBindTexture(GL_TEXTURE_2D, texture); - - mip_level = i + 2; - mipmapped = video_shader_driver_mipmap_input(&mip_level); - min_filter = mipmapped ? base_mip_filt : base_filt; filter_type.index = i + 2; filter_type.smooth = &smooth; @@ -523,10 +545,7 @@ static void gl_create_fbo_texture(gl_t *gl, unsigned i, GLuint texture) wrap_enum = gl_wrap_type_to_enum(wrap.type); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, mag_filter); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, min_filter); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, wrap_enum); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, wrap_enum); + gl_bind_texture(texture, wrap_enum, mag_filter, min_filter); fp_fbo = gl->fbo_scale[i].fp_fbo; @@ -619,7 +638,7 @@ static void gl_create_fbo_textures(gl_t *gl) * When width/height changes or window sizes change, * we have to recalculate geometry of our FBO. */ -void gl2_renderchain_recompute_pass_sizes( +static void gl2_renderchain_recompute_pass_sizes( void *data, unsigned width, unsigned height, unsigned vp_width, unsigned vp_height) @@ -682,7 +701,8 @@ void gl2_renderchain_recompute_pass_sizes( } } -void gl2_renderchain_start_render(void *data, video_frame_info_t *video_info) +static void gl2_renderchain_start_render(void *data, + video_frame_info_t *video_info) { /* Used when rendering to an FBO. * Texture coords have to be aligned @@ -696,7 +716,7 @@ void gl2_renderchain_start_render(void *data, video_frame_info_t *video_info) gl_t *gl = (gl_t*)data; glBindTexture(GL_TEXTURE_2D, gl->texture[gl->tex_index]); - glBindFramebuffer(RARCH_GL_FRAMEBUFFER, gl->fbo[0]); + gl2_bind_fb(gl->fbo[0]); gl_set_viewport(gl, video_info, gl->fbo_rect[0].img_width, @@ -747,7 +767,7 @@ void gl2_renderchain_init( if (shader_info.num == 1 && !scale.valid) return; - if (!gl_check_capability(GL_CAPS_FBO)) + if (!gl->has_fbo) { RARCH_ERR("[GL]: Failed to locate FBO functions. Won't be able to use render-to-texture.\n"); return; @@ -822,7 +842,8 @@ void gl2_renderchain_init( gl->fbo_inited = true; } -bool gl2_renderchain_init_hw_render(void *data, +static bool gl2_renderchain_init_hw_render( + void *data, unsigned width, unsigned height) { GLenum status; @@ -845,7 +866,7 @@ bool gl2_renderchain_init_hw_render(void *data, RARCH_LOG("[GL]: Max texture size: %d px, renderbuffer size: %d px.\n", max_fbo_size, max_renderbuffer_size); - if (!gl_check_capability(GL_CAPS_FBO)) + if (!gl->has_fbo) return false; RARCH_LOG("[GL]: Supports FBO (render-to-texture).\n"); @@ -864,7 +885,7 @@ bool gl2_renderchain_init_hw_render(void *data, for (i = 0; i < gl->textures; i++) { - glBindFramebuffer(RARCH_GL_FRAMEBUFFER, gl->hw_render_fbo[i]); + gl2_bind_fb(gl->hw_render_fbo[i]); glFramebufferTexture2D(RARCH_GL_FRAMEBUFFER, RARCH_GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, gl->texture[i], 0); @@ -911,16 +932,14 @@ bool gl2_renderchain_init_hw_render(void *data, } } - gl_bind_backbuffer(); + gl2_renderchain_bind_backbuffer(); gl->hw_render_fbo_init = true; context_bind_hw_render(false); return true; } -#endif - -void gl_renderchain_bind_prev_texture( +static void gl2_renderchain_bind_prev_texture( void *data, const struct video_tex_info *tex_info) { @@ -931,7 +950,6 @@ void gl_renderchain_bind_prev_texture( memcpy(&gl->prev_info[0], tex_info, sizeof(*tex_info)); -#ifdef HAVE_FBO /* Implement feedback by swapping out FBO/textures * for FBO pass #N and feedbacks. */ if (gl->fbo_feedback_enable) @@ -943,54 +961,10 @@ void gl_renderchain_bind_prev_texture( gl->fbo[gl->fbo_feedback_pass] = tmp_fbo; gl->fbo_texture[gl->fbo_feedback_pass] = tmp_tex; } -#endif } -bool gl2_renderchain_add_lut( - const struct video_shader *shader, - unsigned i, void *textures_data) -{ - struct texture_image img; - GLuint *textures_lut = (GLuint*)textures_data; - enum texture_filter_type filter_type = TEXTURE_FILTER_LINEAR; - - img.width = 0; - img.height = 0; - img.pixels = NULL; - img.supports_rgba = video_driver_supports_rgba(); - - if (!image_texture_load(&img, shader->lut[i].path)) - { - RARCH_ERR("[GL]: Failed to load texture image from: \"%s\"\n", - shader->lut[i].path); - return false; - } - - RARCH_LOG("[GL]: Loaded texture image from: \"%s\" ...\n", - shader->lut[i].path); - - if (shader->lut[i].filter == RARCH_FILTER_NEAREST) - filter_type = TEXTURE_FILTER_NEAREST; - - if (shader->lut[i].mipmap) - { - if (filter_type == TEXTURE_FILTER_NEAREST) - filter_type = TEXTURE_FILTER_MIPMAP_NEAREST; - else - filter_type = TEXTURE_FILTER_MIPMAP_LINEAR; - } - - gl_load_texture_data(textures_lut[i], - shader->lut[i].wrap, - filter_type, 4, - img.width, img.height, - img.pixels, sizeof(uint32_t)); - image_texture_free(&img); - - return true; -} - -void gl_renderchain_viewport_info(void *data, struct video_viewport *vp) +static void gl2_renderchain_viewport_info( + void *data, struct video_viewport *vp) { unsigned width, height; unsigned top_y, top_dist; @@ -1008,9 +982,9 @@ void gl_renderchain_viewport_info(void *data, struct video_viewport *vp) vp->y = top_dist; } -bool gl_renderchain_read_viewport(void *data, uint8_t *buffer, bool is_idle) +static bool gl2_renderchain_read_viewport( + void *data, uint8_t *buffer, bool is_idle) { -#ifndef NO_GL_READ_PIXELS unsigned num_pixels = 0; gl_t *gl = (gl_t*)data; @@ -1069,10 +1043,12 @@ bool gl_renderchain_read_viewport(void *data, uint8_t *buffer, bool is_idle) glUnmapBuffer(GL_PIXEL_PACK_BUFFER); glBindBuffer(GL_PIXEL_PACK_BUFFER, 0); } - else /* Use slow synchronous readbacks. Use this with plain screenshots - as we don't really care about performance in this case. */ + else #endif { + /* 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 * readbacks so do just that. * GLES2 also doesn't support reading back data @@ -1104,12 +1080,358 @@ bool gl_renderchain_read_viewport(void *data, uint8_t *buffer, bool is_idle) error: context_bind_hw_render(true); -#endif return false; } +void gl2_renderchain_free_internal(void *data) +{ + gl2_renderchain_t *cg_data = (gl2_renderchain_t*)data; + + if (!cg_data) + return; + + free(cg_data); +} + +static void *gl2_renderchain_new(void) +{ + gl2_renderchain_t *renderchain = (gl2_renderchain_t*)calloc(1, sizeof(*renderchain)); + if (!renderchain) + return NULL; + + return renderchain; +} + +#ifndef HAVE_OPENGLES +static void gl2_renderchain_bind_vao(void *data) +{ + gl_t *gl = (gl_t*)data; + if (!gl) + return; + glBindVertexArray(gl->vao); +} + +static void gl2_renderchain_unbind_vao(void *data) +{ + gl_t *gl = (gl_t*)data; + if (!gl) + return; + glBindVertexArray(0); +} + +static void gl2_renderchain_new_vao(void *data) +{ + gl_t *gl = (gl_t*)data; + if (!gl) + return; + glGenVertexArrays(1, &gl->vao); +} + +static void gl2_renderchain_free_vao(void *data) +{ + gl_t *gl = (gl_t*)data; + if (!gl) + return; + glDeleteVertexArrays(1, &gl->vao); +} +#endif + +static void gl2_renderchain_restore_default_state(void *data) +{ + gl_t *gl = (gl_t*)data; + if (!gl) + return; +#ifndef HAVE_OPENGLES + if (!gl->core_context_in_use) + glEnable(GL_TEXTURE_2D); +#endif + glDisable(GL_DEPTH_TEST); + glDisable(GL_CULL_FACE); + glDisable(GL_DITHER); +} + +static void gl2_renderchain_copy_frame( + void *data, + video_frame_info_t *video_info, + const void *frame, + unsigned width, unsigned height, unsigned pitch) +{ + gl_t *gl = (gl_t*)data; +#if defined(HAVE_PSGL) + { + unsigned h; + size_t buffer_addr = gl->tex_w * gl->tex_h * + gl->tex_index * gl->base_size; + size_t buffer_stride = gl->tex_w * gl->base_size; + const uint8_t *frame_copy = frame; + size_t frame_copy_size = width * gl->base_size; + + uint8_t *buffer = (uint8_t*)glMapBuffer( + GL_TEXTURE_REFERENCE_BUFFER_SCE, GL_READ_WRITE) + buffer_addr; + for (h = 0; h < height; h++, buffer += buffer_stride, frame_copy += pitch) + memcpy(buffer, frame_copy, frame_copy_size); + + glUnmapBuffer(GL_TEXTURE_REFERENCE_BUFFER_SCE); + } +#elif defined(HAVE_OPENGLES) +#if defined(HAVE_EGL) + if (gl->egl_images) + { + gfx_ctx_image_t img_info; + bool new_egl = false; + EGLImageKHR img = 0; + + img_info.frame = frame; + img_info.width = width; + img_info.height = height; + img_info.pitch = pitch; + img_info.index = gl->tex_index; + img_info.rgb32 = (gl->base_size == 4); + img_info.handle = &img; + + new_egl = + video_context_driver_write_to_image_buffer(&img_info); + + if (img == EGL_NO_IMAGE_KHR) + { + RARCH_ERR("[GL]: Failed to create EGL image.\n"); + return; + } + + if (new_egl) + glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, (GLeglImageOES)img); + } + else +#endif + { + glPixelStorei(GL_UNPACK_ALIGNMENT, + video_pixel_get_alignment(width * gl->base_size)); + + /* Fallback for GLES devices without GL_BGRA_EXT. */ + if (gl->base_size == 4 && video_info->use_rgba) + { + video_frame_convert_argb8888_to_abgr8888( + &gl->scaler, + gl->conv_buffer, + frame, width, height, pitch); + glTexSubImage2D(GL_TEXTURE_2D, + 0, 0, 0, width, height, gl->texture_type, + gl->texture_fmt, gl->conv_buffer); + } + else if (gl->support_unpack_row_length) + { + glPixelStorei(GL_UNPACK_ROW_LENGTH, pitch / gl->base_size); + glTexSubImage2D(GL_TEXTURE_2D, + 0, 0, 0, width, height, gl->texture_type, + gl->texture_fmt, frame); + + glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); + } + else + { + /* No GL_UNPACK_ROW_LENGTH. */ + + const GLvoid *data_buf = frame; + unsigned pitch_width = pitch / gl->base_size; + + if (width != pitch_width) + { + /* Slow path - conv_buffer is preallocated + * just in case we hit this path. */ + + unsigned h; + const unsigned line_bytes = width * gl->base_size; + uint8_t *dst = (uint8_t*)gl->conv_buffer; + const uint8_t *src = (const uint8_t*)frame; + + for (h = 0; h < height; h++, src += pitch, dst += line_bytes) + memcpy(dst, src, line_bytes); + + data_buf = gl->conv_buffer; + } + + glTexSubImage2D(GL_TEXTURE_2D, + 0, 0, 0, width, height, gl->texture_type, + gl->texture_fmt, data_buf); + } + } +#else + { + const GLvoid *data_buf = frame; + glPixelStorei(GL_UNPACK_ALIGNMENT, video_pixel_get_alignment(pitch)); + + if (gl->base_size == 2 && !gl->have_es2_compat) + { + /* Convert to 32-bit textures on desktop GL. + * + * It is *much* faster (order of magnitude on my setup) + * to use a custom SIMD-optimized conversion routine + * than letting GL do it. */ + video_frame_convert_rgb16_to_rgb32( + &gl->scaler, + gl->conv_buffer, + frame, + width, + height, + pitch); + data_buf = gl->conv_buffer; + } + else + glPixelStorei(GL_UNPACK_ROW_LENGTH, pitch / gl->base_size); + + glTexSubImage2D(GL_TEXTURE_2D, + 0, 0, 0, width, height, gl->texture_type, + gl->texture_fmt, data_buf); + + glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); + } +#endif +} + +#if !defined(HAVE_OPENGLES2) && !defined(HAVE_PSGL) +static void gl2_renderchain_bind_pbo(unsigned idx) +{ + glBindBuffer(GL_PIXEL_PACK_BUFFER, (GLuint)idx); +} + +static void gl2_renderchain_unbind_pbo(void) +{ + glBindBuffer(GL_PIXEL_PACK_BUFFER, 0); +} + +static void gl2_renderchain_init_pbo(unsigned size, + const void *data) +{ + glBufferData(GL_PIXEL_PACK_BUFFER, size, + (const GLvoid*)data, GL_STREAM_READ); +} +#endif + +static void gl2_renderchain_readback(void *data, + unsigned alignment, + unsigned fmt, unsigned type, + void *src) +{ + gl_t *gl = (gl_t*)data; + + glPixelStorei(GL_PACK_ALIGNMENT, alignment); +#ifndef HAVE_OPENGLES + glPixelStorei(GL_PACK_ROW_LENGTH, 0); + glReadBuffer(GL_BACK); +#endif + + glReadPixels(gl->vp.x, gl->vp.y, + gl->vp.width, gl->vp.height, + (GLenum)fmt, (GLenum)type, (GLvoid*)src); +} + +#ifndef HAVE_OPENGLES +static void gl2_renderchain_fence_iterate(void *data, unsigned + hard_sync_frames) +{ + gl_t *gl = (gl_t*)data; + + gl->fences[gl->fence_count++] = + glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0); + + while (gl->fence_count > hard_sync_frames) + { + glClientWaitSync(gl->fences[0], + GL_SYNC_FLUSH_COMMANDS_BIT, 1000000000); + glDeleteSync(gl->fences[0]); + + gl->fence_count--; + memmove(gl->fences, gl->fences + 1, + gl->fence_count * sizeof(GLsync)); + } +} + +static void gl2_renderchain_fence_free(void *data) +{ + unsigned i; + gl_t *gl = (gl_t*)data; + + for (i = 0; i < gl->fence_count; i++) + { + glClientWaitSync(gl->fences[i], + GL_SYNC_FLUSH_COMMANDS_BIT, 1000000000); + glDeleteSync(gl->fences[i]); + } + gl->fence_count = 0; +} +#endif + +static void gl2_renderchain_init_textures_reference( + void *data, unsigned i, + unsigned internal_fmt, unsigned texture_fmt, + unsigned texture_type) +{ + gl_t *gl = (gl_t*)data; +#ifdef HAVE_PSGL + glTextureReferenceSCE(GL_TEXTURE_2D, 1, + gl->tex_w, gl->tex_h, 0, + (GLenum)internal_fmt, + gl->tex_w * gl->base_size, + gl->tex_w * gl->tex_h * i * gl->base_size); +#else + if (gl->egl_images) + return; + + gl_load_texture_image(GL_TEXTURE_2D, + 0, + (GLenum)internal_fmt, + gl->tex_w, gl->tex_h, 0, + (GLenum)texture_type, + (GLenum)texture_fmt, + gl->empty_buf ? gl->empty_buf : NULL); +#endif +} + gl_renderchain_driver_t gl2_renderchain = { + NULL, /* set_coords */ + NULL, /* set_mvp */ + gl2_renderchain_init_textures_reference, +#ifdef HAVE_OPENGLES + NULL, + NULL, +#else + gl2_renderchain_fence_iterate, + gl2_renderchain_fence_free, +#endif + gl2_renderchain_readback, +#if !defined(HAVE_OPENGLES2) && !defined(HAVE_PSGL) + gl2_renderchain_init_pbo, + gl2_renderchain_bind_pbo, + gl2_renderchain_unbind_pbo, +#else + NULL, + NULL, + NULL, +#endif + gl2_renderchain_copy_frame, + gl2_renderchain_restore_default_state, +#ifdef HAVE_OPENGLES + NULL, + NULL, + NULL, + NULL, +#else + gl2_renderchain_new_vao, + gl2_renderchain_free_vao, + gl2_renderchain_bind_vao, + gl2_renderchain_unbind_vao, +#endif + NULL, + NULL, + NULL, + gl2_renderchain_bind_backbuffer, + gl2_renderchain_deinit_fbo, + gl2_renderchain_viewport_info, + gl2_renderchain_read_viewport, + gl2_renderchain_bind_prev_texture, + gl2_renderchain_free_internal, + gl2_renderchain_new, gl2_renderchain_init, gl2_renderchain_init_hw_render, gl2_renderchain_free, diff --git a/gfx/drivers_renderchain/gl2_renderchain.h b/gfx/drivers_renderchain/gl2_renderchain.h deleted file mode 100644 index 31a85c406f..0000000000 --- a/gfx/drivers_renderchain/gl2_renderchain.h +++ /dev/null @@ -1,89 +0,0 @@ -/* RetroArch - A frontend for libretro. - * Copyright (C) 2010-2014 - Hans-Kristian Arntzen - * Copyright (C) 2011-2017 - Daniel De Matteis - * - * 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 __GL2_RENDER_CHAIN_H -#define __GL2_RENDER_CHAIN_H - -#include -#include - -#include "../video_driver.h" -#include "../video_shader_parse.h" - -RETRO_BEGIN_DECLS - -void gl2_renderchain_convert_geometry( - void *data, - struct video_fbo_rect *fbo_rect, - struct gfx_fbo_scale *fbo_scale, - unsigned last_width, unsigned last_max_width, - unsigned last_height, unsigned last_max_height, - unsigned vp_width, unsigned vp_height); - -void gl_renderchain_bind_prev_texture( - void *data, - const struct video_tex_info *tex_info); - -bool gl2_renderchain_add_lut(const struct video_shader *shader, - unsigned i, void *textures_lut); - -void gl_load_texture_data( - uint32_t id_data, - enum gfx_wrap_type wrap_type, - enum texture_filter_type filter_type, - unsigned alignment, - unsigned width, unsigned height, - const void *frame, unsigned base_size); - -void gl2_renderchain_render(void *data, - video_frame_info_t *video_info, - uint64_t frame_count, - const struct video_tex_info *tex_info, - const struct video_tex_info *feedback_info); - -void gl2_renderchain_init( - void *data, unsigned fbo_width, unsigned fbo_height); - -void gl2_renderchain_deinit_hw_render(void *data); - -void gl2_renderchain_recompute_pass_sizes(void *data, - unsigned width, unsigned height, - unsigned vp_width, unsigned vp_height); - -void gl2_renderchain_deinit_fbo(void *data); - -void gl2_renderchain_start_render(void *data, - video_frame_info_t *video_info); - -void gl2_renderchain_check_fbo_dimensions(void *data); - -void gl2_renderchain_free(void *data); - -bool gl2_renderchain_init_hw_render(void *data, - unsigned width, unsigned height); - -void gl_renderchain_viewport_info( - void *data, struct video_viewport *vp); - -bool gl_renderchain_read_viewport( - void *data, uint8_t *buffer, bool is_idle); - -void context_bind_hw_render(bool enable); - -RETRO_END_DECLS - -#endif - diff --git a/gfx/drivers_renderchain/null_renderchain.c b/gfx/drivers_renderchain/null_renderchain.c index 2bad39d720..a3ed173615 100644 --- a/gfx/drivers_renderchain/null_renderchain.c +++ b/gfx/drivers_renderchain/null_renderchain.c @@ -118,7 +118,8 @@ static void null_renderchain_convert_geometry( (void)final_viewport_data; } -d3d_renderchain_driver_t null_renderchain = { +d3d_renderchain_driver_t null_d3d_renderchain = { + NULL, null_renderchain_free, null_renderchain_new, NULL, diff --git a/gfx/drivers_shader/shader_gl_cg.c b/gfx/drivers_shader/shader_gl_cg.c index 754e08b4e2..e37b40352c 100644 --- a/gfx/drivers_shader/shader_gl_cg.c +++ b/gfx/drivers_shader/shader_gl_cg.c @@ -110,12 +110,8 @@ typedef struct cg_shader_data struct video_shader *shader; char alias_define[GFX_MAX_SHADERS][128]; unsigned active_idx; - struct - { - CGparameter elems[32 * PREV_TEXTURES + 2 + 4 + GFX_MAX_SHADERS]; - unsigned index; - } attribs; - + unsigned attribs_index; + CGparameter attribs_elems[32 * PREV_TEXTURES + 2 + 4 + GFX_MAX_SHADERS]; CGprofile cgVProf; CGprofile cgFProf; struct shader_program_cg prg[GFX_MAX_SHADERS]; @@ -133,7 +129,7 @@ struct uniform_cg { \ cgGLSetParameterPointer(param, len, GL_FLOAT, 0, ptr); \ cgGLEnableClientState(param); \ - cg->attribs.elems[cg->attribs.index++] = param; \ + cg->attribs_elems[cg->attribs_index++] = param; \ } #define cg_gl_set_texture_parameter(param, texture) \ @@ -250,24 +246,25 @@ static void gl_cg_reset_attrib(void *data) cg_shader_data_t *cg = (cg_shader_data_t*)data; /* Add sanity check that we did not overflow. */ - retro_assert(cg->attribs.index <= ARRAY_SIZE(cg->attribs.elems)); + retro_assert(cg->attribs_index <= ARRAY_SIZE(cg->attribs_elems)); - for (i = 0; i < cg->attribs.index; i++) - cgGLDisableClientState(cg->attribs.elems[i]); - cg->attribs.index = 0; + for (i = 0; i < cg->attribs_index; i++) + cgGLDisableClientState(cg->attribs_elems[i]); + cg->attribs_index = 0; } -static bool gl_cg_set_mvp(void *data, void *shader_data, const math_matrix_4x4 *mat) +static bool gl_cg_set_mvp(void *data, void *shader_data, + const void *mat_data) { cg_shader_data_t *cg = (cg_shader_data_t*)shader_data; - if (!cg || !cg->prg[cg->active_idx].mvp) + if (cg && cg->prg[cg->active_idx].mvp) { - gl_ff_matrix(mat); - return false; + const math_matrix_4x4 *mat = (const math_matrix_4x4*)mat_data; + cgGLSetMatrixParameterfc(cg->prg[cg->active_idx].mvp, mat->data); + return true; } - cgGLSetMatrixParameterfc(cg->prg[cg->active_idx].mvp, mat->data); - return true; + return false; } static bool gl_cg_set_coords(void *handle_data, void *shader_data, const struct video_coords *coords) @@ -296,12 +293,6 @@ static bool gl_cg_set_coords(void *handle_data, void *shader_data, const struct return true; } -static bool gl_cg_set_coords_fallback(void *handle_data, void *shader_data, const struct video_coords *coords) -{ - gl_ff_vertex(coords); - return true; -} - static void gl_cg_set_texture_info( cg_shader_data_t *cg, const struct cg_fbo_params *params, @@ -781,6 +772,72 @@ static bool gl_cg_load_shader(void *data, unsigned i) return true; } +static bool gl_cg_add_lut( + const struct video_shader *shader, + unsigned i, void *textures_data) +{ + struct texture_image img; + GLuint *textures_lut = (GLuint*)textures_data; + enum texture_filter_type filter_type = TEXTURE_FILTER_LINEAR; + + img.width = 0; + img.height = 0; + img.pixels = NULL; + img.supports_rgba = video_driver_supports_rgba(); + + if (!image_texture_load(&img, shader->lut[i].path)) + { + RARCH_ERR("[GL]: Failed to load texture image from: \"%s\"\n", + shader->lut[i].path); + return false; + } + + RARCH_LOG("[GL]: Loaded texture image from: \"%s\" ...\n", + shader->lut[i].path); + + if (shader->lut[i].filter == RARCH_FILTER_NEAREST) + filter_type = TEXTURE_FILTER_NEAREST; + + if (shader->lut[i].mipmap) + { + if (filter_type == TEXTURE_FILTER_NEAREST) + filter_type = TEXTURE_FILTER_MIPMAP_NEAREST; + else + filter_type = TEXTURE_FILTER_MIPMAP_LINEAR; + } + + gl_load_texture_data(textures_lut[i], + shader->lut[i].wrap, + filter_type, 4, + img.width, img.height, + img.pixels, sizeof(uint32_t)); + image_texture_free(&img); + + return true; +} + +static bool gl_cg_load_luts( + const struct video_shader *shader, + GLuint *textures_lut) +{ + unsigned i; + unsigned num_luts = MIN(shader->luts, GFX_MAX_TEXTURES); + + if (!shader->luts) + return true; + + glGenTextures(num_luts, textures_lut); + + for (i = 0; i < num_luts; i++) + { + if (!gl_cg_add_lut(shader, i, textures_lut)) + return false; + } + + glBindTexture(GL_TEXTURE_2D, 0); + return true; +} + static bool gl_cg_load_preset(void *data, const char *path) { unsigned i; @@ -841,7 +898,7 @@ static bool gl_cg_load_preset(void *data, const char *path) } } - if (!gl_load_luts(cg->shader, cg->lut_textures)) + if (!gl_cg_load_luts(cg->shader, cg->lut_textures)) { RARCH_ERR("Failed to load lookup textures ...\n"); return false; @@ -1233,7 +1290,6 @@ const shader_backend_t gl_cg_backend = { gl_cg_wrap_type, gl_cg_shader_scale, gl_cg_set_coords, - gl_cg_set_coords_fallback, gl_cg_set_mvp, gl_cg_get_prev_textures, gl_cg_get_feedback_pass, diff --git a/gfx/drivers_shader/shader_glsl.c b/gfx/drivers_shader/shader_glsl.c index 3112aabadb..f2e0d9feb7 100644 --- a/gfx/drivers_shader/shader_glsl.c +++ b/gfx/drivers_shader/shader_glsl.c @@ -43,12 +43,11 @@ struct cache_vbo { GLuint vbo_primary; - GLfloat *buffer_primary; - size_t size_primary; - GLuint vbo_secondary; - GLfloat *buffer_secondary; + size_t size_primary; size_t size_secondary; + GLfloat *buffer_primary; + GLfloat *buffer_secondary; }; struct shader_program_glsl_data @@ -89,10 +88,10 @@ struct shader_uniforms int texture_size; int frame_count; - unsigned frame_count_mod; int frame_direction; int lut_texture[GFX_MAX_TEXTURES]; + unsigned frame_count_mod; struct shader_uniforms_frame orig; struct shader_uniforms_frame feedback; @@ -134,28 +133,90 @@ static const char *glsl_prefixes[] = { typedef struct glsl_shader_data { - struct video_shader *shader; + char alias_define[1024]; + GLint attribs_elems[32 * PREV_TEXTURES + 2 + 4 + GFX_MAX_SHADERS]; + unsigned attribs_index; + unsigned active_idx; + unsigned current_idx; + GLuint lut_textures[GFX_MAX_TEXTURES]; + float current_mat_data[GFX_MAX_SHADERS]; + float* current_mat_data_pointer[GFX_MAX_SHADERS]; struct shader_uniforms uniforms[GFX_MAX_SHADERS]; struct cache_vbo vbo[GFX_MAX_SHADERS]; - char alias_define[1024]; - unsigned active_idx; - struct - { - GLint elems[32 * PREV_TEXTURES + 2 + 4 + GFX_MAX_SHADERS]; - unsigned index; - } attribs; - struct shader_program_glsl_data prg[GFX_MAX_SHADERS]; - GLuint lut_textures[GFX_MAX_TEXTURES]; + struct video_shader *shader; state_tracker_t *state_tracker; } glsl_shader_data_t; static bool glsl_core; static unsigned glsl_major; static unsigned glsl_minor; -static float* current_mat_data_pointer[GFX_MAX_SHADERS]; -static float current_mat_data[GFX_MAX_SHADERS]; -static unsigned current_idx; + +static bool gl_glsl_add_lut( + const struct video_shader *shader, + unsigned i, void *textures_data) +{ + struct texture_image img; + GLuint *textures_lut = (GLuint*)textures_data; + enum texture_filter_type filter_type = TEXTURE_FILTER_LINEAR; + + img.width = 0; + img.height = 0; + img.pixels = NULL; + img.supports_rgba = video_driver_supports_rgba(); + + if (!image_texture_load(&img, shader->lut[i].path)) + { + RARCH_ERR("[GL]: Failed to load texture image from: \"%s\"\n", + shader->lut[i].path); + return false; + } + + RARCH_LOG("[GL]: Loaded texture image from: \"%s\" ...\n", + shader->lut[i].path); + + if (shader->lut[i].filter == RARCH_FILTER_NEAREST) + filter_type = TEXTURE_FILTER_NEAREST; + + if (shader->lut[i].mipmap) + { + if (filter_type == TEXTURE_FILTER_NEAREST) + filter_type = TEXTURE_FILTER_MIPMAP_NEAREST; + else + filter_type = TEXTURE_FILTER_MIPMAP_LINEAR; + } + + gl_load_texture_data(textures_lut[i], + shader->lut[i].wrap, + filter_type, 4, + img.width, img.height, + img.pixels, sizeof(uint32_t)); + image_texture_free(&img); + + return true; +} + +static bool gl_glsl_load_luts( + const struct video_shader *shader, + GLuint *textures_lut) +{ + unsigned i; + unsigned num_luts = MIN(shader->luts, GFX_MAX_TEXTURES); + + if (!shader->luts) + return true; + + glGenTextures(num_luts, textures_lut); + + for (i = 0; i < num_luts; i++) + { + if (!gl_glsl_add_lut(shader, i, textures_lut)) + return false; + } + + glBindTexture(GL_TEXTURE_2D, 0); + return true; +} static GLint gl_glsl_get_uniform(glsl_shader_data_t *glsl, GLuint prog, const char *base) @@ -497,11 +558,11 @@ static void gl_glsl_reset_attrib(glsl_shader_data_t *glsl) unsigned i; /* Add sanity check that we did not overflow. */ - retro_assert(glsl->attribs.index <= ARRAY_SIZE(glsl->attribs.elems)); + retro_assert(glsl->attribs_index <= ARRAY_SIZE(glsl->attribs_elems)); - for (i = 0; i < glsl->attribs.index; i++) - glDisableVertexAttribArray(glsl->attribs.elems[i]); - glsl->attribs.index = 0; + for (i = 0; i < glsl->attribs_index; i++) + glDisableVertexAttribArray(glsl->attribs_elems[i]); + glsl->attribs_index = 0; } static void gl_glsl_set_vbo(GLfloat **buffer, size_t *buffer_elems, @@ -537,14 +598,14 @@ static INLINE void gl_glsl_set_attribs(glsl_shader_data_t *glsl, for (i = 0; i < num_attrs; i++) { - if (glsl->attribs.index < ARRAY_SIZE(glsl->attribs.elems)) + if (glsl->attribs_index < ARRAY_SIZE(glsl->attribs_elems)) { GLint loc = attrs[i].loc; glEnableVertexAttribArray(loc); glVertexAttribPointer(loc, attrs[i].size, GL_FLOAT, GL_FALSE, 0, (const GLvoid*)(uintptr_t)attrs[i].offset); - glsl->attribs.elems[glsl->attribs.index++] = loc; + glsl->attribs_elems[glsl->attribs_index++] = loc; } else RARCH_WARN("Attrib array buffer was overflown!\n"); @@ -674,8 +735,10 @@ static void gl_glsl_destroy_resources(glsl_shader_data_t *glsl) if (!glsl) return; - current_idx = 0; + glsl->current_idx = 0; + glUseProgram(0); + for (i = 0; i < GFX_MAX_SHADERS; i++) { if (glsl->prg[i].id == 0 || (i && glsl->prg[i].id == glsl->prg[0].id)) @@ -876,7 +939,7 @@ static void *gl_glsl_init(void *data, const char *path) if (!gl_glsl_compile_programs(glsl, &glsl->prg[1])) goto error; - if (!gl_load_luts(glsl->shader, glsl->lut_textures)) + if (!gl_glsl_load_luts(glsl->shader, glsl->lut_textures)) { RARCH_ERR("[GL]: Failed to load LUTs.\n"); goto error; @@ -1371,30 +1434,29 @@ static void gl_glsl_set_params(void *data, void *shader_data, } } -static bool gl_glsl_set_mvp(void *data, void *shader_data, const math_matrix_4x4 *mat) +static bool gl_glsl_set_mvp(void *data, void *shader_data, const void *mat_data) { int loc; - glsl_shader_data_t *glsl = (glsl_shader_data_t*)shader_data; + glsl_shader_data_t *glsl = (glsl_shader_data_t*)shader_data; (void)data; if (!glsl || !glsl->shader->modern) - { - gl_ff_matrix(mat); return false; - } loc = glsl->uniforms[glsl->active_idx].mvp; if (loc >= 0) { - if ( (current_idx != glsl->active_idx) || - (mat->data != current_mat_data_pointer[glsl->active_idx]) || - (*mat->data != current_mat_data[glsl->active_idx])) + const math_matrix_4x4 *mat = (const math_matrix_4x4*)mat_data; + + if ( (glsl->current_idx != glsl->active_idx) || + (mat->data != glsl->current_mat_data_pointer[glsl->active_idx]) || + (*mat->data != glsl->current_mat_data[glsl->active_idx])) { glUniformMatrix4fv(loc, 1, GL_FALSE, mat->data); - current_idx = glsl->active_idx; - current_mat_data_pointer[glsl->active_idx] = (float*)mat->data; - current_mat_data[glsl->active_idx] = *mat->data; + glsl->current_idx = glsl->active_idx; + glsl->current_mat_data_pointer[glsl->active_idx] = (float*)mat->data; + glsl->current_mat_data[glsl->active_idx] = *mat->data; } } @@ -1489,13 +1551,6 @@ static bool gl_glsl_set_coords(void *handle_data, void *shader_data, return true; } -static bool gl_glsl_set_coords_fallback(void *handle_data, void *shader_data, - const struct video_coords *coords) -{ - gl_ff_vertex(coords); - return true; -} - static void gl_glsl_use(void *data, void *shader_data, unsigned idx, bool set_active) { GLuint id; @@ -1622,7 +1677,6 @@ const shader_backend_t gl_glsl_backend = { gl_glsl_wrap_type, gl_glsl_shader_scale, gl_glsl_set_coords, - gl_glsl_set_coords_fallback, gl_glsl_set_mvp, gl_glsl_get_prev_textures, gl_glsl_get_feedback_pass, diff --git a/gfx/drivers_shader/shader_hlsl.cpp b/gfx/drivers_shader/shader_hlsl.c similarity index 99% rename from gfx/drivers_shader/shader_hlsl.cpp rename to gfx/drivers_shader/shader_hlsl.c index 61d44abdba..9ffedf5ef1 100644 --- a/gfx/drivers_shader/shader_hlsl.cpp +++ b/gfx/drivers_shader/shader_hlsl.c @@ -497,11 +497,12 @@ static void hlsl_shader_scale(void *data, unsigned idx, struct gfx_fbo_scale *sc scale->valid = false; } -static bool hlsl_set_mvp(void *data, void *shader_data, const math_matrix_4x4 *mat) +static bool hlsl_set_mvp(void *data, void *shader_data, const void *mat_data) { d3d_video_t *d3d = (d3d_video_t*)data; LPDIRECT3DDEVICE d3dr = (LPDIRECT3DDEVICE)d3d->dev; hlsl_shader_data_t *hlsl_data = (hlsl_shader_data_t*)shader_data; + const math_matrix_4x4 *mat = (const math_matrix_4x4*)mat_data; if(hlsl_data && hlsl_data->prg[hlsl_data->active_idx].mvp) { @@ -542,7 +543,6 @@ const shader_backend_t hlsl_backend = { NULL, /* hlsl_wrap_type */ hlsl_shader_scale, NULL, /* hlsl_set_coords */ - NULL, /* hlsl_set_coords_fallback */ hlsl_set_mvp, NULL, /* hlsl_get_prev_textures */ hlsl_get_feedback_pass, diff --git a/gfx/drivers_shader/shader_null.c b/gfx/drivers_shader/shader_null.c index 8a2ce6c77f..8ee92bff40 100644 --- a/gfx/drivers_shader/shader_null.c +++ b/gfx/drivers_shader/shader_null.c @@ -88,7 +88,6 @@ const shader_backend_t shader_null_backend = { NULL, NULL, NULL, - NULL, shader_null_get_prev_textures, NULL, NULL, diff --git a/gfx/font_driver.c b/gfx/font_driver.c index eb3bdf8375..1390412f68 100644 --- a/gfx/font_driver.c +++ b/gfx/font_driver.c @@ -452,13 +452,15 @@ void font_driver_bind_block(void *font_data, void *block) font->renderer->bind_block(font->renderer_data, block); } -void font_driver_flush(unsigned width, unsigned height, void *font_data) +void font_driver_flush(unsigned width, unsigned height, void *font_data, + video_frame_info_t *video_info) { font_data_t *font = (font_data_t*)(font_data ? font_data : video_font_driver); if (font && font->renderer && font->renderer->flush) - font->renderer->flush(width, height, font->renderer_data); + font->renderer->flush(width, height, font->renderer_data, video_info); } + int font_driver_get_message_width(void *font_data, const char *msg, unsigned len, float scale) { diff --git a/gfx/font_driver.h b/gfx/font_driver.h index 172f0b586e..eaa3ef6a85 100644 --- a/gfx/font_driver.h +++ b/gfx/font_driver.h @@ -113,7 +113,8 @@ typedef struct font_renderer const struct font_glyph *(*get_glyph)(void *data, uint32_t code); void (*bind_block)(void *data, void *block); - void (*flush)(unsigned width, unsigned height, void *data); + void (*flush)(unsigned width, unsigned height, void *data, + video_frame_info_t *video_info); int (*get_message_width)(void *data, const char *msg, unsigned msg_len_full, float scale); } font_renderer_t; @@ -154,7 +155,8 @@ void font_driver_bind_block(void *font_data, void *block); int font_driver_get_message_width(void *font_data, const char *msg, unsigned len, float scale); -void font_driver_flush(unsigned width, unsigned height, void *font_data); +void font_driver_flush(unsigned width, unsigned height, void *font_data, + video_frame_info_t *video_info); void font_driver_free(void *font_data); diff --git a/gfx/video_driver.c b/gfx/video_driver.c index 3b86092f3e..d9dd3ce7c4 100644 --- a/gfx/video_driver.c +++ b/gfx/video_driver.c @@ -127,7 +127,7 @@ typedef struct video_pixel_scaler static void (*video_driver_cb_shader_use)(void *data, void *shader_data, unsigned index, bool set_active); static bool (*video_driver_cb_shader_set_mvp)(void *data, - void *shader_data, const math_matrix_4x4 *mat); + void *shader_data, const void *mat_data); bool (*video_driver_cb_has_focus)(void); /* Opaque handles to currently running window. @@ -407,7 +407,7 @@ static const shader_backend_t *shader_ctx_drivers[] = { NULL }; -static const d3d_renderchain_driver_t *renderchain_drivers[] = { +static const d3d_renderchain_driver_t *renderchain_d3d_drivers[] = { #if defined(_WIN32) && defined(HAVE_D3D9) && defined(HAVE_CG) &cg_d3d9_renderchain, #endif @@ -417,7 +417,14 @@ static const d3d_renderchain_driver_t *renderchain_drivers[] = { #if defined(_WIN32) && defined(HAVE_D3D8) &d3d8_renderchain, #endif - &null_renderchain, + &null_d3d_renderchain, + NULL +}; + +static const gl_renderchain_driver_t *renderchain_gl_drivers[] = { +#if defined(HAVE_OPENGL) || defined(HAVE_OPENGLES) + &gl2_renderchain, +#endif NULL }; @@ -1789,21 +1796,21 @@ bool video_driver_find_driver(void) current_video = NULL; +#if defined(HAVE_VULKAN) if (hwr && hw_render_context_is_vulkan(hwr->context_type)) { -#if defined(HAVE_VULKAN) RARCH_LOG("[Video]: Using HW render, Vulkan driver forced.\n"); current_video = &video_vulkan; -#endif } +#endif +#if defined(HAVE_OPENGL) if (hwr && hw_render_context_is_gl(hwr->context_type)) { -#if defined(HAVE_OPENGL) && defined(HAVE_FBO) RARCH_LOG("[Video]: Using HW render, OpenGL driver forced.\n"); current_video = &video_gl; -#endif } +#endif if (current_video) return true; @@ -2380,9 +2387,18 @@ void video_driver_frame(const void *data, unsigned width, video_driver_msg[0] = '\0'; if ( video_info.font_enable - && runloop_msg_queue_pull((const char**)&msg) + && runloop_msg_queue_pull((const char**)&msg) && msg) + { +#ifdef HAVE_THREADS + /* the msg pointer may point to data modified by another thread */ + runloop_msg_queue_lock(); +#endif strlcpy(video_driver_msg, msg, sizeof(video_driver_msg)); +#ifdef HAVE_THREADS + runloop_msg_queue_unlock(); +#endif + } video_driver_active = current_video->frame( video_driver_data, data, width, height, @@ -2391,8 +2407,9 @@ void video_driver_frame(const void *data, unsigned width, video_driver_frame_count++; + // Display the FPS, with a higher priority. if (video_info.fps_show) - runloop_msg_queue_push(video_info.fps_text, 1, 1, false); + runloop_msg_queue_push(video_info.fps_text, 2, 1, true); } void video_driver_display_type_set(enum rarch_display_type type) @@ -2457,6 +2474,17 @@ static void video_shader_driver_use_null(void *data, (void)set_active; } +static bool video_driver_cb_set_coords(void *handle_data, + void *shader_data, const struct video_coords *coords) +{ + video_shader_ctx_coords_t ctx_coords; + ctx_coords.handle_data = handle_data; + ctx_coords.data = coords; + + video_driver_set_coords(&ctx_coords); + return true; +} + void video_driver_build_info(video_frame_info_t *video_info) { bool is_perfcnt_enable = false; @@ -2563,7 +2591,11 @@ void video_driver_build_info(video_frame_info_t *video_info) video_info->cb_set_resize = current_video_context.set_resize; video_info->cb_shader_use = video_driver_cb_shader_use; - video_info->cb_shader_set_mvp = video_driver_cb_shader_set_mvp; + video_info->cb_set_mvp = video_driver_cb_shader_set_mvp; + +#if 0 + video_info->cb_set_coords = video_driver_cb_set_coords; +#endif #ifdef HAVE_THREADS video_driver_threaded_unlock(is_threaded); @@ -3179,39 +3211,16 @@ static enum gfx_wrap_type video_shader_driver_wrap_type_null( return RARCH_WRAP_BORDER; } -static bool video_shader_driver_set_mvp_null(void *data, - void *shader_data, const math_matrix_4x4 *mat) +static bool video_driver_cb_set_mvp(void *data, + void *shader_data, const void *mat_data) { - return false; -} + video_shader_ctx_mvp_t mvp; + mvp.data = data; + mvp.matrix = mat_data; -#ifdef HAVE_OPENGL -#ifndef NO_GL_FF_MATRIX -static bool video_shader_driver_set_mvp_null_gl(void *data, - void *shader_data, const math_matrix_4x4 *mat) -{ - gl_ff_matrix(mat); - return false; + video_driver_set_mvp(&mvp); + return true; } -#endif -#endif - -static bool video_shader_driver_set_coords_null(void *handle_data, - void *shader_data, const struct video_coords *coords) -{ - return false; -} - -#ifdef HAVE_OPENGL -#ifndef NO_GL_FF_VERTEX -static bool video_shader_driver_set_coords_null_gl(void *handle_data, - void *shader_data, const struct video_coords *coords) -{ - gl_ff_vertex(coords); - return false; -} -#endif -#endif static struct video_shader *video_shader_driver_get_current_shader_null(void *data) { @@ -3270,32 +3279,12 @@ static void video_shader_driver_reset_to_defaults(void) video_driver_cb_shader_set_mvp = current_shader->set_mvp; else { -#ifdef HAVE_OPENGL -#ifndef NO_GL_FF_MATRIX - if (string_is_equal_fast(video_driver_get_ident(), "gl", 2)) - { - current_shader->set_mvp = video_shader_driver_set_mvp_null_gl; - video_driver_cb_shader_set_mvp = video_shader_driver_set_mvp_null_gl; - } - else -#endif -#endif - { - current_shader->set_mvp = video_shader_driver_set_mvp_null; - video_driver_cb_shader_set_mvp = video_shader_driver_set_mvp_null; - } + current_shader->set_mvp = video_driver_cb_set_mvp; + video_driver_cb_shader_set_mvp = video_driver_cb_set_mvp; } if (!current_shader->set_coords) - { -#ifdef HAVE_OPENGL -#ifndef NO_GL_FF_VERTEX - if (string_is_equal_fast(video_driver_get_ident(), "gl", 2)) - current_shader->set_coords = video_shader_driver_set_coords_null_gl; - else -#endif -#endif - current_shader->set_coords = video_shader_driver_set_coords_null; - } + current_shader->set_coords = video_driver_cb_set_coords; + if (current_shader->use) video_driver_cb_shader_use = current_shader->use; else @@ -3384,14 +3373,19 @@ bool video_shader_driver_info(video_shader_ctx_info_t *shader_info) bool video_shader_driver_filter_type(video_shader_ctx_filter_t *filter) { - return (filter) ? current_shader->filter_type(shader_data, - filter->index, filter->smooth) : false; + if (filter) + return current_shader->filter_type(shader_data, + filter->index, filter->smooth); + return false; } -bool video_shader_driver_compile_program(struct shader_program_info *program_info) +bool video_shader_driver_compile_program( + struct shader_program_info *program_info) { - return (program_info) ? current_shader->compile_program(program_info->data, - program_info->idx, NULL, program_info) : false; + if (program_info) + return current_shader->compile_program(program_info->data, + program_info->idx, NULL, program_info); + return false; } bool video_shader_driver_wrap_type(video_shader_ctx_wrap_t *wrap) @@ -3400,19 +3394,66 @@ bool video_shader_driver_wrap_type(video_shader_ctx_wrap_t *wrap) return true; } -bool renderchain_d3d_init_first(const d3d_renderchain_driver_t **renderchain_driver, - void **renderchain_handle) +void video_driver_set_coords(video_shader_ctx_coords_t *coords) +{ + if (current_shader && current_shader->set_coords) + current_shader->set_coords(coords->handle_data, shader_data, (const struct video_coords*)coords->data); + else + { + if (video_driver_poke && video_driver_poke->set_coords) + video_driver_poke->set_coords(coords->handle_data, shader_data, (const struct video_coords*)coords->data); + } +} + +void video_driver_set_mvp(video_shader_ctx_mvp_t *mvp) +{ + if (!mvp || !mvp->matrix) + return; + + if (current_shader && current_shader->set_mvp) + current_shader->set_mvp(mvp->data, shader_data, mvp->matrix); + else + { + if (video_driver_poke && video_driver_poke->set_mvp) + video_driver_poke->set_mvp(mvp->data, shader_data, mvp->matrix); + } +} + +bool renderchain_d3d_init_first( + const d3d_renderchain_driver_t **renderchain_driver, + void **renderchain_handle) { unsigned i; - for (i = 0; renderchain_drivers[i]; i++) + for (i = 0; renderchain_d3d_drivers[i]; i++) { - void *data = renderchain_drivers[i]->chain_new(); + void *data = renderchain_d3d_drivers[i]->chain_new(); if (!data) continue; - *renderchain_driver = renderchain_drivers[i]; + *renderchain_driver = renderchain_d3d_drivers[i]; + *renderchain_handle = data; + return true; + } + + return false; +} + +bool renderchain_gl_init_first( + const gl_renderchain_driver_t **renderchain_driver, + void **renderchain_handle) +{ + unsigned i; + + for (i = 0; renderchain_gl_drivers[i]; i++) + { + void *data = renderchain_gl_drivers[i]->chain_new(); + + if (!data) + continue; + + *renderchain_driver = renderchain_gl_drivers[i]; *renderchain_handle = data; return true; } diff --git a/gfx/video_driver.h b/gfx/video_driver.h index b2b67ec973..0267c11e6d 100644 --- a/gfx/video_driver.h +++ b/gfx/video_driver.h @@ -233,10 +233,8 @@ typedef struct shader_backend unsigned index, struct gfx_fbo_scale *scale); bool (*set_coords)(void *handle_data, void *shader_data, const struct video_coords *coords); - bool (*set_coords_fallback)(void *handle_data, - void *shader_data, const struct video_coords *coords); bool (*set_mvp)(void *data, void *shader_data, - const math_matrix_4x4 *mat); + const void *mat_data); unsigned (*get_prev_textures)(void *data); bool (*get_feedback_pass)(void *data, unsigned *pass); bool (*mipmap_input)(void *data, unsigned index); @@ -301,7 +299,7 @@ typedef struct video_shader_ctx_info typedef struct video_shader_ctx_mvp { void *data; - const math_matrix_4x4 *matrix; + const void *matrix; } video_shader_ctx_mvp_t; typedef struct video_shader_ctx_filter @@ -468,8 +466,12 @@ typedef struct video_frame_info bool (*cb_set_resize)(void*, unsigned, unsigned); void (*cb_shader_use)(void *data, void *shader_data, unsigned index, bool set_active); - bool (*cb_shader_set_mvp)(void *data, void *shader_data, - const math_matrix_4x4 *mat); +#if 0 + bool (*cb_set_coords)(void *handle_data, + void *shader_data, const struct video_coords *coords); +#endif + bool (*cb_set_mvp)(void *data, void *shader_data, + const void *mat_data); void *context_data; void *shader_data; @@ -671,6 +673,10 @@ struct aspect_ratio_elem typedef struct video_poke_interface { + void (*set_coords)(void *handle_data, void *shader_data, + const struct video_coords *coords); + void (*set_mvp)(void *data, void *shader_data, + const void *mat_data); uintptr_t (*load_texture)(void *video_data, void *data, bool threaded, enum texture_filter_type filter_type); void (*unload_texture)(void *data, uintptr_t id); @@ -797,6 +803,9 @@ typedef struct video_driver typedef struct d3d_renderchain_driver { + void (*set_mvp)(void *chain_data, + void *data, unsigned vp_width, + unsigned vp_height, unsigned rotation); void (*chain_free)(void *data); void *(*chain_new)(void); bool (*reinit)(void *data, const void *info_data); @@ -827,6 +836,47 @@ typedef struct d3d_renderchain_driver typedef struct gl_renderchain_driver { + void (*set_coords)(void *handle_data, + void *shader_data, const struct video_coords *coords); + void (*set_mvp)(void *data, void *shader_data, + const void *mat_data); + void (*init_texture_reference)( + void *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 (*readback)(void *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 (*copy_frame)( + void *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 (*ff_vertex)(const void *data); + void (*ff_matrix)(const void *data); + void (*bind_backbuffer)(void); + void (*deinit_fbo)(void *data); + void (*viewport_info)( + void *data, struct video_viewport *vp); + bool (*read_viewport)( + void *data, uint8_t *buffer, bool is_idle); + void (*bind_prev_texture)( + void *data, + const struct video_tex_info *tex_info); + void (*chain_free)(void *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); @@ -1236,17 +1286,13 @@ bool video_shader_driver_get_feedback_pass(unsigned *data); bool video_shader_driver_mipmap_input(unsigned *index); -#define video_shader_driver_set_coords(coords) \ - if (!current_shader->set_coords(coords.handle_data, shader_data, (const struct video_coords*)coords.data) && current_shader->set_coords_fallback) \ - current_shader->set_coords_fallback(coords.handle_data, shader_data, (const struct video_coords*)coords.data) +void video_driver_set_coords(video_shader_ctx_coords_t *coords); bool video_shader_driver_scale(video_shader_ctx_scale_t *scaler); bool video_shader_driver_info(video_shader_ctx_info_t *shader_info); -#define video_shader_driver_set_mvp(mvp) \ - if (mvp.matrix) \ - current_shader->set_mvp(mvp.data, shader_data, mvp.matrix) \ +void video_driver_set_mvp(video_shader_ctx_mvp_t *mvp); bool video_shader_driver_filter_type(video_shader_ctx_filter_t *filter); @@ -1261,6 +1307,10 @@ bool renderchain_d3d_init_first( const d3d_renderchain_driver_t **renderchain_driver, void **renderchain_handle); +bool renderchain_gl_init_first( + const gl_renderchain_driver_t **renderchain_driver, + void **renderchain_handle); + extern bool (*video_driver_cb_has_focus)(void); extern shader_backend_t *current_shader; @@ -1321,7 +1371,9 @@ extern const shader_backend_t shader_null_backend; extern d3d_renderchain_driver_t d3d8_renderchain; extern d3d_renderchain_driver_t cg_d3d9_renderchain; extern d3d_renderchain_driver_t hlsl_d3d9_renderchain; -extern d3d_renderchain_driver_t null_renderchain; +extern d3d_renderchain_driver_t null_d3d_renderchain; + +extern gl_renderchain_driver_t gl2_renderchain; RETRO_END_DECLS diff --git a/gfx/video_thread_wrapper.c b/gfx/video_thread_wrapper.c index 3a35893573..59739117f4 100644 --- a/gfx/video_thread_wrapper.c +++ b/gfx/video_thread_wrapper.c @@ -1257,6 +1257,8 @@ static struct video_shader *thread_get_current_shader(void *data) } static const video_poke_interface_t thread_poke = { + NULL, /* set_coords */ + NULL, /* set_mvp */ thread_load_texture, thread_unload_texture, thread_set_video_mode, diff --git a/griffin/griffin.c b/griffin/griffin.c index 1a64bde2f4..9b4a08f305 100644 --- a/griffin/griffin.c +++ b/griffin/griffin.c @@ -279,6 +279,13 @@ VIDEO SHADERS #include "../gfx/drivers_shader/shader_glsl.c" #endif +#if defined(HAVE_D3D) + +#ifdef HAVE_HLSL +#include "../gfx/drivers_shader/shader_hlsl.c" +#endif +#endif + /*============================================================ VIDEO IMAGE ============================================================ */ @@ -322,6 +329,10 @@ VIDEO DRIVER #if defined(HAVE_D3D9) +#ifdef HAVE_HLSL +#include "../gfx/drivers_renderchain/d3d9_hlsl_renderchain.c" +#endif + #ifdef HAVE_CG #include "../gfx/drivers_renderchain/d3d9_cg_renderchain.c" #endif diff --git a/griffin/griffin_cpp.cpp b/griffin/griffin_cpp.cpp index 5827eb94bd..620c2002fa 100644 --- a/griffin/griffin_cpp.cpp +++ b/griffin/griffin_cpp.cpp @@ -97,17 +97,6 @@ MENU #include "../menu/drivers/xui.cpp" #endif -/*============================================================ -VIDEO CONTEXT -============================================================ */ - -#if defined(HAVE_D3D) - -#ifdef HAVE_HLSL -#include "../gfx/drivers_shader/shader_hlsl.cpp" -#endif -#endif - /*============================================================ UI ============================================================ */ @@ -127,10 +116,6 @@ UI /*============================================================ VIDEO DRIVER ============================================================ */ -#if defined(HAVE_D3D) && defined(HAVE_D3D9) && defined(HAVE_HLSL) -#include "../gfx/drivers_renderchain/d3d9_hlsl_renderchain.cpp" -#endif - #ifdef HAVE_VULKAN #include "../gfx/drivers_shader/shader_vulkan.cpp" #include "../gfx/drivers_shader/glslang_util.cpp" diff --git a/input/connect/connect_nesusb.c b/input/connect/connect_nesusb.c index 3cfadcdca2..04b24d6746 100644 --- a/input/connect/connect_nesusb.c +++ b/input/connect/connect_nesusb.c @@ -86,10 +86,10 @@ static void hidpad_nesusb_packet_handler(void *data, uint8_t *packet, uint16_t s uint32_t i, pressed_keys; static const uint32_t button_mapping[17] = { - NO_BTN, - NO_BTN, - NO_BTN, - NO_BTN, + RETRO_DEVICE_ID_JOYPAD_L2, + RETRO_DEVICE_ID_JOYPAD_R2, + RETRO_DEVICE_ID_JOYPAD_L, + RETRO_DEVICE_ID_JOYPAD_R, RETRO_DEVICE_ID_JOYPAD_SELECT, RETRO_DEVICE_ID_JOYPAD_START, NO_BTN, @@ -100,8 +100,8 @@ static void hidpad_nesusb_packet_handler(void *data, uint8_t *packet, uint16_t s NO_BTN, RETRO_DEVICE_ID_JOYPAD_B, RETRO_DEVICE_ID_JOYPAD_A, - NO_BTN, - NO_BTN, + RETRO_DEVICE_ID_JOYPAD_Y, + RETRO_DEVICE_ID_JOYPAD_X, 16, /* HOME BUTTON when pressing SELECT+START */ }; struct hidpad_nesusb_data *device = (struct hidpad_nesusb_data*)data; diff --git a/input/connect/connect_psxadapter.c b/input/connect/connect_psxadapter.c index 2985d44183..d05bfc3793 100644 --- a/input/connect/connect_psxadapter.c +++ b/input/connect/connect_psxadapter.c @@ -25,7 +25,7 @@ struct hidpad_psxadapter_data { struct pad_connection* connection; - uint8_t data[8]; + uint8_t data[64]; uint32_t slot; uint64_t buttons; }; diff --git a/input/drivers/dinput.c b/input/drivers/dinput.c index e376dfb68e..f890444e46 100644 --- a/input/drivers/dinput.c +++ b/input/drivers/dinput.c @@ -85,7 +85,7 @@ struct dinput_input int mouse_rel_y; int mouse_x; int mouse_y; - bool mouse_l, mouse_r, mouse_m, mouse_wu, mouse_wd, mouse_hwu, mouse_hwd; + bool mouse_l, mouse_r, mouse_m, mouse_b4, mouse_b5, mouse_wu, mouse_wd, mouse_hwu, mouse_hwd; struct pointer_status pointer_head; /* dummy head for easier iteration */ }; @@ -246,6 +246,8 @@ static void dinput_poll(void *data) di->mouse_l = mouse_state.rgbButtons[0]; di->mouse_r = mouse_state.rgbButtons[1]; di->mouse_m = mouse_state.rgbButtons[2]; + di->mouse_b4 = mouse_state.rgbButtons[3]; + di->mouse_b5 = mouse_state.rgbButtons[4]; /* No simple way to get absolute coordinates * for RETRO_DEVICE_POINTER. Just use Win32 APIs. */ @@ -368,6 +370,10 @@ static int16_t dinput_mouse_state(struct dinput_input *di, unsigned id) return state; case RETRO_DEVICE_ID_MOUSE_MIDDLE: return di->mouse_m; + case RETRO_DEVICE_ID_MOUSE_BUTTON_4: + return di->mouse_b4; + case RETRO_DEVICE_ID_MOUSE_BUTTON_5: + return di->mouse_b5; } return 0; diff --git a/input/drivers/sdl_input.c b/input/drivers/sdl_input.c index 83d18551d3..5b462d55ff 100644 --- a/input/drivers/sdl_input.c +++ b/input/drivers/sdl_input.c @@ -38,7 +38,7 @@ typedef struct sdl_input int mouse_x, mouse_y; int mouse_abs_x, mouse_abs_y; - int mouse_l, mouse_r, mouse_m, mouse_wu, mouse_wd, mouse_wl, mouse_wr; + int mouse_l, mouse_r, mouse_m, mouse_b4, mouse_b5, mouse_wu, mouse_wd, mouse_wl, mouse_wr; } sdl_input_t; static void *sdl_input_init(const char *joypad_driver) @@ -131,6 +131,10 @@ static int16_t sdl_mouse_device_state(sdl_input_t *sdl, unsigned id) return sdl->mouse_y; case RETRO_DEVICE_ID_MOUSE_MIDDLE: return sdl->mouse_m; + case RETRO_DEVICE_ID_MOUSE_BUTTON_4: + return sdl->mouse_b4; + case RETRO_DEVICE_ID_MOUSE_BUTTON_5: + return sdl->mouse_b5; } return 0; @@ -310,6 +314,8 @@ static void sdl_poll_mouse(sdl_input_t *sdl) sdl->mouse_l = (SDL_BUTTON(SDL_BUTTON_LEFT) & btn) ? 1 : 0; sdl->mouse_r = (SDL_BUTTON(SDL_BUTTON_RIGHT) & btn) ? 1 : 0; sdl->mouse_m = (SDL_BUTTON(SDL_BUTTON_MIDDLE) & btn) ? 1 : 0; + sdl->mouse_b4 = (SDL_BUTTON(SDL_BUTTON_X1) & btn) ? 1 : 0; + sdl->mouse_b5 = (SDL_BUTTON(SDL_BUTTON_X2) & btn) ? 1 : 0; #ifndef HAVE_SDL2 sdl->mouse_wu = (SDL_BUTTON(SDL_BUTTON_WHEELUP) & btn) ? 1 : 0; sdl->mouse_wd = (SDL_BUTTON(SDL_BUTTON_WHEELDOWN) & btn) ? 1 : 0; diff --git a/input/drivers/wiiu_input.c b/input/drivers/wiiu_input.c index b88395bd97..9673947317 100644 --- a/input/drivers/wiiu_input.c +++ b/input/drivers/wiiu_input.c @@ -105,7 +105,7 @@ static int16_t wiiu_pointer_device_state(wiiu_input_t* wiiu, unsigned id) switch (id) { case RETRO_DEVICE_ID_POINTER_PRESSED: - return wiiu->joypad->get_buttons(0) & VPAD_BUTTON_TOUCH; + return (wiiu->joypad->get_buttons(0) & VPAD_BUTTON_TOUCH) ? 1 : 0; case RETRO_DEVICE_ID_POINTER_X: return wiiu->joypad->axis(0, 0xFFFF0004UL); case RETRO_DEVICE_ID_POINTER_Y: diff --git a/input/drivers/winraw_input.c b/input/drivers/winraw_input.c index bb44a0b92e..cd844e838e 100644 --- a/input/drivers/winraw_input.c +++ b/input/drivers/winraw_input.c @@ -32,7 +32,7 @@ typedef struct HANDLE hnd; LONG x, y, dlt_x, dlt_y; LONG whl_u, whl_d; - bool btn_l, btn_m, btn_r; + bool btn_l, btn_m, btn_r, btn_b4, btn_b5; } winraw_mouse_t; typedef struct @@ -279,6 +279,10 @@ static int16_t winraw_mouse_state(winraw_input_t *wr, return mouse->whl_d ? 1 : 0; case RETRO_DEVICE_ID_MOUSE_MIDDLE: return mouse->btn_m ? 1 : 0; + case RETRO_DEVICE_ID_MOUSE_BUTTON_4: + return mouse->btn_b4 ? 1 : 0; + case RETRO_DEVICE_ID_MOUSE_BUTTON_5: + return mouse->btn_b5 ? 1 : 0; } return 0; @@ -419,6 +423,16 @@ static void winraw_update_mouse_state(winraw_mouse_t *mouse, RAWMOUSE *state) else if (state->usButtonFlags & RI_MOUSE_RIGHT_BUTTON_UP) mouse->btn_r = false; + if (state->usButtonFlags & RI_MOUSE_BUTTON_4_DOWN) + mouse->btn_b4 = true; + else if (state->usButtonFlags & RI_MOUSE_BUTTON_4_UP) + mouse->btn_b4 = false; + + if (state->usButtonFlags & RI_MOUSE_BUTTON_5_DOWN) + mouse->btn_b5 = true; + else if (state->usButtonFlags & RI_MOUSE_BUTTON_5_UP) + mouse->btn_b5 = false; + if (state->usButtonFlags & RI_MOUSE_WHEEL) { if ((SHORT)state->usButtonData > 0) @@ -566,6 +580,8 @@ static void winraw_poll(void *d) wr->mice[i].btn_l = g_mice[i].btn_l; wr->mice[i].btn_m = g_mice[i].btn_m; wr->mice[i].btn_r = g_mice[i].btn_r; + wr->mice[i].btn_b4 = g_mice[i].btn_b4; + wr->mice[i].btn_b5 = g_mice[i].btn_b5; } if (wr->joypad) diff --git a/input/drivers_joypad/mfi_joypad.m b/input/drivers_joypad/mfi_joypad.m index 56f69024c9..ef6f025746 100644 --- a/input/drivers_joypad/mfi_joypad.m +++ b/input/drivers_joypad/mfi_joypad.m @@ -138,7 +138,7 @@ static void apple_gamecontroller_joypad_connect(GCController *controller) ? desired_index : 0; /* prevent same controller getting set twice */ - if (mfi_controllers[desired_index] != controller.hash) + if (mfi_controllers[desired_index] != (uint32_t)controller.hash) { /* desired slot is unused, take it */ if (!mfi_controllers[desired_index]) diff --git a/input/drivers_joypad/wiiu_joypad.c b/input/drivers_joypad/wiiu_joypad.c index 9414615f34..71f23aa99b 100644 --- a/input/drivers_joypad/wiiu_joypad.c +++ b/input/drivers_joypad/wiiu_joypad.c @@ -50,8 +50,6 @@ #define KPAD_OFFSET (GAMEPAD_OFFSET + GAMEPAD_COUNT) #define HID_OFFSET (KPAD_OFFSET + KPAD_COUNT) -extern uint64_t lifecycle_state; - 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}; @@ -65,17 +63,16 @@ static char hidName[HID_COUNT][255]; static const char* wiiu_joypad_name(unsigned pad) { - if (pad == 0) + if (pad > MAX_PADS) return "N/A"; + + if (pad == GAMEPAD_OFFSET) return "WIIU Gamepad"; - if (pad < MAX_PADS && pad < (HID_OFFSET) && pad > GAMEPAD_OFFSET) + if (pad >= KPAD_OFFSET && pad < KPAD_OFFSET + KPAD_COUNT) { int i = pad - KPAD_OFFSET; switch (pad_type[i]) { - case WIIUINPUT_TYPE_NONE: - return "N/A"; - case WIIUINPUT_TYPE_PRO_CONTROLLER: return "WIIU Pro Controller"; @@ -87,13 +84,17 @@ static const char* wiiu_joypad_name(unsigned pad) case WIIUINPUT_TYPE_CLASSIC_CONTROLLER: return "Classic Controller"; + + case WIIUINPUT_TYPE_NONE: + default: + return "N/A"; } } - if (pad < MAX_PADS) + 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); + 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]; } @@ -165,13 +166,12 @@ static int16_t wiiu_joypad_axis(unsigned port_num, uint32_t joyaxis) val = analog_state[port_num][1][1]; break; + //For position data; just return the unmodified value case 4: - val = analog_state[port_num][2][0]; - break; + return analog_state[port_num][2][0]; case 5: - val = analog_state[port_num][2][1]; - break; + return analog_state[port_num][2][1]; } if (is_neg && val > 0) @@ -182,9 +182,9 @@ static int16_t wiiu_joypad_axis(unsigned port_num, uint32_t joyaxis) return val; } -static float scaleTP(float oldMin, float oldMax, float newMin, float newMax, float val) { - float oldRange = (oldMax - oldMin); - float newRange = (newMax - newMin); +static int16_t scaleTP(int16_t oldMin, int16_t oldMax, int16_t newMin, int16_t newMax, int16_t val) { + int32_t oldRange = oldMax - oldMin; + int32_t newRange = newMax - newMin; return (((val - oldMin) * newRange) / oldRange) + newMin; } @@ -204,8 +204,6 @@ static void wiiu_joypad_poll(void) analog_state[0][RETRO_DEVICE_INDEX_ANALOG_RIGHT] [RETRO_DEVICE_ID_ANALOG_X] = vpad.rightStick.x * 0x7FF0; analog_state[0][RETRO_DEVICE_INDEX_ANALOG_RIGHT] [RETRO_DEVICE_ID_ANALOG_Y] = vpad.rightStick.y * 0x7FF0; - BIT64_CLEAR(lifecycle_state, RARCH_MENU_TOGGLE); - /* You can only call VPADData once every loop, else the second one won't get any data. Thus; I had to hack touch support into the existing joystick API. Woo-hoo? Misplaced requests for touch axis are filtered @@ -217,13 +215,38 @@ static void wiiu_joypad_poll(void) VPADTouchData cal = {0}; /* Calibrates data to a 720p screen, seems to clamp outer 12px */ VPADGetTPCalibratedPoint(0, &cal, &(vpad.tpNormal)); - /* Calibrate to viewport and save as axis 2 (idx 4,5) */ - analog_state[0][2][0] = (int16_t)scaleTP(12.0f, 1268.0f, 0.0f, (float)(vp.full_width), (float)cal.x); - analog_state[0][2][1] = (int16_t)scaleTP(12.0f, 708.0f, 0.0f, (float)(vp.full_height), (float)cal.y); + /* Clamp to actual game image */ + bool touchClamped = false; + if (cal.x < vp.x) { + cal.x = vp.x; + touchClamped = true; + } else if (cal.x > vp.x + vp.width) { + cal.x = vp.x + vp.width; + touchClamped = true; + } + if (cal.y < vp.y) { + cal.y = vp.y; + touchClamped = true; + } else if (cal.y > vp.y + vp.height) { + cal.y = vp.y + vp.height; + touchClamped = true; + } + /* Account for 12px clamp on VPADGetTPCalibratedPoint */ + if (vp.x < 12) vp.x = 12; + if (vp.y < 12) vp.y = 12; + if (vp.x + vp.width > 1268) vp.width = 1268 - vp.x; + if (vp.y + vp.height > 708) vp.height = 708 - vp.y; + /* Calibrate to libretro spec and save as axis 2 (idx 4,5) */ + analog_state[0][2][0] = scaleTP(vp.x, vp.x + vp.width, -0x7fff, 0x7fff, cal.x); + analog_state[0][2][1] = scaleTP(vp.y, vp.y + vp.height, -0x7fff, 0x7fff, cal.y); - /* Emulating a button for touch; lets people assign it to menu + /* Emulating a button (#19) for touch; lets people assign it to menu for that traditional RetroArch Wii U feel */ - pad_state[0] |= VPAD_BUTTON_TOUCH; + if (!touchClamped) { + pad_state[0] |= VPAD_BUTTON_TOUCH; + } else { + pad_state[0] &= ~VPAD_BUTTON_TOUCH; + } } else { /* This is probably 0 anyway */ pad_state[0] &= ~VPAD_BUTTON_TOUCH; diff --git a/input/input_driver.c b/input/input_driver.c index c28b4d42da..a4af4525cb 100644 --- a/input/input_driver.c +++ b/input/input_driver.c @@ -1609,53 +1609,99 @@ int16_t input_joypad_analog(const input_device_driver_t *drv, unsigned port, unsigned idx, unsigned ident, const struct retro_keybind *binds) { - uint32_t axis_minus, axis_plus; - int16_t pressed_minus, pressed_plus, res; - unsigned ident_minus = 0; - unsigned ident_plus = 0; - const struct retro_keybind *bind_minus = NULL; - const struct retro_keybind *bind_plus = NULL; + int16_t res; - input_conv_analog_id_to_bind_id(idx, ident, &ident_minus, &ident_plus); + if ( idx == RETRO_DEVICE_INDEX_ANALOG_BUTTON ) + { + /* A RETRO_DEVICE_JOYPAD button? */ + if ( ident < RARCH_FIRST_CUSTOM_BIND ) + { + uint32_t axis = 0; + const struct retro_keybind *bind = NULL; - bind_minus = &binds[ident_minus]; - bind_plus = &binds[ident_plus]; + bind = &binds[ ident ]; + if (!bind->valid) + return 0; - if (!bind_minus->valid || !bind_plus->valid) - return 0; + axis = bind->joyaxis; + if ( axis == AXIS_NONE ) + axis = joypad_info.auto_binds[ ident ].joyaxis; - axis_minus = bind_minus->joyaxis; - axis_plus = bind_plus->joyaxis; + /* Analog button. */ + res = abs( drv->axis( joypad_info.joy_idx, axis ) ); - if (axis_minus == AXIS_NONE) - axis_minus = joypad_info.auto_binds[ident_minus].joyaxis; - if (axis_plus == AXIS_NONE) - axis_plus = joypad_info.auto_binds[ident_plus].joyaxis; + /* If the result is zero, it's got a digital button attached to it */ + if ( res == 0 ) + { + uint64_t key = bind->joykey; - pressed_minus = abs(drv->axis(joypad_info.joy_idx, axis_minus)); - pressed_plus = abs(drv->axis(joypad_info.joy_idx, axis_plus)); - res = pressed_plus - pressed_minus; + if ( key == NO_BTN ) + key = joypad_info.auto_binds[ ident ].joykey; - if (res == 0) - { - int16_t digital_left = 0; - int16_t digital_right = 0; - uint64_t key_minus = bind_minus->joykey; - uint64_t key_plus = bind_plus->joykey; + if ( drv->button(joypad_info.joy_idx, (uint16_t)key)) + res = 0x7fff; + } + } + else + { + /* not a suitable button */ + res = 0; + } + } + else + { + /* Analog sticks. Either RETRO_DEVICE_INDEX_ANALOG_LEFT + * or RETRO_DEVICE_INDEX_ANALOG_RIGHT */ - if (key_minus == NO_BTN) - key_minus = joypad_info.auto_binds[ident_minus].joykey; - if (key_plus == NO_BTN) - key_plus = joypad_info.auto_binds[ident_plus].joykey; + uint32_t axis_minus, axis_plus; + int16_t pressed_minus, pressed_plus; + unsigned ident_minus = 0; + unsigned ident_plus = 0; + const struct retro_keybind *bind_minus = NULL; + const struct retro_keybind *bind_plus = NULL; - if (drv->button(joypad_info.joy_idx, (uint16_t)key_minus)) - digital_left = -0x7fff; - if (drv->button(joypad_info.joy_idx, (uint16_t)key_plus)) - digital_right = 0x7fff; - return digital_right + digital_left; - } + input_conv_analog_id_to_bind_id(idx, ident, &ident_minus, &ident_plus); - return res; + bind_minus = &binds[ident_minus]; + bind_plus = &binds[ident_plus]; + + if (!bind_minus->valid || !bind_plus->valid) + return 0; + + axis_minus = bind_minus->joyaxis; + axis_plus = bind_plus->joyaxis; + + if (axis_minus == AXIS_NONE) + axis_minus = joypad_info.auto_binds[ident_minus].joyaxis; + if (axis_plus == AXIS_NONE) + axis_plus = joypad_info.auto_binds[ident_plus].joyaxis; + + pressed_minus = abs(drv->axis(joypad_info.joy_idx, axis_minus)); + pressed_plus = abs(drv->axis(joypad_info.joy_idx, axis_plus)); + res = pressed_plus - pressed_minus; + + if (res == 0) + { + int16_t digital_left = 0; + int16_t digital_right = 0; + uint64_t key_minus = bind_minus->joykey; + uint64_t key_plus = bind_plus->joykey; + + if (key_minus == NO_BTN) + key_minus = joypad_info.auto_binds[ident_minus].joykey; + if (key_plus == NO_BTN) + key_plus = joypad_info.auto_binds[ident_plus].joykey; + + if (drv->button(joypad_info.joy_idx, (uint16_t)key_minus)) + digital_left = -0x7fff; + if (drv->button(joypad_info.joy_idx, (uint16_t)key_plus)) + digital_right = 0x7fff; + + return digital_right + digital_left; + } + } + + return res; } /** diff --git a/input/input_driver.h b/input/input_driver.h index 17d135402d..3267efeacd 100644 --- a/input/input_driver.h +++ b/input/input_driver.h @@ -520,6 +520,7 @@ static INLINE bool input_joypad_pressed( * E.g.: * - RETRO_DEVICE_INDEX_ANALOG_LEFT * - RETRO_DEVICE_INDEX_ANALOG_RIGHT + * - RETRO_DEVICE_INDEX_ANALOG_BUTTON * @ident : Analog key identifier. * E.g.: * - RETRO_DEVICE_ID_ANALOG_X diff --git a/input/input_mapper.c b/input/input_mapper.c index e0b20bdcc0..01b50fbdf7 100644 --- a/input/input_mapper.c +++ b/input/input_mapper.c @@ -48,12 +48,12 @@ struct input_mapper { /* The controller port that will be polled*/ uint8_t port; - /* This is a bitmask of (1 << key_bind_id). */ - uint64_t buttons; /* Left X, Left Y, Right X, Right Y */ int16_t analog[4]; /* the whole keyboard state */ uint32_t keys[RETROK_LAST / 32 + 1]; + /* This is a bitmask of (1 << key_bind_id). */ + uint64_t buttons; }; static input_mapper_t *mapper_ptr; @@ -63,11 +63,11 @@ input_mapper_t *input_mapper_new(uint16_t port) settings_t *settings = config_get_ptr(); input_mapper_t* handle = (input_mapper_t*) calloc(1, sizeof(*handle)); - if (!handle) return NULL; + handle->port = port; - mapper_ptr = handle; + mapper_ptr = handle; return handle; } diff --git a/input/input_overlay.c b/input/input_overlay.c index 507b1c4309..01bea5f40c 100644 --- a/input/input_overlay.c +++ b/input/input_overlay.c @@ -39,31 +39,32 @@ typedef struct input_overlay_state { - /* This is a bitmask of (1 << key_bind_id). */ - uint64_t buttons; /* Left X, Left Y, Right X, Right Y */ int16_t analog[4]; - uint32_t keys[RETROK_LAST / 32 + 1]; + /* This is a bitmask of (1 << key_bind_id). */ + uint64_t buttons; } input_overlay_state_t; struct input_overlay { - void *iface_data; - const video_overlay_interface_t *iface; - input_overlay_state_t overlay_state; - bool enable; + enum overlay_status state; + bool enable; bool blocked; bool alive; - struct overlay *overlays; - const struct overlay *active; + unsigned next_index; + size_t index; size_t size; - unsigned next_index; - enum overlay_status state; + struct overlay *overlays; + const struct overlay *active; + void *iface_data; + const video_overlay_interface_t *iface; + + input_overlay_state_t overlay_state; }; input_overlay_t *overlay_ptr = NULL; diff --git a/intl/msg_hash_chs.h b/intl/msg_hash_chs.h index 9fcdf549a7..142ffad5d7 100644 --- a/intl/msg_hash_chs.h +++ b/intl/msg_hash_chs.h @@ -1674,6 +1674,8 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_PIXEL, "Pixel") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_RETROACTIVE, "RetroActive") +MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_RETROSYSTEM, + "Retrosystem") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_DOTART, "Dot-Art") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME, @@ -2163,6 +2165,8 @@ MSG_HASH(MSG_SKIPPING_SRAM_LOAD, "跳过 SRAM 加载。") MSG_HASH(MSG_SLOW_MOTION, "慢动作。") +MSG_HASH(MSG_FAST_FORWARD, + "快进。") MSG_HASH(MSG_SLOW_MOTION_REWIND, "慢动作回溯。") MSG_HASH(MSG_SRAM_WILL_NOT_BE_SAVED, diff --git a/intl/msg_hash_cht.h b/intl/msg_hash_cht.h index 5ada1e2891..9e13d1de7d 100644 --- a/intl/msg_hash_cht.h +++ b/intl/msg_hash_cht.h @@ -1674,6 +1674,8 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_PIXEL, "Pixel") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_RETROACTIVE, "RetroActive") +MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_RETROSYSTEM, + "Retrosystem") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_DOTART, "Dot-Art") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME, @@ -2163,6 +2165,8 @@ MSG_HASH(MSG_SKIPPING_SRAM_LOAD, "跳過 SRAM 戴入。") MSG_HASH(MSG_SLOW_MOTION, "慢動作。") +MSG_HASH(MSG_FAST_FORWARD, + "快進。") MSG_HASH(MSG_SLOW_MOTION_REWIND, "慢動作回溯。") MSG_HASH(MSG_SRAM_WILL_NOT_BE_SAVED, diff --git a/intl/msg_hash_de.c b/intl/msg_hash_de.c index d7dca703e5..333f191a49 100644 --- a/intl/msg_hash_de.c +++ b/intl/msg_hash_de.c @@ -1,6 +1,7 @@ -/* RetroArch - A frontend for libretro. +/* RetroArch - A frontend for Libretro. * Copyright (C) 2011-2017 - Daniel De Matteis - * Copyright (C) 2017 - Lothar Serra Mari + * Copyright (C) 2016-2017 - Brad Parker + * Translation currently maintained by Lothar Serra Mari [rootfather] * * 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- @@ -43,7 +44,7 @@ int menu_hash_get_help_de_enum(enum msg_hash_enums msg, char *s, size_t len) break; case RARCH_FAST_FORWARD_HOLD_KEY: snprintf(s, len, - "Halte die Taste gedrückt, um vorzuspulen.\n" + "Taste gedrückt halten, um vorzuspulen.\n" " \n" "Beim Loslassen wird der schnelle Vorlauf beendet." ); @@ -80,7 +81,7 @@ int menu_hash_get_help_de_enum(enum msg_hash_enums msg, char *s, size_t len) break; case RARCH_MUTE: snprintf(s, len, - "Tonwiedergabe stummschalten bzw. Stummschaltung aufheben."); + "Tonwiedergabe ein-/ausschalten."); break; case RARCH_OSK: snprintf(s, len, @@ -96,19 +97,19 @@ int menu_hash_get_help_de_enum(enum msg_hash_enums msg, char *s, size_t len) break; case RARCH_SLOWMOTION: snprintf(s, len, - "Halte die Taste gedrückt, um die Zeitlupe einzuschalten."); + "Taste gedrückt halten, um die Zeitlupe einzuschalten."); break; case RARCH_ENABLE_HOTKEY: snprintf(s, len, - "Andere Hotkeys aktivieren. \n" + "Andere Tastenkürzel aktivieren. \n" " \n" - "Wenn dieser Hotkey entweder einer\n" - "Tastatur, einer Joypad-Taste oder \n" - "Joypad-Achse zugeordnet ist, werden alle \n" - "anderen Hotkeys nur aktiviert, wenn dieser \n" - "Hotkey zur gleichen Zeit gehalten wird. \n" + "Wenn dieses Tastenkürzel entweder einer\n" + "Tastatur, einer Controller-Taste oder \n" + "Controller-Achse zugeordnet ist, werden alle \n" + "anderen Tastenkürzel nur freigeschaltet, wenn \n" + "dieses Tastenkürzel zur gleichen Zeit gehalten wird. \n" " \n" - "Alternativ können auch alle Tastatur-Hotkeys durch \n" + "Alternativ können auch alle Tastatur-Kürzel durch \n" "den Benutzer deaktiviert werden."); break; case RARCH_VOLUME_UP: @@ -134,7 +135,7 @@ int menu_hash_get_help_de_enum(enum msg_hash_enums msg, char *s, size_t len) snprintf(s, len, "Wechselt durch Datenträger-Abbilder. Nach dem Auswerfen verwenden. \n" " \n" - "Zum Abschließen, Datenträger erneut einbinden."); + "Zum Abschließen Datenträger erneut einbinden."); break; case RARCH_GRAB_MOUSE_TOGGLE: snprintf(s, len, @@ -148,7 +149,7 @@ int menu_hash_get_help_de_enum(enum msg_hash_enums msg, char *s, size_t len) snprintf(s, len, "Spiel-Fokus umschalten.\n" " \n" - "Wenn ein Spiel fokussiert ist, wird RetroArch die Hotkeys\n" + "Wenn ein Spiel fokussiert ist, wird RetroArch die Tastenkürzel\n" "deaktivieren und den Mauszeiger im RetroArch-Fenster halten."); break; case RARCH_MENU_TOGGLE: @@ -156,18 +157,18 @@ int menu_hash_get_help_de_enum(enum msg_hash_enums msg, char *s, size_t len) break; case RARCH_LOAD_STATE_KEY: snprintf(s, len, - "Spielstand laden."); + "Zustand (Savestate) laden."); break; case RARCH_FULLSCREEN_TOGGLE_KEY: snprintf(s, len, - "Vollbildmodus umschalten"); + "Vollbildmodus umschalten."); break; case RARCH_QUIT_KEY: snprintf(s, len, "Taste zum Beenden von RetroArch. \n" " \n" - "Wenn Du RetroArch unsanft beendest (SIGKILL, etc.) wird \n" - "RetroArch beendet, ohne Arbeitsspeicher oder ähnliches zu speichern." + "Ein 'hartes' Beenden des Prozesses (SIGKILL, etc.) wird \n" + "RetroArch beenden, ohne Arbeitsspeicher oder ähnliches zu speichern." #ifdef __unix__ "\nAuf unixoiden Systemen erlaubt SIGINT/SIGTERM ein sauberes \n" "Beenden von RetroArch." @@ -179,7 +180,7 @@ int menu_hash_get_help_de_enum(enum msg_hash_enums msg, char *s, size_t len) snprintf(s, len, "Speicherplätze. \n" " \n" - "Wenn der Speicherplatz 0 ausgewählt wird, ist der Name des Spielstands \n" + "Wenn der Speicherplatz 0 ausgewählt wird, ist der Name des Zustands \n" "*.state (oder was entsprechend auf der Kommandozeile definiert wurde). \n" " \n" "Wenn ein anderer Speicherplatz als 0 gewählt wird, wird das Verzeichnis \n" @@ -187,17 +188,17 @@ int menu_hash_get_help_de_enum(enum msg_hash_enums msg, char *s, size_t len) break; case RARCH_SAVE_STATE_KEY: snprintf(s, len, - "Spielstand abspeichern."); + "Aktuellen Zustand (Savestate) abspeichern."); break; case RARCH_REWIND: snprintf(s, len, - "Halte die Taste zum Zurückspulen gedrückt. \n" + "Taste zum Zurückspulen gedrückt halten. \n" " \n" "Die Zurückspulfunktion muss eingeschaltet sein."); break; case RARCH_MOVIE_RECORD_TOGGLE: snprintf(s, len, - "Aufnahme starten/beenden"); + "Aufnahme starten/beenden."); break; default: if (string_is_empty(s)) @@ -217,7 +218,7 @@ int menu_hash_get_help_de_enum(enum msg_hash_enums msg, char *s, size_t len) "Besuche retroachievements.org und eröffne \n" "ein kostenloses Konto. \n" " \n" - "Nach der Registrierung musst Du deinen \n" + "Nach der Registrierung musst du deinen \n" "Benutzernamen und dein Passwort in RetroArch \n" "angeben."); break; @@ -229,15 +230,15 @@ int menu_hash_get_help_de_enum(enum msg_hash_enums msg, char *s, size_t len) break; case MENU_ENUM_LABEL_USER_LANGUAGE: snprintf(s, len, "Übersetzt das Menü und alle Bildschirm-Meldungen \n" - "in die Sprache, die Du hier ausgewählt hast. \n" + "in die Sprache, die du hier ausgewählt hast. \n" " \n" "Ein Neustart wird benötigt, um die geänderten \n" "Einstellungen zu aktivieren. \n" " \n" - "Hinweis: möglicherweise sind nicht alle Sprachen \n" - "implementiert. \n" + "Hinweis: Möglicherweise sind nicht alle Sprachen \n" + "verfügbar. \n" " \n" - "Wenn die gewählte Sprache nicht implementiert ist, \n" + "Wenn die gewählte Sprache nicht verfügbar ist, \n" "wird Englisch als Sprache ausgewählt."); break; case MENU_ENUM_LABEL_VIDEO_FONT_PATH: @@ -254,43 +255,46 @@ int menu_hash_get_help_de_enum(enum msg_hash_enums msg, char *s, size_t len) snprintf(s, len, "Eingabebelegungsdateien automatisch laden."); break; case MENU_ENUM_LABEL_SORT_SAVESTATES_ENABLE: - snprintf(s, len, "Speichert Spielstand-Dateien in Ordnern, \n" - "die nach dem verwendeten libretro-Core benannt sind."); + snprintf(s, len, "Speichert Zustandsdaten (Savestates) in Ordnern, \n" + "die nach dem verwendeten Libretro-Core benannt sind."); break; case MENU_ENUM_LABEL_SORT_SAVEFILES_ENABLE: snprintf(s, len, "Speichert Speicherdaten in Ordnern, \n" - "die nach dem verwendeten libretro-Core benannt sind."); + "die nach dem verwendeten Libretro-Core benannt sind."); break; case MENU_ENUM_LABEL_RESUME_CONTENT: snprintf(s, len, "Verlässt das Menü und kehrt \n" "zum Inhalt zurück."); break; case MENU_ENUM_LABEL_RESTART_CONTENT: - snprintf(s, len, "Startet den Inhalt vom Beginn an neu."); + snprintf(s, len, "Startet den Inhalt neu."); break; case MENU_ENUM_LABEL_CLOSE_CONTENT: snprintf(s, len, "Schließt den Inhalt und entlädt ihn aus dem \n" "Speicher."); break; case MENU_ENUM_LABEL_UNDO_LOAD_STATE: - snprintf(s, len, "Wenn ein Spielstand geladen war, wird der Inhalt \n" - "zum Status vor dem Laden des Spielstands zurückkehren."); + snprintf(s, len, "Wenn ein Zustand (Savestate) geladen wurde, wird der Inhalt \n" + "zum Stand vor dem Laden des Savestates zurückkehren."); break; case MENU_ENUM_LABEL_UNDO_SAVE_STATE: - snprintf(s, len, "Wenn ein Spielstand überschrieben wurde, wird \n" - "der Inhalt zum vorherigen Spielstand zurückkehren."); + snprintf(s, len, "Wenn ein Zustand (Savestate) überschrieben wurde, wird \n" + "der Inhalt zum vorherigen Zustand zurückkehren."); break; case MENU_ENUM_LABEL_TAKE_SCREENSHOT: - snprintf(s, len, "Fertigt ein Bildschirmfoto an. \n" + snprintf(s, len, "Erstellt ein Bildschirmfoto. \n" " \n" "Das Bildschirmfoto wird im Bildschirmfoto-Verzeichnis \n" "gespeichert."); break; + case MENU_ENUM_LABEL_ADD_TO_FAVORITES: + snprintf(s, len, "Fügt den Eintrag zu deinen Favoriten hinzu."); + break; case MENU_ENUM_LABEL_RUN: snprintf(s, len, "Startet den Inhalt."); break; case MENU_ENUM_LABEL_INFORMATION: - snprintf(s, len, "Zeige zusätzliche Metadaten \n" + snprintf(s, len, "Zeigt zusätzliche Metadaten \n" "über den Inhalt an."); break; case MENU_ENUM_LABEL_FILE_BROWSER_CONFIG: @@ -329,14 +333,14 @@ int menu_hash_get_help_de_enum(enum msg_hash_enums msg, char *s, size_t len) "Verzeichnis für Vorschaubilder. \n" " \n" "Verzeichnis, in welchem die Vorschaubilder \n" - "gespeichert werden."); + "gespeichert werden."); break; case MENU_ENUM_LABEL_LIBRETRO_INFO_PATH: snprintf(s, len, "Verzeichnis für Core-Informationsdateien. \n" " \n" "Ein Verzeichnis, in dem nach \n" - "libretro-Core-Informationen gesucht wird."); + "Libretro-Core-Informationen gesucht wird."); break; case MENU_ENUM_LABEL_PLAYLIST_DIRECTORY: snprintf(s, len, @@ -430,13 +434,13 @@ int menu_hash_get_help_de_enum(enum msg_hash_enums msg, char *s, size_t len) break; case MENU_ENUM_LABEL_FILE_BROWSER_CORE_SELECT_FROM_COLLECTION: snprintf(s, len, - "libretro-Core. \n" + "Libretro-Core. \n" " \n" "Auswählen, um diesen Core dem Spiel zuzuordnen."); break; case MENU_ENUM_LABEL_FILE_BROWSER_CORE: snprintf(s, len, - "libretro-Core. \n" + "Libretro-Core. \n" " \n" "Auswählen, um diesen Core in RetroArch zu laden."); break; @@ -451,7 +455,7 @@ int menu_hash_get_help_de_enum(enum msg_hash_enums msg, char *s, size_t len) "Zwischenspeicher-Verzeichnis. \n" " \n" "Von RetroArch entpackter Inhalt wird \n" - "temporär in diesem Verzeichnis gespeichert."); + "vorübergehend in diesem Verzeichnis gespeichert."); break; case MENU_ENUM_LABEL_HISTORY_LIST_ENABLE: snprintf(s, len, @@ -479,7 +483,8 @@ int menu_hash_get_help_de_enum(enum msg_hash_enums msg, char *s, size_t len) " \n" "Diese Option auf 'Früh' oder 'Spät' zu setzen kann \n" "eine verringerte Latenz bewirken, \n" - "abhängig von deiner Konfiguration." + "abhängig von deiner Konfiguration.\n\n" + "Diese Einstellung wird ignoriert, wenn Netplay verwendet wird." ); break; case MENU_ENUM_LABEL_INPUT_DESCRIPTOR_HIDE_UNBOUND: @@ -514,14 +519,14 @@ int menu_hash_get_help_de_enum(enum msg_hash_enums msg, char *s, size_t len) break; case MENU_ENUM_LABEL_VIDEO_ALLOW_ROTATE: snprintf(s, len, - "Erlaube Core, die Drehung festzulegen. Wenn deaktiviert, \n" - "werden Dreh-Anfragen angenommen, aber ignoriert. \n\n" - "Wird in Setups verwendet, in denen der Benutzer den \n" + "Erlaube Core, die Bilddrehung festzulegen. Wenn deaktiviert, \n" + "werden enstprechende anfragen angenommen, aber ignoriert. \n\n" + "Wird für Systeme verwendet, bei denen der Benutzer den \n" "Monitor manuell dreht."); break; case MENU_ENUM_LABEL_INPUT_DESCRIPTOR_LABEL_SHOW: snprintf(s, len, - "Zeige vom Core festgelegte Eingabe-Beschreibungen anstelle \n" + "Zeigt vom Core festgelegte Eingabe-Beschreibungen anstelle \n" "der standardmäßigen an."); break; case MENU_ENUM_LABEL_CONTENT_HISTORY_SIZE: @@ -547,12 +552,12 @@ int menu_hash_get_help_de_enum(enum msg_hash_enums msg, char *s, size_t len) break; case MENU_ENUM_LABEL_FPS_SHOW: snprintf(s, len, - "Aktiviert die Anzeige der aktuellen Bilder \n" - "pro Sekunde."); + "Aktiviert die Anzeige der aktuellen \n" + "Bildwiederholrate."); break; case MENU_ENUM_LABEL_VIDEO_FONT_ENABLE: snprintf(s, len, - "Zeige und/oder verstecke Bildschirm-Meldungen."); + "Aktiviert/deaktiviert Bildschirm-Meldungen."); break; case MENU_ENUM_LABEL_VIDEO_MESSAGE_POS_X: case MENU_ENUM_LABEL_VIDEO_MESSAGE_POS_Y: @@ -562,13 +567,23 @@ int menu_hash_get_help_de_enum(enum msg_hash_enums msg, char *s, size_t len) break; case MENU_ENUM_LABEL_INPUT_OVERLAY_ENABLE: snprintf(s, len, - "Aktiviert oder deaktiviert das aktuelle Overlay."); + "Aktiviert/deaktiviert das aktuelle Overlay."); break; case MENU_ENUM_LABEL_INPUT_OVERLAY_HIDE_IN_MENU: snprintf(s, len, "Verhindert, dass das aktuelle Overlay im \n" "Menü angezeigt wird."); break; + case MENU_ENUM_LABEL_INPUT_OVERLAY_SHOW_PHYSICAL_INPUTS: + snprintf(s, len, + "Tastatur/Controller-Tastendrücke im \n" + "Overlay anzeigen."); + break; + case MENU_ENUM_LABEL_INPUT_OVERLAY_SHOW_PHYSICAL_INPUTS_PORT: + snprintf(s, len, + "Wählt den Port des Controllers aus, dessen \n" + "Eingaben im Overlay angezeigt werden sollen."); + break; case MENU_ENUM_LABEL_OVERLAY_PRESET: snprintf(s, len, "Pfad zum Eingabe-Overlay."); @@ -601,9 +616,9 @@ int menu_hash_get_help_de_enum(enum msg_hash_enums msg, char *s, size_t len) break; case MENU_ENUM_LABEL_CORE_LIST: snprintf(s, len, - "Lade Core. \n" + "Lädt einen Core. \n" " \n" - "Suche nach einer libretro-Core-Implementierung. \n" + "Suche nach einer Libretro-Core-Implementierung. \n" "In welchem Verzeichnis der Browser beginnt, \n" "hängt von deinem Core-Verzeichnispfad \n" "ab. Ist dieser nicht eingestellt, wird im Wurzelverzeichnis begonnen. \n" @@ -638,7 +653,7 @@ int menu_hash_get_help_de_enum(enum msg_hash_enums msg, char *s, size_t len) " \n" "Treten Probleme wie eine knackende Ton-Wiedergabe oder\n" "eine unregelmäßige Bildwiedergabe auf, bedeutet dies in der Regel,\n" - "dass Du die Einstellungen kalibrieren musst. Du hast folgende Möglichkeiten:\n" + "dass du die Einstellungen kalibrieren musst. du hast folgende Möglichkeiten:\n" " \n"; snprintf(u, sizeof(u), /* can't inline this due to the printf arguments */ "a) Gehe zu '%s' -> '%s', und aktiviere\n" @@ -666,7 +681,7 @@ int menu_hash_get_help_de_enum(enum msg_hash_enums msg, char *s, size_t len) "Bei einem Treffer wird die Datei zu einer Sammlung\n" "hinzugefügt.\n" " \n" - "Du kannst diese Inhalte einfach aufrufen, indem Du\n" + "du kannst diese Inhalte einfach aufrufen, indem du\n" "zu'%s' ->\n" "'%s'\n gehst," "anstatt jedes Mal den Dateibrowser\n" @@ -741,12 +756,12 @@ int menu_hash_get_help_de_enum(enum msg_hash_enums msg, char *s, size_t len) "Lade Inhalt. \n" "Suche nach Inhalten. \n" " \n" - "Um Inhalte zu laden benötigst Du den passenden \n" - "libretro-Core und die Inhalts-Datei. \n" + "Um Inhalte zu laden benötigst du den passenden \n" + "Libretro-Core und die Inhalts-Datei. \n" " \n" "Um einzustellen, welcher Ordner standardmäßig \n" "geöffnet wird, um nach Inhalten zu suchen, solltest \n" - "Du das Inhalts-Verzeichnis setzen. Wenn es nicht \n" + "du das Inhalts-Verzeichnis setzen. Wenn es nicht \n" "gesetzt ist, wird es im Hauptverzeichen starten. \n" " \n" "Der Browser wird nur Dateierweiterungen des \n" @@ -778,11 +793,11 @@ int menu_hash_get_help_de_enum(enum msg_hash_enums msg, char *s, size_t len) "OpenGL-Grafiktreiber. \n" " \n" "Dieser Treiber erlaubt es, neben software- \n" - "gerenderten Cores auch libretro-GL-Cores zu \n" + "gerenderten Cores auch Libretro-GL-Cores zu \n" "verwenden. \n" " \n" "Die Leistung, sowohl bei software-gerenderten, \n" - "als auch bei libretro-GL-Cores, hängt von dem \n" + "als auch bei Libretro-GL-Cores, hängt von dem \n" "GL-Treiber deiner Grafikkarte ab."); } else if (string_is_equal_fast(settings->arrays.video_driver, "sdl2", 4)) @@ -804,7 +819,7 @@ int menu_hash_get_help_de_enum(enum msg_hash_enums msg, char *s, size_t len) "Dies ist ein SDL1.2-Grafiktreiber \n" "mit Software-Rendering." " \n" - "Die Leistung ist suboptimal und Du \n" + "Die Leistung ist suboptimal und du \n" "solltest diesen Treiber nur als letzte \n" "Möglichkeit verwenden."); } @@ -888,20 +903,15 @@ int menu_hash_get_help_de_enum(enum msg_hash_enums msg, char *s, size_t len) ); break; case MENU_ENUM_LABEL_VIDEO_SHADER_SCALE_PASS: - { - /* Work around C89 limitations */ - char u[501]; - const char * t = - "Für diesen Durchgang skalieren. \n" + snprintf(s, len, + "Für diesen durchgang skalieren. \n" " \n" "Der Skalierungsfaktor wird multipliziert, \n" - "d.h. 2x im ersten Durchgang und 2x im \n" - "zweiten Durchgang bedeute eine 4x Gesamt- \n" + "d.h. 2x im ersten durchgang und 2x im \n" + "zweiten durchgang bedeute eine 4x Gesamt- \n" "Skalierung." - " \n"; - - snprintf(u, sizeof(u), - "Wenn es im letzten Durchgang einen \n" + " \n" + "Wenn es im letzten durchgang einen \n" "Skalierungsfaktor gibt, wird das Ergebnis \n" "mit dem als 'Standardfilter' eingestellten \n" "Filter auf die Bildschirmgröße gestreckt. \n" @@ -909,23 +919,20 @@ int menu_hash_get_help_de_enum(enum msg_hash_enums msg, char *s, size_t len) "Wenn 'Ignorieren' eingestellt ist, wird \n" "entweder einfache Skalierung oder Vollbild- \n" "Streckung verwendet - abhängig davon, ob \n" - "es der letzte Durchgang ist oder nicht." + "es der letzte durchgang ist oder nicht." ); - strlcpy(s, t, len); - strlcat(s, u, len); - } break; case MENU_ENUM_LABEL_VIDEO_SHADER_NUM_PASSES: snprintf(s, len, "Shader-Durchgänge. \n" " \n" "RetroArch erlaubt es, verschiedene Shader \n" - "in verschiedenen Durchgängen miteinander zu \n" + "in verschiedenen durchgängen miteinander zu \n" "kombinieren. \n" " \n" "Diese Option legt die Anzahl der Shader- \n" - "Durchgänge fest. Wenn Du die Anzahl auf 0 setzt, \n" - "verwendest Du einen 'leeren' Shader." + "durchgänge fest. Wenn du die Anzahl auf 0 setzt, \n" + "verwendest du einen 'leeren' Shader." " \n" "Die 'Standardfilter'-Option beeinflusst den \n" "Streckungsfilter"); @@ -952,8 +959,8 @@ int menu_hash_get_help_de_enum(enum msg_hash_enums msg, char *s, size_t len) "Alle Shader mmüssen vom selben Typ sein \n" "(z.B. CG, GLSL oder HLSL). \n" " \n" - "Durch das Setzen des Shader-Verzeichnisses \n" - "legst Du fest, in welchem Verzeichnis der Browser \n" + "durch das Setzen des Shader-Verzeichnisses \n" + "legst du fest, in welchem Verzeichnis der Browser \n" "nach Shadern sucht." ); break; @@ -978,15 +985,15 @@ int menu_hash_get_help_de_enum(enum msg_hash_enums msg, char *s, size_t len) ); break; case MENU_ENUM_LABEL_CONFIRM_ON_EXIT: - snprintf(s, len, "Bist Du sicher, dass Du RetroArch verlassen möchtest?"); + snprintf(s, len, "Bist du sicher, dass du RetroArch verlassen möchtest?"); break; case MENU_ENUM_LABEL_SHOW_HIDDEN_FILES: - snprintf(s, len, "Zeige versteckte Dateien \n" - "und Ordner."); + snprintf(s, len, "Zeigt versteckte Dateien \n" + "und Ordner an."); break; case MENU_ENUM_LABEL_VIDEO_SHADER_FILTER_PASS: snprintf(s, len, - "Hardware-Filter für diesen Durchgang. \n" + "Hardware-Filter für diesen durchgang. \n" " \n" "Wenn 'Ignorieren' gewählt ist, wird der \n" "Standard-Filter verwendet." @@ -1008,7 +1015,7 @@ int menu_hash_get_help_de_enum(enum msg_hash_enums msg, char *s, size_t len) "Typ des Eingabe-Gerätes. \n" " \n" "Wählt aus, welcher Eingabe-Gerätetyp verwendet wird. \n" - "Dies ist für den libretro-Core selbst relevat." + "Dies ist für den Libretro-Core selbst relevat." ); break; case MENU_ENUM_LABEL_LIBRETRO_LOG_LEVEL: @@ -1016,7 +1023,7 @@ int menu_hash_get_help_de_enum(enum msg_hash_enums msg, char *s, size_t len) "Legt das Log-Level für das \n" "(GET_LOG_INTERFACE) der Cores fest. \n" " \n" - " Wenn ein libretro-Core ein Log-Level unterhalb \n" + " Wenn ein Libretro-Core ein Log-Level unterhalb \n" " des eingestellten Log-Levels ausgibt, wird \n" " dies ignoriert.\n" " \n" @@ -1049,9 +1056,9 @@ int menu_hash_get_help_de_enum(enum msg_hash_enums msg, char *s, size_t len) " \n" "Da das Ändern der Shader-Optionen \n" "einiges an Rechenleistung erfordert, \n" - "musst Du die Option manuell auslösen. \n" + "musst du die Option manuell auslösen. \n" " \n" - "Wenn Du Shader anwendest, werden die Menüeinstellungen \n" + "Wenn du Shader anwendest, werden die Menüeinstellungen \n" "in einer temporären Datei gespeichert (entweder \n" "menu.cgp oder menu.glslp) und geladen. Die Datei \n" "bleibt nach dem Beenden von RetroArch bestehen. Die Datei \n" @@ -1060,7 +1067,7 @@ int menu_hash_get_help_de_enum(enum msg_hash_enums msg, char *s, size_t len) break; case MENU_ENUM_LABEL_MENU_TOGGLE: snprintf(s, len, - "Menü aufrufen."); + "Menü aufrufen und schließen."); break; case MENU_ENUM_LABEL_GRAB_MOUSE_TOGGLE: snprintf(s, len, @@ -1126,29 +1133,22 @@ int menu_hash_get_help_de_enum(enum msg_hash_enums msg, char *s, size_t len) "Verwendet für Inhalt, der auf mehreren Datenträgern ausgeliefert wird. "); break; case MENU_ENUM_LABEL_ENABLE_HOTKEY: - { - /* Work around C89 limitations */ - char u[501]; - const char * t = - "Andere Hotkeys aktivieren. \n" + snprintf(s, len, + "Andere Tastenkürzel aktivieren. \n" + " \n" + "Wenn dieses Tastenkürzel entweder einer\n" + "Tastatur, einer Controller-Taste oder \n" + "Controller-Achse zugeordnet ist, werden alle \n" + "anderen Tastenkürzel nur aktiviert, wenn dieses \n" + "Tastenkürzel zur gleichen Zeit gehalten wird. \n" " \n" - "Wenn dieser Hotkey entweder einer\n" - "Tastatur, einem Joypad-Taste oder \n" - "Joypad-Achse zugeordnet ist, werden alle \n" - "anderen Hotkeys nur aktiviert, wenn dieser \n" - "Hotkey zur gleichen Zeit gehalten wird. \n" - " \n"; - snprintf(u, sizeof(u), "Dies ist hilfreich für Implementierungen, die auf \n" "RETRO_KEYBOARD ausgelegt sind und eine große \n" "Fläche auf der Tastatur benötigen, wo es nicht \n" - "gewünscht ist, dass es zu Kollisionen mit Hotkeys kommt \n." + "gewünscht ist, dass es zu Kollisionen mit Tastenkürzeln kommt \n." " \n" - "Alternativ können auch alle Tastatur-Hotkeys durch \n" + "Alternativ können auch alle Tastatur-Kürzel durch \n" "den Benutzer deaktiviert werden."); - strlcpy(s, t, len); - strlcat(s, u, len); - } break; case MENU_ENUM_LABEL_REWIND_ENABLE: snprintf(s, len, @@ -1162,20 +1162,16 @@ int menu_hash_get_help_de_enum(enum msg_hash_enums msg, char *s, size_t len) "Core-Verzeichnis. \n" " \n" "Ein Verzeichnis, in welchem nach \n" - "libretro-Core-Implementierungen gesucht wird."); + "Libretro-Core-Implementierungen gesucht wird."); break; case MENU_ENUM_LABEL_VIDEO_REFRESH_RATE_AUTO: - { - /* Work around C89 limitations */ - char u[501]; - const char * t = + snprintf(s, len, "Bildwiederholrate.\n" " \n" - "Die genaue Bildwiederholrate Deines Bildschirms (Hz).\n" + "Die genaue Bildwiederholrate deines Bildschirms (Hz).\n" "Diese wird verwendet, um die Audio-Eingaberate mithilfe \n" "der folgenden Formel zu berechnen: \n" - " \n"; - snprintf(u, sizeof(u), + " \n" "audio_input_rate = Spiel-Eingaberate * Bildschirm- \n" "Wiederholrate / Spiel-Wiederholrate\n" " \n" @@ -1184,11 +1180,8 @@ int menu_hash_get_help_de_enum(enum msg_hash_enums msg, char *s, size_t len) "angenommen.\n" " \n" "Dieser Wert sollte nahe 60Hz liegen, um Tonsprünge zu vermeiden. \n" - "Wenn Dein Bildschirm nicht auf 60Hz oder einem ähnlichen Wert läuft, \n" + "Wenn dein Bildschirm nicht auf 60Hz oder einem ähnlichen Wert läuft, \n" "deaktiviere VSync und lasse diese Einstellung unverändert. \n"); - strlcpy(s, t, len); - strlcat(s, u, len); - } break; case MENU_ENUM_LABEL_VIDEO_ROTATION: snprintf(s, len, @@ -1196,15 +1189,15 @@ int menu_hash_get_help_de_enum(enum msg_hash_enums msg, char *s, size_t len) "Bildschirm-Rotation.\n" " \n" "Diese Drehung wird zu den Drehungen hinzugefügt, \n" - "die durch den libretro-Core festgelegt werden. (siehe 'Erlaube \n" + "die durch den Libretro-Core festgelegt werden. (siehe 'Erlaube \n" "Bild-Drehung')."); break; case MENU_ENUM_LABEL_VIDEO_SCALE: snprintf(s, len, "Vollbild-Auflösung.\n" " \n" - "Auflösung von 0 verwendet die \n" - "Auflösung der Umgebung. \n"); + "Eine Auflösung von 0 verwendet die \n" + "Auflösung des Systems. \n"); break; case MENU_ENUM_LABEL_FASTFORWARD_RATIO: snprintf(s, len, @@ -1288,8 +1281,8 @@ int menu_hash_get_help_de_enum(enum msg_hash_enums msg, char *s, size_t len) snprintf(s, len, "Wechselt zum nächsten Overlay.\n" " \n" - /* Translation unclear, disabled for now. Some context would be really helpful. - * "Wraps around." */ + "Wenn das letzte Overlay erreicht ist, wird \n" + "wieder beim ersten Overlay begonnen." ); break; case MENU_ENUM_LABEL_LOG_VERBOSITY: @@ -1327,11 +1320,11 @@ int menu_hash_get_help_de_enum(enum msg_hash_enums msg, char *s, size_t len) case MENU_ENUM_LABEL_SAVESTATE_AUTO_SAVE: case MENU_ENUM_LABEL_SAVESTATE_AUTO_LOAD: snprintf(s, len, - "Erstellt einen Spielstand automatisch, \n" + "Speichert den aktuellen Zustand automatisch, \n" "wenn RetroArch beendet wird .\n" " \n" - "RetroArch wird Spielstände in diesem Pfad automatisch \n" - "nach dem Starten laden, wenn 'Spielstand automatisch laden' \n" + "RetroArch wird die Zustandsdaten in diesem Pfad automatisch \n" + "nach dem Starten laden, wenn 'Zustand automatisch laden' \n" "aktiviert ist."); break; case MENU_ENUM_LABEL_VIDEO_THREADED: @@ -1359,7 +1352,7 @@ int menu_hash_get_help_de_enum(enum msg_hash_enums msg, char *s, size_t len) "Rückspul-Genauigkeit.\n" " \n" "Wenn eine festgelegte Anzahl von Frames zurückgespult \n" - "wird, kannst Du mehrere Frames auf einmal \n" + "wird, kannst du mehrere Frames auf einmal \n" "zurückspulen, was die Rückspul-Geschwindigkeit \n" "erhöht."); break; @@ -1416,8 +1409,8 @@ int menu_hash_get_help_de_enum(enum msg_hash_enums msg, char *s, size_t len) break; case MENU_ENUM_LABEL_BLOCK_SRAM_OVERWRITE: snprintf(s, len, - "Verhindert, dass SRAM überschrieben wird, \n" - "wenn Spielstände geladen werden.\n" + "Verhindert, dass der SRAM-Inhalt überschrieben wird, \n" + "wenn Zustandsdaten (Savestates) geladen werden.\n" " \n" "Kann zu fehlerhaften Spielen führen."); break; @@ -1458,13 +1451,13 @@ int menu_hash_get_help_de_enum(enum msg_hash_enums msg, char *s, size_t len) break; case MENU_ENUM_LABEL_SAVESTATE_DIRECTORY: snprintf(s, len, - "Verzeichnis für Spielstände. \n" + "Verzeichnis für Zustandsdaten (Savestates). \n" " \n" - "Speichert alle Spielstände (*.state) in diesem \n" + "Speichert alle Zustandsdaten (*.state) in diesem \n" "Verzeichnis.\n" " \n" - "Explizite Optionen über die Kommandozeile überschreiben \n" - "diese Einstellung."); + "Diese Einstellung kann mithilfe von Kommandozeilen-Optionen \n" + "überschrieben werden."); break; case MENU_ENUM_LABEL_ASSETS_DIRECTORY: snprintf(s, len, @@ -1540,7 +1533,7 @@ int menu_hash_get_help_de_enum(enum msg_hash_enums msg, char *s, size_t len) break; case MENU_ENUM_LABEL_PAUSE_LIBRETRO: snprintf(s, len, - "Wenn deaktiviert wird der libretro-Core im \n" + "Wenn deaktiviert, wird der Libretro-Core im \n" "Hintergrund weiter laufen, wenn wir uns \n" "im Menü befinden."); break; @@ -1601,15 +1594,11 @@ int menu_hash_get_help_de_enum(enum msg_hash_enums msg, char *s, size_t len) "tritt keine Netplay-Verzögerung auf.\n"); break; case MENU_ENUM_LABEL_NETPLAY_CHECK_FRAMES: - { - /* Work around C89 limitations */ - char u[501]; - const char *t = + snprintf(s, len, "Die Frequenz in Einzelbildern, mit der Netplay \n" "sicherstellen wird, dass Host und Clients \n" "synchronisiert sind. \n" - " \n"; - snprintf(u, sizeof(u), + " \n" "Bei den meisten Cores wird diese Einstellungen \n" "keine sichtbaren Auswirkungen haben und kann ignoriert werden. \n" "Bei nichtdeterministischen Cores legt dieser Wert fest, \n" @@ -1619,9 +1608,6 @@ int menu_hash_get_help_de_enum(enum msg_hash_enums msg, char *s, size_t len) "Leistungsprobleme verursachen. Auf 0 setzen, um keine \n" "Überprüfungen durchzuführen. Diese Einstellung wird nur \n" "auf dem Netplay-Host verwendet. \n"); - strlcpy(s, t, len); - strlcat(s, u, len); - } break; case MENU_ENUM_LABEL_NETPLAY_INPUT_LATENCY_FRAMES_MIN: snprintf(s, len, @@ -1650,7 +1636,7 @@ int menu_hash_get_help_de_enum(enum msg_hash_enums msg, char *s, size_t len) break; case MENU_ENUM_LABEL_NETPLAY_NAT_TRAVERSAL: snprintf(s, len, - "Versuche, beim Hosten eines Spiels auf eingehende \n" + "Versucht, beim Hosten eines Spiels auf eingehende \n" "Verbindungen aus dem öffentlichen Internet zu hören. \n" "Dabei werden UPnP oder ähnliche Techniken verwendet, \n" "um das eigene LAN zu verlassen. \n"); @@ -1712,18 +1698,18 @@ int menu_hash_get_help_de_enum(enum msg_hash_enums msg, char *s, size_t len) break; case MENU_ENUM_LABEL_DYNAMIC_WALLPAPER: snprintf(s, len, - "Lade ein neues Hintergrundbild dynamisch, \n" + "Lädt ein neues Hintergrundbild dynamisch, \n" "abhängig vom aktuellen Kontext."); break; case MENU_ENUM_LABEL_CORE_UPDATER_BUILDBOT_URL: snprintf(s, len, "URL zum Core-Verzeichnis auf dem \n" - "libretro-Server."); + "Libretro-Server."); break; case MENU_ENUM_LABEL_BUILDBOT_ASSETS_URL: snprintf(s, len, "URL zum Assets-Verzeichnis auf dem \n" - "libretro-Server."); + "Libretro-Server."); break; case MENU_ENUM_LABEL_INPUT_REMAP_BINDS_ENABLE: snprintf(s, len, @@ -1745,13 +1731,13 @@ int menu_hash_get_help_de_enum(enum msg_hash_enums msg, char *s, size_t len) break; case MENU_ENUM_LABEL_CORE_UPDATER_AUTO_EXTRACT_ARCHIVE: snprintf(s, len, - "Entpacke Archive, die heruntergeladenen Inhalt \n" + "Entpackt Archive, die heruntergeladenen Inhalt \n" "enthalten, nach dem Herunterladen \n" "automatisch."); break; case MENU_ENUM_LABEL_NAVIGATION_BROWSER_FILTER_SUPPORTED_EXTENSIONS_ENABLE: snprintf(s, len, - "Filtere die angezeigten Dateien nach \n" + "Filtert die angezeigten Dateien nach \n" "unterstützten Dateierweiterungen."); break; case MENU_ENUM_LABEL_NETPLAY_NICKNAME: @@ -1761,8 +1747,8 @@ int menu_hash_get_help_de_enum(enum msg_hash_enums msg, char *s, size_t len) break; case MENU_ENUM_LABEL_NETPLAY_CLIENT_SWAP_INPUT: snprintf(s, len, - "Verwende Tastenbelegung für Spieler 1, \n" - "wenn Du Teilnehmer an einem Netplay-Spiel bist."); + "Verwendet Tastenbelegung für Spieler 1, \n" + "wenn du Teilnehmer an einem Netplay-Spiel bist."); break; case MENU_ENUM_LABEL_NETPLAY_TCP_UDP_PORT: snprintf(s, len, @@ -1771,7 +1757,7 @@ int menu_hash_get_help_de_enum(enum msg_hash_enums msg, char *s, size_t len) break; case MENU_ENUM_LABEL_NETPLAY_SPECTATOR_MODE_ENABLE: snprintf(s, len, - "Aktiviere oder deaktiviere Beobachtermodus\n" + "Aktiviert oder deaktiviert Beobachtermodus\n" "für den Benutzer im Netplay-Spiel."); break; case MENU_ENUM_LABEL_NETPLAY_IP_ADDRESS: @@ -1791,11 +1777,11 @@ int menu_hash_get_help_de_enum(enum msg_hash_enums msg, char *s, size_t len) break; case MENU_ENUM_LABEL_STDIN_CMD_ENABLE: snprintf(s, len, - "Aktiviere stdin-Kommandozeile."); + "Aktiviert stdin-Kommandozeile."); break; case MENU_ENUM_LABEL_UI_COMPANION_START_ON_BOOT: snprintf(s, len, - "Starte begleitenden Treiber für Benutzeroberfläche \n" + "Startet begleitenden Treiber für Benutzeroberfläche \n" "während des Bootens (wenn verfügbar)."); break; case MENU_ENUM_LABEL_MENU_DRIVER: @@ -1803,7 +1789,7 @@ int menu_hash_get_help_de_enum(enum msg_hash_enums msg, char *s, size_t len) break; case MENU_ENUM_LABEL_INPUT_MENU_ENUM_TOGGLE_GAMEPAD_COMBO: snprintf(s, len, - "Gamepad-Tastenkombination, um Menü aufzurufen. \n" + "Controller-Tastenkombination, um Menü aufzurufen. \n" " \n" "0 - Keine \n" "1 - Drücke L + R + Y + D-Pad nach unten \n" @@ -1818,9 +1804,9 @@ int menu_hash_get_help_de_enum(enum msg_hash_enums msg, char *s, size_t len) break; case MENU_ENUM_LABEL_INPUT_AUTODETECT_ENABLE: snprintf(s, len, - "Aktiviere automatische Eingabe-Erkennung.\n" + "Aktiviert automatische Eingabe-Erkennung.\n" " \n" - "Wird versuchen, Joypads automatisch zu konfigurieren. \n" + "Wird versuchen, Controller automatisch zu konfigurieren. \n" "(Plug-and-Play)."); break; case MENU_ENUM_LABEL_CAMERA_ALLOW: @@ -1863,7 +1849,7 @@ int menu_hash_get_help_de_enum(enum msg_hash_enums msg, char *s, size_t len) snprintf(s, len, "Taste zum sauberen Beenden von RetroArch." #if !defined(RARCH_MOBILE) && !defined(RARCH_CONSOLE) - "\nWenn Du RetroArch 'unsanft' beendest (SIGKILL, \n" + "\nWenn du RetroArch 'unsanft' beendest (SIGKILL, \n" "etc), werden RAM-Speicher etc. nicht gespeichert.\n" "Auf Unix-ähnlichen Systemen erlaubt\n" "SIGINT/SIGTERM ein sauberes\n" @@ -1951,9 +1937,9 @@ int menu_hash_get_help_de_enum(enum msg_hash_enums msg, char *s, size_t len) "RetroArch selbst tut nichts. \n" " \n" "Damit RetroArch etwas tut, musst \n" - "Du ein Programm hineinladen. \n" + "du ein Programm hineinladen. \n" "\n" - "Wir nennen diese Programme 'libretro-Core', \n" + "Wir nennen diese Programme 'Libretro-Core', \n" "oder einfach nur 'Core'. \n" " \n" "Um einen Core zu laden, verwende \n" @@ -1961,7 +1947,7 @@ int menu_hash_get_help_de_enum(enum msg_hash_enums msg, char *s, size_t len) " \n" #ifdef HAVE_NETWORKING "Du kannst die Cores auf mehreren Wegen beziehen: \n" - "* Herunterladen, indem Du\n" + "* Herunterladen, indem du\n" "'%s' -> '%s' verwendest. \n" "* Manuell ins Verzeichnis \n" "'%s' kopieren.", @@ -1978,27 +1964,59 @@ int menu_hash_get_help_de_enum(enum msg_hash_enums msg, char *s, size_t len) break; case MENU_ENUM_LABEL_VALUE_HELP_CHANGE_VIRTUAL_GAMEPAD_DESC: snprintf(s, len, - "Du kannst das virtuelle Gamepad-Overlay ändern, indem Du \n" + "Du kannst das virtuelle Controller-Overlay ändern, indem du \n" "zu '%s' -> '%s' gehst." " \n" "Hier kannst du das Overlay ändern,\n" "die Größe und Transparenz der Tasten verändern, etc.\n" " \n" - "HINWEIS: Standardmäßig werden virtuelle Gamepad-Overlays \n" - "versteckt, wenn Du dich im Menü befindest.\n" - "Wenn Du dieses Verhalten ändern möchtest,\n" - "kannst Du '%s' auf 'aus' setzen.", + "HINWEIS: Standardmäßig werden virtuelle Controller-Overlays \n" + "versteckt, wenn du dich im Menü befindest.\n" + "Wenn du dieses Verhalten ändern möchtest,\n" + "kannst du '%s' auf 'aus' setzen.", msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SETTINGS), msg_hash_to_str(MENU_ENUM_LABEL_VALUE_OVERLAY_SETTINGS), msg_hash_to_str(MENU_ENUM_LABEL_VALUE_INPUT_OVERLAY_HIDE_IN_MENU) ); break; + case MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_BGCOLOR_ENABLE: + snprintf(s, len, + "Verwendet eine Hintergrundfarbe für das OSD."); + break; + case MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_BGCOLOR_RED: + snprintf(s, len, + "Legt den Rot-Anteil der OSD-Hintergrundfarbe fest. Gültige Werte liegen zwischen 0 und 255."); + break; + case MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_BGCOLOR_GREEN: + snprintf(s, len, + "Legt den Grün-Anteil der OSD-Hintergrundfarbe fest. Gültige Werte liegen zwischen 0 und 255."); + break; + case MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_BGCOLOR_BLUE: + snprintf(s, len, + "Legt den Blau-Anteil der OSD-Hintergrundfarbe fest. Gültige Werte liegen zwischen 0 und 255."); + break; + case MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_BGCOLOR_OPACITY: + snprintf(s, len, + "Legt die Transparenz der OSD-Hintergrundfarbe fest. Gültige Werte liegen zwischen 0.0 und 1.0."); + break; + case MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_COLOR_RED: + snprintf(s, len, + "Legt den Rot-Anteil der OSD-Textfarbe fest. Gültige Werte liegen zwischen 0 und 255."); + break; + case MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_COLOR_GREEN: + snprintf(s, len, + "Legt den Grün-Anteil der OSD-Textfarbe fest. Gültige Werte liegen zwischen 0 und 255."); + break; + case MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_COLOR_BLUE: + snprintf(s, len, + "Legt den Blau-Anteil der OSD-Textfarbe fest. Gültige Werte liegen zwischen 0 und 255."); + break; + default: if (string_is_empty(s)) strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO_INFORMATION_AVAILABLE), len); return -1; } - return 0; } diff --git a/intl/msg_hash_de.h b/intl/msg_hash_de.h index a0eb20fe2d..44c710daff 100644 --- a/intl/msg_hash_de.h +++ b/intl/msg_hash_de.h @@ -132,7 +132,7 @@ MSG_HASH( ) MSG_HASH( MSG_AUTOLOADING_SAVESTATE_FROM, - "Lade Spielstände automatisch von" + "Lade Zustandsdaten (Savestates) automatisch von" ) MSG_HASH( MSG_CAPABILITIES, @@ -160,7 +160,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_ACCOUNTS_CHEEVOS_SETTINGS, - "Errungenschaften-Kontos" + "Errungenschaften-Konten" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_ACCOUNTS_CHEEVOS_USERNAME, @@ -274,6 +274,18 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_AUDIO_VOLUME, "Lautstärke (dB)" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_AUDIO_WASAPI_EXCLUSIVE_MODE, + "Exklusiver WASAPI-Modus" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_AUDIO_WASAPI_FLOAT_FORMAT, + "WASAPI-Gleitkomma-Format" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_AUDIO_WASAPI_SH_BUFFER_LENGTH, + "Größe des gemeinsamen WASAPI-Puffers" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_AUTOSAVE_INTERVAL, "Intervall für automatisches Speichern des SaveRAM" @@ -360,7 +372,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_BLOCK_SRAM_OVERWRITE, - "Überschreibe SaveRAM nicht, wenn ein Savestate geladen wird" + "Überschreibe SaveRAM nicht, wenn ein Zustand (Savestate) geladen wird" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_BLUETOOTH_ENABLE, @@ -396,7 +408,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEAT_FILE, - "Cheat-Date" + "Cheat-Datei" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEAT_FILE_LOAD, @@ -433,6 +445,10 @@ MSG_HASH( MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEEVOS_TEST_UNOFFICIAL, "Teste inoffizielle Errungenschaften" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEEVOS_VERBOSE_ENABLE, + "Ausführlicher Modus für Errungenschaften" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEEVOS_UNLOCKED_ACHIEVEMENTS, @@ -478,7 +494,7 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_HISTORY_SIZE, "Länge der Verlaufsliste") MSG_HASH(MENU_ENUM_LABEL_VALUE_PLAYLIST_ENTRY_REMOVE, - "Erlaube, Einträge zu entfernen") + "Erlaubt, Einträge zu entfernen") MSG_HASH(MENU_ENUM_LABEL_VALUE_CONTENT_SETTINGS, "Spielmenü") MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_ASSETS_DIR, @@ -502,7 +518,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_INFO_CORE_LABEL, MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_INFO_CORE_NAME, "Core-Name") MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_INFO_FIRMWARE, - "Firmware(s)") + "Firmware") MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_INFO_LICENSES, "Lizenz(en)") MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_INFO_PERMISSIONS, @@ -576,13 +592,13 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_DOWNLOAD_CORE, MSG_HASH(MENU_ENUM_LABEL_VALUE_DOWNLOAD_CORE_CONTENT, "Inhalt herunterladen") MSG_HASH(MENU_ENUM_LABEL_VALUE_DPI_OVERRIDE_ENABLE, - "Aktiviere DPI-Überschreibung") + "Aktiviert DPI-Überschreibung") MSG_HASH(MENU_ENUM_LABEL_VALUE_DPI_OVERRIDE_VALUE, "DPI-Überschreibung") MSG_HASH(MENU_ENUM_LABEL_VALUE_DRIVER_SETTINGS, "Treiber") MSG_HASH(MENU_ENUM_LABEL_VALUE_DUMMY_ON_CORE_SHUTDOWN, - "Dummy laden, wenn Core beendet wird") + "Leeren Core laden, wenn Core beendet wird") MSG_HASH(MENU_ENUM_LABEL_VALUE_CHECK_FOR_MISSING_FIRMWARE, "Vor dem Laden nach fehlender Firmware suchen") MSG_HASH(MENU_ENUM_LABEL_VALUE_DYNAMIC_WALLPAPER, @@ -590,7 +606,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_DYNAMIC_WALLPAPER, MSG_HASH(MENU_ENUM_LABEL_VALUE_DYNAMIC_WALLPAPERS_DIRECTORY, "Dynamische Hintergrundbilder") MSG_HASH(MENU_ENUM_LABEL_VALUE_CHEEVOS_ENABLE, - "Aktiviere Errungenschaften") + "Aktiviert Errungenschaften") MSG_HASH(MENU_ENUM_LABEL_VALUE_ENTRY_HOVER_COLOR, "Farbe für gewählte Menü-Einträge") MSG_HASH(MENU_ENUM_LABEL_VALUE_ENTRY_NORMAL_COLOR, @@ -599,18 +615,20 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_FALSE, "Aus") MSG_HASH(MENU_ENUM_LABEL_VALUE_FASTFORWARD_RATIO, "Maximale Ausführgeschwindigkeit") +MSG_HASH(MENU_ENUM_LABEL_VALUE_FAVORITES_TAB, + "Favoriten") MSG_HASH(MENU_ENUM_LABEL_VALUE_FPS_SHOW, - "Zeige Bildwiederholrate") + "Bildwiederholrate anzeigen") MSG_HASH(MENU_ENUM_LABEL_VALUE_FRAME_THROTTLE_ENABLE, "Begrenze maximale Ausführgeschwindigkeit") MSG_HASH(MENU_ENUM_LABEL_VALUE_FRAME_THROTTLE_SETTINGS, - "Bildgeschwindigkeit") + "Bildwiederholrate begrenzen") MSG_HASH(MENU_ENUM_LABEL_VALUE_FRONTEND_COUNTERS, "Frontend-Zähler") MSG_HASH(MENU_ENUM_LABEL_VALUE_GAME_SPECIFIC_OPTIONS, - "Lade inhaltsspezifische Core-Einstellungen automatisch") + "Lädt inhaltsspezifische Core-Einstellungen automatisch") MSG_HASH(MENU_ENUM_LABEL_VALUE_GAME_SPECIFIC_OPTIONS_CREATE, - "Erstelle Datei für Spieloptionen") + "Erstellt Datei mit Spieloptionen") MSG_HASH(MENU_ENUM_LABEL_VALUE_GAME_SPECIFIC_OPTIONS_IN_USE, "Spieloptionen") MSG_HASH(MENU_ENUM_LABEL_VALUE_HELP, @@ -618,13 +636,13 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_HELP, MSG_HASH(MENU_ENUM_LABEL_VALUE_HELP_AUDIO_VIDEO_TROUBLESHOOTING, "Audio/Video-Fehlerbehebung") MSG_HASH(MENU_ENUM_LABEL_VALUE_HELP_CHANGE_VIRTUAL_GAMEPAD, - "Ändere virtuelles Gamepad-Overlay") + "Ändert virtuelles Controller-Overlay") MSG_HASH(MENU_ENUM_LABEL_VALUE_HELP_CONTROLS, "Grundlegende Menüsteuerung") MSG_HASH(MENU_ENUM_LABEL_VALUE_HELP_LIST, "Hilfe") MSG_HASH(MENU_ENUM_LABEL_VALUE_HELP_LOADING_CONTENT, - "Inhalte laden") + "Inhalt laden") MSG_HASH(MENU_ENUM_LABEL_VALUE_HELP_SCANNING_CONTENT, "Nach Inhalten suchen") MSG_HASH(MENU_ENUM_LABEL_VALUE_HELP_WHAT_IS_A_CORE, @@ -684,19 +702,21 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_BIND_TIMEOUT, MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_DESCRIPTOR_HIDE_UNBOUND, "Verstecke nicht zugewiesene Eingabe-Beschriftungen") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_DESCRIPTOR_LABEL_SHOW, - "Zeige Eingabe-Beschriftungen") + "Zeige Eingabe-Bezeichnungen") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_DEVICE_INDEX, "Geräteindex") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_DEVICE_TYPE, "Gerätetyp") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_INDEX, + "Maus-Index") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_DRIVER, "Eingabetreiber") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_DUTY_CYCLE, - "Turbo-Haltedauer") + "Autofeuer-Haltedauer") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_HOTKEY_BINDS, - "Hotkeys belegen") + "Tastenkürzel belegen") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ICADE_ENABLE, - "Gamepad-Eingabe auf Tastatur legen") + "Controller-Eingabe auf Tastatur legen") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_A, "A-Knopf (rechts)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_B, @@ -732,11 +752,11 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y, MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEY, "(Taste: %s)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEYBOARD_GAMEPAD_MAPPING_TYPE, - "Typ der Keyboard-Gamepad-Abbildung") + "Typ der Keyboard-Controller-Abbildung") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MAX_USERS, "Maximale Benutzeranzahl") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MENU_ENUM_TOGGLE_GAMEPAD_COMBO, - "Gamepad-Tastenkombination für Menü") + "Controller-Tastenkombination für Menü") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_CHEAT_INDEX_MINUS, "Cheat-Index -") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_CHEAT_INDEX_PLUS, @@ -788,7 +808,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_RESET, MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_REWIND, "Zurückspulen") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_SAVE_STATE_KEY, - "Erstelle Spielstand") + "Zustand (Savestate) abspeichern") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_SCREENSHOT, "Erstelle Bildschirmfoto") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_SHADER_NEXT, @@ -798,9 +818,9 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_SHADER_PREV, MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_SLOWMOTION, "Zeitlupe") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_STATE_SLOT_MINUS, - "Spielstand-Speicherplatz -") + "Zustands-Speicherplatz -") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_STATE_SLOT_PLUS, - "Spielstand-Speicherplatz +") + "Zustands-Speicherplatz +") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_VOLUME_DOWN, "Lautstärke -") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_VOLUME_UP, @@ -809,6 +829,10 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_OVERLAY_ENABLE, "Aktiviere Overlay") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_OVERLAY_HIDE_IN_MENU, "Overlay im Menü nicht anzeigen") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_OVERLAY_SHOW_PHYSICAL_INPUTS, + "Eingaben im Overlay anzeigen") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_OVERLAY_SHOW_PHYSICAL_INPUTS_PORT, + "Eingaben von folgendem Port anzeigen") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_POLL_TYPE_BEHAVIOR, "Abfrageverhalten") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_POLL_TYPE_BEHAVIOR_EARLY, @@ -822,7 +846,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_PREFER_FRONT_TOUCH, MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_REMAPPING_DIRECTORY, "Tastenbelegungen") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_REMAP_BINDS_ENABLE, - "Tasten-Umbelegung aktivieren") + "Tasten-Neubelegung aktivieren") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_SAVE_AUTOCONFIG, "Speichere Autokonfiguration") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_SETTINGS, @@ -832,17 +856,17 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_SMALL_KEYBOARD_ENABLE, MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_TOUCH_ENABLE, "Touch-Eingabe aktivieren") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_TURBO_ENABLE, - "Turbo aktivieren") + "Autofeuer aktivieren") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_TURBO_PERIOD, - "Turbo-Häufigkeit") + "Autofeuer-Frequenz") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_USER_BINDS, "Belegungen für Benutzer %u") MSG_HASH(MENU_ENUM_LABEL_VALUE_INTERNAL_STORAGE_STATUS, "Status des internen Speichers") MSG_HASH(MENU_ENUM_LABEL_VALUE_JOYPAD_AUTOCONFIG_DIR, - "Automatische Eingabekonfigurationen") + "Automatische Konfiguration von Controllern") MSG_HASH(MENU_ENUM_LABEL_VALUE_JOYPAD_DRIVER, - "Joypad-Treiber") + "Controller-Treiber") MSG_HASH(MENU_ENUM_LABEL_VALUE_LAKKA_SERVICES, "Services") MSG_HASH(MENU_ENUM_LABEL_VALUE_LANG_CHINESE_SIMPLIFIED, @@ -850,7 +874,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_LANG_CHINESE_SIMPLIFIED, MSG_HASH(MENU_ENUM_LABEL_VALUE_LANG_CHINESE_TRADITIONAL, "Chinesisch (traditionell)") MSG_HASH(MENU_ENUM_LABEL_VALUE_LANG_DUTCH, - "Niederlöndisch") + "Niederländisch") MSG_HASH(MENU_ENUM_LABEL_VALUE_LANG_ENGLISH, "Englisch") MSG_HASH(MENU_ENUM_LABEL_VALUE_LANG_ESPERANTO, @@ -868,7 +892,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_LANG_KOREAN, MSG_HASH(MENU_ENUM_LABEL_VALUE_LANG_POLISH, "Polnisch") MSG_HASH(MENU_ENUM_LABEL_VALUE_LANG_PORTUGUESE_BRAZIL, - "Portugiesisch (Brazil)") + "Portugiesisch (Brasilien)") MSG_HASH(MENU_ENUM_LABEL_VALUE_LANG_PORTUGUESE_PORTUGAL, "Portugiesisch (Portugal)") MSG_HASH(MENU_ENUM_LABEL_VALUE_LANG_RUSSIAN, @@ -924,9 +948,9 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_COLOR_THEME_RED, MSG_HASH(MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_COLOR_THEME_YELLOW, "Gelb") MSG_HASH(MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_FOOTER_OPACITY, - "Footer-Transparenz") + "Transparenz der Fußzeile") MSG_HASH(MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_HEADER_OPACITY, - "Header-Transparenz") + "Transparenz der Kopfzeile") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_DRIVER, "Menütreiber") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_ENUM_THROTTLE_FRAMERATE, @@ -935,6 +959,8 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_FILE_BROWSER_SETTINGS, "Einstellungen") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_LINEAR_FILTER, "Linearer Filter für Menü") +MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_HORIZONTAL_ANIMATION, + "Horizontale Animation") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_SETTINGS, "Menü") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_WALLPAPER, @@ -962,7 +988,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY, MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_ALLOW_SLAVES, "Erlaube Slave-Modus für Clients") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_CHECK_FRAMES, - "Netplay-Synchronisation prüfen") /* TODO: What does this setting do? Need more context. */ + "Netplay-Synchronisation prüfen") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_INPUT_LATENCY_FRAMES_MIN, "Eingabeverzögerung") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_INPUT_LATENCY_FRAMES_RANGE, @@ -1016,7 +1042,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_NETWORK_CMD_PORT, MSG_HASH(MENU_ENUM_LABEL_VALUE_NETWORK_INFORMATION, "Netzwerk-Informationen") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETWORK_REMOTE_ENABLE, - "Netzwerk-Gamepad aktivieren") + "Netzwerk-Controller aktivieren") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETWORK_REMOTE_PORT, "Netzwerk-Remote-Port") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETWORK_SETTINGS, @@ -1190,7 +1216,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_RECORD_ENABLE, MSG_HASH(MENU_ENUM_LABEL_VALUE_RECORD_PATH, "Speichere Aufnahme als...") MSG_HASH(MENU_ENUM_LABEL_VALUE_RECORD_USE_OUTPUT_DIRECTORY, - "Speichere Aufname im Ausgabeverzeichnis") + "Speichere Aufnahme im Ausgabeverzeichnis") MSG_HASH(MENU_ENUM_LABEL_VALUE_REMAP_FILE, "Remap-Datei") MSG_HASH(MENU_ENUM_LABEL_VALUE_REMAP_FILE_LOAD, @@ -1199,6 +1225,10 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_REMAP_FILE_SAVE_CORE, "Speichere Core-Remap-Datei") MSG_HASH(MENU_ENUM_LABEL_VALUE_REMAP_FILE_SAVE_GAME, "Speichere Spiel-Remap-Datei") +MSG_HASH(MENU_ENUM_LABEL_VALUE_REMAP_FILE_REMOVE_CORE, + "Lösche Core-Remap-Datei") +MSG_HASH(MENU_ENUM_LABEL_VALUE_REMAP_FILE_REMOVE_GAME, + "Lösche Spiel-Remap-Datei") MSG_HASH(MENU_ENUM_LABEL_VALUE_REQUIRED, "Notwendig") MSG_HASH(MENU_ENUM_LABEL_VALUE_RESTART_CONTENT, @@ -1231,8 +1261,14 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_RGUI_SHOW_START_SCREEN, "Zeige Startbildschirm") MSG_HASH(MENU_ENUM_LABEL_VALUE_RIGHT_ANALOG, "Rechter Analogstick") +MSG_HASH(MENU_ENUM_LABEL_VALUE_ADD_TO_FAVORITES, + "Zu Favoriten hinzufügen") +MSG_HASH(MENU_ENUM_LABEL_VALUE_ADD_TO_FAVORITES_PLAYLIST, + "Zu Favoriten hinzufügen") MSG_HASH(MENU_ENUM_LABEL_VALUE_RUN, "Starten") +MSG_HASH(MENU_ENUM_LABEL_VALUE_RUN_MUSIC, + "Abspielen") MSG_HASH(MENU_ENUM_LABEL_VALUE_SAMBA_ENABLE, "SAMBA aktivieren") MSG_HASH(MENU_ENUM_LABEL_VALUE_SAVEFILE_DIRECTORY, @@ -1240,13 +1276,13 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_SAVEFILE_DIRECTORY, MSG_HASH(MENU_ENUM_LABEL_VALUE_SAVESTATE_AUTO_INDEX, "Automatische Indexierung von Spielständen") MSG_HASH(MENU_ENUM_LABEL_VALUE_SAVESTATE_AUTO_LOAD, - "Spielstand automatisch laden") + "Zustand automatisch laden") MSG_HASH(MENU_ENUM_LABEL_VALUE_SAVESTATE_AUTO_SAVE, - "Spielstand automatisch speichern") + "Zustand automatisch speichern") MSG_HASH(MENU_ENUM_LABEL_VALUE_SAVESTATE_DIRECTORY, - "Spielstände") + "Zustandsdaten (Savestates)") MSG_HASH(MENU_ENUM_LABEL_VALUE_SAVESTATE_THUMBNAIL_ENABLE, - "Spielstand-Miniaturansichten") + "Zustands-Miniaturansichten") MSG_HASH(MENU_ENUM_LABEL_VALUE_SAVE_CURRENT_CONFIG, "Speichere aktuelle Konfiguration") MSG_HASH(MENU_ENUM_LABEL_VALUE_SAVE_CURRENT_CONFIG_OVERRIDE_CORE, @@ -1256,7 +1292,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_SAVE_CURRENT_CONFIG_OVERRIDE_GAME, MSG_HASH(MENU_ENUM_LABEL_VALUE_SAVE_NEW_CONFIG, "Speichere neue Konfiguration") MSG_HASH(MENU_ENUM_LABEL_VALUE_SAVE_STATE, - "Spielstand speichern") + "Aktuellen Zustand speichern") MSG_HASH(MENU_ENUM_LABEL_VALUE_SAVING_SETTINGS, "Speichern") MSG_HASH(MENU_ENUM_LABEL_VALUE_SCAN_DIRECTORY, @@ -1302,7 +1338,15 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_SLOWMOTION_RATIO, MSG_HASH(MENU_ENUM_LABEL_VALUE_SORT_SAVEFILES_ENABLE, "Sortiere Speicherdaten in Ordnern") MSG_HASH(MENU_ENUM_LABEL_VALUE_SORT_SAVESTATES_ENABLE, - "Sortiere Spielstände in Ordnern") + "Sortiere Zustandsdaten in Ordnern") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SAVESTATES_IN_CONTENT_DIR_ENABLE, + "Zustandsdaten im Verzeichnis des Inhalts speichern") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SAVEFILES_IN_CONTENT_DIR_ENABLE, + "Speicherdaten im Verzeichnis des Inhalts speichern") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEMFILES_IN_CONTENT_DIR_ENABLE, + "Systemdateien befinden sich im Verzeichnis des Inhalts") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SCREENSHOTS_IN_CONTENT_DIR_ENABLE, + "Bildschirmfotos im Verzeichnis des Inhalts speichern") MSG_HASH(MENU_ENUM_LABEL_VALUE_SSH_ENABLE, "SSH aktivieren") MSG_HASH(MENU_ENUM_LABEL_VALUE_START_CORE, @@ -1318,7 +1362,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_STATUS, MSG_HASH(MENU_ENUM_LABEL_VALUE_STDIN_CMD_ENABLE, "stdin-Befehle") MSG_HASH(MENU_ENUM_LABEL_VALUE_SUPPORTED_CORES, - "Unterstützte Cores") + "Vorgeschlagene Cores") MSG_HASH(MENU_ENUM_LABEL_VALUE_SUSPEND_SCREENSAVER_ENABLE, "Bildschirmschoner ausschalten") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_BGM_ENABLE, @@ -1381,6 +1425,8 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_JACK_SUPPORT, "JACK-Unterstützung") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_KMS_SUPPORT, "KMS/EGL-Unterstützung") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_LAKKA_VERSION, + "Lakka-Version") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_LIBRETRODB_SUPPORT, "LibretroDB-Unterstützung") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_LIBUSB_SUPPORT, @@ -1392,7 +1438,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_NETPLAY_SUPPORT, MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_NETWORK_COMMAND_IFACE_SUPPORT, "Netzwerk-Befehlsinterface-Unterstützung") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_NETWORK_REMOTE_SUPPORT, - "Unterstützung für Netzwerk-Gamepads") + "Unterstützung für Netzwerk-Controller") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_OPENAL_SUPPORT, "OpenAL-Unterstützung") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_OPENGLES_SUPPORT, @@ -1408,7 +1454,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_OSS_SUPPORT, MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_OVERLAY_SUPPORT, "Overlay-Unterstützung") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_POWER_SOURCE, - "Energiequelle") + "Stromquelle") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_POWER_SOURCE_CHARGED, "Geladen") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_POWER_SOURCE_CHARGING, @@ -1494,17 +1540,17 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_UI_MENUBAR_ENABLE, MSG_HASH(MENU_ENUM_LABEL_VALUE_UNABLE_TO_READ_COMPRESSED_FILE, "Komprimiertes Archiv kann nicht gelesen werden.") MSG_HASH(MENU_ENUM_LABEL_VALUE_UNDO_LOAD_STATE, - "Laden des Spielstandes rückgängig machen") + "Laden des Zustands rückgängig machen") MSG_HASH(MENU_ENUM_LABEL_VALUE_UNDO_SAVE_STATE, - "Speichern des Spielstandes rückgängig machen") + "Speichern des Zustands rückgängig machen") MSG_HASH(MENU_ENUM_LABEL_VALUE_UNKNOWN, "Unbekannt") MSG_HASH(MENU_ENUM_LABEL_VALUE_UPDATER_SETTINGS, "Online-Aktualisierungen") MSG_HASH(MENU_ENUM_LABEL_VALUE_UPDATE_ASSETS, - "Assets aktualisieren") + "Zusätzliche Daten aktualisieren") MSG_HASH(MENU_ENUM_LABEL_VALUE_UPDATE_AUTOCONFIG_PROFILES, - "Profile f. automatische Konfiguration aktualisieren") + "Gamepad/Controller-Profile aktualisieren") MSG_HASH(MENU_ENUM_LABEL_VALUE_UPDATE_CG_SHADERS, "CG-Shader aktualisieren") MSG_HASH(MENU_ENUM_LABEL_VALUE_UPDATE_CHEATS, @@ -1523,6 +1569,8 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_UPDATE_SLANG_SHADERS, "Slang-Shader aktualisieren") MSG_HASH(MENU_ENUM_LABEL_VALUE_USER, "Benutzer") +MSG_HASH(MENU_ENUM_LABEL_VALUE_KEYBOARD, + "Kbd") MSG_HASH(MENU_ENUM_LABEL_VALUE_USER_INTERFACE_SETTINGS, "Benutzeroberfläche") MSG_HASH(MENU_ENUM_LABEL_VALUE_USER_LANGUAGE, @@ -1537,6 +1585,8 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_USE_THIS_DIRECTORY, "") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_ALLOW_ROTATE, "Erlaube Bildrotation") +MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_ASPECT_RATIO, + "Konfiguriere Bildseitenverhältnis") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_ASPECT_RATIO_AUTO, "Automatisches Bildseitenverhältnis") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_ASPECT_RATIO_INDEX, @@ -1598,7 +1648,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_ROTATION, MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SCALE, "Skalierung im Fenstermodus") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SCALE_INTEGER, - "Ganzzahlige Bildskalierung") + "Pixelgenaue Bildskalierung") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SETTINGS, "Video") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_DIR, @@ -1649,6 +1699,10 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_WINDOW_WIDTH, "Fensterbreite") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_WINDOW_HEIGHT, "Fensterhöhe") +MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_FULLSCREEN_X, + "Vollbild-Breite") +MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_FULLSCREEN_Y, + "Vollbild-Höhe") MSG_HASH(MENU_ENUM_LABEL_VALUE_WIFI_DRIVER, "WLAN-Treiber") MSG_HASH(MENU_ENUM_LABEL_VALUE_WIFI_SETTINGS, @@ -1671,6 +1725,8 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_PIXEL, "Pixel") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_RETROACTIVE, "RetroActive") +MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_RETROSYSTEM, + "Retrosystem") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_DOTART, "Dot-Art") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME, @@ -1705,6 +1761,8 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_SHOW_HISTORY, "Zeige Tab 'Verlauf'") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_SHOW_ADD, "Zeige Tab 'Inhalte importieren'") +MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_SHOW_FAVORITES, + "Zeige Tab 'Favoriten'") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_SHOW_IMAGES, "Zeige Tab 'Bilder'") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_SHOW_MUSIC, @@ -1727,6 +1785,8 @@ MSG_HASH(MENU_ENUM_SUBLABEL_CHEEVOS_TEST_UNOFFICIAL, "Aktiviere inoffizielle Errungenschaften und/oder Beta-Funktionen zu Testzwecken.") MSG_HASH(MENU_ENUM_SUBLABEL_CHEEVOS_HARDCORE_MODE_ENABLE, "Deaktiviert Spielstände, Cheats, Zurückspulen, Zeitraffer, Pause und Zeitlupe für alle Spiele.") +MSG_HASH(MENU_ENUM_SUBLABEL_CHEEVOS_VERBOSE_ENABLE, + "Aktiviere ausführliche Ausgabe von Bildschirmmeldungen für Errungenschaften.") MSG_HASH(MENU_ENUM_SUBLABEL_DRIVER_SETTINGS, "Ändere die Treiber, die von diesem System verwendet werden.") MSG_HASH(MENU_ENUM_SUBLABEL_RETRO_ACHIEVEMENTS_SETTINGS, @@ -1774,7 +1834,7 @@ MSG_HASH(MENU_ENUM_SUBLABEL_FPS_SHOW, MSG_HASH(MENU_ENUM_SUBLABEL_INPUT_HOTKEY_BINDS, "Konfiguriere Hotkey-Einstellungen.") MSG_HASH(MENU_ENUM_SUBLABEL_INPUT_MENU_ENUM_TOGGLE_GAMEPAD_COMBO, - "Gamepad-Tastenkombination, mit der das Menü aufgerufen wird.") + "Controller-Tastenkombination, mit der das Menü aufgerufen wird.") MSG_HASH(MENU_ENUM_SUBLABEL_INPUT_SETTINGS, "Einstellungen für Joypads, Tastaturen und Mäuse.") MSG_HASH(MENU_ENUM_SUBLABEL_INPUT_USER_BINDS, @@ -1821,6 +1881,8 @@ MSG_HASH(MENU_ENUM_SUBLABEL_WIFI_SETTINGS, "Sucht nach drahtlosen Netzwerken und stellt eine Verbindung her.") MSG_HASH(MENU_ENUM_SUBLABEL_HELP_LIST, "Erfahre mehr darüber, wie Retroarch funktioniert.") +MSG_HASH(MSG_ADDED_TO_FAVORITES, + "Zu Favoriten hinzugefügt") MSG_HASH(MSG_APPENDED_DISK, "Datenträger hinzufügen") MSG_HASH(MSG_APPLICATION_DIR, @@ -1840,7 +1902,7 @@ MSG_HASH(MSG_AUTOCONFIG_FILE_SAVED_SUCCESSFULLY, MSG_HASH(MSG_AUTOSAVE_FAILED, "Initialisierung der Autospeichern-Funktion fehlgeschlagen.") MSG_HASH(MSG_AUTO_SAVE_STATE_TO, - "Spielstand automatisch speichern in") + "Zustand automatisch speichern in") MSG_HASH(MSG_BLOCKING_SRAM_OVERWRITE, "Überschreiben des SRAM blockieren") MSG_HASH(MSG_BRINGING_UP_COMMAND_INTERFACE_ON_PORT, @@ -1864,7 +1926,7 @@ MSG_HASH(MSG_CONTENT_CRC32S_DIFFER, MSG_HASH(MSG_CONTENT_LOADING_SKIPPED_IMPLEMENTATION_WILL_DO_IT, "Laden des Inhalts übersprungen. Die Implementierung wird ihn selbst laden.") MSG_HASH(MSG_CORE_DOES_NOT_SUPPORT_SAVESTATES, - "Core unterstützt keine Spielstände.") + "Core unterstützt keine Zustandsdaten (Savestates).") MSG_HASH(MSG_CORE_OPTIONS_FILE_CREATED_SUCCESSFULLY, "Core-Optionsdatei wurde erfolgreich erstellt.") MSG_HASH(MSG_COULD_NOT_FIND_ANY_NEXT_DRIVER, @@ -1914,7 +1976,9 @@ MSG_HASH(MSG_ERROR_PARSING_ARGUMENTS, MSG_HASH(MSG_ERROR_SAVING_CORE_OPTIONS_FILE, "Fehler beim Speichern der Core-Optionen") MSG_HASH(MSG_ERROR_SAVING_REMAP_FILE, - "Fehler beim Speichern der Tasten-Umbelegung.") + "Fehler beim Speichern der Tasten-Umbelegungen.") +MSG_HASH(MSG_ERROR_REMOVING_REMAP_FILE, + "Fehler beim Löschen der Tasten-Umbelegungen.") MSG_HASH(MSG_ERROR_SAVING_SHADER_PRESET, "Fehler beim Speichern der Shader-Voreinstellungen.") MSG_HASH(MSG_EXTERNAL_APPLICATION_DIR, @@ -2034,7 +2098,7 @@ MSG_HASH(MSG_INPUT_CHEAT_FILENAME, MSG_HASH(MSG_INPUT_PRESET_FILENAME, "Vorlagen-Dateiname") MSG_HASH(MSG_INPUT_RENAME_ENTRY, - "Rename Title") + "Titel umbenennen") MSG_HASH(MSG_INTERFACE, "Netzwerk-Karte") MSG_HASH(MSG_INTERNAL_STORAGE, @@ -2109,6 +2173,8 @@ MSG_HASH(MSG_REDIRECTING_SAVESTATE_TO, "Spielstand umleiten in") MSG_HASH(MSG_REMAP_FILE_SAVED_SUCCESSFULLY, "Remap-Datei wurde erfolgreich gespeichert.") +MSG_HASH(MSG_REMAP_FILE_REMOVED_SUCCESSFULLY, + "Remap-Datei wurde erfolgreich entfernt.") MSG_HASH(MSG_REMOVED_DISK_FROM_TRAY, "Datenträger aus Laufwerk entfernt.") MSG_HASH(MSG_REMOVING_TEMPORARY_CONTENT_FILE, @@ -2146,7 +2212,7 @@ MSG_HASH(MSG_SAVED_SUCCESSFULLY_TO, MSG_HASH(MSG_SAVING_RAM_TYPE, "Speichere RAM-Typ") MSG_HASH(MSG_SAVING_STATE, - "Speichere Spielstand") /* more context needed */ + "Speichere aktuellen Zustand (Savestate)") MSG_HASH(MSG_SCANNING, "Durchsuchen") MSG_HASH(MSG_SCANNING_OF_DIRECTORY_FINISHED, @@ -2163,6 +2229,8 @@ MSG_HASH(MSG_SKIPPING_SRAM_LOAD, "Überspringe Laden des SRAM.") MSG_HASH(MSG_SLOW_MOTION, "Zeitlupe.") +MSG_HASH(MSG_FAST_FORWARD, + "Snel vooruit.") MSG_HASH(MSG_SLOW_MOTION_REWIND, "In Zeitlupe zurückspulen.") MSG_HASH(MSG_SRAM_WILL_NOT_BE_SAVED, @@ -2213,7 +2281,7 @@ MSG_HASH(MENU_ENUM_SUBLABEL_AUDIO_MUTE, "Audio stumm-/lautschalten.") MSG_HASH( MENU_ENUM_SUBLABEL_AUDIO_RATE_CONTROL_DELTA, - "Hilft Fehler bei der Audio- und Videosynchronisierung auszubügeln. Wenn deaktiviert, ist eine brauchbare Synchronisation nahezu unmöglich." + "Hilft, Fehler bei der Audio- und Videosynchronisierung auszubügeln. Wenn deaktiviert, ist eine brauchbare Synchronisation nahezu unmöglich." ) MSG_HASH( MENU_ENUM_SUBLABEL_CAMERA_ALLOW, @@ -2239,13 +2307,25 @@ MSG_HASH( MENU_ENUM_SUBLABEL_AUDIO_VOLUME, "Lautstärkeverstärkung in dB. 0 dB ist die normale Lautstärke, es erfolgt eine Verstärkung." ) +MSG_HASH( + MENU_ENUM_SUBLABEL_AUDIO_WASAPI_EXCLUSIVE_MODE, + "Erlaube dem WASAPI-Treiber, die vollständige Kontrolle über das Audio-Gerät zu übernehmen. Wenn deaktiviert, wird der Shared-Modus verwendet." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_AUDIO_WASAPI_FLOAT_FORMAT, + "Verwende Gleitkomma-Format für den WASAPI-Treiber, wenn dein Audio-Gerät dies unterstützt." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_AUDIO_WASAPI_SH_BUFFER_LENGTH, + "Zwischenspeicher-Größe (in Frames), wenn der WASAPI-Treiber im Shared-Modus verwendet wird." + ) MSG_HASH( MENU_ENUM_SUBLABEL_AUDIO_SYNC, "Synchronisiere Audio. Empfohlen." ) MSG_HASH( MENU_ENUM_SUBLABEL_INPUT_AXIS_THRESHOLD, - "Wie weit ein Analog-Stick bewegt werden muss, bis er reagiert." + "Legt fest, wie weit ein Analog-Stick bewegt werden muss, bis er reagiert." ) MSG_HASH( MENU_ENUM_SUBLABEL_INPUT_BIND_TIMEOUT, @@ -2442,6 +2522,10 @@ MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_WINDOW_WIDTH, "Wähle die Fensterbreite. Wird dieser Wert auf 0 belassen, wird versucht, das Fenster so groß wie möglich zu skalieren.") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_WINDOW_HEIGHT, "Wähle die Fensterhöhe. Wird dieser Wert auf 0 belassen, wird versucht, das Fenster so groß wie möglich zu skalieren.") +MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_FULLSCREEN_X, + "Benutzerdefinierte Bildbreite für den Vollbildmodus. Wird dieser Wert auf 0 belassen, wird die Desktop-Auflösung verwendet.") +MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_FULLSCREEN_Y, + "Benutzerdefinierte Bildhöhe für den Vollbildmodus. Wird dieser Wert auf 0 belassen, wird die Desktop-Auflösung verwendet.") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_MESSAGE_POS_X, "Wähle eine eigene X-Achsenposition für Bildschirmmeldungen.") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_MESSAGE_POS_Y, @@ -2450,9 +2534,13 @@ MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_FONT_SIZE, "Wähle die Schriftgröße in Punkten.") MSG_HASH(MENU_ENUM_SUBLABEL_INPUT_OVERLAY_HIDE_IN_MENU, "Verberge das Overlay im Menü und zeige es wieder an, wenn das Menü verlassen wird.") +MSG_HASH(MENU_ENUM_SUBLABEL_INPUT_OVERLAY_SHOW_PHYSICAL_INPUTS, + "Tastatur/Controller-Tastendrücke im Overlay anzeigen.") +MSG_HASH(MENU_ENUM_SUBLABEL_INPUT_OVERLAY_SHOW_PHYSICAL_INPUTS_PORT, + "Wähle den Port des Controllers aus, dessen Eingaben im Overlay angezeigt werden sollen.") MSG_HASH( MENU_ENUM_SUBLABEL_CONTENT_COLLECTION_LIST, - "Durchsuchter Inhalt wird hier erscheinen." + "Während der Suche gefundener Inhalt wird hier erscheinen." ) MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_SCALE_INTEGER, @@ -2484,7 +2572,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_SAVESTATE_AUTO_INDEX, - "Wenn ein Spielstand erstellt wird, wird der Spielstand-Index automatisch erhöht, bevor der Spielstand gespeichert wird. Wenn Inhalt geladen wird, wird automatisch der höchste existierende Spielstand-Index gewählt." + "Wenn ein Zustand (Savestate) gespeichert wird, wird der Zustands-Index automatisch erhöht, bevor der Spielstand gespeichert wird. Wenn Inhalt geladen wird, wird automatisch der höchste existierende Spielstand-Index gewählt." ) MSG_HASH( MENU_ENUM_SUBLABEL_BLOCK_SRAM_OVERWRITE, @@ -2516,11 +2604,11 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_SAVESTATE_AUTO_SAVE, - "Speichere einen Spielstand automatisch, wenn RetroArch beendet wird. RetroArch wird diesen Spielstand automatisch laden, wenn 'Spielstand automatisch laden' aktiviert ist." + "Speichere den aktuellen Zustand automatisch, wenn RetroArch beendet wird. RetroArch wird diesen Spielstand automatisch laden, wenn 'Spielstand automatisch laden' aktiviert ist." ) MSG_HASH( MENU_ENUM_SUBLABEL_SAVESTATE_AUTO_LOAD, - "Lade einen Spielstand beim Start automatisch." + "Lade den zuletzt gespeicherten Zustand beim Start automatisch." ) MSG_HASH( MENU_ENUM_SUBLABEL_SAVESTATE_THUMBNAIL_ENABLE, @@ -2536,7 +2624,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_INPUT_AUTODETECT_ENABLE, - "Aktiviere automatische Erkennung von Eingabegeräten. Wird versuchen, Gamepads automatisch zu erkennen (Plug-and-Play)." + "Aktiviere automatische Erkennung von Eingabegeräten. Wird versuchen, Controller automatisch zu erkennen (Plug-and-Play)." ) MSG_HASH( MENU_ENUM_SUBLABEL_MENU_INPUT_SWAP_OK_CANCEL, @@ -2734,6 +2822,10 @@ MSG_HASH(MENU_ENUM_SUBLABEL_DELETE_ENTRY, "Entferne diesen Eintrag aus der Sammlung.") MSG_HASH(MENU_ENUM_SUBLABEL_INFORMATION, "Zeige weiterführende Informationen über diesen Inhalt an.") +MSG_HASH(MENU_ENUM_SUBLABEL_ADD_TO_FAVORITES, + "Füge diesen Eintrag zu deinen Favoriten hinzu.") +MSG_HASH(MENU_ENUM_SUBLABEL_ADD_TO_FAVORITES_PLAYLIST, + "Füge diesen Eintrag zu deinen Favoriten hinzu.") MSG_HASH(MENU_ENUM_SUBLABEL_RUN, "Starte den Inhalt.") MSG_HASH(MENU_ENUM_SUBLABEL_MENU_FILE_BROWSER_SETTINGS, @@ -2761,9 +2853,9 @@ MSG_HASH( "Schließt das aktuelle Spiel. Alle nicht gespeicherten Änderungen können verloren gehen." ) MSG_HASH(MENU_ENUM_SUBLABEL_LOAD_STATE, - "Lade einen gespeicherten Spielstand aus dem aktuellen Speicherplatz.") + "Lade einen gespeicherten Zustand aus dem aktuellen Speicherplatz.") MSG_HASH(MENU_ENUM_SUBLABEL_SAVE_STATE, - "Speichere einen Spielstand in dem aktuellen Speicherplatz.") + "Speichere einen Zustand in dem aktuellen Speicherplatz.") MSG_HASH(MENU_ENUM_SUBLABEL_RESUME, "Setze die aktuelle Anwendung wieder fort und verlasse das Spielmenü.") MSG_HASH(MENU_ENUM_SUBLABEL_RESUME_CONTENT, @@ -2771,9 +2863,9 @@ MSG_HASH(MENU_ENUM_SUBLABEL_RESUME_CONTENT, MSG_HASH(MENU_ENUM_SUBLABEL_STATE_SLOT, "Ändert den aktuell gewählten Spielstand-Speicherplatz.") MSG_HASH(MENU_ENUM_SUBLABEL_UNDO_LOAD_STATE, - "Wenn ein Spielstand geladen wurde, wird der Inhalt zum Zustand vor dem Laden des Spielstandes zurückkehren.") + "Wenn ein Zustand (Savestate) geladen wurde, wird der Inhalt zum Zustand vor dem Laden des Spielstandes zurückkehren.") MSG_HASH(MENU_ENUM_SUBLABEL_UNDO_SAVE_STATE, - "Wenn ein Spielstand überschrieben wurde, wird der Inhalt des zuvor gespeicherten Spielstands wiederhergestellt.") + "Wenn ein Zustand (Savestate) überschrieben wurde, wird der Inhalt des zuvor gespeicherten Spielstands wiederhergestellt.") MSG_HASH( MENU_ENUM_SUBLABEL_ACCOUNTS_RETRO_ACHIEVEMENTS, "Retro Achievements (Errungenschaften-Dienst). Besuche http://retroachievements.org für weitere Informationen." @@ -2847,20 +2939,22 @@ MSG_HASH(MENU_ENUM_SUBLABEL_XMB_RIBBON_ENABLE, "Wähle einen animierten Effekt für das Hintergrundbild. Kann je nach Effekt GPU-lastig sein. Wenn die Leistung nicht ausreicht, wähle einen einfacheren Effekt oder deaktiviere diese Option.") MSG_HASH(MENU_ENUM_SUBLABEL_XMB_FONT, "Wähle eine andere Schriftart, die im Menü verwendet werden soll.") +MSG_HASH(MENU_ENUM_SUBLABEL_XMB_SHOW_FAVORITES, + "Zeige den Reiter 'Favoriten' im Hauptmenü an.") MSG_HASH(MENU_ENUM_SUBLABEL_XMB_SHOW_IMAGES, - "Zeige den Tab 'Bilder' im Hauptmenü an.") + "Zeige den Reiter 'Bilder' im Hauptmenü an.") MSG_HASH(MENU_ENUM_SUBLABEL_XMB_SHOW_MUSIC, - "Zeige den Tab 'Musik' im Hauptmenü an.") + "Zeige den Reiter 'Musik' im Hauptmenü an.") MSG_HASH(MENU_ENUM_SUBLABEL_XMB_SHOW_VIDEO, - "Zeige den Tab 'Video' im Hauptmenü an.") + "Zeige den Reiter 'Video' im Hauptmenü an.") MSG_HASH(MENU_ENUM_SUBLABEL_XMB_SHOW_NETPLAY, - "Zeigen den Tab 'Netplay' im Hauptmenü an.") + "Zeigen den Reiter 'Netplay' im Hauptmenü an.") MSG_HASH(MENU_ENUM_SUBLABEL_XMB_SHOW_SETTINGS, - "Zeige den Tab 'Einstellungen' im Hauptmenü an") + "Zeige den Reiter 'Einstellungen' im Hauptmenü an") MSG_HASH(MENU_ENUM_SUBLABEL_XMB_SHOW_HISTORY, - "Zeige den Tab 'Verlauf' im Hauptmenü an.") + "Zeige den Reiter 'Verlauf' im Hauptmenü an.") MSG_HASH(MENU_ENUM_SUBLABEL_XMB_SHOW_ADD, - "Zeige den Tab 'Inhalt importieren' im Hauptmenü an") + "Zeige den Reiter 'Inhalt importieren' im Hauptmenü an") MSG_HASH(MENU_ENUM_SUBLABEL_RGUI_SHOW_START_SCREEN, "Zeige einen Startbildschirm im Menü an. Wird automatisch deaktiviert, nachdem das Programm zum ersten Mal gestartet wurde.") MSG_HASH(MENU_ENUM_SUBLABEL_MATERIALUI_MENU_HEADER_OPACITY, @@ -2880,7 +2974,7 @@ MSG_HASH(MENU_ENUM_SUBLABEL_LIBRETRO_DIR_PATH, MSG_HASH(MENU_ENUM_SUBLABEL_LIBRETRO_INFO_PATH, "Awendungs- und Core-Informationsdateien werden hier gespeichert.") MSG_HASH(MENU_ENUM_SUBLABEL_JOYPAD_AUTOCONFIG_DIR, - "Wenn ein Gamepad eingesteckt wird, wird es automatisch konfiguriert, sofern eine passende Konfigurationsdatei in diesem Verzeichnis vorhanden ist.") + "Wenn ein Controller eingesteckt wird, wird er automatisch konfiguriert, sofern eine passende Konfigurationsdatei in diesem Verzeichnis vorhanden ist.") MSG_HASH(MENU_ENUM_SUBLABEL_PLAYLIST_DIRECTORY, "Speichere alle Sammlungen in diesem Verzeichnis.") MSG_HASH( @@ -2900,7 +2994,7 @@ MSG_HASH( MSG_HASH(MENU_ENUM_SUBLABEL_SAVEFILE_DIRECTORY, "Speichere alle Speicherdaten in diesem Verzeichnis. Wenn kein Verzeichnis festgelegt ist, wird versucht, die Datei im Arbeitsverzeichnis des Inhalts zu speichern.") MSG_HASH(MENU_ENUM_SUBLABEL_SAVESTATE_DIRECTORY, - "Speichere alle Spielstände in diesem Verzeichnis. Wenn kein Verzeichnis festgelegt ist, wird versucht, die Datei im Arbeitsverzeichnis des Inhalts zu speichern.") + "Speichere alle Zustände (Savestates) in diesem Verzeichnis. Wenn kein Verzeichnis festgelegt ist, wird versucht, die Datei im Arbeitsverzeichnis des Inhalts zu speichern.") MSG_HASH(MENU_ENUM_SUBLABEL_SCREENSHOT_DIRECTORY, "Verzeichnis, in dem alle Bildschirmfotos abgelegt werden.") MSG_HASH(MENU_ENUM_SUBLABEL_OVERLAY_DIRECTORY, @@ -2961,193 +3055,219 @@ MSG_HASH(MENU_ENUM_SUBLABEL_CONTENT_SETTINGS, "Greife schnell auf alle relevanten Spieleinstellungen zu.") MSG_HASH(MENU_ENUM_SUBLABEL_CORE_INFORMATION, "Zeige Informationen über diese Anwendung/diesen Core an.") +MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_ASPECT_RATIO, + "Gleitkomma-Wert für das Bild-Seitenverhältnis (Breite / Höhe). Wird verwendet, wenn das Seitenverhältnis auf 'Benutzerdefiniert' eingstellt ist.") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_HEIGHT, "Benutzerdefinierte Bildhöhe, die verwendet wird, wenn das Seitenverhältnis auf 'Benutzerdefiniert' eingestellt ist.") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_WIDTH, "Benutzerdefinierte Bildhöhe, die verwendet wird, wenn das Seitenverhältnis auf 'Benutzerdefiniert' eingestellt ist.") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_X, - "Benutzerdefinierter Versatz, der für die Position der X-Achse des Bildes verwendet wird. Wird ignoriert, wenn 'Ganzzahlige Bildskalierung' aktiviert ist, das Bild wird dann zentriert.") + "Benutzerdefinierter Versatz, der für die Position der X-Achse des Bildes verwendet wird. Wird ignoriert, wenn 'Pixelgenaue Bildskalierung' aktiviert ist, das Bild wird dann zentriert.") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_Y, - "Benutzerdefinierter Versatz, der für die Position der Y-Achse des Bildes verwendet wird. Wird ignoriert, wenn 'Ganzzahlige Bildskalierung' aktiviert ist, das Bild wird dann zentriert.") + "Benutzerdefinierter Versatz, der für die Position der Y-Achse des Bildes verwendet wird. Wird ignoriert, wenn 'Pixelgenaue Bildskalierung' aktiviert ist, das Bild wird dann zentriert.") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_USE_MITM_SERVER, - "Verwende MITM-Server") + "Verwende Relay-Server") MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_USE_MITM_SERVER, "Leite alle Netplay-Verbindungen durch einen Man-in-the-middle-Server. Hilfreich, wenn sich der Host hinter einer Firewall befindet oder Probleme mit NAT/UPnP hat.") MSG_HASH(MENU_ENUM_LABEL_VALUE_ADD_TO_MIXER, - "Add to mixer") + "Zum Mixer hinzufügen") MSG_HASH(MENU_ENUM_LABEL_VALUE_ADD_TO_MIXER_AND_COLLECTION, - "Add to mixer") + "zum Mixer hinzufügen") MSG_HASH(MENU_ENUM_LABEL_VALUE_FILTER_BY_CURRENT_CORE, - "Filter by current core") + "Nach aktuellem Core filtern") MSG_HASH( MSG_AUDIO_MIXER_VOLUME, - "Global audio mixer volume" + "Globale Lautstärke des Audio-Mixers" ) MSG_HASH( MENU_ENUM_SUBLABEL_AUDIO_MIXER_VOLUME, - "Global audio mixer volume (in dB). 0 dB is normal volume, and no gain is applied." + "Globale Lautstärke des Audio-Mixers (in dB). 0 dB ist die normale Lautstärke ohne zusätzliche Verstärkung." ) MSG_HASH( MENU_ENUM_LABEL_VALUE_AUDIO_MIXER_VOLUME, - "Audio Mixer Volume Level (dB)" + "Lautstärke des Audio-Mixers (dB)" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_AUDIO_MIXER_MUTE, - "Audio Mixer Mute" + "Audio-Mixer stummschalten" ) MSG_HASH(MENU_ENUM_SUBLABEL_AUDIO_MIXER_MUTE, - "Mute/unmute mixer audio.") + "Audio-Mixer laut-/stummschalten.") MSG_HASH(MENU_ENUM_LABEL_MENU_SHOW_ONLINE_UPDATER, - "Show Online Updater") + "Online-Aktualisierungen anzeigen") MSG_HASH(MENU_ENUM_SUBLABEL_MENU_SHOW_ONLINE_UPDATER, - "Show/hide the 'Online Updater' option.") + "Zeige/verberge die Option 'Online-Aktualisierungen'.") +MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_VIEWS_SETTINGS, + "Menü bearbeiten") +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_VIEWS_SETTINGS, + "Zeige/verberge Elemente auf dem Menübildschirm" + ) MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_SHOW_CORE_UPDATER, - "Show Core Updater") + "Zeige Core-Aktualisierungen") MSG_HASH(MENU_ENUM_SUBLABEL_MENU_SHOW_CORE_UPDATER, - "Show/hide the ability to update cores (and core info files).") + "Zeige/verberge die Funktion zum Aktualisieren der Cores (und der Info-Dateien).") MSG_HASH(MSG_PREPARING_FOR_CONTENT_SCAN, - "Preparing for content scan...") + "Suchvorgang vorbereiten...") MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_DELETE, - "Delete core") + "Core löschen") MSG_HASH(MENU_ENUM_SUBLABEL_CORE_DELETE, - "Remove this core from disk.") -MSG_HASH(MENU_ENUM_LABEL_VALUE_RENAME_ENTRY, - "Rename the title of the entry.") -MSG_HASH(MENU_ENUM_LABEL_RENAME_ENTRY, - "Rename") + "Lösche diesen Core von der Festplatte.") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_FRAMEBUFFER_OPACITY, - "Framebuffer Opacity") + "Framebuffer-Transparenz") MSG_HASH(MENU_ENUM_SUBLABEL_MENU_FRAMEBUFFER_OPACITY, - "Modify the opacity of the framebuffer.") + "Modifiziere die Transparenz des Framebuffers.") MSG_HASH(MENU_ENUM_LABEL_VALUE_GOTO_FAVORITES, - "Favorites") + "Favoriten") MSG_HASH(MENU_ENUM_SUBLABEL_GOTO_FAVORITES, - "Content which you have added to 'Favorites' will appear here.") + "Inhalt, den du zu deinen Favoriten hinzugefügt hast, wird hier erscheinen.") MSG_HASH(MENU_ENUM_LABEL_VALUE_GOTO_MUSIC, - "Music") + "Musik") MSG_HASH(MENU_ENUM_SUBLABEL_GOTO_MUSIC, - "Music which has been previously played will appear here.") + "Musik, die bereits abgespielt wurde, wird hier erscheinen.") MSG_HASH(MENU_ENUM_LABEL_VALUE_GOTO_IMAGES, - "Image") + "Bilder") MSG_HASH(MENU_ENUM_SUBLABEL_GOTO_IMAGES, - "Images which have been previously viewed will appear here.") + "Bilder, die bereits angezeigt wurden, werden hier erscheinen.") MSG_HASH(MENU_ENUM_LABEL_VALUE_GOTO_VIDEO, "Video") MSG_HASH(MENU_ENUM_SUBLABEL_GOTO_VIDEO, - "Videos which have been previously played will appear here.") + "Videos, die bereits abgespielt wurden, werden hier erscheinen.") MSG_HASH(MENU_ENUM_LABEL_VALUE_MATERIALUI_ICONS_ENABLE, - "Menu Icons") + "Menü-Icons") MSG_HASH(MENU_ENUM_SUBLABEL_MATERIALUI_ICONS_ENABLE, - "Enable/disable the menu icons shown at the lefthand side of the menu entries.") + "Aktiviere/deaktiviere die Menü-Icons, die auf der linken Seite der Menü-Einträge angezeigt werden.") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MAIN_MENU_ENABLE_SETTINGS, - "Enable Settings Tab") + "Aktiviere den Reiter 'Einstellungen'") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_SHOW_SETTINGS_PASSWORD, - "Set Password For Enabling Settings Tab") + "Passwort zum Aktivieren des Reiters 'Einstellungen' festlegen") MSG_HASH(MSG_INPUT_ENABLE_SETTINGS_PASSWORD, - "Enter Password") + "Passwort eingeben") MSG_HASH(MSG_INPUT_ENABLE_SETTINGS_PASSWORD_OK, - "Password correct.") + "Passwort korrekt.") MSG_HASH(MSG_INPUT_ENABLE_SETTINGS_PASSWORD_NOK, - "Password incorrect.") + "Passwort falsch.") MSG_HASH(MENU_ENUM_SUBLABEL_XMB_MAIN_MENU_ENABLE_SETTINGS, - "Enables the Settings tab. A restart is required for the tab to appear.") + "Aktiviert den Reiter 'Einstellungen'. Ein Neustart wird benötigt, damit der Reiter angezeigt wird.") MSG_HASH(MENU_ENUM_SUBLABEL_XMB_SHOW_SETTINGS_PASSWORD, - "Supplying a password when hiding the settings tab makes it possible to later restore it from the menu, by going to the Main Menu tab, selecting Enable Settings Tab and entering the password.") + "Wird vor dem Verstecken der Einstellungen ein Passwort vergeben, wird es später möglich sein, den Reiter wiederherzustellen, in dem die Funktion 'Aktiviere den Reiter 'Einstellungen' ausgewählt und das Passwort dort eingegeben wird.") MSG_HASH(MENU_ENUM_SUBLABEL_PLAYLIST_ENTRY_RENAME, - "Allow the user to rename entries in collections.") + "Erlaube dem Benutzer, Einträge in der Sammlung umzubenennen.") MSG_HASH(MENU_ENUM_LABEL_VALUE_PLAYLIST_ENTRY_RENAME, - "Allow to rename entries") + "Umbenennen von Einträgen erlauben") +MSG_HASH(MENU_ENUM_LABEL_VALUE_RENAME_ENTRY, + "Titel dieses Eintrags umbenennen.") +MSG_HASH(MENU_ENUM_LABEL_RENAME_ENTRY, + "Umbenennen") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_SHOW_LOAD_CORE, - "Show Load Core") + "Zeige 'Core laden'") MSG_HASH(MENU_ENUM_SUBLABEL_MENU_SHOW_LOAD_CORE, - "Show/hide the 'Load Core' option.") + "Zeige/verstecke die Option 'Core laden'.") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_SHOW_LOAD_CONTENT, - "Show Load Content") + "Zeige 'Inhalt laden'") MSG_HASH(MENU_ENUM_SUBLABEL_MENU_SHOW_LOAD_CONTENT, - "Show/hide the 'Load Content' option.") + "Zeige/verstecke die Option 'Inhalt laden'.") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_SHOW_INFORMATION, - "Show Information") + "Zeige Informationen") MSG_HASH(MENU_ENUM_SUBLABEL_MENU_SHOW_INFORMATION, - "Show/hide the 'Information' option.") + "Zeige/verstecke die Option 'Informationen'") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_SHOW_CONFIGURATIONS, - "Show Configurations") + "Zeige Konfigurationen") MSG_HASH(MENU_ENUM_SUBLABEL_MENU_SHOW_CONFIGURATIONS, - "Show/hide the 'Configurations' option.") + "Zeige/verstecke die Option 'Konfigurationen'.") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_SHOW_HELP, - "Show Help") + "Zeige Hilfe") MSG_HASH(MENU_ENUM_SUBLABEL_MENU_SHOW_HELP, - "Show/hide the 'Help' option.") + "Zeige/verstecke die Option 'Hilfe'.") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_SHOW_QUIT_RETROARCH, - "Show Quit RetroArch") + "Zeige 'RetroArch beenden'") MSG_HASH(MENU_ENUM_SUBLABEL_MENU_SHOW_QUIT_RETROARCH, - "Show/hide the 'Quit RetroArch' option.") + "Zeige/verstecke die Option 'RetroArch beenden'.") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_SHOW_REBOOT, - "Show Reboot") + "Zeige 'Neu starten'") MSG_HASH(MENU_ENUM_SUBLABEL_MENU_SHOW_REBOOT, - "Show/hide the 'Reboot' option.") + "Zeige/verstecke die Option 'Neu starten'.") MSG_HASH(MENU_ENUM_LABEL_VALUE_QUICK_MENU_VIEWS_SETTINGS, - "Quick Menu") + "Spielmenü") MSG_HASH(MENU_ENUM_SUBLABEL_QUICK_MENU_VIEWS_SETTINGS, - "Show or hide elements on the Quick Menu screen.") + "Zeige oder verstecke Elemente aus dem Spielmenü.") MSG_HASH(MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_TAKE_SCREENSHOT, - "Show Take Screenshot") + "Zeige 'Bildschirmfoto erstellen'") MSG_HASH(MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_TAKE_SCREENSHOT, - "Show/hide the 'Take Screenshot' option.") + "Zeige/verstecke die Option 'Bildschirmfoto erstellen'.") MSG_HASH(MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_SAVE_LOAD_STATE, - "Show Save/Load State") + "Zeige 'Zustand (Savestate) speichern/laden'") MSG_HASH(MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_SAVE_LOAD_STATE, - "Show/hide the options for saving/loading state.") + "Zeige/verstecke die Optionen zum speichern und laden von Zuständen (Savestates).") MSG_HASH(MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_UNDO_SAVE_LOAD_STATE, - "Show Undo Save/Load State") + "Zeige 'Zustand speichern/laden rückgängig machen'") MSG_HASH(MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_UNDO_SAVE_LOAD_STATE, - "Show/hide the options for undoing save/load state.") + "Zeige/verstecke die Optionen zum Rückgängig machen von Lade- und Speichervorgängen für Savestates.") MSG_HASH(MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_ADD_TO_FAVORITES, - "Show Add to Favorites") + "Zeige 'Zu Favoriten hinzufügen'") MSG_HASH(MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_ADD_TO_FAVORITES, - "Show/hide the 'Add to Favorites' option.") + "Zeige/verstecke die Option 'Zu Favoriten hinzufügen'.") MSG_HASH(MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_OPTIONS, - "Show Options") + "Zeige 'Optionen'") MSG_HASH(MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_OPTIONS, - "Show/hide the 'Options' option.") + "Zeige/verstecke den Eintrag 'Optionen'.") MSG_HASH(MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_CONTROLS, - "Show Controls") + "Zeige 'Steuerung'") MSG_HASH(MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_CONTROLS, - "Show/hide the 'Controls' option.") + "Zeige/verstecke die Option 'Steuerung'.") MSG_HASH(MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_CHEATS, - "Show Cheats") + "Zeige 'Cheats'") MSG_HASH(MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_CHEATS, - "Show/hide the 'Cheats' option.") + "Zeige/verstecke die Option 'Cheats'.") MSG_HASH(MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_SHADERS, - "Show Shaders") + "Zeige 'Shader'") MSG_HASH(MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_SHADERS, - "Show/hide the 'Shaders' option.") + "Zeige/verstecke die Option 'Shader'.") MSG_HASH(MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_SAVE_CORE_OVERRIDES, - "Show Save Core Overrides") + "Zeige 'Speichere Core-Überschreibungen'") MSG_HASH(MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_SAVE_CORE_OVERRIDES, - "Show/hide the 'Save Core Overrides' option.") + "Zeige/verstecke die Option 'Speichere Core-Überschreibungen'.") MSG_HASH(MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_SAVE_GAME_OVERRIDES, - "Show Save Game Overrides") + "Zeige 'Speichere Spiele-Überschreibungen'") MSG_HASH(MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_SAVE_GAME_OVERRIDES, - "Show/hide the 'Save Game Overrides' option.") + "Zeige/verstecke die Option 'Speichere Spiele-Überschreibungen.") MSG_HASH(MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_INFORMATION, - "Show Information") + "Zeige 'Informationen'") MSG_HASH(MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_INFORMATION, - "Show/hide the 'Information' option.") + "Zeige/verstecke die Option 'Informationen'.") +MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_BGCOLOR_ENABLE, + "Aktiviere Hintergrund in Bildschirmmeldungen") +MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_BGCOLOR_RED, + "Rot-Anteil der Hintergrundfarbe der Bildschirmmeldungen") +MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_BGCOLOR_GREEN, + "Grün-Anteil der Hintergrundfarbe der Bildschirmmeldungen") +MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_BGCOLOR_BLUE, + "Blau-Anteil der Hintergrundfarbe der Bildschirmmeldungen") +MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_BGCOLOR_OPACITY, + "Transparenz des Hintergrunds der Bildschirmmeldungen") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_DISABLE_KIOSK_MODE, - "Disable Kiosk Mode") + "Deaktiviere Kiosk-Modus") MSG_HASH(MENU_ENUM_SUBLABEL_MENU_DISABLE_KIOSK_MODE, - "Disables kiosk mode. A restart is required for the change to take full effect.") + "Deaktiviert den Kiosk-Modus. Ein Neustart wird benötigt, damit die Änderungen angewendet werden.") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_ENABLE_KIOSK_MODE, - "Enable Kiosk Mode") + "Aktiviere Kiosk-Modus") MSG_HASH(MENU_ENUM_SUBLABEL_MENU_ENABLE_KIOSK_MODE, - "Protects the setup by hiding all configuration related settings.") + "Schützt RetroArch, in dem alle Konfigurationsmöglichkeiten ausgeblendet werden.") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_KIOSK_MODE_PASSWORD, - "Set Password For Disabling Kiosk Mode") + "Setze Passwort zur Deaktivierung des Kiosk-Modus") MSG_HASH(MENU_ENUM_SUBLABEL_MENU_KIOSK_MODE_PASSWORD, - "Supplying a password when enabling kiosk mode makes it possible to later disable it from the menu, by going to the Main Menu, selecting Disable Kiosk Mode and entering the password.") + "Wird beim Aktivieren des Kiosk-Modus ein Passwort vergeben, kann er später unter Angabe des Passworts wieder deaktiviert werden.") MSG_HASH(MSG_INPUT_KIOSK_MODE_PASSWORD, - "Enter Password") + "Passwort eingeben") MSG_HASH(MSG_INPUT_KIOSK_MODE_PASSWORD_OK, - "Password correct.") + "Passwort korrekt.") MSG_HASH(MSG_INPUT_KIOSK_MODE_PASSWORD_NOK, - "Password incorrect.") + "Passwort falsch.") +MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_COLOR_RED, + "Rot-Anteil der Bildschirmmeldungen") +MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_COLOR_GREEN, + "Grün-Anteil der Bildschirmmeldungen") +MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_COLOR_BLUE, + "Blau-Anteil der Bildschirmmeldungen") +MSG_HASH(MENU_ENUM_LABEL_VALUE_FRAMECOUNT_SHOW, + "Zeige die aktuelle Anzahl an Einzelbildern an") diff --git a/intl/msg_hash_eo.h b/intl/msg_hash_eo.h index 14d56c01a5..c17db311bb 100644 --- a/intl/msg_hash_eo.h +++ b/intl/msg_hash_eo.h @@ -1570,6 +1570,8 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_PIXEL, "Pixel") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_RETROACTIVE, "RetroActive") +MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_RETROSYSTEM, + "Retrosystem") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_DOTART, "Dot-Art") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME, @@ -2052,6 +2054,8 @@ MSG_HASH(MSG_SKIPPING_SRAM_LOAD, "Skipping SRAM load.") MSG_HASH(MSG_SLOW_MOTION, "Slow motion.") +MSG_HASH(MSG_FAST_FORWARD, + "Fast forward.") MSG_HASH(MSG_SLOW_MOTION_REWIND, "Slow motion rewind.") MSG_HASH(MSG_SRAM_WILL_NOT_BE_SAVED, diff --git a/intl/msg_hash_es.c b/intl/msg_hash_es.c index 5f8ddab95a..631d53b609 100644 --- a/intl/msg_hash_es.c +++ b/intl/msg_hash_es.c @@ -1469,6 +1469,8 @@ const char *msg_hash_to_str_es(enum msg_hash_enums msg) return "Omitiendo carga de SRAM."; case MSG_SLOW_MOTION: return "Cámara lenta."; + case MSG_FAST_FORWARD: + return "Avance rápido."; case MSG_SLOW_MOTION_REWIND: return "Rebobinar cámara lenta."; case MSG_SRAM_WILL_NOT_BE_SAVED: diff --git a/intl/msg_hash_fr.h b/intl/msg_hash_fr.h index 94bd0f9bbb..fa1094a768 100644 --- a/intl/msg_hash_fr.h +++ b/intl/msg_hash_fr.h @@ -1695,6 +1695,8 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_PIXEL, "Pixel") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_RETROACTIVE, "RetroActive") +MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_RETROSYSTEM, + "Retrosystem") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_DOTART, "Dot-Art") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME, @@ -2183,6 +2185,8 @@ MSG_HASH(MSG_SKIPPING_SRAM_LOAD, "Ignore le chargement de la SRAM.") MSG_HASH(MSG_SLOW_MOTION, "Ralenti.") +MSG_HASH(MSG_FAST_FORWARD, + "Avance rapide.") MSG_HASH(MSG_SLOW_MOTION_REWIND, "Rembobinage ralenti.") MSG_HASH(MSG_SRAM_WILL_NOT_BE_SAVED, diff --git a/intl/msg_hash_it.h b/intl/msg_hash_it.h index 6d85124076..c94ed5b0b8 100644 --- a/intl/msg_hash_it.h +++ b/intl/msg_hash_it.h @@ -1263,6 +1263,8 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_RIGHT_ANALOG, "Analogico Destro") MSG_HASH(MENU_ENUM_LABEL_VALUE_ADD_TO_FAVORITES, "Aggiungi a Preferiti") +MSG_HASH(MENU_ENUM_LABEL_VALUE_ADD_TO_FAVORITES_PLAYLIST, + "Aggiungi a Preferiti") MSG_HASH(MENU_ENUM_LABEL_VALUE_RUN, "Avvia") MSG_HASH(MENU_ENUM_LABEL_VALUE_RUN_MUSIC, @@ -1721,6 +1723,8 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_PIXEL, "Pixel") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_RETROACTIVE, "RetroAttivo") +MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_RETROSYSTEM, + "Retrosystem") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_DOTART, "Dot-Art") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME, @@ -2223,6 +2227,8 @@ MSG_HASH(MSG_SKIPPING_SRAM_LOAD, "Skipping SRAM load.") MSG_HASH(MSG_SLOW_MOTION, "Slow motion.") +MSG_HASH(MSG_FAST_FORWARD, + "Avanti veloce.") MSG_HASH(MSG_SLOW_MOTION_REWIND, "Riavvolgimento lento.") MSG_HASH(MSG_SRAM_WILL_NOT_BE_SAVED, @@ -2816,6 +2822,8 @@ MSG_HASH(MENU_ENUM_SUBLABEL_INFORMATION, "Visualizza ulteriori informazioni sul contenuto.") MSG_HASH(MENU_ENUM_SUBLABEL_ADD_TO_FAVORITES, "Aggiunge il titolo ai tuoi preferiti.") +MSG_HASH(MENU_ENUM_SUBLABEL_ADD_TO_FAVORITES_PLAYLIST, + "Aggiunge il titolo ai tuoi preferiti.") MSG_HASH(MENU_ENUM_SUBLABEL_RUN, "Avvia il contenuto.") MSG_HASH(MENU_ENUM_SUBLABEL_MENU_FILE_BROWSER_SETTINGS, diff --git a/intl/msg_hash_ja.c b/intl/msg_hash_ja.c index 9dfe552e5c..54531b7640 100644 --- a/intl/msg_hash_ja.c +++ b/intl/msg_hash_ja.c @@ -631,7 +631,7 @@ int menu_hash_get_help_jp_enum(enum msg_hash_enums msg, char *s, size_t len) break; case MENU_ENUM_LABEL_WELCOME_TO_RETROARCH: snprintf(s, len, - "Welcome to RetroArch\n" + "RetroArchにようこそ\n" ); break; case MENU_ENUM_LABEL_VALUE_HELP_AUDIO_VIDEO_TROUBLESHOOTING_DESC: diff --git a/intl/msg_hash_ja.h b/intl/msg_hash_ja.h index 204759fc58..3c772118af 100644 --- a/intl/msg_hash_ja.h +++ b/intl/msg_hash_ja.h @@ -633,6 +633,8 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_FALSE, "偽") MSG_HASH(MENU_ENUM_LABEL_VALUE_FASTFORWARD_RATIO, "早送り比") +MSG_HASH(MENU_ENUM_LABEL_VALUE_FAVORITES_TAB, + "お気に入り") MSG_HASH(MENU_ENUM_LABEL_VALUE_FPS_SHOW, "フレームレートを表示") MSG_HASH(MENU_ENUM_LABEL_VALUE_FRAME_THROTTLE_ENABLE, @@ -1241,6 +1243,10 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_REMAP_FILE_SAVE_CORE, "コアリマップファイルを保存") MSG_HASH(MENU_ENUM_LABEL_VALUE_REMAP_FILE_SAVE_GAME, "ゲームリマップファイルを保存") +MSG_HASH(MENU_ENUM_LABEL_VALUE_REMAP_FILE_REMOVE_CORE, + "コアのりマップファイルを削除") +MSG_HASH(MENU_ENUM_LABEL_VALUE_REMAP_FILE_REMOVE_GAME, + "ゲームのりマップファイルを削除") MSG_HASH(MENU_ENUM_LABEL_VALUE_REQUIRED, "必要") MSG_HASH(MENU_ENUM_LABEL_VALUE_RESTART_CONTENT, @@ -1731,6 +1737,8 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_PIXEL, "ピクセル") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_RETROACTIVE, "レトロアクティブ") +MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_RETROSYSTEM, + "Retrosystem") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_DOTART, "ドット絵") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME, @@ -1883,6 +1891,8 @@ MSG_HASH(MENU_ENUM_SUBLABEL_WIFI_SETTINGS, "無線ネットワークを検索して接続する。") MSG_HASH(MENU_ENUM_SUBLABEL_HELP_LIST, "RetroArchの使い方について学ぶ。") +MSG_HASH(MSG_ADDED_TO_FAVORITES, + "お気に入りに追加しました") MSG_HASH(MSG_APPENDED_DISK, "Appended disk") MSG_HASH(MSG_APPLICATION_DIR, @@ -1974,11 +1984,13 @@ MSG_HASH(MSG_ERROR_LIBRETRO_CORE_REQUIRES_SPECIAL_CONTENT, MSG_HASH(MSG_ERROR_PARSING_ARGUMENTS, "Error parsing arguments.") MSG_HASH(MSG_ERROR_SAVING_CORE_OPTIONS_FILE, - "Error saving core options file.") + "コアのオプションファイルを保存に失敗しました。") MSG_HASH(MSG_ERROR_SAVING_REMAP_FILE, - "Error saving remap file.") + "リマップファイルを保存に失敗しました。") +MSG_HASH(MSG_ERROR_REMOVING_REMAP_FILE, + "リマップファイルを削除に失敗しました。") MSG_HASH(MSG_ERROR_SAVING_SHADER_PRESET, - "Error saving shader preset.") + "シェーダーのプリセットを保存に失敗しました。") MSG_HASH(MSG_EXTERNAL_APPLICATION_DIR, "外部アプリフォルダ") MSG_HASH(MSG_EXTRACTING, @@ -2150,7 +2162,7 @@ MSG_HASH(MSG_NO_STATE_HAS_BEEN_LOADED_YET, MSG_HASH(MSG_OVERRIDES_ERROR_SAVING, "Error saving overrides.") MSG_HASH(MSG_OVERRIDES_SAVED_SUCCESSFULLY, - "Overrides saved successfully.") + "優先ファイルを保存しました。") MSG_HASH(MSG_PAUSED, "一時停止。") MSG_HASH(MSG_PROGRAM, @@ -2170,7 +2182,9 @@ MSG_HASH(MSG_REDIRECTING_SAVEFILE_TO, MSG_HASH(MSG_REDIRECTING_SAVESTATE_TO, "Redirecting savestate to") MSG_HASH(MSG_REMAP_FILE_SAVED_SUCCESSFULLY, - "Remap file saved successfully.") + "リマップファイルを保存しました。") +MSG_HASH(MSG_REMAP_FILE_REMOVED_SUCCESSFULLY, + "リマップファイルを削除しました。") MSG_HASH(MSG_REMOVED_DISK_FROM_TRAY, "Removed disk from tray.") MSG_HASH(MSG_REMOVING_TEMPORARY_CONTENT_FILE, @@ -2225,6 +2239,8 @@ MSG_HASH(MSG_SKIPPING_SRAM_LOAD, "Skipping SRAM load.") MSG_HASH(MSG_SLOW_MOTION, "スローモーション。") +MSG_HASH(MSG_FAST_FORWARD, + "早送り。") MSG_HASH(MSG_SLOW_MOTION_REWIND, "スローモーション巻き戻し。") MSG_HASH(MSG_SRAM_WILL_NOT_BE_SAVED, @@ -3153,24 +3169,26 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_BGCOLOR_OPACITY, "OSDメッセージ背景の不透明性") MSG_HASH(MENU_ENUM_LABEL_VALUE_ADD_TO_FAVORITES, "お気に入りに追加") +MSG_HASH(MENU_ENUM_LABEL_VALUE_ADD_TO_FAVORITES_PLAYLIST, + "お気に入りに追加") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_DISABLE_KIOSK_MODE, - "Disable Kiosk Mode") + "キオスクモードを無効") MSG_HASH(MENU_ENUM_SUBLABEL_MENU_DISABLE_KIOSK_MODE, "Disables kiosk mode. A restart is required for the change to take full effect.") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_ENABLE_KIOSK_MODE, - "Enable Kiosk Mode") + "キオスクモードを有効") MSG_HASH(MENU_ENUM_SUBLABEL_MENU_ENABLE_KIOSK_MODE, "Protects the setup by hiding all configuration related settings.") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_KIOSK_MODE_PASSWORD, - "Set Password For Disabling Kiosk Mode") + "キオスクモードを無効するパスワードを設定") MSG_HASH(MENU_ENUM_SUBLABEL_MENU_KIOSK_MODE_PASSWORD, "Supplying a password when enabling kiosk mode makes it possible to later disable it from the menu, by going to the Main Menu, selecting Disable Kiosk Mode and entering the password.") MSG_HASH(MSG_INPUT_KIOSK_MODE_PASSWORD, - "Enter Password") + "パスワードを入力して下さい") MSG_HASH(MSG_INPUT_KIOSK_MODE_PASSWORD_OK, - "Password correct.") + "パスワード正解。") MSG_HASH(MSG_INPUT_KIOSK_MODE_PASSWORD_NOK, - "Password incorrect.") + "パスワード不正解。") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_COLOR_RED, "OSDメッセージの赤色値") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_COLOR_GREEN, @@ -3179,3 +3197,9 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_COLOR_BLUE, "OSDメッセージの青色値") MSG_HASH(MENU_ENUM_LABEL_VALUE_FRAMECOUNT_SHOW, "フレームレート表示でフレーム数を表示") +MSG_HASH(MSG_CONFIG_OVERRIDE_LOADED, + "優先ファイルをロードしました。") +MSG_HASH(MSG_GAME_REMAP_FILE_LOADED, + "ゲームの優先ファイルをロードしました。") +MSG_HASH(MSG_CORE_REMAP_FILE_LOADED, + "コアの優先ファイルをロードしました。") diff --git a/intl/msg_hash_ko.h b/intl/msg_hash_ko.h index a0db09d6f7..f4e980e451 100644 --- a/intl/msg_hash_ko.h +++ b/intl/msg_hash_ko.h @@ -1671,6 +1671,8 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_PIXEL, "Pixel") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_RETROACTIVE, "RetroActive") +MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_RETROSYSTEM, + "Retrosystem") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_DOTART, "Dot-Art") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME, @@ -2163,6 +2165,8 @@ MSG_HASH(MSG_SKIPPING_SRAM_LOAD, "SRAM 불러오기 건너뛰는 중.") MSG_HASH(MSG_SLOW_MOTION, "슬로우 모션.") +MSG_HASH(MSG_FAST_FORWARD, + "빨리 감기.") MSG_HASH(MSG_SLOW_MOTION_REWIND, "슬로우 모션 되감기.") MSG_HASH(MSG_SRAM_WILL_NOT_BE_SAVED, diff --git a/intl/msg_hash_lbl.h b/intl/msg_hash_lbl.h index f454ba44d6..fbf28f4ca6 100644 --- a/intl/msg_hash_lbl.h +++ b/intl/msg_hash_lbl.h @@ -134,6 +134,8 @@ MSG_HASH(MENU_ENUM_LABEL_CHEEVOS_ENABLE, "cheevos_enable") MSG_HASH(MENU_ENUM_LABEL_CHEEVOS_HARDCORE_MODE_ENABLE, "cheevos_hardcore_mode_enable") +MSG_HASH(MENU_ENUM_LABEL_CHEEVOS_LEADERBOARDS_ENABLE, + "cheevos_leaderboards_enable") MSG_HASH(MENU_ENUM_LABEL_CHEEVOS_LOCKED_ACHIEVEMENTS, "cheevos_locked_achievements") MSG_HASH(MENU_ENUM_LABEL_CHEEVOS_LOCKED_ENTRY, @@ -871,6 +873,8 @@ MSG_HASH(MENU_ENUM_LABEL_RGUI_SHOW_START_SCREEN, "rgui_show_start_screen") MSG_HASH(MENU_ENUM_LABEL_ADD_TO_FAVORITES, "favorites_add") +MSG_HASH(MENU_ENUM_LABEL_ADD_TO_FAVORITES_PLAYLIST, + "favorites_add_playlist") MSG_HASH(MENU_ENUM_LABEL_RUN, "collection") MSG_HASH(MENU_ENUM_LABEL_RUN_MUSIC, diff --git a/intl/msg_hash_pl.c b/intl/msg_hash_pl.c index cf5300785a..a20415a68d 100644 --- a/intl/msg_hash_pl.c +++ b/intl/msg_hash_pl.c @@ -1,4 +1,4 @@ -/* RetroArch - A frontend for libretro. +/* RetroArch - A frontend for libretro. * Copyright (C) 2011-2017 - Daniel De Matteis * * RetroArch is free software: you can redistribute it and/or modify it under the terms @@ -982,6 +982,8 @@ const char *msg_hash_to_str_pl(enum msg_hash_enums msg) return "Pomijanie wczytywania SRAM."; case MSG_SLOW_MOTION: return "Spowolnione tempo."; + case MSG_FAST_FORWARD: + return "Szybko do przodu."; case MSG_SLOW_MOTION_REWIND: return "Przewijanie w spowolnionym tempie."; case MSG_SRAM_WILL_NOT_BE_SAVED: diff --git a/intl/msg_hash_pt_br.h b/intl/msg_hash_pt_br.h index bf472714fb..dcaeaebd75 100644 --- a/intl/msg_hash_pt_br.h +++ b/intl/msg_hash_pt_br.h @@ -1525,6 +1525,9 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_RIGHT_ANALOG, MSG_HASH(MENU_ENUM_LABEL_VALUE_ADD_TO_FAVORITES, "Adicionar aos Favoritos" ) +MSG_HASH(MENU_ENUM_LABEL_VALUE_ADD_TO_FAVORITES_PLAYLIST, + "Adicionar aos Favoritos" + ) MSG_HASH(MENU_ENUM_LABEL_VALUE_RUN, "Executar" ) @@ -2212,6 +2215,9 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_PIXEL, MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_RETROACTIVE, "RetroActive" ) +MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_RETROSYSTEM, + "Retrosystem" + ) MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_DOTART, "Dot-Art" ) @@ -2965,6 +2971,9 @@ MSG_HASH(MSG_SKIPPING_SRAM_LOAD, MSG_HASH(MSG_SLOW_MOTION, "Câmera Lenta." ) +MSG_HASH(MSG_FAST_FORWARD, + "Avanço rápido." + ) MSG_HASH(MSG_SLOW_MOTION_REWIND, "Voltar Atrás em Câmera Lenta." ) @@ -3553,6 +3562,9 @@ MSG_HASH(MENU_ENUM_SUBLABEL_INFORMATION, MSG_HASH(MENU_ENUM_SUBLABEL_ADD_TO_FAVORITES, "Adicionar o item aos seus favoritos." ) +MSG_HASH(MENU_ENUM_SUBLABEL_ADD_TO_FAVORITES_PLAYLIST, + "Adicionar o item aos seus favoritos." + ) MSG_HASH(MENU_ENUM_SUBLABEL_RUN, "Iniciar o conteúdo." ) diff --git a/intl/msg_hash_pt_pt.h b/intl/msg_hash_pt_pt.h index 4815a6e8b1..800463bdc5 100644 --- a/intl/msg_hash_pt_pt.h +++ b/intl/msg_hash_pt_pt.h @@ -1663,6 +1663,8 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_PIXEL, "Pixel") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_RETROACTIVE, "RetroActive") +MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_RETROSYSTEM, + "Retrosystem") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_DOTART, "Dot-Art") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME, @@ -2153,6 +2155,8 @@ MSG_HASH(MSG_SKIPPING_SRAM_LOAD, "Ignorando carregamento de SRAM.") MSG_HASH(MSG_SLOW_MOTION, "Câmera lenta.") +MSG_HASH(MSG_FAST_FORWARD, + "Avanço rápido.") MSG_HASH(MSG_SLOW_MOTION_REWIND, "Função rewind em câmera lenta.") MSG_HASH(MSG_SRAM_WILL_NOT_BE_SAVED, diff --git a/intl/msg_hash_ru.h b/intl/msg_hash_ru.h index 8f734f92a1..3cc733e238 100644 --- a/intl/msg_hash_ru.h +++ b/intl/msg_hash_ru.h @@ -1704,6 +1704,8 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_PIXEL, "Пиксель") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_RETROACTIVE, "RetroActive") +MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_RETROSYSTEM, + "Retrosystem") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_DOTART, "Dot-Art") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME, @@ -2198,6 +2200,8 @@ MSG_HASH(MSG_SKIPPING_SRAM_LOAD, "Пропуск загрузки SRAM.") MSG_HASH(MSG_SLOW_MOTION, "Замедление.") +MSG_HASH(MSG_FAST_FORWARD, + "Перемотка вперед.") MSG_HASH(MSG_SLOW_MOTION_REWIND, "Замедленная перемотка.") MSG_HASH(MSG_SRAM_WILL_NOT_BE_SAVED, diff --git a/intl/msg_hash_us.c b/intl/msg_hash_us.c index 26410fef16..9219d9276d 100644 --- a/intl/msg_hash_us.c +++ b/intl/msg_hash_us.c @@ -379,8 +379,7 @@ int menu_hash_get_help_us_enum(enum msg_hash_enums msg, char *s, size_t len) " \n" "If this option is disabled, \n" "it will try to load even if such \n" - "firmware is missing. \n" - "down. \n"); + "firmware is missing. \n"); break; case MENU_ENUM_LABEL_PARENT_DIRECTORY: snprintf(s, len, diff --git a/intl/msg_hash_us.h b/intl/msg_hash_us.h index cf615043f0..a7f516c586 100644 --- a/intl/msg_hash_us.h +++ b/intl/msg_hash_us.h @@ -176,7 +176,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_ACCOUNTS_RETRO_ACHIEVEMENTS, - "Retro Achievements" + "RetroAchievements" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_ACHIEVEMENT_LIST, @@ -430,6 +430,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEEVOS_HARDCORE_MODE_ENABLE, "Achievements Hardcore Mode" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEEVOS_LEADERBOARDS_ENABLE, + "Leaderboards" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEEVOS_LOCKED_ACHIEVEMENTS, "Locked Achievements:" @@ -440,16 +444,12 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEEVOS_SETTINGS, - "Retro Achievements" + "RetroAchievements" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEEVOS_TEST_UNOFFICIAL, "Test Unofficial Achievements" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_CHEEVOS_VERBOSE_ENABLE, - "Achievements Verbose Mode" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEEVOS_UNLOCKED_ACHIEVEMENTS, "Unlocked Achievements:" @@ -458,6 +458,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEEVOS_UNLOCKED_ENTRY, "Unlocked" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEEVOS_VERBOSE_ENABLE, + "Achievements Verbose Mode" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CLOSE_CONTENT, "Close Content" @@ -1263,6 +1267,8 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_RIGHT_ANALOG, "Right Analog") MSG_HASH(MENU_ENUM_LABEL_VALUE_ADD_TO_FAVORITES, "Add to Favorites") +MSG_HASH(MENU_ENUM_LABEL_VALUE_ADD_TO_FAVORITES_PLAYLIST, + "Add to Favorites") MSG_HASH(MENU_ENUM_LABEL_VALUE_RUN, "Run") MSG_HASH(MENU_ENUM_LABEL_VALUE_RUN_MUSIC, @@ -1606,9 +1612,9 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_FILTER_FLICKER, MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_FONT_ENABLE, "Enable Onscreen Notifications") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_FONT_PATH, - "Onscreen Notification Font") + "Notification Font") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_FONT_SIZE, - "Onscreen Notification Size") + "Notification Size") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_FORCE_ASPECT, "Force aspect ratio") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_FORCE_SRGB_DISABLE, @@ -1630,9 +1636,9 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_HARD_SYNC_FRAMES, MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_MAX_SWAPCHAIN_IMAGES, "Max swapchain images") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_POS_X, - "Onscreen Notification X Position") + "Notification X Position") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_POS_Y, - "Onscreen Notification Y Position") + "Notification Y Position") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_MONITOR_INDEX, "Monitor Index") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_POST_FILTER_RECORD, @@ -1723,6 +1729,8 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_PIXEL, "Pixel") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_RETROACTIVE, "RetroActive") +MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_RETROSYSTEM, + "Retrosystem") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_DOTART, "Dot-Art") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME, @@ -1781,6 +1789,8 @@ MSG_HASH(MENU_ENUM_SUBLABEL_CHEEVOS_TEST_UNOFFICIAL, "Enable or disable unofficial achievements and/or beta features for testing purposes.") MSG_HASH(MENU_ENUM_SUBLABEL_CHEEVOS_HARDCORE_MODE_ENABLE, "Enable or disable savestates, cheats, rewind, fast-forward, pause, and slow-motion for all games.") +MSG_HASH(MENU_ENUM_SUBLABEL_CHEEVOS_LEADERBOARDS_ENABLE, + "Enable or disable in-game leaderboards. Has no effect if Hardcore Mode is disabled.") MSG_HASH(MENU_ENUM_SUBLABEL_CHEEVOS_VERBOSE_ENABLE, "Enable or disable OSD verbosity for achievements.") MSG_HASH(MENU_ENUM_SUBLABEL_DRIVER_SETTINGS, @@ -2225,6 +2235,8 @@ MSG_HASH(MSG_SKIPPING_SRAM_LOAD, "Skipping SRAM load.") MSG_HASH(MSG_SLOW_MOTION, "Slow motion.") +MSG_HASH(MSG_FAST_FORWARD, + "Fast forward.") MSG_HASH(MSG_SLOW_MOTION_REWIND, "Slow motion rewind.") MSG_HASH(MSG_SRAM_WILL_NOT_BE_SAVED, @@ -2495,9 +2507,9 @@ MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_SMOOTH, MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_FILTER, "Apply a CPU-powered video filter. NOTE: Might come at a high performance cost. Some video filters might only work for cores that use 32bit or 16bit color.") MSG_HASH(MENU_ENUM_SUBLABEL_CHEEVOS_USERNAME, - "Input the username of your Retro Achievements account.") + "Input the username of your RetroAchievements account.") MSG_HASH(MENU_ENUM_SUBLABEL_CHEEVOS_PASSWORD, - "Input the password of your Retro Achievements account.") + "Input the password of your RetroAchievements account.") MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_NICKNAME, "Input your user name here. This will be used for netplay sessions, among other things.") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_POST_FILTER_RECORD, @@ -2818,6 +2830,8 @@ MSG_HASH(MENU_ENUM_SUBLABEL_INFORMATION, "View more information about the content.") MSG_HASH(MENU_ENUM_SUBLABEL_ADD_TO_FAVORITES, "Add the entry to your favorites.") +MSG_HASH(MENU_ENUM_SUBLABEL_ADD_TO_FAVORITES_PLAYLIST, + "Add the entry to your favorites.") MSG_HASH(MENU_ENUM_SUBLABEL_RUN, "Start the content.") MSG_HASH(MENU_ENUM_SUBLABEL_MENU_FILE_BROWSER_SETTINGS, @@ -2860,7 +2874,7 @@ MSG_HASH(MENU_ENUM_SUBLABEL_UNDO_SAVE_STATE, "If a state was overwritten, it will roll back to the previous save state.") MSG_HASH( MENU_ENUM_SUBLABEL_ACCOUNTS_RETRO_ACHIEVEMENTS, - "Retro Achievements service. For more information, visit http://retroachievements.org" + "RetroAchievements service. For more information, visit http://retroachievements.org" ) MSG_HASH( MENU_ENUM_SUBLABEL_ACCOUNTS_LIST, @@ -3228,15 +3242,15 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_INFORMATION, MSG_HASH(MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_INFORMATION, "Show/hide the 'Information' option.") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_BGCOLOR_ENABLE, - "Onscreen Notification Background Enable") + "Notification Background Enable") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_BGCOLOR_RED, - "Onscreen Notification Background Red Color") + "Notification Background Red Color") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_BGCOLOR_GREEN, - "Onscreen Notification Background Green Color") + "Notification Background Green Color") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_BGCOLOR_BLUE, - "Onscreen Notification Background Blue Color") + "Notification Background Blue Color") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_BGCOLOR_OPACITY, - "Onscreen Notification Background Opacity") + "Notification Background Opacity") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_DISABLE_KIOSK_MODE, "Disable Kiosk Mode") MSG_HASH(MENU_ENUM_SUBLABEL_MENU_DISABLE_KIOSK_MODE, @@ -3256,10 +3270,16 @@ MSG_HASH(MSG_INPUT_KIOSK_MODE_PASSWORD_OK, MSG_HASH(MSG_INPUT_KIOSK_MODE_PASSWORD_NOK, "Password incorrect.") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_COLOR_RED, - "Onscreen Notification Red Color") + "Notification Red Color") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_COLOR_GREEN, - "Onscreen Notification Green Color") + "Notification Green Color") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_COLOR_BLUE, - "Onscreen Notification Blue Color") + "Notification Blue Color") MSG_HASH(MENU_ENUM_LABEL_VALUE_FRAMECOUNT_SHOW, "Show frame count on FPS display") +MSG_HASH(MSG_CONFIG_OVERRIDE_LOADED, + "Configuration override loaded.") +MSG_HASH(MSG_GAME_REMAP_FILE_LOADED, + "Game remap file loaded.") +MSG_HASH(MSG_CORE_REMAP_FILE_LOADED, + "Core remap file loaded.") diff --git a/intl/msg_hash_vn.h b/intl/msg_hash_vn.h index 08c362344d..ca95e43315 100644 --- a/intl/msg_hash_vn.h +++ b/intl/msg_hash_vn.h @@ -1689,6 +1689,8 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_PIXEL, "Pixel") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_RETROACTIVE, "RetroActive") +MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_RETROSYSTEM, + "Retrosystem") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_DOTART, "Dot-Art") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME, @@ -2181,6 +2183,8 @@ MSG_HASH(MSG_SKIPPING_SRAM_LOAD, "Skipping SRAM load.") MSG_HASH(MSG_SLOW_MOTION, "Slow motion.") +MSG_HASH(MSG_FAST_FORWARD, + "Nhanh về phía trước.") MSG_HASH(MSG_SLOW_MOTION_REWIND, "Slow motion rewind.") MSG_HASH(MSG_SRAM_WILL_NOT_BE_SAVED, diff --git a/libretro-common/audio/audio_mixer.c b/libretro-common/audio/audio_mixer.c index f9a1a226bc..e6bc09eff2 100644 --- a/libretro-common/audio/audio_mixer.c +++ b/libretro-common/audio/audio_mixer.c @@ -44,11 +44,11 @@ #define STB_VORBIS_NO_STDIO #define STB_VORBIS_NO_CRT -#include "../../deps/stb/stb_vorbis.h" +#include #endif #ifdef HAVE_IBXM -#include "../../deps/ibxm/ibxm.h" +#include #endif #define AUDIO_MIXER_MAX_VOICES 8 diff --git a/libretro-common/encodings/encoding_utf.c b/libretro-common/encodings/encoding_utf.c index a840601f1f..2148fcb470 100644 --- a/libretro-common/encodings/encoding_utf.c +++ b/libretro-common/encodings/encoding_utf.c @@ -164,13 +164,13 @@ size_t utf8cpy(char *d, size_t d_len, const char *s, size_t chars) while (*sb && chars-- > 0) { sb++; - while ((*sb&0xC0) == 0x80) sb++; + while ((*sb & 0xC0) == 0x80) sb++; } if ((size_t)(sb - sb_org) > d_len-1 /* NUL */) { sb = sb_org + d_len-1; - while ((*sb&0xC0) == 0x80) sb--; + while ((*sb & 0xC0) == 0x80) sb--; } memcpy(d, sb_org, sb-sb_org); @@ -187,7 +187,7 @@ const char *utf8skip(const char *str, size_t chars) do { strb++; - while ((*strb&0xC0)==0x80) strb++; + while ((*strb & 0xC0)==0x80) strb++; chars--; } while(chars); return (const char*)strb; @@ -218,23 +218,22 @@ static INLINE uint8_t utf8_walkbyte(const char **string) uint32_t utf8_walk(const char **string) { uint8_t first = utf8_walkbyte(string); - uint32_t ret; + uint32_t ret = 0; - if (first<128) + if (first < 128) return first; - ret = 0; - ret = (ret<<6) | (utf8_walkbyte(string) & 0x3F); + ret = (ret << 6) | (utf8_walkbyte(string) & 0x3F); if (first >= 0xE0) - ret = (ret<<6) | (utf8_walkbyte(string) & 0x3F); + ret = (ret << 6) | (utf8_walkbyte(string) & 0x3F); if (first >= 0xF0) - ret = (ret<<6) | (utf8_walkbyte(string) & 0x3F); + ret = (ret << 6) | (utf8_walkbyte(string) & 0x3F); if (first >= 0xF0) - return ret | (first&7)<<18; + return ret | (first & 7) << 18; if (first >= 0xE0) - return ret | (first&15)<<12; - return ret | (first&31)<<6; + return ret | (first & 15) << 12; + return ret | (first & 31) << 6; } static bool utf16_to_char(uint8_t **utf_data, @@ -273,15 +272,21 @@ bool utf16_to_char_string(const uint16_t *in, char *s, size_t len) } /* Returned pointer MUST be freed by the caller if non-NULL. */ -static char* mb_to_mb_string_alloc(const char *str, enum CodePage cp_in, enum CodePage cp_out) +static char* mb_to_mb_string_alloc(const char *str, + enum CodePage cp_in, enum CodePage cp_out) { - char *path_buf = NULL; + char *path_buf = NULL; wchar_t *path_buf_wide = NULL; - int path_buf_len = 0; - int path_buf_wide_len = 0; + int path_buf_len = 0; + int path_buf_wide_len = 0; if (!str || !*str) return NULL; + + (void)path_buf; + (void)path_buf_wide; + (void)path_buf_len; + (void)path_buf_wide_len; #if !defined(_WIN32) || defined(_XBOX) /* assume string needs no modification if not on Windows */ @@ -296,45 +301,49 @@ static char* mb_to_mb_string_alloc(const char *str, enum CodePage cp_in, enum Co if (path_buf_wide_len) { - path_buf_wide = (wchar_t*)calloc(path_buf_wide_len + sizeof(wchar_t), sizeof(wchar_t)); + path_buf_wide = (wchar_t*) + calloc(path_buf_wide_len + sizeof(wchar_t), sizeof(wchar_t)); if (path_buf_wide) { - MultiByteToWideChar(cp_in, 0, str, -1, path_buf_wide, path_buf_wide_len); + MultiByteToWideChar(cp_in, 0, + str, -1, path_buf_wide, path_buf_wide_len); if (*path_buf_wide) { - path_buf_len = WideCharToMultiByte(cp_out, 0, path_buf_wide, -1, NULL, 0, NULL, NULL); + path_buf_len = WideCharToMultiByte(cp_out, 0, + path_buf_wide, -1, NULL, 0, NULL, NULL); if (path_buf_len) { - path_buf = (char*)calloc(path_buf_len + sizeof(char), sizeof(char)); + path_buf = (char*) + calloc(path_buf_len + sizeof(char), sizeof(char)); if (path_buf) { - WideCharToMultiByte(cp_out, 0, path_buf_wide, -1, path_buf, path_buf_len, NULL, NULL); + WideCharToMultiByte(cp_out, 0, + path_buf_wide, -1, path_buf, + path_buf_len, NULL, NULL); free(path_buf_wide); if (*path_buf) return path_buf; - else - { - free(path_buf); - return NULL; - } + + free(path_buf); + return NULL; } } } } } -#endif -#endif if (path_buf_wide) free(path_buf_wide); return NULL; +#endif +#endif } /* Returned pointer MUST be freed by the caller if non-NULL. */ diff --git a/libretro-common/file/archive_file_7z.c b/libretro-common/file/archive_file_7z.c index 7bfb677fcb..502e873c94 100644 --- a/libretro-common/file/archive_file_7z.c +++ b/libretro-common/file/archive_file_7z.c @@ -32,9 +32,9 @@ #include #include #include -#include "../../deps/7zip/7z.h" -#include "../../deps/7zip/7zCrc.h" -#include "../../deps/7zip/7zFile.h" +#include <7zip/7z.h> +#include <7zip/7zCrc.h> +#include <7zip/7zFile.h> #define SEVENZIP_MAGIC "7z\xBC\xAF\x27\x1C" #define SEVENZIP_MAGIC_LEN 6 diff --git a/libretro-common/file/config_file.c b/libretro-common/file/config_file.c index 70abc957ba..87f72238fb 100644 --- a/libretro-common/file/config_file.c +++ b/libretro-common/file/config_file.c @@ -44,6 +44,7 @@ #include #include #include +#include #define MAX_INCLUDE_DEPTH 16 @@ -78,13 +79,13 @@ struct config_file static config_file_t *config_file_new_internal( const char *path, unsigned depth); -static char *getaline(FILE *file) +static char *getaline(RFILE *file) { char* newline = (char*)malloc(9); char* newline_tmp = NULL; size_t cur_size = 8; size_t idx = 0; - int in = getc(file); + int in = filestream_getc(file); if (!newline) return NULL; @@ -106,10 +107,10 @@ static char *getaline(FILE *file) } newline[idx++] = in; - in = getc(file); + in = filestream_getc(file); } newline[idx] = '\0'; - return newline; + return newline; } static char *strip_comment(char *str) @@ -176,15 +177,15 @@ static char *extract_value(char *line, bool is_value) { line++; tok = strtok_r(line, "\"", &save); - if (!tok) - return NULL; - return strdup(tok); + goto end; } else if (*line == '\0') /* Nothing */ return NULL; /* We don't have that. Read until next space. */ tok = strtok_r(line, " \n\t\f\r\v", &save); + +end: if (tok) return strdup(tok); return NULL; @@ -366,7 +367,7 @@ error: static config_file_t *config_file_new_internal( const char *path, unsigned depth) { - FILE *file = NULL; + RFILE *file = NULL; struct config_file *conf = (struct config_file*)malloc(sizeof(*conf)); if (!conf) return NULL; @@ -388,16 +389,15 @@ static config_file_t *config_file_new_internal( goto error; conf->include_depth = depth; - file = fopen(path, "r"); + file = filestream_open(path, RFILE_MODE_READ_TEXT, 0x4000); if (!file) { free(conf->path); goto error; } - setvbuf(file, NULL, _IOFBF, 0x4000); - while (!feof(file)) + while (!filestream_eof(file)) { char *line = NULL; struct config_entry_list *list = (struct config_entry_list*)malloc(sizeof(*list)); @@ -405,7 +405,7 @@ static config_file_t *config_file_new_internal( if (!list) { config_file_free(conf); - fclose(file); + filestream_close(file); return NULL; } @@ -439,7 +439,7 @@ static config_file_t *config_file_new_internal( free(list); } - fclose(file); + filestream_close(file); return conf; @@ -480,7 +480,7 @@ void config_file_free(config_file_t *conf) { struct config_include_list *hold = NULL; free(inc_tmp->path); - hold = (struct config_include_list*)inc_tmp; + hold = (struct config_include_list*)inc_tmp; inc_tmp = inc_tmp->next; free(hold); } @@ -574,7 +574,6 @@ config_file_t *config_file_new(const char *path) return config_file_new_internal(path, 0); } - static struct config_entry_list *config_get_entry(const config_file_t *conf, const char *key, struct config_entry_list **prev) { @@ -605,9 +604,12 @@ bool config_get_double(config_file_t *conf, const char *key, double *in) const struct config_entry_list *entry = config_get_entry(conf, key, NULL); if (entry) + { *in = strtod(entry->value, NULL); + return true; + } - return entry != NULL; + return false; } bool config_get_float(config_file_t *conf, const char *key, float *in) @@ -618,9 +620,9 @@ bool config_get_float(config_file_t *conf, const char *key, float *in) { /* strtof() is C99/POSIX. Just use the more portable kind. */ *in = (float)strtod(entry->value, NULL); + return true; } - - return entry != NULL; + return false; } bool config_get_int(config_file_t *conf, const char *key, int *in) @@ -633,10 +635,13 @@ bool config_get_int(config_file_t *conf, const char *key, int *in) int val = (int)strtol(entry->value, NULL, 0); if (errno == 0) + { *in = val; + return true; + } } - return entry != NULL && errno == 0; + return false; } #if defined(__STDC_VERSION__) && __STDC_VERSION__>=199901L @@ -650,10 +655,12 @@ bool config_get_uint64(config_file_t *conf, const char *key, uint64_t *in) uint64_t val = strtoull(entry->value, NULL, 0); if (errno == 0) + { *in = val; + return true; + } } - - return entry != NULL && errno == 0; + return false; } #endif @@ -667,10 +674,13 @@ bool config_get_uint(config_file_t *conf, const char *key, unsigned *in) unsigned val = (unsigned)strtoul(entry->value, NULL, 0); if (errno == 0) + { *in = val; + return true; + } } - return entry != NULL && errno == 0; + return false; } bool config_get_hex(config_file_t *conf, const char *key, unsigned *in) @@ -683,10 +693,13 @@ bool config_get_hex(config_file_t *conf, const char *key, unsigned *in) unsigned val = (unsigned)strtoul(entry->value, NULL, 16); if (errno == 0) + { *in = val; + return true; + } } - return entry != NULL && errno == 0; + return false; } bool config_get_char(config_file_t *conf, const char *key, char *in) @@ -699,9 +712,10 @@ bool config_get_char(config_file_t *conf, const char *key, char *in) return false; *in = *entry->value; + return true; } - return entry != NULL; + return false; } bool config_get_string(config_file_t *conf, const char *key, char **str) @@ -709,9 +723,11 @@ bool config_get_string(config_file_t *conf, const char *key, char **str) const struct config_entry_list *entry = config_get_entry(conf, key, NULL); if (entry) + { *str = strdup(entry->value); - - return entry != NULL; + return true; + } + return false; } bool config_get_config_path(config_file_t *conf, char *s, size_t len) @@ -729,23 +745,25 @@ bool config_get_array(config_file_t *conf, const char *key, if (entry) return strlcpy(buf, entry->value, size) < size; - - return entry != NULL; + return false; } bool config_get_path(config_file_t *conf, const char *key, char *buf, size_t size) { #if defined(RARCH_CONSOLE) - return config_get_array(conf, key, buf, size); + if (config_get_array(conf, key, buf, size)) + return true; #else const struct config_entry_list *entry = config_get_entry(conf, key, NULL); if (entry) + { fill_pathname_expand_special(buf, entry->value, size); - - return entry != NULL; + return true; + } #endif + return false; } bool config_get_bool(config_file_t *conf, const char *key, bool *in) @@ -894,27 +912,20 @@ 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; + RFILE *file = NULL; if (!string_is_empty(path)) { - file = fopen(path, "w"); + file = filestream_open(path, RFILE_MODE_WRITE, 0x4000); if (!file) return false; -#ifdef WIIU - /* TODO: use FBF everywhere once https://i.imgur.com/muVhNeF.jpg is fixed */ - setvbuf(file, NULL, _IONBF, 0x4000); -#else - setvbuf(file, NULL, _IOFBF, 0x4000); -#endif + config_file_dump(conf, filestream_get_fp(file)); } else - file = stdout; + config_file_dump(conf, stdout); - config_file_dump(conf, file); - - if (path) - fclose(file); + if (file) + filestream_close(file); return true; } diff --git a/libretro-common/file/file_path.c b/libretro-common/file/file_path.c index 97945e9ebc..8acd372e08 100644 --- a/libretro-common/file/file_path.c +++ b/libretro-common/file/file_path.c @@ -30,6 +30,7 @@ #include #include +#include #ifndef __MACH__ #include @@ -401,17 +402,17 @@ bool path_is_compressed_file(const char* path) */ bool path_file_exists(const char *path) { - FILE *dummy; + RFILE *dummy; if (!path || !*path) return false; - dummy = fopen(path, "rb"); + dummy = filestream_open(path, RFILE_MODE_READ, -1); if (!dummy) return false; - fclose(dummy); + filestream_close(dummy); return true; } @@ -920,7 +921,7 @@ void fill_short_pathname_representation_noext(char* out_rep, path_remove_extension(out_rep); } -int path_file_remove(const char *path) +bool path_file_remove(const char *path) { char *path_local = NULL; wchar_t *path_wide = NULL; @@ -937,25 +938,89 @@ int path_file_remove(const char *path) if (path_local) { - bool ret = remove(path_local); + int ret = remove(path_local); free(path_local); - return ret; + if (ret == 0) + return true; } #else path_wide = utf8_to_utf16_string_alloc(path); if (path_wide) { - bool ret = _wremove(path_wide); + int ret = _wremove(path_wide); free(path_wide); - return ret; + if (ret == 0) + return true; } #endif #else - return remove(path); + if (remove(path) == 0) + return true; #endif - - return -1; + return false; +} + +bool path_file_rename(const char *old_path, const char *new_path) +{ + char *old_path_local = NULL; + char *new_path_local = NULL; + wchar_t *old_path_wide = NULL; + wchar_t *new_path_wide = NULL; + + if (!old_path || !*old_path || !new_path || !*new_path) + return false; + + (void)old_path_local; + (void)new_path_local; + (void)old_path_wide; + (void)new_path_wide; + +#if defined(_WIN32) && !defined(_XBOX) +#if defined(_MSC_VER) && _MSC_VER < 1400 + old_path_local = utf8_to_local_string_alloc(old_path); + new_path_local = utf8_to_local_string_alloc(new_path); + + if (old_path_local) + { + if (new_path_local) + { + int ret = rename(old_path_local, new_path_local); + free(old_path_local); + free(new_path_local); + return ret; + } + + free(old_path_local); + } + + if (new_path_local) + free(new_path_local); +#else + old_path_wide = utf8_to_utf16_string_alloc(old_path); + new_path_wide = utf8_to_utf16_string_alloc(new_path); + + if (old_path_wide) + { + if (new_path_wide) + { + int ret = _wrename(old_path_wide, new_path_wide); + free(old_path_wide); + free(new_path_wide); + return ret; + } + + free(old_path_wide); + } + + if (new_path_wide) + free(new_path_wide); +#endif +#else + if (rename(old_path, new_path) == 0) + return true; +#endif + return false; } diff --git a/libretro-common/formats/libchdr/chd.c b/libretro-common/formats/libchdr/chd.c index bdce2ebf57..507f8af806 100644 --- a/libretro-common/formats/libchdr/chd.c +++ b/libretro-common/formats/libchdr/chd.c @@ -398,7 +398,7 @@ void lzma_allocator_free(void* p ) void *lzma_fast_alloc(void *p, size_t size) { int scan; - uint32_t *addr; + uint32_t *addr = NULL; lzma_allocator *codec = (lzma_allocator *)(p); /* compute the size, rounding to the nearest 1k */ diff --git a/libretro-common/gfx/gl_capabilities.c b/libretro-common/gfx/gl_capabilities.c index 0cc8eda592..221aa2a0b7 100644 --- a/libretro-common/gfx/gl_capabilities.c +++ b/libretro-common/gfx/gl_capabilities.c @@ -173,8 +173,9 @@ bool gl_check_capability(enum gl_capability_enum enum_idx) case GL_CAPS_FBO: #if defined(HAVE_PSGL) || defined(HAVE_OPENGLES2) || defined(HAVE_OPENGLES3) || defined(HAVE_OPENGLES_3_1) || defined(HAVE_OPENGLES_3_2) return true; -#elif defined(HAVE_FBO) - if (!gl_query_core_context_in_use() && !gl_query_extension("ARB_framebuffer_object") +#else + if ( !gl_query_core_context_in_use() + && !gl_query_extension("ARB_framebuffer_object") && !gl_query_extension("EXT_framebuffer_object")) return false; @@ -190,8 +191,6 @@ bool gl_check_capability(enum gl_capability_enum enum_idx) && glDeleteRenderbuffers) return true; break; -#else - break; #endif case GL_CAPS_ARGB8: #ifdef HAVE_OPENGLES @@ -280,21 +279,25 @@ bool gl_check_capability(enum gl_capability_enum enum_idx) #if defined(HAVE_OPENGLES) if (major >= 3 || gl_query_extension("EXT_sRGB")) return true; -#elif defined(HAVE_FBO) - if (gl_query_core_context_in_use() || - (gl_query_extension("EXT_texture_sRGB") - && gl_query_extension("ARB_framebuffer_sRGB"))) - return true; #endif + if (gl_check_capability(GL_CAPS_FBO)) + { + if ( gl_query_core_context_in_use() || + (gl_query_extension("EXT_texture_sRGB") + && gl_query_extension("ARB_framebuffer_sRGB")) + ) + return true; + } break; case GL_CAPS_FP_FBO: /* GLES - No extensions for float FBO currently. */ #ifndef HAVE_OPENGLES -#ifdef HAVE_FBO - /* Float FBO is core in 3.2. */ - if (gl_query_core_context_in_use() || gl_query_extension("ARB_texture_float")) - return true; -#endif + if (gl_check_capability(GL_CAPS_FBO)) + { + /* Float FBO is core in 3.2. */ + if (gl_query_core_context_in_use() || gl_query_extension("ARB_texture_float")) + return true; + } #endif break; case GL_CAPS_BGRA8888: diff --git a/libretro-common/include/file/file_path.h b/libretro-common/include/file/file_path.h index 04da118ac0..7e59d8d362 100644 --- a/libretro-common/include/file/file_path.h +++ b/libretro-common/include/file/file_path.h @@ -466,7 +466,9 @@ bool path_is_valid(const char *path); int32_t path_get_size(const char *path); -int path_file_remove(const char *path); +bool path_file_remove(const char *path); + +bool path_file_rename(const char *old_path, const char *new_path); RETRO_END_DECLS diff --git a/libretro-common/include/libretro.h b/libretro-common/include/libretro.h index 74820e7a3c..27b61b70b7 100644 --- a/libretro-common/include/libretro.h +++ b/libretro-common/include/libretro.h @@ -131,11 +131,12 @@ extern "C" { #define RETRO_DEVICE_LIGHTGUN 4 /* The ANALOG device is an extension to JOYPAD (RetroPad). - * Similar to DualShock it adds two analog sticks. - * This is treated as a separate device type as it returns values in the - * full analog range of [-0x8000, 0x7fff]. Positive X axis is right. - * Positive Y axis is down. - * Only use ANALOG type when polling for analog values of the axes. + * Similar to DualShock2 it adds two analog sticks and all buttons can + * be analog. This is treated as a separate device type as it returns + * axis values in the full analog range of [-0x8000, 0x7fff]. + * Positive X axis is right. Positive Y axis is down. + * Buttons are returned in the range [0, 0x7fff]. + * Only use ANALOG type when polling for analog values. */ #define RETRO_DEVICE_ANALOG 5 @@ -174,7 +175,8 @@ extern "C" { /* Buttons for the RetroPad (JOYPAD). * The placement of these is equivalent to placements on the * Super Nintendo controller. - * L2/R2/L3/R3 buttons correspond to the PS1 DualShock. */ + * L2/R2/L3/R3 buttons correspond to the PS1 DualShock. + * Also used as id values for RETRO_DEVICE_INDEX_ANALOG_BUTTON */ #define RETRO_DEVICE_ID_JOYPAD_B 0 #define RETRO_DEVICE_ID_JOYPAD_Y 1 #define RETRO_DEVICE_ID_JOYPAD_SELECT 2 @@ -193,10 +195,11 @@ extern "C" { #define RETRO_DEVICE_ID_JOYPAD_R3 15 /* Index / Id values for ANALOG device. */ -#define RETRO_DEVICE_INDEX_ANALOG_LEFT 0 -#define RETRO_DEVICE_INDEX_ANALOG_RIGHT 1 -#define RETRO_DEVICE_ID_ANALOG_X 0 -#define RETRO_DEVICE_ID_ANALOG_Y 1 +#define RETRO_DEVICE_INDEX_ANALOG_LEFT 0 +#define RETRO_DEVICE_INDEX_ANALOG_RIGHT 1 +#define RETRO_DEVICE_INDEX_ANALOG_BUTTON 2 +#define RETRO_DEVICE_ID_ANALOG_X 0 +#define RETRO_DEVICE_ID_ANALOG_Y 1 /* Id values for MOUSE. */ #define RETRO_DEVICE_ID_MOUSE_X 0 @@ -208,6 +211,8 @@ extern "C" { #define RETRO_DEVICE_ID_MOUSE_MIDDLE 6 #define RETRO_DEVICE_ID_MOUSE_HORIZ_WHEELUP 7 #define RETRO_DEVICE_ID_MOUSE_HORIZ_WHEELDOWN 8 +#define RETRO_DEVICE_ID_MOUSE_BUTTON_4 9 +#define RETRO_DEVICE_ID_MOUSE_BUTTON_5 10 /* Id values for LIGHTGUN types. */ #define RETRO_DEVICE_ID_LIGHTGUN_X 0 diff --git a/libretro-common/include/streams/file_stream.h b/libretro-common/include/streams/file_stream.h index 2226fc3d58..e6d6bbca1c 100644 --- a/libretro-common/include/streams/file_stream.h +++ b/libretro-common/include/streams/file_stream.h @@ -23,6 +23,7 @@ #ifndef __LIBRETRO_SDK_FILE_STREAM_H #define __LIBRETRO_SDK_FILE_STREAM_H +#include #include #include @@ -44,7 +45,7 @@ enum RFILE_MODE_WRITE, RFILE_MODE_READ_WRITE, - /* There is no garantee these requests will be attended. */ + /* There is no guarantee these requests will be attended. */ RFILE_HINT_UNBUFFERED = 1<<8, RFILE_HINT_MMAP = 1<<9 /* requires RFILE_MODE_READ */ }; @@ -55,7 +56,17 @@ void filestream_set_size(RFILE *stream); const char *filestream_get_ext(RFILE *stream); -RFILE *filestream_open(const char *path, unsigned mode, ssize_t len); +/** + * filestream_open: + * @path : path to file + * @mode : file mode to use when opening (read/write) + * @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); ssize_t filestream_seek(RFILE *stream, ssize_t offset, int whence); @@ -91,6 +102,8 @@ int filestream_error(RFILE *stream); int filestream_get_fd(RFILE *stream); +FILE* filestream_get_fp(RFILE *stream); + int filestream_flush(RFILE *stream); RETRO_END_DECLS diff --git a/libretro-common/streams/file_stream.c b/libretro-common/streams/file_stream.c index 6962557046..ff077b7c56 100644 --- a/libretro-common/streams/file_stream.c +++ b/libretro-common/streams/file_stream.c @@ -81,6 +81,7 @@ struct RFILE unsigned hints; char *ext; int64_t size; + FILE *fp; #if defined(PSP) SceUID fd; #else @@ -99,9 +100,6 @@ struct RFILE #define MODE_STR_WRITE_PLUS L"w+" #endif -#if defined(HAVE_BUFFERED_IO) - FILE *fp; -#endif #if defined(HAVE_MMAP) uint8_t *mapped; uint64_t mappos; @@ -109,8 +107,16 @@ struct RFILE #endif int fd; #endif + char *buf; }; +FILE* filestream_get_fp(RFILE *stream) +{ + if (!stream) + return NULL; + return stream->fp; +} + int filestream_get_fd(RFILE *stream) { if (!stream) @@ -149,7 +155,17 @@ void filestream_set_size(RFILE *stream) filestream_seek(stream, 0, SEEK_SET); } -RFILE *filestream_open(const char *path, unsigned mode, ssize_t len) +/** + * filestream_open: + * @path : path to file + * @mode : file mode to use when opening (read/write) + * @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) { int flags = 0; int mode_int = 0; @@ -249,6 +265,9 @@ RFILE *filestream_open(const char *path, unsigned mode, ssize_t len) #if defined(PSP) stream->fd = sceIoOpen(path, flags, mode_int); + + if (stream->fd == -1) + goto error; #else #if defined(HAVE_BUFFERED_IO) if ((stream->hints & RFILE_HINT_UNBUFFERED) == 0 && mode_str) @@ -270,13 +289,28 @@ RFILE *filestream_open(const char *path, unsigned mode, ssize_t len) #else stream->fp = fopen(path, mode_str); #endif + 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); + } } else #endif { - /* FIXME: HAVE_BUFFERED_IO is always 1, but if it is ever changed, open() needs to be changed to _wopen() for WIndows. */ #if defined(_WIN32) && !defined(_XBOX) #if defined(LEGACY_WIN32) (void)path_wide; @@ -292,8 +326,10 @@ RFILE *filestream_open(const char *path, unsigned mode, ssize_t len) free(path_wide); #endif #else + /* FIXME: HAVE_BUFFERED_IO is always 1, but if it is ever changed, this open() needs to have an alternate _wopen() for Windows. */ stream->fd = open(path, flags, mode_int); #endif + if (stream->fd == -1) goto error; #ifdef HAVE_MMAP @@ -318,14 +354,10 @@ RFILE *filestream_open(const char *path, unsigned mode, ssize_t len) } #endif -#if defined(PSP) - if (stream->fd == -1) - goto error; -#endif - { const char *ld = (const char*)strrchr(path, '.'); - stream->ext = strdup(ld ? ld + 1 : ""); + if (ld) + stream->ext = strdup(ld + 1); } filestream_set_size(stream); @@ -369,7 +401,7 @@ char *filestream_getline(RFILE *stream) } newline[idx] = '\0'; - return newline; + return newline; } char *filestream_gets(RFILE *stream, char *s, size_t len) @@ -420,7 +452,7 @@ ssize_t filestream_seek(RFILE *stream, ssize_t offset, int whence) #endif #ifdef HAVE_MMAP - /* Need to check stream->mapped because this function is + /* Need to check stream->mapped because this function is * called in filestream_open() */ if (stream->mapped && stream->hints & RFILE_HINT_MMAP) { @@ -467,14 +499,26 @@ error: int filestream_eof(RFILE *stream) { + return feof(stream->fp); + + /* TODO: FIXME: I can't figure out why this breaks on Windows. + The while loop in config_file_new_internal just never exits. + The current position seems to jump backwards a few lines, + but it doesn't start until somewhere in the middle of the file. + */ + /* size_t current_position = filestream_tell(stream); - size_t end_position = filestream_seek(stream, 0, SEEK_END); + size_t end_position; + + filestream_seek(stream, 0, SEEK_END); + end_position = filestream_tell(stream); filestream_seek(stream, current_position, SEEK_SET); if (current_position >= end_position) return 1; return 0; + */ } ssize_t filestream_tell(RFILE *stream) @@ -490,7 +534,7 @@ ssize_t filestream_tell(RFILE *stream) return ftell(stream->fp); #endif #ifdef HAVE_MMAP - /* Need to check stream->mapped because this function + /* Need to check stream->mapped because this function * is called in filestream_open() */ if (stream->mapped && stream->hints & RFILE_HINT_MMAP) return stream->mappos; @@ -648,6 +692,8 @@ int filestream_close(RFILE *stream) if (stream->fd > 0) close(stream->fd); #endif + if (stream->buf) + free(stream->buf); free(stream); return 0; diff --git a/libretro-common/streams/interface_stream.c b/libretro-common/streams/interface_stream.c index a2fe9ac8b3..fcd1edf8cc 100644 --- a/libretro-common/streams/interface_stream.c +++ b/libretro-common/streams/interface_stream.c @@ -105,10 +105,10 @@ bool intfstream_open(intfstream_internal_t *intf, const char *path, intf->chd.fp = chdstream_open(path, intf->chd.track); if (!intf->chd.fp) return false; + break; #else return false; #endif - break; } return true; diff --git a/libretro-db/README.md b/libretro-db/README.md index 29e9a11d92..463bc9145e 100644 --- a/libretro-db/README.md +++ b/libretro-db/README.md @@ -66,6 +66,11 @@ Usecase: Search for all games released on October 1995. `libretrodb_tool find "{'releasemonth':10,'releaseyear':1995}"` +3) Names only search +Usecase: Search for all games released on October 1995, wont print checksums, filename or rom size, only the game name. + +`libretrodb_tool get-names "{'releasemonth':10,'releaseyear':1995}"` + # Compiling the Database Use [libretro-super](https://github.com/libretro/libretro-super) to compile the entire database: diff --git a/libretro-db/libretrodb_tool.c b/libretro-db/libretrodb_tool.c index b7e05524b6..7e3a09c8af 100644 --- a/libretro-db/libretrodb_tool.c +++ b/libretro-db/libretrodb_tool.c @@ -44,6 +44,7 @@ int main(int argc, char ** argv) printf("\tlist\n"); printf("\tcreate-index \n"); printf("\tfind \n"); + printf("\tget-names \n"); return 1; } @@ -113,6 +114,48 @@ int main(int argc, char ** argv) rmsgpack_dom_value_free(&item); } } + else if (memcmp(command, "get-names", 9) == 0) + { + if (argc != 4) + { + printf("Usage: %s find-name \n", argv[0]); + goto error; + } + + query_exp = argv[3]; + error = NULL; + q = libretrodb_query_compile(db, query_exp, strlen(query_exp), &error); + + if (error) + { + printf("%s\n", error); + goto error; + } + + if ((rv = libretrodb_cursor_open(db, cur, q)) != 0) + { + printf("Could not open cursor: %s\n", strerror(-rv)); + goto error; + } + + while (libretrodb_cursor_read_item(cur, &item) == 0) + { + if (item.type == RDT_MAP) //should always be true, but if false the program would segfault + { + unsigned i; + for (i = 0; i < item.val.map.len; i++) + { + if (item.val.map.items[i].key.type == RDT_STRING && (strncmp(item.val.map.items[i].key.val.string.buff, "name", item.val.map.items[i].key.val.string.len) == 0)) + { + rmsgpack_dom_value_print(&item.val.map.items[i].value); + printf("\n"); + } + } + } + + rmsgpack_dom_value_free(&item); + } + } else if (memcmp(command, "create-index", 12) == 0) { const char * index_name, * field_name; @@ -134,6 +177,7 @@ int main(int argc, char ** argv) goto error; } + libretrodb_cursor_close(cur); libretrodb_close(db); error: @@ -141,5 +185,7 @@ error: libretrodb_free(db); if (cur) libretrodb_cursor_free(cur); + if (q) + libretrodb_query_free(q); return 1; } diff --git a/libretro-db/rmsgpack_test.c b/libretro-db/rmsgpack_test.c index 2e7f7d0d3a..1c6f03cb57 100644 --- a/libretro-db/rmsgpack_test.c +++ b/libretro-db/rmsgpack_test.c @@ -186,7 +186,7 @@ static struct rmsgpack_read_callbacks stub_callbacks = { int main(void) { struct stub_state state; - RFILE *fd = filestream_open("test.msgpack", RFILE_MODE_READ, 0); + RFILE *fd = filestream_open("test.msgpack", RFILE_MODE_READ, -1); state.i = 0; state.stack[0] = 0; diff --git a/managers/cheat_manager.c b/managers/cheat_manager.c index 1cd839ad10..888175171a 100644 --- a/managers/cheat_manager.c +++ b/managers/cheat_manager.c @@ -97,7 +97,8 @@ void cheat_manager_apply_cheats(void) cheat_info.enabled = true; cheat_info.code = handle->cheats[i].code; - core_set_cheat(&cheat_info); + if (!string_is_empty(cheat_info.code)) + core_set_cheat(&cheat_info); } } runloop_msg_queue_push(msg_hash_to_str(MSG_APPLYING_CHEAT), 1, 180, true); diff --git a/menu/cbs/menu_cbs_get_value.c b/menu/cbs/menu_cbs_get_value.c index 4760206b17..183dfe2305 100644 --- a/menu/cbs/menu_cbs_get_value.c +++ b/menu/cbs/menu_cbs_get_value.c @@ -741,6 +741,10 @@ static void menu_action_setting_disp_set_label_xmb_theme( strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_RETROACTIVE), len); break; + case XMB_ICON_THEME_RETROSYSTEM: + strlcpy(s, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_RETROSYSTEM), len); + break; case XMB_ICON_THEME_PIXEL: strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_PIXEL), len); diff --git a/menu/cbs/menu_cbs_ok.c b/menu/cbs/menu_cbs_ok.c index e1c8496eea..145bcf013c 100644 --- a/menu/cbs/menu_cbs_ok.c +++ b/menu/cbs/menu_cbs_ok.c @@ -3209,7 +3209,34 @@ default_action_ok_cmd_func(action_ok_restart_content, CMD_EVENT_RESET) default_action_ok_cmd_func(action_ok_screenshot, CMD_EVENT_TAKE_SCREENSHOT) default_action_ok_cmd_func(action_ok_disk_cycle_tray_status, CMD_EVENT_DISK_EJECT_TOGGLE ) default_action_ok_cmd_func(action_ok_shader_apply_changes, CMD_EVENT_SHADERS_APPLY_CHANGES ) -default_action_ok_cmd_func(action_ok_add_to_favorites, CMD_EVENT_ADD_TO_FAVORITES) + +static int action_ok_add_to_favorites(const char *path, + const char *label, unsigned type, size_t idx, size_t entry_idx) +{ + void *new_path = (void*)path_get(RARCH_PATH_CONTENT); + if (!command_event(CMD_EVENT_ADD_TO_FAVORITES, new_path)) + return menu_cbs_exit(); + return 0; +} + +static int action_ok_add_to_favorites_playlist(const char *path, + const char *label, unsigned type, size_t idx, size_t entry_idx) +{ + const char *tmp_path = NULL; + playlist_t *tmp_playlist = NULL; + + menu_driver_ctl(RARCH_MENU_CTL_PLAYLIST_GET, &tmp_playlist); + + if (!tmp_playlist) + return 0; + + playlist_get_index(tmp_playlist, + rpl_entry_selection_ptr, &tmp_path, NULL, NULL, NULL, NULL, NULL); + + if (!command_event(CMD_EVENT_ADD_TO_FAVORITES, (void*)tmp_path)) + return menu_cbs_exit(); + return 0; +} static int action_ok_rename_entry(const char *path, const char *label, unsigned type, size_t idx, size_t entry_idx) @@ -3708,8 +3735,8 @@ static void netplay_refresh_rooms_cb(void *task_data, void *user_data, const cha else { char s[PATH_MAX_LENGTH]; - int i = 0; - int k = 0; + unsigned i = 0; + unsigned j = 0; file_list_t *file_list = menu_entries_get_selection_buf_ptr(0); netplay_discovery_driver_ctl(RARCH_NETPLAY_DISCOVERY_CTL_LAN_GET_RESPONSES, &lan_hosts); @@ -3737,30 +3764,17 @@ static void netplay_refresh_rooms_cb(void *task_data, void *user_data, const cha { struct netplay_host *host = NULL; - for (host = &lan_hosts->hosts[k]; i < netplay_room_count + lan_room_count; i++) + for (i = netplay_room_count; i < netplay_room_count + lan_room_count; i++) { - struct sockaddr *address = NULL; + struct netplay_host *host = NULL; + host = &lan_hosts->hosts[j++]; + strlcpy(netplay_room_list[i].nickname, host->nick, sizeof(netplay_room_list[i].nickname)); - address = &host->addr; - - if (address->sa_family == AF_INET) - { - struct sockaddr_in *sin = (struct sockaddr_in *) address; - inet_ntop_compat(AF_INET, &sin->sin_addr, - netplay_room_list[i].address, INET6_ADDRSTRLEN); - } -#if defined(AF_INET6) && !defined(HAVE_SOCKET_LEGACY) - else if (address->sa_family == AF_INET6) - { - struct sockaddr_in6 *sin = (struct sockaddr_in6 *) address; - inet_ntop_compat(AF_INET6, &sin->sin6_addr, - netplay_room_list[i].address, INET6_ADDRSTRLEN); - } -#endif + strlcpy(netplay_room_list[i].address, host->address, INET6_ADDRSTRLEN); strlcpy(netplay_room_list[i].corename, host->core, @@ -3775,7 +3789,7 @@ static void netplay_refresh_rooms_cb(void *task_data, void *user_data, const cha host->content, sizeof(netplay_room_list[i].gamename)); - netplay_room_list[i].port = 55435; + netplay_room_list[i].port = host->port; netplay_room_list[i].gamecrc = host->content_crc; netplay_room_list[i].timestamp = 0; netplay_room_list[i].lan = true; @@ -4401,6 +4415,9 @@ static int menu_cbs_init_bind_ok_compare_label(menu_file_list_cbs_t *cbs, case MENU_ENUM_LABEL_RESUME_CONTENT: BIND_ACTION_OK(cbs, action_ok_resume_content); break; + case MENU_ENUM_LABEL_ADD_TO_FAVORITES_PLAYLIST: + BIND_ACTION_OK(cbs, action_ok_add_to_favorites_playlist); + break; case MENU_ENUM_LABEL_ADD_TO_FAVORITES: BIND_ACTION_OK(cbs, action_ok_add_to_favorites); break; diff --git a/menu/cbs/menu_cbs_select.c b/menu/cbs/menu_cbs_select.c index 70436fc105..84132b7a01 100644 --- a/menu/cbs/menu_cbs_select.c +++ b/menu/cbs/menu_cbs_select.c @@ -42,7 +42,9 @@ static int action_select_default(const char *path, const char *label, unsigned t menu_entry_init(&entry); menu_entry_get(&entry, 0, idx, NULL, false); - cbs = selection_buf ? (menu_file_list_cbs_t*)file_list_get_actiondata_at_offset(selection_buf, idx) : NULL; + if (selection_buf) + cbs = (menu_file_list_cbs_t*) + file_list_get_actiondata_at_offset(selection_buf, idx); if (!cbs) { @@ -76,7 +78,7 @@ static int action_select_default(const char *path, const char *label, unsigned t if (action == MENU_ACTION_NOOP) { if (cbs->action_ok) - action = MENU_ACTION_OK; + action = MENU_ACTION_OK; else { if (cbs->action_start) diff --git a/menu/cbs/menu_cbs_sublabel.c b/menu/cbs/menu_cbs_sublabel.c index 49994a53df..9b1013905a 100644 --- a/menu/cbs/menu_cbs_sublabel.c +++ b/menu/cbs/menu_cbs_sublabel.c @@ -62,6 +62,7 @@ default_sublabel_macro(action_bind_sublabel_information_list_list, MENU_ default_sublabel_macro(action_bind_sublabel_cheevos_enable, MENU_ENUM_SUBLABEL_CHEEVOS_ENABLE) default_sublabel_macro(action_bind_sublabel_cheevos_test_unofficial, MENU_ENUM_SUBLABEL_CHEEVOS_TEST_UNOFFICIAL) default_sublabel_macro(action_bind_sublabel_cheevos_hardcore_mode_enable, MENU_ENUM_SUBLABEL_CHEEVOS_HARDCORE_MODE_ENABLE) +default_sublabel_macro(action_bind_sublabel_cheevos_leaderboards_enable, MENU_ENUM_SUBLABEL_CHEEVOS_LEADERBOARDS_ENABLE) default_sublabel_macro(action_bind_sublabel_cheevos_verbose_enable, MENU_ENUM_SUBLABEL_CHEEVOS_VERBOSE_ENABLE) default_sublabel_macro(action_bind_sublabel_menu_views_settings_list, MENU_ENUM_SUBLABEL_MENU_VIEWS_SETTINGS) default_sublabel_macro(action_bind_sublabel_quick_menu_views_settings_list, MENU_ENUM_SUBLABEL_QUICK_MENU_VIEWS_SETTINGS) @@ -1262,6 +1263,9 @@ int menu_cbs_init_bind_sublabel(menu_file_list_cbs_t *cbs, case MENU_ENUM_LABEL_CHEEVOS_HARDCORE_MODE_ENABLE: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_cheevos_hardcore_mode_enable); break; + case MENU_ENUM_LABEL_CHEEVOS_LEADERBOARDS_ENABLE: + BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_cheevos_leaderboards_enable); + break; case MENU_ENUM_LABEL_CHEEVOS_VERBOSE_ENABLE: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_cheevos_verbose_enable); break; diff --git a/menu/drivers/materialui.c b/menu/drivers/materialui.c index dfb91e1b24..b55140c9fa 100644 --- a/menu/drivers/materialui.c +++ b/menu/drivers/materialui.c @@ -1502,10 +1502,12 @@ static void mui_frame(void *data, video_frame_info_t *video_info) sublabel_color ); - font_driver_flush(video_info->width, video_info->height, mui->font); + font_driver_flush(video_info->width, video_info->height, mui->font, + video_info); font_driver_bind_block(mui->font, NULL); - font_driver_flush(video_info->width, video_info->height, mui->font2); + font_driver_flush(video_info->width, video_info->height, mui->font2, + video_info); font_driver_bind_block(mui->font2, NULL); menu_animation_ctl(MENU_ANIMATION_CTL_SET_ACTIVE, NULL); diff --git a/menu/drivers/xmb.c b/menu/drivers/xmb.c index 3cdfc89025..c1d5dac42e 100755 --- a/menu/drivers/xmb.c +++ b/menu/drivers/xmb.c @@ -169,7 +169,10 @@ enum #ifdef HAVE_NETWORKING XMB_SYSTEM_TAB_NETPLAY, #endif - XMB_SYSTEM_TAB_ADD + XMB_SYSTEM_TAB_ADD, + + /* End of this enum - use the last one to determine num of possible tabs */ + XMB_SYSTEM_TAB_MAX_LENGTH }; typedef struct xmb_handle @@ -177,7 +180,7 @@ typedef struct xmb_handle bool mouse_show; uint8_t system_tab_end; - uint8_t tabs[8]; + uint8_t tabs[XMB_SYSTEM_TAB_MAX_LENGTH]; int depth; int old_depth; @@ -379,6 +382,8 @@ const char* xmb_theme_ident(void) return "flatui"; case XMB_ICON_THEME_RETROACTIVE: return "retroactive"; + case XMB_ICON_THEME_RETROSYSTEM: + return "retrosystem"; case XMB_ICON_THEME_PIXEL: return "pixel"; case XMB_ICON_THEME_NEOACTIVE: @@ -3127,10 +3132,12 @@ static void xmb_frame(void *data, video_frame_info_t *video_info) width, height); - font_driver_flush(video_info->width, video_info->height, xmb->font); + font_driver_flush(video_info->width, video_info->height, xmb->font, + video_info); font_driver_bind_block(xmb->font, NULL); - font_driver_flush(video_info->width, video_info->height, xmb->font2); + font_driver_flush(video_info->width, video_info->height, xmb->font2, + video_info); font_driver_bind_block(xmb->font2, NULL); if (menu_input_dialog_get_display_kb()) @@ -4027,10 +4034,7 @@ static void xmb_list_cache(void *data, enum menu_list_type type, unsigned action first = 0; } else - { - selection = 0; xmb->selection_ptr_old = 0; - } list_size = xmb_list_get_size(xmb, MENU_LIST_HORIZONTAL) + xmb->system_tab_end; diff --git a/menu/drivers/zarch.c b/menu/drivers/zarch.c index 5c59dd9241..a0529653bd 100644 --- a/menu/drivers/zarch.c +++ b/menu/drivers/zarch.c @@ -993,7 +993,8 @@ static void zarch_frame(void *data, video_frame_info_t *video_info) zui->rendering = false; - font_driver_flush(video_info->width, video_info->height, zui->font); + font_driver_flush(video_info->width, video_info->height, zui->font, + video_info); font_driver_bind_block(zui->font, NULL); menu_display_unset_viewport(video_info->width, video_info->height); diff --git a/menu/drivers_display/menu_display_d3d.c b/menu/drivers_display/menu_display_d3d.c index e7b300498b..f4895783f7 100644 --- a/menu/drivers_display/menu_display_d3d.c +++ b/menu/drivers_display/menu_display_d3d.c @@ -143,9 +143,7 @@ static void menu_display_d3d_bind_texture(void *data) static void menu_display_d3d_draw(void *data) { -#if 0 - math_matrix_4x4 *mat = NULL; -#endif + video_shader_ctx_mvp_t mvp; d3d_video_t *d3d = (d3d_video_t*)video_driver_get_ptr(false); menu_display_ctx_draw_t *draw = (menu_display_ctx_draw_t*)data; @@ -159,6 +157,12 @@ static void menu_display_d3d_draw(void *data) if (!draw->coords->lut_tex_coord) draw->coords->lut_tex_coord = menu_display_d3d_get_default_tex_coords(); + mvp.data = d3d; + mvp.matrix = draw->matrix_data ? (math_matrix_4x4*)draw->matrix_data + : (math_matrix_4x4*)menu_display_d3d_get_default_mvp(); + + video_driver_set_mvp(&mvp); + menu_display_d3d_viewport(draw); menu_display_d3d_bind_texture(draw); diff --git a/menu/drivers_display/menu_display_gl.c b/menu/drivers_display/menu_display_gl.c index 9d857cce04..65cf522115 100644 --- a/menu/drivers_display/menu_display_gl.c +++ b/menu/drivers_display/menu_display_gl.c @@ -139,13 +139,13 @@ static void menu_display_gl_draw(void *data) coords.handle_data = gl; coords.data = draw->coords; - video_shader_driver_set_coords(coords); + video_driver_set_coords(&coords); mvp.data = gl; mvp.matrix = draw->matrix_data ? (math_matrix_4x4*)draw->matrix_data : (math_matrix_4x4*)menu_display_gl_get_default_mvp(); - video_shader_driver_set_mvp(mvp); + video_driver_set_mvp(&mvp); glDrawArrays(menu_display_prim_to_gl_enum( draw->prim_type), 0, draw->coords->vertices); diff --git a/menu/menu_displaylist.c b/menu/menu_displaylist.c index b38bc4ffe7..e4dd8450d1 100644 --- a/menu/menu_displaylist.c +++ b/menu/menu_displaylist.c @@ -1405,15 +1405,6 @@ static int menu_displaylist_parse_system_info(menu_displaylist_info_t *info) menu_entries_append_enum(info->list, feat_str, "", MENU_ENUM_LABEL_SYSTEM_INFO_ENTRY, MENU_SETTINGS_CORE_INFO_NONE, 0, 0); - snprintf(feat_str, sizeof(feat_str), - "%s: %s", - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_FBO_SUPPORT), - _fbo_supp ? - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_YES) : - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO)); - menu_entries_append_enum(info->list, feat_str, "", - MENU_ENUM_LABEL_SYSTEM_INFO_ENTRY, MENU_SETTINGS_CORE_INFO_NONE, 0, 0); - snprintf(feat_str, sizeof(feat_str), "%s: %s", msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_FFMPEG_SUPPORT), @@ -3044,6 +3035,14 @@ static int menu_displaylist_parse_horizontal_content_actions( msg_hash_to_str(MENU_ENUM_LABEL_DELETE_ENTRY), MENU_ENUM_LABEL_DELETE_ENTRY, MENU_SETTING_ACTION_DELETE_ENTRY, 0, 0); + + if (settings->bools.quick_menu_show_add_to_favorites) + { + menu_entries_append_enum(info->list, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_ADD_TO_FAVORITES_PLAYLIST), + msg_hash_to_str(MENU_ENUM_LABEL_ADD_TO_FAVORITES_PLAYLIST), + MENU_ENUM_LABEL_ADD_TO_FAVORITES_PLAYLIST, FILE_TYPE_PLAYLIST_ENTRY, 0, 0); + } } if (!string_is_empty(db_name) && (!content_loaded || @@ -5611,10 +5610,13 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, void *data) MENU_ENUM_LABEL_CHEEVOS_PASSWORD, PARSE_ONLY_STRING, false); menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_CHEEVOS_TEST_UNOFFICIAL, + MENU_ENUM_LABEL_CHEEVOS_HARDCORE_MODE_ENABLE, PARSE_ONLY_BOOL, false); menu_displaylist_parse_settings_enum(menu, info, - MENU_ENUM_LABEL_CHEEVOS_HARDCORE_MODE_ENABLE, + MENU_ENUM_LABEL_CHEEVOS_LEADERBOARDS_ENABLE, + PARSE_ONLY_BOOL, false); + menu_displaylist_parse_settings_enum(menu, info, + MENU_ENUM_LABEL_CHEEVOS_TEST_UNOFFICIAL, PARSE_ONLY_BOOL, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_CHEEVOS_VERBOSE_ENABLE, diff --git a/menu/menu_driver.h b/menu/menu_driver.h index 95ac63ff54..07cabb5255 100644 --- a/menu/menu_driver.h +++ b/menu/menu_driver.h @@ -243,6 +243,7 @@ enum xmb_icon_theme XMB_ICON_THEME_MONOCHROME = 0, XMB_ICON_THEME_FLATUI, XMB_ICON_THEME_RETROACTIVE, + XMB_ICON_THEME_RETROSYSTEM, XMB_ICON_THEME_PIXEL, XMB_ICON_THEME_NEOACTIVE, XMB_ICON_THEME_SYSTEMATIC, diff --git a/menu/menu_setting.c b/menu/menu_setting.c index 85e3e0c2e2..168dd8bc5f 100644 --- a/menu/menu_setting.c +++ b/menu/menu_setting.c @@ -26,6 +26,7 @@ #include #include #include +#include #include @@ -1858,7 +1859,7 @@ static void systemd_service_toggle(const char *path, char *unit, bool enable) args[2] = unit; if (enable) - fclose(fopen(path, "w")); + filestream_close(filestream_open(path, RFILE_MODE_WRITE, -1)); else path_file_remove(path); @@ -3949,7 +3950,7 @@ static bool setting_append_list( parent_group, general_write_handler, general_read_handler, - SD_FLAG_NONE + SD_FLAG_LAKKA_ADVANCED ); CONFIG_FLOAT( @@ -3979,6 +3980,7 @@ static bool setting_append_list( general_write_handler, general_read_handler); menu_settings_list_current_add_range(list, list_info, -80, 12, 1.0, true, true); + settings_data_list_current_add_flags(list, list_info, SD_FLAG_LAKKA_ADVANCED); #ifdef __CELLOS_LV2__ CONFIG_BOOL( @@ -6443,6 +6445,22 @@ static bool setting_append_list( SD_FLAG_ADVANCED ); + CONFIG_BOOL( + list, list_info, + &settings->bools.cheevos_leaderboards_enable, + MENU_ENUM_LABEL_CHEEVOS_LEADERBOARDS_ENABLE, + MENU_ENUM_LABEL_VALUE_CHEEVOS_LEADERBOARDS_ENABLE, + false, + MENU_ENUM_LABEL_VALUE_OFF, + MENU_ENUM_LABEL_VALUE_ON, + &group_info, + &subgroup_info, + parent_group, + general_write_handler, + general_read_handler, + SD_FLAG_NONE + ); + CONFIG_BOOL( list, list_info, &settings->bools.cheevos_verbose_enable, diff --git a/menu/widgets/menu_input_dialog.c b/menu/widgets/menu_input_dialog.c index 8031868d85..4b138f55ef 100644 --- a/menu/widgets/menu_input_dialog.c +++ b/menu/widgets/menu_input_dialog.c @@ -59,7 +59,7 @@ void menu_input_dialog_end(void) { menu_input_dialog_keyboard_type = 0; menu_input_dialog_keyboard_idx = 0; - menu_input_dialog_keyboard_display = false; + menu_input_dialog_keyboard_display = false; menu_input_dialog_keyboard_label[0] = '\0'; menu_input_dialog_keyboard_label_setting[0] = '\0'; @@ -86,17 +86,17 @@ unsigned menu_input_dialog_get_kb_idx(void) bool menu_input_dialog_get_display_kb(void) { - return menu_input_dialog_keyboard_display; + return menu_input_dialog_keyboard_display; } void menu_input_dialog_display_kb(void) { - menu_input_dialog_keyboard_display = true; + menu_input_dialog_keyboard_display = true; } void menu_input_dialog_hide_kb(void) { - menu_input_dialog_keyboard_display = false; + menu_input_dialog_keyboard_display = false; } bool menu_input_dialog_start_search(void) @@ -128,10 +128,14 @@ bool menu_input_dialog_start(menu_input_ctx_line_t *line) return false; menu_input_dialog_display_kb(); - strlcpy(menu_input_dialog_keyboard_label, line->label, - sizeof(menu_input_dialog_keyboard_label)); - strlcpy(menu_input_dialog_keyboard_label_setting, - line->label_setting, sizeof(menu_input_dialog_keyboard_label_setting)); + + // Only copy over the menu label and setting if they exist. + if (line->label) + strlcpy(menu_input_dialog_keyboard_label, line->label, + sizeof(menu_input_dialog_keyboard_label)); + if (line->label_setting) + strlcpy(menu_input_dialog_keyboard_label_setting, + line->label_setting, sizeof(menu_input_dialog_keyboard_label_setting)); menu_input_dialog_keyboard_type = line->type; menu_input_dialog_keyboard_idx = line->idx; diff --git a/msg_hash.h b/msg_hash.h index b4eecdc70c..25f83229b8 100644 --- a/msg_hash.h +++ b/msg_hash.h @@ -342,6 +342,7 @@ enum msg_hash_enums MSG_REWINDING, MSG_SLOW_MOTION_REWIND, MSG_SLOW_MOTION, + MSG_FAST_FORWARD, MSG_REWIND_REACHED_END, MSG_FAILED_TO_START_MOVIE_RECORD, MSG_CHEEVOS_HARDCORE_MODE_ENABLE, @@ -393,6 +394,9 @@ enum msg_hash_enums MSG_EXTRACTING, MSG_EXTRACTING_FILE, MSG_NO_CONTENT_STARTING_DUMMY_CORE, + MSG_CONFIG_OVERRIDE_LOADED, + MSG_GAME_REMAP_FILE_LOADED, + MSG_CORE_REMAP_FILE_LOADED, MENU_LABEL(ADD_TO_MIXER), MENU_LABEL(ADD_TO_MIXER_AND_COLLECTION), @@ -419,6 +423,7 @@ enum msg_hash_enums MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_MONOCHROME, MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_FLATUI, MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_RETROACTIVE, + MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_RETROSYSTEM, MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_PIXEL, MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_NEOACTIVE, MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_SYSTEMATIC, @@ -784,6 +789,7 @@ enum msg_hash_enums MENU_LABEL(GOTO_IMAGES), MENU_LABEL(GOTO_VIDEO), MENU_LABEL(ADD_TO_FAVORITES), + MENU_LABEL(ADD_TO_FAVORITES_PLAYLIST), MENU_LABEL(MENU_THROTTLE_FRAMERATE), MENU_LABEL(NO_ACHIEVEMENTS_TO_DISPLAY), MENU_LABEL(NO_ENTRIES_TO_DISPLAY), @@ -846,6 +852,7 @@ enum msg_hash_enums MENU_LABEL(ACCOUNTS_CHEEVOS_USERNAME), MENU_LABEL(CHEEVOS_HARDCORE_MODE_ENABLE), + MENU_LABEL(CHEEVOS_LEADERBOARDS_ENABLE), MENU_LABEL(CHEEVOS_TEST_UNOFFICIAL), MENU_LABEL(CHEEVOS_VERBOSE_ENABLE), MENU_LABEL(CHEEVOS_ENABLE), diff --git a/msg_hash_nl.h b/msg_hash_nl.h deleted file mode 100644 index 71de417f69..0000000000 --- a/msg_hash_nl.h +++ /dev/null @@ -1,3022 +0,0 @@ -MSG_HASH( - MSG_COMPILER, - "Compiler" - ) -MSG_HASH( - MSG_UNKNOWN_COMPILER, - "Onbekende compiler" - ) -MSG_HASH( - MSG_DEVICE_DISCONNECTED_FROM_PORT, - "Apparaat ontkoppeld van port" - ) -MSG_HASH( - MSG_UNKNOWN_NETPLAY_COMMAND_RECEIVED, - "Onbekend netplay commando ontvangen" - ) -MSG_HASH( - MSG_FILE_ALREADY_EXISTS_SAVING_TO_BACKUP_BUFFER, - "Bestand bestaat al. Saven naar backup buffer" - ) -MSG_HASH( - MSG_GOT_CONNECTION_FROM, - "Verbonden met: \"%s\"" - ) -MSG_HASH( - MSG_GOT_CONNECTION_FROM_NAME, - "Verbonden met: \"%s (%s)\"" - ) -MSG_HASH( - MSG_NO_ARGUMENTS_SUPPLIED_AND_NO_MENU_BUILTIN, - "No arguments supplied and no menu builtin, displaying help..." - ) -MSG_HASH( - MSG_NETPLAY_USERS_HAS_FLIPPED, - "Netplay users has flipped" - ) -MSG_HASH( - MSG_SETTING_DISK_IN_TRAY, - "Setting disk in tray" - ) -MSG_HASH( - MSG_WAITING_FOR_CLIENT, - "Wachten op client ..." - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_VIDEO_SHARED_CONTEXT, - "Give hardware-rendered cores their own private context. Avoids having to assume hardware state changes inbetween frames." - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_MENU_SETTINGS, - "Adjusts settings related to the appearance of the menu screen." - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_VIDEO_HARD_SYNC, - "Hard-synchronize the CPU and GPU. Reduces latency at the cost of performance." - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_VIDEO_THREADED, - "Verbetert prestaties ten kosten van latentie en meer video stotteringen. Gebruik dit enkel als het niet mogelijk is om full speed te bereiken zonder dit te activeren." - ) -MSG_HASH( - MSG_AUDIO_VOLUME, - "Geluidsvolume" - ) -MSG_HASH( - MSG_AUTODETECT, - "Autodetecteren" - ) -MSG_HASH( - MSG_AUTOLOADING_SAVESTATE_FROM, - "Auto-loading savestate from" - ) -MSG_HASH( - MSG_CAPABILITIES, - "Mogelijkheden" - ) -MSG_HASH( - MSG_CONNECTING_TO_NETPLAY_HOST, - "Verbinden met netplay host" - ) -MSG_HASH( - MSG_CONNECTING_TO_PORT, - "Verbinding maken met port" - ) -MSG_HASH( - MSG_CONNECTION_SLOT, - "Connectie slot" - ) -MSG_HASH( - MSG_SORRY_UNIMPLEMENTED_CORES_DONT_DEMAND_CONTENT_NETPLAY, - "Sorry, unimplemented: cores that don't demand content cannot participate in netplay." - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_ACCOUNTS_CHEEVOS_PASSWORD, - "Wachtwoord" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_ACCOUNTS_CHEEVOS_SETTINGS, - "Accounts Cheevos" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_ACCOUNTS_CHEEVOS_USERNAME, - "Gebruikersnaam" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_ACCOUNTS_LIST, - "Accounts" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_ACCOUNTS_LIST_END, - "Accounts List Endpoint" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_ACCOUNTS_RETRO_ACHIEVEMENTS, - "Retro Achievements" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_ACHIEVEMENT_LIST, - "Achievements Lijst" - ) - -MSG_HASH( - MENU_ENUM_LABEL_VALUE_ACHIEVEMENT_LIST_HARDCORE, - "Achievements Lijst (Hardcore)" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_ADD_CONTENT_LIST, - "Inhoud toevoegen" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_CONFIGURATIONS_LIST, - "Configuraties" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_ADD_TAB, - "Importeer inhoud" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_ASK_ARCHIVE, - "Keuze" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_ASSETS_DIRECTORY, - "Assets" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_AUDIO_BLOCK_FRAMES, - "Blok Frames" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_AUDIO_DEVICE, - "Audio Apparaat" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_AUDIO_DRIVER, - "Audio Driver" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_AUDIO_DSP_PLUGIN, - "Audio DSP Plugin" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_AUDIO_ENABLE, - "Audio Activeren" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_AUDIO_FILTER_DIR, - "Audio Filter" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_TURBO_DEADZONE_LIST, - "Turbo/Deadzone" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_AUDIO_LATENCY, - "Audio Latentie (ms)" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_AUDIO_MAX_TIMING_SKEW, - "Audio Maximale Timing Onevenredigheid" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_AUDIO_MUTE, - "Audio Mute" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_AUDIO_OUTPUT_RATE, - "Audio Uitvoer Frequentie (Hz)" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_AUDIO_RATE_CONTROL_DELTA, - "Dynamische Audio Rate Control" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_AUDIO_RESAMPLER_DRIVER, - "Audio Resampler Driver" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_AUDIO_SETTINGS, - "Geluid" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_AUDIO_SYNC, - "Audio Synchronizatie" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_AUDIO_VOLUME, - "Audio Uitgangsniveau (dB)" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_AUTOSAVE_INTERVAL, - "Periodiek SaveRAM Autosaven" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_AUTO_OVERRIDES_ENABLE, - "Laad Override Bestanden Automatisch" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_AUTO_REMAPS_ENABLE, - "Laad Remap Bestanden Automatisch" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_AUTO_SHADERS_ENABLE, - "Load Shader Presets Automatically" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_BASIC_MENU_CONTROLS_BACK, - "Terug" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_BASIC_MENU_CONTROLS_CONFIRM, - "Bevestigen/OK" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_BASIC_MENU_CONTROLS_INFO, - "Info" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_BASIC_MENU_CONTROLS_QUIT, - "Afsluiten" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_BASIC_MENU_CONTROLS_SCROLL_DOWN, - "Omlaag Scrollen" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_BASIC_MENU_CONTROLS_SCROLL_UP, - "Omhoog Scrollen" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_BASIC_MENU_CONTROLS_START, - "Start" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_BASIC_MENU_CONTROLS_TOGGLE_KEYBOARD, - "Toggle Keyboard" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_BASIC_MENU_CONTROLS_TOGGLE_MENU, - "Menu Schakelaar" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_BASIC_MENU_ENUM_CONTROLS, - "Basis menu besturing" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_BASIC_MENU_ENUM_CONTROLS_CONFIRM, - "Bevestigen/OK" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_BASIC_MENU_ENUM_CONTROLS_INFO, - "Info" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_BASIC_MENU_ENUM_CONTROLS_QUIT, - "Afsluiten" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_BASIC_MENU_ENUM_CONTROLS_SCROLL_UP, - "Omhoog scrollen" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_BASIC_MENU_ENUM_CONTROLS_START, - "Standaard" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_BASIC_MENU_ENUM_CONTROLS_TOGGLE_KEYBOARD, - "Toggle Keyboard" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_BASIC_MENU_ENUM_CONTROLS_TOGGLE_MENU, - "Toggle Menu" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_BLOCK_SRAM_OVERWRITE, - "SaveRAM niet overschrijven tijdens laden van savestate" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_BLUETOOTH_ENABLE, - "Bluetooth Activeren" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_BUILDBOT_ASSETS_URL, - "Buildbot Assets URL" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_CACHE_DIRECTORY, - "Cache" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_CAMERA_ALLOW, - "Camera Toestaan" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_CAMERA_DRIVER, - "Camera Driver" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_CHEAT, - "Cheat" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_CHEAT_APPLY_CHANGES, - "Cheat wijzigingen toepassen" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_CHEAT_DATABASE_PATH, - "Cheats" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_CHEAT_FILE, - "Cheat Bestand" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_CHEAT_FILE_LOAD, - "Laad Cheat Bestand" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_CHEAT_FILE_SAVE_AS, - "Cheats Opslaan Als" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_CHEAT_NUM_PASSES, - "Cheat Passes" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_CHEEVOS_DESCRIPTION, - "Omschrijving" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_CHEEVOS_HARDCORE_MODE_ENABLE, - "Achievements Hardcore Mode" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_CHEEVOS_LOCKED_ACHIEVEMENTS, - "Locked Achievements:" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_CHEEVOS_LOCKED_ENTRY, - "Locked" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_CHEEVOS_SETTINGS, - "Retro Achievements" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_CHEEVOS_TEST_UNOFFICIAL, - "Test Onofficiele Achievements" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_CHEEVOS_UNLOCKED_ACHIEVEMENTS, - "Unlocked Achievements:" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_CHEEVOS_UNLOCKED_ENTRY, - "Unlocked" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_CLOSE_CONTENT, - "Afsluiten" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_CONFIG, - "Configuratie" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_CONFIGURATIONS, - "Configuratie laden" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_CONFIGURATION_SETTINGS, - "Configuratie" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_CONFIG_SAVE_ON_EXIT, - "Configuratie Opslaan Tijdens Afsluiten" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_CONTENT_COLLECTION_LIST, - "Collecties" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_CONTENT_DATABASE_DIRECTORY, - "Inhoud Database" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_CONTENT_DIR, - "Inhoud" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_CONTENT_HISTORY_SIZE, - "Geschiedenislijst grootte") -MSG_HASH(MENU_ENUM_LABEL_VALUE_CONTENT_SETTINGS, - "Snelmenu") -MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_ASSETS_DIR, - "Downloads") -MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_ASSETS_DIRECTORY, - "Downloads") -MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_CHEAT_OPTIONS, - "Cheats") -MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_COUNTERS, - "Core Prestatie tellers") -MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_ENABLE, - "Core naam weergeven") -MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_INFORMATION, - "Core Informatie") -MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_INFO_AUTHORS, - "Auteurs") -MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_INFO_CATEGORIES, - "Categorieen") -MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_INFO_CORE_LABEL, - "Core label") -MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_INFO_CORE_NAME, - "Core naam") -MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_INFO_FIRMWARE, - "Firmware(s)") -MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_INFO_LICENSES, - "Licentie(s)") -MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_INFO_PERMISSIONS, - "Permissies") -MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_INFO_SUPPORTED_EXTENSIONS, - "Ondersteunde extensies") -MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_INFO_SYSTEM_MANUFACTURER, - "Systeem fabrikant") -MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_INFO_SYSTEM_NAME, - "Systeem naam") -MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_INPUT_REMAPPING_OPTIONS, - "Besturing") -MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_LIST, - "Core Laden") -MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_OPTIONS, - "Opties") -MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_SETTINGS, - "Core") -MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_SET_SUPPORTS_NO_CONTENT_ENABLE, - "Automatisch core opstarten") -MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_UPDATER_AUTO_EXTRACT_ARCHIVE, - "Automatisch uitpakken van gedownloade archieven") -MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_UPDATER_BUILDBOT_URL, - "Buildbot Cores URL") -MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_UPDATER_LIST, - "Core Updater") -MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_UPDATER_SETTINGS, - "Updater") -MSG_HASH(MENU_ENUM_LABEL_VALUE_CPU_ARCHITECTURE, - "CPU Architectuur:") -MSG_HASH(MENU_ENUM_LABEL_VALUE_CPU_CORES, - "CPU Cores:") -MSG_HASH(MENU_ENUM_LABEL_VALUE_CURSOR_DIRECTORY, - "Cursor") -MSG_HASH(MENU_ENUM_LABEL_VALUE_CURSOR_MANAGER, - "Cursor Beheer") -MSG_HASH(MENU_ENUM_LABEL_VALUE_CUSTOM_RATIO, - "Handmatige Beeldverhouding") -MSG_HASH(MENU_ENUM_LABEL_VALUE_DATABASE_MANAGER, - "Database Beheer") -MSG_HASH(MENU_ENUM_LABEL_VALUE_DATABASE_SELECTION, - "Database Selectie") -MSG_HASH(MENU_ENUM_LABEL_VALUE_DELETE_ENTRY, - "Verwijderen") -MSG_HASH(MENU_ENUM_LABEL_VALUE_FAVORITES, - "Favorieten") -MSG_HASH(MENU_ENUM_LABEL_VALUE_DIRECTORY_CONTENT, - "") -MSG_HASH(MENU_ENUM_LABEL_VALUE_DIRECTORY_DEFAULT, - "") -MSG_HASH(MENU_ENUM_LABEL_VALUE_DIRECTORY_NONE, - "") -MSG_HASH(MENU_ENUM_LABEL_VALUE_DIRECTORY_NOT_FOUND, - "Directory niet gevonden.") -MSG_HASH(MENU_ENUM_LABEL_VALUE_DIRECTORY_SETTINGS, - "Directory") -MSG_HASH(MENU_ENUM_LABEL_VALUE_DISK_CYCLE_TRAY_STATUS, - "Disk Cycle Tray Status") -MSG_HASH(MENU_ENUM_LABEL_VALUE_DISK_IMAGE_APPEND, - "Disk Image Toevoegen") -MSG_HASH(MENU_ENUM_LABEL_VALUE_DISK_INDEX, - "Disk Index") -MSG_HASH(MENU_ENUM_LABEL_VALUE_DISK_OPTIONS, - "Disk Beheer") -MSG_HASH(MENU_ENUM_LABEL_VALUE_DONT_CARE, - "Onbelangrijk") -MSG_HASH(MENU_ENUM_LABEL_VALUE_DOWNLOADED_FILE_DETECT_CORE_LIST, - "Downloads") -MSG_HASH(MENU_ENUM_LABEL_VALUE_DOWNLOAD_CORE, - "Download Core...") -MSG_HASH(MENU_ENUM_LABEL_VALUE_DOWNLOAD_CORE_CONTENT, - "Download Inhoud") -MSG_HASH(MENU_ENUM_LABEL_VALUE_DPI_OVERRIDE_ENABLE, - "DPI Override Activeren") -MSG_HASH(MENU_ENUM_LABEL_VALUE_DPI_OVERRIDE_VALUE, - "DPI Override") -MSG_HASH(MENU_ENUM_LABEL_VALUE_DRIVER_SETTINGS, - "Driver") -MSG_HASH(MENU_ENUM_LABEL_VALUE_DUMMY_ON_CORE_SHUTDOWN, - "Dummy Laden Tijdens Afsluiten") -MSG_HASH(MENU_ENUM_LABEL_VALUE_DYNAMIC_WALLPAPER, - "Dynamische Wallpaper") -MSG_HASH(MENU_ENUM_LABEL_VALUE_DYNAMIC_WALLPAPERS_DIRECTORY, - "Dynamische Wallpapers") -MSG_HASH(MENU_ENUM_LABEL_VALUE_CHEEVOS_ENABLE, - "Achievements Activeren") -MSG_HASH(MENU_ENUM_LABEL_VALUE_ENTRY_HOVER_COLOR, - "Menu entry hover kleur") -MSG_HASH(MENU_ENUM_LABEL_VALUE_ENTRY_NORMAL_COLOR, - "Menu entry normale kleur") -MSG_HASH(MENU_ENUM_LABEL_VALUE_FALSE, - "Niet waar") -MSG_HASH(MENU_ENUM_LABEL_VALUE_FASTFORWARD_RATIO, - "Maximale afspeelsnelheid") -MSG_HASH(MENU_ENUM_LABEL_VALUE_FPS_SHOW, - "Framerate weergeven") -MSG_HASH(MENU_ENUM_LABEL_VALUE_FRAME_THROTTLE_ENABLE, - "Beperk Maximale Afspeelsnelheid") -MSG_HASH(MENU_ENUM_LABEL_VALUE_FRAME_THROTTLE_SETTINGS, - "Frame Throttle") -MSG_HASH(MENU_ENUM_LABEL_VALUE_FRONTEND_COUNTERS, - "Frontend Prestatie Tellers") -MSG_HASH(MENU_ENUM_LABEL_VALUE_GAME_SPECIFIC_OPTIONS, - "Load Content-Specific Core Options Automatically") -MSG_HASH(MENU_ENUM_LABEL_VALUE_GAME_SPECIFIC_OPTIONS_CREATE, - "Create game-options file") -MSG_HASH(MENU_ENUM_LABEL_VALUE_GAME_SPECIFIC_OPTIONS_IN_USE, - "Game-options file") -MSG_HASH(MENU_ENUM_LABEL_VALUE_HELP, - "hulp") -MSG_HASH(MENU_ENUM_LABEL_VALUE_HELP_AUDIO_VIDEO_TROUBLESHOOTING, - "Audio/Video Raadpleging") -MSG_HASH(MENU_ENUM_LABEL_VALUE_HELP_CHANGE_VIRTUAL_GAMEPAD, - "Virtuele Gamepad Overlay Veranderen") -MSG_HASH(MENU_ENUM_LABEL_VALUE_HELP_CONTROLS, - "Basis Menu Besturing") -MSG_HASH(MENU_ENUM_LABEL_VALUE_HELP_LIST, - "Hulp") -MSG_HASH(MENU_ENUM_LABEL_VALUE_HELP_LOADING_CONTENT, - "Hoe Laad je Content?") -MSG_HASH(MENU_ENUM_LABEL_VALUE_HELP_SCANNING_CONTENT, - "Scannen naar Content") -MSG_HASH(MENU_ENUM_LABEL_VALUE_HELP_WHAT_IS_A_CORE, - "Wat is een Core?") -MSG_HASH(MENU_ENUM_LABEL_VALUE_HISTORY_LIST_ENABLE, - "Geschiedenislijst Activeren") -MSG_HASH(MENU_ENUM_LABEL_VALUE_HISTORY_TAB, - "Geschiedenis") -MSG_HASH(MENU_ENUM_LABEL_VALUE_HORIZONTAL_MENU, - "Horizontale Menu") -MSG_HASH(MENU_ENUM_LABEL_VALUE_IMAGES_TAB, - "Afbeeldingen") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INFORMATION, - "Informatie") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INFORMATION_LIST, - "Informatie") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ADC_TYPE, - "Analog To Digital Type") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ALL_USERS_CONTROL_MENU, - "All Users Control Menu") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_X, - "Left Analog X") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_X_MINUS, - "Left analog X- (left)") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_X_PLUS, - "Left analog X+ (right)") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_Y, - "Left Analog Y") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_Y_MINUS, - "Left analog Y- (up)") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_Y_PLUS, - "Left analog Y+ (down)") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_X, - "Right Analog X") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_X_MINUS, - "Right analog X- (left)") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_X_PLUS, - "Right analog X+ (right)") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y, - "Right Analog Y") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_MINUS, - "Right analog Y- (up)") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_PLUS, - "Right analog Y+ (down)") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AUTODETECT_ENABLE, - "Autoconfiguratie Activeren") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AXIS_THRESHOLD, - "Analoge As Deadzone") -MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_INPUT_SWAP_OK_CANCEL, - "Menu Swap OK & Cancel Buttons") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_BIND_ALL, - "Bind All") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_BIND_DEFAULT_ALL, - "Bind Default All") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_BIND_TIMEOUT, - "Bind Timeout") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_DESCRIPTOR_HIDE_UNBOUND, - "Verbergen Niet-gemapte Core Input Descripties") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_DESCRIPTOR_LABEL_SHOW, - "Descriptie Labels Weergeven") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_DEVICE_INDEX, - "Device Index") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_DEVICE_TYPE, - "Device Type") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_DRIVER, - "Input Driver") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_DUTY_CYCLE, - "Duty Cycle") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_HOTKEY_BINDS, - "Invoer Hotkey Binds") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ICADE_ENABLE, - "Keyboard Gamepad Mapping Enable") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_A, - "A knop (right)") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_B, - "B knop (down)") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_DOWN, - "Down D-pad") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L2, - "L2 knop (trigger)") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L3, - "L3 knop (thumb)") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L, - "L knop (shoulder)") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_LEFT, - "Left D-pad") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R2, - "R2 knop (trigger)") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R3, - "R3 knop (thumb)") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R, - "R knop (shoulder)") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_RIGHT, - "Rechter D-pad") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_SELECT, - "Select knop") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_START, - "Start knop") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_UP, - "Up D-pad") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_X, - "X knop (top)") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y, - "Y knop (left)") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEY, - "(Key: %s)") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEYBOARD_GAMEPAD_MAPPING_TYPE, - "Keyboard Gamepad Mapping Type") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MAX_USERS, - "Maximaal Aantal Gebruikers") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MENU_ENUM_TOGGLE_GAMEPAD_COMBO, - "Menu Schakelaar Gamepad Combo") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_CHEAT_INDEX_MINUS, - "Cheat index -") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_CHEAT_INDEX_PLUS, - "Cheat index +") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_CHEAT_TOGGLE, - "Cheat toggle") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_DISK_EJECT_TOGGLE, - "Disk eject toggle") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_DISK_NEXT, - "Disk next") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_DISK_PREV, - "Disk prev") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_ENABLE_HOTKEY, - "Enable hotkeys") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_FAST_FORWARD_HOLD_KEY, - "Fast forward hold") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_FAST_FORWARD_KEY, - "Fast forward toggle") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_FRAMEADVANCE, - "Frameadvance") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_FULLSCREEN_TOGGLE_KEY, - "Fullscreen toggle") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_GRAB_MOUSE_TOGGLE, - "Grab mouse toggle") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_LOAD_STATE_KEY, - "Load state") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_MENU_TOGGLE, - "Menu toggle") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_MOVIE_RECORD_TOGGLE, - "Movie record toggle") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_MUTE, - "Audio mute toggle") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_NETPLAY_FLIP, - "Netplay flip users") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_OSK, - "On-screen keyboard toggle") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_OVERLAY_NEXT, - "Overlay next") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_PAUSE_TOGGLE, - "Pause toggle") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_QUIT_KEY, - "Sluit RetroArch") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_RESET, - "Reset game") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_REWIND, - "Rewind") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_SAVE_STATE_KEY, - "Save state") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_SCREENSHOT, - "Take screenshot") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_SHADER_NEXT, - "Next shader") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_SHADER_PREV, - "Previous shader") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_SLOWMOTION, - "Slow motion") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_STATE_SLOT_MINUS, - "Savestate slot -") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_STATE_SLOT_PLUS, - "Savestate slot +") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_VOLUME_DOWN, - "Volume -") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_VOLUME_UP, - "Volume +") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_OVERLAY_ENABLE, - "Overlay Weergeven") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_OVERLAY_HIDE_IN_MENU, - "Verberg Overlay In Menu") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_POLL_TYPE_BEHAVIOR, - "Poll Type Behavior") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_POLL_TYPE_BEHAVIOR_EARLY, - "Vroeg") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_POLL_TYPE_BEHAVIOR_LATE, - "Laat") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_POLL_TYPE_BEHAVIOR_NORMAL, - "Normaal") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_PREFER_FRONT_TOUCH, - "Prefer Front Touch") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_REMAPPING_DIRECTORY, - "Input Remapping") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_REMAP_BINDS_ENABLE, - "Remap Binds Activeren") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_SAVE_AUTOCONFIG, - "Autoconfig Opslaan") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_SETTINGS, - "Invoer") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_SMALL_KEYBOARD_ENABLE, - "Small Keyboard Enable") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_TOUCH_ENABLE, - "Touch Enable") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_TURBO_ENABLE, - "Turbo enable") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_TURBO_PERIOD, - "Turbo Period") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_USER_BINDS, - "Invoer Gebruiker %u Binds") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INTERNAL_STORAGE_STATUS, - "Internal storage status") -MSG_HASH(MENU_ENUM_LABEL_VALUE_JOYPAD_AUTOCONFIG_DIR, - "Invoerapparaten Autoconfiguratie") -MSG_HASH(MENU_ENUM_LABEL_VALUE_JOYPAD_DRIVER, - "Joypad Driver") -MSG_HASH(MENU_ENUM_LABEL_VALUE_LAKKA_SERVICES, - "Services") -MSG_HASH(MENU_ENUM_LABEL_VALUE_LANG_CHINESE_SIMPLIFIED, - "Chinees (Gesimplificeerd)") -MSG_HASH(MENU_ENUM_LABEL_VALUE_LANG_CHINESE_TRADITIONAL, - "Chinees (Traditioneel)") -MSG_HASH(MENU_ENUM_LABEL_VALUE_LANG_DUTCH, - "Nederlands") -MSG_HASH(MENU_ENUM_LABEL_VALUE_LANG_ENGLISH, - "Engels") -MSG_HASH(MENU_ENUM_LABEL_VALUE_LANG_ESPERANTO, - "Esperanto") -MSG_HASH(MENU_ENUM_LABEL_VALUE_LANG_FRENCH, - "Frans") -MSG_HASH(MENU_ENUM_LABEL_VALUE_LANG_GERMAN, - "Duits") -MSG_HASH(MENU_ENUM_LABEL_VALUE_LANG_ITALIAN, - "Italiaans") -MSG_HASH(MENU_ENUM_LABEL_VALUE_LANG_JAPANESE, - "Japans") -MSG_HASH(MENU_ENUM_LABEL_VALUE_LANG_KOREAN, - "Koreaans") -MSG_HASH(MENU_ENUM_LABEL_VALUE_LANG_POLISH, - "Pools") -MSG_HASH(MENU_ENUM_LABEL_VALUE_LANG_PORTUGUESE_BRAZIL, - "Portugees (Brazil)") -MSG_HASH(MENU_ENUM_LABEL_VALUE_LANG_PORTUGUESE_PORTUGAL, - "Portugees (Portugal)") -MSG_HASH(MENU_ENUM_LABEL_VALUE_LANG_RUSSIAN, - "Russisch") -MSG_HASH(MENU_ENUM_LABEL_VALUE_LANG_SPANISH, - "Spaans") -MSG_HASH(MENU_ENUM_LABEL_VALUE_LANG_VIETNAMESE, - "Vietnamees") -MSG_HASH(MENU_ENUM_LABEL_VALUE_LEFT_ANALOG, - "Linkse Analoog Stick") -MSG_HASH(MENU_ENUM_LABEL_VALUE_LIBRETRO_DIR_PATH, - "Core") -MSG_HASH(MENU_ENUM_LABEL_VALUE_LIBRETRO_INFO_PATH, - "Core Info") -MSG_HASH(MENU_ENUM_LABEL_VALUE_LIBRETRO_LOG_LEVEL, - "Core Logging Level") -MSG_HASH(MENU_ENUM_LABEL_VALUE_LINEAR, - "Linear") -MSG_HASH(MENU_ENUM_LABEL_VALUE_LOAD_ARCHIVE, - "Laad Archief") -MSG_HASH(MENU_ENUM_LABEL_VALUE_LOAD_CONTENT_HISTORY, - "Recentelijk gebruikt") -MSG_HASH(MENU_ENUM_LABEL_VALUE_LOAD_CONTENT_LIST, - "Laad Inhoud") -MSG_HASH(MENU_ENUM_LABEL_VALUE_LOAD_STATE, - "Laad State") -MSG_HASH(MENU_ENUM_LABEL_VALUE_LOCATION_ALLOW, - "Locatie toestaan") -MSG_HASH(MENU_ENUM_LABEL_VALUE_LOCATION_DRIVER, - "Locatie Driver") -MSG_HASH(MENU_ENUM_LABEL_VALUE_LOGGING_SETTINGS, - "Logging") -MSG_HASH(MENU_ENUM_LABEL_VALUE_LOG_VERBOSITY, - "Logging Niveau") -MSG_HASH(MENU_ENUM_LABEL_VALUE_MAIN_MENU, - "Hoofdmenu") -MSG_HASH(MENU_ENUM_LABEL_VALUE_MANAGEMENT, - "Database Instellingen") -MSG_HASH(MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_COLOR_THEME, - "Menu Kleur Thema") -MSG_HASH(MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_COLOR_THEME_BLUE, - "Blauw") -MSG_HASH(MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_COLOR_THEME_BLUE_GREY, - "Blauw Grijs") -MSG_HASH(MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_COLOR_THEME_DARK_BLUE, - "Donker Blauw") -MSG_HASH(MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_COLOR_THEME_GREEN, - "Groen") -MSG_HASH(MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_COLOR_THEME_NVIDIA_SHIELD, - "Shield") -MSG_HASH(MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_COLOR_THEME_RED, - "Rood") -MSG_HASH(MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_COLOR_THEME_YELLOW, - "Geel") -MSG_HASH(MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_FOOTER_OPACITY, - "Footer Opacity") -MSG_HASH(MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_HEADER_OPACITY, - "Header Opacity") -MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_DRIVER, - "Menu Driver") -MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_ENUM_THROTTLE_FRAMERATE, - "Throttle Menu Framerate") -MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_FILE_BROWSER_SETTINGS, - "Instellingen") -MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_LINEAR_FILTER, - "Menu Linear Filter") -MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_SETTINGS, - "Uiterlijk") -MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_WALLPAPER, - "Achtergrond") -MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_WALLPAPER_OPACITY, - "Achtergrond doorzichtigheid") -MSG_HASH(MENU_ENUM_LABEL_VALUE_MISSING, - "Ontbrekend") -MSG_HASH(MENU_ENUM_LABEL_VALUE_MORE, - "...") -MSG_HASH(MENU_ENUM_LABEL_VALUE_MOUSE_ENABLE, - "Muis Ondersteuning") -MSG_HASH(MENU_ENUM_LABEL_VALUE_MULTIMEDIA_SETTINGS, - "Multimedia") -MSG_HASH(MENU_ENUM_LABEL_VALUE_MUSIC_TAB, - "Muziek") -MSG_HASH(MENU_ENUM_LABEL_VALUE_NAVIGATION_BROWSER_FILTER_SUPPORTED_EXTENSIONS_ENABLE, - "Filtreer onbekende extensies") -MSG_HASH(MENU_ENUM_LABEL_VALUE_NAVIGATION_WRAPAROUND, - "Navigatie Wrap-Around") -MSG_HASH(MENU_ENUM_LABEL_VALUE_NEAREST, - "Dichtstbijzijnde") -MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY, - "Netplay") -MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_CHECK_FRAMES, - "Netplay Check Frames") -MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_CLIENT_SWAP_INPUT, - "Netplay P2 Uses C1") -MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_DELAY_FRAMES, - "Netplay Vertraging Frames") -MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_DISCONNECT, - "Disconnect") -MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_ENABLE, - "Netplay Activeren") -MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_ENABLE_CLIENT, - "Connect to Netplay host") -MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_ENABLE_HOST, - "Begin hosting") -MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_DISABLE_HOST, - "Eindig netplay host") -MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_IP_ADDRESS, - "Server Adres") -MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_MODE, - "Netplay Client Activeren") -MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_NICKNAME, - "Gebruikersnaam") -MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_SETTINGS, - "Netplay settings") -MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_SPECTATOR_MODE_ENABLE, - "Netplay Spectator Activeren") -MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_TCP_UDP_PORT, - "Netplay TCP/UDP Poort") -MSG_HASH(MENU_ENUM_LABEL_VALUE_NETWORK_CMD_ENABLE, - "Netwerk Commando's") -MSG_HASH(MENU_ENUM_LABEL_VALUE_NETWORK_CMD_PORT, - "Netwerk Commando Poort") -MSG_HASH(MENU_ENUM_LABEL_VALUE_NETWORK_INFORMATION, - "Netwerk Informatie") -MSG_HASH(MENU_ENUM_LABEL_VALUE_NETWORK_REMOTE_ENABLE, - "Netwerk Gamepad") -MSG_HASH(MENU_ENUM_LABEL_VALUE_NETWORK_REMOTE_PORT, - "Netwerk Remote Base Port") -MSG_HASH(MENU_ENUM_LABEL_VALUE_NETWORK_SETTINGS, - "Netwerk") -MSG_HASH(MENU_ENUM_LABEL_VALUE_NO, - "Nee") -MSG_HASH(MENU_ENUM_LABEL_VALUE_NONE, - "Geen") -MSG_HASH(MENU_ENUM_LABEL_VALUE_NOT_AVAILABLE, - "N.v.t") -MSG_HASH(MENU_ENUM_LABEL_VALUE_NO_ACHIEVEMENTS_TO_DISPLAY, - "No achievements to display.") -MSG_HASH(MENU_ENUM_LABEL_VALUE_NO_CORE, - "Geen Core") -MSG_HASH(MENU_ENUM_LABEL_VALUE_NO_CORES_AVAILABLE, - "Geen cores beschikbaar.") -MSG_HASH(MENU_ENUM_LABEL_VALUE_NO_CORE_INFORMATION_AVAILABLE, - "Geen core informatie beschikbaar.") -MSG_HASH(MENU_ENUM_LABEL_VALUE_NO_CORE_OPTIONS_AVAILABLE, - "Geen core opties beschikbaar.") -MSG_HASH(MENU_ENUM_LABEL_VALUE_NO_ENTRIES_TO_DISPLAY, - "No entries to display.") -MSG_HASH(MENU_ENUM_LABEL_VALUE_NO_HISTORY_AVAILABLE, - "Geen geschiedenis beschikbaar.") -MSG_HASH(MENU_ENUM_LABEL_VALUE_NO_INFORMATION_AVAILABLE, - "Informatie is niet beschikbaar.") -MSG_HASH(MENU_ENUM_LABEL_VALUE_NO_ITEMS, - "Geen items.") -MSG_HASH(MENU_ENUM_LABEL_VALUE_NO_PERFORMANCE_COUNTERS, - "Geen prestatie tellers.") -MSG_HASH(MENU_ENUM_LABEL_VALUE_NO_PLAYLISTS, - "No playlists.") -MSG_HASH(MENU_ENUM_LABEL_VALUE_NO_PLAYLIST_ENTRIES_AVAILABLE, - "Geen afspeellijst items beschikbaar.") -MSG_HASH(MENU_ENUM_LABEL_VALUE_NO_SETTINGS_FOUND, - "Geen instellingen gevonden.") -MSG_HASH(MENU_ENUM_LABEL_VALUE_NO_SHADER_PARAMETERS, - "Geen shader parameters.") -MSG_HASH(MENU_ENUM_LABEL_VALUE_OFF, - "UIT") -MSG_HASH(MENU_ENUM_LABEL_VALUE_ON, - "AAN") -MSG_HASH(MENU_ENUM_LABEL_VALUE_ONLINE, - "Online") -MSG_HASH(MENU_ENUM_LABEL_VALUE_ONLINE_UPDATER, - "Online Updater") -MSG_HASH(MENU_ENUM_LABEL_VALUE_ONSCREEN_DISPLAY_SETTINGS, - "Onscreen Weergave") -MSG_HASH(MENU_ENUM_LABEL_VALUE_ONSCREEN_OVERLAY_SETTINGS, - "Onscreen Overlay") -MSG_HASH(MENU_ENUM_LABEL_VALUE_ONSCREEN_NOTIFICATIONS_SETTINGS, - "Onscreen Notifications") -MSG_HASH(MENU_ENUM_LABEL_VALUE_OPEN_ARCHIVE, - "Open Archief") -MSG_HASH(MENU_ENUM_LABEL_VALUE_OPTIONAL, - "Optioneel") -MSG_HASH(MENU_ENUM_LABEL_VALUE_OVERLAY, - "Overlay") -MSG_HASH(MENU_ENUM_LABEL_VALUE_OVERLAY_AUTOLOAD_PREFERRED, - "Laad geprefeerd overlay autom.") -MSG_HASH(MENU_ENUM_LABEL_VALUE_OVERLAY_DIRECTORY, - "Overlay") -MSG_HASH(MENU_ENUM_LABEL_VALUE_OVERLAY_OPACITY, - "Overlay Transparantie") -MSG_HASH(MENU_ENUM_LABEL_VALUE_OVERLAY_PRESET, - "Overlay Preset") -MSG_HASH(MENU_ENUM_LABEL_VALUE_OVERLAY_SCALE, - "Overlay Schalering") -MSG_HASH(MENU_ENUM_LABEL_VALUE_OVERLAY_SETTINGS, - "Onscreen Overlay") -MSG_HASH(MENU_ENUM_LABEL_VALUE_PAL60_ENABLE, - "PAL60 Mode Activeren") -MSG_HASH(MENU_ENUM_LABEL_VALUE_PARENT_DIRECTORY, - "Parent directory") -MSG_HASH(MENU_ENUM_LABEL_VALUE_PAUSE_LIBRETRO, - "Pauseer als menu op voorgrond is") -MSG_HASH(MENU_ENUM_LABEL_VALUE_PAUSE_NONACTIVE, - "Laat niet in achtergrond draaien") -MSG_HASH(MENU_ENUM_LABEL_VALUE_PERFCNT_ENABLE, - "Prestatie Teller") -MSG_HASH(MENU_ENUM_LABEL_VALUE_PLAYLISTS_TAB, - "Afspeellijsten") -MSG_HASH(MENU_ENUM_LABEL_VALUE_PLAYLIST_DIRECTORY, - "Afspeellijst") -MSG_HASH(MENU_ENUM_LABEL_VALUE_PLAYLIST_SETTINGS, - "Playlists") -MSG_HASH(MENU_ENUM_LABEL_VALUE_POINTER_ENABLE, - "Touch Ondersteuning") -MSG_HASH(MENU_ENUM_LABEL_VALUE_PORT, - "Poort") -MSG_HASH(MENU_ENUM_LABEL_VALUE_PRESENT, - "Aanwezig") -MSG_HASH(MENU_ENUM_LABEL_VALUE_PRIVACY_SETTINGS, - "Privacy") -MSG_HASH(MENU_ENUM_LABEL_VALUE_QUIT_RETROARCH, - "Sluit RetroArch") -MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_ANALOG, - "Analog supported") -MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_BBFC_RATING, - "BBFC Rating") -MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_CERO_RATING, - "CERO Rating") -MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_COOP, - "Co-op supported") -MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_CRC32, - "CRC32") -MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_DESCRIPTION, - "Omschrijving") -MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_DEVELOPER, - "Ontwikkelaar") -MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_EDGE_MAGAZINE_ISSUE, - "Edge Magazine Issue") -MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_EDGE_MAGAZINE_RATING, - "Edge Magazine Rating") -MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_EDGE_MAGAZINE_REVIEW, - "Edge Magazine Review") -MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_ELSPA_RATING, - "ELSPA Rating") -MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_ENHANCEMENT_HW, - "Enhancement Hardware") -MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_ESRB_RATING, - "ESRB Rating") -MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_FAMITSU_MAGAZINE_RATING, - "Famitsu Magazine Rating") -MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_FRANCHISE, - "Franchise") -MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_GENRE, - "Genre") -MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_MD5, - "MD5") -MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_NAME, - "Naam") -MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_ORIGIN, - "Afkomst") -MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_PEGI_RATING, - "PEGI Rating") -MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_PUBLISHER, - "Uitgever") -MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_RELEASE_MONTH, - "Release datum Maand") -MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_RELEASE_YEAR, - "Release datum Jaar") -MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_RUMBLE, - "Rumble supported") -MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_SERIAL, - "Serial") -MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_SHA1, - "SHA1") -MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_START_CONTENT, - "Content Opstarten") -MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_TGDB_RATING, - "TGDB Rating") -MSG_HASH(MENU_ENUM_LABEL_VALUE_REBOOT, - "Herstart") -MSG_HASH(MENU_ENUM_LABEL_VALUE_RECORDING_CONFIG_DIRECTORY, - "Opname Config Map") -MSG_HASH(MENU_ENUM_LABEL_VALUE_RECORDING_OUTPUT_DIRECTORY, - "Opname Uitvoer Map") -MSG_HASH(MENU_ENUM_LABEL_VALUE_RECORDING_SETTINGS, - "Opname") -MSG_HASH(MENU_ENUM_LABEL_VALUE_RECORD_CONFIG, - "Laad Opname Configuratie...") -MSG_HASH(MENU_ENUM_LABEL_VALUE_RECORD_DRIVER, - "Opname Driver") -MSG_HASH(MENU_ENUM_LABEL_VALUE_RECORD_ENABLE, - "Opname Activeren") -MSG_HASH(MENU_ENUM_LABEL_VALUE_RECORD_PATH, - "Uitvoer Bestand Opslaan Als...") -MSG_HASH(MENU_ENUM_LABEL_VALUE_RECORD_USE_OUTPUT_DIRECTORY, - "Gebruik Uitvoer Map") -MSG_HASH(MENU_ENUM_LABEL_VALUE_REMAP_FILE, - "Remap File") -MSG_HASH(MENU_ENUM_LABEL_VALUE_REMAP_FILE_LOAD, - "Laad Remap Bestand") -MSG_HASH(MENU_ENUM_LABEL_VALUE_REMAP_FILE_SAVE_CORE, - "Core Remap Bestand Opslaan") -MSG_HASH(MENU_ENUM_LABEL_VALUE_REMAP_FILE_SAVE_GAME, - "Game Remap Bestand Opslaan") -MSG_HASH(MENU_ENUM_LABEL_VALUE_REQUIRED, - "Vereist") -MSG_HASH(MENU_ENUM_LABEL_VALUE_RESTART_CONTENT, - "Opnieuw opstarten") -MSG_HASH(MENU_ENUM_LABEL_VALUE_RESTART_RETROARCH, - "RetroArch Opnieuw Opstarten") -MSG_HASH(MENU_ENUM_LABEL_VALUE_RESUME, - "Hervatten") -MSG_HASH(MENU_ENUM_LABEL_VALUE_RESUME_CONTENT, - "Hervatten") -MSG_HASH(MENU_ENUM_LABEL_VALUE_RETROKEYBOARD, - "RetroKeyboard") -MSG_HASH(MENU_ENUM_LABEL_VALUE_RETROPAD, - "RetroPad") -MSG_HASH(MENU_ENUM_LABEL_VALUE_RETROPAD_WITH_ANALOG, - "RetroPad w/ Analog") -MSG_HASH(MENU_ENUM_LABEL_VALUE_RETRO_ACHIEVEMENTS_SETTINGS, - "Achievements") -MSG_HASH(MENU_ENUM_LABEL_VALUE_REWIND_ENABLE, - "Rewind Activeren") -MSG_HASH(MENU_ENUM_LABEL_VALUE_REWIND_GRANULARITY, - "Rewind Granulariteit") -MSG_HASH(MENU_ENUM_LABEL_VALUE_REWIND_SETTINGS, - "Rewind") -MSG_HASH(MENU_ENUM_LABEL_VALUE_RGUI_BROWSER_DIRECTORY, - "Bestandsbeheer") -MSG_HASH(MENU_ENUM_LABEL_VALUE_RGUI_CONFIG_DIRECTORY, - "Config") -MSG_HASH(MENU_ENUM_LABEL_VALUE_RGUI_SHOW_START_SCREEN, - "Start Scherm Weergeven") -MSG_HASH(MENU_ENUM_LABEL_VALUE_RIGHT_ANALOG, - "Rechtse Analog Stick") -MSG_HASH(MENU_ENUM_LABEL_VALUE_RUN, - "Run") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SAMBA_ENABLE, - "SAMBA Enable") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SAVEFILE_DIRECTORY, - "Savebestand") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SAVESTATE_AUTO_INDEX, - "Save State Automatische Index") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SAVESTATE_AUTO_LOAD, - "Automatisch State Loaden") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SAVESTATE_AUTO_SAVE, - "Automatisch State Saven") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SAVESTATE_DIRECTORY, - "Savestate") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SAVE_CURRENT_CONFIG, - "Huidige Configuratie Opslaan") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SAVE_CURRENT_CONFIG_OVERRIDE_CORE, - "Save Core Overrides") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SAVE_CURRENT_CONFIG_OVERRIDE_GAME, - "Save Game Overrides") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SAVE_NEW_CONFIG, - "Nieuwe configuratie opslaan") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SAVE_STATE, - "Save State") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SAVING_SETTINGS, - "Saving") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SCAN_DIRECTORY, - "Scan Directory") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SCAN_FILE, - "Scan Een Bestand") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SCAN_THIS_DIRECTORY, - "") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SCREENSHOT_DIRECTORY, - "Screenshot") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SCREEN_RESOLUTION, - "Scherm Resolutie") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SEARCH, - "Zoeken:") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SECONDS, - "secondes") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SETTINGS, - "Instellingen") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SETTINGS_TAB, - "Instellingen") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SHADER, - "Shader") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SHADER_APPLY_CHANGES, - "Shader Instellingen Toepassen") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SHADER_OPTIONS, - "Shaders") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SHADER_PIPELINE_RIBBON, - "Ribbon") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SHADER_PIPELINE_RIBBON_SIMPLIFIED, - "Ribbon (vereenvoudigd)") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SHADER_PIPELINE_SIMPLE_SNOW, - "Simpel Sneeuw") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SHADER_PIPELINE_SNOW, - "Sneeuw") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SHOW_ADVANCED_SETTINGS, - "Geavanceerde Instellingen weergeven") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SHOW_HIDDEN_FILES, - "Show Hidden Files and Folders") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SHUTDOWN, - "Shutdown") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SLOWMOTION_RATIO, - "Slow-Motion Ratio") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SORT_SAVEFILES_ENABLE, - "Saves Sorteren In Map") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SORT_SAVESTATES_ENABLE, - "Savestates Sorteren In Map") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SSH_ENABLE, - "SSH Enable") -MSG_HASH(MENU_ENUM_LABEL_VALUE_START_CORE, - "Start Core") -MSG_HASH(MENU_ENUM_LABEL_VALUE_START_NET_RETROPAD, - "Start Remote RetroPad") -MSG_HASH(MENU_ENUM_LABEL_VALUE_START_VIDEO_PROCESSOR, - "Start Video Processor") -MSG_HASH(MENU_ENUM_LABEL_VALUE_STATE_SLOT, - "State Slot") -MSG_HASH(MENU_ENUM_LABEL_VALUE_STATUS, - "Status") -MSG_HASH(MENU_ENUM_LABEL_VALUE_STDIN_CMD_ENABLE, - "stdin Commandos") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SUPPORTED_CORES, - "Aanbevolen cores") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SUSPEND_SCREENSAVER_ENABLE, - "Onderbreek Screensaver") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_BGM_ENABLE, - "Systeem BGM Activeren") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_DIRECTORY, - "Systeem/BIOS") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFORMATION, - "Systeem Informatie") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_7ZIP_SUPPORT, - "7zip ondersteuning") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_ALSA_SUPPORT, - "ALSA ondersteuning") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_BUILD_DATE, - "Build datum") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_CG_SUPPORT, - "Cg ondersteuning") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_COCOA_SUPPORT, - "Cocoa ondersteuning") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_COMMAND_IFACE_SUPPORT, - "Command interface ondersteuning") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_CORETEXT_SUPPORT, - "CoreText ondersteuning") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_CPU_FEATURES, - "CPU Eigenschappen") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_DISPLAY_METRIC_DPI, - "Display metric DPI") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_DISPLAY_METRIC_MM_HEIGHT, - "Display metric hoogte (mm)") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_DISPLAY_METRIC_MM_WIDTH, - "Display metric breedte (mm)") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_DSOUND_SUPPORT, - "DirectSound ondersteuning") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_WASAPI_SUPPORT, - "WASAPI ondersteuning") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_DYLIB_SUPPORT, - "Dynamic library ondersteuning") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_DYNAMIC_SUPPORT, - "Dynamic run-time loading of libretro library") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_EGL_SUPPORT, - "EGL ondersteuning") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_FBO_SUPPORT, - "OpenGL/Direct3D render-to-texture (multi-pass shaders) ondersteuning") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_FFMPEG_SUPPORT, - "FFmpeg ondersteuning") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_FREETYPE_SUPPORT, - "FreeType ondersteuning") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_FRONTEND_IDENTIFIER, - "Frontend identificatie") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_FRONTEND_NAME, - "Frontend naam") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_FRONTEND_OS, - "Frontend OS") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_GIT_VERSION, - "Git versie") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_GLSL_SUPPORT, - "GLSL ondersteuning") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_HLSL_SUPPORT, - "HLSL ondersteuning") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_JACK_SUPPORT, - "JACK ondersteuning") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_KMS_SUPPORT, - "KMS/EGL ondersteuning") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_LIBRETRODB_SUPPORT, - "LibretroDB ondersteuning") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_LIBUSB_SUPPORT, - "Libusb ondersteuning") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_LIBXML2_SUPPORT, - "libxml2 XML parsing ondersteuning") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_NETPLAY_SUPPORT, - "Netplay (peer-to-peer) ondersteuning") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_NETWORK_COMMAND_IFACE_SUPPORT, - "Network Command interface ondersteuning") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_NETWORK_REMOTE_SUPPORT, - "Network Gamepad ondersteuning") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_OPENAL_SUPPORT, - "OpenAL ondersteuning") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_OPENGLES_SUPPORT, - "OpenGL ES ondersteuning") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_OPENGL_SUPPORT, - "OpenGL ondersteuning") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_OPENSL_SUPPORT, - "OpenSL ondersteuning") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_OPENVG_SUPPORT, - "OpenVG ondersteuning") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_OSS_SUPPORT, - "OSS ondersteuning") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_OVERLAY_SUPPORT, - "Overlay ondersteuning") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_POWER_SOURCE, - "Energie bron") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_POWER_SOURCE_CHARGED, - "Opgeladen") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_POWER_SOURCE_CHARGING, - "Opladen") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_POWER_SOURCE_DISCHARGING, - "Discharging") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_POWER_SOURCE_NO_SOURCE, - "Geen bron") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_PULSEAUDIO_SUPPORT, - "PulseAudio ondersteuning") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_PYTHON_SUPPORT, - "Python (script ondersteuning in shaders) ondersteuning") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_RBMP_SUPPORT, - "BMP ondersteuning (RBMP)") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_RETRORATING_LEVEL, - "RetroRating level") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_RJPEG_SUPPORT, - "JPEG ondersteuning (RJPEG)") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_ROARAUDIO_SUPPORT, - "RoarAudio ondersteuning") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_RPNG_SUPPORT, - "PNG ondersteuning (RPNG)") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_RSOUND_SUPPORT, - "RSound ondersteuning") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_RTGA_SUPPORT, - "TGA ondersteuning (RTGA)") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_SDL2_SUPPORT, - "SDL2 ondersteuning") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_SDL_IMAGE_SUPPORT, - "SDL image ondersteuning") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_SDL_SUPPORT, - "SDL1.2 ondersteuning") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_SLANG_SUPPORT, - "Slang ondersteuning") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_THREADING_SUPPORT, - "Threading ondersteuning") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_UDEV_SUPPORT, - "Udev ondersteuning") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_V4L2_SUPPORT, - "Video4Linux2 ondersteuning") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_VIDEO_CONTEXT_DRIVER, - "Video context driver") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_VULKAN_SUPPORT, - "Vulkan ondersteuning") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_WAYLAND_SUPPORT, - "Wayland ondersteuning") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_X11_SUPPORT, - "X11 ondersteuning") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_XAUDIO2_SUPPORT, - "XAudio2 ondersteuning") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_XVIDEO_SUPPORT, - "XVideo ondersteuning") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_ZLIB_SUPPORT, - "Zlib ondersteuning") -MSG_HASH(MENU_ENUM_LABEL_VALUE_TAKE_SCREENSHOT, - "Neem Schermafdruk") -MSG_HASH(MENU_ENUM_LABEL_VALUE_THREADED_DATA_RUNLOOP_ENABLE, - "Threaded taken") -MSG_HASH(MENU_ENUM_LABEL_VALUE_THUMBNAILS, - "Thumbnails") -MSG_HASH(MENU_ENUM_LABEL_VALUE_THUMBNAILS_DIRECTORY, - "Thumbnails") -MSG_HASH(MENU_ENUM_LABEL_VALUE_THUMBNAILS_UPDATER_LIST, - "Thumbnails Updater") -MSG_HASH(MENU_ENUM_LABEL_VALUE_THUMBNAIL_MODE_BOXARTS, - "Boxarts") -MSG_HASH(MENU_ENUM_LABEL_VALUE_THUMBNAIL_MODE_SCREENSHOTS, - "Screenshots") -MSG_HASH(MENU_ENUM_LABEL_VALUE_THUMBNAIL_MODE_TITLE_SCREENS, - "Title Screens") -MSG_HASH(MENU_ENUM_LABEL_VALUE_TIMEDATE_ENABLE, - "Tijd/datum weergeven") -MSG_HASH(MENU_ENUM_LABEL_VALUE_TITLE_COLOR, - "Menu titelkleur") -MSG_HASH(MENU_ENUM_LABEL_VALUE_TRUE, - "Waar") -MSG_HASH(MENU_ENUM_LABEL_VALUE_UI_COMPANION_ENABLE, - "UI Companion Enable") -MSG_HASH(MENU_ENUM_LABEL_VALUE_UI_COMPANION_START_ON_BOOT, - "UI Companion Start Tijdens Boot") -MSG_HASH(MENU_ENUM_LABEL_VALUE_UI_MENUBAR_ENABLE, - "Menubalk") -MSG_HASH(MENU_ENUM_LABEL_VALUE_UNABLE_TO_READ_COMPRESSED_FILE, - "Fout opgetreden tijdens lezen van gecomprimeerd bestand.") -MSG_HASH(MENU_ENUM_LABEL_VALUE_UNDO_LOAD_STATE, - "Laden van State Ongedaan Maken") -MSG_HASH(MENU_ENUM_LABEL_VALUE_UNDO_SAVE_STATE, - "Save State Ongedaan Maken") -MSG_HASH(MENU_ENUM_LABEL_VALUE_UNKNOWN, - "Onbekend") -MSG_HASH(MENU_ENUM_LABEL_VALUE_UPDATER_SETTINGS, - "Updater") -MSG_HASH(MENU_ENUM_LABEL_VALUE_UPDATE_ASSETS, - "Update Assets") -MSG_HASH(MENU_ENUM_LABEL_VALUE_UPDATE_AUTOCONFIG_PROFILES, - "Update Autoconfiguratie Profielen") -MSG_HASH(MENU_ENUM_LABEL_VALUE_UPDATE_CG_SHADERS, - "Update Cg Shaders") -MSG_HASH(MENU_ENUM_LABEL_VALUE_UPDATE_CHEATS, - "Update Cheats") -MSG_HASH(MENU_ENUM_LABEL_VALUE_UPDATE_CORE_INFO_FILES, - "Update Core Info Bestanden") -MSG_HASH(MENU_ENUM_LABEL_VALUE_UPDATE_DATABASES, - "Update Databases") -MSG_HASH(MENU_ENUM_LABEL_VALUE_UPDATE_GLSL_SHADERS, - "Update GLSL Shaders") -MSG_HASH(MENU_ENUM_LABEL_VALUE_UPDATE_LAKKA, - "Update Lakka") -MSG_HASH(MENU_ENUM_LABEL_VALUE_UPDATE_OVERLAYS, - "Update Overlays") -MSG_HASH(MENU_ENUM_LABEL_VALUE_UPDATE_SLANG_SHADERS, - "Update Slang Shaders") -MSG_HASH(MENU_ENUM_LABEL_VALUE_USER, - "User") -MSG_HASH(MENU_ENUM_LABEL_VALUE_USER_INTERFACE_SETTINGS, - "Gebruikersinterface") -MSG_HASH(MENU_ENUM_LABEL_VALUE_USER_LANGUAGE, - "Taal") -MSG_HASH(MENU_ENUM_LABEL_VALUE_USER_SETTINGS, - "Gebruiker") -MSG_HASH(MENU_ENUM_LABEL_VALUE_USE_BUILTIN_IMAGE_VIEWER, - "Gebruik ingebouwde afbeeldingsweergave") -MSG_HASH(MENU_ENUM_LABEL_VALUE_USE_BUILTIN_PLAYER, - "Gebruik ingebouwde media speler") -MSG_HASH(MENU_ENUM_LABEL_VALUE_USE_THIS_DIRECTORY, - "") -MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_ALLOW_ROTATE, - "Rotatie toestaan") -MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_ASPECT_RATIO_AUTO, - "Automatische Beeldverhouding") -MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_ASPECT_RATIO_INDEX, - "Beeldverhouding") -MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION, - "Zwarte Frame Injectie") -MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_CROP_OVERSCAN, - "Overscan Afsnijden (Herladen Vereist)") -MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_DISABLE_COMPOSITION, - "Desktop Compositie Deactiveren") -MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_DRIVER, - "Video Driver") -MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_FILTER, - "Video Filter") -MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_FILTER_DIR, - "Video Filter") -MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_FILTER_FLICKER, - "Flicker filter") -MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_FONT_ENABLE, - "Onscreen Berichten Weergeven") -MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_FONT_PATH, - "Onscreen Berichten Font") -MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_FONT_SIZE, - "Onscreen Berichten Grootte") -MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_FORCE_ASPECT, - "Forceer beeldverhouding") -MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_FORCE_SRGB_DISABLE, - "Handmatig sRGB FBO Deactiveren") -MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_FRAME_DELAY, - "Frame Delay") -MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_FULLSCREEN, - "Gebruil Fullscreen Mode") -MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_GAMMA, - "Video Gamma") -MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_GPU_RECORD, - "GPU Opname Activeren") -MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_GPU_SCREENSHOT, - "GPU Screenshots Activeren") -MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_HARD_SYNC, - "Harde GPU Synchronisatie") -MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_HARD_SYNC_FRAMES, - "Harde GPU Sync Frames") -MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_MAX_SWAPCHAIN_IMAGES, - "Max swapchain images") -MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_POS_X, - "OSD Berichten X-as positie") -MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_POS_Y, - "OSD Berichten Y-as positie") -MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_MONITOR_INDEX, - "Monitor Index") -MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_POST_FILTER_RECORD, - "Post Filter Opname Activeren") -MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_REFRESH_RATE, - "Vertical Refresh Rate") -MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_REFRESH_RATE_AUTO, - "Geschatte Scherm Framerate") -MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_ROTATION, - "Rotatie") -MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SCALE, - "Venster Schalering") -MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SCALE_INTEGER, - "Vierkantige schalering") -MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SETTINGS, - "Video") -MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_DIR, - "Video Shader") -MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_NUM_PASSES, - "Shader Passes") -MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PARAMETERS, - "Voorbeeldweergave Shader Parameters") -MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET, - "Load Shader Preset") -MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_PARAMETERS, - "Menu Shader Parameters") -MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_SAVE_AS, - "Shader Preset Opslaan Als") -MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_SAVE_CORE, - "Save Core Preset") -MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_SAVE_GAME, - "Save Game Preset") -MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHARED_CONTEXT, - "Activeer Gedeelde Hardware Context") -MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SMOOTH, - "Bilinear Filtering") -MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SOFT_FILTER, - "Soft Filter Enable") -MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SWAP_INTERVAL, - "Vertical Sync (Vsync) Swap Interval") -MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_TAB, - "Video") -MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_THREADED, - "Threaded Video") -MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_VFILTER, - "Deflicker") -MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_HEIGHT, - "Handmatige Viewport Hoogte") -MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_WIDTH, - "Handmatige Viewport Breedte") -MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_X, - "Handmatige Viewport X Pos.") -MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_Y, - "Handmatige Viewport Y Positie") -MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_VI_WIDTH, - "VI Scherm Breedte Instellen") -MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_VSYNC, - "Verticale Sync (Vsync)") -MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_WINDOWED_FULLSCREEN, - "Windowed Fullscreen Mode") -MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_WINDOW_WIDTH, - "Window Width") -MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_WINDOW_HEIGHT, - "Window Height") -MSG_HASH(MENU_ENUM_LABEL_VALUE_WIFI_DRIVER, - "Wi-Fi Driver") -MSG_HASH(MENU_ENUM_LABEL_VALUE_WIFI_SETTINGS, - "Wi-Fi") -MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ALPHA_FACTOR, - "Menu Alpha Factor") -MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_FONT, - "Menu Font") -MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_CUSTOM, - "Custom") -MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_FLATUI, - "FlatUI") -MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_MONOCHROME, - "Monochrome") -MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_SYSTEMATIC, - "Systematic") -MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_NEOACTIVE, - "NeoActive") -MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_PIXEL, - "Pixel") -MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_RETROACTIVE, - "RetroActive") -MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_DOTART, - "Dot-Art") -MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME, - "Menu Kleur Thema") -MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_APPLE_GREEN, - "Appel Groen") -MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_DARK, - "Donker") -MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_DARK_PURPLE, - "Donker Paars") -MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_ELECTRIC_BLUE, - "Elektrisch Blauw") -MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_GOLDEN, - "Goud") -MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_LEGACY_RED, - "Legacy Red") -MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_MIDNIGHT_BLUE, - "Middernacht Blauw") -MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_PLAIN, - "Gewoon") -MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_UNDERSEA, - "Undersea") -MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_VOLCANIC_RED, - "Vulkanisch Rood") -MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_RIBBON_ENABLE, - "Menu Shader Pipeline") -MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_SCALE_FACTOR, - "Menu Scale Factor") -MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_SHADOWS_ENABLE, - "Icon Shadows Enable") -MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_SHOW_HISTORY, - "Geschiedenistab weergeven") -MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_SHOW_IMAGES, - "Afbeeldingentab weergeven") -MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_SHOW_MUSIC, - "Muziektab weergeven") -MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_SHOW_SETTINGS, - "Instellingentab weergeven") -MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_SHOW_VIDEO, - "Videotab weergeven") -MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_THEME, - "Menu Icon Theme") -MSG_HASH(MENU_ENUM_LABEL_VALUE_YES, - "Ja") -MSG_HASH(MENU_ENUM_LABEL_VIDEO_SHADER_PRESET_TWO, - "Shader Preset") -MSG_HASH(MENU_ENUM_SUBLABEL_CHEEVOS_ENABLE, - "Enable or disable achievements. For more information, visit http://retroachievements.org") -MSG_HASH(MENU_ENUM_SUBLABEL_CHEEVOS_TEST_UNOFFICIAL, - "Enable or disable unofficial achievements and/or beta features for testing purposes.") -MSG_HASH(MENU_ENUM_SUBLABEL_CHEEVOS_HARDCORE_MODE_ENABLE, - "Enable or disable savestates, cheats, rewind, fast-forward, pause, and slow-motion for all games.") -MSG_HASH(MENU_ENUM_SUBLABEL_DRIVER_SETTINGS, - "Change drivers for this system.") -MSG_HASH(MENU_ENUM_SUBLABEL_RETRO_ACHIEVEMENTS_SETTINGS, - "Change settings for the achievements.") -MSG_HASH(MENU_ENUM_SUBLABEL_CORE_SETTINGS, - "Change settings for the core.") -MSG_HASH(MENU_ENUM_SUBLABEL_RECORDING_SETTINGS, - "Change settings for the recording.") -MSG_HASH(MENU_ENUM_SUBLABEL_ONSCREEN_DISPLAY_SETTINGS, - "Change settings for display overlay, keyboard overlay and onscreen notifications.") -MSG_HASH(MENU_ENUM_SUBLABEL_FRAME_THROTTLE_SETTINGS, - "Change settings for rewinding, fast-forwarding, and slow-motion.") -MSG_HASH(MENU_ENUM_SUBLABEL_SAVING_SETTINGS, - "Change settings for the saving.") -MSG_HASH(MENU_ENUM_SUBLABEL_LOGGING_SETTINGS, - "Change settings for the logging.") -MSG_HASH(MENU_ENUM_SUBLABEL_USER_INTERFACE_SETTINGS, - "Change settings for the user interface.") -MSG_HASH(MENU_ENUM_SUBLABEL_USER_SETTINGS, - "Change accounts, username, and language.") -MSG_HASH(MENU_ENUM_SUBLABEL_PRIVACY_SETTINGS, - "Change your privacy settings.") -MSG_HASH(MENU_ENUM_SUBLABEL_DIRECTORY_SETTINGS, - "Change default directories for this system.") -MSG_HASH(MENU_ENUM_SUBLABEL_PLAYLIST_SETTINGS, - "Change settings for the playlists.") -MSG_HASH(MENU_ENUM_SUBLABEL_NETWORK_SETTINGS, - "Configure server and network settings.") -MSG_HASH(MENU_ENUM_SUBLABEL_ADD_CONTENT_LIST, - "Scan contents and add to the database.") -MSG_HASH(MENU_ENUM_SUBLABEL_AUDIO_SETTINGS, - "Adjusts settings for audio output.") -MSG_HASH(MENU_ENUM_SUBLABEL_BLUETOOTH_ENABLE, - "Enable or disable bluetooth.") -MSG_HASH(MENU_ENUM_SUBLABEL_CONFIG_SAVE_ON_EXIT, - "Saves changes to configuration file on exit.") -MSG_HASH(MENU_ENUM_SUBLABEL_CONFIGURATION_SETTINGS, - "Change default settings for configuration files.") -MSG_HASH(MENU_ENUM_SUBLABEL_CONFIGURATIONS_LIST, - "Manage and create configuration files.") -MSG_HASH(MENU_ENUM_SUBLABEL_CPU_CORES, - "Amount of cores that the CPU has.") -MSG_HASH(MENU_ENUM_SUBLABEL_FPS_SHOW, - "Displays the current framerate per second onscreen.") -MSG_HASH(MENU_ENUM_SUBLABEL_INPUT_HOTKEY_BINDS, - "Configure hotkey settings.") -MSG_HASH(MENU_ENUM_SUBLABEL_INPUT_MENU_ENUM_TOGGLE_GAMEPAD_COMBO, - "Gamepad knoppencombination to toggle menu.") -MSG_HASH(MENU_ENUM_SUBLABEL_INPUT_SETTINGS, - "Adjusts settings for joypads, keyboard and mouse.") -MSG_HASH(MENU_ENUM_SUBLABEL_INPUT_USER_BINDS, - "Configure controls for this user.") -MSG_HASH(MENU_ENUM_SUBLABEL_LOG_VERBOSITY, - "Enable or disable logging to the terminal.") -MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY, - "Join or host a netplay session.") -MSG_HASH(MENU_ENUM_SUBLABEL_INFORMATION_LIST_LIST, - "Toon core, netwerk en systeem informatie.") -MSG_HASH(MENU_ENUM_SUBLABEL_ONLINE_UPDATER, - "Download add-ons, components and contents for RetroArch.") -MSG_HASH(MENU_ENUM_SUBLABEL_SAMBA_ENABLE, - "Enable or disable network sharing of your folders.") -MSG_HASH(MENU_ENUM_SUBLABEL_SERVICES_SETTINGS, - "Manage operating system level services.") -MSG_HASH(MENU_ENUM_SUBLABEL_SHOW_HIDDEN_FILES, - "Show hidden files/directories inside the file browser.") -MSG_HASH(MENU_ENUM_SUBLABEL_SSH_ENABLE, - "Enable or disable remote command line access.") -MSG_HASH(MENU_ENUM_SUBLABEL_SUSPEND_SCREENSAVER_ENABLE, - "Prevents your system's screensaver from becoming active.") -MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_WINDOW_SCALE, - "Sets the window size relative to the core viewport size. Alternatively you can set a window width and height below for a fixed window size") -MSG_HASH(MENU_ENUM_SUBLABEL_USER_LANGUAGE, - "Stel de taal in van de gebruikersinterface.") -MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_BLACK_FRAME_INSERTION, - "Inserts a black frame inbetween frames. Useful for users of 120 Hz screens who want to play 60 Hz material with eliminated ghosting.") -MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_FRAME_DELAY, - "Reduces latency at the cost of higher risk of video stuttering. Adds a delay after V-Sync (in ms).") -MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_HARD_SYNC_FRAMES, - "Sets how many frames the CPU can run ahead of the GPU when using 'Hard GPU Sync'.") -MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_MAX_SWAPCHAIN_IMAGES, - "Tells the video driver to explicitly use a specified buffering mode.") -MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_MONITOR_INDEX, - "Selects which display screen to use.") -MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_REFRESH_RATE_AUTO, - "The accurate estimated refresh rate of the screen in Hz.") -MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_SETTINGS, - "Adjusts settings for video output.") -MSG_HASH(MENU_ENUM_SUBLABEL_WIFI_SETTINGS, - "Scans for wireless networks and establishes connection.") -MSG_HASH(MENU_ENUM_SUBLABEL_HELP_LIST, - "Leer meer over hoe het werkt.") -MSG_HASH(MSG_APPENDED_DISK, - "Appended disk") -MSG_HASH(MSG_APPLICATION_DIR, - "Application Dir") -MSG_HASH(MSG_APPLYING_CHEAT, - "Applying cheat changes.") -MSG_HASH(MSG_APPLYING_SHADER, - "Applying shader") -MSG_HASH(MSG_AUDIO_MUTED, - "Audio muted.") -MSG_HASH(MSG_AUDIO_UNMUTED, - "Audio unmuted.") -MSG_HASH(MSG_AUTOCONFIG_FILE_ERROR_SAVING, - "Error saving autoconf file.") -MSG_HASH(MSG_AUTOCONFIG_FILE_SAVED_SUCCESSFULLY, - "Autoconfig file saved successfully.") -MSG_HASH(MSG_AUTOSAVE_FAILED, - "Could not initialize autosave.") -MSG_HASH(MSG_AUTO_SAVE_STATE_TO, - "Auto save state to") -MSG_HASH(MSG_BLOCKING_SRAM_OVERWRITE, - "Blocking SRAM Overwrite") -MSG_HASH(MSG_BRINGING_UP_COMMAND_INTERFACE_ON_PORT, - "Bringing up command interface on port") -MSG_HASH(MSG_BYTES, - "bytes") -MSG_HASH(MSG_CANNOT_INFER_NEW_CONFIG_PATH, - "Cannot infer new config path. Use current time.") -MSG_HASH(MSG_CHEEVOS_HARDCORE_MODE_ENABLE, - "Hardcore Mode Enabled, savestate & rewind were disabled.") -MSG_HASH(MSG_COMPARING_WITH_KNOWN_MAGIC_NUMBERS, - "Comparing with known magic numbers...") -MSG_HASH(MSG_COMPILED_AGAINST_API, - "Compiled against API") -MSG_HASH(MSG_CONFIG_DIRECTORY_NOT_SET, - "Config directory not set. Cannot save new config.") -MSG_HASH(MSG_CONNECTED_TO, - "Connected to") -MSG_HASH(MSG_CONTENT_CRC32S_DIFFER, - "Content CRC32s differ. Cannot use different games.") -MSG_HASH(MSG_CONTENT_LOADING_SKIPPED_IMPLEMENTATION_WILL_DO_IT, - "Content loading skipped. Implementation will load it on its own.") -MSG_HASH(MSG_CORE_DOES_NOT_SUPPORT_SAVESTATES, - "Core does not support save states.") -MSG_HASH(MSG_CORE_OPTIONS_FILE_CREATED_SUCCESSFULLY, - "Core options file created successfully.") -MSG_HASH(MSG_COULD_NOT_FIND_ANY_NEXT_DRIVER, - "Could not find any next driver") -MSG_HASH(MSG_COULD_NOT_FIND_COMPATIBLE_SYSTEM, - "Could not find compatible system.") -MSG_HASH(MSG_COULD_NOT_FIND_VALID_DATA_TRACK, - "Could not find valid data track") -MSG_HASH(MSG_COULD_NOT_OPEN_DATA_TRACK, - "could not open data track") -MSG_HASH(MSG_COULD_NOT_READ_CONTENT_FILE, - "Could not read content file") -MSG_HASH(MSG_COULD_NOT_READ_MOVIE_HEADER, - "Could not read movie header.") -MSG_HASH(MSG_COULD_NOT_READ_STATE_FROM_MOVIE, - "Could not read state from movie.") -MSG_HASH(MSG_CRC32_CHECKSUM_MISMATCH, - "CRC32 checksum mismatch between content file and saved content checksum in replay file header) replay highly likely to desync on playback.") -MSG_HASH(MSG_CUSTOM_TIMING_GIVEN, - "Custom timing given") -MSG_HASH(MSG_DECOMPRESSION_ALREADY_IN_PROGRESS, - "Decompression already in progress.") -MSG_HASH(MSG_DECOMPRESSION_FAILED, - "Decompression failed.") -MSG_HASH(MSG_DETECTED_VIEWPORT_OF, - "Detected viewport of") -MSG_HASH(MSG_DID_NOT_FIND_A_VALID_CONTENT_PATCH, - "Did not find a valid content patch.") -MSG_HASH(MSG_DISCONNECT_DEVICE_FROM_A_VALID_PORT, - "Disconnect device from a valid port.") -MSG_HASH(MSG_DISK_CLOSED, - "Closed") -MSG_HASH(MSG_DISK_EJECTED, - "Ejected") -MSG_HASH(MSG_DOWNLOADING, - "Downloading") -MSG_HASH(MSG_DOWNLOAD_FAILED, - "Download mislukt") -MSG_HASH(MSG_ERROR, - "Error") -MSG_HASH(MSG_ERROR_LIBRETRO_CORE_REQUIRES_CONTENT, - "Libretro core heeft inhoud nodig, maar dat werd niet gegeven.") -MSG_HASH(MSG_ERROR_LIBRETRO_CORE_REQUIRES_SPECIAL_CONTENT, - "Libretro core heeft speciaal inhoud nodig, maar dat werd niet gegeven.") -MSG_HASH(MSG_ERROR_PARSING_ARGUMENTS, - "Error parsing arguments.") -MSG_HASH(MSG_ERROR_SAVING_CORE_OPTIONS_FILE, - "Error saving core options file.") -MSG_HASH(MSG_ERROR_SAVING_REMAP_FILE, - "Fout is opgetreden tijdens het opslaan van remap bestand.") -MSG_HASH(MSG_ERROR_SAVING_SHADER_PRESET, - "Fout is opgetreden tijdens het opslaan van shader preset.") -MSG_HASH(MSG_EXTERNAL_APPLICATION_DIR, - "Externe Applicatie Dir") -MSG_HASH(MSG_EXTRACTING, - "Uitpakken") -MSG_HASH(MSG_EXTRACTING_FILE, - "Uitpakken van bestand") -MSG_HASH(MSG_FAILED_SAVING_CONFIG_TO, - "Fout is opgetrijdens tijdens het opslaan van configuratie naar ") -MSG_HASH(MSG_FAILED_TO, - "Failed to") -MSG_HASH(MSG_FAILED_TO_ACCEPT_INCOMING_SPECTATOR, - "Failed to accept incoming spectator.") -MSG_HASH(MSG_FAILED_TO_ALLOCATE_MEMORY_FOR_PATCHED_CONTENT, - "Failed to allocate memory for patched content...") -MSG_HASH(MSG_FAILED_TO_APPLY_SHADER, - "Failed to apply shader.") -MSG_HASH(MSG_FAILED_TO_BIND_SOCKET, - "Failed to bind socket.") -MSG_HASH(MSG_FAILED_TO_CREATE_THE_DIRECTORY, - "Failed to create the directory.") -MSG_HASH(MSG_FAILED_TO_EXTRACT_CONTENT_FROM_COMPRESSED_FILE, - "Failed to extract content from compressed file") -MSG_HASH(MSG_FAILED_TO_GET_NICKNAME_FROM_CLIENT, - "Failed to get nickname from client.") -MSG_HASH(MSG_FAILED_TO_LOAD, - "Failed to load") -MSG_HASH(MSG_FAILED_TO_LOAD_CONTENT, - "Failed to load content") -MSG_HASH(MSG_FAILED_TO_LOAD_MOVIE_FILE, - "Failed to load movie file") -MSG_HASH(MSG_FAILED_TO_LOAD_OVERLAY, - "Failed to load overlay.") -MSG_HASH(MSG_FAILED_TO_LOAD_STATE, - "Failed to load state from") -MSG_HASH(MSG_FAILED_TO_OPEN_LIBRETRO_CORE, - "Failed to open libretro core") -MSG_HASH(MSG_FAILED_TO_PATCH, - "Failed to patch") -MSG_HASH(MSG_FAILED_TO_RECEIVE_HEADER_FROM_CLIENT, - "Failed to receive header from client.") -MSG_HASH(MSG_FAILED_TO_RECEIVE_NICKNAME, - "Failed to receive nickname.") -MSG_HASH(MSG_FAILED_TO_RECEIVE_NICKNAME_FROM_HOST, - "Failed to receive nickname from host.") -MSG_HASH(MSG_FAILED_TO_RECEIVE_NICKNAME_SIZE_FROM_HOST, - "Failed to receive nickname size from host.") -MSG_HASH(MSG_FAILED_TO_RECEIVE_SRAM_DATA_FROM_HOST, - "Failed to receive SRAM data from host.") -MSG_HASH(MSG_FAILED_TO_REMOVE_DISK_FROM_TRAY, - "Failed to remove disk from tray.") -MSG_HASH(MSG_FAILED_TO_REMOVE_TEMPORARY_FILE, - "Failed to remove temporary file") -MSG_HASH(MSG_FAILED_TO_SAVE_SRAM, - "Failed to save SRAM") -MSG_HASH(MSG_FAILED_TO_SAVE_STATE_TO, - "Failed to save state to") -MSG_HASH(MSG_FAILED_TO_SEND_NICKNAME, - "Failed to send nickname.") -MSG_HASH(MSG_FAILED_TO_SEND_NICKNAME_SIZE, - "Failed to send nickname size.") -MSG_HASH(MSG_FAILED_TO_SEND_NICKNAME_TO_CLIENT, - "Failed to send nickname to client.") -MSG_HASH(MSG_FAILED_TO_SEND_NICKNAME_TO_HOST, - "Failed to send nickname to host.") -MSG_HASH(MSG_FAILED_TO_SEND_SRAM_DATA_TO_CLIENT, - "Failed to send SRAM data to client.") -MSG_HASH(MSG_FAILED_TO_START_AUDIO_DRIVER, - "Failed to start audio driver. Will continue without audio.") -MSG_HASH(MSG_FAILED_TO_START_MOVIE_RECORD, - "Failed to start movie record.") -MSG_HASH(MSG_FAILED_TO_START_RECORDING, - "Failed to start recording.") -MSG_HASH(MSG_FAILED_TO_TAKE_SCREENSHOT, - "Failed to take screenshot.") -MSG_HASH(MSG_FAILED_TO_UNDO_LOAD_STATE, - "Failed to undo load state.") -MSG_HASH(MSG_FAILED_TO_UNDO_SAVE_STATE, - "Failed to undo save state.") -MSG_HASH(MSG_FAILED_TO_UNMUTE_AUDIO, - "Failed to unmute audio.") -MSG_HASH(MSG_FATAL_ERROR_RECEIVED_IN, - "Fatal error received in") -MSG_HASH(MSG_FILE_NOT_FOUND, - "File not found") -MSG_HASH(MSG_FOUND_AUTO_SAVESTATE_IN, - "Found auto savestate in") -MSG_HASH(MSG_FOUND_DISK_LABEL, - "Found disk label") -MSG_HASH(MSG_FOUND_FIRST_DATA_TRACK_ON_FILE, - "Found first data track on file") -MSG_HASH(MSG_FOUND_LAST_STATE_SLOT, - "Found last state slot") -MSG_HASH(MSG_FOUND_SHADER, - "Found shader") -MSG_HASH(MSG_FRAMES, - "Frames") -MSG_HASH(MSG_GAME_SPECIFIC_CORE_OPTIONS_FOUND_AT, - "Per-Game Options: game-specific core options found at") -MSG_HASH(MSG_GOT_INVALID_DISK_INDEX, - "Got invalid disk index.") -MSG_HASH(MSG_GRAB_MOUSE_STATE, - "Grab mouse state") -MSG_HASH(MSG_HW_RENDERED_MUST_USE_POSTSHADED_RECORDING, - "Libretro core is hardware-geaccelereerd. Must use post-shaded recording as well.") -MSG_HASH(MSG_INFLATED_CHECKSUM_DID_NOT_MATCH_CRC32, - "Inflated checksum did not match CRC32.") -MSG_HASH(MSG_INPUT_CHEAT, - "Input Cheat") -MSG_HASH(MSG_INPUT_CHEAT_FILENAME, - "Input Cheat Filename") -MSG_HASH(MSG_INPUT_PRESET_FILENAME, - "Input Preset Filename") -MSG_HASH(MSG_INPUT_RENAME_ENTRY, - "Rename Title") -MSG_HASH(MSG_INTERFACE, - "Interface") -MSG_HASH(MSG_INTERNAL_STORAGE, - "Interne Opslag") -MSG_HASH(MSG_REMOVABLE_STORAGE, - "Removable Storage") -MSG_HASH(MSG_INVALID_NICKNAME_SIZE, - "Invalid nickname size.") -MSG_HASH(MSG_IN_BYTES, - "in bytes") -MSG_HASH(MSG_IN_GIGABYTES, - "in gigabytes") -MSG_HASH(MSG_IN_MEGABYTES, - "in megabytes") -MSG_HASH(MSG_LIBRETRO_ABI_BREAK, - "is compiled against a different version of libretro than this libretro implementation.") -MSG_HASH(MSG_LIBRETRO_FRONTEND, - "Frontend voor libretro") -MSG_HASH(MSG_LOADED_STATE_FROM_SLOT, - "State geladen van slot #%d.") -MSG_HASH(MSG_LOADED_STATE_FROM_SLOT_AUTO, - "State geladen van slot #-1 (auto).") -MSG_HASH(MSG_LOADING, - "Laden") -MSG_HASH(MSG_FIRMWARE, - "Firmware bestanden ontbreken") -MSG_HASH(MSG_LOADING_CONTENT_FILE, - "Loading content file") -MSG_HASH(MSG_LOADING_HISTORY_FILE, - "Loading history file") -MSG_HASH(MSG_LOADING_STATE, - "Loading state") -MSG_HASH(MSG_MEMORY, - "Geheugen") -MSG_HASH(MSG_MOVIE_FILE_IS_NOT_A_VALID_BSV1_FILE, - "Movie file is not a valid BSV1 file.") -MSG_HASH(MSG_MOVIE_FORMAT_DIFFERENT_SERIALIZER_VERSION, - "Movie format seems to have a different serializer version. Will most likely fail.") -MSG_HASH(MSG_MOVIE_PLAYBACK_ENDED, - "Movie playback ended.") -MSG_HASH(MSG_MOVIE_RECORD_STOPPED, - "Stopping movie record.") -MSG_HASH(MSG_NETPLAY_FAILED, - "Failed to initialize netplay.") -MSG_HASH(MSG_NO_CONTENT_STARTING_DUMMY_CORE, - "No content, starting dummy core.") -MSG_HASH(MSG_NO_SAVE_STATE_HAS_BEEN_OVERWRITTEN_YET, - "No save state has been overwritten yet.") -MSG_HASH(MSG_NO_STATE_HAS_BEEN_LOADED_YET, - "No state has been loaded yet.") -MSG_HASH(MSG_OVERRIDES_ERROR_SAVING, - "Error saving overrides.") -MSG_HASH(MSG_OVERRIDES_SAVED_SUCCESSFULLY, - "Overrides saved successfully.") -MSG_HASH(MSG_PAUSED, - "Gepauzeerd.") -MSG_HASH(MSG_PROGRAM, - "RetroArch") -MSG_HASH(MSG_READING_FIRST_DATA_TRACK, - "Reading first data track...") -MSG_HASH(MSG_RECEIVED, - "ontvangen") -MSG_HASH(MSG_RECORDING_TERMINATED_DUE_TO_RESIZE, - "Recording terminated due to resize.") -MSG_HASH(MSG_RECORDING_TO, - "Recording to") -MSG_HASH(MSG_REDIRECTING_CHEATFILE_TO, - "Redirecting cheat file to") -MSG_HASH(MSG_REDIRECTING_SAVEFILE_TO, - "Redirecting save file to") -MSG_HASH(MSG_REDIRECTING_SAVESTATE_TO, - "Redirecting savestate to") -MSG_HASH(MSG_REMAP_FILE_SAVED_SUCCESSFULLY, - "Remap file saved successfully.") -MSG_HASH(MSG_REMOVED_DISK_FROM_TRAY, - "Removed disk from tray.") -MSG_HASH(MSG_REMOVING_TEMPORARY_CONTENT_FILE, - "Removing temporary content file") -MSG_HASH(MSG_RESET, - "Reset") -MSG_HASH(MSG_RESTARTING_RECORDING_DUE_TO_DRIVER_REINIT, - "Restarting recording due to driver reinit.") -MSG_HASH(MSG_RESTORED_OLD_SAVE_STATE, - "Restored old save state.") -MSG_HASH(MSG_RESTORING_DEFAULT_SHADER_PRESET_TO, - "Shaders: restoring default shader preset to") -MSG_HASH(MSG_REVERTING_SAVEFILE_DIRECTORY_TO, - "Reverting savefile directory to") -MSG_HASH(MSG_REVERTING_SAVESTATE_DIRECTORY_TO, - "Reverting savestate directory to") -MSG_HASH(MSG_REWINDING, - "Rewinding.") -MSG_HASH(MSG_REWIND_INIT, - "Initializing rewind buffer with size") -MSG_HASH(MSG_REWIND_INIT_FAILED, - "Failed to initialize rewind buffer. Rewinding will be disabled.") -MSG_HASH(MSG_REWIND_INIT_FAILED_THREADED_AUDIO, - "Implementation uses threaded audio. Cannot use rewind.") -MSG_HASH(MSG_REWIND_REACHED_END, - "Reached end of rewind buffer.") -MSG_HASH(MSG_SAVED_NEW_CONFIG_TO, - "Saved new config to") -MSG_HASH(MSG_SAVED_STATE_TO_SLOT, - "Saved state to slot #%d.") -MSG_HASH(MSG_SAVED_STATE_TO_SLOT_AUTO, - "Saved state to slot #-1 (auto).") -MSG_HASH(MSG_SAVED_SUCCESSFULLY_TO, - "Saved successfully to") -MSG_HASH(MSG_SAVING_RAM_TYPE, - "Saving RAM type") -MSG_HASH(MSG_SAVING_STATE, - "Saving state") -MSG_HASH(MSG_SCANNING, - "Scanning") -MSG_HASH(MSG_SCANNING_OF_DIRECTORY_FINISHED, - "Scannen van directory voltooid") -MSG_HASH(MSG_SENDING_COMMAND, - "Sending command") -MSG_HASH(MSG_SEVERAL_PATCHES_ARE_EXPLICITLY_DEFINED, - "Several patches are explicitly defined, ignoring all...") -MSG_HASH(MSG_SHADER, - "Shader") -MSG_HASH(MSG_SHADER_PRESET_SAVED_SUCCESSFULLY, - "Shader preset saved successfully.") -MSG_HASH(MSG_SKIPPING_SRAM_LOAD, - "Skipping SRAM load.") -MSG_HASH(MSG_SLOW_MOTION, - "Slow motion.") -MSG_HASH(MSG_SLOW_MOTION_REWIND, - "Slow motion rewind.") -MSG_HASH(MSG_SRAM_WILL_NOT_BE_SAVED, - "SRAM zal niet opgeslagen worden.") -MSG_HASH(MSG_STARTING_MOVIE_PLAYBACK, - "Starting movie playback.") -MSG_HASH(MSG_STARTING_MOVIE_RECORD_TO, - "Starting movie record to") -MSG_HASH(MSG_STATE_SIZE, - "State size") -MSG_HASH(MSG_STATE_SLOT, - "State slot") -MSG_HASH(MSG_TAKING_SCREENSHOT, - "Schermafdruk maken.") -MSG_HASH(MSG_TO, - "to") -MSG_HASH(MSG_UNDID_LOAD_STATE, - "Laden van state ongedaan gemaakt.") -MSG_HASH(MSG_UNDOING_SAVE_STATE, - "Save state ongedaan maken") -MSG_HASH(MSG_UNKNOWN, - "Onbekend") -MSG_HASH(MSG_UNPAUSED, - "Unpaused.") -MSG_HASH(MSG_UNRECOGNIZED_COMMAND, - "Unrecognized command") -MSG_HASH(MSG_USING_CORE_NAME_FOR_NEW_CONFIG, - "Using core name for new config.") -MSG_HASH(MSG_USING_LIBRETRO_DUMMY_CORE_RECORDING_SKIPPED, - "Using libretro dummy core. Skipping recording.") -MSG_HASH(MSG_VALUE_CONNECT_DEVICE_FROM_A_VALID_PORT, - "Connect device from a valid port.") -MSG_HASH(MSG_VALUE_DISCONNECTING_DEVICE_FROM_PORT, - "Disconnecting device from port") -MSG_HASH(MSG_VALUE_REBOOTING, - "Opnieuw opstarten...") -MSG_HASH(MSG_VALUE_SHUTTING_DOWN, - "Afsluiten...") -MSG_HASH(MSG_VERSION_OF_LIBRETRO_API, - "Versie van libretro API") -MSG_HASH(MSG_VIEWPORT_SIZE_CALCULATION_FAILED, - "Viewport size calculation failed! Will continue using raw data. This will probably not work right ...") -MSG_HASH(MSG_VIRTUAL_DISK_TRAY, - "virtual disk tray.") -MSG_HASH(MENU_ENUM_SUBLABEL_AUDIO_LATENCY, - "Desired audio latency in milliseconds. Might not be honored if the audio driver can't provide given latency.") -MSG_HASH(MENU_ENUM_SUBLABEL_AUDIO_MUTE, - "Mute/unmute audio.") -MSG_HASH( - MENU_ENUM_SUBLABEL_AUDIO_RATE_CONTROL_DELTA, - "Helps smooth out imperfections in timing when synchronizing audio and video at the same time. Be aware that if disabled, proper synchronization is nearly impossible to obtain." - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CAMERA_ALLOW, - "Allow or disallow camera access by cores." - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_LOCATION_ALLOW, - "Allow or disallow location services access by cores." - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_MAX_USERS, - "Maximum amount of users supported by RetroArch." - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_POLL_TYPE_BEHAVIOR, - "Influence how input polling is done inside RetroArch. Setting it to 'Early' or 'Late' can result in less latency, depending on your configuration." - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_ALL_USERS_CONTROL_MENU, - "Allows any user to control the menu. If disabled, only User 1 can control the menu." - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_AUDIO_VOLUME, - "Audio volume (in dB). 0 dB is normal volume, no gain applied." - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_AUDIO_SYNC, - "Synchroniseer audio. Aangeraden." - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_AXIS_THRESHOLD, - "How far an axis must be tilted to result in a button press." - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_BIND_TIMEOUT, - "Amount of seconds to wait until proceeding to the next bind." - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_TURBO_PERIOD, - "Describes the period of which turbo-enabled buttons toggle. Numbers are described in frames." - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_DUTY_CYCLE, - "Describes how long the period of a turbo-enabled button should be. Numbers are described in frames." - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_VIDEO_VSYNC, - "Synchronizes the output video of the graphics card to the refresh rate of the screen. Recommended." - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_VIDEO_ALLOW_ROTATE, - "Allow cores to set rotation. When disabled, rotation requests are ignored. Useful for setups where one manually rotates the screen." - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_DUMMY_ON_CORE_SHUTDOWN, - "Some cores might have a shutdown feature. If enabled, it will prevent the core from shutting RetroArch down. Instead, it loads a dummy core." - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CHECK_FOR_MISSING_FIRMWARE, - "Check if all the required firmware is present before attempting to load content." - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_VIDEO_REFRESH_RATE, - "Verticale refresh rate van je scherm. Wordt gebruikt om een toepasselijke audio input rate te calculeren. LET OP: Deze optie wordt genegeerd als 'Threaded Video' is ingeschakeld." - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_AUDIO_ENABLE, - "Enable audio output." - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_AUDIO_MAX_TIMING_SKEW, - "The maximum change in audio input rate. You may want to increase this to enable very large changes in timing, for example running PAL cores on NTSC displays, at the cost of inaccurate audio pitch." - ) -MSG_HASH( - MSG_FAILED, - "gefaald" - ) -MSG_HASH( - MSG_SUCCEEDED, - "succeeded" - ) -MSG_HASH( - MSG_DEVICE_NOT_CONFIGURED, - "niet geconfigureerd" - ) -MSG_HASH( - MSG_DEVICE_NOT_CONFIGURED_FALLBACK, - "not configured, using fallback" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_DATABASE_CURSOR_LIST, - "Database Cursor List" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_DATABASE_CURSOR_LIST_ENTRY_DEVELOPER, - "Database - Filter : Ontwikkelaar" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_DATABASE_CURSOR_LIST_ENTRY_PUBLISHER, - "Database - Filter : Uitgever" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_DISABLED, - "Uitgeschakeld" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_ENABLED, - "Ingeschakeld" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_CONTENT_HISTORY_PATH, - "Content History Path" - ) -MSG_HASH( - MENU_ENUM_LABEL_DATABASE_CURSOR_LIST_ENTRY_ORIGIN, - "Database - Filter : Origin") -MSG_HASH(MENU_ENUM_LABEL_DATABASE_CURSOR_LIST_ENTRY_FRANCHISE, - "Database - Filter : Franchise") -MSG_HASH(MENU_ENUM_LABEL_DATABASE_CURSOR_LIST_ENTRY_ESRB_RATING, - "Database - Filter : ESRB Rating") -MSG_HASH(MENU_ENUM_LABEL_DATABASE_CURSOR_LIST_ENTRY_ELSPA_RATING, - "Database - Filter : ELSPA Rating") -MSG_HASH(MENU_ENUM_LABEL_DATABASE_CURSOR_LIST_ENTRY_PEGI_RATING, - "Database - Filter : PEGI Rating") -MSG_HASH(MENU_ENUM_LABEL_DATABASE_CURSOR_LIST_ENTRY_CERO_RATING, - "Database - Filter : CERO Rating") -MSG_HASH(MENU_ENUM_LABEL_DATABASE_CURSOR_LIST_ENTRY_BBFC_RATING, - "Database - Filter : BBFC Rating") -MSG_HASH(MENU_ENUM_LABEL_DATABASE_CURSOR_LIST_ENTRY_MAX_USERS, - "Database - Filter : Max Users") -MSG_HASH(MENU_ENUM_LABEL_DATABASE_CURSOR_LIST_ENTRY_RELEASEDATE_BY_MONTH, - "Database - Filter : Releasedate By Month") -MSG_HASH(MENU_ENUM_LABEL_DATABASE_CURSOR_LIST_ENTRY_RELEASEDATE_BY_YEAR, - "Database - Filter : Releasedate By Year") -MSG_HASH(MENU_ENUM_LABEL_DATABASE_CURSOR_LIST_ENTRY_EDGE_MAGAZINE_ISSUE, - "Database - Filter : Edge Magazine Issue") -MSG_HASH(MENU_ENUM_LABEL_DATABASE_CURSOR_LIST_ENTRY_EDGE_MAGAZINE_RATING, - "Database - Filter : Edge Magazine Rating") -MSG_HASH(MENU_ENUM_LABEL_VALUE_DATABASE_CURSOR_LIST_ENTRY_DATABASE_INFO, - "Database Info") -MSG_HASH(MENU_ENUM_SUBLABEL_PAUSE_NONACTIVE, - "Pause gameplay when window focus is lost.") -MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_DISABLE_COMPOSITION, - "Enable or disable composition (Windows only).") -MSG_HASH(MENU_ENUM_SUBLABEL_HISTORY_LIST_ENABLE, - "Enable or disable recent playlist for games, images, music, and videos.") -MSG_HASH(MENU_ENUM_SUBLABEL_CONTENT_HISTORY_SIZE, - "Limit the number of entries in recent playlist for games, images, music, and videos.") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_UNIFIED_MENU_CONTROLS, - "Unified Menu Controls") -MSG_HASH(MENU_ENUM_SUBLABEL_INPUT_UNIFIED_MENU_CONTROLS, - "Use the same controls for both the menu and the game. Applies to the keyboard.") -MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_FONT_ENABLE, - "Show onscreen messages.") -MSG_HASH( - MENU_ENUM_LABEL_VALUE_BROWSE_URL_LIST, - "Browse URL" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_BROWSE_URL, - "URL Path" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_BROWSE_START, - "Start" - ) -MSG_HASH(MENU_ENUM_LABEL_VALUE_SHADER_PIPELINE_BOKEH, - "Bokeh") -MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_REFRESH_ROOMS, - "Refresh Room List") -MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_ROOM_NICKNAME, - "Nickname: %s") -MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_ROOM_NICKNAME_LAN, - "Nickname (lan): %s") -MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_COMPAT_CONTENT_FOUND, - "Compatible content found") -MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_CROP_OVERSCAN, - "Cuts off a few pixels around the edges of the image customarily left blank by developers which sometimes also contain garbage pixels.") -MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_SMOOTH, - "Adds a slight blur to the image to take the edge off of the hard pixel edges. This option has very little impact on performance.") -MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_FILTER, - "Apply a CPU-powered video filter. NOTE: Might come at a high performance cost. Some video filters might only work for cores that use 32bit or 16bit color.") -MSG_HASH(MENU_ENUM_SUBLABEL_CHEEVOS_USERNAME, - "Input the username of your Retro Achievements account.") -MSG_HASH(MENU_ENUM_SUBLABEL_CHEEVOS_PASSWORD, - "Input the password of your Retro Achievements account.") -MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_NICKNAME, - "Input your user name here. This will be used for netplay sessions, among other things.") -MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_POST_FILTER_RECORD, - "Capture the image after filters (but not shaders) are applied. Your video will look as fancy as what you see on your screen.") -MSG_HASH(MENU_ENUM_SUBLABEL_CORE_LIST, - "Select which core to use.") -MSG_HASH(MENU_ENUM_SUBLABEL_LOAD_CONTENT_LIST, - "Select which content to start.") -MSG_HASH(MENU_ENUM_SUBLABEL_NETWORK_INFORMATION, - "Show network interface(s) and associated IP addresses.") -MSG_HASH(MENU_ENUM_SUBLABEL_SYSTEM_INFORMATION, - "Show information specific to the device.") -MSG_HASH(MENU_ENUM_SUBLABEL_QUIT_RETROARCH, - "Sluit het programma af.") -MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_WINDOW_WIDTH, - "Set the custom width size for the display window. Leaving it at 0 will attempt to scale the window as large as possible.") -MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_WINDOW_HEIGHT, - "Set the custom height size for the display window. Leaving it at 0 will attempt to scale the window as large as possible.") -MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_FULLSCREEN_X, - "Set the custom width size for the non-windowed fullscreen mode. Leaving it at 0 will use the desktop resolution.") -MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_FULLSCREEN_Y, - "Set the custom height size for the non-windowed fullscreen mode. Leaving it at 0 will use the desktop resolution") -MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_MESSAGE_POS_X, - "Specify custom X axis position for onscreen text.") -MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_MESSAGE_POS_Y, - "Specify custom Y axis position for onscreen text.") -MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_FONT_SIZE, - "Specify the font size in points.") -MSG_HASH(MENU_ENUM_SUBLABEL_INPUT_OVERLAY_HIDE_IN_MENU, - "Hide the overlay while inside the menu, and show it again when exiting the menu.") -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_COLLECTION_LIST, - "Scanned content will appear here." - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_VIDEO_SCALE_INTEGER, - "Only scales video in integer steps. The base size depends on system-reported geometry and aspect ratio. If 'Force Aspect' is not set, X/Y will be integer scaled independently." - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_VIDEO_GPU_SCREENSHOT, - "Screenshots output of GPU shaded material if available." - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_VIDEO_ROTATION, - "Forces a certain rotation of the screen. The rotation is added to rotations which the core sets." - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_VIDEO_FORCE_SRGB_DISABLE, - "Forcibly disable sRGB FBO support. Some Intel OpenGL drivers on Windows have video problems with sRGB FBO support if this is enabled. Enabling this can work around it." - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_VIDEO_FULLSCREEN, - "Start in fullscreen. Can be changed at runtime." - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_VIDEO_WINDOWED_FULLSCREEN, - "If fullscreen, prefer using a windowed fullscreen mode." - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_VIDEO_GPU_RECORD, - "Records output of GPU shaded material if available." - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_SAVESTATE_AUTO_INDEX, - "When making a savestate, save state index is automatically increased before it is saved. When loading content, the index will be set to the highest existing index." - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_BLOCK_SRAM_OVERWRITE, - "Block Save RAM from being overwritten when loading save states. Might potentially lead to buggy games." - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_FASTFORWARD_RATIO, - "The maximum rate at which content will be run when using fast forward (e.g., 5.0x for 60 fps content = 300 fps cap). If set to 0.0x, fastforward ratio is unlimited (no FPS cap)." - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_SLOWMOTION_RATIO, - "When in slow motion, content will slow down by the factor specified/set." - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_REWIND_ENABLE, - "Enable rewinding. This will take a performance hit when playing." - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_REWIND_GRANULARITY, - "When rewinding a defined number of frames, you can rewind several frames at a time, increasing the rewind speed." - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_LIBRETRO_LOG_LEVEL, - "Sets log level for cores. If a log level issued by a core is below this value, it is ignored." - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_PERFCNT_ENABLE, - "Enable performance counters for RetroArch (and cores)." - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_SAVESTATE_AUTO_SAVE, - "Automatically makes a savestate at the end of RetroArch's runtime. RetroArch will automatically load this savestate if 'Auto Load State' is enabled." - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_SAVESTATE_AUTO_LOAD, - "Automatically load the auto save state on startup." - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_SAVESTATE_THUMBNAIL_ENABLE, - "Show thumbnails of save states inside the menu." - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_AUTOSAVE_INTERVAL, - "Autosaves the non-volatile Save RAM at a regular interval. This is disabled by default unless set otherwise. The interval is measured in seconds. A value of 0 disables autosave." - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_REMAP_BINDS_ENABLE, - "If enabled, overrides the input binds with the remapped binds set for the current core." - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_AUTODETECT_ENABLE, - "Enable input auto-detection. Will attempt to autoconfigure joypads, Plug-and-Play style." - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_MENU_INPUT_SWAP_OK_CANCEL, - "Swap buttons for OK/Cancel. Disabled is the Japanese button orientation, enabled is the western orientation." - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_PAUSE_LIBRETRO, - "If disabled, the content will keep running in the background when RetroArch's menu is toggled." - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_VIDEO_DRIVER, - "Video driver to use." - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_AUDIO_DRIVER, - "Audio driver to use." - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_DRIVER, - "Input driver to use. Depending on the video driver, it might force a different input driver." - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_JOYPAD_DRIVER, - "Joypad driver to use." - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_AUDIO_RESAMPLER_DRIVER, - "Audio resampler driver to use." - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CAMERA_DRIVER, - "Camera driver to use." - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_LOCATION_DRIVER, - "Location driver to use." - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_MENU_DRIVER, - "Menu driver to use." - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_RECORD_DRIVER, - "Record driver to use." - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_WIFI_DRIVER, - "WiFi driver to use." - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_NAVIGATION_BROWSER_FILTER_SUPPORTED_EXTENSIONS_ENABLE, - "Filter files being shown in filebrowser by supported extensions." - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_MENU_WALLPAPER, - "Select an image to set as menu wallpaper." - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_DYNAMIC_WALLPAPER, - "Dynamically load a new wallpaper depending on context." - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_AUDIO_DEVICE, - "Override the default audio device the audio driver uses. This is driver dependent." - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_AUDIO_DSP_PLUGIN, - "Audio DSP plugin that processes audio before it's sent to the driver." - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_AUDIO_OUTPUT_RATE, - "Audio output sample rate." - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_OVERLAY_OPACITY, - "Opacity of all UI elements of the overlay." - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_OVERLAY_SCALE, - "Scale of all UI elements of the overlay." - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_INPUT_OVERLAY_ENABLE, - "Enable the overlay." - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_OVERLAY_PRESET, - "Select an overlay from the file browser." - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_NETPLAY_IP_ADDRESS, - "The address of the host to connect to." - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_NETPLAY_TCP_UDP_PORT, - "The port of the host IP address. Can be either a TCP or UDP port." - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_NETPLAY_PASSWORD, - "The password for connecting to the netplay host. Used only in host mode." - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_NETPLAY_PUBLIC_ANNOUNCE, - "Whether to announce netplay games publicly. If unset, clients must manually connect rather than using the public lobby." - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_NETPLAY_SPECTATE_PASSWORD, - "The password for connecting to the netplay host with only spectator privileges. Used only in host mode." - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_NETPLAY_START_AS_SPECTATOR, - "Whether to start netplay in spectator mode." - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_NETPLAY_ALLOW_SLAVES, - "Whether to allow connections in slave mode. Slave-mode clients require very little processing power on either side, but will suffer significantly from network latency." - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_NETPLAY_REQUIRE_SLAVES, - "Whether to disallow connections not in slave mode. Not recommended except for very fast networks with very weak machines." - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_NETPLAY_STATELESS_MODE, - "Whether to run netplay in a mode not requiring save states. If set to true, a very fast network is required, but no rewinding is performed, so there will be no netplay jitter." - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_NETPLAY_CHECK_FRAMES, - "The frequency in frames with which netplay will verify that the host and client are in sync." - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_NETPLAY_NAT_TRAVERSAL, - "When hosting, attempt to listen for connections from the public Internet, using UPnP or similar technologies to escape LANs." - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_STDIN_CMD_ENABLE, - "Enable stdin command interface." - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_MOUSE_ENABLE, - "Enable mouse controls inside the menu." - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_POINTER_ENABLE, - "Enable touch controls inside the menu." - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_THUMBNAILS, - "Type of thumbnail to display." - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_TIMEDATE_ENABLE, - "Shows current date and/or time inside the menu." - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_BATTERY_LEVEL_ENABLE, - "Shows current battery level inside the menu." - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_NAVIGATION_WRAPAROUND, - "Wrap-around to beginning and/or end if boundary of list is reached horizontally or vertically." - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_NETPLAY_ENABLE_HOST, - "Enables netplay in host (server) mode." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_ENABLE_CLIENT, - "Enables netplay in client mode.") -MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_DISCONNECT, - "Disconnects an active Netplay connection.") -MSG_HASH(MENU_ENUM_SUBLABEL_SCAN_DIRECTORY, - "Scans a directory for compatible files and add them to the collection.") -MSG_HASH(MENU_ENUM_SUBLABEL_SCAN_FILE, - "Scans a compatible file and add it to the collection.") -MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_SWAP_INTERVAL, - "Uses a custom swap interval for Vsync. Set this to effectively halve monitor refresh rate." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_SORT_SAVEFILES_ENABLE, - "Sort save files in folders named after the core used." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_SORT_SAVESTATES_ENABLE, - "Sort save states in folders named after the core used." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_CLIENT_SWAP_INPUT, - "When being client over netplay, use keybinds for Player 1.") -MSG_HASH(MENU_ENUM_SUBLABEL_CORE_UPDATER_BUILDBOT_URL, - "URL to core updater directory on the Libretro buildbot.") -MSG_HASH(MENU_ENUM_SUBLABEL_BUILDBOT_ASSETS_URL, - "URL to assets updater directory on the Libretro buildbot.") -MSG_HASH(MENU_ENUM_SUBLABEL_CORE_UPDATER_AUTO_EXTRACT_ARCHIVE, - "After downloading, automatically extract files contained in the downloaded archives." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_REFRESH_ROOMS, - "Scan for new rooms.") -MSG_HASH(MENU_ENUM_SUBLABEL_DELETE_ENTRY, - "Remove this entry from the collection.") -MSG_HASH(MENU_ENUM_SUBLABEL_INFORMATION, - "View more information about the content.") -MSG_HASH(MENU_ENUM_SUBLABEL_RUN, - "Start the content.") -MSG_HASH(MENU_ENUM_SUBLABEL_MENU_FILE_BROWSER_SETTINGS, - "Adjusts filebrowser settings.") -MSG_HASH( - MENU_ENUM_SUBLABEL_AUTO_REMAPS_ENABLE, - "Enable customized controls by default at startup." - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_AUTO_OVERRIDES_ENABLE, - "Enable customized configuration by default at startup." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_GAME_SPECIFIC_OPTIONS, - "Enable customized core options by default at startup.") -MSG_HASH(MENU_ENUM_SUBLABEL_CORE_ENABLE, - "Shows current core name inside menu.") -MSG_HASH(MENU_ENUM_SUBLABEL_DATABASE_MANAGER, - "View databases.") -MSG_HASH(MENU_ENUM_SUBLABEL_CURSOR_MANAGER, - "View previous searches.") -MSG_HASH(MENU_ENUM_SUBLABEL_TAKE_SCREENSHOT, - "Captures an image of the screen.") -MSG_HASH( - MENU_ENUM_SUBLABEL_CLOSE_CONTENT, - "Closes the current content. Any unsaved changes might be lost." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_LOAD_STATE, - "Load a saved state from the currently selected slot.") -MSG_HASH(MENU_ENUM_SUBLABEL_SAVE_STATE, - "Save a state to the currently selected slot.") -MSG_HASH(MENU_ENUM_SUBLABEL_RESUME, - "Resume the currently running content and leave the Quick Menu.") -MSG_HASH(MENU_ENUM_SUBLABEL_RESUME_CONTENT, - "Resume the currently running content and leave the Quick Menu.") -MSG_HASH(MENU_ENUM_SUBLABEL_STATE_SLOT, - "Changes the currently selected state slot.") -MSG_HASH(MENU_ENUM_SUBLABEL_UNDO_LOAD_STATE, - "If a state was loaded, content will go back to the state prior to loading.") -MSG_HASH(MENU_ENUM_SUBLABEL_UNDO_SAVE_STATE, - "If a state was overwritten, it will roll back to the previous save state.") -MSG_HASH( - MENU_ENUM_SUBLABEL_ACCOUNTS_RETRO_ACHIEVEMENTS, - "Retro Achievements service. For more information, visit http://retroachievements.org" - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_ACCOUNTS_LIST, - "Manages currently configured accounts." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_INPUT_META_REWIND, - "Manages rewind settings.") -MSG_HASH(MENU_ENUM_SUBLABEL_RESTART_CONTENT, - "Restarts the content from the beginning.") -MSG_HASH(MENU_ENUM_SUBLABEL_SAVE_CURRENT_CONFIG_OVERRIDE_CORE, - "Saves an override configuration file which will apply for all content loaded with this core. Will take precedence over the main configuration.") -MSG_HASH(MENU_ENUM_SUBLABEL_SAVE_CURRENT_CONFIG_OVERRIDE_GAME, - "Saves an override configuration file which will apply for the current content only. Will take precedence over the main configuration.") -MSG_HASH(MENU_ENUM_SUBLABEL_CORE_CHEAT_OPTIONS, - "Set up cheat codes.") -MSG_HASH(MENU_ENUM_SUBLABEL_SHADER_OPTIONS, - "Set up shaders to visually augment the image.") -MSG_HASH(MENU_ENUM_SUBLABEL_CORE_INPUT_REMAPPING_OPTIONS, - "Change the controls for the currently running content.") -MSG_HASH(MENU_ENUM_SUBLABEL_CORE_OPTIONS, - "Change the options for the currently running content.") -MSG_HASH(MENU_ENUM_SUBLABEL_SHOW_ADVANCED_SETTINGS, - "Show advanced settings for power users (hidden by default).") -MSG_HASH(MENU_ENUM_SUBLABEL_THREADED_DATA_RUNLOOP_ENABLE, - "Perform tasks on a separate thread.") -MSG_HASH(MENU_ENUM_SUBLABEL_PLAYLIST_ENTRY_REMOVE, - "Allow the user to remove entries from collections.") -MSG_HASH(MENU_ENUM_SUBLABEL_SYSTEM_DIRECTORY, - "Sets the System directory. Cores can query for this directory to load BIOSes, system-specific configs, etc.") -MSG_HASH(MENU_ENUM_SUBLABEL_RGUI_BROWSER_DIRECTORY, - "Sets start directory for the filebrowser.") -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_DIR, - "Usually set by developers who bundle libretro/RetroArch apps to point to assets." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_DYNAMIC_WALLPAPERS_DIRECTORY, - "Directory to store wallpapers dynamically loaded by the menu depending on context.") -MSG_HASH(MENU_ENUM_SUBLABEL_THUMBNAILS_DIRECTORY, - "Supplementary thumbnails (boxarts/misc. images, etc.) are stored here." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_RGUI_CONFIG_DIRECTORY, - "Sets start directory for menu configuration browser.") -MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_INPUT_LATENCY_FRAMES_MIN, - "The number of frames of input latency for netplay to use to hide network latency. Reduces jitter and makes netplay less CPU-intensive, at the expense of noticeable input lag.") -MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_INPUT_LATENCY_FRAMES_RANGE, - "The range of frames of input latency that may be used to hide network latency. Reduces jitter and makes netplay less CPU-intensive, at the expense of unpredictable input lag.") -MSG_HASH(MENU_ENUM_SUBLABEL_DISK_CYCLE_TRAY_STATUS, - "Cycle the current disk. If the disk is inserted, it will eject the disk. If the disk has not been inserted, it will be inserted. ") -MSG_HASH(MENU_ENUM_SUBLABEL_DISK_INDEX, - "Change the disk index.") -MSG_HASH(MENU_ENUM_SUBLABEL_DISK_OPTIONS, - "Disk image management.") -MSG_HASH(MENU_ENUM_SUBLABEL_DISK_IMAGE_APPEND, - "Select a disk image to insert.") -MSG_HASH(MENU_ENUM_SUBLABEL_MENU_ENUM_THROTTLE_FRAMERATE, - "Makes sure the framerate is capped while inside the menu.") -MSG_HASH(MENU_ENUM_SUBLABEL_XMB_THEME, - "Select a different theme for the icon. Changes will take effect after you restart the program.") -MSG_HASH(MENU_ENUM_SUBLABEL_XMB_SHADOWS_ENABLE, - "Enable drop shadows for all icons. This will have a minor performance hit.") -MSG_HASH(MENU_ENUM_SUBLABEL_MATERIALUI_MENU_COLOR_THEME, - "Select a different background color gradient theme.") -MSG_HASH(MENU_ENUM_SUBLABEL_MENU_WALLPAPER_OPACITY, - "Modify the opacity of the background wallpaper.") -MSG_HASH(MENU_ENUM_SUBLABEL_XMB_MENU_COLOR_THEME, - "Select a different background color gradient theme.") -MSG_HASH(MENU_ENUM_SUBLABEL_XMB_RIBBON_ENABLE, - "Select an animated background effect. Can be GPU-intensive depending on the effect. If performance is unsatisfactory, either turn this off or revert to a simpler effect.") -MSG_HASH(MENU_ENUM_SUBLABEL_XMB_FONT, - "Select a different main font to be used by the menu.") -MSG_HASH(MENU_ENUM_SUBLABEL_XMB_SHOW_IMAGES, - "Show the image tab inside the main menu.") -MSG_HASH(MENU_ENUM_SUBLABEL_XMB_SHOW_MUSIC, - "Show the music tab inside the main menu.") -MSG_HASH(MENU_ENUM_SUBLABEL_XMB_SHOW_VIDEO, - "Show the video tab inside the main menu.") -MSG_HASH(MENU_ENUM_SUBLABEL_XMB_SHOW_NETPLAY, - "Show the netplay tab inside the main menu.") -MSG_HASH(MENU_ENUM_SUBLABEL_XMB_SHOW_SETTINGS, - "Show the settings tab inside the main menu.") -MSG_HASH(MENU_ENUM_SUBLABEL_XMB_SHOW_HISTORY, - "Show the recent history tab inside the main menu.") -MSG_HASH(MENU_ENUM_SUBLABEL_XMB_SHOW_ADD, - "Show the import content tab inside the main menu.") -MSG_HASH(MENU_ENUM_SUBLABEL_RGUI_SHOW_START_SCREEN, - "Show startup screen in menu. This is automatically set to false after the program starts for the first time.") -MSG_HASH(MENU_ENUM_SUBLABEL_MATERIALUI_MENU_HEADER_OPACITY, - "Modify the opacity of the header graphic.") -MSG_HASH(MENU_ENUM_SUBLABEL_MATERIALUI_MENU_FOOTER_OPACITY, - "Modify the opacity of the footer graphic.") -MSG_HASH(MENU_ENUM_SUBLABEL_DPI_OVERRIDE_ENABLE, - "The menu normally scales itself dynamically. If you want to set a specific scaling size instead, enable this.") -MSG_HASH(MENU_ENUM_SUBLABEL_DPI_OVERRIDE_VALUE, - "Set the custom scaling size here. NOTE: You have to enable 'DPI Override' for this scaling size to take effect.") -MSG_HASH(MENU_ENUM_SUBLABEL_CORE_ASSETS_DIRECTORY, - "Save all downloaded files to this directory.") -MSG_HASH(MENU_ENUM_SUBLABEL_INPUT_REMAPPING_DIRECTORY, - "Save all remapped controls to this directory.") -MSG_HASH(MENU_ENUM_SUBLABEL_LIBRETRO_DIR_PATH, - "Directory where the program searches for content/cores.") -MSG_HASH(MENU_ENUM_SUBLABEL_LIBRETRO_INFO_PATH, - "Application/core information files are stored here.") -MSG_HASH(MENU_ENUM_SUBLABEL_JOYPAD_AUTOCONFIG_DIR, - "If a joypad is plugged in, that joypad will be autoconfigured if a config file corresponding to it is present inside this directory.") -MSG_HASH(MENU_ENUM_SUBLABEL_PLAYLIST_DIRECTORY, - "Save all collections to this directory.") -MSG_HASH( - MENU_ENUM_SUBLABEL_CACHE_DIRECTORY, - "If set to a directory, content which is temporarily extracted (e.g. from archives) will be extracted to this directory." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_CURSOR_DIRECTORY, - "Bewaarde queries worden in deze directory opgeslagen.") -MSG_HASH( - MENU_ENUM_SUBLABEL_CONTENT_DATABASE_DIRECTORY, - "Databases worden in deze directory opgeslagen." - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_ASSETS_DIRECTORY, - "This location is queried by default when menu interfaces try to look for loadable assets, etc." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_SAVEFILE_DIRECTORY, - "Save all save files to this directory. If not set, will try to save inside the content file's working directory.") -MSG_HASH(MENU_ENUM_SUBLABEL_SAVESTATE_DIRECTORY, - "Save all save states to this directory. If not set, will try to save inside the content file's working directory.") -MSG_HASH(MENU_ENUM_SUBLABEL_SCREENSHOT_DIRECTORY, - "Directory to dump screenshots to.") -MSG_HASH(MENU_ENUM_SUBLABEL_OVERLAY_DIRECTORY, - "Defines a directory where overlays are kept for easy access.") -MSG_HASH( - MENU_ENUM_SUBLABEL_CHEAT_DATABASE_PATH, - "Cheat files are kept here." - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_AUDIO_FILTER_DIR, - "Directory where audio DSP filter files are kept." - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_VIDEO_FILTER_DIR, - "Directory where CPU-based video filter files are kept." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_SHADER_DIR, - "Defines a directory where GPU-based video shader files are kept for easy access.") -MSG_HASH(MENU_ENUM_SUBLABEL_RECORDING_OUTPUT_DIRECTORY, - "Recordings will be dumped to this directory.") -MSG_HASH(MENU_ENUM_SUBLABEL_RECORDING_CONFIG_DIRECTORY, - "Recording configurations will be kept here.") -MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_FONT_PATH, - "Select a different font for onscreen notifications.") -MSG_HASH(MENU_ENUM_SUBLABEL_SHADER_APPLY_CHANGES, - "Changes to the shader configuration will take effect immediately. Use this if you changed the amount of shader passes, filtering, FBO scale, etc.") -MSG_HASH( - MENU_ENUM_SUBLABEL_VIDEO_SHADER_NUM_PASSES, - "Increase or decrease the amount of shader pipeline passes. You can bind a separate shader to each pipeline pass and configure its scale and filtering." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_SHADER_PRESET, - "Load a shader preset. The shader pipeline will be automatically set-up.") -MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_SHADER_PRESET_SAVE_AS, - "Save the current shader settings as a new shader preset.") -MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_SHADER_PRESET_SAVE_CORE, - "Save the current shader settings as the default settings for this application/core.") -MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_SHADER_PRESET_SAVE_GAME, - "Save the current shader settings as the default settings for the content.") -MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_SHADER_PARAMETERS, - "Modifies the current shader directly. Changes will not be saved to the preset file.") -MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_SHADER_PRESET_PARAMETERS, - "Modifies the shader preset itself currently used in the menu.") -MSG_HASH( - MENU_ENUM_SUBLABEL_CHEAT_NUM_PASSES, - "Increase or decrease the amount of cheats." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_CHEAT_APPLY_CHANGES, - "Cheat changes will take effect immediately.") -MSG_HASH( - MENU_ENUM_SUBLABEL_CHEAT_FILE_LOAD, - "Load a cheat file." - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_CHEAT_FILE_SAVE_AS, - "Save current cheats as a save file." - ) -MSG_HASH(MENU_ENUM_SUBLABEL_CONTENT_SETTINGS, - "Quickly access all relevant in-game settings.") -MSG_HASH(MENU_ENUM_SUBLABEL_CORE_INFORMATION, - "View information pertaining to the application/core.") -MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_ASPECT_RATIO, - "Floating point value for video aspect ratio (width / height), used if the Aspect Ratio is set to 'Config'.") -MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_HEIGHT, - "Custom viewport height that is used if the Aspect Ratio is set to 'Custom'.") -MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_WIDTH, - "Custom viewport width that is used if the Aspect Ratio is set to 'Custom'.") -MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_X, - "Custom viewport offset used for defining the X-axis position of the viewport. These are ignored if 'Integer Scale' is enabled. It will be automatically centered then.") -MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_Y, - "Custom viewport offset used for defining the Y-axis position of the viewport. These are ignored if 'Integer Scale' is enabled. It will be automatically centered then.") -MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_USE_MITM_SERVER, - "Gebruik Relay Server") -MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_USE_MITM_SERVER, - "Forward netplay connections through a man-in-the-middle server. Useful if the host is behind a firewall or has NAT/UPnP problems.") -MSG_HASH(MENU_ENUM_LABEL_VALUE_ADD_TO_MIXER, - "Aan audio mixer toevoegen") -MSG_HASH(MENU_ENUM_LABEL_VALUE_ADD_TO_MIXER_AND_COLLECTION, - "Aan audio mixer toevoegen") -MSG_HASH(MENU_ENUM_LABEL_VALUE_FILTER_BY_CURRENT_CORE, - "Filter by current core") -MSG_HASH( - MSG_AUDIO_MIXER_VOLUME, - "Globale volume voor audio mixer" - ) -MSG_HASH( - MENU_ENUM_SUBLABEL_AUDIO_MIXER_VOLUME, - "Globale volume voor audio mixer (in dB uitgedrukt). 0 dB is het normale geluidsniveau." - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_AUDIO_MIXER_VOLUME, - "Audio Mixer Volume Level (dB)" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_AUDIO_MIXER_MUTE, - "Audio Mixer Mute" - ) -MSG_HASH(MENU_ENUM_SUBLABEL_AUDIO_MIXER_MUTE, - "Mute/unmute mixer audio.") -MSG_HASH(MENU_ENUM_LABEL_MENU_SHOW_ONLINE_UPDATER, - "Online Updater Weergeven") -MSG_HASH(MENU_ENUM_SUBLABEL_MENU_SHOW_ONLINE_UPDATER, - "Show/hide the 'Online Updater' option.") -MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_SHOW_CORE_UPDATER, - "Show Core Updater") -MSG_HASH(MENU_ENUM_SUBLABEL_MENU_SHOW_CORE_UPDATER, - "Show/hide the ability to update cores (and core info files).") -MSG_HASH(MSG_PREPARING_FOR_CONTENT_SCAN, - "Preparing for content scan...") -MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_DELETE, - "Delete core") -MSG_HASH(MENU_ENUM_SUBLABEL_CORE_DELETE, - "Remove this core from disk.") -MSG_HASH(MENU_ENUM_LABEL_VALUE_RENAME_ENTRY, - "Rename the title of the entry.") -MSG_HASH(MENU_ENUM_LABEL_RENAME_ENTRY, - "Rename") -MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_FRAMEBUFFER_OPACITY, - "Framebuffer Opacity") -MSG_HASH(MENU_ENUM_SUBLABEL_MENU_FRAMEBUFFER_OPACITY, - "Modify the opacity of the framebuffer.") -MSG_HASH(MENU_ENUM_LABEL_VALUE_GOTO_FAVORITES, - "Favorites") -MSG_HASH(MENU_ENUM_SUBLABEL_GOTO_FAVORITES, - "Content which you have added to 'Favorites' will appear here.") -MSG_HASH(MENU_ENUM_LABEL_VALUE_GOTO_MUSIC, - "Music") -MSG_HASH(MENU_ENUM_SUBLABEL_GOTO_MUSIC, - "Music which has been previously played will appear here.") -MSG_HASH(MENU_ENUM_LABEL_VALUE_GOTO_IMAGES, - "Image") -MSG_HASH(MENU_ENUM_SUBLABEL_GOTO_IMAGES, - "Images which have been previously viewed will appear here.") -MSG_HASH(MENU_ENUM_LABEL_VALUE_GOTO_VIDEO, - "Video") -MSG_HASH(MENU_ENUM_SUBLABEL_GOTO_VIDEO, - "Videos which have been previously played will appear here.") -MSG_HASH(MENU_ENUM_LABEL_VALUE_MATERIALUI_ICONS_ENABLE, - "Menu Icons") -MSG_HASH(MENU_ENUM_SUBLABEL_MATERIALUI_ICONS_ENABLE, - "Enable/disable the menu icons shown at the lefthand side of the menu entries.") -MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MAIN_MENU_ENABLE_SETTINGS, - "Enable Settings Tab") -MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_SHOW_SETTINGS_PASSWORD, - "Set Password For Enabling Settings Tab") -MSG_HASH(MSG_INPUT_ENABLE_SETTINGS_PASSWORD, - "Enter Password") -MSG_HASH(MSG_INPUT_ENABLE_SETTINGS_PASSWORD_OK, - "Password correct.") -MSG_HASH(MSG_INPUT_ENABLE_SETTINGS_PASSWORD_NOK, - "Password incorrect.") -MSG_HASH(MENU_ENUM_SUBLABEL_XMB_MAIN_MENU_ENABLE_SETTINGS, - "Enables the Settings tab. A restart is required for the tab to appear.") -MSG_HASH(MENU_ENUM_SUBLABEL_XMB_SHOW_SETTINGS_PASSWORD, - "Supplying a password when hiding the settings tab makes it possible to later restore it from the menu, by going to the Main Menu tab, selecting Enable Settings Tab and entering the password.") -MSG_HASH(MENU_ENUM_SUBLABEL_PLAYLIST_ENTRY_RENAME, - "Allow the user to rename entries in collections.") -MSG_HASH(MENU_ENUM_LABEL_VALUE_PLAYLIST_ENTRY_RENAME, - "Allow to rename entries") -MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_SHOW_LOAD_CORE, - "Toon Core Laden") -MSG_HASH(MENU_ENUM_SUBLABEL_MENU_SHOW_LOAD_CORE, - "Toon/verberg de 'Laad Core' optie.") -MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_SHOW_LOAD_CONTENT, - "Toon Laad Inhoud") -MSG_HASH(MENU_ENUM_SUBLABEL_MENU_SHOW_LOAD_CONTENT, - "Toon/verberg de 'Laad Inhoud' optie.") -MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_SHOW_INFORMATION, - "Toon Informatie") -MSG_HASH(MENU_ENUM_SUBLABEL_MENU_SHOW_INFORMATION, - "Toon/verberg de 'Informatie' optie.") -MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_SHOW_CONFIGURATIONS, - "Toon Configuraties") -MSG_HASH(MENU_ENUM_SUBLABEL_MENU_SHOW_CONFIGURATIONS, - "Toon/verberg de 'Configuraties' optie.") -MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_SHOW_HELP, - "Toon Hulp") -MSG_HASH(MENU_ENUM_SUBLABEL_MENU_SHOW_HELP, - "Toon/verberg de 'Hulp' optie.") -MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_SHOW_QUIT_RETROARCH, - "Toon Sluit RetroArch") -MSG_HASH(MENU_ENUM_SUBLABEL_MENU_SHOW_QUIT_RETROARCH, - "Toon/verberg de 'Sluit RetroArch' optie.") -MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_SHOW_REBOOT, - "Toon Herstart") -MSG_HASH(MENU_ENUM_SUBLABEL_MENU_SHOW_REBOOT, - "Toon/verberg de 'Herstart' optie.") -MSG_HASH(MENU_ENUM_LABEL_VALUE_QUICK_MENU_VIEWS_SETTINGS, - "Snelmenu") -MSG_HASH(MENU_ENUM_SUBLABEL_QUICK_MENU_VIEWS_SETTINGS, - "Toon/verberg elementen op the Snelmenu scherm.") -MSG_HASH(MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_TAKE_SCREENSHOT, - "Toon Neem Schermafdruk") -MSG_HASH(MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_TAKE_SCREENSHOT, - "Toon/verberg de 'Neem Schermafdruk' optie.") -MSG_HASH(MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_SAVE_LOAD_STATE, - "Toon Save/Load State") -MSG_HASH(MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_SAVE_LOAD_STATE, - "Toon/verberg de opties voor saving/loading een state.") -MSG_HASH(MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_UNDO_SAVE_LOAD_STATE, - "Toon Save/Load State Ongedaan Maken") -MSG_HASH(MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_UNDO_SAVE_LOAD_STATE, - "Toon/verberg de opties voor saving/loading een state ongedaan te maken.") -MSG_HASH(MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_ADD_TO_FAVORITES, - "Show Add to Favorites") -MSG_HASH(MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_ADD_TO_FAVORITES, - "Show/hide the 'Add to Favorites' option.") -MSG_HASH(MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_OPTIONS, - "Toon Opties") -MSG_HASH(MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_OPTIONS, - "Toon/verberg de 'Opties' optie.") -MSG_HASH(MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_CONTROLS, - "Toon Besturing") -MSG_HASH(MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_CONTROLS, - "Toon/verberg de 'Besturing' optie.") -MSG_HASH(MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_CHEATS, - "Toon Cheats") -MSG_HASH(MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_CHEATS, - "Toon/verberg de 'Cheats' optie.") -MSG_HASH(MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_SHADERS, - "Toon Shaders") -MSG_HASH(MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_SHADERS, - "Toon/verberg de 'Shaders' optie.") -MSG_HASH(MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_SAVE_CORE_OVERRIDES, - "Toon Save Core Overrides") -MSG_HASH(MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_SAVE_CORE_OVERRIDES, - "Toon/verberg de 'Save Core Overrides' optie.") -MSG_HASH(MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_SAVE_GAME_OVERRIDES, - "Toon Save Game Overrides") -MSG_HASH(MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_SAVE_GAME_OVERRIDES, - "Toon/verberg de 'Save Game Overrides' optie.") -MSG_HASH(MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_INFORMATION, - "Toon Informatie") -MSG_HASH(MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_INFORMATION, - "Toon/verberg de 'Informatie' optie.") -MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_DISABLE_KIOSK_MODE, - "Kioskmodus Deactiveren") -MSG_HASH(MENU_ENUM_SUBLABEL_MENU_DISABLE_KIOSK_MODE, - "Disables kiosk mode. A restart is required for the change to take full effect.") -MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_ENABLE_KIOSK_MODE, - "Kioskmodus Activeren") -MSG_HASH(MENU_ENUM_SUBLABEL_MENU_ENABLE_KIOSK_MODE, - "Protects the setup by hiding all configuration related settings.") -MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_KIOSK_MODE_PASSWORD, - "Set Password For Disabling Kiosk Mode") -MSG_HASH(MENU_ENUM_SUBLABEL_MENU_KIOSK_MODE_PASSWORD, - "Supplying a password when enabling kiosk mode makes it possible to later disable it from the menu, by going to the Main Menu, selecting Disable Kiosk Mode and entering the password.") -MSG_HASH(MSG_INPUT_KIOSK_MODE_PASSWORD, - "Enter Password") -MSG_HASH(MSG_INPUT_KIOSK_MODE_PASSWORD_OK, - "Wachtwoord correct.") -MSG_HASH(MSG_INPUT_KIOSK_MODE_PASSWORD_NOK, - "Verkeerde wachtwoord.") diff --git a/network/netplay/netplay_discovery.c b/network/netplay/netplay_discovery.c index e3ad842842..8f9104251b 100644 --- a/network/netplay/netplay_discovery.c +++ b/network/netplay/netplay_discovery.c @@ -60,6 +60,7 @@ struct ad_packet uint32_t header; uint32_t protocol_version; uint32_t port; + char address[NETPLAY_HOST_STR_LEN]; char retroarch_version[NETPLAY_HOST_STR_LEN]; char nick[NETPLAY_HOST_STR_LEN]; char core[NETPLAY_HOST_STR_LEN]; @@ -107,7 +108,7 @@ bool init_netplay_discovery(void) error: if (addr) freeaddrinfo_retro(addr); - RARCH_ERR("Failed to initialize netplay advertisement client socket.\n"); + RARCH_ERR("[discovery] Failed to initialize netplay advertisement client socket.\n"); return false; } @@ -125,6 +126,8 @@ void deinit_netplay_discovery(void) bool netplay_discovery_driver_ctl(enum rarch_netplay_discovery_ctl_state state, void *data) { char port_str[6]; + int k = 0; + int ret; if (lan_ad_client_fd < 0) return false; @@ -136,6 +139,11 @@ bool netplay_discovery_driver_ctl(enum rarch_netplay_discovery_ctl_state state, struct addrinfo hints = {0}, *addr; int canBroadcast = 1; + net_ifinfo_t interfaces; + + if (!net_ifinfo_new(&interfaces)) + return false; + /* Get the broadcast address (IPv4 only for now) */ snprintf(port_str, 6, "%hu", (unsigned short) RARCH_DEFAULT_PORT); if (getaddrinfo_retro("255.255.255.255", port_str, &hints, &addr) < 0) @@ -145,20 +153,28 @@ bool netplay_discovery_driver_ctl(enum rarch_netplay_discovery_ctl_state state, #if defined(SOL_SOCKET) && defined(SO_BROADCAST) if (setsockopt(lan_ad_client_fd, SOL_SOCKET, SO_BROADCAST, (const char *)&canBroadcast, sizeof(canBroadcast)) < 0) - RARCH_WARN("Failed to set netplay discovery port to broadcast.\n"); + RARCH_WARN("[discovery] Failed to set netplay discovery port to broadcast\n"); #endif /* Put together the request */ memcpy((void *) &ad_packet_buffer, "RANQ", 4); ad_packet_buffer.protocol_version = htonl(NETPLAY_PROTOCOL_VERSION); - /* And send it off */ - if (sendto(lan_ad_client_fd, (const char *) &ad_packet_buffer, - 2*sizeof(uint32_t), 0, addr->ai_addr, addr->ai_addrlen) < - (ssize_t) (2*sizeof(uint32_t))) - RARCH_WARN("Failed to send netplay discovery response.\n"); + for (k=0; k < interfaces.size; k++) + { + strlcpy(ad_packet_buffer.address, interfaces.entries[k].host, + NETPLAY_HOST_STR_LEN); + + /* And send it off */ + ret = sendto(lan_ad_client_fd, (const char *) &ad_packet_buffer, + sizeof(struct ad_packet), 0, addr->ai_addr, addr->ai_addrlen); + if (ret < (ssize_t) (2*sizeof(uint32_t))) + RARCH_WARN("[discovery] Failed to send netplay discovery query (error: %d)\n", ret); + } freeaddrinfo_retro(addr); + net_ifinfo_free(&interfaces); + break; } @@ -201,7 +217,7 @@ static bool init_lan_ad_server_socket(netplay_t *netplay, uint16_t port) error: if (addr) freeaddrinfo_retro(addr); - RARCH_ERR("Failed to initialize netplay advertisement socket.\n"); + RARCH_ERR("[discovery] Failed to initialize netplay advertisement socket\n"); return false; } @@ -217,10 +233,13 @@ bool netplay_lan_ad_server(netplay_t *netplay) struct sockaddr their_addr; socklen_t addr_size; rarch_system_info_t *info = NULL; + int ret, k = 0; + char reply_addr[NETPLAY_HOST_STR_LEN], port_str[6]; + struct addrinfo *our_addr, hints = {0}; if (lan_ad_server_fd < 0 && !init_lan_ad_server_socket(netplay, RARCH_DEFAULT_PORT)) return false; - + /* Check for any ad queries */ while (1) { @@ -234,57 +253,101 @@ bool netplay_lan_ad_server(netplay_t *netplay) /* Somebody queried, so check that it's valid */ addr_size = sizeof(their_addr); - if (recvfrom(lan_ad_server_fd, (char*)&ad_packet_buffer, - sizeof(struct ad_packet), 0, &their_addr, &addr_size) >= - (ssize_t) (2*sizeof(uint32_t))) + ret = recvfrom(lan_ad_server_fd, (char*)&ad_packet_buffer, + sizeof(struct ad_packet), 0, &their_addr, &addr_size); + if (ret >= (ssize_t) (2 * sizeof(uint32_t))) { char s[NETPLAY_HOST_STR_LEN]; uint32_t content_crc = 0; /* Make sure it's a valid query */ if (memcmp((void *) &ad_packet_buffer, "RANQ", 4)) + { + RARCH_LOG("[discovery] invalid query\n"); continue; + } /* For this version */ if (ntohl(ad_packet_buffer.protocol_version) != NETPLAY_PROTOCOL_VERSION) - continue; - - info = runloop_get_system_info(); - - /* Now build our response */ - content_crc = content_get_crc(); - - memset(&ad_packet_buffer, 0, sizeof(struct ad_packet)); - memcpy(&ad_packet_buffer, "RANS", 4); - - ad_packet_buffer.protocol_version = - htonl(NETPLAY_PROTOCOL_VERSION); - ad_packet_buffer.port = htonl(netplay->tcp_port); - strlcpy(ad_packet_buffer.retroarch_version, PACKAGE_VERSION, - NETPLAY_HOST_STR_LEN); - strlcpy(ad_packet_buffer.content, !string_is_empty( - path_basename(path_get(RARCH_PATH_BASENAME))) - ? path_basename(path_get(RARCH_PATH_BASENAME)) : "N/A", - NETPLAY_HOST_LONGSTR_LEN); - strlcpy(ad_packet_buffer.nick, netplay->nick, NETPLAY_HOST_STR_LEN); - - if (info) { - strlcpy(ad_packet_buffer.core, info->info.library_name, - NETPLAY_HOST_STR_LEN); - strlcpy(ad_packet_buffer.core_version, info->info.library_version, - NETPLAY_HOST_STR_LEN); + RARCH_LOG("[discovery] invalid protocol version\n"); + continue; } - snprintf(s, sizeof(s), "%d", content_crc); - strlcpy(ad_packet_buffer.content_crc, s, - NETPLAY_HOST_STR_LEN); + strlcpy(reply_addr, ad_packet_buffer.address, NETPLAY_HOST_STR_LEN); - /* And send it */ - sendto(lan_ad_server_fd, (const char*)&ad_packet_buffer, - sizeof(struct ad_packet), 0, &their_addr, addr_size); + net_ifinfo_t interfaces; + + if (!net_ifinfo_new(&interfaces)) + return false; + + for (k = 0; k < interfaces.size; k++) + { + char *p; + char sub[NETPLAY_HOST_STR_LEN]; + + p=strrchr(reply_addr,'.'); + if (p) + { + strlcpy(sub, reply_addr, p - reply_addr + 1); + if (strstr(interfaces.entries[k].host, sub) && + !strstr(interfaces.entries[k].host, "127.0.0.1")) + { + RARCH_LOG ("[discovery] query received on common interface: %s/%s (theirs / ours) \n", + reply_addr, interfaces.entries[k].host); + + info = runloop_get_system_info(); + + /* Now build our response */ + content_crc = content_get_crc(); + + memset(&ad_packet_buffer, 0, sizeof(struct ad_packet)); + memcpy(&ad_packet_buffer, "RANS", 4); + + strlcpy(ad_packet_buffer.address, interfaces.entries[k].host, + NETPLAY_HOST_STR_LEN); + ad_packet_buffer.protocol_version = + htonl(NETPLAY_PROTOCOL_VERSION); + ad_packet_buffer.port = htonl(netplay->tcp_port); + strlcpy(ad_packet_buffer.retroarch_version, PACKAGE_VERSION, + NETPLAY_HOST_STR_LEN); + strlcpy(ad_packet_buffer.content, !string_is_empty( + path_basename(path_get(RARCH_PATH_BASENAME))) + ? path_basename(path_get(RARCH_PATH_BASENAME)) : "N/A", + NETPLAY_HOST_LONGSTR_LEN); + strlcpy(ad_packet_buffer.nick, netplay->nick, NETPLAY_HOST_STR_LEN); + + if (info) + { + strlcpy(ad_packet_buffer.core, info->info.library_name, + NETPLAY_HOST_STR_LEN); + strlcpy(ad_packet_buffer.core_version, info->info.library_version, + NETPLAY_HOST_STR_LEN); + } + + snprintf(s, sizeof(s), "%d", content_crc); + strlcpy(ad_packet_buffer.content_crc, s, + NETPLAY_HOST_STR_LEN); + + /* Build up the destination address*/ + snprintf(port_str, 6, "%hu", ntohs(((struct sockaddr_in*)(&their_addr))->sin_port)); + if (getaddrinfo_retro(reply_addr, port_str, &hints, &our_addr) < 0) + continue; + RARCH_LOG ("[discovery] sending reply to %s \n", reply_addr); + + /* And send it */ + sendto(lan_ad_server_fd, (const char*)&ad_packet_buffer, + sizeof(struct ad_packet), 0, our_addr->ai_addr, our_addr->ai_addrlen); + } + else + continue; + } + else + continue; + } } + } return true; @@ -350,7 +413,7 @@ static bool netplay_lan_ad_client(void) { struct sockaddr_in *sin = NULL; - RARCH_WARN ("[lobby] using IPv4 for discovery\n"); + RARCH_WARN ("[discovery] using IPv4 for discovery\n"); sin = (struct sockaddr_in *) &their_addr; sin->sin_port = htons(ntohl(ad_packet_buffer.port)); @@ -359,7 +422,7 @@ static bool netplay_lan_ad_client(void) else if (their_addr.sa_family == AF_INET6) { struct sockaddr_in6 *sin6 = NULL; - RARCH_WARN ("[lobby] using IPv6 for discovery\n"); + RARCH_WARN ("[discovery] using IPv6 for discovery\n"); sin6 = (struct sockaddr_in6 *) &their_addr; sin6->sin6_port = htons(ad_packet_buffer.port); @@ -402,6 +465,9 @@ static bool netplay_lan_ad_client(void) host->addr = their_addr; host->addrlen = addr_size; + host->port = ntohl(ad_packet_buffer.port); + + strlcpy(host->address, ad_packet_buffer.address, NETPLAY_HOST_STR_LEN); strlcpy(host->nick, ad_packet_buffer.nick, NETPLAY_HOST_STR_LEN); strlcpy(host->core, ad_packet_buffer.core, NETPLAY_HOST_STR_LEN); strlcpy(host->retroarch_version, ad_packet_buffer.retroarch_version, diff --git a/network/netplay/netplay_discovery.h b/network/netplay/netplay_discovery.h index 2260e7d6d6..57bb153f97 100644 --- a/network/netplay/netplay_discovery.h +++ b/network/netplay/netplay_discovery.h @@ -18,6 +18,7 @@ #define __RARCH_NETPLAY_DISCOVERY_H #include +#include #include #define NETPLAY_HOST_STR_LEN 32 @@ -36,12 +37,14 @@ struct netplay_host struct sockaddr addr; socklen_t addrlen; + char address[NETPLAY_HOST_STR_LEN]; char nick[NETPLAY_HOST_STR_LEN]; char core[NETPLAY_HOST_STR_LEN]; char core_version[NETPLAY_HOST_STR_LEN]; char retroarch_version[NETPLAY_HOST_STR_LEN]; char content[NETPLAY_HOST_LONGSTR_LEN]; int content_crc; + int port; }; struct netplay_host_list diff --git a/network/netplay/netplay_init.c b/network/netplay/netplay_init.c index e6f4a4ac8e..cae0ddda37 100644 --- a/network/netplay/netplay_init.c +++ b/network/netplay/netplay_init.c @@ -184,7 +184,11 @@ static bool init_tcp_socket(netplay_t *netplay, void *direct_host, while (tmp_info) { struct sockaddr_storage sad; - int fd = init_tcp_connection( + int fd; + + memset(&sad, 0, sizeof(sad)); + + fd = init_tcp_connection( tmp_info, direct_host || server, (struct sockaddr*)&sad, diff --git a/pkg/android/phoenix/AndroidManifest.xml b/pkg/android/phoenix/AndroidManifest.xml index 5d82f1b08c..a892856fc3 100644 --- a/pkg/android/phoenix/AndroidManifest.xml +++ b/pkg/android/phoenix/AndroidManifest.xml @@ -2,7 +2,7 @@ diff --git a/pkg/android/phoenix/jni/Android.mk b/pkg/android/phoenix/jni/Android.mk index 5dc1c23765..62d8cefa5f 100644 --- a/pkg/android/phoenix/jni/Android.mk +++ b/pkg/android/phoenix/jni/Android.mk @@ -68,7 +68,7 @@ else DEFINES += -DHAVE_OPENGLES2 endif -DEFINES += -DRARCH_MOBILE -DHAVE_GRIFFIN -DHAVE_STB_VORBIS -DHAVE_LANGEXTRA -DANDROID -DHAVE_DYNAMIC -DHAVE_OPENGL -DHAVE_FBO -DHAVE_OVERLAY -DHAVE_OPENGLES -DGLSL_DEBUG -DHAVE_DYLIB -DHAVE_EGL -DHAVE_GLSL -DHAVE_MENU -DHAVE_RGUI -DHAVE_ZLIB -DHAVE_RPNG -DHAVE_RJPEG -DHAVE_RBMP -DHAVE_RTGA -DINLINE=inline -DHAVE_THREADS -D__LIBRETRO__ -DHAVE_RSOUND -DHAVE_NETWORKGAMEPAD -DHAVE_NETWORKING -DRARCH_INTERNAL -DHAVE_FILTERS_BUILTIN -DHAVE_MATERIALUI -DHAVE_XMB -DHAVE_SHADERPIPELINE -DHAVE_LIBRETRODB -DHAVE_STB_FONT -DHAVE_IMAGEVIEWER -DHAVE_UPDATE_ASSETS -DHAVE_CC_RESAMPLER -DHAVE_MINIUPNPC -DHAVE_BUILTINMINIUPNPC -DMINIUPNPC_SET_SOCKET_TIMEOUT -DMINIUPNPC_GET_SRC_ADDR -DHAVE_KEYMAPPER -DHAVE_NETWORKGAMEPAD -DHAVE_FLAC -DHAVE_CHD +DEFINES += -DRARCH_MOBILE -DHAVE_GRIFFIN -DHAVE_STB_VORBIS -DHAVE_LANGEXTRA -DANDROID -DHAVE_DYNAMIC -DHAVE_OPENGL -DHAVE_OVERLAY -DHAVE_OPENGLES -DGLSL_DEBUG -DHAVE_DYLIB -DHAVE_EGL -DHAVE_GLSL -DHAVE_MENU -DHAVE_RGUI -DHAVE_ZLIB -DHAVE_RPNG -DHAVE_RJPEG -DHAVE_RBMP -DHAVE_RTGA -DINLINE=inline -DHAVE_THREADS -D__LIBRETRO__ -DHAVE_RSOUND -DHAVE_NETWORKGAMEPAD -DHAVE_NETWORKING -DRARCH_INTERNAL -DHAVE_FILTERS_BUILTIN -DHAVE_MATERIALUI -DHAVE_XMB -DHAVE_SHADERPIPELINE -DHAVE_LIBRETRODB -DHAVE_STB_FONT -DHAVE_IMAGEVIEWER -DHAVE_UPDATE_ASSETS -DHAVE_CC_RESAMPLER -DHAVE_MINIUPNPC -DHAVE_BUILTINMINIUPNPC -DMINIUPNPC_SET_SOCKET_TIMEOUT -DMINIUPNPC_GET_SRC_ADDR -DHAVE_KEYMAPPER -DHAVE_NETWORKGAMEPAD -DHAVE_FLAC -DHAVE_CHD DEFINES += -DWANT_IFADDRS ifeq ($(HAVE_VULKAN),1) @@ -89,10 +89,14 @@ LOCAL_CFLAGS := $(subst -O3,-O2,$(LOCAL_CFLAGS)) LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -landroid -lEGL $(GLES_LIB) $(LOGGER_LDLIBS) -ldl LOCAL_C_INCLUDES := \ $(LOCAL_PATH)/$(RARCH_DIR)/libretro-common/include/ \ - $(LOCAL_PATH)/$(RARCH_DIR)/deps + $(LOCAL_PATH)/$(RARCH_DIR)/deps \ + $(LOCAL_PATH)/$(RARCH_DIR)/deps/stb \ + $(LOCAL_PATH)/$(RARCH_DIR)/deps/7zip +LOCAL_CFLAGS += -I$(LOCAL_PATH)/$(DEPS_DIR)/stb/ LOCAL_CFLAGS += -I$(LOCAL_PATH)/$(DEPS_DIR)/7zip/ +LOCAL_CXXFLAGS += -I$(LOCAL_PATH)/$(DEPS_DIR)/stb/ LOCAL_CXXFLAGS += -I$(LOCAL_PATH)/$(DEPS_DIR)/7zip/ LOCAL_CFLAGS += -I$(LOCAL_PATH)/$(DEPS_DIR)/libFLAC/include LOCAL_CPPFLAGS += -I$(LOCAL_PATH)/$(DEPS_DIR)/libFLAC/include diff --git a/pkg/apple/RetroArch.xcodeproj/project.pbxproj b/pkg/apple/RetroArch.xcodeproj/project.pbxproj index b97bed305d..62f87cbf8b 100644 --- a/pkg/apple/RetroArch.xcodeproj/project.pbxproj +++ b/pkg/apple/RetroArch.xcodeproj/project.pbxproj @@ -379,6 +379,7 @@ "$(SRCROOT)/../../libretro-common/include", "$(SRCROOT)/../../deps/libFLAC/include", "$(SRCROOT)/../../deps/7zip", + "$(SRCROOT)/../../deps/stb", "$(SRCROOT)/../../deps", ); INFOPLIST_FILE = OSX/Info.plist; @@ -411,6 +412,7 @@ "$(SRCROOT)/../../libretro-common/include", "$(SRCROOT)/../../deps/libFLAC/include", "$(SRCROOT)/../../deps/7zip", + "$(SRCROOT)/../../deps/stb", "$(SRCROOT)/../../deps", ); INFOPLIST_FILE = OSX/Info.plist; @@ -445,6 +447,7 @@ "$(SRCROOT)/../../libretro-common/include", "$(SRCROOT)/../../deps/libFLAC/include", "$(SRCROOT)/../../deps/7zip", + "$(SRCROOT)/../../deps/stb", "$(SRCROOT)/../../deps", ); INFOPLIST_FILE = "$(SRCROOT)/OSX/Info.plist"; @@ -473,6 +476,7 @@ "$(SRCROOT)/../../libretro-common/include", "$(SRCROOT)/../../deps/libFLAC/include", "$(SRCROOT)/../../deps/7zip", + "$(SRCROOT)/../../deps/stb", "$(SRCROOT)/../../deps", ); INFOPLIST_FILE = "$(SRCROOT)/OSX/Info.plist"; @@ -511,7 +515,6 @@ "-DHAVE_MENU", "-DOSX", "-DHAVE_OPENGL", - "-DHAVE_FBO", "-DHAVE_CC_RESAMPLER", "-DHAVE_GLSL", "-DINLINE=inline", @@ -573,7 +576,6 @@ "-DHAVE_MENU", "-DOSX", "-DHAVE_OPENGL", - "-DHAVE_FBO", "-DHAVE_CC_RESAMPLER", "-DHAVE_GLSL", "-DINLINE=inline", diff --git a/pkg/apple/RetroArch_PPC.xcodeproj/project.pbxproj b/pkg/apple/RetroArch_PPC.xcodeproj/project.pbxproj index d6b732a203..1387385b1b 100644 --- a/pkg/apple/RetroArch_PPC.xcodeproj/project.pbxproj +++ b/pkg/apple/RetroArch_PPC.xcodeproj/project.pbxproj @@ -233,6 +233,8 @@ HEADER_SEARCH_PATHS = ( "$(SRCROOT)/../../libretro-common/include", "$(SRCROOT)/../../deps", + "$(SRCROOT)/../../deps/stb", + "$(SRCROOT)/../../deps/libz", "$(SRCROOT)", ); ONLY_ACTIVE_ARCH_PRE_XCODE_3_1 = "$(NATIVE_ARCH)"; @@ -247,6 +249,8 @@ HEADER_SEARCH_PATHS = ( "$(SRCROOT)/../../libretro-common/include", "$(SRCROOT)/../../deps", + "$(SRCROOT)/../../deps/stb", + "$(SRCROOT)/../../deps/libz", "$(SRCROOT)", ); }; @@ -295,7 +299,6 @@ "-DHAVE_MENU", "-DOSX", "-DHAVE_OPENGL", - "-DHAVE_FBO", "-DHAVE_CC_RESAMPLER", "-DHAVE_GLSL", "-DINLINE=inline", @@ -371,7 +374,6 @@ "-DHAVE_MENU", "-DOSX", "-DHAVE_OPENGL", - "-DHAVE_FBO", "-DHAVE_CC_RESAMPLER", "-DHAVE_GLSL", "-DINLINE=inline", diff --git a/pkg/apple/RetroArch_iOS.xcodeproj/project.pbxproj b/pkg/apple/RetroArch_iOS.xcodeproj/project.pbxproj index 9c8093b072..4043e26919 100644 --- a/pkg/apple/RetroArch_iOS.xcodeproj/project.pbxproj +++ b/pkg/apple/RetroArch_iOS.xcodeproj/project.pbxproj @@ -529,6 +529,8 @@ HEADER_SEARCH_PATHS = ( ../../, "../../libretro-common/include", + ../../deps/stb, + ../../deps/libz, ../../deps, ); INFOPLIST_FILE = "RetroArch_iOS9-Info.plist"; @@ -556,7 +558,6 @@ "-DHAVE_LIBRETRODB", "-DIOS", "-DHAVE_OPENGL", - "-DHAVE_FBO", "-DHAVE_OPENGLES", "-DHAVE_OPENGLES2", "-DHAVE_CC_RESAMPLER", @@ -612,6 +613,8 @@ HEADER_SEARCH_PATHS = ( ../../, "../../libretro-common/include", + ../../deps/stb, + ../../deps/libz, ../../deps, ); INFOPLIST_FILE = "RetroArch_iOS9-Info.plist"; @@ -640,7 +643,6 @@ "-DHAVE_LIBRETRODB", "-DIOS", "-DHAVE_OPENGL", - "-DHAVE_FBO", "-DHAVE_OPENGLES", "-DHAVE_OPENGLES2", "-DHAVE_CC_RESAMPLER", @@ -693,7 +695,6 @@ "-DHAVE_LIBRETRODB", "-DIOS", "-DHAVE_OPENGL", - "-DHAVE_FBO", "-DHAVE_OPENGLES", "-DHAVE_OPENGLES2", "-DHAVE_CC_RESAMPLER", @@ -750,6 +751,8 @@ HEADER_SEARCH_PATHS = ( ../../, "../../libretro-common/include", + ../../deps/stb, + ../../deps/libz, ../../deps, ); INFOPLIST_FILE = "$(SRCROOT)/iOS/Info.plist"; @@ -778,7 +781,6 @@ "-DHAVE_LIBRETRODB", "-DIOS", "-DHAVE_OPENGL", - "-DHAVE_FBO", "-DHAVE_OPENGLES", "-DHAVE_OPENGLES2", "-DHAVE_CC_RESAMPLER", @@ -830,6 +832,8 @@ HEADER_SEARCH_PATHS = ( ../../, "../../libretro-common/include", + ../../deps/stb, + ../../deps/libz, ../../deps, ); INFOPLIST_FILE = "$(SRCROOT)/iOS/Info.plist"; @@ -858,7 +862,6 @@ "-DHAVE_LIBRETRODB", "-DIOS", "-DHAVE_OPENGL", - "-DHAVE_FBO", "-DHAVE_OPENGLES", "-DHAVE_OPENGLES2", "-DHAVE_CC_RESAMPLER", @@ -908,7 +911,6 @@ "-DHAVE_LIBRETRODB", "-DIOS", "-DHAVE_OPENGL", - "-DHAVE_FBO", "-DHAVE_OPENGLES", "-DHAVE_OPENGLES2", "-DHAVE_CC_RESAMPLER", @@ -992,7 +994,6 @@ "-DIOS", "-DHAVE_DYNAMIC", "-DHAVE_OPENGL", - "-DHAVE_FBO", "-DHAVE_OPENGLES", "-DHAVE_OPENGLES2", "-DHAVE_CC_RESAMPLER", @@ -1003,7 +1004,6 @@ "-DRARCH_MOBILE", "-std=gnu99", "-DHAVE_COREAUDIO", - "-DHAVE_FBO", "-DHAVE_OVERLAY", "-DHAVE_ZLIB", "-DHAVE_RPNG", @@ -1064,7 +1064,6 @@ "-DIOS", "-DHAVE_DYNAMIC", "-DHAVE_OPENGL", - "-DHAVE_FBO", "-DHAVE_OPENGLES", "-DHAVE_OPENGLES2", "-DHAVE_CC_RESAMPLER", @@ -1075,7 +1074,6 @@ "-DRARCH_MOBILE", "-std=gnu99", "-DHAVE_COREAUDIO", - "-DHAVE_FBO", "-DHAVE_OVERLAY", "-DHAVE_ZLIB", "-DHAVE_RPNG", @@ -1111,6 +1109,8 @@ HEADER_SEARCH_PATHS = ( ../../, "../../libretro-common/include", + ../../deps/stb, + ../../deps/libz, ../../deps, ); INFOPLIST_FILE = "$(SRCROOT)/iOS/Info.plist"; @@ -1138,7 +1138,6 @@ "-DHAVE_LIBRETRODB", "-DIOS", "-DHAVE_OPENGL", - "-DHAVE_FBO", "-DHAVE_OPENGLES", "-DHAVE_OPENGLES2", "-DHAVE_CC_RESAMPLER", @@ -1194,6 +1193,8 @@ HEADER_SEARCH_PATHS = ( ../../, "../../libretro-common/include", + ../../deps/stb, + ../../deps/libz, ../../deps, ); INFOPLIST_FILE = "$(SRCROOT)/iOS/Info.plist"; @@ -1222,7 +1223,6 @@ "-DHAVE_LIBRETRODB", "-DIOS", "-DHAVE_OPENGL", - "-DHAVE_FBO", "-DHAVE_OPENGLES", "-DHAVE_OPENGLES2", "-DHAVE_CC_RESAMPLER", @@ -1275,7 +1275,6 @@ "-DHAVE_LIBRETRODB", "-DIOS", "-DHAVE_OPENGL", - "-DHAVE_FBO", "-DHAVE_OPENGLES", "-DHAVE_OPENGLES2", "-DHAVE_CC_RESAMPLER", diff --git a/pkg/apple/RetroArch_iOS10.xcodeproj/project.pbxproj b/pkg/apple/RetroArch_iOS10.xcodeproj/project.pbxproj index ab56b3e505..460484d528 100644 --- a/pkg/apple/RetroArch_iOS10.xcodeproj/project.pbxproj +++ b/pkg/apple/RetroArch_iOS10.xcodeproj/project.pbxproj @@ -593,6 +593,8 @@ HEADER_SEARCH_PATHS = ( ../../, "../../libretro-common/include", + ../../deps/stb, + ../../deps/libz, ../../deps, ); INFOPLIST_FILE = "RetroArch_iOS9-Info.plist"; @@ -622,7 +624,6 @@ "-DHAVE_LIBRETRODB", "-DIOS", "-DHAVE_OPENGL", - "-DHAVE_FBO", "-DHAVE_OPENGLES", "-DHAVE_OPENGLES2", "-DHAVE_CC_RESAMPLER", @@ -678,6 +679,8 @@ HEADER_SEARCH_PATHS = ( ../../, "../../libretro-common/include", + ../../deps/stb, + ../../deps/libz, ../../deps, ); INFOPLIST_FILE = "RetroArch_iOS9-Info.plist"; @@ -708,7 +711,6 @@ "-DHAVE_LIBRETRODB", "-DIOS", "-DHAVE_OPENGL", - "-DHAVE_FBO", "-DHAVE_OPENGLES", "-DHAVE_OPENGLES2", "-DHAVE_CC_RESAMPLER", @@ -763,7 +765,6 @@ "-DHAVE_LIBRETRODB", "-DIOS", "-DHAVE_OPENGL", - "-DHAVE_FBO", "-DHAVE_OPENGLES", "-DHAVE_OPENGLES2", "-DHAVE_CC_RESAMPLER", @@ -820,6 +821,8 @@ HEADER_SEARCH_PATHS = ( ../../, "../../libretro-common/include", + ../../deps/stb, + ../../deps/libz, ../../deps, ); INFOPLIST_FILE = "$(SRCROOT)/iOS/Info.plist"; @@ -850,7 +853,6 @@ "-DHAVE_LIBRETRODB", "-DIOS", "-DHAVE_OPENGL", - "-DHAVE_FBO", "-DHAVE_OPENGLES", "-DHAVE_OPENGLES2", "-DHAVE_CC_RESAMPLER", @@ -902,6 +904,8 @@ HEADER_SEARCH_PATHS = ( ../../, "../../libretro-common/include", + ../../deps/stb, + ../../deps/libz, ../../deps, ); INFOPLIST_FILE = "$(SRCROOT)/iOS/Info.plist"; @@ -932,7 +936,6 @@ "-DHAVE_LIBRETRODB", "-DIOS", "-DHAVE_OPENGL", - "-DHAVE_FBO", "-DHAVE_OPENGLES", "-DHAVE_OPENGLES2", "-DHAVE_CC_RESAMPLER", @@ -984,7 +987,6 @@ "-DHAVE_LIBRETRODB", "-DIOS", "-DHAVE_OPENGL", - "-DHAVE_FBO", "-DHAVE_OPENGLES", "-DHAVE_OPENGLES2", "-DHAVE_CC_RESAMPLER", @@ -1037,6 +1039,8 @@ HEADER_SEARCH_PATHS = ( ../../, "../../libretro-common/include", + ../../deps/stb, + ../../deps/libz, ../../deps, ); INFOPLIST_FILE = "$(SRCROOT)/iOS/Info.plist"; @@ -1066,7 +1070,6 @@ "-DHAVE_LIBRETRODB", "-DIOS", "-DHAVE_OPENGL", - "-DHAVE_FBO", "-DHAVE_OPENGLES", "-DHAVE_OPENGLES2", "-DHAVE_CC_RESAMPLER", @@ -1122,6 +1125,8 @@ HEADER_SEARCH_PATHS = ( ../../, "../../libretro-common/include", + ../../deps/stb, + ../../deps/libz, ../../deps, ); INFOPLIST_FILE = "$(SRCROOT)/iOS/Info.plist"; @@ -1152,7 +1157,6 @@ "-DHAVE_LIBRETRODB", "-DIOS", "-DHAVE_OPENGL", - "-DHAVE_FBO", "-DHAVE_OPENGLES", "-DHAVE_OPENGLES2", "-DHAVE_CC_RESAMPLER", @@ -1207,7 +1211,6 @@ "-DHAVE_LIBRETRODB", "-DIOS", "-DHAVE_OPENGL", - "-DHAVE_FBO", "-DHAVE_OPENGLES", "-DHAVE_OPENGLES2", "-DHAVE_CC_RESAMPLER", @@ -1297,7 +1300,6 @@ "-DIOS", "-DHAVE_DYNAMIC", "-DHAVE_OPENGL", - "-DHAVE_FBO", "-DHAVE_OPENGLES", "-DHAVE_OPENGLES2", "-DHAVE_CC_RESAMPLER", @@ -1308,7 +1310,6 @@ "-DRARCH_MOBILE", "-std=gnu99", "-DHAVE_COREAUDIO", - "-DHAVE_FBO", "-DHAVE_OVERLAY", "-DHAVE_ZLIB", "-DHAVE_RPNG", @@ -1371,7 +1372,6 @@ "-DIOS", "-DHAVE_DYNAMIC", "-DHAVE_OPENGL", - "-DHAVE_FBO", "-DHAVE_OPENGLES", "-DHAVE_OPENGLES2", "-DHAVE_CC_RESAMPLER", @@ -1382,7 +1382,6 @@ "-DRARCH_MOBILE", "-std=gnu99", "-DHAVE_COREAUDIO", - "-DHAVE_FBO", "-DHAVE_OVERLAY", "-DHAVE_ZLIB", "-DHAVE_RPNG", @@ -1418,6 +1417,8 @@ HEADER_SEARCH_PATHS = ( ../../, "../../libretro-common/include", + ../../deps/stb, + ../../deps/libz, ../../deps, ); INFOPLIST_FILE = "$(SRCROOT)/iOS/Info.plist"; @@ -1447,7 +1448,6 @@ "-DHAVE_LIBRETRODB", "-DIOS", "-DHAVE_OPENGL", - "-DHAVE_FBO", "-DHAVE_OPENGLES", "-DHAVE_OPENGLES2", "-DHAVE_CC_RESAMPLER", @@ -1503,6 +1503,8 @@ HEADER_SEARCH_PATHS = ( ../../, "../../libretro-common/include", + ../../deps/stb, + ../../deps/libz, ../../deps, ); INFOPLIST_FILE = "$(SRCROOT)/iOS/Info.plist"; @@ -1533,7 +1535,6 @@ "-DHAVE_LIBRETRODB", "-DIOS", "-DHAVE_OPENGL", - "-DHAVE_FBO", "-DHAVE_OPENGLES", "-DHAVE_OPENGLES2", "-DHAVE_CC_RESAMPLER", @@ -1588,7 +1589,6 @@ "-DHAVE_LIBRETRODB", "-DIOS", "-DHAVE_OPENGL", - "-DHAVE_FBO", "-DHAVE_OPENGLES", "-DHAVE_OPENGLES2", "-DHAVE_CC_RESAMPLER", diff --git a/pkg/apple/RetroArch_iOS10_static.xcodeproj/project.pbxproj b/pkg/apple/RetroArch_iOS10_static.xcodeproj/project.pbxproj index 3b82fe92f1..a60b3985ef 100644 --- a/pkg/apple/RetroArch_iOS10_static.xcodeproj/project.pbxproj +++ b/pkg/apple/RetroArch_iOS10_static.xcodeproj/project.pbxproj @@ -598,6 +598,8 @@ HEADER_SEARCH_PATHS = ( ../../, "../../libretro-common/include", + ../../deps/stb, + ../../deps/libz, ../../deps, ); INFOPLIST_FILE = "RetroArch_iOS9-Info.plist"; @@ -627,7 +629,6 @@ "-DHAVE_LIBRETRODB", "-DIOS", "-DHAVE_OPENGL", - "-DHAVE_FBO", "-DHAVE_OPENGLES", "-DHAVE_OPENGLES2", "-DHAVE_CC_RESAMPLER", @@ -681,6 +682,8 @@ HEADER_SEARCH_PATHS = ( ../../, "../../libretro-common/include", + ../../deps/stb, + ../../deps/libz, ../../deps, ); INFOPLIST_FILE = "RetroArch_iOS9-Info.plist"; @@ -711,7 +714,6 @@ "-DHAVE_LIBRETRODB", "-DIOS", "-DHAVE_OPENGL", - "-DHAVE_FBO", "-DHAVE_OPENGLES", "-DHAVE_OPENGLES2", "-DHAVE_CC_RESAMPLER", @@ -765,7 +767,6 @@ "-DHAVE_LIBRETRODB", "-DIOS", "-DHAVE_OPENGL", - "-DHAVE_FBO", "-DHAVE_OPENGLES", "-DHAVE_OPENGLES2", "-DHAVE_CC_RESAMPLER", @@ -821,6 +822,8 @@ HEADER_SEARCH_PATHS = ( ../../, "../../libretro-common/include", + ../../deps/stb, + ../../deps/libz, ../../deps, ); INFOPLIST_FILE = "$(SRCROOT)/iOS/Info.plist"; @@ -851,7 +854,6 @@ "-DHAVE_LIBRETRODB", "-DIOS", "-DHAVE_OPENGL", - "-DHAVE_FBO", "-DHAVE_OPENGLES", "-DHAVE_OPENGLES2", "-DHAVE_CC_RESAMPLER", @@ -902,6 +904,8 @@ HEADER_SEARCH_PATHS = ( ../../, "../../libretro-common/include", + ../../deps/stb, + ../../deps/libz, ../../deps, ); INFOPLIST_FILE = "$(SRCROOT)/iOS/Info.plist"; @@ -932,7 +936,6 @@ "-DHAVE_LIBRETRODB", "-DIOS", "-DHAVE_OPENGL", - "-DHAVE_FBO", "-DHAVE_OPENGLES", "-DHAVE_OPENGLES2", "-DHAVE_CC_RESAMPLER", @@ -983,7 +986,6 @@ "-DHAVE_LIBRETRODB", "-DIOS", "-DHAVE_OPENGL", - "-DHAVE_FBO", "-DHAVE_OPENGLES", "-DHAVE_OPENGLES2", "-DHAVE_CC_RESAMPLER", @@ -1035,6 +1037,8 @@ HEADER_SEARCH_PATHS = ( ../../, "../../libretro-common/include", + ../../deps/stb, + ../../deps/libz, ../../deps, ); INFOPLIST_FILE = "$(SRCROOT)/iOS/Info.plist"; @@ -1064,7 +1068,6 @@ "-DHAVE_LIBRETRODB", "-DIOS", "-DHAVE_OPENGL", - "-DHAVE_FBO", "-DHAVE_OPENGLES", "-DHAVE_OPENGLES2", "-DHAVE_CC_RESAMPLER", @@ -1119,6 +1122,8 @@ HEADER_SEARCH_PATHS = ( ../../, "../../libretro-common/include", + ../../deps/stb, + ../../deps/libz, ../../deps, ); INFOPLIST_FILE = "$(SRCROOT)/iOS/Info.plist"; @@ -1149,7 +1154,6 @@ "-DHAVE_LIBRETRODB", "-DIOS", "-DHAVE_OPENGL", - "-DHAVE_FBO", "-DHAVE_OPENGLES", "-DHAVE_OPENGLES2", "-DHAVE_CC_RESAMPLER", @@ -1203,7 +1207,6 @@ "-DHAVE_LIBRETRODB", "-DIOS", "-DHAVE_OPENGL", - "-DHAVE_FBO", "-DHAVE_OPENGLES", "-DHAVE_OPENGLES2", "-DHAVE_CC_RESAMPLER", @@ -1291,7 +1294,6 @@ "-DHAVE_LIBRETRODB", "-DIOS", "-DHAVE_OPENGL", - "-DHAVE_FBO", "-DHAVE_OPENGLES", "-DHAVE_OPENGLES2", "-DHAVE_CC_RESAMPLER", @@ -1302,7 +1304,6 @@ "-DRARCH_MOBILE", "-std=gnu99", "-DHAVE_COREAUDIO", - "-DHAVE_FBO", "-DHAVE_OVERLAY", "-DHAVE_ZLIB", "-DHAVE_RPNG", @@ -1364,7 +1365,6 @@ "-DHAVE_LIBRETRODB", "-DIOS", "-DHAVE_OPENGL", - "-DHAVE_FBO", "-DHAVE_OPENGLES", "-DHAVE_OPENGLES2", "-DHAVE_CC_RESAMPLER", @@ -1375,7 +1375,6 @@ "-DRARCH_MOBILE", "-std=gnu99", "-DHAVE_COREAUDIO", - "-DHAVE_FBO", "-DHAVE_OVERLAY", "-DHAVE_ZLIB", "-DHAVE_RPNG", @@ -1411,6 +1410,8 @@ HEADER_SEARCH_PATHS = ( ../../, "../../libretro-common/include", + ../../deps/stb, + ../../deps/libz, ../../deps, ); INFOPLIST_FILE = "$(SRCROOT)/iOS/Info.plist"; @@ -1440,7 +1441,6 @@ "-DHAVE_LIBRETRODB", "-DIOS", "-DHAVE_OPENGL", - "-DHAVE_FBO", "-DHAVE_OPENGLES", "-DHAVE_OPENGLES2", "-DHAVE_CC_RESAMPLER", @@ -1495,6 +1495,8 @@ HEADER_SEARCH_PATHS = ( ../../, "../../libretro-common/include", + ../../deps/stb, + ../../deps/libz, ../../deps, ); INFOPLIST_FILE = "$(SRCROOT)/iOS/Info.plist"; @@ -1525,7 +1527,6 @@ "-DHAVE_LIBRETRODB", "-DIOS", "-DHAVE_OPENGL", - "-DHAVE_FBO", "-DHAVE_OPENGLES", "-DHAVE_OPENGLES2", "-DHAVE_CC_RESAMPLER", @@ -1579,7 +1580,6 @@ "-DHAVE_LIBRETRODB", "-DIOS", "-DHAVE_OPENGL", - "-DHAVE_FBO", "-DHAVE_OPENGLES", "-DHAVE_OPENGLES2", "-DHAVE_CC_RESAMPLER", diff --git a/pkg/apple/iOS/Makefile b/pkg/apple/iOS/Makefile index a54a8b293d..2c540ad76d 100644 --- a/pkg/apple/iOS/Makefile +++ b/pkg/apple/iOS/Makefile @@ -17,7 +17,7 @@ ${APPLICATION_NAME}_FILES = $(SRC_DIR)/griffin/griffin.c \ $(SRC_DIR)/audio/drivers_resampler/sinc_neon.S \ $(SRC_DIR)/audio/drivers_resampler/cc_resampler_neon.S -COMMON_FLAGS := -DIOS -DHAVE_GRIFFIN -DHAVE_CORELOCATION -DHAVE_NETWORKING -DHAVE_RGUI -DHAVE_MENU -DHAVE_DYNAMIC -DHAVE_OPENGL -DHAVE_FBO -DHAVE_OPENGLES -DHAVE_OPENGLES2 -DHAVE_GLSL -DINLINE=inline -DHAVE_THREADS -D__LIBRETRO__ -DRARCH_MOBILE -std=gnu99 -DHAVE_COREAUDIO -DHAVE_FBO -DHAVE_OVERLAY -DHAVE_ZLIB -DWANT_ZLIB -DSINC_LOWER_QUALITY -DRARCH_INTERNAL -DHAVE_FILTERS_BUILTIN -DHAVE_XMB -D_LZMA_UINT32_IS_ULONG -DHAVE_STRL +COMMON_FLAGS := -DIOS -DHAVE_GRIFFIN -DHAVE_CORELOCATION -DHAVE_NETWORKING -DHAVE_RGUI -DHAVE_MENU -DHAVE_DYNAMIC -DHAVE_OPENGL -DHAVE_OPENGLES -DHAVE_OPENGLES2 -DHAVE_GLSL -DINLINE=inline -DHAVE_THREADS -D__LIBRETRO__ -DRARCH_MOBILE -std=gnu99 -DHAVE_COREAUDIO -DHAVE_OVERLAY -DHAVE_ZLIB -DWANT_ZLIB -DSINC_LOWER_QUALITY -DRARCH_INTERNAL -DHAVE_FILTERS_BUILTIN -DHAVE_XMB -D_LZMA_UINT32_IS_ULONG -DHAVE_STRL COMMON_FLAGS += -DHAVE_AVFOUNDATION COMMON_IOS_FLAGS := -Wno-deprecated-declarations -Wno-error COMMON_IOS_OBJCFLAGS := -fobjc-arc diff --git a/pkg/msvc/RetroArch-360/RetroArch-360.vcxproj b/pkg/msvc/RetroArch-360/RetroArch-360.vcxproj index 3006d90de9..e82bb4d531 100644 --- a/pkg/msvc/RetroArch-360/RetroArch-360.vcxproj +++ b/pkg/msvc/RetroArch-360/RetroArch-360.vcxproj @@ -115,7 +115,7 @@ MultiThreadedDebug _DEBUG;_XBOX;HAVE_XINPUT2;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;RARCH_CONSOLE;HAVE_XUI;HAVE_MENU;HAVE_NETWORKING;HAVE_NETWORKING;HAVE_SOCKET_LEGACY;HAVE_ZLIB;HAVE_RARCH_EXEC;D3DCOMPILE_USEVOIDS;HAVE_GRIFFIN;HAVE_HLSL;HAVE_CC_RESAMPLER;HAVE_D3D9;HAVE_D3D;RARCH_INTERNAL;MSB_FIRST;_XBOX360;WANT_ZLIB;SINC_LOWER_QUALITY;HAVE_XAUDIO;HAVE_RPNG;HAVE_RJPEG;HAVE_THREADS;HAVE_FILTERS_BUILTIN Callcap - $(SolutionDir)\..\..\deps\zlib;$(SolutionDir)\..\..\libretro-common\include;$(SolutionDir)\..\..\;%(AdditionalIncludeDirectories) + $(SolutionDir)\..\..\deps\zlib;$(SolutionDir)\..\..\libretro-common\include;$(SolutionDir)\..\..\deps;$(SolutionDir)\..\..\deps\stb;$(SolutionDir)\..\..\;%(AdditionalIncludeDirectories) true @@ -154,7 +154,7 @@ MultiThreadedDebug _DEBUG;_XBOX;%(PreprocessorDefinitions);HAVE_XINPUT2;_CRT_SECURE_NO_WARNINGS;RARCH_CONSOLE;HAVE_XUI;HAVE_MENU;HAVE_ZLIB;HAVE_RARCH_EXEC;D3DCOMPILE_USEVOIDS;HAVE_GRIFFIN;HAVE_HLSL;HAVE_CC_RESAMPLER;HAVE_D3D9;HAVE_D3D;RARCH_INTERNAL;MSB_FIRST;_XBOX360;WANT_ZLIB;SINC_LOWER_QUALITY;HAVE_RPNG;HAVE_RJPEG;HAVE_THREADS;HAVE_FILTERS_BUILTIN Callcap - $(SolutionDir)\..\..\deps\zlib;$(SolutionDir)\..\..\libretro-common\include;$(SolutionDir)\..\..\;%(AdditionalIncludeDirectories) + $(SolutionDir)\..\..\deps\zlib;$(SolutionDir)\..\..\libretro-common\include;$(SolutionDir)\..\..\deps;$(SolutionDir)\..\..\deps\stb;$(SolutionDir)\..\..\;%(AdditionalIncludeDirectories) true @@ -194,7 +194,7 @@ MultiThreaded NDEBUG;_XBOX;PROFILE;%(PreprocessorDefinitions);HAVE_XINPUT2;_CRT_SECURE_NO_WARNINGS;RARCH_CONSOLE;HAVE_XUI;HAVE_MENU;HAVE_ZLIB;HAVE_RARCH_EXEC;D3DCOMPILE_USEVOIDS;HAVE_GRIFFIN;HAVE_HLSL;HAVE_CC_RESAMPLER;HAVE_D3D9;HAVE_D3D;RARCH_INTERNAL;MSB_FIRST;_XBOX360;WANT_ZLIB;SINC_LOWER_QUALITY;HAVE_XAUDIO;HAVE_RPNG;HAVE_RJPEG;HAVE_THREADS;HAVE_FILTERS_BUILTIN Callcap - $(SolutionDir)\..\..\deps\zlib;$(SolutionDir)\..\..\libretro-common\include;$(SolutionDir)\..\..\;%(AdditionalIncludeDirectories) + $(SolutionDir)\..\..\deps\zlib;$(SolutionDir)\..\..\libretro-common\include;$(SolutionDir)\..\..\deps;$(SolutionDir)\..\..\deps\stb;$(SolutionDir)\..\..\;%(AdditionalIncludeDirectories) true @@ -238,7 +238,7 @@ false MultiThreaded NDEBUG;_XBOX;PROFILE;FASTCAP;%(PreprocessorDefinitions);HAVE_XINPUT2;_CRT_SECURE_NO_WARNINGS;HAVE_ZLIB;HAVE_RARCH_EXEC;D3DCOMPILE_USEVOIDS;HAVE_GRIFFIN;HAVE_HLSL;HAVE_CC_RESAMPLER;HAVE_D3D9;HAVE_D3D;RARCH_INTERNAL;MSB_FIRST;_XBOX360;WANT_ZLIB;SINC_LOWER_QUALITY;HAVE_XUI;HAVE_MENU;HAVE_XAUDIO;HAVE_RPNG;HAVE_RJPEG;HAVE_THREADS;HAVE_FILTERS_BUILTIN - $(SolutionDir)\..\..\deps\zlib;$(SolutionDir)\..\..\libretro-common\include;$(SolutionDir)\..\..\;%(AdditionalIncludeDirectories) + $(SolutionDir)\..\..\deps\zlib;$(SolutionDir)\..\..\libretro-common\include;$(SolutionDir)\..\..\deps;$(SolutionDir)\..\..\deps\stb;$(SolutionDir)\..\..\;%(AdditionalIncludeDirectories) true @@ -280,7 +280,7 @@ false MultiThreaded NDEBUG;_XBOX;%(PreprocessorDefinitions);HAVE_XINPUT2;_CRT_SECURE_NO_WARNINGS;RARCH_CONSOLE=1;HAVE_NETWORKING;HAVE_SOCKET_LEGACY;HAVE_ZLIB;HAVE_RARCH_EXEC;D3DCOMPILE_USEVOIDS;HAVE_GRIFFIN;HAVE_HLSL;HAVE_CC_RESAMPLER;HAVE_D3D9;HAVE_D3D;RARCH_INTERNAL;MSB_FIRST;_XBOX360;WANT_ZLIB;SINC_LOWER_QUALITY;HAVE_XUI;HAVE_MENU;HAVE_XAUDIO;HAVE_RPNG;HAVE_RJPEG;HAVE_THREADS;HAVE_FILTERS_BUILTIN - $(SolutionDir)\..\..\deps\zlib;$(SolutionDir)\..\..\libretro-common\include;$(SolutionDir)\..\..\;%(AdditionalIncludeDirectories) + $(SolutionDir)\..\..\deps\zlib;$(SolutionDir)\..\..\libretro-common\include;$(SolutionDir)\..\..\deps;$(SolutionDir)\..\..\deps\stb;$(SolutionDir)\..\..\;%(AdditionalIncludeDirectories) true @@ -322,7 +322,7 @@ false MultiThreaded NDEBUG;_XBOX;LTCG;%(PreprocessorDefinitions);HAVE_XINPUT2;_CRT_SECURE_NO_WARNINGS;RARCH_CONSOLE;HAVE_XUI;HAVE_MENU;HAVE_NETWORKING;HAVE_SOCKET_LEGACY;HAVE_ZLIB;HAVE_RARCH_EXEC;D3DCOMPILE_USEVOIDS;HAVE_GRIFFIN;HAVE_HLSL;HAVE_CC_RESAMPLER;HAVE_D3D9;HAVE_D3D;RARCH_INTERNAL;MSB_FIRST;_XBOX360;WANT_ZLIB;SINC_LOWER_QUALITY;HAVE_XAUDIO;HAVE_RPNG;HAVE_RJPEG;HAVE_THREADS;HAVE_FILTERS_BUILTIN - $(SolutionDir)\..\..\deps\zlib;$(SolutionDir)\..\..\libretro-common\include;$(SolutionDir)\..\..\;%(AdditionalIncludeDirectories) + $(SolutionDir)\..\..\deps\zlib;$(SolutionDir)\..\..\libretro-common\include;$(SolutionDir)\..\..\deps;$(SolutionDir)\..\..\deps\stb;$(SolutionDir)\..\..\;%(AdditionalIncludeDirectories) true @@ -445,4 +445,4 @@ - \ No newline at end of file + diff --git a/pkg/msvc/RetroArch-Xbox1/RetroArch-Xbox1.vcproj b/pkg/msvc/RetroArch-Xbox1/RetroArch-Xbox1.vcproj index b664a981f7..471c953988 100644 --- a/pkg/msvc/RetroArch-Xbox1/RetroArch-Xbox1.vcproj +++ b/pkg/msvc/RetroArch-Xbox1/RetroArch-Xbox1.vcproj @@ -21,7 +21,7 @@ Name="VCCLCompilerTool" Optimization="3" OptimizeForProcessor="2" - AdditionalIncludeDirectories=""$(SolutionDir)\..\..\libretro-common\include";"$(SolutionDir)\..\..\libretro-common\include\compat\msvc";"$(SolutionDir)\msvc-71";"$(SolutionDir)\..\..\deps\zlib"" + AdditionalIncludeDirectories=""$(SolutionDir)\..\..\libretro-common\include";"$(SolutionDir)\..\..\deps";"$(SolutionDir)\..\..\deps\stb";"$(SolutionDir)\..\..\libretro-common\include\compat\msvc";"$(SolutionDir)\msvc-71";"$(SolutionDir)\..\..\deps\zlib"" PreprocessorDefinitions="_DEBUG;_XBOX;_XBOX1;HAVE_RGUI;HAVE_MENU;RARCH_CONSOLE;HAVE_XINPUT_XBOX1;__STDC_CONSTANT_MACROS;HAVE_ZLIB;HAVE_GRIFFIN;HAVE_RARCH_EXEC;HAVE_DSOUND;HAVE_CC_RESAMPLER;HAVE_D3D;HAVE_D3D8;RARCH_INTERNAL;WANT_ZLIB;SINC_LOWER_QUALITY;HAVE_THREADS;HAVE_FILTERS_BUILTIN" MinimalRebuild="TRUE" BasicRuntimeChecks="0" @@ -71,7 +71,7 @@ Optimization="3" OmitFramePointers="TRUE" OptimizeForProcessor="2" - AdditionalIncludeDirectories=""$(SolutionDir)\..\..\libretro-common\include";"$(SolutionDir)\..\..\libretro-common\include\compat\msvc";"$(SolutionDir)\msvc-71";"$(SolutionDir)\..\..\deps\zlib"" + AdditionalIncludeDirectories=""$(SolutionDir)\..\..\libretro-common\include";"$(SolutionDir)\..\..\deps";"$(SolutionDir)\..\..\deps\stb";"$(SolutionDir)\..\..\libretro-common\include\compat\msvc";"$(SolutionDir)\msvc-71";"$(SolutionDir)\..\..\deps\zlib"" PreprocessorDefinitions="NDEBUG;_XBOX;_XBOX1;HAVE_RGUI;HAVE_MENU;RARCH_CONSOLE;HAVE_XINPUT_XBOX1;__STDC_CONSTANT_MACROS;HAVE_ZLIB;PROFILE;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_RARCH_EXEC;HAVE_DSOUND;HAVE_CC_RESAMPLER;HAVE_D3D;HAVE_D3D8;RARCH_INTERNAL;WANT_ZLIB;SINC_LOWER_QUALITY;HAVE_THREADS;HAVE_FILTERS_BUILTIN" StringPooling="TRUE" RuntimeLibrary="0" @@ -126,7 +126,7 @@ Optimization="3" OmitFramePointers="TRUE" OptimizeForProcessor="2" - AdditionalIncludeDirectories=""$(SolutionDir)\..\..\libretro-common\include";"$(SolutionDir)\..\..\libretro-common\include\compat\msvc";"$(SolutionDir)\msvc-71";"$(SolutionDir)\..\..\deps\zlib"" + AdditionalIncludeDirectories=""$(SolutionDir)\..\..\libretro-common\include";"$(SolutionDir)\..\..\deps";"$(SolutionDir)\..\..\deps\stb";"$(SolutionDir)\..\..\libretro-common\include\compat\msvc";"$(SolutionDir)\msvc-71";"$(SolutionDir)\..\..\deps\zlib"" PreprocessorDefinitions="NDEBUG;_XBOX;_XBOX1;HAVE_RGUI;HAVE_MENU;RARCH_CONSOLE;HAVE_XINPUT_XBOX1;__STDC_CONSTANT_MACROS;HAVE_ZLIB;PROFILE;FASTCAP;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_RARCH_EXEC;HAVE_DSOUND;HAVE_CC_RESAMPLER;HAVE_D3D;HAVE_D3D8;RARCH_INTERNAL;WANT_ZLIB;SINC_LOWER_QUALITY;HAVE_THREADS;HAVE_FILTERS_BUILTIN" StringPooling="TRUE" RuntimeLibrary="0" @@ -187,7 +187,7 @@ OmitFramePointers="TRUE" EnableFiberSafeOptimizations="TRUE" OptimizeForProcessor="2" - AdditionalIncludeDirectories=""$(SolutionDir)\..\..\libretro-common\include";"$(SolutionDir)\..\..\libretro-common\include\compat\msvc";"$(SolutionDir)\msvc-71";"$(SolutionDir)\..\..\deps\zlib"" + AdditionalIncludeDirectories=""$(SolutionDir)\..\..\libretro-common\include";"$(SolutionDir)\..\..\deps";"$(SolutionDir)\..\..\deps\stb";"$(SolutionDir)\..\..\libretro-common\include\compat\msvc";"$(SolutionDir)\msvc-71";"$(SolutionDir)\..\..\deps\zlib"" PreprocessorDefinitions="NDEBUG;_XBOX;_XBOX1;HAVE_RGUI;HAVE_MENU;RARCH_CONSOLE;HAVE_XINPUT_XBOX1;__STDC_CONSTANT_MACROS;HAVE_ZLIB;HAVE_GRIFFIN;HAVE_LANGEXTRA;inline=_inline;HAVE_RARCH_EXEC;HAVE_DSOUND;HAVE_CC_RESAMPLER;HAVE_D3D;HAVE_D3D8;RARCH_INTERNAL;WANT_ZLIB;SINC_LOWER_QUALITY;HAVE_THREADS;HAVE_FILTERS_BUILTIN" StringPooling="TRUE" RuntimeLibrary="0" @@ -240,7 +240,7 @@ Optimization="3" OmitFramePointers="TRUE" OptimizeForProcessor="2" - AdditionalIncludeDirectories=""$(SolutionDir)\..\..\libretro-common\include";"$(SolutionDir)\..\..\libretro-common\include\compat\msvc";"$(SolutionDir)\msvc-71";"$(SolutionDir)\..\..\deps\zlib"" + AdditionalIncludeDirectories=""$(SolutionDir)\..\..\libretro-common\include";"$(SolutionDir)\..\..\deps";"$(SolutionDir)\..\..\deps\stb";"$(SolutionDir)\..\..\libretro-common\include\compat\msvc";"$(SolutionDir)\msvc-71";"$(SolutionDir)\..\..\deps\zlib"" PreprocessorDefinitions="NDEBUG;_XBOX;_XBOX1;HAVE_RGUI;HAVE_MENU;RARCH_CONSOLE;HAVE_XINPUT_XBOX1;__STDC_CONSTANT_MACROS;HAVE_ZLIB;LTCG;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_RARCH_EXEC;HAVE_DSOUND;HAVE_CC_RESAMPLER;HAVE_D3D;HAVE_D3D8;RARCH_INTERNAL;WANT_ZLIB;SINC_LOWER_QUALITY;HAVE_THREADS;HAVE_FILTERS_BUILTIN" StringPooling="TRUE" RuntimeLibrary="0" @@ -299,7 +299,7 @@ OmitFramePointers="TRUE" EnableFiberSafeOptimizations="TRUE" OptimizeForProcessor="2" - AdditionalIncludeDirectories=""$(SolutionDir)\..\..\libretro-common\include";"$(SolutionDir)\..\..\libretro-common\include\compat\msvc";"$(SolutionDir)\msvc-71";"$(SolutionDir)\..\..\deps\zlib"" + AdditionalIncludeDirectories=""$(SolutionDir)\..\..\libretro-common\include";"$(SolutionDir)\..\..\deps";"$(SolutionDir)\..\..\deps\stb";"$(SolutionDir)\..\..\libretro-common\include\compat\msvc";"$(SolutionDir)\msvc-71";"$(SolutionDir)\..\..\deps\zlib"" PreprocessorDefinitions="NDEBUG;_XBOX;_XBOX1;HAVE_RGUI;HAVE_MENU;RARCH_CONSOLE;HAVE_XINPUT_XBOX1;__STDC_CONSTANT_MACROS;HAVE_ZLIB;HAVE_GRIFFIN;HAVE_LANGEXTRA;inline=_inline;HAVE_RARCH_EXEC;HAVE_DSOUND;HAVE_CC_RESAMPLER;HAVE_D3D;HAVE_D3D8;RARCH_INTERNAL;WANT_ZLIB;SINC_LOWER_QUALITY;HAVE_THREADS;HAVE_FILTERS_BUILTIN" StringPooling="TRUE" RuntimeLibrary="0" @@ -352,7 +352,7 @@ Optimization="3" OmitFramePointers="TRUE" OptimizeForProcessor="2" - AdditionalIncludeDirectories=""$(SolutionDir)\..\..\libretro-common\include";"$(SolutionDir)\..\..\libretro-common\include\compat\msvc";"$(SolutionDir)\msvc-71";"$(SolutionDir)\..\..\deps\zlib"" + AdditionalIncludeDirectories=""$(SolutionDir)\..\..\libretro-common\include";"$(SolutionDir)\..\..\deps";"$(SolutionDir)\..\..\deps\stb";"$(SolutionDir)\..\..\libretro-common\include\compat\msvc";"$(SolutionDir)\msvc-71";"$(SolutionDir)\..\..\deps\zlib"" PreprocessorDefinitions="NDEBUG;_XBOX;_XBOX1;HAVE_RGUI;HAVE_MENU;RARCH_CONSOLE;HAVE_XINPUT_XBOX1;__STDC_CONSTANT_MACROS;HAVE_ZLIB;LTCG;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_RARCH_EXEC;HAVE_DSOUND;HAVE_CC_RESAMPLER;HAVE_D3D;HAVE_D3D8;RARCH_INTERNAL;WANT_ZLIB;SINC_LOWER_QUALITY;HAVE_THREADS;HAVE_FILTERS_BUILTIN" StringPooling="TRUE" RuntimeLibrary="0" diff --git a/pkg/msvc/msvc-2003/RetroArch-msvc2003.vcproj b/pkg/msvc/msvc-2003/RetroArch-msvc2003.vcproj index c56868fd42..143fe63efe 100644 --- a/pkg/msvc/msvc-2003/RetroArch-msvc2003.vcproj +++ b/pkg/msvc/msvc-2003/RetroArch-msvc2003.vcproj @@ -20,8 +20,8 @@ Level3 Disabled - WIN32;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D9;HAVE_GLSL;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;_DEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_DINPUT;HAVE_XINPUT;HAVE_XAUDIO;HAVE_DSOUND;HAVE_OPENGL;HAVE_DYLIB;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;HAVE_DYNAMIC;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_RGUI;HAVE_GL_SYNC;HAVE_MENU;HAVE_7ZIP;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT - $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) + WIN32;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D9;HAVE_GLSL;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;_DEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_DINPUT;HAVE_XINPUT;HAVE_XAUDIO;HAVE_DSOUND;HAVE_OPENGL;HAVE_DYLIB;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;HAVE_DYNAMIC;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_RGUI;HAVE_GL_SYNC;HAVE_MENU;HAVE_7ZIP;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT + $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) MultiThreadedDebug CompileAsCpp Fast @@ -201,8 +201,8 @@ Level3 Disabled - WIN32;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D9;HAVE_CG;HAVE_GLSL;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;HAVE_FBO;WANT_ZLIB;_DEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_DINPUT;HAVE_XINPUT;HAVE_XAUDIO;HAVE_DSOUND;HAVE_OPENGL;HAVE_DYLIB;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;HAVE_DYNAMIC;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_RGUI;HAVE_GL_SYNC;HAVE_MENU;HAVE_7ZIP;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT - $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(CG_INC_PATH);$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) + WIN32;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D9;HAVE_CG;HAVE_GLSL;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;WANT_ZLIB;_DEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_DINPUT;HAVE_XINPUT;HAVE_XAUDIO;HAVE_DSOUND;HAVE_OPENGL;HAVE_DYLIB;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;HAVE_DYNAMIC;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_RGUI;HAVE_GL_SYNC;HAVE_MENU;HAVE_7ZIP;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT + $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(CG_INC_PATH);$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) MultiThreadedDebug CompileAsCpp Fast @@ -221,8 +221,8 @@ Level3 Disabled - WIN32;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D9;HAVE_GLSL;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;_DEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_DINPUT;HAVE_XINPUT;HAVE_XAUDIO;HAVE_DSOUND;HAVE_OPENGL;HAVE_DYLIB;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;HAVE_DYNAMIC;_CRT_SECURE_NO_WARNINGS;__SSE__;__SSE2__;__x86_64__;HAVE_OVERLAY;HAVE_RGUI;HAVE_GL_SYNC;HAVE_MENU;HAVE_7ZIP;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT - $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) + WIN32;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D9;HAVE_GLSL;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_ZLIB;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;_DEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_DINPUT;HAVE_XINPUT;HAVE_XAUDIO;HAVE_DSOUND;HAVE_OPENGL;HAVE_DYLIB;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;HAVE_DYNAMIC;_CRT_SECURE_NO_WARNINGS;__SSE__;__SSE2__;__x86_64__;HAVE_OVERLAY;HAVE_RGUI;HAVE_GL_SYNC;HAVE_MENU;HAVE_7ZIP;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT + $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) MultiThreadedDebug CompileAsCpp Fast @@ -240,8 +240,8 @@ Level3 Disabled - WIN32;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D9;HAVE_CG;HAVE_GLSL;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;HAVE_FBO;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;WANT_ZLIB;_DEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_DINPUT;HAVE_XINPUT;HAVE_XAUDIO;HAVE_DSOUND;HAVE_OPENGL;HAVE_DYLIB;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;HAVE_DYNAMIC;_CRT_SECURE_NO_WARNINGS;__SSE__;__SSE2__;__x86_64__;HAVE_OVERLAY;HAVE_RGUI;HAVE_GL_SYNC;HAVE_MENU;HAVE_7ZIP;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT - $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(CG_INC_PATH);$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) + WIN32;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D9;HAVE_CG;HAVE_GLSL;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_ZLIB;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;WANT_ZLIB;_DEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_DINPUT;HAVE_XINPUT;HAVE_XAUDIO;HAVE_DSOUND;HAVE_OPENGL;HAVE_DYLIB;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;HAVE_DYNAMIC;_CRT_SECURE_NO_WARNINGS;__SSE__;__SSE2__;__x86_64__;HAVE_OVERLAY;HAVE_RGUI;HAVE_GL_SYNC;HAVE_MENU;HAVE_7ZIP;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT + $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(CG_INC_PATH);$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) MultiThreadedDebug CompileAsCpp Fast @@ -262,8 +262,8 @@ MaxSpeed true true - WIN32;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D9;HAVE_GLSL;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;NDEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_DINPUT;HAVE_XINPUT;HAVE_XAUDIO;HAVE_DSOUND;HAVE_OPENGL;HAVE_DYLIB;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;HAVE_DYNAMIC;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_MENU;HAVE_RGUI;HAVE_GL_SYNC;HAVE_7ZIP;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT - $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) + WIN32;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D9;HAVE_GLSL;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_ZLIB;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;NDEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_DINPUT;HAVE_XINPUT;HAVE_XAUDIO;HAVE_DSOUND;HAVE_OPENGL;HAVE_DYLIB;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;HAVE_DYNAMIC;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_MENU;HAVE_RGUI;HAVE_GL_SYNC;HAVE_7ZIP;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT + $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) MultiThreaded CompileAsCpp Fast @@ -286,8 +286,8 @@ MaxSpeed true true - WIN32;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D9;HAVE_CG;HAVE_GLSL;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;HAVE_FBO;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;WANT_ZLIB;NDEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_DINPUT;HAVE_XINPUT;HAVE_XAUDIO;HAVE_DSOUND;HAVE_OPENGL;HAVE_DYLIB;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;HAVE_DYNAMIC;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_MENU;HAVE_RGUI;HAVE_GL_SYNC;HAVE_7ZIP;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT - $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(CG_INC_PATH);$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) + WIN32;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D9;HAVE_CG;HAVE_GLSL;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_ZLIB;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;WANT_ZLIB;NDEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_DINPUT;HAVE_XINPUT;HAVE_XAUDIO;HAVE_DSOUND;HAVE_OPENGL;HAVE_DYLIB;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;HAVE_DYNAMIC;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_MENU;HAVE_RGUI;HAVE_GL_SYNC;HAVE_7ZIP;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT + $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(CG_INC_PATH);$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) MultiThreaded CompileAsCpp Fast @@ -311,8 +311,8 @@ MaxSpeed true true - WIN32;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D9;HAVE_GLSL;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;NDEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_DINPUT;HAVE_XINPUT;HAVE_XAUDIO;HAVE_DSOUND;HAVE_OPENGL;HAVE_DYLIB;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;HAVE_DYNAMIC;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;_CRT_SECURE_NO_WARNINGS;__SSE__;__SSE2__;__x86_64__;HAVE_OVERLAY;HAVE_RGUI;HAVE_GL_SYNC;HAVE_MENU;HAVE_7ZIP;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT - $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) + WIN32;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D9;HAVE_GLSL;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_ZLIB;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;NDEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_DINPUT;HAVE_XINPUT;HAVE_XAUDIO;HAVE_DSOUND;HAVE_OPENGL;HAVE_DYLIB;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;HAVE_DYNAMIC;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;_CRT_SECURE_NO_WARNINGS;__SSE__;__SSE2__;__x86_64__;HAVE_OVERLAY;HAVE_RGUI;HAVE_GL_SYNC;HAVE_MENU;HAVE_7ZIP;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT + $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) MultiThreaded CompileAsCpp Fast @@ -335,8 +335,8 @@ MaxSpeed true true - WIN32;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D9;HAVE_CG;HAVE_GLSL;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;HAVE_FBO;NDEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_DINPUT;HAVE_XINPUT;HAVE_XAUDIO;HAVE_DSOUND;HAVE_OPENGL;HAVE_DYLIB;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;HAVE_DYNAMIC;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;WANT_ZLIB;_CRT_SECURE_NO_WARNINGS;__SSE__;__SSE2__;__x86_64__;HAVE_OVERLAY;HAVE_RGUI;HAVE_GL_SYNC;HAVE_MENU;HAVE_7ZIP;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT - $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(CG_INC_PATH);$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) + WIN32;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D9;HAVE_CG;HAVE_GLSL;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_ZLIB;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;NDEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_DINPUT;HAVE_XINPUT;HAVE_XAUDIO;HAVE_DSOUND;HAVE_OPENGL;HAVE_DYLIB;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;HAVE_DYNAMIC;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;WANT_ZLIB;_CRT_SECURE_NO_WARNINGS;__SSE__;__SSE2__;__x86_64__;HAVE_OVERLAY;HAVE_RGUI;HAVE_GL_SYNC;HAVE_MENU;HAVE_7ZIP;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT + $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(CG_INC_PATH);$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) MultiThreaded CompileAsCpp Fast @@ -367,4 +367,4 @@ - \ No newline at end of file + diff --git a/pkg/msvc/msvc-2015/RetroArch-msvc2015.vcxproj b/pkg/msvc/msvc-2015/RetroArch-msvc2015.vcxproj index f15006a3d6..20411f8586 100644 --- a/pkg/msvc/msvc-2015/RetroArch-msvc2015.vcxproj +++ b/pkg/msvc/msvc-2015/RetroArch-msvc2015.vcxproj @@ -190,8 +190,8 @@ Level3 Disabled - WIN32;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D9;HAVE_GLSL;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;_DEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_DINPUT;HAVE_XINPUT;HAVE_XAUDIO;HAVE_DSOUND;HAVE_OPENGL;HAVE_DYLIB;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;HAVE_DYNAMIC;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_RGUI;HAVE_GL_SYNC;HAVE_MENU;HAVE_7ZIP;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT - $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) + WIN32;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D9;HAVE_GLSL;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;_DEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_DINPUT;HAVE_XINPUT;HAVE_XAUDIO;HAVE_DSOUND;HAVE_OPENGL;HAVE_DYLIB;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;HAVE_DYNAMIC;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_RGUI;HAVE_GL_SYNC;HAVE_MENU;HAVE_7ZIP;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT + $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) MultiThreadedDebug CompileAsCpp Fast @@ -209,8 +209,8 @@ Level3 Disabled - WIN32;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D9;HAVE_CG;HAVE_GLSL;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;HAVE_FBO;WANT_ZLIB;_DEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_DINPUT;HAVE_XINPUT;HAVE_XAUDIO;HAVE_DSOUND;HAVE_OPENGL;HAVE_DYLIB;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;HAVE_DYNAMIC;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_RGUI;HAVE_GL_SYNC;HAVE_MENU;HAVE_7ZIP;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT - $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(CG_INC_PATH);$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) + WIN32;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D9;HAVE_CG;HAVE_GLSL;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;WANT_ZLIB;_DEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_DINPUT;HAVE_XINPUT;HAVE_XAUDIO;HAVE_DSOUND;HAVE_OPENGL;HAVE_DYLIB;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;HAVE_DYNAMIC;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_RGUI;HAVE_GL_SYNC;HAVE_MENU;HAVE_7ZIP;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT + $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(CG_INC_PATH);$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) MultiThreadedDebug CompileAsCpp Fast @@ -229,8 +229,8 @@ Level3 Disabled - WIN32;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D9;HAVE_GLSL;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;_DEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_DINPUT;HAVE_XINPUT;HAVE_XAUDIO;HAVE_DSOUND;HAVE_OPENGL;HAVE_DYLIB;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;HAVE_DYNAMIC;_CRT_SECURE_NO_WARNINGS;__SSE__;__SSE2__;__x86_64__;HAVE_OVERLAY;HAVE_RGUI;HAVE_GL_SYNC;HAVE_MENU;HAVE_7ZIP;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT - $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) + WIN32;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D9;HAVE_GLSL;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_ZLIB;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;_DEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_DINPUT;HAVE_XINPUT;HAVE_XAUDIO;HAVE_DSOUND;HAVE_OPENGL;HAVE_DYLIB;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;HAVE_DYNAMIC;_CRT_SECURE_NO_WARNINGS;__SSE__;__SSE2__;__x86_64__;HAVE_OVERLAY;HAVE_RGUI;HAVE_GL_SYNC;HAVE_MENU;HAVE_7ZIP;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT + $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) MultiThreadedDebug CompileAsCpp Fast @@ -248,8 +248,8 @@ Level3 Disabled - WIN32;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D9;HAVE_CG;HAVE_GLSL;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;HAVE_FBO;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;WANT_ZLIB;_DEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_DINPUT;HAVE_XINPUT;HAVE_XAUDIO;HAVE_DSOUND;HAVE_OPENGL;HAVE_DYLIB;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;HAVE_DYNAMIC;_CRT_SECURE_NO_WARNINGS;__SSE__;__SSE2__;__x86_64__;HAVE_OVERLAY;HAVE_RGUI;HAVE_GL_SYNC;HAVE_MENU;HAVE_7ZIP;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT - $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(CG_INC_PATH);$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) + WIN32;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D9;HAVE_CG;HAVE_GLSL;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_ZLIB;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;WANT_ZLIB;_DEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_DINPUT;HAVE_XINPUT;HAVE_XAUDIO;HAVE_DSOUND;HAVE_OPENGL;HAVE_DYLIB;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;HAVE_DYNAMIC;_CRT_SECURE_NO_WARNINGS;__SSE__;__SSE2__;__x86_64__;HAVE_OVERLAY;HAVE_RGUI;HAVE_GL_SYNC;HAVE_MENU;HAVE_7ZIP;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT + $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(CG_INC_PATH);$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) MultiThreadedDebug CompileAsCpp Fast @@ -270,8 +270,8 @@ MaxSpeed true true - WIN32;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D9;HAVE_GLSL;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;NDEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_DINPUT;HAVE_XINPUT;HAVE_XAUDIO;HAVE_DSOUND;HAVE_OPENGL;HAVE_DYLIB;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;HAVE_DYNAMIC;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_MENU;HAVE_RGUI;HAVE_GL_SYNC;HAVE_7ZIP;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT - $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) + WIN32;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D9;HAVE_GLSL;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_ZLIB;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;NDEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_DINPUT;HAVE_XINPUT;HAVE_XAUDIO;HAVE_DSOUND;HAVE_OPENGL;HAVE_DYLIB;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;HAVE_DYNAMIC;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_MENU;HAVE_RGUI;HAVE_GL_SYNC;HAVE_7ZIP;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT + $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) MultiThreaded CompileAsCpp Fast @@ -294,8 +294,8 @@ MaxSpeed true true - WIN32;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D9;HAVE_CG;HAVE_GLSL;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;HAVE_FBO;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;WANT_ZLIB;NDEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_DINPUT;HAVE_XINPUT;HAVE_XAUDIO;HAVE_DSOUND;HAVE_OPENGL;HAVE_DYLIB;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;HAVE_DYNAMIC;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_MENU;HAVE_RGUI;HAVE_GL_SYNC;HAVE_7ZIP;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT - $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(CG_INC_PATH);$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) + WIN32;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D9;HAVE_CG;HAVE_GLSL;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_ZLIB;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;WANT_ZLIB;NDEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_DINPUT;HAVE_XINPUT;HAVE_XAUDIO;HAVE_DSOUND;HAVE_OPENGL;HAVE_DYLIB;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;HAVE_DYNAMIC;_CRT_NONSTDC_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;__SSE__;__i686__;HAVE_OVERLAY;HAVE_MENU;HAVE_RGUI;HAVE_GL_SYNC;HAVE_7ZIP;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT + $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(CG_INC_PATH);$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) MultiThreaded CompileAsCpp Fast @@ -319,8 +319,8 @@ MaxSpeed true true - WIN32;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D9;HAVE_GLSL;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;NDEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_DINPUT;HAVE_XINPUT;HAVE_XAUDIO;HAVE_DSOUND;HAVE_OPENGL;HAVE_DYLIB;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;HAVE_DYNAMIC;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;_CRT_SECURE_NO_WARNINGS;__SSE__;__SSE2__;__x86_64__;HAVE_OVERLAY;HAVE_RGUI;HAVE_GL_SYNC;HAVE_MENU;HAVE_7ZIP;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT - $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) + WIN32;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D9;HAVE_GLSL;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_ZLIB;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;NDEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_DINPUT;HAVE_XINPUT;HAVE_XAUDIO;HAVE_DSOUND;HAVE_OPENGL;HAVE_DYLIB;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;HAVE_DYNAMIC;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;_CRT_SECURE_NO_WARNINGS;__SSE__;__SSE2__;__x86_64__;HAVE_OVERLAY;HAVE_RGUI;HAVE_GL_SYNC;HAVE_MENU;HAVE_7ZIP;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT + $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) MultiThreaded CompileAsCpp Fast @@ -343,8 +343,8 @@ MaxSpeed true true - WIN32;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D9;HAVE_CG;HAVE_GLSL;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;HAVE_FBO;NDEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_DINPUT;HAVE_XINPUT;HAVE_XAUDIO;HAVE_DSOUND;HAVE_OPENGL;HAVE_DYLIB;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;HAVE_DYNAMIC;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;WANT_ZLIB;_CRT_SECURE_NO_WARNINGS;__SSE__;__SSE2__;__x86_64__;HAVE_OVERLAY;HAVE_RGUI;HAVE_GL_SYNC;HAVE_MENU;HAVE_7ZIP;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT - $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(CG_INC_PATH);$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) + WIN32;RARCH_INTERNAL;HAVE_CC_RESAMPLER;HAVE_UPDATE_ASSETS;HAVE_D3D;HAVE_D3D9;HAVE_CG;HAVE_GLSL;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_ZLIB;HAVE_XMB;HAVE_SHADERPIPELINE;WANT_ZLIB;NDEBUG;_WINDOWS;%(PreprocessorDefinitions);HAVE_DINPUT;HAVE_XINPUT;HAVE_XAUDIO;HAVE_DSOUND;HAVE_OPENGL;HAVE_DYLIB;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_THREADS;HAVE_DYNAMIC;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;WANT_ZLIB;_CRT_SECURE_NO_WARNINGS;__SSE__;__SSE2__;__x86_64__;HAVE_OVERLAY;HAVE_RGUI;HAVE_GL_SYNC;HAVE_MENU;HAVE_7ZIP;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT + $(MSBuildProjectDirectory);$(MSBuildProjectDirectory)\..\..\..\;$(CG_INC_PATH);$(MSBuildProjectDirectory)\..\..\..\deps\zlib;$(MSBuildProjectDirectory)\..\..\..\libretro-common\include;$(MSBuildProjectDirectory)\..\..\..\deps;$(MSBuildProjectDirectory)\..\..\..\deps\stb;$(MSBuildProjectDirectory)\..\..\..\gfx\include;%(AdditionalIncludeDirectories) MultiThreaded CompileAsCpp Fast @@ -375,4 +375,4 @@ - \ No newline at end of file + diff --git a/pkg/msvc/msvc-6/RetroArch/RetroArch.dsp b/pkg/msvc/msvc-6/RetroArch/RetroArch.dsp index af06a1fa67..035a7bea88 100644 --- a/pkg/msvc/msvc-6/RetroArch/RetroArch.dsp +++ b/pkg/msvc/msvc-6/RetroArch/RetroArch.dsp @@ -42,7 +42,7 @@ RSC=rc.exe # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c -# ADD CPP /nologo /w /W0 /GX /O2 /I "../../../../libretro-common/include" /I "../../../../libretro-common/include/compat/msvc" /I "$(ProgramFiles)/Microsoft Platform SDK/include" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D _WIN32_WINNT=0x0351 /D "RARCH_INTERNAL" /D "HAVE_CC_RESAMPLER" /D "HAVE_GRIFFIN" /D "HAVE_FBO" /D "HAVE_ZLIB" /D "HAVE_RPNG" /D "HAVE_RJPEG" /D "HAVE_RBMP" /D "HAVE_RTGA" /D "HAVE_IMAGEVIEWER" /D "HAVE_XMB" /D "WANT_ZLIB" /D "HAVE_DYLIB" /D "HAVE_NETWORK_CMD" /D "HAVE_COMMAND" /D "HAVE_STDIN_CMD" /D "HAVE_THREADS" /D "HAVE_DYNAMIC" /D "HAVE_OVERLAY" /D "HAVE_RGUI" /D "HAVE_MENU" /D "HAVE_7ZIP" /D "HAVE_MATERIALUI" /D "HAVE_LIBRETRODB" /D "HAVE_STB_FONT" /D "__STDC_CONSTANT_MACROS" /YX /FD /c +# ADD CPP /nologo /w /W0 /GX /O2 /I "../../../../libretro-common/include" /I "../../../../libretro-common/include/compat/msvc" /I "../../../../deps" /I "../../../../deps/stb" /I "$(ProgramFiles)/Microsoft Platform SDK/include" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D _WIN32_WINNT=0x0351 /D "RARCH_INTERNAL" /D "HAVE_CC_RESAMPLER" /D "HAVE_GRIFFIN" /D "HAVE_ZLIB" /D "HAVE_RPNG" /D "HAVE_RJPEG" /D "HAVE_RBMP" /D "HAVE_RTGA" /D "HAVE_IMAGEVIEWER" /D "HAVE_XMB" /D "WANT_ZLIB" /D "HAVE_DYLIB" /D "HAVE_NETWORK_CMD" /D "HAVE_COMMAND" /D "HAVE_STDIN_CMD" /D "HAVE_THREADS" /D "HAVE_DYNAMIC" /D "HAVE_OVERLAY" /D "HAVE_RGUI" /D "HAVE_MENU" /D "HAVE_7ZIP" /D "HAVE_MATERIALUI" /D "HAVE_LIBRETRODB" /D "HAVE_STB_FONT" /D "__STDC_CONSTANT_MACROS" /YX /FD /c # SUBTRACT CPP /Fr # ADD BASE RSC /l 0x411 /d "NDEBUG" # ADD RSC /l 0x809 /d "NDEBUG" @@ -68,7 +68,7 @@ LINK32=link.exe # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c -# ADD CPP /nologo /w /W0 /Gm /GX /ZI /Od /I "../../../../libretro-common/include" /I "../../../../libretro-common/include/compat/msvc" /I "$(ProgramFiles)/Microsoft Platform SDK/include" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D _WIN32_WINNT=0x0351 /D "RARCH_INTERNAL" /D "HAVE_CC_RESAMPLER" /D "HAVE_GRIFFIN" /D "HAVE_FBO" /D "HAVE_ZLIB" /D "HAVE_RPNG" /D "HAVE_RJPEG" /D "HAVE_RBMP" /D "HAVE_RTGA" /D "HAVE_IMAGEVIEWER" /D "HAVE_XMB" /D "WANT_ZLIB" /D "HAVE_DYLIB" /D "HAVE_NETWORK_CMD" /D "HAVE_COMMAND" /D "HAVE_STDIN_CMD" /D "HAVE_THREADS" /D "HAVE_DYNAMIC" /D "HAVE_OVERLAY" /D "HAVE_RGUI" /D "HAVE_MENU" /D "HAVE_7ZIP" /D "HAVE_MATERIALUI" /D "HAVE_LIBRETRODB" /D "HAVE_STB_FONT" /D "__STDC_CONSTANT_MACROS" /YX /FD /GZ /c +# ADD CPP /nologo /w /W0 /Gm /GX /ZI /Od /I "../../../../libretro-common/include" /I "../../../../libretro-common/include/compat/msvc" /I "../../../../deps" /I "../../../../deps/stb" /I "$(ProgramFiles)/Microsoft Platform SDK/include" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D _WIN32_WINNT=0x0351 /D "RARCH_INTERNAL" /D "HAVE_CC_RESAMPLER" /D "HAVE_GRIFFIN" /D "HAVE_ZLIB" /D "HAVE_RPNG" /D "HAVE_RJPEG" /D "HAVE_RBMP" /D "HAVE_RTGA" /D "HAVE_IMAGEVIEWER" /D "HAVE_XMB" /D "WANT_ZLIB" /D "HAVE_DYLIB" /D "HAVE_NETWORK_CMD" /D "HAVE_COMMAND" /D "HAVE_STDIN_CMD" /D "HAVE_THREADS" /D "HAVE_DYNAMIC" /D "HAVE_OVERLAY" /D "HAVE_RGUI" /D "HAVE_MENU" /D "HAVE_7ZIP" /D "HAVE_MATERIALUI" /D "HAVE_LIBRETRODB" /D "HAVE_STB_FONT" /D "__STDC_CONSTANT_MACROS" /YX /FD /GZ /c # SUBTRACT CPP /Fr # ADD BASE RSC /l 0x411 /d "_DEBUG" # ADD RSC /l 0x411 /d "_DEBUG" diff --git a/pkg/qnx/.cproject b/pkg/qnx/.cproject index 6953a740c6..c9d2ad9f6e 100644 --- a/pkg/qnx/.cproject +++ b/pkg/qnx/.cproject @@ -55,7 +55,6 @@ - @@ -119,7 +118,6 @@ - @@ -244,7 +242,6 @@ - @@ -308,7 +305,6 @@ - @@ -436,7 +432,6 @@ - @@ -500,7 +495,6 @@ - @@ -625,7 +619,6 @@ - @@ -689,7 +682,6 @@ - diff --git a/playlist.c b/playlist.c index a44bb08ab3..c410fbb5f2 100644 --- a/playlist.c +++ b/playlist.c @@ -380,12 +380,12 @@ success: void playlist_write_file(playlist_t *playlist) { size_t i; - FILE *file = NULL; + RFILE *file = NULL; if (!playlist || !playlist->modified) return; - file = fopen(playlist->conf_path, "w"); + file = filestream_open(playlist->conf_path, RFILE_MODE_WRITE, -1); RARCH_LOG("Trying to write to playlist file: %s\n", playlist->conf_path); @@ -396,7 +396,7 @@ void playlist_write_file(playlist_t *playlist) } for (i = 0; i < playlist->size; i++) - fprintf(file, "%s\n%s\n%s\n%s\n%s\n%s\n", + fprintf(filestream_get_fp(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, @@ -406,7 +406,7 @@ void playlist_write_file(playlist_t *playlist) ); playlist->modified = false; - fclose(file); + filestream_close(file); } /** diff --git a/qb/config.libs.sh b/qb/config.libs.sh index ef867cd95e..ffe90a5d66 100644 --- a/qb/config.libs.sh +++ b/qb/config.libs.sh @@ -35,13 +35,12 @@ elif [ "$OS" = 'Win32' ]; then SOCKETHEADER="#include " DYLIB= elif [ "$OS" = 'Cygwin' ]; then - echo "Error: Cygwin is not a supported platform. See https://bot.libretro.com/docs/compilation/windows/" - exit 1 + die 1 'Error: Cygwin is not a supported platform. See https://bot.libretro.com/docs/compilation/windows/' fi add_define_make DYLIB_LIB "$DYLIB" -check_lib SYSTEMD -lsystemd sd_get_machine_names +check_lib '' SYSTEMD -lsystemd sd_get_machine_names if [ "$HAVE_VIDEOCORE" != "no" ]; then check_pkgconf VC_TEST bcm_host @@ -49,7 +48,7 @@ if [ "$HAVE_VIDEOCORE" != "no" ]; then # use fallback if pkgconfig is not available if [ ! "$VC_TEST_LIBS" ]; then [ -d /opt/vc/lib ] && add_library_dirs /opt/vc/lib && add_library_dirs /opt/vc/lib/GL - check_lib VIDEOCORE -lbcm_host bcm_host_init "-lvcos -lvchiq_arm" + check_lib '' VIDEOCORE -lbcm_host bcm_host_init "-lvcos -lvchiq_arm" else HAVE_VIDEOCORE="$HAVE_VC_TEST" fi @@ -79,7 +78,7 @@ if [ "$HAVE_7ZIP" = "yes" ]; then fi if [ "$HAVE_PRESERVE_DYLIB" = "yes" ]; then - echo "Notice: Disabling dlclose() of shared objects for Valgrind support." + die : 'Notice: Disabling dlclose() of shared objects for Valgrind support.' add_define_make HAVE_PRESERVE_DYLIB "1" fi @@ -122,7 +121,7 @@ if [ "$HAVE_EGL" != "no" ] && [ "$OS" != 'Win32' ]; then check_pkgconf EGL "$VC_PREFIX"egl # some systems have EGL libs, but no pkgconfig if [ "$HAVE_EGL" = "no" ]; then - HAVE_EGL=auto; check_lib EGL "-l${VC_PREFIX}EGL $EXTRA_GL_LIBS" + HAVE_EGL=auto; check_lib '' EGL "-l${VC_PREFIX}EGL $EXTRA_GL_LIBS" [ "$HAVE_EGL" = "yes" ] && EGL_LIBS=-l"$VC_PREFIX"EGL else EGL_LIBS="$EGL_LIBS $EXTRA_GL_LIBS" @@ -130,7 +129,7 @@ if [ "$HAVE_EGL" != "no" ] && [ "$OS" != 'Win32' ]; then fi if [ "$HAVE_SSA" != "no" ]; then - check_lib SSA -lass ass_library_init + check_lib '' SSA -lass ass_library_init fi if [ "$HAVE_EXYNOS" != "no" ]; then @@ -143,14 +142,14 @@ if [ "$HAVE_DISPMANX" != "no" ]; then fi if [ "$LIBRETRO" ]; then - echo "Notice: Explicit libretro used, disabling dynamic libretro loading ..." + die : 'Notice: Explicit libretro used, disabling dynamic libretro loading ...' HAVE_DYNAMIC='no' else LIBRETRO="-lretro" fi [ "$HAVE_DYNAMIC" = 'yes' ] || { - #check_lib RETRO "$LIBRETRO" retro_init "$DYLIB" "Cannot find libretro, did you forget --with-libretro=\"-lretro\"?" - check_lib RETRO "$LIBRETRO" "$DYLIB" "Cannot find libretro, did you forget --with-libretro=\"-lretro\"?" + #check_lib '' RETRO "$LIBRETRO" retro_init "$DYLIB" "Cannot find libretro, did you forget --with-libretro=\"-lretro\"?" + check_lib '' RETRO "$LIBRETRO" "$DYLIB" "Cannot find libretro, did you forget --with-libretro=\"-lretro\"?" add_define_make libretro "$LIBRETRO" } @@ -173,18 +172,18 @@ if [ "$OS" = 'Win32' ]; then HAVE_THREAD_STORAGE=yes HAVE_DYLIB=yes else - check_lib THREADS "$PTHREADLIB" pthread_create + check_lib '' THREADS "$PTHREADLIB" pthread_create if [ "$HAVE_THREADS" = 'yes' ]; then - check_lib THREAD_STORAGE "$PTHREADLIB" pthread_key_create + check_lib '' THREAD_STORAGE "$PTHREADLIB" pthread_key_create else HAVE_THREAD_STORAGE=no fi - check_lib DYLIB "$DYLIB" dlopen + check_lib '' DYLIB "$DYLIB" dlopen fi -check_lib NETWORKING "$SOCKETLIB" socket "" "$SOCKETHEADER" +check_lib '' NETWORKING "$SOCKETLIB" socket "" "$SOCKETHEADER" if [ "$HAVE_NETWORKING" = 'yes' ]; then HAVE_GETADDRINFO=auto @@ -194,31 +193,31 @@ if [ "$HAVE_NETWORKING" = 'yes' ]; then if [ "$OS" = 'Win32' ]; then HAVE_GETADDRINFO=yes else - check_lib GETADDRINFO "$SOCKETLIB" getaddrinfo + check_lib '' GETADDRINFO "$SOCKETLIB" getaddrinfo if [ "$HAVE_GETADDRINFO" != 'yes' ]; then HAVE_SOCKET_LEGACY=yes - echo "Notice: RetroArch will use legacy socket support" + die : 'Notice: RetroArch will use legacy socket support' fi fi HAVE_NETWORK_CMD=yes HAVE_NETWORKGAMEPAD=yes if [ "$HAVE_MINIUPNPC" != "no" ]; then - check_lib MINIUPNPC "-lminiupnpc" + check_lib '' MINIUPNPC "-lminiupnpc" fi if [ "$HAVE_BUILTINMINIUPNPC" = "yes" ]; then HAVE_MINIUPNPC='yes' fi else - echo "Warning: All networking features have been disabled." + die : 'Warning: All networking features have been disabled.' HAVE_KEYMAPPER='no' HAVE_NETWORK_CMD='no' HAVE_NETWORKGAMEPAD='no' HAVE_CHEEVOS='no' fi -check_lib STDIN_CMD "$CLIB" fcntl +check_lib '' STDIN_CMD "$CLIB" fcntl if [ "$HAVE_NETWORK_CMD" = "yes" ] || [ "$HAVE_STDIN_CMD" = "yes" ]; then HAVE_COMMAND='yes' @@ -226,35 +225,34 @@ else HAVE_COMMAND='no' fi -check_lib GETOPT_LONG "$CLIB" getopt_long +check_lib '' GETOPT_LONG "$CLIB" getopt_long if [ "$HAVE_DYLIB" = 'no' ] && [ "$HAVE_DYNAMIC" = 'yes' ]; then - echo "Error: Dynamic loading of libretro is enabled, but your platform does not appear to have dlopen(), use --disable-dynamic or --with-libretro=\"-lretro\"". - exit 1 + die 1 'Error: Dynamic loading of libretro is enabled, but your platform does not appear to have dlopen(), use --disable-dynamic or --with-libretro="-lretro".' fi check_pkgconf ALSA alsa -check_lib CACA -lcaca +check_lib '' CACA -lcaca check_header OSS sys/soundcard.h check_header OSS_BSD soundcard.h -check_lib OSS_LIB -lossaudio +check_lib '' OSS_LIB -lossaudio if [ "$OS" = 'Linux' ]; then HAVE_TINYALSA=yes fi if [ "$OS" = 'Darwin' ]; then - check_lib COREAUDIO "-framework AudioUnit" AudioUnitInitialize - check_lib CORETEXT "-framework CoreText" CTFontCreateWithName - check_lib COCOA "-framework AppKit" NSApplicationMain - check_lib AVFOUNDATION "-framework AVFoundation" - check_lib CORELOCATION "-framework CoreLocation" - check_lib IOHIDMANAGER "-framework IOKit" IOHIDManagerCreate - check_lib AL "-framework OpenAL" alcOpenDevice + check_lib '' COREAUDIO "-framework AudioUnit" AudioUnitInitialize + check_lib '' CORETEXT "-framework CoreText" CTFontCreateWithName + check_lib '' COCOA "-framework AppKit" NSApplicationMain + check_lib '' AVFOUNDATION "-framework AVFoundation" + check_lib '' CORELOCATION "-framework CoreLocation" + check_lib '' IOHIDMANAGER "-framework IOKit" IOHIDManagerCreate + check_lib '' AL "-framework OpenAL" alcOpenDevice HAVE_X11=no # X11 breaks on recent OSXes even if present. HAVE_SDL=no else - check_lib AL -lopenal alcOpenDevice + check_lib '' AL -lopenal alcOpenDevice fi check_pkgconf RSOUND rsound 1.1 @@ -266,10 +264,10 @@ check_pkgconf SDL2 sdl2 2.0.0 if [ "$HAVE_SDL2" = 'yes' ]; then if [ "$HAVE_SDL2" = 'yes' ] && [ "$HAVE_SDL" = 'yes' ]; then - echo "Notice: SDL drivers will be replaced by SDL2 ones." + die : 'Notice: SDL drivers will be replaced by SDL2 ones.' HAVE_SDL=no elif [ "$HAVE_SDL2" = 'no' ]; then - echo "Warning: SDL2 not found, skipping." + die : 'Warning: SDL2 not found, skipping.' HAVE_SDL2=no fi fi @@ -277,9 +275,9 @@ fi check_pkgconf LIBUSB libusb-1.0 1.0.16 if [ "$OS" = 'Win32' ]; then - check_lib DINPUT -ldinput8 - check_lib D3D9 -ld3d9 - check_lib DSOUND -ldsound + check_lib '' DINPUT -ldinput8 + check_lib '' D3D9 -ld3d9 + check_lib '' DSOUND -ldsound if [ "$HAVE_DINPUT" != 'no' ]; then HAVE_XINPUT=yes @@ -294,25 +292,25 @@ fi if [ "$HAVE_OPENGL" != 'no' ] && [ "$HAVE_OPENGLES" != 'yes' ]; then if [ "$OS" = 'Darwin' ]; then check_header OPENGL "OpenGL/gl.h" - check_lib OPENGL "-framework OpenGL" + check_lib '' OPENGL "-framework OpenGL" elif [ "$OS" = 'Win32' ]; then check_header OPENGL "GL/gl.h" - check_lib OPENGL -lopengl32 + check_lib '' OPENGL -lopengl32 else check_header OPENGL "GL/gl.h" - check_lib OPENGL -lGL + check_lib '' OPENGL -lGL fi if [ "$HAVE_OPENGL" = 'yes' ]; then if [ "$OS" = 'Darwin' ]; then - check_lib CG "-framework Cg" cgCreateContext + check_lib '' CG "-framework Cg" cgCreateContext [ "$HAVE_CG" = 'yes' ] && CG_LIBS='-framework Cg' elif [ "$OS" = 'Win32' ]; then - check_lib_cxx CG -lcg cgCreateContext + check_lib cxx CG -lcg cgCreateContext [ "$HAVE_CG" = 'yes' ] && CG_LIBS='-lcg -lcgGL' else # On some distros, -lCg doesn't link against -lstdc++ it seems ... - check_lib_cxx CG -lCg cgCreateContext + check_lib cxx CG -lCg cgCreateContext [ "$HAVE_CG" = 'yes' ] && CG_LIBS='-lCg -lCgGL' fi @@ -321,7 +319,7 @@ if [ "$HAVE_OPENGL" != 'no' ] && [ "$HAVE_OPENGLES" != 'yes' ]; then check_pkgconf OSMESA osmesa else - echo "Notice: Ignoring Cg. Desktop OpenGL is not enabled." + die : 'Notice: Ignoring Cg. Desktop OpenGL is not enabled.' HAVE_CG='no' fi fi @@ -331,7 +329,7 @@ if [ "$HAVE_ZLIB" != 'no' ]; then if [ "$HAVE_ZLIB" = 'no' ]; then HAVE_ZLIB='auto' - check_lib ZLIB '-lz' + check_lib '' ZLIB '-lz' fi fi @@ -349,16 +347,16 @@ if [ "$HAVE_THREADS" != 'no' ]; then HAVE_FFMPEG='yes' if [ "$HAVE_AVCODEC" = 'no' ] || [ "$HAVE_SWRESAMPLE" = 'no' ] || [ "$HAVE_AVFORMAT" = 'no' ] || [ "$HAVE_AVUTIL" = 'no' ] || [ "$HAVE_SWSCALE" = 'no' ]; then HAVE_FFMPEG='no' - echo "Notice: FFmpeg built-in support disabled due to missing or unsuitable packages." + die : 'Notice: FFmpeg built-in support disabled due to missing or unsuitable packages.' fi fi else - echo "Notice: Not building with threading support. Will skip FFmpeg." + die : 'Notice: Not building with threading support. Will skip FFmpeg.' HAVE_FFMPEG='no' fi if [ "$OS" != 'Win32' ]; then - check_lib DYNAMIC "$DYLIB" dlopen + check_lib '' DYNAMIC "$DYLIB" dlopen fi if [ "$HAVE_KMS" != "no" ]; then @@ -367,8 +365,7 @@ if [ "$HAVE_KMS" != "no" ]; then if [ "$HAVE_GBM" = "yes" ] && [ "$HAVE_DRM" = "yes" ] && [ "$HAVE_EGL" = "yes" ]; then HAVE_KMS=yes elif [ "$HAVE_KMS" = "yes" ]; then - echo "Error: Cannot find libgbm, libdrm and EGL libraries required for KMS. Compile without --enable-kms." - exit 1 + die 1 'Error: Cannot find libgbm, libdrm and EGL libraries required for KMS. Compile without --enable-kms.' else HAVE_KMS=no fi @@ -379,13 +376,13 @@ check_pkgconf LIBXML2 libxml-2.0 if [ "$HAVE_EGL" = "yes" ]; then if [ "$HAVE_OPENGLES" != "no" ]; then if [ "$OPENGLES_LIBS" ] || [ "$OPENGLES_CFLAGS" ]; then - echo "Notice: Using custom OpenGLES CFLAGS ($OPENGLES_CFLAGS) and LDFLAGS ($OPENGLES_LIBS)." + die : "Notice: Using custom OpenGLES CFLAGS ($OPENGLES_CFLAGS) and LDFLAGS ($OPENGLES_LIBS)." add_define_make OPENGLES_LIBS "$OPENGLES_LIBS" add_define_make OPENGLES_CFLAGS "$OPENGLES_CFLAGS" else HAVE_OPENGLES=auto; check_pkgconf OPENGLES "$VC_PREFIX"glesv2 if [ "$HAVE_OPENGLES" = "no" ]; then - HAVE_OPENGLES=auto; check_lib OPENGLES "-l${VC_PREFIX}GLESv2 $EXTRA_GL_LIBS" + HAVE_OPENGLES=auto; check_lib '' OPENGLES "-l${VC_PREFIX}GLESv2 $EXTRA_GL_LIBS" add_define_make OPENGLES_LIBS "-l${VC_PREFIX}GLESv2 $EXTRA_GL_LIBS" fi fi @@ -393,7 +390,7 @@ if [ "$HAVE_EGL" = "yes" ]; then if [ "$HAVE_VG" != "no" ]; then check_pkgconf VG "$VC_PREFIX"vg if [ "$HAVE_VG" = "no" ]; then - HAVE_VG=auto; check_lib VG "-l${VC_PREFIX}OpenVG $EXTRA_GL_LIBS" + HAVE_VG=auto; check_lib '' VG "-l${VC_PREFIX}OpenVG $EXTRA_GL_LIBS" [ "$HAVE_VG" = "yes" ] && VG_LIBS=-l"$VC_PREFIX"OpenVG fi fi @@ -403,19 +400,6 @@ else fi check_pkgconf V4L2 libv4l2 - -if [ "$OS" = 'Darwin' ]; then - check_lib FBO "-framework OpenGL" glFramebufferTexture2D -elif [ "$OS" = 'Win32' ]; then - HAVE_FBO=yes -else - if [ "$HAVE_OPENGLES" = "yes" ]; then - [ $HAVE_FBO != "no" ] && HAVE_FBO=yes - else - check_lib FBO -lGL glFramebufferTexture2D - fi -fi - check_pkgconf FREETYPE freetype2 check_pkgconf X11 x11 check_pkgconf XCB xcb @@ -432,7 +416,7 @@ check_pkgconf XINERAMA xinerama if [ "$HAVE_X11" = 'yes' ] && [ "$HAVE_XEXT" = 'yes' ] && [ "$HAVE_XF86VM" = 'yes' ]; then check_pkgconf XVIDEO xv else - echo "Notice: X11, Xext or xf86vm not present. Skipping X11 code paths." + die : 'Notice: X11, Xext or xf86vm not present. Skipping X11 code paths.' HAVE_X11='no' HAVE_XVIDEO='no' fi @@ -440,7 +424,7 @@ fi if [ "$HAVE_UDEV" != "no" ]; then check_pkgconf UDEV libudev if [ "$HAVE_UDEV" = "no" ]; then - HAVE_UDEV=auto; check_lib UDEV "-ludev" + HAVE_UDEV=auto; check_lib '' UDEV "-ludev" [ "$HAVE_UDEV" = "yes" ] && UDEV_LIBS=-ludev fi fi @@ -450,24 +434,12 @@ check_header XSHM X11/Xlib.h X11/extensions/XShm.h check_header PARPORT linux/parport.h check_header PARPORT linux/ppdev.h -if [ "$OS" != 'Win32' ]; then - check_lib STRL "$CLIB" strlcpy -fi -check_lib STRCASESTR "$CLIB" strcasestr -check_lib MMAP "$CLIB" mmap -check_lib VULKAN -lvulkan vkCreateInstance - -if [ "$HAVE_VULKAN" != 'no' ] && [ ! -e deps/glslang/glslang/README.md ]; then - echo "Warning: glslang submodule not loaded, can't use Vulkan." - echo "To fix, use: git submodule init && git submodule update" - HAVE_VULKAN=no -fi - -if [ "$HAVE_VULKAN" != 'no' ] && [ ! -e deps/SPIRV-Cross/README.md ]; then - echo "Warning: SPIRV-Cross submodule not loaded, can't use Vulkan." - echo "To fix, use: git submodule init && git submodule update" - HAVE_VULKAN=no +if [ "$OS" != 'Win32' ] && [ "$OS" != 'Linux' ]; then + check_lib '' STRL "$CLIB" strlcpy fi +check_lib '' STRCASESTR "$CLIB" strcasestr +check_lib '' MMAP "$CLIB" mmap +check_lib '' VULKAN -lvulkan vkCreateInstance check_pkgconf PYTHON python3 @@ -476,19 +448,19 @@ if [ "$HAVE_MATERIALUI" != 'no' ] || [ "$HAVE_XMB" != 'no' ] || [ "$HAVE_ZARCH" HAVE_MATERIALUI=no HAVE_XMB=no HAVE_ZARCH=no - echo "Notice: RGUI not available, MaterialUI, XMB and ZARCH will also be disabled." + die : 'Notice: RGUI not available, MaterialUI, XMB and ZARCH will also be disabled.' elif [ "$HAVE_OPENGL" = 'no' ] && [ "$HAVE_OPENGLES" = 'no' ] && [ "$HAVE_VULKAN" = 'no' ]; then if [ "$OS" = 'Win32' ]; then HAVE_SHADERPIPELINE=no HAVE_VULKAN=no - echo "Notice: Hardware rendering context not available." + die : 'Notice: Hardware rendering context not available.' elif [ "$HAVE_CACA" = 'yes' ]; then - echo "Notice: Hardware rendering context not available." + die : 'Notice: Hardware rendering context not available.' else HAVE_MATERIALUI=no HAVE_XMB=no HAVE_ZARCH=no - echo "Notice: Hardware rendering context not available, XMB, MaterialUI and ZARCH will also be disabled." + die : 'Notice: Hardware rendering context not available, XMB, MaterialUI and ZARCH will also be disabled.' fi fi fi @@ -499,12 +471,12 @@ add_define_make OS "$OS" if [ "$HAVE_ZLIB" = 'no' ] && [ "$HAVE_RPNG" != 'no' ]; then HAVE_RPNG=no - echo "Notice: zlib is not available, RPNG will also be disabled." + die : 'Notice: zlib is not available, RPNG will also be disabled.' fi if [ "$HAVE_THREADS" = 'no' ] && [ "$HAVE_LIBUSB" != 'no' ]; then HAVE_LIBUSB=no - echo "Notice: Threads are not available, libusb will also be disabled." + die : 'Notice: Threads are not available, libusb will also be disabled.' fi if [ "$HAVE_V4L2" != 'no' ] && [ "$HAVE_VIDEOPROCESSOR" != 'no' ]; then diff --git a/qb/config.params.sh b/qb/config.params.sh index 4076b63c4a..34bd92590b 100644 --- a/qb/config.params.sh +++ b/qb/config.params.sh @@ -56,7 +56,6 @@ HAVE_CG=auto # Cg shader support HAVE_LIBXML2=auto # libxml2 support HAVE_BUILTINZLIB=no # Bake in zlib HAVE_ZLIB=auto # zlib support (ZIP extract, PNG decoding/encoding) -HAVE_FBO=auto # render-to-texture (FBO) support HAVE_ALSA=auto # ALSA support C89_ALSA=no HAVE_TINYALSA=auto # TinyALSA support diff --git a/qb/qb.comp.sh b/qb/qb.comp.sh index fd27365517..01b3e8ffa6 100644 --- a/qb/qb.comp.sh +++ b/qb/qb.comp.sh @@ -31,8 +31,7 @@ fi echo "Checking for suitable working C compiler ... $CC $cc_status" if [ "$cc_works" = '0' ] && [ "$USE_LANG_C" = 'yes' ]; then - echo "Error: Cannot proceed without a working C compiler." - exit 1 + die 1 'Error: Cannot proceed without a working C compiler.' fi # Checking for working C++ @@ -62,15 +61,14 @@ fi echo "Checking for suitable working C++ compiler ... $CXX $cxx_status" if [ "$cxx_works" = '0' ] && [ "$USE_LANG_CXX" = 'yes' ]; then - echo "Error: Cannot proceed without a working C++ compiler." - exit 1 + die 1 'Error: Cannot proceed without a working C++ compiler.' fi if [ "$OS" = "Win32" ]; then echobuf="Checking for windres" if [ -z "$WINDRES" ]; then WINDRES=$(which ${CROSS_COMPILE}windres) - [ "$WINDRES" ] || { echo "$echobuf ... Not found. Exiting."; exit 1; } + [ "$WINDRES" ] || die 1 "$echobuf ... Not found. Exiting." fi echo "$echobuf ... $WINDRES" fi @@ -90,5 +88,5 @@ fi echo "Checking for pkg-config ... $PKG_CONF_PATH" if [ "$PKG_CONF_PATH" = "none" ]; then - echo "Warning: pkg-config not found, package checks will fail." + die : 'Warning: pkg-config not found, package checks will fail.' fi diff --git a/qb/qb.libs.sh b/qb/qb.libs.sh index 42f2eaa782..79270c04e6 100644 --- a/qb/qb.libs.sh +++ b/qb/qb.libs.sh @@ -1,5 +1,3 @@ -# echo -n is broken on recent OSX btw - MAKEFILE_DEFINES='.MAKEFILE_DEFINES' CONFIG_DEFINES='.CONFIG_DEFINES' cat /dev/null > "$MAKEFILE_DEFINES" > "$CONFIG_DEFINES" @@ -15,82 +13,58 @@ add_define_make() add_include_dirs() { while [ "$1" ]; do INCLUDE_DIRS="$INCLUDE_DIRS -I$1"; shift; done - INCLUDE_DIRS="${INCLUDE_DIRS#* }" + INCLUDE_DIRS="${INCLUDE_DIRS# }" } add_library_dirs() { while [ "$1" ]; do LIBRARY_DIRS="$LIBRARY_DIRS -L$1"; shift; done - LIBRARY_DIRS="${LIBRARY_DIRS#* }" + LIBRARY_DIRS="${LIBRARY_DIRS# }" } -check_lib() #$1 = HAVE_$1 $2 = lib $3 = function in lib $4 = extralibs $5 = headers -{ tmpval="$(eval echo \$HAVE_$1)" +check_lib() # $1 = language $2 = HAVE_$2 $3 = lib $4 = function in lib $5 = extralibs $6 = headers $7 = critical error message [checked only if non-empty] +{ tmpval="$(eval echo \$HAVE_$2)" [ "$tmpval" = 'no' ] && return 0 - if [ "$3" ]; then - ECHOBUF="Checking function $3 in ${2% }" - if [ "$5" ]; then - printf %s\\n "$5" "int main(void) { void *p = (void*)$3; return 0; }" > $TEMP_C + if [ "$1" = cxx ]; then + COMPILER="$CXX" + TEMP_CODE="$TEMP_CXX" + TEST_C="extern \"C\" { void $4(void); } int main() { $4(); }" + else + COMPILER="$CC" + TEMP_CODE="$TEMP_C" + TEST_C="void $4(void); int main(void) { $4(); return 0; }" + fi + + if [ "$4" ]; then + ECHOBUF="Checking function $4 in ${3% }" + if [ "$6" ]; then + printf %s\\n "$6" "int main(void) { void *p = (void*)$4; return 0; }" > "$TEMP_CODE" else - echo "void $3(void); int main(void) { $3(); return 0; }" > $TEMP_C + echo "$TEST_C" > "$TEMP_CODE" fi else - ECHOBUF="Checking existence of ${2% }" - echo "int main(void) { return 0; }" > $TEMP_C + ECHOBUF="Checking existence of ${3% }" + echo "int main(void) { return 0; }" > "$TEMP_CODE" fi answer='no' -# echo -n "$ECHOBUF" - "$CC" -o \ + "$COMPILER" -o \ "$TEMP_EXE" \ - "$TEMP_C" \ + "$TEMP_CODE" \ $INCLUDE_DIRS \ $LIBRARY_DIRS \ - $(printf %s "$4") \ + $(printf %s "$5") \ $CFLAGS \ $LDFLAGS \ - $(printf %s "$2") >>config.log 2>&1 && answer='yes' - eval HAVE_$1="$answer"; echo "$ECHOBUF ... $answer" - rm "$TEMP_C" "$TEMP_EXE" >/dev/null 2>&1 - - [ "$tmpval" = 'yes' ] && [ "$answer" = 'no' ] && { - echo "Forced to build with library $2, but cannot locate. Exiting ..." - exit 1 - } + $(printf %s "$3") >>config.log 2>&1 && answer='yes' + eval HAVE_$2="$answer"; echo "$ECHOBUF ... $answer" + rm -f -- "$TEMP_CODE" "$TEMP_EXE" - return 0 -} - -check_lib_cxx() #$1 = HAVE_$1 $2 = lib $3 = function in lib $4 = extralibs $5 = critical error message [checked only if non-empty] -{ tmpval="$(eval echo \$HAVE_$1)" - [ "$tmpval" = 'no' ] && return 0 - - if [ "$3" ]; then - ECHOBUF="Checking function $3 in ${2% }" - echo "extern \"C\" { void $3(void); } int main() { $3(); }" > $TEMP_CXX - else - ECHOBUF="Checking existence of ${2% }" - echo "int main() { return 0; }" > $TEMP_CXX - fi - answer='no' -# echo -n "$ECHOBUF" - "$CXX" -o \ - "$TEMP_EXE" \ - "$TEMP_CXX" \ - $INCLUDE_DIRS \ - $LIBRARY_DIRS \ - $(printf %s "$4") \ - $CFLAGS \ - $LDFLAGS \ - $(printf %s "$2") >>config.log 2>&1 && answer='yes' - eval HAVE_$1="$answer"; echo "$ECHOBUF ... $answer" - rm "$TEMP_CXX" "$TEMP_EXE" >/dev/null 2>&1 [ "$answer" = 'no' ] && { - [ "$5" ] && { echo "$5"; exit 1;} + [ "$7" ] && die 1 "$7" [ "$tmpval" = 'yes' ] && { - echo "Forced to build with library $2, but cannot locate. Exiting ..." - exit 1 + die 1 "Forced to build with library $3, but cannot locate. Exiting ..." } - + } return 0 @@ -101,11 +75,10 @@ check_code_c() [ "$tmpval" = 'no' ] && return 0 ECHOBUF="Checking C code snippet \"$3\"" -# echo -n "Checking C code snippet \"$3\"" answer='no' "$CC" -o "$TEMP_EXE" "$TEMP_C" $INCLUDE_DIRS $LIBRARY_DIRS $2 $CFLAGS $LDFLAGS >>config.log 2>&1 && answer='yes' eval HAVE_$1="$answer"; echo "$ECHOBUF ... $answer" - rm "$TEMP_C" "$TEMP_EXE" >/dev/null 2>&1 + rm -f -- "$TEMP_C" "$TEMP_EXE" } check_code_cxx() @@ -113,11 +86,10 @@ check_code_cxx() [ "$tmpval" = 'no' ] && return 0 ECHOBUF="Checking C++ code snippet \"$3\"" -# echo -n "Checking C++ code snippet \"$3\"" answer='no' "$CXX" -o "$TEMP_EXE" "$TEMP_CXX" $INCLUDE_DIRS $LIBRARY_DIRS $2 $CXXFLAGS $LDFLAGS >>config.log 2>&1 && answer='yes' eval HAVE_$1="$answer"; echo "$ECHOBUF ... $answer" - rm "$TEMP_CXX" "$TEMP_EXE" >/dev/null 2>&1 + rm -f -- "$TEMP_CXX" "$TEMP_EXE" } check_pkgconf() #$1 = HAVE_$1 $2 = package $3 = version $4 = critical error message [checked only if non-empty] @@ -146,11 +118,9 @@ check_pkgconf() #$1 = HAVE_$1 $2 = package $3 = version $4 = critical error mess echo "$ECHOBUF ... $version" PKG_CONF_USED="$PKG_CONF_USED $1" [ "$answer" = 'no' ] && { - [ "$4" ] && { echo "$4"; exit 1;} - [ "$tmpval" = 'yes' ] && { - echo "Forced to build with package $2, but cannot locate. Exiting ..." - exit 1 - } + [ "$4" ] && die 1 "$4" + [ "$tmpval" = 'yes' ] && \ + die 1 "Forced to build with package $2, but cannot locate. Exiting ..." } } @@ -158,7 +128,6 @@ check_header() #$1 = HAVE_$1 $2..$5 = header files { tmpval="$(eval echo \$HAVE_$1)" [ "$tmpval" = 'no' ] && return 0 CHECKHEADER="$2" -# echo -n "Checking presence of header file $2" echo "#include <$2>" > "$TEMP_C" [ "$3" != "" ] && CHECKHEADER="$3" && echo "#include <$3>" >> "$TEMP_C" [ "$4" != "" ] && CHECKHEADER="$4" && echo "#include <$4>" >> "$TEMP_C" @@ -167,18 +136,15 @@ check_header() #$1 = HAVE_$1 $2..$5 = header files answer='no' "$CC" -o "$TEMP_EXE" "$TEMP_C" $INCLUDE_DIRS >>config.log 2>&1 && answer='yes' eval HAVE_$1="$answer"; echo "Checking presence of header file $CHECKHEADER ... $answer" - rm "$TEMP_C" "$TEMP_EXE" >/dev/null 2>&1 - [ "$tmpval" = 'yes' ] && [ "$answer" = 'no' ] && { - echo "Build assumed that $2 exists, but cannot locate. Exiting ..." - exit 1 - } + rm -f -- "$TEMP_C" "$TEMP_EXE" + [ "$tmpval" = 'yes' ] && [ "$answer" = 'no' ] && \ + die 1 "Build assumed that $2 exists, but cannot locate. Exiting ..." } check_macro() #$1 = HAVE_$1 $2 = macro name { tmpval="$(eval echo \$HAVE_$1)" [ "$tmpval" = 'no' ] && return 0 ECHOBUF="Checking presence of predefined macro $2" -# echo -n "Checking presence of predefined macro $2" cat << EOF > "$TEMP_C" #ifndef $2 #error $2 is not defined @@ -188,36 +154,32 @@ EOF answer='no' "$CC" -o "$TEMP_EXE" "$TEMP_C" $CFLAGS $INCLUDE_DIRS >>config.log 2>&1 && answer='yes' eval HAVE_$1="$answer"; echo "$ECHOBUF ... $answer" - rm "$TEMP_C" "$TEMP_EXE" >/dev/null 2>&1 - [ "$tmpval" = 'yes' ] && [ "$answer" = 'no' ] && { - echo "Build assumed that $2 is defined, but it's not. Exiting ..." - exit 1 - } + rm -f -- "$TEMP_C" "$TEMP_EXE" + [ "$tmpval" = 'yes' ] && [ "$answer" = 'no' ] && \ + die 1 "Build assumed that $2 is defined, but it's not. Exiting ..." } check_switch_c() #$1 = HAVE_$1 $2 = switch $3 = critical error message [checked only if non-empty] { ECHOBUF="Checking for availability of switch $2 in $CC" -# echo -n "Checking for availability of switch $2 in $CC " echo "int main(void) { return 0; }" > $TEMP_C answer='no' "$CC" -o "$TEMP_EXE" "$TEMP_C" $2 >>config.log 2>&1 && answer='yes' eval HAVE_$1="$answer"; echo "$ECHOBUF ... $answer" - rm "$TEMP_C" "$TEMP_EXE" >/dev/null 2>&1 + rm -f -- "$TEMP_C" "$TEMP_EXE" [ "$answer" = 'no' ] && { - [ "$3" ] && { echo "$3"; exit 1;} + [ "$3" ] && die 1 "$3" } } check_switch_cxx() #$1 = HAVE_$1 $2 = switch $3 = critical error message [checked only if non-empty] { ECHOBUF="Checking for availability of switch $2 in $CXX" -# echo -n "Checking for availability of switch $2 in $CXX" echo "int main() { return 0; }" > $TEMP_CXX answer='no' "$CXX" -o "$TEMP_EXE" "$TEMP_CXX" "$2" >>config.log 2>&1 && answer='yes' eval HAVE_$1="$answer"; echo "$ECHOBUF ... $answer" - rm "$TEMP_CXX" "$TEMP_EXE" >/dev/null 2>&1 + rm -f -- "$TEMP_CXX" "$TEMP_EXE" [ "$answer" = 'no' ] && { - [ "$3" ] && { echo "$3"; exit 1;} + [ "$3" ] && die 1 "$3" } } @@ -297,4 +259,4 @@ create_config_make() . qb/config.libs.sh -rm "$MAKEFILE_DEFINES" "$CONFIG_DEFINES" +rm -f -- "$MAKEFILE_DEFINES" "$CONFIG_DEFINES" diff --git a/qb/qb.params.sh b/qb/qb.params.sh index 68048f2be6..4d79d9e177 100644 --- a/qb/qb.params.sh +++ b/qb/qb.params.sh @@ -1,3 +1,14 @@ +die() # $1 = exit code, use : to not exit when printing warnings $@ = exit or warning messages +{ + ret="$1" + shift 1 + printf %s\\n "$@" >&2 + case "$ret" in + : ) return 0 ;; + * ) exit "$ret" ;; + esac +} + print_help_option() # $1 = option $@ = description { _opt="$1" @@ -29,8 +40,11 @@ EOF echo "" echo "Custom options:" - while IFS='=#' read VAR VAL COMMENT; do - VAR=$(echo "${VAR##HAVE_}" | tr '[:upper:]' '[:lower:]') + while read -r VAR COMMENT; do + TMPVAR="${VAR%=*}" + COMMENT="${COMMENT#*#}" + VAL="${VAR#*=}" + VAR="$(echo "${TMPVAR#HAVE_}" | tr '[:upper:]' '[:lower:]')" case "$VAR" in 'c89_'*) continue;; *) @@ -50,15 +64,20 @@ EOF } opt_exists() # $opt is returned if exists in OPTS -{ opt=$(echo "$1" | tr '[:lower:]' '[:upper:]') - for OPT in $OPTS; do [ "$opt" = "$OPT" ] && return; done - echo "Unknown option $2"; exit 1 +{ opt="$(echo "$1" | tr '[:lower:]' '[:upper:]')" + err="$2" + eval "set -- $OPTS" + for OPT do [ "$opt" = "$OPT" ] && return; done + die 1 "Unknown option $err" } parse_input() # Parse stuff :V -{ OPTS=; while IFS='=' read VAR dummy; do OPTS="$OPTS ${VAR##HAVE_}"; done < 'qb/config.params.sh' -#OPTS contains all available options in config.params.sh - used to speedup -#things in opt_exists() +{ OPTS=; while read -r VAR _; do + TMPVAR="${VAR%=*}" + OPTS="$OPTS ${TMPVAR##HAVE_}" + done < 'qb/config.params.sh' + #OPTS contains all available options in config.params.sh - used to speedup + #things in opt_exists() while [ "$1" ]; do case "$1" in @@ -81,7 +100,7 @@ parse_input() # Parse stuff :V eval "$opt=\"$val\"" ;; -h|--help) print_help; exit 0;; - *) echo "Unknown option $1"; exit 1;; + *) die 1 "Unknown option $1";; esac shift done @@ -89,4 +108,4 @@ parse_input() # Parse stuff :V . qb/config.params.sh -parse_input "$@" +parse_input "$@" diff --git a/qb/qb.system.sh b/qb/qb.system.sh index 0589126905..45541ea1e4 100644 --- a/qb/qb.system.sh +++ b/qb/qb.system.sh @@ -1,3 +1,7 @@ +IFS=' +' +\unalias -a 2>/dev/null +PATH="$(command -p getconf PATH):$PATH" if [ -n "$CROSS_COMPILE" ]; then case "$CROSS_COMPILE" in @@ -26,4 +30,3 @@ if [ -e /etc/lsb-release ]; then fi echo "Checking operating system ... $OS ${DISTRO}" - diff --git a/retroarch.c b/retroarch.c index e0196f04f9..74fdac1479 100644 --- a/retroarch.c +++ b/retroarch.c @@ -48,7 +48,6 @@ #include #include #include -#include #include #ifdef HAVE_CONFIG_H @@ -220,6 +219,7 @@ static bool runloop_paused = false; static bool runloop_idle = false; static bool runloop_exec = false; static bool runloop_slowmotion = false; +static bool runloop_fastmotion = false; static bool runloop_shutdown_initiated = false; static bool runloop_core_shutdown_initiated = false; static bool runloop_perfcnt_enable = false; @@ -249,19 +249,31 @@ static retro_time_t frame_limit_last_time = 0.0; extern bool input_driver_flushing_input; +#ifdef HAVE_THREADS +void runloop_msg_queue_lock(void) +{ + slock_lock(_runloop_msg_queue_lock); +} + +void runloop_msg_queue_unlock(void) +{ + slock_unlock(_runloop_msg_queue_lock); +} +#endif + static void retroarch_msg_queue_deinit(void) { +#ifdef HAVE_THREADS + runloop_msg_queue_lock(); +#endif + if (!runloop_msg_queue) return; -#ifdef HAVE_THREADS - slock_lock(_runloop_msg_queue_lock); -#endif - msg_queue_free(runloop_msg_queue); #ifdef HAVE_THREADS - slock_unlock(_runloop_msg_queue_lock); + runloop_msg_queue_unlock(); slock_free(_runloop_msg_queue_lock); _runloop_msg_queue_lock = NULL; #endif @@ -384,10 +396,6 @@ static void retroarch_print_features(void) _PSUPP(sdl_image, "SDL_image", "SDL_image image loading"); _PSUPP(rpng, "rpng", "PNG image loading/encoding"); _PSUPP(rpng, "rjpeg", "JPEG image loading"); - - _PSUPP(fbo, "FBO", "OpenGL render-to-texture " - "(multi-pass shaders)"); - _PSUPP(dynamic, "Dynamic", "Dynamic run-time loading of " "libretro library"); _PSUPP(ffmpeg, "FFmpeg", "On-the-fly recording of gameplay " @@ -1373,10 +1381,10 @@ static bool rarch_game_specific_options(char **output) if (!retroarch_validate_game_options(game_path, game_path_size, false)) - goto error; + goto error; if (!config_file_exists(game_path)) - goto error; + goto error; RARCH_LOG("%s %s\n", msg_hash_to_str(MSG_GAME_SPECIFIC_CORE_OPTIONS_FOUND_AT), @@ -2227,7 +2235,7 @@ void runloop_msg_queue_push(const char *msg, runloop_ctx_msg_info_t msg_info; #ifdef HAVE_THREADS - slock_lock(_runloop_msg_queue_lock); + runloop_msg_queue_lock(); #endif if (flush) @@ -2253,7 +2261,7 @@ void runloop_msg_queue_push(const char *msg, } #ifdef HAVE_THREADS - slock_unlock(_runloop_msg_queue_lock); + runloop_msg_queue_unlock(); #endif } @@ -2269,14 +2277,14 @@ void runloop_get_status(bool *is_paused, bool *is_idle, bool runloop_msg_queue_pull(const char **ret) { +#ifdef HAVE_THREADS + runloop_msg_queue_lock(); +#endif if (!ret) return false; -#ifdef HAVE_THREADS - slock_lock(_runloop_msg_queue_lock); -#endif *ret = msg_queue_pull(runloop_msg_queue); #ifdef HAVE_THREADS - slock_unlock(_runloop_msg_queue_lock); + runloop_msg_queue_unlock(); #endif return true; } @@ -2758,21 +2766,35 @@ static enum runloop_state runloop_check_state( if (new_button_state && !old_button_state) { - if (input_nonblock_state) + if (input_nonblock_state) { input_driver_unset_nonblock_state(); - else + runloop_fastmotion = false; + } + else { input_driver_set_nonblock_state(); + runloop_fastmotion = true; + } driver_set_nonblock_state(); } else if (old_hold_button_state != new_hold_button_state) { - if (new_hold_button_state) + if (new_hold_button_state) { input_driver_set_nonblock_state(); - else + runloop_fastmotion = true; + } + else { input_driver_unset_nonblock_state(); + runloop_fastmotion = false; + } driver_set_nonblock_state(); } + // Display the fast forward state to the user, if needed. + if (runloop_fastmotion) { + runloop_msg_queue_push( + msg_hash_to_str(MSG_FAST_FORWARD), 1, 1, false); + } + old_button_state = new_button_state; old_hold_button_state = new_hold_button_state; } @@ -2876,10 +2898,10 @@ static enum runloop_state runloop_check_state( if (state_manager_frame_is_reversed()) runloop_msg_queue_push( - msg_hash_to_str(MSG_SLOW_MOTION_REWIND), 2, 30, true); + msg_hash_to_str(MSG_SLOW_MOTION_REWIND), 1, 1, false); else runloop_msg_queue_push( - msg_hash_to_str(MSG_SLOW_MOTION), 2, 30, true); + msg_hash_to_str(MSG_SLOW_MOTION), 1, 1, false); } } @@ -3123,7 +3145,6 @@ int runloop_iterate(unsigned *sleep_ms) if (settings->floats.fastforward_ratio) end: { - retro_time_t to_sleep_ms = ( (frame_limit_last_time + frame_limit_minimum_time) - cpu_features_get_time_usec()) / 1000; diff --git a/retroarch.h b/retroarch.h index badb2e000b..a8600f665b 100644 --- a/retroarch.h +++ b/retroarch.h @@ -349,6 +349,12 @@ bool retroarch_is_on_main_thread(void); rarch_system_info_t *runloop_get_system_info(void); +#ifdef HAVE_THREADS +void runloop_msg_queue_lock(void); + +void runloop_msg_queue_unlock(void); +#endif + RETRO_END_DECLS #endif diff --git a/setting_list.c b/setting_list.c index 5ad74cc40d..ebb84273fd 100644 --- a/setting_list.c +++ b/setting_list.c @@ -354,7 +354,6 @@ static int setting_fraction_action_left_default( { rarch_setting_t *setting = (rarch_setting_t*)data; double min = 0.0f; - bool overflowed = false; if (!setting) return -1; @@ -363,14 +362,11 @@ static int setting_fraction_action_left_default( (void)wraparound; /* TODO/FIXME - handle this */ - overflowed = setting->step > *setting->value.target.fraction; - - if (!overflowed) - *setting->value.target.fraction = *setting->value.target.fraction - setting->step; + *setting->value.target.fraction = *setting->value.target.fraction - setting->step; if (setting->enforce_minrange) { - if (overflowed || *setting->value.target.fraction < min) + if (*setting->value.target.fraction < min) { settings_t *settings = config_get_ptr(); @@ -1043,7 +1039,6 @@ static int setting_int_action_left_default(void *data, bool wraparound) { rarch_setting_t *setting = (rarch_setting_t*)data; double min = 0.0f; - bool overflowed = false; if (!setting) return -1; @@ -1052,14 +1047,11 @@ static int setting_int_action_left_default(void *data, bool wraparound) (void)wraparound; /* TODO/FIXME - handle this */ - overflowed = setting->step > *setting->value.target.integer; - - if (!overflowed) - *setting->value.target.integer = *setting->value.target.integer - setting->step; + *setting->value.target.integer = *setting->value.target.integer - setting->step; if (setting->enforce_minrange) { - if (overflowed || *setting->value.target.integer < min) + if (*setting->value.target.integer < min) { settings_t *settings = config_get_ptr(); diff --git a/tasks/task_content.c b/tasks/task_content.c index 3cba8c71ce..65a4ab6974 100644 --- a/tasks/task_content.c +++ b/tasks/task_content.c @@ -1077,7 +1077,6 @@ bool task_push_start_dummy_core(content_ctx_info_t *content_info) content_ctx.is_ups_pref = rarch_ctl(RARCH_CTL_IS_UPS_PREF, NULL); content_ctx.patch_is_blocked = rarch_ctl(RARCH_CTL_IS_PATCH_BLOCKED, NULL); content_ctx.bios_is_missing = rarch_ctl(RARCH_CTL_IS_MISSING_BIOS, NULL); - content_ctx.history_list_enable = false; content_ctx.directory_system = NULL; content_ctx.directory_cache = NULL; content_ctx.name_ips = NULL; @@ -1169,7 +1168,6 @@ bool task_push_load_content_from_playlist_from_menu( content_ctx.is_ups_pref = rarch_ctl(RARCH_CTL_IS_UPS_PREF, NULL); content_ctx.patch_is_blocked = rarch_ctl(RARCH_CTL_IS_PATCH_BLOCKED, NULL); content_ctx.bios_is_missing = rarch_ctl(RARCH_CTL_IS_MISSING_BIOS, NULL); - content_ctx.history_list_enable = false; content_ctx.directory_system = NULL; content_ctx.directory_cache = NULL; content_ctx.name_ips = NULL; @@ -1267,7 +1265,6 @@ bool task_push_start_current_core(content_ctx_info_t *content_info) content_ctx.is_ups_pref = rarch_ctl(RARCH_CTL_IS_UPS_PREF, NULL); content_ctx.patch_is_blocked = rarch_ctl(RARCH_CTL_IS_PATCH_BLOCKED, NULL); content_ctx.bios_is_missing = rarch_ctl(RARCH_CTL_IS_MISSING_BIOS, NULL); - content_ctx.history_list_enable = false; content_ctx.directory_system = NULL; content_ctx.directory_cache = NULL; content_ctx.name_ips = NULL; @@ -1395,7 +1392,6 @@ bool task_push_load_content_with_new_core_from_menu( content_ctx.is_ups_pref = rarch_ctl(RARCH_CTL_IS_UPS_PREF, NULL); content_ctx.patch_is_blocked = rarch_ctl(RARCH_CTL_IS_PATCH_BLOCKED, NULL); content_ctx.bios_is_missing = rarch_ctl(RARCH_CTL_IS_MISSING_BIOS, NULL); - content_ctx.history_list_enable = false; content_ctx.directory_system = NULL; content_ctx.directory_cache = NULL; content_ctx.name_ips = NULL; @@ -1499,7 +1495,6 @@ static bool task_load_content_callback(content_ctx_info_t *content_info, content_ctx.is_ups_pref = rarch_ctl(RARCH_CTL_IS_UPS_PREF, NULL); content_ctx.patch_is_blocked = rarch_ctl(RARCH_CTL_IS_PATCH_BLOCKED, NULL); content_ctx.bios_is_missing = rarch_ctl(RARCH_CTL_IS_MISSING_BIOS, NULL); - content_ctx.history_list_enable = false; content_ctx.directory_system = NULL; content_ctx.directory_cache = NULL; content_ctx.name_ips = NULL; @@ -1723,7 +1718,7 @@ void content_deinit(void) RARCH_LOG("%s: %s.\n", msg_hash_to_str(MSG_REMOVING_TEMPORARY_CONTENT_FILE), path); - if (path_file_remove(path) < 0) + if (!path_file_remove(path)) RARCH_ERR("%s: %s.\n", msg_hash_to_str(MSG_FAILED_TO_REMOVE_TEMPORARY_FILE), path); diff --git a/tasks/task_database.c b/tasks/task_database.c index 908dfc2f5b..6e49a4125a 100644 --- a/tasks/task_database.c +++ b/tasks/task_database.c @@ -86,6 +86,8 @@ int detect_ps1_game(intfstream_t *fd, char *game_id); int detect_psp_game(intfstream_t *fd, char *game_id); +int detect_gc_game(intfstream_t *fd, char *game_id); + int detect_serial_ascii_game(intfstream_t *fd, char *game_id); static intfstream_t* intfstream_open_file(const char *path) @@ -267,6 +269,12 @@ static int intfstream_get_serial(intfstream_t *fd, char *serial) return 0; RARCH_LOG("%s '%s'\n", msg_hash_to_str(MSG_FOUND_DISK_LABEL), serial); } + else if (string_is_equal_fast(system_name, "gc", 2)) + { + if (detect_gc_game(fd, serial) == 0) + return 0; + RARCH_LOG("%s '%s'\n", msg_hash_to_str(MSG_FOUND_DISK_LABEL), serial); + } else { return 0; } @@ -1023,7 +1031,7 @@ static int task_database_iterate_serial_lookup( { char query[50]; char *serial_buf = - bin_to_hex_alloc((uint8_t*)db_state->serial, 10 * sizeof(uint8_t)); + bin_to_hex_alloc((uint8_t*)db_state->serial, strlen(db_state->serial) * sizeof(uint8_t)); if (!serial_buf) return 1; diff --git a/tasks/task_database_cue.c b/tasks/task_database_cue.c index b972face4f..09557c2280 100644 --- a/tasks/task_database_cue.c +++ b/tasks/task_database_cue.c @@ -61,6 +61,7 @@ static struct magic_entry MAGIC_NUMBERS[] = { { 0, "ps1", "\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x02\x00\x02\x00"}, { 0x838840, "pcecd", "\x82\xb1\x82\xcc\x83\x76\x83\x8d\x83\x4f\x83\x89\x83\x80\x82\xcc\x92"}, { 0, "scd", "\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x02\x00\x01\x53"}, + { 0x000400, "gc", "\x00\x01\xC7\x04\x80\x28\x00\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00"}, { 0, NULL, NULL} }; @@ -300,6 +301,21 @@ int detect_psp_game(intfstream_t *fd, char *game_id) return rv; } +int detect_gc_game(intfstream_t *fd, char *game_id) +{ + bool rv = false; + + intfstream_seek(fd, 0, SEEK_SET); + + if (intfstream_read(fd, game_id, 6) > 0) + { + game_id[6] = '\0'; + rv = true; + } + + return rv; +} + /** * Check for an ASCII serial in the first few bits of the ISO (Wii). */ diff --git a/tasks/task_save.c b/tasks/task_save.c index 4d58af7f8f..0986f79a8f 100644 --- a/tasks/task_save.c +++ b/tasks/task_save.c @@ -1263,9 +1263,9 @@ bool content_rename_state(const char *origin, const char *dest) { int ret = 0; if (path_file_exists(dest)) - unlink(dest); + path_file_remove(dest); - ret = rename (origin, dest); + ret = path_file_rename(origin, dest); if (!ret) return true; diff --git a/ui/drivers/cocoa/cocoa_common.m b/ui/drivers/cocoa/cocoa_common.m index 71d3205f65..3c823d5a1c 100644 --- a/ui/drivers/cocoa/cocoa_common.m +++ b/ui/drivers/cocoa/cocoa_common.m @@ -302,11 +302,8 @@ static void event_process_camera_frame(void *pbuf_ptr) } outputTexture = RCVOpenGLTextureGetName(renderTexture); - glBindTexture(GL_TEXTURE_2D, outputTexture); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + + gl_bind_texture(outputTexture, GL_CLAMP_TO_EDGE, GL_LINEAR, GL_LINEAR); CVPixelBufferUnlockBaseAddress(pixelBuffer, 0); [[NSNotificationCenter defaultCenter] postNotificationName:@"NewCameraTextureReady" object:nil]; diff --git a/verbosity.c b/verbosity.c index 9c6c65640c..83dca5d02f 100644 --- a/verbosity.c +++ b/verbosity.c @@ -34,6 +34,7 @@ #endif #include +#include #ifdef HAVE_CONFIG_H #include "config.h" @@ -48,7 +49,8 @@ /* If this is non-NULL. RARCH_LOG and friends * will write to this file. */ -static FILE *log_file = NULL; +static RFILE *log_file = NULL; +static FILE *log_file_fp = NULL; static bool main_verbosity = false; static bool log_file_initialized = false; @@ -82,7 +84,7 @@ bool *verbosity_get_ptr(void) void *retro_main_log_file(void) { - return log_file; + return log_file_fp; } void retro_main_log_file_init(const char *path) @@ -90,19 +92,21 @@ void retro_main_log_file_init(const char *path) if (log_file_initialized) return; - log_file = stderr; + log_file_fp = stderr; if (path == NULL) return; - log_file = fopen(path, "wb"); + log_file = filestream_open(path, RFILE_MODE_WRITE, -1); + log_file_fp = filestream_get_fp(log_file); log_file_initialized = true; } void retro_main_log_file_deinit(void) { - if (log_file && log_file != stderr) - fclose(log_file); + if (log_file && log_file_fp != stderr) + filestream_close(log_file); log_file = NULL; + log_file_fp = NULL; } #if !defined(HAVE_LOGGER) diff --git a/version.all b/version.all index 7b71569142..2bea844e2c 100644 --- a/version.all +++ b/version.all @@ -6,8 +6,8 @@ # /* - pkg/snap/snapcraft.yaml (including the github url) */ #if 0 -RARCH_VERSION="1.6.7" +RARCH_VERSION="1.6.8" #endif #ifndef PACKAGE_VERSION -#define PACKAGE_VERSION "1.6.7" +#define PACKAGE_VERSION "1.6.8" #endif diff --git a/version.dtd b/version.dtd index 9520dcf0d2..d1fb503a4e 100644 --- a/version.dtd +++ b/version.dtd @@ -1 +1 @@ - + diff --git a/wiiu/fs/fs_utils.c b/wiiu/fs/fs_utils.c index 83d74411f5..e3d75c8871 100644 --- a/wiiu/fs/fs_utils.c +++ b/wiiu/fs/fs_utils.c @@ -31,174 +31,174 @@ int MountFS(void *pClient, void *pCmd, char **mount_path) { - int result = -1; + int result = -1; - void *mountSrc = malloc(FS_MOUNT_SOURCE_SIZE); - if(!mountSrc) - return -3; + void *mountSrc = malloc(FS_MOUNT_SOURCE_SIZE); + if(!mountSrc) + return -3; - char* mountPath = (char*) malloc(FS_MAX_MOUNTPATH_SIZE); - if(!mountPath) { - free(mountSrc); - return -4; - } + char* mountPath = (char*) malloc(FS_MAX_MOUNTPATH_SIZE); + if(!mountPath) { + free(mountSrc); + return -4; + } - memset(mountSrc, 0, FS_MOUNT_SOURCE_SIZE); - memset(mountPath, 0, FS_MAX_MOUNTPATH_SIZE); + memset(mountSrc, 0, FS_MOUNT_SOURCE_SIZE); + memset(mountPath, 0, FS_MAX_MOUNTPATH_SIZE); - // Mount sdcard - if (FSGetMountSource(pClient, pCmd, FS_SOURCETYPE_EXTERNAL, mountSrc, -1) == 0) - { - result = FSMount(pClient, pCmd, mountSrc, mountPath, FS_MAX_MOUNTPATH_SIZE, -1); - if((result == 0) && mount_path) { - *mount_path = (char*)malloc(strlen(mountPath) + 1); - if(*mount_path) - strcpy(*mount_path, mountPath); - } - } + // Mount sdcard + if (FSGetMountSource(pClient, pCmd, FS_SOURCETYPE_EXTERNAL, mountSrc, -1) == 0) + { + result = FSMount(pClient, pCmd, mountSrc, mountPath, FS_MAX_MOUNTPATH_SIZE, -1); + if((result == 0) && mount_path) { + *mount_path = (char*)malloc(strlen(mountPath) + 1); + if(*mount_path) + strcpy(*mount_path, mountPath); + } + } - free(mountPath); - free(mountSrc); - return result; + free(mountPath); + free(mountSrc); + return result; } int UmountFS(void *pClient, void *pCmd, const char *mountPath) { - int result = -1; - result = FSUnmount(pClient, pCmd, mountPath, -1); + int result = -1; + result = FSUnmount(pClient, pCmd, mountPath, -1); - return result; + return result; } int LoadFileToMem(const char *filepath, u8 **inbuffer, u32 *size) { - //! always initialze input - *inbuffer = NULL; - if(size) - *size = 0; + //! always initialze input + *inbuffer = NULL; + if(size) + *size = 0; - int iFd = open(filepath, O_RDONLY); - if (iFd < 0) - return -1; + int iFd = open(filepath, O_RDONLY); + if (iFd < 0) + return -1; - u32 filesize = lseek(iFd, 0, SEEK_END); - lseek(iFd, 0, SEEK_SET); + u32 filesize = lseek(iFd, 0, SEEK_END); + lseek(iFd, 0, SEEK_SET); - u8 *buffer = (u8 *) malloc(filesize); - if (buffer == NULL) - { - close(iFd); - return -2; - } + u8 *buffer = (u8 *) malloc(filesize); + if (buffer == NULL) + { + close(iFd); + return -2; + } - u32 blocksize = 0x4000; - u32 done = 0; - int readBytes = 0; + u32 blocksize = 0x4000; + u32 done = 0; + int readBytes = 0; - while(done < filesize) - { - if(done + blocksize > filesize) { - blocksize = filesize - done; - } - readBytes = read(iFd, buffer + done, blocksize); - if(readBytes <= 0) - break; - done += readBytes; - } + while(done < filesize) + { + if(done + blocksize > filesize) { + blocksize = filesize - done; + } + readBytes = read(iFd, buffer + done, blocksize); + if(readBytes <= 0) + break; + done += readBytes; + } - close(iFd); + close(iFd); - if (done != filesize) - { - free(buffer); - return -3; - } + if (done != filesize) + { + free(buffer); + return -3; + } - *inbuffer = buffer; + *inbuffer = buffer; - //! sign is optional input - if(size) - *size = filesize; + //! sign is optional input + if(size) + *size = filesize; - return filesize; + return filesize; } int CheckFile(const char * filepath) { - if(!filepath) - return 0; + if(!filepath) + return 0; - struct stat filestat; + struct stat filestat; - char dirnoslash[strlen(filepath)+2]; - snprintf(dirnoslash, sizeof(dirnoslash), "%s", filepath); + char dirnoslash[strlen(filepath)+2]; + snprintf(dirnoslash, sizeof(dirnoslash), "%s", filepath); - while(dirnoslash[strlen(dirnoslash)-1] == '/') - dirnoslash[strlen(dirnoslash)-1] = '\0'; + while(dirnoslash[strlen(dirnoslash)-1] == '/') + dirnoslash[strlen(dirnoslash)-1] = '\0'; - char * notRoot = strrchr(dirnoslash, '/'); - if(!notRoot) - { - strcat(dirnoslash, "/"); - } + char * notRoot = strrchr(dirnoslash, '/'); + if(!notRoot) + { + strcat(dirnoslash, "/"); + } - if (stat(dirnoslash, &filestat) == 0) - return 1; + if (stat(dirnoslash, &filestat) == 0) + return 1; - return 0; + return 0; } int CreateSubfolder(const char * fullpath) { - if(!fullpath) - return 0; + if(!fullpath) + return 0; - int result = 0; + int result = 0; - char dirnoslash[strlen(fullpath)+1]; - strcpy(dirnoslash, fullpath); + char dirnoslash[strlen(fullpath)+1]; + strcpy(dirnoslash, fullpath); - int pos = strlen(dirnoslash)-1; - while(dirnoslash[pos] == '/') - { - dirnoslash[pos] = '\0'; - pos--; - } + int pos = strlen(dirnoslash)-1; + while(dirnoslash[pos] == '/') + { + dirnoslash[pos] = '\0'; + pos--; + } - if(CheckFile(dirnoslash)) - { - return 1; - } - else - { - char parentpath[strlen(dirnoslash)+2]; - strcpy(parentpath, dirnoslash); - char * ptr = strrchr(parentpath, '/'); + if(CheckFile(dirnoslash)) + { + return 1; + } + else + { + char parentpath[strlen(dirnoslash)+2]; + strcpy(parentpath, dirnoslash); + char * ptr = strrchr(parentpath, '/'); - if(!ptr) - { - //!Device root directory (must be with '/') - strcat(parentpath, "/"); - struct stat filestat; - if (stat(parentpath, &filestat) == 0) - return 1; + if(!ptr) + { + //!Device root directory (must be with '/') + strcat(parentpath, "/"); + struct stat filestat; + if (stat(parentpath, &filestat) == 0) + return 1; - return 0; - } + return 0; + } - ptr++; - ptr[0] = '\0'; + ptr++; + ptr[0] = '\0'; - result = CreateSubfolder(parentpath); - } + result = CreateSubfolder(parentpath); + } - if(!result) - return 0; + if(!result) + return 0; - if (mkdir(dirnoslash, 0777) == -1) - { - return 0; - } + if (mkdir(dirnoslash, 0777) == -1) + { + return 0; + } - return 1; + return 1; } diff --git a/wiiu/hbl.c b/wiiu/hbl.c index 685cd42318..6d4c438e95 100644 --- a/wiiu/hbl.c +++ b/wiiu/hbl.c @@ -21,6 +21,7 @@ #include #include #include +#include #include #include "hbl.h" @@ -236,7 +237,7 @@ int HBL_loadToMemory(const char *filepath, u32 args_size) if (bytesRead != fileSize) { free(buffer); - printf("File loading not finished for file %s, finished %i of %i bytes\n", filepath, bytesRead, + printf("File loading not finished for file %s, finished %" PRIi32 " of %" PRIi32 " bytes\n", filepath, bytesRead, fileSize); printf("File read failure"); return -1; diff --git a/wiiu/system/exception_handler.c b/wiiu/system/exception_handler.c index 0bc1b443b4..7ec7dc3f90 100644 --- a/wiiu/system/exception_handler.c +++ b/wiiu/system/exception_handler.c @@ -18,6 +18,7 @@ #include #include #include +#include #include #include "wiiu_dbg.h" #include "exception_handler.h" @@ -34,7 +35,7 @@ extern unsigned int __code_end; #define TEXT_END (unsigned int)&__code_end void test_os_exceptions(void); -void exception_print_symbol(unsigned int addr); +void exception_print_symbol(uint32_t addr); typedef struct _framerec { @@ -91,7 +92,7 @@ void __attribute__((__noreturn__)) exception_cb(OSContext* ctx, OSExceptionType 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 %08X", 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"); @@ -107,7 +108,7 @@ void __attribute__((__noreturn__)) exception_cb(OSContext* ctx, OSExceptionType } else if (ctx->dsisr & DSISR_BAD_CACHING) { buf_add(" uncached memory at"); } - buf_add(" %08X\n", ctx->dar); + buf_add(" %08" PRIX32 "\n", ctx->dar); } else if (type == OS_EXCEPTION_TYPE_ISI) { buf_add("ISI: Bad execute of"); if (ctx->srr1 & SRR1_ISI_TRANSLATION_PROT) { @@ -115,7 +116,7 @@ void __attribute__((__noreturn__)) exception_cb(OSContext* ctx, OSExceptionType } else if (ctx->srr1 & SRR1_ISI_TRANSLATION_MISS) { buf_add(" unmapped memory at"); } - buf_add(" %08X\n", ctx->srr0); + buf_add(" %08" PRIX32 "\n", ctx->srr0); } else if (type == OS_EXCEPTION_TYPE_PROGRAM) { buf_add("PROG:"); if (ctx->srr1 & SRR1_PROG_BAD_INSTR) { @@ -130,9 +131,9 @@ void __attribute__((__noreturn__)) exception_cb(OSContext* ctx, OSExceptionType buf_add(" Out-of-spec error (!) at"); } if (ctx->srr1 & SRR1_PROG_SRR0_INACCURATE) { - buf_add("%08X-ish\n", ctx->srr0); + buf_add("%08" PRIX32 "-ish\n", ctx->srr0); } else { - buf_add("%08X\n", ctx->srr0); + buf_add("%08" PRIX32 "\n", ctx->srr0); } } @@ -140,14 +141,14 @@ void __attribute__((__noreturn__)) exception_cb(OSContext* ctx, OSExceptionType There's space for two more regs at the end of the last line... Any ideas for what to put there? */ buf_add( \ - "r0 %08X r1 %08X r2 %08X r3 %08X r4 %08X\n" \ - "r5 %08X r6 %08X r7 %08X r8 %08X r9 %08X\n" \ - "r10 %08X r11 %08X r12 %08X r13 %08X r14 %08X\n" \ - "r15 %08X r16 %08X r17 %08X r18 %08X r19 %08X\n" \ - "r20 %08X r21 %08X r22 %08X r23 %08X r24 %08X\n" \ - "r25 %08X r26 %08X r27 %08X r28 %08X r29 %08X\n" \ - "r30 %08X r31 %08X lr %08X sr1 %08X dsi %08X\n" \ - "ctr %08X cr %08X xer %08X\n",\ + "r0 %08" PRIX32 " r1 %08" PRIX32 " r2 %08" PRIX32 " r3 %08" PRIX32 " r4 %08" PRIX32 "\n" \ + "r5 %08" PRIX32 " r6 %08" PRIX32 " r7 %08" PRIX32 " r8 %08" PRIX32 " r9 %08" PRIX32 "\n" \ + "r10 %08" PRIX32 " r11 %08" PRIX32 " r12 %08" PRIX32 " r13 %08" PRIX32 " r14 %08" PRIX32 "\n" \ + "r15 %08" PRIX32 " r16 %08" PRIX32 " r17 %08" PRIX32 " r18 %08" PRIX32 " r19 %08" PRIX32 "\n" \ + "r20 %08" PRIX32 " r21 %08" PRIX32 " r22 %08" PRIX32 " r23 %08" PRIX32 " r24 %08" PRIX32 "\n" \ + "r25 %08" PRIX32 " r26 %08" PRIX32 " r27 %08" PRIX32 " r28 %08" PRIX32 " r29 %08" PRIX32 "\n" \ + "r30 %08" PRIX32 " r31 %08" PRIX32 " lr %08" PRIX32 " sr1 %08" PRIX32 " dsi %08" PRIX32 "\n" \ + "ctr %08" PRIX32 " cr %08" PRIX32 " xer %08" PRIX32 "\n",\ ctx->gpr[0], ctx->gpr[1], ctx->gpr[2], ctx->gpr[3], ctx->gpr[4], \ ctx->gpr[5], ctx->gpr[6], ctx->gpr[7], ctx->gpr[8], ctx->gpr[9], \ ctx->gpr[10], ctx->gpr[11], ctx->gpr[12], ctx->gpr[13], ctx->gpr[14], \ @@ -190,13 +191,13 @@ BOOL __attribute__((__noreturn__)) exception_prog_cb(OSContext* ctx) { exception_cb(ctx, OS_EXCEPTION_TYPE_PROGRAM); } -void exception_print_symbol(unsigned int addr) { +void exception_print_symbol(uint32_t addr) { /* Check if addr is within this RPX's .text */ if (addr >= TEXT_START && addr < TEXT_END) { char symbolName[64]; OSGetSymbolName(addr, symbolName, 63); - buf_add("%08X(%08X):%s\n", addr, addr - TEXT_START, symbolName); + buf_add("%08" PRIX32 "(%08" PRIX32 "):%s\n", addr, addr - TEXT_START, symbolName); } /* Check if addr is within the system library area... */ else if ((addr >= 0x01000000 && addr < 0x01800000) || @@ -218,23 +219,23 @@ void exception_print_symbol(unsigned int addr) { *seperator = '|'; /* We got one! */ if (libAddr) { - buf_add("%08X(%08X):%s\n", addr, addr - (unsigned int)libAddr, symbolName); + buf_add("%08" PRIX32 "(%08" PRIX32 "):%s\n", addr, addr - (unsigned int)libAddr, symbolName); OSDynLoad_Release(libAddr); return; } } /* Ah well. We can still print the basics. */ - buf_add("%08X( ):%s\n", addr, symbolName); + buf_add("%08" PRIX32 "( ):%s\n", addr, symbolName); } /* Check if addr is in the HBL range TODO there's no real reason we couldn't find the symbol here, it's just laziness and arguably uneccesary bloat */ else if (addr >= 0x00800000 && addr < 0x01000000) { - buf_add("%08X(%08X):\n", addr, addr - 0x00800000); + buf_add("%08" PRIX32 "(%08" PRIX32 "):\n", addr, addr - 0x00800000); } /* If all else fails, just say "unknown" */ else { - buf_add("%08X( ):\n", addr); + buf_add("%08" PRIX32 "( ):\n", addr); } } diff --git a/wiiu/wiiu_dbg.h b/wiiu/wiiu_dbg.h index 01350857db..dca469321a 100644 --- a/wiiu/wiiu_dbg.h +++ b/wiiu/wiiu_dbg.h @@ -3,6 +3,7 @@ #include #include +#include #ifdef WIIU #include @@ -26,11 +27,11 @@ void DisassemblePPCRange(void *start, void *end, void* printf_func, void* GetSym //#define DEBUG_HOLD() do{printf("%s@%s:%d.\n",__FUNCTION__, __FILE__, __LINE__);fflush(stdout);wait_for_input();}while(0) #define DEBUG_LINE() do{printf("%s:%4d %s().\n", __FILE__, __LINE__, __FUNCTION__);fflush(stdout);}while(0) #define DEBUG_STR(X) printf( "%s: %s\n", #X, (char*)(X)) -#define DEBUG_VAR(X) printf( "%-20s: 0x%08X\n", #X, (uint32_t)(X)) -#define DEBUG_VAR2(X) printf( "%-20s: 0x%08X (%i)\n", #X, (uint32_t)(X), (int)(X)) -#define DEBUG_INT(X) printf( "%-20s: %10i\n", #X, (int32_t)(X)) +#define DEBUG_VAR(X) printf( "%-20s: 0x%08" PRIX32 "\n", #X, (uint32_t)(X)) +#define DEBUG_VAR2(X) printf( "%-20s: 0x%08" PRIX32 " (%i)\n", #X, (uint32_t)(X), (int)(X)) +#define DEBUG_INT(X) printf( "%-20s: %10" PRIi32 "\n", #X, (int32_t)(X)) #define DEBUG_FLOAT(X) printf( "%-20s: %10.3f\n", #X, (float)(X)) -#define DEBUG_VAR64(X) printf( #X"\r\t\t\t\t : 0x%016llX\n", (uint64_t)(X)) +#define DEBUG_VAR64(X) printf( #X"\r\t\t\t\t : 0x%016" PRIX64 "\n", (uint64_t)(X)) //#define DEBUG_ERROR(X) do{if(X)dump_result_value(X);}while(0) #define PRINTFPOS(X,Y) "\x1b["#X";"#Y"H" #define PRINTFPOS_STR(X,Y) "\x1b[" X ";" Y "H"