mirror of
https://github.com/libretro/RetroArch.git
synced 2024-11-24 08:30:16 +00:00
Merge branch 'master' into translation-update-script
This commit is contained in:
commit
c6139b7285
@ -32,6 +32,8 @@ matrix:
|
||||
env: CXX_BUILD=1 CROSS_COMPILE=x86_64-w64-mingw32- CFLAGS="-D_WIN32_WINNT=0x0501"
|
||||
- compiler: gcc
|
||||
env: CC=gcc-8 CXX=g++-8
|
||||
- compiler: gcc
|
||||
env: CC="gcc-8 --sysroot=/" CXX="g++-8 --sysroot=/"
|
||||
- compiler: gcc
|
||||
env: C89_BUILD=1 CC=gcc-8 CXX=g++-8
|
||||
- compiler: gcc
|
||||
@ -105,7 +107,7 @@ matrix:
|
||||
|
||||
before_install:
|
||||
- |
|
||||
if [ "$CC" = gcc-8 ]; then
|
||||
if [[ "$CC" =~ ^gcc-8.* ]]; then
|
||||
# Install a more recent gcc than the default
|
||||
sudo apt-get install -y g++-8
|
||||
elif [ "$CC" = clang-6.0 ]; then
|
||||
|
27
.vscode/launch.json
vendored
27
.vscode/launch.json
vendored
@ -40,6 +40,31 @@
|
||||
}
|
||||
]
|
||||
},
|
||||
|
||||
{
|
||||
"name": "PSP-GDB Debugger",
|
||||
"type": "cppdbg",
|
||||
"request": "launch",
|
||||
"program": "${workspaceFolder}/retroarchpsp.elf",
|
||||
"stopAtEntry": false,
|
||||
"cwd": "${workspaceFolder}",
|
||||
"environment": [],
|
||||
"setupCommands": [
|
||||
{
|
||||
"text": "symbol-file ${workspaceFolder}/retroarchpsp.elf",
|
||||
"description": "read symbols for elf file",
|
||||
"ignoreFailures": true
|
||||
},
|
||||
{
|
||||
"description": "Enable all-exceptions",
|
||||
"text": "-exec \"catch throw\"",
|
||||
"ignoreFailures": true
|
||||
}
|
||||
],
|
||||
"showDisplayString": true,
|
||||
"targetArchitecture": "mips",
|
||||
"MIMode": "gdb",
|
||||
"miDebuggerPath": "/usr/local/pspdev/bin/psp-gdb",
|
||||
"miDebuggerServerAddress": "127.0.0.1:10001",
|
||||
}
|
||||
]
|
||||
}
|
43
CHANGES.md
43
CHANGES.md
@ -1,23 +1,62 @@
|
||||
# Future
|
||||
- BUG: Ensure core info is always initialised when calling 'drivers_init()'. This bug could prevent cores from doing content runtime logging
|
||||
- BUG/CRASH/CORE UPDATER: Fix potential double free error
|
||||
|
||||
# 1.8.4
|
||||
- ANDROID/BUGFIX: Prevent crash when Android device is minimized and you go back to the app
|
||||
- CAMERA/BUGFIX: Fix crash when a core requires the camera driver and the platform only has a null driver. This would crash mgba on Wii for example
|
||||
- DISK CONTROL: Cycle Disk Tray now becomes Eject Disk or Insert Disk depending upon current drive state
|
||||
- DISK CONTROL: Current Disk Index is only shown when the current disk has been ejected
|
||||
- DISK CONTROL: The old Insert Disk entry has been changed to Load New Disk, and is only shown when a disk is currently inserted (this is because loading a new disk from the filesystem - i.e. bypassing the m3u playlist disk index interface - automatically ejects and inserts disks, and so cannot be done while the virtual drive is empty)
|
||||
- DISK CONTROL: The Current Disk Index may now be set more easily via a drop-down list.
|
||||
- DISK CONTROL: Selecting Eject Disk automatically moves the menu selection to the Current Disk Index entry
|
||||
- DISK CONTROL: Selecting an index via the Current Disk Index drop-down list automatically moves the menu selection back to Insert Disk
|
||||
- DISK CONTROL: The Disk Control entry sublabels have been changed for greater clarity
|
||||
- DISK CONTROL: All of the horrendous notification spam has been removed. Notifications are now only shown in the event of an error, or when the menu itself does not provide sufficient visual feedback (note that using hotkeys to swap disks still produces the old style notifications, since this is typically only done while content is running - i.e. no menu). The duration of disk-related info notifications has also been reduced to a more sane level.
|
||||
- DISK CONTROL: A new Resume content after changing disks option has been added under Settings > User Interface. When enabled (default setting), content is resumed automatically after selecting either Insert Disk or Load New Disk (when disabled, the menu remains open, obviously...)
|
||||
- DISK CONTROL/BUGFIX: The Disk Control menu now has the correct title
|
||||
- DISK CONTROL/BUGFIX: Selecting a disk via the Load New Disk file browser no longer flushes the user back to the top level menu (it now correctly returns to the Disk Control menu)
|
||||
- LIBNX/SWITCH: Updated libnx integration to v3.0.0. This also cherry-picks libnx commit 583d6bb92dcbb33b6bb4a0fa1a9df6e3725d6ef6, which should fix the requirement having to turn rumble off and on in the system settings once per reboot
|
||||
- PLAYLISTS: Add 'Clean Playlist' option
|
||||
|
||||
# 1.8.3
|
||||
- ANDROID/BUGFIX: Fix 'Install or Restore Core' regression
|
||||
- BUGFIX: Ensure core info is always initialised when calling 'drivers_init()'. This bug could prevent cores from doing content runtime logging
|
||||
- BUGFIX/MENU: History size can only be set to 1 at a minimum
|
||||
- BUGFIX/MENU: (XMB/OZONE) Fix 'quick menu' detection. XMB would not display savestate thumbnails in the quick menu if it was accessed via the main menu
|
||||
- BUGFIX/CRASH/CORE UPDATER: Fix potential double free error
|
||||
- BUGFIX/CRASH/OPENGL/WINDOWS: Fix regression in 1.8.2 that would cause GL-based cores to fail because it would try to erroneously load libGLESv2.dll instead of OpenGL32.dll (cores affected: VitaQuake 2/3/Dhewm3, possibly more)
|
||||
- BUGFIX/MENU/DESKTOP UI: Show desktop menu on startup does not launch Qt UI on Linux
|
||||
- BUGFIX: Entries in the Playlist Thumbnails Updater list were displaying improper sublabels. I have no idea when this broke... The issue is now fixed
|
||||
- CHEEVOS: Don't disable achievement when AddAddress generates an out-of-range address
|
||||
- CHEEVOS: Don't reset triggers/leaderboards that failed to load
|
||||
- CHEEVOS: Don't count unsupported achievements as unlocked
|
||||
- CORE UPDATER: Display number of cores updated when updating installed cores
|
||||
- DINGUX: Initial port
|
||||
- D3D11: Block FL9_3 devices from D3D11 driver because they don't work anyway (current D3D11 driver uses SM4.0 which requires FL10_0 and up)
|
||||
- D3D11: Fallback to GL driver when D3D11 fails
|
||||
- EMSCRIPTEN: Fix assets
|
||||
- HISTORY/FAVORITES: Bump up default to 200 entries from 100
|
||||
- FFMPEG CORE: Implement packet buffer, fixes MP4 video playback for many files
|
||||
- LOCALIZATION: Update Italian translation
|
||||
- LOCALIZATION: Update Polish translation
|
||||
- LOCALIZATION: Update Russian translation
|
||||
- LOCALIZATION: Update Spanish translation
|
||||
- MENU: Added 'Hosting' menu under Netplay menu
|
||||
- MENU: Added 'Subsystems' menu
|
||||
- MENU/FILEBROWSER: Fix file selection issues when starting from (or navigating to) the top level directory
|
||||
- MENU/WIDGETS: Prevent looping of task title text
|
||||
- RASPBERRY PI: Fix BGRA8888 color inversion issues in the menu and elsewhere with VideoCore GL drivers
|
||||
- NETPLAY/RELAY: Add Sao Paulo (Brazil) relay server
|
||||
- NETPLAY/RELAY: Fix the “spectator” bug when using the relay server – When a player switches into the spectator mode (pressing “i”) while using the relay server, all players will disconnect.
|
||||
- NETPLAY/RELAY: Overall stability has improved. Fixed a memory leak that would cause the relay server to become unresponsive after some time.
|
||||
- NETPLAY/RELAY: Fixed critical bug that would cause all players to be disconnected from the relay server if one player was leaving the game. That bug had been open for one year and we were finally able to fix it.
|
||||
- SWITCH/LIBNX/BUGFIX: Fix onscreen keyboard input regression
|
||||
- THUMBNAIL UPDATER: When waiting for individual thumbnail file http transfers to complete, the task status checking is more accurate. This uses the same method as the new core updater - we now wait until the task is 'really' complete, instead of relying on the (slightly nebulous) 'task finished' state
|
||||
- UWP: Add ANGLE support
|
||||
- UWP: Wire up get_metrics to the fake context of D3D9/10/11/12 driver, enabling proper scaling and mouse/touch gestures
|
||||
- VITA: Re-add Online Updater
|
||||
- VULKAN: Fix font driver 'vulkan_get_message_width()' function
|
||||
- VIDEO FILTERS: Only use threads when the number exceeds 1. Fixes race conditions with some CPU filters on Vita
|
||||
- WINDOWS: Add ANGLE support for x64, separate binary (for now?)
|
||||
|
||||
# 1.8.2
|
||||
- BUG/CRASH/GLSLANG: Fix glslang crashing error - managed to reproduce an issue which has been plaguing
|
||||
|
47
Makefile
47
Makefile
@ -14,7 +14,11 @@ include config.mk
|
||||
# (It'd be better to put this comment in that file, but .gitignore doesn't work on files that exist in the repo.)
|
||||
-include Makefile.local
|
||||
|
||||
ifeq ($(HAVE_ANGLE), 1)
|
||||
TARGET = retroarch_angle
|
||||
else
|
||||
TARGET = retroarch
|
||||
endif
|
||||
|
||||
OBJ :=
|
||||
LIBS :=
|
||||
@ -41,6 +45,8 @@ else
|
||||
DEF_FLAGS += -ffast-math
|
||||
endif
|
||||
|
||||
DEF_FLAGS += -Wall
|
||||
|
||||
ifneq ($(findstring BSD,$(OS)),)
|
||||
DEF_FLAGS += -DBSD
|
||||
LDFLAGS += -L/usr/local/lib
|
||||
@ -64,7 +70,7 @@ endif
|
||||
include Makefile.common
|
||||
|
||||
ifeq ($(shell $(CC) -v 2>&1 | grep -c "clang"),1)
|
||||
DEFINES += -Wno-invalid-source-encoding -Wno-incompatible-ms-struct
|
||||
DEF_FLAGS += -Wno-invalid-source-encoding -Wno-incompatible-ms-struct
|
||||
endif
|
||||
|
||||
ifeq ($(shell $(CC) -v 2>&1 | grep -c "tcc"),1)
|
||||
@ -76,7 +82,7 @@ endif
|
||||
HEADERS = $(wildcard */*/*.h) $(wildcard */*.h) $(wildcard *.h)
|
||||
|
||||
ifeq ($(MISSING_DECLS), 1)
|
||||
DEFINES += -Werror=missing-declarations
|
||||
DEF_FLAGS += -Werror=missing-declarations
|
||||
endif
|
||||
|
||||
ifeq ($(HAVE_DYLIB), 1)
|
||||
@ -102,10 +108,20 @@ ifneq ($(findstring Win32,$(OS)),)
|
||||
LDFLAGS += -mwindows
|
||||
endif
|
||||
|
||||
DEF_FLAGS += -Wall $(INCLUDE_DIRS) -I. -Ideps -Ideps/stb
|
||||
ifneq ($(CXX_BUILD), 1)
|
||||
ifneq ($(C89_BUILD),)
|
||||
CFLAGS += -std=c89 -ansi -pedantic -Werror=pedantic -Wno-long-long
|
||||
else ifeq ($(HAVE_C99), 1)
|
||||
CFLAGS += $(C99_CFLAGS)
|
||||
endif
|
||||
|
||||
CFLAGS += -D_GNU_SOURCE
|
||||
endif
|
||||
|
||||
DEF_FLAGS += $(INCLUDE_DIRS) -I. -Ideps -Ideps/stb
|
||||
|
||||
CFLAGS += $(DEF_FLAGS)
|
||||
CXXFLAGS += $(DEF_FLAGS) -std=c++11 -D__STDC_CONSTANT_MACROS
|
||||
CXXFLAGS += $(DEF_FLAGS) -D__STDC_CONSTANT_MACROS
|
||||
OBJCFLAGS := $(CFLAGS) -D__STDC_CONSTANT_MACROS
|
||||
|
||||
ifeq ($(HAVE_CXX), 1)
|
||||
@ -123,29 +139,6 @@ else
|
||||
LINK = $(CC)
|
||||
endif
|
||||
|
||||
ifneq ($(CXX_BUILD), 1)
|
||||
ifneq ($(GNU90_BUILD), 1)
|
||||
ifneq ($(findstring icc,$(CC)),)
|
||||
CFLAGS += -std=c99 -D_GNU_SOURCE
|
||||
else
|
||||
CFLAGS += -std=gnu99 -D_GNU_SOURCE
|
||||
endif
|
||||
endif
|
||||
|
||||
ifneq ($(C89_BUILD),)
|
||||
CFLAGS += -std=c89 -ansi -pedantic -Werror=pedantic -Wno-long-long
|
||||
endif
|
||||
endif
|
||||
|
||||
ifeq ($(NOUNUSED), yes)
|
||||
CFLAGS += -Wno-unused-result
|
||||
CXXFLAGS += -Wno-unused-result
|
||||
endif
|
||||
ifeq ($(NOUNUSED_VARIABLE), yes)
|
||||
CFLAGS += -Wno-unused-variable
|
||||
CXXFLAGS += -Wno-unused-variable
|
||||
endif
|
||||
|
||||
RARCH_OBJ := $(addprefix $(OBJDIR)/,$(OBJ))
|
||||
|
||||
ifneq ($(X86),)
|
||||
|
@ -7,6 +7,18 @@ ifeq ($(HAVE_STACK_USAGE), 1)
|
||||
DEF_FLAGS += -fstack-usage
|
||||
endif
|
||||
|
||||
ifeq ($(HAVE_NOUNUSED), 1)
|
||||
DEF_FLAGS += $(NOUNUSED_CFLAGS)
|
||||
endif
|
||||
|
||||
ifeq ($(HAVE_NOUNUSED_VARIABLE), 1)
|
||||
DEF_FLAGS += $(NOUNUSED_VARIABLE_CFLAGS)
|
||||
endif
|
||||
|
||||
ifeq ($(HAVE_CXX11), 1)
|
||||
CXXFLAGS += $(CXX11_CFLAGS)
|
||||
endif
|
||||
|
||||
ifeq ($(HAVE_GL_CONTEXT),)
|
||||
HAVE_GL_CONTEXT = 0
|
||||
HAVE_GL_MODERN = 0
|
||||
@ -153,7 +165,6 @@ ifeq ($(HAVE_DR_MP3), 1)
|
||||
endif
|
||||
|
||||
OBJ += frontend/frontend_driver.o \
|
||||
frontend/drivers/platform_null.o \
|
||||
retroarch.o \
|
||||
msg_hash.o \
|
||||
intl/msg_hash_us.o \
|
||||
@ -202,13 +213,13 @@ endif
|
||||
OBJ += \
|
||||
$(LIBRETRO_COMM_DIR)/file/nbio/nbio_intf.o \
|
||||
$(LIBRETRO_COMM_DIR)/file/file_path.o \
|
||||
$(LIBRETRO_COMM_DIR)/file/file_path_io.o \
|
||||
file_path_special.o \
|
||||
file_path_str.o \
|
||||
$(LIBRETRO_COMM_DIR)/hash/rhash.o \
|
||||
input/common/input_hid_common.o \
|
||||
input/input_mapper.o \
|
||||
led/led_driver.o \
|
||||
led/drivers/led_null.o \
|
||||
gfx/video_coord_array.o \
|
||||
gfx/video_display_server.o \
|
||||
gfx/video_crt_switch.o \
|
||||
@ -242,23 +253,11 @@ OBJ += \
|
||||
$(LIBRETRO_COMM_DIR)/audio/dsp_filter.o \
|
||||
$(LIBRETRO_COMM_DIR)/audio/resampler/drivers/sinc_resampler.o \
|
||||
$(LIBRETRO_COMM_DIR)/audio/resampler/drivers/nearest_resampler.o \
|
||||
$(LIBRETRO_COMM_DIR)/audio/resampler/drivers/null_resampler.o \
|
||||
$(LIBRETRO_COMM_DIR)/utils/md5.o \
|
||||
location/drivers/nulllocation.o \
|
||||
camera/drivers/nullcamera.o \
|
||||
wifi/drivers/nullwifi.o \
|
||||
gfx/drivers/nullgfx.o \
|
||||
gfx/display_servers/dispserv_null.o \
|
||||
audio/drivers/nullaudio.o \
|
||||
input/drivers/nullinput.o \
|
||||
input/drivers_hid/null_hid.o \
|
||||
input/drivers_joypad/null_joypad.o \
|
||||
playlist.o \
|
||||
record/drivers/record_null.o \
|
||||
$(LIBRETRO_COMM_DIR)/features/features_cpu.o \
|
||||
performance_counters.o \
|
||||
verbosity.o \
|
||||
midi/drivers/null_midi.o \
|
||||
$(LIBRETRO_COMM_DIR)/playlists/label_sanitization.o \
|
||||
manual_content_scan.o
|
||||
|
||||
@ -826,10 +825,8 @@ ifeq ($(HAVE_MENU_COMMON), 1)
|
||||
menu/menu_displaylist.o \
|
||||
menu/menu_animation.o \
|
||||
menu/drivers/menu_generic.o \
|
||||
menu/drivers/null.o \
|
||||
menu/menu_thumbnail_path.o \
|
||||
menu/menu_thumbnail.o \
|
||||
menu/drivers_display/menu_display_null.o
|
||||
menu/menu_thumbnail.o
|
||||
|
||||
ifeq ($(HAVE_MENU_WIDGETS), 1)
|
||||
OBJ += menu/widgets/menu_widgets.o
|
||||
@ -1284,8 +1281,14 @@ endif
|
||||
ifeq ($(HAVE_EGL), 1)
|
||||
DEFINES += -DHAVE_EGL
|
||||
DEF_FLAGS += $(EGL_CFLAGS)
|
||||
LIBS += $(EGL_LIBS)
|
||||
OBJ += gfx/common/egl_common.o
|
||||
|
||||
ifeq ($(HAVE_DYNAMIC_EGL), 1)
|
||||
DEFINES += -DHAVE_DYNAMIC_EGL
|
||||
else
|
||||
LIBS += $(EGL_LIBS)
|
||||
endif
|
||||
|
||||
endif
|
||||
|
||||
ifeq ($(HAVE_SDL2), 1)
|
||||
@ -1299,6 +1302,12 @@ else ifeq ($(HAVE_SDL), 1)
|
||||
OBJ += gfx/drivers/sdl_gfx.o
|
||||
DEF_FLAGS += $(SDL_CFLAGS)
|
||||
LIBS += $(SDL_LIBS)
|
||||
else ifeq ($(HAVE_SDL_DINGUX), 1)
|
||||
HAVE_SDL_COMMON = 1
|
||||
DEF_FLAGS += -DHAVE_SDL -DHAVE_SDL_DINGUX
|
||||
OBJ += gfx/drivers/sdl_dingux_gfx.o
|
||||
DEF_FLAGS += $(SDL_DINGUX_CFLAGS)
|
||||
LIBS += $(SDL_DINGUX_LIBS)
|
||||
endif
|
||||
|
||||
ifeq ($(HAVE_SDL_COMMON), 1)
|
||||
@ -1751,6 +1760,11 @@ ifeq ($(HAVE_V4L2),1)
|
||||
LIBS += $(V4L2_LIBS)
|
||||
endif
|
||||
|
||||
# Accessibility
|
||||
ifeq ($(HAVE_ACCESSIBILITY), 1)
|
||||
DEFINES += -DHAVE_ACCESSIBILITY
|
||||
endif
|
||||
|
||||
# Things that depend on network availability
|
||||
|
||||
ifeq ($(HAVE_NETWORKING), 1)
|
||||
@ -1959,8 +1973,6 @@ endif
|
||||
ifeq ($(HAVE_ANGLE), 1)
|
||||
OBJ += gfx/common/angle_common.o
|
||||
DEFINES += -DHAVE_ANGLE
|
||||
# TODO/FIXME - should perhaps set these libraries as separate CFLAG variables in qb system
|
||||
LIBS += -lEGL
|
||||
endif
|
||||
|
||||
# Record
|
||||
@ -1968,8 +1980,9 @@ endif
|
||||
ifeq ($(HAVE_FFMPEG), 1)
|
||||
OBJ += record/drivers/record_ffmpeg.o \
|
||||
cores/libretro-ffmpeg/ffmpeg_core.o \
|
||||
cores/libretro-ffmpeg/packet_buffer.o \
|
||||
cores/libretro-ffmpeg/video_buffer.o \
|
||||
$(LIBRETRO_COMM_DIR)/rthreads/tpool.o
|
||||
$(LIBRETRO_COMM_DIR)/rthreads/tpool.o
|
||||
|
||||
LIBS += $(AVCODEC_LIBS) $(AVFORMAT_LIBS) $(AVUTIL_LIBS) $(SWSCALE_LIBS) $(SWRESAMPLE_LIBS) $(FFMPEG_LIBS)
|
||||
DEFINES += -DHAVE_FFMPEG
|
||||
|
@ -24,11 +24,11 @@ OBJ := ctr/ctr_system.o \
|
||||
frontend/frontend_salamander.o \
|
||||
frontend/frontend_driver.o \
|
||||
frontend/drivers/platform_ctr.o \
|
||||
frontend/drivers/platform_null.o \
|
||||
libretro-common/encodings/encoding_utf.o \
|
||||
libretro-common/compat/compat_strcasestr.o \
|
||||
libretro-common/compat/fopen_utf8.o \
|
||||
libretro-common/file/file_path.o \
|
||||
libretro-common/file/file_path_io.o \
|
||||
libretro-common/string/stdstring.o \
|
||||
libretro-common/lists/string_list.o \
|
||||
libretro-common/lists/dir_list.o \
|
||||
|
188
Makefile.dingux
Normal file
188
Makefile.dingux
Normal file
@ -0,0 +1,188 @@
|
||||
CC = /opt/gcw0-toolchain/usr/bin/mipsel-gcw0-linux-uclibc-gcc
|
||||
CXX = /opt/gcw0-toolchain/usr/bin/mipsel-gcw0-linux-uclibc-g++
|
||||
PACKAGE_NAME = retroarch
|
||||
|
||||
DEBUG ?= 0
|
||||
|
||||
HAVE_7ZIP = 1
|
||||
HAVE_AL = 1
|
||||
# this freezes when switching back from menu
|
||||
HAVE_ALSA = 0
|
||||
HAVE_BUILTINMBEDTLS = 1
|
||||
HAVE_BUILTINZLIB = 1
|
||||
HAVE_C99 = 1
|
||||
HAVE_CC = 1
|
||||
HAVE_CC_RESAMPLER = 1
|
||||
HAVE_CHD = 1
|
||||
HAVE_CHEEVOS = 1
|
||||
HAVE_COMMAND = 1
|
||||
HAVE_CXX = 1
|
||||
HAVE_DR_MP3 = 1
|
||||
HAVE_DYNAMIC = 1
|
||||
HAVE_EGL = 1
|
||||
HAVE_FREETYPE = 1
|
||||
HAVE_GDI = 1
|
||||
HAVE_GETADDRINFO = 1
|
||||
HAVE_GETOPT_LONG = 1
|
||||
HAVE_GLSL = 1
|
||||
HAVE_HID = 1
|
||||
HAVE_IBXM = 1
|
||||
HAVE_IMAGEVIEWER = 1
|
||||
HAVE_LANGEXTRA = 1
|
||||
HAVE_LIBRETRODB = 1
|
||||
HAVE_MENU = 1
|
||||
HAVE_MENU_COMMON = 1
|
||||
HAVE_MENU_WIDGETS = 1
|
||||
HAVE_MMAP = 1
|
||||
HAVE_NETWORKING = 1
|
||||
HAVE_OPENDINGUX_FBDEV = 1
|
||||
HAVE_OPENGL = 1
|
||||
HAVE_OPENGL1 = 0
|
||||
HAVE_OPENGLES = 1
|
||||
HAVE_OPENGLES3 = 0
|
||||
HAVE_OPENGL_CORE = 0
|
||||
HAVE_OPENSSL = 1
|
||||
HAVE_OVERLAY = 1
|
||||
HAVE_RBMP = 1
|
||||
HAVE_RJPEG = 1
|
||||
HAVE_RPILED = 1
|
||||
HAVE_RPNG = 1
|
||||
HAVE_RUNAHEAD = 1
|
||||
HAVE_SDL_DINGUX = 1
|
||||
HAVE_SHADERPIPELINE = 1
|
||||
HAVE_STB_FONT = 1
|
||||
HAVE_STB_IMAGE = 1
|
||||
HAVE_STB_VORBIS = 1
|
||||
HAVE_STDIN_CMD = 1
|
||||
HAVE_STRCASESTR = 1
|
||||
HAVE_THREADS = 1
|
||||
HAVE_TRANSLATE = 1
|
||||
HAVE_UDEV = 1
|
||||
HAVE_VIDEO_LAYOUT = 1
|
||||
HAVE_XMB = 1
|
||||
HAVE_ZLIB = 1
|
||||
|
||||
OS = Linux
|
||||
TARGET = retroarch
|
||||
OPK_NAME = retroarch.opk
|
||||
|
||||
OBJ :=
|
||||
LINK := $(CXX)
|
||||
DEF_FLAGS := -march=mips32 -mtune=mips32r2 -mhard-float -ffast-math -fomit-frame-pointer -fdata-sections
|
||||
DEF_FLAGS += -I. -Ideps -Ideps/stb -DDINGUX=1 -MMD
|
||||
DEF_FLAGS += -Wall -Wno-unused-variable
|
||||
DEF_FLAGS += -std=gnu99 -D_GNU_SOURCE
|
||||
LIBS := -ldl -lz -lrt -lcrypto -lssl -ludev -pthread
|
||||
CFLAGS :=
|
||||
CXXFLAGS := -fno-exceptions -fno-rtti -std=c++11 -D__STDC_CONSTANT_MACROS
|
||||
ASFLAGS :=
|
||||
LDFLAGS := -flto
|
||||
INCLUDE_DIRS = -I/opt/gcw0-toolchain/usr/mipsel-gcw0-linux-uclibc/sysroot/usr/include
|
||||
LIBRARY_DIRS = -L/opt/gcw0-toolchain/usr/mipsel-gcw0-linux-uclibc/sysroot/usr/lib
|
||||
DEFINES := -DRARCH_INTERNAL -D_FILE_OFFSET_BITS=64 -UHAVE_STATIC_DUMMY
|
||||
DEFINES += -DHAVE_C99=1 -DHAVE_CXX=1 -DHAVE_OPENDINGUX_FBDEV=1
|
||||
DEFINES += -DHAVE_GETOPT_LONG=1 -DHAVE_STRCASESTR=1 -DHAVE_DYNAMIC=1
|
||||
DEFINES += -DHAVE_AL=1
|
||||
DEFINES += -DHAVE_ONLINE_UPDATER=1
|
||||
DEFINES += -DHAVE_UPDATE_ASSETS=1
|
||||
DEFINES += -DHAVE_UDEV=1
|
||||
|
||||
SDL_DINGUX_CFLAGS := $(shell /opt/gcw0-toolchain/usr/mipsel-gcw0-linux-uclibc/sysroot/usr/bin/sdl-config --cflags)
|
||||
SDL_DINGUX_LIBS := $(shell /opt/gcw0-toolchain/usr/mipsel-gcw0-linux-uclibc/sysroot/usr/bin/sdl-config --libs)
|
||||
FREETYPE_CFLAGS := $(shell /opt/gcw0-toolchain/usr/mipsel-gcw0-linux-uclibc/sysroot/usr/bin/freetype-config --cflags)
|
||||
FREETYPE_LIBS := $(shell /opt/gcw0-toolchain/usr/mipsel-gcw0-linux-uclibc/sysroot/usr/bin/freetype-config --libs)
|
||||
AL_LIBS := -lopenal
|
||||
OPENGLES_CFLAGS := -DMESA_EGL_NO_X11_HEADERS
|
||||
OPENGLES_LIBS := -lGLESv2 -lEGL
|
||||
MMAP_LIBS = -lc
|
||||
|
||||
OBJDIR_BASE := obj-unix
|
||||
|
||||
ifeq ($(DEBUG), 1)
|
||||
OBJDIR := $(OBJDIR_BASE)/debug
|
||||
DEF_FLAGS += -O0 -g -DDEBUG -D_DEBUG
|
||||
else
|
||||
OBJDIR := $(OBJDIR_BASE)/release
|
||||
DEF_FLAGS += -O2 -DNDEBUG
|
||||
endif
|
||||
|
||||
include Makefile.common
|
||||
|
||||
DEF_FLAGS += $(INCLUDE_DIRS)
|
||||
CFLAGS += $(DEF_FLAGS)
|
||||
CXXFLAGS += $(DEF_FLAGS)
|
||||
|
||||
HEADERS = $(wildcard */*/*.h) $(wildcard */*.h) $(wildcard *.h)
|
||||
|
||||
Q := @
|
||||
|
||||
RARCH_OBJ := $(addprefix $(OBJDIR)/,$(OBJ))
|
||||
|
||||
define DESKTOP_ENTRY
|
||||
[Desktop Entry]
|
||||
Name=retroarch
|
||||
Comment=Retroarch
|
||||
Exec=retroarch
|
||||
Terminal=false
|
||||
Type=Application
|
||||
StartupNotify=true
|
||||
Icon=retroarch
|
||||
Categories=emulators;
|
||||
X-OD-NeedsDownscaling=true
|
||||
endef
|
||||
export DESKTOP_ENTRY
|
||||
|
||||
all: $(TARGET) opk
|
||||
|
||||
-include $(RARCH_OBJ:.o=.d)
|
||||
|
||||
SYMBOL_MAP := -Wl,-Map=output.map
|
||||
|
||||
$(TARGET): $(RARCH_OBJ)
|
||||
@$(if $(Q), $(shell echo echo LD $@),)
|
||||
$(LINK) -o $@ $(RARCH_OBJ) $(LIBS) $(LDFLAGS) $(LIBRARY_DIRS)
|
||||
|
||||
$(OBJDIR)/%.o: %.c
|
||||
@mkdir -p $(dir $@)
|
||||
@$(if $(Q), $(shell echo echo CC $<),)
|
||||
$(CC) $(CPPFLAGS) $(CFLAGS) $(DEFINES) -c -o $@ $<
|
||||
|
||||
$(OBJDIR)/%.o: %.cpp
|
||||
@mkdir -p $(dir $@)
|
||||
@$(if $(Q), $(shell echo echo CXX $<),)
|
||||
$(CXX) $(CPPFLAGS) $(CXXFLAGS) $(DEFINES) -MMD -c -o $@ $<
|
||||
|
||||
$(OBJDIR)/%.o: %.m
|
||||
@mkdir -p $(dir $@)
|
||||
@$(if $(Q), $(shell echo echo OBJC $<),)
|
||||
$(CXX) $(OBJCFLAGS) $(DEFINES) -MMD -c -o $@ $<
|
||||
|
||||
.FORCE:
|
||||
|
||||
$(OBJDIR)/git_version.o: git_version.c .FORCE
|
||||
@mkdir -p $(dir $@)
|
||||
@$(if $(Q), $(shell echo echo CC $<),)
|
||||
$(CC) $(CFLAGS) $(DEFINES) -MMD -c -o $@ $<
|
||||
|
||||
$(OBJDIR)/%.o: %.S $(HEADERS)
|
||||
@mkdir -p $(dir $@)
|
||||
@$(if $(Q), $(shell echo echo AS $<),)
|
||||
$(CC) $(CFLAGS) $(ASFLAGS) $(DEFINES) -c -o $@ $<
|
||||
|
||||
clean:
|
||||
rm -rf $(OBJDIR_BASE)
|
||||
rm -f $(TARGET)
|
||||
rm -f *.d
|
||||
rm -rf $(OPK_NAME)
|
||||
|
||||
opk: $(TARGET)
|
||||
echo "$$DESKTOP_ENTRY" > default.gcw0.desktop
|
||||
rm -f $(OPK_NAME)
|
||||
cp media/ico_src/icon32.png retroarch.png
|
||||
mksquashfs retroarch default.gcw0.desktop retroarch.png $(OPK_NAME) -all-root -no-xattrs -noappend -no-exports
|
||||
rm -f default.gcw0.desktop retroarch.png
|
||||
|
||||
.PHONY: all clean opk
|
||||
|
||||
print-%:
|
||||
@echo '$*=$($*)'
|
@ -71,6 +71,7 @@ PPU_SRCS = griffin/griffin.c
|
||||
|
||||
#DEFINES += -DHAVE_VIDEO_LAYOUT
|
||||
DEFINES += -DHAVE_MENU -DHAVE_MENU_WIDGETS -DHAVE_RGUI -DHAVE_XMB -DHAVE_OZONE -DHAVE_LIBRETRODB -DHAVE_MATERIALUI -DHAVE_SHADERPIPELINE -DRARCH_INTERNAL -DMSB_FIRST -DHAVE_OVERLAY -DHAVE_CC_RESAMPLER -DHAVE_STB_VORBIS -DHAVE_STB_FONT -DHAVE_RUNAHEAD -DHAVE_DR_MP3 -DHAVE_DR_FLAC
|
||||
DEFINES += -DHAVE_ONLINE_UPDATER -DHAVE_UPDATE_ASSETS -DHAVE_UPDATE_CORES
|
||||
|
||||
ifeq ($(DEX_BUILD), 1)
|
||||
DEFINES += -DDEX_BUILD
|
||||
|
@ -45,8 +45,8 @@ PPU_CXXFLAGS := $(PPU_OPTIMIZE_LV) $(INCFLAGS) $(DEFINES)
|
||||
PPU_SRCS = frontend/frontend_salamander.c \
|
||||
frontend/frontend_driver.c \
|
||||
frontend/drivers/platform_ps3.c \
|
||||
frontend/drivers/platform_null.c \
|
||||
libretro-common/file/file_path.c \
|
||||
libretro-common/file/file_path_io.c \
|
||||
libretro-common/lists/dir_list.c \
|
||||
libretro-common/lists/string_list.c \
|
||||
libretro-common/file/retro_dirent.c \
|
||||
|
@ -58,3 +58,18 @@ OBJS = $(PSP_OBJECTS)
|
||||
|
||||
PSPSDK=$(shell psp-config --pspsdk-path)
|
||||
include $(PSPSDK)/lib/build.mak
|
||||
|
||||
pspsh-debug:
|
||||
pspsh -e reset
|
||||
read -p "Start debugger in VSCode and press any key to continue... \n" -n1 -s
|
||||
pspsh -e debug ./retroarchpsp.prx
|
||||
pspsh
|
||||
|
||||
pspsh-run:
|
||||
pspsh -e reset
|
||||
pspsh -e ./retroarchpsp.prx
|
||||
pspsh
|
||||
|
||||
debug: clean all pspsh-debug
|
||||
|
||||
run: clean all pspsh-run
|
@ -35,8 +35,8 @@ PSP_EBOOT_PIC1 = pkg/psp1/PIC1.PNG
|
||||
OBJS = frontend/frontend_salamander.o \
|
||||
frontend/frontend_driver.o \
|
||||
frontend/drivers/platform_psp.o \
|
||||
frontend/drivers/platform_null.o \
|
||||
libretro-common/file/file_path.o \
|
||||
libretro-common/file/file_path_io.o \
|
||||
libretro-common/string/stdstring.o \
|
||||
libretro-common/lists/string_list.o \
|
||||
libretro-common/lists/dir_list.o \
|
||||
|
@ -35,8 +35,8 @@ CFLAGS += $(RARCH_DEFINES)
|
||||
OBJS = frontend/frontend_salamander.o \
|
||||
frontend/frontend_driver.o \
|
||||
frontend/drivers/platform_psp.o \
|
||||
frontend/drivers/platform_null.o \
|
||||
libretro-common/file/file_path.o \
|
||||
libretro-common/file/file_path_io.o \
|
||||
libretro-common/string/stdstring.o \
|
||||
libretro-common/lists/string_list.o \
|
||||
libretro-common/lists/dir_list.o \
|
||||
|
@ -55,8 +55,8 @@ OBJ = frontend/frontend_salamander.o \
|
||||
frontend/frontend_driver.o \
|
||||
frontend/drivers/platform_gx.o \
|
||||
frontend/drivers/platform_wii.o \
|
||||
frontend/drivers/platform_null.o \
|
||||
libretro-common/file/file_path.o \
|
||||
libretro-common/file/file_path_io.o \
|
||||
libretro-common/hash/rhash.o \
|
||||
libretro-common/string/stdstring.o \
|
||||
libretro-common/lists/string_list.o \
|
||||
|
@ -53,11 +53,11 @@ ifeq ($(SALAMANDER_BUILD),1)
|
||||
OBJ += frontend/frontend_salamander.o
|
||||
OBJ += frontend/frontend_driver.o
|
||||
OBJ += frontend/drivers/platform_wiiu.o
|
||||
OBJ += frontend/drivers/platform_null.o
|
||||
OBJ += libretro-common/encodings/encoding_utf.o
|
||||
OBJ += libretro-common/compat/compat_strcasestr.o
|
||||
OBJ += libretro-common/compat/fopen_utf8.o
|
||||
OBJ += libretro-common/file/file_path.o
|
||||
OBJ += libretro-common/file/file_path_io.o
|
||||
OBJ += libretro-common/string/stdstring.o
|
||||
OBJ += libretro-common/lists/string_list.o
|
||||
OBJ += libretro-common/lists/dir_list.o
|
||||
|
@ -1,4 +1,6 @@
|
||||
/* RetroArch - A frontend for libretro.
|
||||
* Copyright (C) 2010-2014 - Hans-Kristian Arntzen
|
||||
* Copyright (C) 2011-2016 - 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-
|
||||
@ -12,16 +14,29 @@
|
||||
* If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "../led_driver.h"
|
||||
#include "../../verbosity.h"
|
||||
#ifndef __RETROARCH_ACCESSIBILITY_H
|
||||
#define __RETROARCH_ACCESSIBILITY_H
|
||||
|
||||
static void null_led_init(void) { }
|
||||
static void null_led_free(void) { }
|
||||
static void null_led_set(int led, int state) { }
|
||||
#include <stdint.h>
|
||||
#include <stddef.h>
|
||||
#include <sys/types.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
const led_driver_t null_led_driver = {
|
||||
null_led_init,
|
||||
null_led_free,
|
||||
null_led_set,
|
||||
"null"
|
||||
};
|
||||
#include <boolean.h>
|
||||
#include <retro_inline.h>
|
||||
#include <retro_common_api.h>
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif
|
||||
|
||||
|
||||
RETRO_BEGIN_DECLS
|
||||
|
||||
bool is_accessibility_enabled(void);
|
||||
|
||||
bool accessibility_speak_priority(const char* speak_text, int priority);
|
||||
|
||||
RETRO_END_DECLS
|
||||
|
||||
#endif
|
@ -53,7 +53,7 @@ typedef struct coreaudio
|
||||
} coreaudio_t;
|
||||
|
||||
#if TARGET_OS_IOS
|
||||
static bool g_interrupted = false;
|
||||
static bool g_interrupted;
|
||||
#endif
|
||||
|
||||
static void coreaudio_free(void *data)
|
||||
@ -245,7 +245,7 @@ static void *coreaudio_init(const char *device,
|
||||
#else
|
||||
comp = AudioComponentFindNext(NULL, &desc);
|
||||
#endif
|
||||
if (!comp)
|
||||
if (comp == NULL)
|
||||
goto error;
|
||||
|
||||
#if (defined(__MACH__) && (defined(__ppc__) || defined(__ppc64__)))
|
||||
@ -346,61 +346,40 @@ static ssize_t coreaudio_write(void *data, const void *buf_, size_t size)
|
||||
const uint8_t *buf = (const uint8_t*)buf_;
|
||||
size_t written = 0;
|
||||
|
||||
if (dev->nonblock)
|
||||
{
|
||||
bool cond = size > 0;
|
||||
#if TARGET_OS_IOS
|
||||
cond = cond && !g_interrupted;
|
||||
#endif
|
||||
if (cond)
|
||||
{
|
||||
size_t write_avail;
|
||||
|
||||
slock_lock(dev->lock);
|
||||
|
||||
write_avail = fifo_write_avail(dev->buffer);
|
||||
if (write_avail > size)
|
||||
write_avail = size;
|
||||
|
||||
fifo_write(dev->buffer, buf, write_avail);
|
||||
buf += write_avail;
|
||||
written += write_avail;
|
||||
size -= write_avail;
|
||||
|
||||
slock_unlock(dev->lock);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
#if TARGET_OS_IOS
|
||||
while (!g_interrupted && size > 0)
|
||||
while (!g_interrupted && size > 0)
|
||||
#else
|
||||
while (size > 0)
|
||||
while (size > 0)
|
||||
#endif
|
||||
{
|
||||
size_t write_avail;
|
||||
|
||||
slock_lock(dev->lock);
|
||||
|
||||
write_avail = fifo_write_avail(dev->buffer);
|
||||
if (write_avail > size)
|
||||
write_avail = size;
|
||||
|
||||
fifo_write(dev->buffer, buf, write_avail);
|
||||
buf += write_avail;
|
||||
written += write_avail;
|
||||
size -= write_avail;
|
||||
|
||||
if (dev->nonblock)
|
||||
{
|
||||
size_t write_avail;
|
||||
|
||||
slock_lock(dev->lock);
|
||||
|
||||
write_avail = fifo_write_avail(dev->buffer);
|
||||
if (write_avail > size)
|
||||
write_avail = size;
|
||||
|
||||
fifo_write(dev->buffer, buf, write_avail);
|
||||
buf += write_avail;
|
||||
written += write_avail;
|
||||
size -= write_avail;
|
||||
slock_unlock(dev->lock);
|
||||
break;
|
||||
}
|
||||
|
||||
#if TARGET_OS_IPHONE
|
||||
if (write_avail == 0 && !scond_wait_timeout(
|
||||
dev->cond, dev->lock, 3000000))
|
||||
g_interrupted = true;
|
||||
if (write_avail == 0 && !scond_wait_timeout(
|
||||
dev->cond, dev->lock, 3000000))
|
||||
g_interrupted = true;
|
||||
#else
|
||||
if (write_avail == 0)
|
||||
scond_wait(dev->cond, dev->lock);
|
||||
if (write_avail == 0)
|
||||
scond_wait(dev->cond, dev->lock);
|
||||
#endif
|
||||
slock_unlock(dev->lock);
|
||||
}
|
||||
slock_unlock(dev->lock);
|
||||
}
|
||||
|
||||
return written;
|
||||
|
@ -260,37 +260,22 @@ static bool g_interrupted;
|
||||
|
||||
- (ssize_t)writeFloat:(const float *)data samples:(size_t)samples {
|
||||
size_t written = 0;
|
||||
|
||||
if (_nonBlock)
|
||||
while (!g_interrupted && samples > 0)
|
||||
{
|
||||
if (!g_interrupted && samples > 0)
|
||||
{
|
||||
size_t write_avail = rb_avail(&_rb);
|
||||
if (write_avail > samples)
|
||||
write_avail = samples;
|
||||
size_t write_avail = rb_avail(&_rb);
|
||||
if (write_avail > samples)
|
||||
write_avail = samples;
|
||||
|
||||
rb_write_data(&_rb, data, write_avail);
|
||||
data += write_avail;
|
||||
written += write_avail;
|
||||
samples -= write_avail;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
while (!g_interrupted && samples > 0)
|
||||
{
|
||||
size_t write_avail = rb_avail(&_rb);
|
||||
if (write_avail > samples)
|
||||
write_avail = samples;
|
||||
rb_write_data(&_rb, data, write_avail);
|
||||
data += write_avail;
|
||||
written += write_avail;
|
||||
samples -= write_avail;
|
||||
|
||||
rb_write_data(&_rb, data, write_avail);
|
||||
data += write_avail;
|
||||
written += write_avail;
|
||||
samples -= write_avail;
|
||||
if (_nonBlock)
|
||||
break;
|
||||
|
||||
if (write_avail == 0)
|
||||
dispatch_semaphore_wait(_sema, DISPATCH_TIME_FOREVER);
|
||||
}
|
||||
if (write_avail == 0)
|
||||
dispatch_semaphore_wait(_sema, DISPATCH_TIME_FOREVER);
|
||||
}
|
||||
|
||||
return written;
|
||||
|
@ -94,30 +94,25 @@ struct audio_lock
|
||||
DWORD size2;
|
||||
};
|
||||
|
||||
static INLINE bool grab_region(dsound_t *ds, uint32_t write_ptr,
|
||||
struct audio_lock *region)
|
||||
static bool grab_region(dsound_t *ds, uint32_t write_ptr,
|
||||
struct audio_lock *region, HRESULT res)
|
||||
{
|
||||
HRESULT res = IDirectSoundBuffer_Lock(ds->dsb, write_ptr, CHUNK_SIZE,
|
||||
®ion->chunk1, ®ion->size1, ®ion->chunk2, ®ion->size2, 0);
|
||||
|
||||
if (res == DSERR_BUFFERLOST)
|
||||
{
|
||||
#ifdef DEBUG
|
||||
RARCH_WARN("[DirectSound error]: %s\n", "DSERR_BUFFERLOST");
|
||||
#endif
|
||||
if ((res = IDirectSoundBuffer_Restore(ds->dsb)) != DS_OK)
|
||||
return false;
|
||||
if ((res = IDirectSoundBuffer_Lock(ds->dsb, write_ptr, CHUNK_SIZE,
|
||||
®ion->chunk1, ®ion->size1, ®ion->chunk2, ®ion->size2, 0)) != DS_OK)
|
||||
return false;
|
||||
}
|
||||
|
||||
if (res == DS_OK)
|
||||
return true;
|
||||
}
|
||||
|
||||
#ifdef DEBUG
|
||||
switch (res)
|
||||
{
|
||||
case DSERR_BUFFERLOST:
|
||||
RARCH_WARN("[DirectSound error]: %s\n", "DSERR_BUFFERLOST");
|
||||
break;
|
||||
case DSERR_INVALIDCALL:
|
||||
RARCH_WARN("[DirectSound error]: %s\n", "DSERR_INVALIDCALL");
|
||||
break;
|
||||
@ -151,6 +146,7 @@ static DWORD CALLBACK dsound_thread(PVOID data)
|
||||
|
||||
while (ds->thread_alive)
|
||||
{
|
||||
HRESULT res;
|
||||
bool is_pull = false;
|
||||
struct audio_lock region;
|
||||
DWORD read_ptr, avail, fifo_avail;
|
||||
@ -175,11 +171,15 @@ static DWORD CALLBACK dsound_thread(PVOID data)
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!grab_region(ds, write_ptr, ®ion))
|
||||
if ((res = IDirectSoundBuffer_Lock(ds->dsb, write_ptr, CHUNK_SIZE,
|
||||
®ion.chunk1, ®ion.size1, ®ion.chunk2, ®ion.size2, 0)) != DS_OK)
|
||||
{
|
||||
ds->thread_alive = false;
|
||||
SetEvent(ds->event);
|
||||
break;
|
||||
if (!grab_region(ds, write_ptr, ®ion, res))
|
||||
{
|
||||
ds->thread_alive = false;
|
||||
SetEvent(ds->event);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (fifo_avail < CHUNK_SIZE)
|
||||
@ -328,6 +328,19 @@ static BOOL CALLBACK enumerate_cb(LPGUID guid, LPCSTR desc, LPCSTR module, LPVOI
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static void dsound_set_wavefmt(WAVEFORMATEX *wfx,
|
||||
unsigned channels, unsigned samplerate)
|
||||
{
|
||||
wfx->wFormatTag = WAVE_FORMAT_PCM;
|
||||
wfx->nBlockAlign = channels * sizeof(int16_t);
|
||||
wfx->wBitsPerSample = 16;
|
||||
|
||||
wfx->nChannels = channels;
|
||||
wfx->nSamplesPerSec = samplerate;
|
||||
wfx->nAvgBytesPerSec = wfx->nSamplesPerSec * wfx->nBlockAlign;
|
||||
wfx->cbSize = 0;
|
||||
}
|
||||
|
||||
static void *dsound_init(const char *dev, unsigned rate, unsigned latency,
|
||||
unsigned block_frames,
|
||||
unsigned *new_rate)
|
||||
@ -390,12 +403,7 @@ static void *dsound_init(const char *dev, unsigned rate, unsigned latency,
|
||||
goto error;
|
||||
#endif
|
||||
|
||||
wfx.wFormatTag = WAVE_FORMAT_PCM;
|
||||
wfx.nChannels = 2;
|
||||
wfx.nSamplesPerSec = rate;
|
||||
wfx.wBitsPerSample = 16;
|
||||
wfx.nBlockAlign = 2 * sizeof(int16_t);
|
||||
wfx.nAvgBytesPerSec = rate * 2 * sizeof(int16_t);
|
||||
dsound_set_wavefmt(&wfx, 2, rate);
|
||||
|
||||
ds->buffer_size = (latency * wfx.nAvgBytesPerSec) / 1000;
|
||||
ds->buffer_size /= CHUNK_SIZE;
|
||||
|
@ -1,96 +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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "../../retroarch.h"
|
||||
#include "../../verbosity.h"
|
||||
|
||||
static void *null_audio_init(const char *device, unsigned rate, unsigned latency,
|
||||
unsigned block_frames,
|
||||
unsigned *new_rate)
|
||||
{
|
||||
RARCH_ERR("Using the null audio driver. RetroArch will be silent.\n");
|
||||
|
||||
(void)device;
|
||||
(void)rate;
|
||||
(void)latency;
|
||||
(void)new_rate;
|
||||
return (void*)-1;
|
||||
}
|
||||
|
||||
static void null_audio_free(void *data)
|
||||
{
|
||||
(void)data;
|
||||
}
|
||||
|
||||
static ssize_t null_audio_write(void *data, const void *buf, size_t size)
|
||||
{
|
||||
(void)data;
|
||||
(void)buf;
|
||||
|
||||
return size;
|
||||
}
|
||||
|
||||
static bool null_audio_stop(void *data)
|
||||
{
|
||||
(void)data;
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool null_audio_alive(void *data)
|
||||
{
|
||||
(void)data;
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool null_audio_start(void *data, bool is_shutdown)
|
||||
{
|
||||
(void)data;
|
||||
return true;
|
||||
}
|
||||
|
||||
static void null_audio_set_nonblock_state(void *data, bool state)
|
||||
{
|
||||
(void)data;
|
||||
(void)state;
|
||||
}
|
||||
|
||||
static bool null_audio_use_float(void *data)
|
||||
{
|
||||
(void)data;
|
||||
return true;
|
||||
}
|
||||
|
||||
static size_t null_audio_write_avail(void *data)
|
||||
{
|
||||
(void)data;
|
||||
return 0;
|
||||
}
|
||||
|
||||
audio_driver_t audio_null = {
|
||||
null_audio_init,
|
||||
null_audio_write,
|
||||
null_audio_stop,
|
||||
null_audio_start,
|
||||
null_audio_alive,
|
||||
null_audio_set_nonblock_state,
|
||||
null_audio_free,
|
||||
null_audio_use_float,
|
||||
"null",
|
||||
NULL,
|
||||
NULL,
|
||||
null_audio_write_avail,
|
||||
NULL
|
||||
};
|
@ -17,7 +17,7 @@ typedef Thread compat_thread;
|
||||
typedef CondVar compat_condvar;
|
||||
|
||||
#define compat_thread_create(thread, func, data, stack_size, prio, cpu) \
|
||||
threadCreate(thread, func, data, stack_size, prio, cpu)
|
||||
threadCreate(thread, func, data, NULL, stack_size, prio, cpu)
|
||||
#define compat_thread_start(thread) \
|
||||
threadStart(thread)
|
||||
#define compat_thread_join(thread) \
|
||||
|
@ -232,7 +232,7 @@ static void *libnx_audren_thread_audio_init(const char *device, unsigned rate, u
|
||||
|
||||
svcGetThreadPriority(&thread_priority, CUR_THREAD_HANDLE);
|
||||
rc = threadCreate(&aud->thread, &thread_job,
|
||||
(void*)aud, thread_stack_size,
|
||||
(void*)aud, NULL, thread_stack_size,
|
||||
thread_priority - 1, thread_preferred_cpu);
|
||||
if (R_FAILED(rc))
|
||||
{
|
||||
|
@ -596,16 +596,15 @@ static bool wasapi_flush(wasapi_t * w, const void * data, size_t size)
|
||||
{
|
||||
BYTE *dest = NULL;
|
||||
UINT32 frame_count = size / w->frame_size;
|
||||
HRESULT hr = _IAudioRenderClient_GetBuffer(
|
||||
w->renderer, frame_count, &dest);
|
||||
if (FAILED(hr))
|
||||
|
||||
if (FAILED(_IAudioRenderClient_GetBuffer(
|
||||
w->renderer, frame_count, &dest)))
|
||||
return false;
|
||||
|
||||
memcpy(dest, data, size);
|
||||
hr = _IAudioRenderClient_ReleaseBuffer(
|
||||
w->renderer, frame_count,
|
||||
0);
|
||||
if (FAILED(hr))
|
||||
if (FAILED(_IAudioRenderClient_ReleaseBuffer(
|
||||
w->renderer, frame_count,
|
||||
0)))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
@ -615,16 +614,14 @@ static bool wasapi_flush_buffer(wasapi_t * w, size_t size)
|
||||
{
|
||||
BYTE *dest = NULL;
|
||||
UINT32 frame_count = size / w->frame_size;
|
||||
HRESULT hr = _IAudioRenderClient_GetBuffer(
|
||||
w->renderer, frame_count, &dest);
|
||||
if (FAILED(hr))
|
||||
if (FAILED(_IAudioRenderClient_GetBuffer(
|
||||
w->renderer, frame_count, &dest)))
|
||||
return false;
|
||||
|
||||
fifo_read(w->buffer, dest, size);
|
||||
hr = _IAudioRenderClient_ReleaseBuffer(
|
||||
if (FAILED(_IAudioRenderClient_ReleaseBuffer(
|
||||
w->renderer, frame_count,
|
||||
0);
|
||||
if (FAILED(hr))
|
||||
0)))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
@ -632,7 +629,6 @@ static bool wasapi_flush_buffer(wasapi_t * w, size_t size)
|
||||
|
||||
static ssize_t wasapi_write_sh_buffer(wasapi_t *w, const void * data, size_t size)
|
||||
{
|
||||
HRESULT hr;
|
||||
ssize_t written = -1;
|
||||
UINT32 padding = 0;
|
||||
size_t write_avail = fifo_write_avail(w->buffer);
|
||||
@ -643,8 +639,7 @@ static ssize_t wasapi_write_sh_buffer(wasapi_t *w, const void * data, size_t siz
|
||||
if (!(WaitForSingleObject(w->write_event, INFINITE) == WAIT_OBJECT_0))
|
||||
return -1;
|
||||
|
||||
hr = _IAudioClient_GetCurrentPadding(w->client, &padding);
|
||||
if (FAILED(hr))
|
||||
if (FAILED(_IAudioClient_GetCurrentPadding(w->client, &padding)))
|
||||
return -1;
|
||||
|
||||
read_avail = fifo_read_avail(w->buffer);
|
||||
@ -665,7 +660,6 @@ static ssize_t wasapi_write_sh_buffer(wasapi_t *w, const void * data, size_t siz
|
||||
|
||||
static ssize_t wasapi_write_sh(wasapi_t *w, const void * data, size_t size)
|
||||
{
|
||||
HRESULT hr;
|
||||
size_t write_avail = 0;
|
||||
ssize_t written = -1;
|
||||
UINT32 padding = 0;
|
||||
@ -673,8 +667,7 @@ static ssize_t wasapi_write_sh(wasapi_t *w, const void * data, size_t size)
|
||||
if (!(WaitForSingleObject(w->write_event, INFINITE) == WAIT_OBJECT_0))
|
||||
return -1;
|
||||
|
||||
hr = _IAudioClient_GetCurrentPadding(w->client, &padding);
|
||||
if (FAILED(hr))
|
||||
if (FAILED(_IAudioClient_GetCurrentPadding(w->client, &padding)))
|
||||
return -1;
|
||||
|
||||
write_avail = w->engine_buffer_size - padding * w->frame_size;
|
||||
@ -691,7 +684,6 @@ static ssize_t wasapi_write_sh(wasapi_t *w, const void * data, size_t size)
|
||||
|
||||
static ssize_t wasapi_write_sh_nonblock(wasapi_t *w, const void * data, size_t size)
|
||||
{
|
||||
HRESULT hr;
|
||||
size_t write_avail = 0;
|
||||
ssize_t written = -1;
|
||||
UINT32 padding = 0;
|
||||
@ -702,8 +694,7 @@ static ssize_t wasapi_write_sh_nonblock(wasapi_t *w, const void * data, size_t s
|
||||
if (!write_avail)
|
||||
{
|
||||
size_t read_avail = 0;
|
||||
hr = _IAudioClient_GetCurrentPadding(w->client, &padding);
|
||||
if (FAILED(hr))
|
||||
if (FAILED(_IAudioClient_GetCurrentPadding(w->client, &padding)))
|
||||
return -1;
|
||||
|
||||
read_avail = fifo_read_avail(w->buffer);
|
||||
@ -721,8 +712,7 @@ static ssize_t wasapi_write_sh_nonblock(wasapi_t *w, const void * data, size_t s
|
||||
}
|
||||
else
|
||||
{
|
||||
hr = _IAudioClient_GetCurrentPadding(w->client, &padding);
|
||||
if (FAILED(hr))
|
||||
if (FAILED(_IAudioClient_GetCurrentPadding(w->client, &padding)))
|
||||
return -1;
|
||||
|
||||
if (!(write_avail = w->engine_buffer_size - padding * w->frame_size))
|
||||
@ -810,8 +800,7 @@ static ssize_t wasapi_write(void *wh, const void *data, size_t size)
|
||||
static bool wasapi_stop(void *wh)
|
||||
{
|
||||
wasapi_t *w = (wasapi_t*)wh;
|
||||
HRESULT hr = _IAudioClient_Stop(w->client);
|
||||
if (FAILED(hr))
|
||||
if (FAILED(_IAudioClient_Stop(w->client)))
|
||||
return !w->running;
|
||||
|
||||
w->running = false;
|
||||
@ -896,15 +885,13 @@ static void wasapi_device_list_free(void *u, void *slp)
|
||||
|
||||
static size_t wasapi_write_avail(void *wh)
|
||||
{
|
||||
HRESULT hr;
|
||||
wasapi_t *w = (wasapi_t*)wh;
|
||||
UINT32 padding = 0;
|
||||
|
||||
if (w->buffer)
|
||||
return fifo_write_avail(w->buffer);
|
||||
|
||||
hr = _IAudioClient_GetCurrentPadding(w->client, &padding);
|
||||
if (FAILED(hr))
|
||||
if (FAILED(_IAudioClient_GetCurrentPadding(w->client, &padding)))
|
||||
return 0;
|
||||
|
||||
return w->engine_buffer_size - padding * w->frame_size;
|
||||
|
@ -1,60 +0,0 @@
|
||||
/* RetroArch - A frontend for libretro.
|
||||
* Copyright (C) 2012-2015 - Michael Lelli
|
||||
* 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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "../../retroarch.h"
|
||||
|
||||
static void *nullcamera_init(const char *device, uint64_t caps,
|
||||
unsigned width, unsigned height)
|
||||
{
|
||||
(void)device;
|
||||
return (void*)-1;
|
||||
}
|
||||
|
||||
static void nullcamera_free(void *data)
|
||||
{
|
||||
(void)data;
|
||||
}
|
||||
|
||||
static bool nullcamera_start(void *data)
|
||||
{
|
||||
(void)data;
|
||||
return true;
|
||||
}
|
||||
|
||||
static void nullcamera_stop(void *data)
|
||||
{
|
||||
(void)data;
|
||||
}
|
||||
|
||||
static bool nullcamera_poll(void *data,
|
||||
retro_camera_frame_raw_framebuffer_t frame_raw_cb,
|
||||
retro_camera_frame_opengl_texture_t frame_gl_cb)
|
||||
{
|
||||
(void)data;
|
||||
(void)frame_raw_cb;
|
||||
(void)frame_gl_cb;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
camera_driver_t camera_null = {
|
||||
nullcamera_init,
|
||||
nullcamera_free,
|
||||
nullcamera_start,
|
||||
nullcamera_stop,
|
||||
nullcamera_poll,
|
||||
"null",
|
||||
};
|
@ -180,6 +180,8 @@ enum event_command
|
||||
CMD_EVENT_DISK_NEXT,
|
||||
/* Cycle to previous disk. */
|
||||
CMD_EVENT_DISK_PREV,
|
||||
/* Switch to specified disk index */
|
||||
CMD_EVENT_DISK_INDEX,
|
||||
/* Appends disk image to disk image list. */
|
||||
CMD_EVENT_DISK_APPEND_IMAGE,
|
||||
/* Stops rumbling. */
|
||||
|
19
config.def.h
19
config.def.h
@ -89,6 +89,8 @@
|
||||
#define DEFAULT_MAX_PADS 4
|
||||
#elif defined(HAVE_XINPUT) && !defined(HAVE_DINPUT)
|
||||
#define DEFAULT_MAX_PADS 4
|
||||
#elif defined(DINGUX)
|
||||
#define DEFAULT_MAX_PADS 2
|
||||
#else
|
||||
#define DEFAULT_MAX_PADS 16
|
||||
#endif
|
||||
@ -466,7 +468,9 @@ static bool quick_menu_show_save_core_overrides = true;
|
||||
static bool quick_menu_show_save_game_overrides = true;
|
||||
static bool quick_menu_show_save_content_dir_overrides = true;
|
||||
|
||||
#ifdef HAVE_NETWORKING
|
||||
static bool quick_menu_show_download_thumbnails = true;
|
||||
#endif
|
||||
|
||||
static bool kiosk_mode_enable = false;
|
||||
|
||||
@ -505,6 +509,8 @@ static bool menu_savestate_resume = true;
|
||||
static bool menu_savestate_resume = false;
|
||||
#endif
|
||||
|
||||
#define DEFAULT_MENU_INSERT_DISK_RESUME true
|
||||
|
||||
static bool content_show_settings = true;
|
||||
static bool content_show_favorites = true;
|
||||
#ifdef HAVE_IMAGEVIEWER
|
||||
@ -592,7 +598,7 @@ static bool default_savefiles_in_content_dir = false;
|
||||
static bool default_systemfiles_in_content_dir = false;
|
||||
static bool default_screenshots_in_content_dir = false;
|
||||
|
||||
#if defined(__CELLOS_LV2__) || defined(_XBOX1) || defined(_XBOX360)
|
||||
#if defined(__CELLOS_LV2__) || defined(_XBOX1) || defined(_XBOX360) || defined(DINGUX)
|
||||
static unsigned menu_toggle_gamepad_combo = INPUT_TOGGLE_L3_R3;
|
||||
#elif defined(PS2) || defined(PSP)
|
||||
static unsigned menu_toggle_gamepad_combo = INPUT_TOGGLE_HOLD_START;
|
||||
@ -631,7 +637,12 @@ static unsigned input_backtouch_toggle = false;
|
||||
#define DEFAULT_CROP_OVERSCAN true
|
||||
|
||||
/* Font size for on-screen messages. */
|
||||
#if defined(DINGUX)
|
||||
#define DEFAULT_FONT_SIZE 12
|
||||
#else
|
||||
#define DEFAULT_FONT_SIZE 32
|
||||
#endif
|
||||
|
||||
|
||||
/* Offset for where messages will be placed on-screen.
|
||||
* Values are in range [0.0, 1.0]. */
|
||||
@ -908,11 +919,11 @@ static const bool network_on_demand_thumbnails = false;
|
||||
#endif
|
||||
|
||||
/* Number of entries that will be kept in content history playlist file. */
|
||||
static const unsigned default_content_history_size = 100;
|
||||
static const unsigned default_content_history_size = 200;
|
||||
|
||||
/* Number of entries that will be kept in content favorites playlist file.
|
||||
* -1 == 'unlimited' (99999) */
|
||||
static const int default_content_favorites_size = 100;
|
||||
static const int default_content_favorites_size = 200;
|
||||
|
||||
/* Sort all playlists (apart from histories) alphabetically */
|
||||
static const bool playlist_sort_alphabetical = true;
|
||||
@ -1045,7 +1056,7 @@ static const bool content_runtime_log_aggregate = false;
|
||||
|
||||
#if defined(__QNX__) || defined(_XBOX1) || defined(_XBOX360) || defined(__CELLOS_LV2__) || (defined(__MACH__) && defined(IOS)) || defined(ANDROID) || defined(WIIU) || defined(HAVE_NEON) || defined(GEKKO) || defined(__ARM_NEON__)
|
||||
static enum resampler_quality audio_resampler_quality_level = RESAMPLER_QUALITY_LOWER;
|
||||
#elif defined(PSP) || defined(_3DS) || defined(VITA) || defined(PS2)
|
||||
#elif defined(PSP) || defined(_3DS) || defined(VITA) || defined(PS2) || defined(DINGUX)
|
||||
static enum resampler_quality audio_resampler_quality_level = RESAMPLER_QUALITY_LOWEST;
|
||||
#else
|
||||
static enum resampler_quality audio_resampler_quality_level = RESAMPLER_QUALITY_NORMAL;
|
||||
|
@ -109,6 +109,88 @@ static const struct retro_keybind retro_keybinds_1[] = {
|
||||
{ true, RARCH_RECORDING_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_RECORDING_TOGGLE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_STREAMING_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_STREAMING_TOGGLE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_AI_SERVICE, MENU_ENUM_LABEL_VALUE_INPUT_META_AI_SERVICE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
#elif defined(DINGUX)
|
||||
{ true, RETRO_DEVICE_ID_JOYPAD_B, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_B, RETROK_LALT, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RETRO_DEVICE_ID_JOYPAD_Y, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y, RETROK_LSHIFT, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RETRO_DEVICE_ID_JOYPAD_SELECT, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_SELECT, RETROK_ESCAPE, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RETRO_DEVICE_ID_JOYPAD_START, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_START, RETROK_RETURN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RETRO_DEVICE_ID_JOYPAD_UP, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_UP, RETROK_UP, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RETRO_DEVICE_ID_JOYPAD_DOWN, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_DOWN, RETROK_DOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RETRO_DEVICE_ID_JOYPAD_LEFT, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_LEFT, RETROK_LEFT, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RETRO_DEVICE_ID_JOYPAD_RIGHT, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_RIGHT, RETROK_RIGHT, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RETRO_DEVICE_ID_JOYPAD_A, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_A, RETROK_LCTRL, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RETRO_DEVICE_ID_JOYPAD_X, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_X, RETROK_SPACE, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RETRO_DEVICE_ID_JOYPAD_L, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L, RETROK_TAB, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RETRO_DEVICE_ID_JOYPAD_R, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R, RETROK_BACKSPACE, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RETRO_DEVICE_ID_JOYPAD_L2, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L2, RETROK_PAGEUP, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RETRO_DEVICE_ID_JOYPAD_R2, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R2, RETROK_PAGEDOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RETRO_DEVICE_ID_JOYPAD_L3, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L3, RETROK_KP_DIVIDE, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RETRO_DEVICE_ID_JOYPAD_R3, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R3, RETROK_KP_PERIOD, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
|
||||
{ true, RARCH_ANALOG_LEFT_X_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_X_PLUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_ANALOG_LEFT_X_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_X_MINUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_ANALOG_LEFT_Y_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_Y_PLUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_ANALOG_LEFT_Y_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_Y_MINUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_ANALOG_RIGHT_X_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_X_PLUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_ANALOG_RIGHT_X_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_X_MINUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_ANALOG_RIGHT_Y_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_PLUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_ANALOG_RIGHT_Y_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_MINUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
|
||||
{ true, RARCH_LIGHTGUN_TRIGGER, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_TRIGGER, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_LIGHTGUN_RELOAD, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_RELOAD, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_LIGHTGUN_AUX_A, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_A, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_LIGHTGUN_AUX_B, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_B, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_LIGHTGUN_AUX_C, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_C, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_LIGHTGUN_START, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_START, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_LIGHTGUN_SELECT, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_SELECT, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_LIGHTGUN_DPAD_UP, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_UP, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_LIGHTGUN_DPAD_DOWN, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_DOWN, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_LIGHTGUN_DPAD_LEFT, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_LEFT, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_LIGHTGUN_DPAD_RIGHT, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_RIGHT, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
|
||||
{ true, RARCH_TURBO_ENABLE, MENU_ENUM_LABEL_VALUE_INPUT_TURBO_ENABLE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
|
||||
{ true, RARCH_FAST_FORWARD_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_FAST_FORWARD_KEY, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_FAST_FORWARD_HOLD_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_FAST_FORWARD_HOLD_KEY, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_SLOWMOTION_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_SLOWMOTION_KEY, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_SLOWMOTION_HOLD_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_SLOWMOTION_KEY, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_LOAD_STATE_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_LOAD_STATE_KEY, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_SAVE_STATE_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_SAVE_STATE_KEY, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_FULLSCREEN_TOGGLE_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_FULLSCREEN_TOGGLE_KEY, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_QUIT_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_QUIT_KEY, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_STATE_SLOT_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_META_STATE_SLOT_PLUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_STATE_SLOT_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_META_STATE_SLOT_MINUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_REWIND, MENU_ENUM_LABEL_VALUE_INPUT_META_REWIND, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_BSV_RECORD_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_BSV_RECORD_TOGGLE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_PAUSE_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_PAUSE_TOGGLE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_FRAMEADVANCE, MENU_ENUM_LABEL_VALUE_INPUT_META_FRAMEADVANCE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_RESET, MENU_ENUM_LABEL_VALUE_INPUT_META_RESET, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_SHADER_NEXT, MENU_ENUM_LABEL_VALUE_INPUT_META_SHADER_NEXT, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_SHADER_PREV, MENU_ENUM_LABEL_VALUE_INPUT_META_SHADER_PREV, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_CHEAT_INDEX_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_META_CHEAT_INDEX_PLUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_CHEAT_INDEX_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_META_CHEAT_INDEX_MINUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_CHEAT_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_CHEAT_TOGGLE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_SCREENSHOT, MENU_ENUM_LABEL_VALUE_INPUT_META_SCREENSHOT, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_MUTE, MENU_ENUM_LABEL_VALUE_INPUT_META_MUTE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_OSK, MENU_ENUM_LABEL_VALUE_INPUT_META_OSK, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_FPS_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_FPS_TOGGLE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_SEND_DEBUG_INFO, MENU_ENUM_LABEL_VALUE_INPUT_META_SEND_DEBUG_INFO, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_NETPLAY_HOST_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_NETPLAY_HOST_TOGGLE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_NETPLAY_GAME_WATCH, MENU_ENUM_LABEL_VALUE_INPUT_META_NETPLAY_GAME_WATCH, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_ENABLE_HOTKEY, MENU_ENUM_LABEL_VALUE_INPUT_META_ENABLE_HOTKEY, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_VOLUME_UP, MENU_ENUM_LABEL_VALUE_INPUT_META_VOLUME_UP, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_VOLUME_DOWN, MENU_ENUM_LABEL_VALUE_INPUT_META_VOLUME_DOWN, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_OVERLAY_NEXT, MENU_ENUM_LABEL_VALUE_INPUT_META_OVERLAY_NEXT, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_DISK_EJECT_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_DISK_EJECT_TOGGLE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_DISK_NEXT, MENU_ENUM_LABEL_VALUE_INPUT_META_DISK_NEXT, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_DISK_PREV, MENU_ENUM_LABEL_VALUE_INPUT_META_DISK_PREV, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_GRAB_MOUSE_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_GRAB_MOUSE_TOGGLE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_GAME_FOCUS_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_GAME_FOCUS_TOGGLE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_UI_COMPANION_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_UI_COMPANION_TOGGLE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_MENU_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_MENU_TOGGLE, RETROK_HOME, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_RECORDING_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_RECORDING_TOGGLE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_STREAMING_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_STREAMING_TOGGLE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_AI_SERVICE, MENU_ENUM_LABEL_VALUE_INPUT_META_AI_SERVICE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
#else
|
||||
{ true, RETRO_DEVICE_ID_JOYPAD_B, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_B, RETROK_z, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RETRO_DEVICE_ID_JOYPAD_Y, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y, RETROK_a, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
|
@ -50,7 +50,7 @@
|
||||
#define SUPPORTS_LIBUSB false
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_SDL
|
||||
#if defined(HAVE_SDL)
|
||||
#define SUPPORTS_SDL true
|
||||
#else
|
||||
#define SUPPORTS_SDL false
|
||||
|
@ -144,6 +144,7 @@ enum video_driver_enum
|
||||
VIDEO_XVIDEO,
|
||||
VIDEO_SDL,
|
||||
VIDEO_SDL2,
|
||||
VIDEO_SDL_DINGUX,
|
||||
VIDEO_EXT,
|
||||
VIDEO_WII,
|
||||
VIDEO_WIIU,
|
||||
@ -357,10 +358,12 @@ static enum video_driver_enum VIDEO_DEFAULT_DRIVER = VIDEO_CTR;
|
||||
static enum video_driver_enum VIDEO_DEFAULT_DRIVER = VIDEO_SWITCH;
|
||||
#elif defined(HAVE_XVIDEO)
|
||||
static enum video_driver_enum VIDEO_DEFAULT_DRIVER = VIDEO_XVIDEO;
|
||||
#elif defined(HAVE_SDL)
|
||||
#elif defined(HAVE_SDL) && !defined(HAVE_SDL_DINGUX)
|
||||
static enum video_driver_enum VIDEO_DEFAULT_DRIVER = VIDEO_SDL;
|
||||
#elif defined(HAVE_SDL2)
|
||||
static enum video_driver_enum VIDEO_DEFAULT_DRIVER = VIDEO_SDL2;
|
||||
#elif defined(HAVE_SDL_DINGUX)
|
||||
static enum video_driver_enum VIDEO_DEFAULT_DRIVER = VIDEO_SDL_DINGUX;
|
||||
#elif defined(_WIN32) && !defined(_XBOX)
|
||||
static enum video_driver_enum VIDEO_DEFAULT_DRIVER = VIDEO_GDI;
|
||||
#elif defined(DJGPP)
|
||||
@ -808,6 +811,8 @@ const char *config_get_default_video(void)
|
||||
return "switch";
|
||||
case VIDEO_XVIDEO:
|
||||
return "xvideo";
|
||||
case VIDEO_SDL_DINGUX:
|
||||
return "sdl_dingux";
|
||||
case VIDEO_SDL:
|
||||
return "sdl";
|
||||
case VIDEO_SDL2:
|
||||
@ -1455,6 +1460,7 @@ static struct config_bool_setting *populate_settings_bool(settings_t *settings,
|
||||
SETTING_BOOL("menu_horizontal_animation", &settings->bools.menu_horizontal_animation, true, DEFAULT_MENU_HORIZONTAL_ANIMATION, false);
|
||||
SETTING_BOOL("menu_pause_libretro", &settings->bools.menu_pause_libretro, true, true, false);
|
||||
SETTING_BOOL("menu_savestate_resume", &settings->bools.menu_savestate_resume, true, menu_savestate_resume, false);
|
||||
SETTING_BOOL("menu_insert_disk_resume", &settings->bools.menu_insert_disk_resume, true, DEFAULT_MENU_INSERT_DISK_RESUME, false);
|
||||
SETTING_BOOL("menu_mouse_enable", &settings->bools.menu_mouse_enable, true, DEFAULT_MOUSE_ENABLE, false);
|
||||
SETTING_BOOL("menu_pointer_enable", &settings->bools.menu_pointer_enable, true, DEFAULT_POINTER_ENABLE, false);
|
||||
SETTING_BOOL("menu_timedate_enable", &settings->bools.menu_timedate_enable, true, true, false);
|
||||
|
@ -154,6 +154,7 @@ typedef struct settings
|
||||
bool menu_show_start_screen;
|
||||
bool menu_pause_libretro;
|
||||
bool menu_savestate_resume;
|
||||
bool menu_insert_disk_resume;
|
||||
bool menu_timedate_enable;
|
||||
bool menu_battery_level_enable;
|
||||
bool menu_core_enable;
|
||||
|
@ -19,6 +19,7 @@ SWRESAMPLE_DIR := $(BASE_DIR)/libswresample
|
||||
INCFLAGS += -I$(BASE_DIR) -I$(CORE_DIR) -I$(LIBRETRO_COMM_DIR)/include -I$(LIBRETRO_COMM_DIR)/include/compat
|
||||
|
||||
LIBRETRO_SOURCE += $(CORE_DIR)/ffmpeg_core.c \
|
||||
$(CORE_DIR)/packet_buffer.c \
|
||||
$(CORE_DIR)/video_buffer.c \
|
||||
$(LIBRETRO_COMM_DIR)/rthreads/tpool.c \
|
||||
$(LIBRETRO_COMM_DIR)/queues/fifo_queue.c \
|
||||
|
@ -50,6 +50,7 @@ extern "C" {
|
||||
#include <rthreads/tpool.h>
|
||||
#include <queues/fifo_queue.h>
|
||||
#include <string/stdstring.h>
|
||||
#include "packet_buffer.h"
|
||||
#include "video_buffer.h"
|
||||
|
||||
#include <libretro.h>
|
||||
@ -93,7 +94,13 @@ static unsigned sw_sws_threads;
|
||||
static video_buffer_t *video_buffer;
|
||||
static tpool_t *tpool;
|
||||
|
||||
#if LIBAVUTIL_VERSION_MAJOR > 55
|
||||
/* If libavutil is at least version 55 or higher,
|
||||
* and if libavcodec is at least version 57.80.100 or higher,
|
||||
* enable hardware acceleration */
|
||||
#define ENABLE_HW_ACCEL ((LIBAVUTIL_VERSION_MAJOR > 55) && ENABLE_HW_ACCEL_CHECK2())
|
||||
#define ENABLE_HW_ACCEL_CHECK2() ((LIBAVCODEC_VERSION_MAJOR == 57 && LIBAVCODEC_VERSION_MINOR >= 80 && LIBAVCODEC_VERSION_MICRO >= 100) || (LIBAVCODEC_VERSION_MAJOR > 57))
|
||||
|
||||
#if ENABLE_HW_ACCEL
|
||||
static enum AVHWDeviceType hw_decoder;
|
||||
static bool hw_decoding_enabled;
|
||||
static enum AVPixelFormat pix_fmt;
|
||||
@ -277,11 +284,11 @@ void CORE_PREFIX(retro_get_system_av_info)(struct retro_system_av_info *info)
|
||||
void CORE_PREFIX(retro_set_environment)(retro_environment_t cb)
|
||||
{
|
||||
static const struct retro_variable vars[] = {
|
||||
#if LIBAVUTIL_VERSION_MAJOR > 55
|
||||
#if ENABLE_HW_ACCEL
|
||||
{ "ffmpeg_hw_decoder", "Use Hardware decoder (restart); off|auto|"
|
||||
"cuda|d3d11va|drm|dxva2|mediacodec|opencl|qsv|vaapi|vdpau|videotoolbox" },
|
||||
#endif
|
||||
{ "ffmpeg_sw_decoder_threads", "Software decoder thread count (restart); auto|1|2|4|8|16" },
|
||||
{ "ffmpeg_sw_decoder_threads", "Software decoder thread count (restart); auto|1|2|4|6|8|10|12|14|16" },
|
||||
#if defined(HAVE_OPENGL) || defined(HAVE_OPENGLES)
|
||||
{ "ffmpeg_temporal_interp", "Temporal Interpolation; disabled|enabled" },
|
||||
#ifdef HAVE_GL_FFT
|
||||
@ -408,7 +415,7 @@ static void check_variables(bool firststart)
|
||||
slock_unlock(decode_thread_lock);
|
||||
}
|
||||
|
||||
#if LIBAVUTIL_VERSION_MAJOR > 55
|
||||
#if ENABLE_HW_ACCEL
|
||||
if (firststart)
|
||||
{
|
||||
hw_var.key = "ffmpeg_hw_decoder";
|
||||
@ -836,7 +843,7 @@ void CORE_PREFIX(retro_run)(void)
|
||||
CORE_PREFIX(audio_batch_cb)(audio_buffer, to_read_frames);
|
||||
}
|
||||
|
||||
#if LIBAVUTIL_VERSION_MAJOR > 55
|
||||
#if ENABLE_HW_ACCEL
|
||||
/*
|
||||
* Try to initialize a specific HW decoder defined by type.
|
||||
* Optionaly tests the pixel format list for a compatible pixel format.
|
||||
@ -935,7 +942,7 @@ static enum AVPixelFormat select_decoder(AVCodecContext *ctx,
|
||||
{
|
||||
enum AVPixelFormat format = AV_PIX_FMT_NONE;
|
||||
|
||||
#if LIBAVUTIL_VERSION_MAJOR > 55
|
||||
#if ENABLE_HW_ACCEL
|
||||
if (!force_sw_decoder)
|
||||
{
|
||||
if (hw_decoder == AV_HWDEVICE_TYPE_NONE)
|
||||
@ -959,7 +966,7 @@ static enum AVPixelFormat select_decoder(AVCodecContext *ctx,
|
||||
|
||||
format = fctx->streams[video_stream_index]->codec->pix_fmt;
|
||||
|
||||
#if LIBAVUTIL_VERSION_MAJOR > 55
|
||||
#if ENABLE_HW_ACCEL
|
||||
hw_decoding_enabled = false;
|
||||
}
|
||||
else
|
||||
@ -969,7 +976,7 @@ static enum AVPixelFormat select_decoder(AVCodecContext *ctx,
|
||||
return format;
|
||||
}
|
||||
|
||||
#if LIBAVUTIL_VERSION_MAJOR > 55
|
||||
#if ENABLE_HW_ACCEL
|
||||
/* Callback used by ffmpeg to configure the pixelformat to use. */
|
||||
static enum AVPixelFormat get_format(AVCodecContext *ctx,
|
||||
const enum AVPixelFormat *pix_fmts)
|
||||
@ -1004,7 +1011,7 @@ static bool open_codec(AVCodecContext **ctx, enum AVMediaType type, unsigned ind
|
||||
{
|
||||
video_stream_index = index;
|
||||
|
||||
#if LIBAVUTIL_VERSION_MAJOR > 55
|
||||
#if ENABLE_HW_ACCEL
|
||||
vctx->get_format = get_format;
|
||||
pix_fmt = select_decoder((*ctx), NULL);
|
||||
#else
|
||||
@ -1292,7 +1299,7 @@ static void sws_worker_thread(void *arg)
|
||||
AVFrame *tmp_frame = NULL;
|
||||
video_decoder_context_t *ctx = (video_decoder_context_t*) arg;
|
||||
|
||||
#if LIBAVUTIL_VERSION_MAJOR > 55
|
||||
#if ENABLE_HW_ACCEL
|
||||
if (hw_decoding_enabled)
|
||||
tmp_frame = ctx->hw_source;
|
||||
else
|
||||
@ -1335,7 +1342,7 @@ static void sws_worker_thread(void *arg)
|
||||
#endif
|
||||
|
||||
av_frame_unref(ctx->source);
|
||||
#if LIBAVUTIL_VERSION_MAJOR > 55
|
||||
#if ENABLE_HW_ACCEL
|
||||
av_frame_unref(ctx->hw_source);
|
||||
#endif
|
||||
|
||||
@ -1354,11 +1361,6 @@ static void decode_video(AVCodecContext *ctx, AVPacket *pkt, size_t frame_size)
|
||||
/* Stop decoding thread until video_buffer is not full again */
|
||||
while (!decode_thread_dead && !video_buffer_has_open_slot(video_buffer))
|
||||
{
|
||||
/* If we don't buffer enough video frames we can run into a deadlock.
|
||||
* for now drop frames in this case. This could happen with MP4 files
|
||||
* since the often save the audio frames into the stream.
|
||||
* Longterm solution: audio and video decoding in their own threads
|
||||
* with their own file handle. */
|
||||
if (main_sleeping)
|
||||
{
|
||||
log_cb(RETRO_LOG_ERROR, "[FFMPEG] Thread: Video deadlock detected.\n");
|
||||
@ -1398,7 +1400,7 @@ static void decode_video(AVCodecContext *ctx, AVPacket *pkt, size_t frame_size)
|
||||
goto end;
|
||||
}
|
||||
|
||||
#if LIBAVUTIL_VERSION_MAJOR > 55
|
||||
#if ENABLE_HW_ACCEL
|
||||
if (hw_decoding_enabled)
|
||||
/* Copy data from VRAM to RAM */
|
||||
if ((ret = av_hwframe_transfer_data(decoder_ctx->hw_source, decoder_ctx->source, 0)) < 0)
|
||||
@ -1534,14 +1536,30 @@ static void decode_thread_seek(double time)
|
||||
#endif
|
||||
}
|
||||
|
||||
/**
|
||||
* This function makes sure that we don't decode too many
|
||||
* packets and cause stalls in our decoding pipeline.
|
||||
* This could happen if we decode too many packets and
|
||||
* saturate our buffers. We have a window of "still okay"
|
||||
* to decode, that depends on the media fps.
|
||||
**/
|
||||
static bool earlier_or_close_enough(double p1, double p2)
|
||||
{
|
||||
return (p1 <= p2 || (p1-p2) < (1.0 / media.interpolate_fps) );
|
||||
}
|
||||
|
||||
static void decode_thread(void *data)
|
||||
{
|
||||
unsigned i;
|
||||
bool eof = false;
|
||||
struct SwrContext *swr[audio_streams_num];
|
||||
AVFrame *aud_frame = NULL;
|
||||
size_t frame_size = 0;
|
||||
int16_t *audio_buffer = NULL;
|
||||
size_t audio_buffer_cap = 0;
|
||||
packet_buffer_t *audio_packet_buffer;
|
||||
packet_buffer_t *video_packet_buffer;
|
||||
double last_audio_end = 0;
|
||||
|
||||
(void)data;
|
||||
|
||||
@ -1559,11 +1577,13 @@ static void decode_thread(void *data)
|
||||
}
|
||||
|
||||
aud_frame = av_frame_alloc();
|
||||
audio_packet_buffer = packet_buffer_create();
|
||||
video_packet_buffer = packet_buffer_create();
|
||||
|
||||
if (video_stream_index >= 0)
|
||||
{
|
||||
frame_size = avpicture_get_size(PIX_FMT_RGB32, media.width, media.height);
|
||||
video_buffer = video_buffer_create(32, frame_size, media.width, media.height);
|
||||
video_buffer = video_buffer_create(4, frame_size, media.width, media.height);
|
||||
tpool = tpool_create(sw_sws_threads);
|
||||
log_cb(RETRO_LOG_INFO, "[FFMPEG] Configured worker threads: %d\n", sw_sws_threads);
|
||||
}
|
||||
@ -1571,12 +1591,19 @@ static void decode_thread(void *data)
|
||||
while (!decode_thread_dead)
|
||||
{
|
||||
bool seek;
|
||||
AVPacket pkt;
|
||||
int subtitle_stream;
|
||||
double seek_time_thread;
|
||||
int audio_stream, audio_stream_ptr;
|
||||
int audio_stream_index, audio_stream_ptr;
|
||||
|
||||
double audio_timebase = 0.0;
|
||||
double video_timebase = 0.0;
|
||||
double next_video_end = 0.0;
|
||||
double next_audio_start = 0.0;
|
||||
|
||||
AVPacket *pkt = av_packet_alloc();
|
||||
AVCodecContext *actx_active = NULL;
|
||||
AVCodecContext *sctx_active = NULL;
|
||||
|
||||
#ifdef HAVE_SSA
|
||||
ASS_Track *ass_track_active = NULL;
|
||||
#endif
|
||||
@ -1591,22 +1618,25 @@ static void decode_thread(void *data)
|
||||
decode_thread_seek(seek_time_thread);
|
||||
|
||||
slock_lock(fifo_lock);
|
||||
do_seek = false;
|
||||
seek_time = 0.0;
|
||||
do_seek = false;
|
||||
eof = false;
|
||||
seek_time = 0.0;
|
||||
next_video_end = 0.0;
|
||||
next_audio_start = 0.0;
|
||||
last_audio_end = 0.0;
|
||||
|
||||
if (audio_decode_fifo)
|
||||
fifo_clear(audio_decode_fifo);
|
||||
|
||||
packet_buffer_clear(&audio_packet_buffer);
|
||||
packet_buffer_clear(&video_packet_buffer);
|
||||
|
||||
scond_signal(fifo_cond);
|
||||
slock_unlock(fifo_lock);
|
||||
}
|
||||
|
||||
memset(&pkt, 0, sizeof(pkt));
|
||||
if (av_read_frame(fctx, &pkt) < 0)
|
||||
break;
|
||||
|
||||
slock_lock(decode_thread_lock);
|
||||
audio_stream = audio_streams[audio_streams_ptr];
|
||||
audio_stream_index = audio_streams[audio_streams_ptr];
|
||||
audio_stream_ptr = audio_streams_ptr;
|
||||
subtitle_stream = subtitle_streams[subtitle_streams_ptr];
|
||||
actx_active = actx[audio_streams_ptr];
|
||||
@ -1614,22 +1644,84 @@ static void decode_thread(void *data)
|
||||
#ifdef HAVE_SSA
|
||||
ass_track_active = ass_track[subtitle_streams_ptr];
|
||||
#endif
|
||||
audio_timebase = av_q2d(fctx->streams[audio_stream_index]->time_base);
|
||||
if (video_stream_index >= 0)
|
||||
video_timebase = av_q2d(fctx->streams[video_stream_index]->time_base);
|
||||
slock_unlock(decode_thread_lock);
|
||||
|
||||
if (pkt.stream_index == video_stream_index)
|
||||
#ifdef HAVE_SSA
|
||||
decode_video(vctx, &pkt, frame_size, ass_track_active);
|
||||
#else
|
||||
decode_video(vctx, &pkt, frame_size);
|
||||
#endif
|
||||
else if (pkt.stream_index == audio_stream && actx_active)
|
||||
if (!packet_buffer_empty(audio_packet_buffer))
|
||||
next_audio_start = audio_timebase * packet_buffer_peek_start_pts(audio_packet_buffer);
|
||||
|
||||
if (!packet_buffer_empty(video_packet_buffer))
|
||||
next_video_end = video_timebase * packet_buffer_peek_end_pts(video_packet_buffer);
|
||||
|
||||
/*
|
||||
* Decode audio packet if:
|
||||
* 1. it's the start of file or it's audio only media
|
||||
* 2. there is a video packet for in the buffer
|
||||
* 3. EOF
|
||||
**/
|
||||
if (!packet_buffer_empty(audio_packet_buffer) &&
|
||||
(
|
||||
next_video_end == 0.0 ||
|
||||
(!eof && earlier_or_close_enough(next_audio_start, next_video_end)) ||
|
||||
eof
|
||||
)
|
||||
)
|
||||
{
|
||||
audio_buffer = decode_audio(actx_active, &pkt, aud_frame,
|
||||
audio_buffer, &audio_buffer_cap,
|
||||
swr[audio_stream_ptr]);
|
||||
packet_buffer_get_packet(audio_packet_buffer, pkt);
|
||||
last_audio_end = audio_timebase * (pkt->pts + pkt->duration);
|
||||
audio_buffer = decode_audio(actx_active, pkt, aud_frame,
|
||||
audio_buffer, &audio_buffer_cap,
|
||||
swr[audio_stream_ptr]);
|
||||
av_packet_unref(pkt);
|
||||
}
|
||||
else if (pkt.stream_index == subtitle_stream && sctx_active)
|
||||
|
||||
/*
|
||||
* Decode video packet if:
|
||||
* 1. we already decoded an audio packet
|
||||
* 2. there is no audio stream to play
|
||||
* 3. EOF
|
||||
**/
|
||||
if (!packet_buffer_empty(video_packet_buffer) &&
|
||||
(
|
||||
(!eof && earlier_or_close_enough(next_video_end, last_audio_end)) ||
|
||||
!actx_active ||
|
||||
eof
|
||||
)
|
||||
)
|
||||
{
|
||||
packet_buffer_get_packet(video_packet_buffer, pkt);
|
||||
|
||||
#ifdef HAVE_SSA
|
||||
decode_video(vctx, pkt, frame_size, ass_track_active);
|
||||
#else
|
||||
decode_video(vctx, pkt, frame_size);
|
||||
#endif
|
||||
|
||||
av_packet_unref(pkt);
|
||||
}
|
||||
|
||||
if (packet_buffer_empty(audio_packet_buffer) && packet_buffer_empty(video_packet_buffer) && eof)
|
||||
{
|
||||
av_packet_free(&pkt);
|
||||
break;
|
||||
}
|
||||
|
||||
// Read the next frame and stage it in case of audio or video frame.
|
||||
if (av_read_frame(fctx, pkt) < 0)
|
||||
eof = true;
|
||||
else if (pkt->stream_index == audio_stream_index && actx_active)
|
||||
packet_buffer_add_packet(audio_packet_buffer, pkt);
|
||||
else if (pkt->stream_index == video_stream_index)
|
||||
packet_buffer_add_packet(video_packet_buffer, pkt);
|
||||
else if (pkt->stream_index == subtitle_stream && sctx_active)
|
||||
{
|
||||
/**
|
||||
* Decode subtitle packets right away, since SSA/ASS can operate this way.
|
||||
* If we ever support other subtitles, we need to handle this with a
|
||||
* buffer too
|
||||
**/
|
||||
AVSubtitle sub;
|
||||
int finished = 0;
|
||||
|
||||
@ -1637,13 +1729,12 @@ static void decode_thread(void *data)
|
||||
|
||||
while (!finished)
|
||||
{
|
||||
if (avcodec_decode_subtitle2(sctx_active, &sub, &finished, &pkt) < 0)
|
||||
if (avcodec_decode_subtitle2(sctx_active, &sub, &finished, pkt) < 0)
|
||||
{
|
||||
log_cb(RETRO_LOG_ERROR, "[FFMPEG] Decode subtitles failed.\n");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef HAVE_SSA
|
||||
for (i = 0; i < sub.num_rects; i++)
|
||||
{
|
||||
@ -1654,18 +1745,22 @@ static void decode_thread(void *data)
|
||||
slock_unlock(ass_lock);
|
||||
}
|
||||
#endif
|
||||
|
||||
avsubtitle_free(&sub);
|
||||
av_packet_unref(pkt);
|
||||
}
|
||||
|
||||
av_free_packet(&pkt);
|
||||
av_packet_free(&pkt);
|
||||
}
|
||||
|
||||
for (i = 0; (int)i < audio_streams_num; i++)
|
||||
swr_free(&swr[i]);
|
||||
|
||||
#if ENABLE_HW_ACCEL
|
||||
if (vctx && vctx->hw_device_ctx)
|
||||
av_buffer_unref(&vctx->hw_device_ctx);
|
||||
#endif
|
||||
|
||||
packet_buffer_destroy(audio_packet_buffer);
|
||||
packet_buffer_destroy(video_packet_buffer);
|
||||
|
||||
av_frame_free(&aud_frame);
|
||||
av_freep(&audio_buffer);
|
||||
@ -1967,9 +2062,9 @@ bool CORE_PREFIX(retro_load_game)(const struct retro_game_info *info)
|
||||
}
|
||||
if (audio_streams_num > 0)
|
||||
{
|
||||
/* audio fifo is 4 seconds deep */
|
||||
/* audio fifo is 2 seconds deep */
|
||||
audio_decode_fifo = fifo_new(
|
||||
media.sample_rate * sizeof(int16_t) * 2 * 4
|
||||
media.sample_rate * sizeof(int16_t) * 2 * 2
|
||||
);
|
||||
}
|
||||
|
||||
|
135
cores/libretro-ffmpeg/packet_buffer.c
Normal file
135
cores/libretro-ffmpeg/packet_buffer.c
Normal file
@ -0,0 +1,135 @@
|
||||
#include "packet_buffer.h"
|
||||
|
||||
struct AVPacketNode {
|
||||
AVPacket *data;
|
||||
struct AVPacketNode *next;
|
||||
struct AVPacketNode *previous;
|
||||
};
|
||||
typedef struct AVPacketNode AVPacketNode_t;
|
||||
|
||||
struct packet_buffer
|
||||
{
|
||||
AVPacketNode_t *head;
|
||||
AVPacketNode_t *tail;
|
||||
size_t size;
|
||||
};
|
||||
|
||||
packet_buffer_t *packet_buffer_create()
|
||||
{
|
||||
packet_buffer_t *b = malloc(sizeof(packet_buffer_t));
|
||||
if (!b)
|
||||
return NULL;
|
||||
|
||||
memset(b, 0, sizeof(packet_buffer_t));
|
||||
|
||||
return b;
|
||||
}
|
||||
|
||||
void packet_buffer_destroy(packet_buffer_t *packet_buffer)
|
||||
{
|
||||
AVPacketNode_t *node;
|
||||
|
||||
if (!packet_buffer)
|
||||
return;
|
||||
|
||||
if (packet_buffer->head)
|
||||
{
|
||||
node = packet_buffer->head;
|
||||
while (node)
|
||||
{
|
||||
AVPacketNode_t *next = node->next;
|
||||
av_packet_free(&node->data);
|
||||
free(node);
|
||||
node = next;
|
||||
}
|
||||
}
|
||||
|
||||
free(packet_buffer);
|
||||
}
|
||||
|
||||
void packet_buffer_clear(packet_buffer_t **packet_buffer)
|
||||
{
|
||||
if (!packet_buffer)
|
||||
return;
|
||||
|
||||
packet_buffer_destroy(*packet_buffer);
|
||||
*packet_buffer = packet_buffer_create();
|
||||
}
|
||||
|
||||
bool packet_buffer_empty(packet_buffer_t *packet_buffer)
|
||||
{
|
||||
if (!packet_buffer)
|
||||
return true;
|
||||
|
||||
return packet_buffer->size == 0;
|
||||
}
|
||||
|
||||
size_t packet_buffer_size(packet_buffer_t *packet_buffer)
|
||||
{
|
||||
if (!packet_buffer)
|
||||
return 0;
|
||||
|
||||
return packet_buffer->size;
|
||||
}
|
||||
|
||||
void packet_buffer_add_packet(packet_buffer_t *packet_buffer, AVPacket *pkt)
|
||||
{
|
||||
AVPacketNode_t *new_head = (AVPacketNode_t *) malloc(sizeof(AVPacketNode_t));
|
||||
new_head->data = av_packet_alloc();
|
||||
|
||||
av_packet_move_ref(new_head->data, pkt);
|
||||
|
||||
if (packet_buffer->head)
|
||||
{
|
||||
new_head->next = packet_buffer->head;
|
||||
packet_buffer->head->previous = new_head;
|
||||
}
|
||||
else
|
||||
{
|
||||
new_head->next = NULL;
|
||||
packet_buffer->tail = new_head;
|
||||
}
|
||||
|
||||
packet_buffer->head = new_head;
|
||||
packet_buffer->head->previous = NULL;
|
||||
packet_buffer->size++;
|
||||
}
|
||||
|
||||
void packet_buffer_get_packet(packet_buffer_t *packet_buffer, AVPacket *pkt)
|
||||
{
|
||||
AVPacketNode_t *new_tail = NULL;
|
||||
|
||||
if (packet_buffer->tail == NULL)
|
||||
return;
|
||||
|
||||
av_packet_move_ref(pkt, packet_buffer->tail->data);
|
||||
if (packet_buffer->tail->previous)
|
||||
{
|
||||
new_tail = packet_buffer->tail->previous;
|
||||
new_tail->next = NULL;
|
||||
}
|
||||
else
|
||||
packet_buffer->head = NULL;
|
||||
|
||||
av_packet_free(&packet_buffer->tail->data);
|
||||
free(packet_buffer->tail);
|
||||
|
||||
packet_buffer->tail = new_tail;
|
||||
packet_buffer->size--;
|
||||
}
|
||||
|
||||
int64_t packet_buffer_peek_start_pts(packet_buffer_t *packet_buffer)
|
||||
{
|
||||
if (!packet_buffer->tail)
|
||||
return 0;
|
||||
|
||||
return packet_buffer->tail->data->pts;
|
||||
}
|
||||
|
||||
int64_t packet_buffer_peek_end_pts(packet_buffer_t *packet_buffer)
|
||||
{
|
||||
if (!packet_buffer->tail)
|
||||
return 0;
|
||||
|
||||
return packet_buffer->tail->data->pts + packet_buffer->tail->data->duration;
|
||||
}
|
110
cores/libretro-ffmpeg/packet_buffer.h
Normal file
110
cores/libretro-ffmpeg/packet_buffer.h
Normal file
@ -0,0 +1,110 @@
|
||||
#ifndef __LIBRETRO_SDK_PACKETBUFFER_H__
|
||||
#define __LIBRETRO_SDK_PACKETBUFFER_H__
|
||||
|
||||
#include <retro_common_api.h>
|
||||
|
||||
#include <boolean.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#include <libavcodec/avcodec.h>
|
||||
|
||||
#include <retro_miscellaneous.h>
|
||||
|
||||
RETRO_BEGIN_DECLS
|
||||
|
||||
/**
|
||||
* packet_buffer
|
||||
*
|
||||
* Just a simple double linked list for AVPackets.
|
||||
*
|
||||
*/
|
||||
struct packet_buffer;
|
||||
typedef struct packet_buffer packet_buffer_t;
|
||||
|
||||
/**
|
||||
* packet_buffer_create:
|
||||
*
|
||||
* Create a packet_buffer.
|
||||
*
|
||||
* Returns: A packet buffer.
|
||||
*/
|
||||
packet_buffer_t *packet_buffer_create();
|
||||
|
||||
/**
|
||||
* packet_buffer_destroy:
|
||||
* @packet_buffer : packet buffer
|
||||
*
|
||||
* Destroys a packet buffer.
|
||||
*
|
||||
**/
|
||||
void packet_buffer_destroy(packet_buffer_t *packet_buffer);
|
||||
|
||||
/**
|
||||
* packet_buffer_clear:
|
||||
* @packet_buffer : packet buffer
|
||||
*
|
||||
* Clears a packet buffer by re-creating it.
|
||||
*
|
||||
**/
|
||||
void packet_buffer_clear(packet_buffer_t **packet_buffer);
|
||||
|
||||
/**
|
||||
* packet_buffer_empty:
|
||||
* @packet_buffer : packet buffer
|
||||
*
|
||||
* Return true if the buffer is empty;
|
||||
*
|
||||
**/
|
||||
bool packet_buffer_empty(packet_buffer_t *packet_buffer);
|
||||
|
||||
/**
|
||||
* packet_buffer_size:
|
||||
* @packet_buffer : packet buffer
|
||||
*
|
||||
* Returns the number of AVPackets the buffer currently
|
||||
* holds.
|
||||
*
|
||||
**/
|
||||
size_t packet_buffer_size(packet_buffer_t *packet_buffer);
|
||||
|
||||
/**
|
||||
* packet_buffer_add_packet:
|
||||
* @packet_buffer : packet buffer
|
||||
* @pkt : packet
|
||||
*
|
||||
* Copies the given packet into the selected buffer.
|
||||
*
|
||||
**/
|
||||
void packet_buffer_add_packet(packet_buffer_t *packet_buffer, AVPacket *pkt);
|
||||
|
||||
/**
|
||||
* packet_buffer_get_packet:
|
||||
* @packet_buffer : packet buffer
|
||||
* @pkt : packet
|
||||
*
|
||||
* Get the next packet. User needs to unref the packet with av_packet_unref().
|
||||
*
|
||||
**/
|
||||
void packet_buffer_get_packet(packet_buffer_t *packet_buffer, AVPacket *pkt);
|
||||
|
||||
/**
|
||||
* packet_buffer_peek_start_pts:
|
||||
* @packet_buffer : packet buffer
|
||||
*
|
||||
* Returns the start pts of the next packet in the buffer.
|
||||
*
|
||||
**/
|
||||
int64_t packet_buffer_peek_start_pts(packet_buffer_t *packet_buffer);
|
||||
|
||||
/**
|
||||
* packet_buffer_peek_end_pts:
|
||||
* @packet_buffer : packet buffer
|
||||
*
|
||||
* Returns the end pts of the next packet in the buffer.
|
||||
*
|
||||
**/
|
||||
int64_t packet_buffer_peek_end_pts(packet_buffer_t *packet_buffer);
|
||||
|
||||
RETRO_END_DECLS
|
||||
|
||||
#endif
|
@ -15,7 +15,7 @@ struct video_buffer
|
||||
{
|
||||
video_decoder_context_t *buffer;
|
||||
enum kbStatus *status;
|
||||
size_t size;
|
||||
size_t capacity;
|
||||
slock_t *lock;
|
||||
scond_t *open_cond;
|
||||
scond_t *finished_cond;
|
||||
@ -23,24 +23,19 @@ struct video_buffer
|
||||
int64_t tail;
|
||||
};
|
||||
|
||||
video_buffer_t *video_buffer_create(size_t num, int frame_size, int width, int height)
|
||||
video_buffer_t *video_buffer_create(size_t capacity, int frame_size, int width, int height)
|
||||
{
|
||||
video_buffer_t *b = malloc(sizeof (video_buffer_t));
|
||||
video_buffer_t *b = malloc(sizeof(video_buffer_t));
|
||||
if (!b)
|
||||
return NULL;
|
||||
|
||||
b->lock = NULL;
|
||||
b->open_cond = NULL;
|
||||
b->finished_cond = NULL;
|
||||
b->buffer = NULL;
|
||||
b->size = num;
|
||||
b->head = 0;
|
||||
b->tail = 0;
|
||||
memset(b, 0, sizeof(video_buffer_t));
|
||||
b->capacity = capacity;
|
||||
|
||||
b->status = malloc(sizeof(enum kbStatus) * num);
|
||||
b->status = malloc(sizeof(enum kbStatus) * capacity);
|
||||
if (!b->status)
|
||||
goto fail;
|
||||
for (int i = 0; i < num; i++)
|
||||
for (int i = 0; i < capacity; i++)
|
||||
b->status[i] = KB_OPEN;
|
||||
|
||||
b->lock = slock_new();
|
||||
@ -49,11 +44,11 @@ video_buffer_t *video_buffer_create(size_t num, int frame_size, int width, int h
|
||||
if (!b->lock || !b->open_cond || !b->finished_cond)
|
||||
goto fail;
|
||||
|
||||
b->buffer = malloc(sizeof(video_decoder_context_t) * num);
|
||||
b->buffer = malloc(sizeof(video_decoder_context_t) * capacity);
|
||||
if (!b->buffer)
|
||||
goto fail;
|
||||
|
||||
for (int i = 0; i < num; i++)
|
||||
for (int i = 0; i < capacity; i++)
|
||||
{
|
||||
b->buffer[i].index = i;
|
||||
b->buffer[i].pts = 0;
|
||||
@ -94,7 +89,7 @@ void video_buffer_destroy(video_buffer_t *video_buffer)
|
||||
scond_free(video_buffer->finished_cond);
|
||||
free(video_buffer->status);
|
||||
if (video_buffer->buffer)
|
||||
for (int i = 0; i < video_buffer->size; i++)
|
||||
for (int i = 0; i < video_buffer->capacity; i++)
|
||||
{
|
||||
#if LIBAVUTIL_VERSION_MAJOR > 55
|
||||
av_frame_free(&video_buffer->buffer[i].hw_source);
|
||||
@ -120,7 +115,7 @@ void video_buffer_clear(video_buffer_t *video_buffer)
|
||||
|
||||
video_buffer->head = 0;
|
||||
video_buffer->tail = 0;
|
||||
for (int i = 0; i < video_buffer->size; i++)
|
||||
for (int i = 0; i < video_buffer->capacity; i++)
|
||||
video_buffer->status[i] = KB_OPEN;
|
||||
|
||||
slock_unlock(video_buffer->lock);
|
||||
@ -135,7 +130,7 @@ void video_buffer_get_open_slot(video_buffer_t *video_buffer, video_decoder_cont
|
||||
*context = &video_buffer->buffer[video_buffer->head];
|
||||
video_buffer->status[video_buffer->head] = KB_IN_PROGRESS;
|
||||
video_buffer->head++;
|
||||
video_buffer->head %= video_buffer->size;
|
||||
video_buffer->head %= video_buffer->capacity;
|
||||
}
|
||||
|
||||
slock_unlock(video_buffer->lock);
|
||||
@ -149,7 +144,7 @@ void video_buffer_return_open_slot(video_buffer_t *video_buffer, video_decoder_c
|
||||
{
|
||||
video_buffer->status[context->index] = KB_OPEN;
|
||||
video_buffer->head--;
|
||||
video_buffer->head %= video_buffer->size;
|
||||
video_buffer->head %= video_buffer->capacity;
|
||||
}
|
||||
|
||||
slock_unlock(video_buffer->lock);
|
||||
@ -163,7 +158,7 @@ void video_buffer_open_slot(video_buffer_t *video_buffer, video_decoder_context_
|
||||
{
|
||||
video_buffer->status[context->index] = KB_OPEN;
|
||||
video_buffer->tail++;
|
||||
video_buffer->tail %= (video_buffer->size);
|
||||
video_buffer->tail %= (video_buffer->capacity);
|
||||
scond_signal(video_buffer->open_cond);
|
||||
}
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
#ifndef __LIBRETRO_SDK_SWSBUFFER_H__
|
||||
#define __LIBRETRO_SDK_SWSBUFFER_H__
|
||||
#ifndef __LIBRETRO_SDK_VIDEOBUFFER_H__
|
||||
#define __LIBRETRO_SDK_VIDEOBUFFER_H__
|
||||
|
||||
#include <retro_common_api.h>
|
||||
|
||||
@ -47,7 +47,7 @@ typedef struct video_decoder_context video_decoder_context_t;
|
||||
/**
|
||||
* video_buffer
|
||||
*
|
||||
* The video_buffer is a ring buffer, that can be used as a
|
||||
* The video buffer is a ring buffer, that can be used as a
|
||||
* buffer for many workers while keeping the order.
|
||||
*
|
||||
* It is thread safe in a sensem that it is designed to work
|
||||
@ -61,26 +61,26 @@ typedef struct video_buffer video_buffer_t;
|
||||
|
||||
/**
|
||||
* video_buffer_create:
|
||||
* @num : Size of the buffer.
|
||||
* @capacity : Size of the buffer.
|
||||
* @frame_size : Size of the target frame.
|
||||
* @width : Width of the target frame.
|
||||
* @height : Height of the target frame.
|
||||
*
|
||||
* Create a video_buffer.
|
||||
* Create a video buffer.
|
||||
*
|
||||
* Returns: A video buffer.
|
||||
*/
|
||||
video_buffer_t *video_buffer_create(size_t num, int frame_size, int width, int height);
|
||||
video_buffer_t *video_buffer_create(size_t capacity, int frame_size, int width, int height);
|
||||
|
||||
/**
|
||||
* video_buffer_destroy:
|
||||
* @video_buffer : video buffer.
|
||||
*
|
||||
* Destory a video_buffer.
|
||||
* Destroys a video buffer.
|
||||
*
|
||||
* Does also free the buffer allocated with video_buffer_create().
|
||||
* User has to shut down any external worker threads that may have
|
||||
* a reference to this video_buffer.
|
||||
* a reference to this video buffer.
|
||||
*
|
||||
**/
|
||||
void video_buffer_destroy(video_buffer_t *video_buffer);
|
||||
@ -89,7 +89,7 @@ void video_buffer_destroy(video_buffer_t *video_buffer);
|
||||
* video_buffer_clear:
|
||||
* @video_buffer : video buffer.
|
||||
*
|
||||
* Clears a video_buffer.
|
||||
* Clears a video buffer.
|
||||
*
|
||||
**/
|
||||
void video_buffer_clear(video_buffer_t *video_buffer);
|
||||
@ -97,7 +97,7 @@ void video_buffer_clear(video_buffer_t *video_buffer);
|
||||
/**
|
||||
* video_buffer_get_open_slot:
|
||||
* @video_buffer : video buffer.
|
||||
* @contex : sws context.
|
||||
* @context : sws context.
|
||||
*
|
||||
* Returns the next open context inside the ring buffer
|
||||
* and it's index. The status of the slot will be marked as
|
||||
@ -110,7 +110,7 @@ void video_buffer_get_open_slot(video_buffer_t *video_buffer, video_decoder_cont
|
||||
/**
|
||||
* video_buffer_return_open_slot:
|
||||
* @video_buffer : video buffer.
|
||||
* @contex : sws context.
|
||||
* @context : sws context.
|
||||
*
|
||||
* Marks the given sws context that is "in progress" as "open" again.
|
||||
*
|
||||
@ -120,7 +120,7 @@ void video_buffer_return_open_slot(video_buffer_t *video_buffer, video_decoder_c
|
||||
/**
|
||||
* video_buffer_open_slot:
|
||||
* @video_buffer : video buffer.
|
||||
* @context : sws context.
|
||||
* @context : sws context.
|
||||
*
|
||||
* Sets the status of the given context from "finished" to "open".
|
||||
* The slot is then available for producers to claim again with video_buffer_get_open_slot().
|
||||
@ -130,21 +130,20 @@ void video_buffer_open_slot(video_buffer_t *video_buffer, video_decoder_context_
|
||||
/**
|
||||
* video_buffer_get_finished_slot:
|
||||
* @video_buffer : video buffer.
|
||||
* @context : sws context.
|
||||
* @context : sws context.
|
||||
*
|
||||
* Returns a reference for the next context inside
|
||||
* the ring buffer. User needs to use video_buffer_open_slot()
|
||||
* to open the slot in the ringbuffer for the next
|
||||
* work assignment. User is free to re-allocate or
|
||||
* re-use the context.
|
||||
*
|
||||
*/
|
||||
void video_buffer_get_finished_slot(video_buffer_t *video_buffer, video_decoder_context_t **context);
|
||||
|
||||
/**
|
||||
* video_buffer_finish_slot:
|
||||
* @video_buffer : video buffer.
|
||||
* @context : sws context.
|
||||
* @context : sws context.
|
||||
*
|
||||
* Sets the status of the given context from "in progress" to "finished".
|
||||
* This is normally done by a producer. User can then retrieve the finished work
|
||||
|
@ -8,6 +8,7 @@ image_core.so: image_core.c
|
||||
../../libretro-common/compat/compat_strcasestr.c \
|
||||
../../libretro-common/compat/compat_strl.c \
|
||||
../../libretro-common/file/file_path.c \
|
||||
../../libretro-common/file/file_path_io.c \
|
||||
../../libretro-common/file/retro_dirent.c \
|
||||
../../libretro-common/lists/dir_list.c \
|
||||
../../libretro-common/lists/string_list.c \
|
||||
|
3
deps/rcheevos/src/rcheevos/trigger.c
vendored
3
deps/rcheevos/src/rcheevos/trigger.c
vendored
@ -1,7 +1,10 @@
|
||||
#include "internal.h"
|
||||
|
||||
#include <stddef.h>
|
||||
#if !defined( __CELLOS_LV2__) && !defined(__MWERKS__)
|
||||
#include <memory.h>
|
||||
#endif
|
||||
#include <string.h>
|
||||
|
||||
void rc_parse_trigger_internal(rc_trigger_t* self, const char** memaddr, rc_parse_state_t* parse) {
|
||||
rc_condset_t** next;
|
||||
|
3
deps/rcheevos/src/rcheevos/value.c
vendored
3
deps/rcheevos/src/rcheevos/value.c
vendored
@ -1,6 +1,9 @@
|
||||
#include "internal.h"
|
||||
|
||||
#if !defined( __CELLOS_LV2__) && !defined(__MWERKS__)
|
||||
#include <memory.h>
|
||||
#endif
|
||||
#include <string.h>
|
||||
|
||||
static void rc_parse_cond_value(rc_value_t* self, const char** memaddr, rc_parse_state_t* parse) {
|
||||
rc_condition_t** next;
|
||||
|
@ -488,7 +488,7 @@ void discord_init(const char *discord_app_id)
|
||||
Discord_Initialize(discord_app_id, &handlers, 0, NULL);
|
||||
|
||||
#ifdef _WIN32
|
||||
GetModuleFileNameA(NULL, full_path, sizeof(full_path));
|
||||
fill_pathname_application_path(full_path, sizeof(full_path));
|
||||
if (strstr(get_retroarch_launch_arguments(), full_path))
|
||||
strlcpy(command, get_retroarch_launch_arguments(), sizeof(command));
|
||||
else
|
||||
|
@ -396,6 +396,8 @@ void gfxSetFramebufferInfo(gfxScreen_t screen, u8 id);
|
||||
static void frontend_ctr_init(void* data)
|
||||
{
|
||||
#ifndef IS_SALAMANDER
|
||||
extern audio_driver_t audio_null;
|
||||
|
||||
(void)data;
|
||||
|
||||
verbosity_enable();
|
||||
|
@ -1,53 +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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#include "../frontend_driver.h"
|
||||
|
||||
frontend_ctx_driver_t frontend_ctx_null = {
|
||||
NULL, /* environment_get */
|
||||
NULL, /* init */
|
||||
NULL, /* deinit */
|
||||
NULL, /* exitspawn */
|
||||
NULL, /* process_args */
|
||||
NULL, /* exec */
|
||||
NULL, /* set_fork */
|
||||
NULL, /* shutdown */
|
||||
NULL, /* get_name */
|
||||
NULL, /* get_os */
|
||||
NULL, /* get_rating */
|
||||
NULL, /* load_content */
|
||||
NULL, /* get_architecture */
|
||||
NULL, /* get_powerstate */
|
||||
NULL, /* parse_drive_list */
|
||||
NULL, /* get_mem_total */
|
||||
NULL, /* get_mem_free */
|
||||
NULL, /* install_signal_handler */
|
||||
NULL, /* get_sighandler_state */
|
||||
NULL, /* set_sighandler_state */
|
||||
NULL, /* destroy_sighandler_state */
|
||||
NULL, /* attach_console */
|
||||
NULL, /* detach_console */
|
||||
#ifdef HAVE_LAKKA
|
||||
NULL, /* get_lakka_version */
|
||||
#endif
|
||||
NULL, /* watch_path_for_changes */
|
||||
NULL, /* check_for_path_changes */
|
||||
NULL, /* set_sustained_performance_mode */
|
||||
NULL, /* get_cpu_model_name */
|
||||
NULL, /* get_user_language */
|
||||
"null",
|
||||
};
|
@ -691,7 +691,7 @@ static void frontend_switch_init(void *data)
|
||||
uint32_t width = 0;
|
||||
uint32_t height = 0;
|
||||
|
||||
nifmInitialize();
|
||||
nifmInitialize(NifmServiceType_User);
|
||||
|
||||
if(hosversionBefore(8, 0, 0))
|
||||
pcvInitialize();
|
||||
|
@ -36,6 +36,42 @@
|
||||
#endif
|
||||
#endif
|
||||
|
||||
static frontend_ctx_driver_t frontend_ctx_null = {
|
||||
NULL, /* environment_get */
|
||||
NULL, /* init */
|
||||
NULL, /* deinit */
|
||||
NULL, /* exitspawn */
|
||||
NULL, /* process_args */
|
||||
NULL, /* exec */
|
||||
NULL, /* set_fork */
|
||||
NULL, /* shutdown */
|
||||
NULL, /* get_name */
|
||||
NULL, /* get_os */
|
||||
NULL, /* get_rating */
|
||||
NULL, /* load_content */
|
||||
NULL, /* get_architecture */
|
||||
NULL, /* get_powerstate */
|
||||
NULL, /* parse_drive_list */
|
||||
NULL, /* get_mem_total */
|
||||
NULL, /* get_mem_free */
|
||||
NULL, /* install_signal_handler */
|
||||
NULL, /* get_sighandler_state */
|
||||
NULL, /* set_sighandler_state */
|
||||
NULL, /* destroy_sighandler_state */
|
||||
NULL, /* attach_console */
|
||||
NULL, /* detach_console */
|
||||
#ifdef HAVE_LAKKA
|
||||
NULL, /* get_lakka_version */
|
||||
#endif
|
||||
NULL, /* watch_path_for_changes */
|
||||
NULL, /* check_for_path_changes */
|
||||
NULL, /* set_sustained_performance_mode */
|
||||
NULL, /* get_cpu_model_name */
|
||||
NULL, /* get_user_language */
|
||||
"null",
|
||||
NULL, /* get_video_driver */
|
||||
};
|
||||
|
||||
static frontend_ctx_driver_t *frontend_ctx_drivers[] = {
|
||||
#if defined(EMSCRIPTEN)
|
||||
&frontend_ctx_emscripten,
|
||||
|
@ -134,7 +134,6 @@ extern frontend_ctx_driver_t frontend_ctx_emscripten;
|
||||
extern frontend_ctx_driver_t frontend_ctx_dos;
|
||||
extern frontend_ctx_driver_t frontend_ctx_switch;
|
||||
extern frontend_ctx_driver_t frontend_ctx_orbis;
|
||||
extern frontend_ctx_driver_t frontend_ctx_null;
|
||||
|
||||
/**
|
||||
* frontend_ctx_find_driver:
|
||||
|
@ -30,7 +30,6 @@
|
||||
#include "../../verbosity.h"
|
||||
#include "../../frontend/frontend_driver.h"
|
||||
|
||||
|
||||
/* Normal DirectX 11 backend */
|
||||
const EGLint backendD3D11[] =
|
||||
{
|
||||
@ -87,21 +86,27 @@ const char* backendNamesList[] = {
|
||||
/* Try initializing EGL with the backend specified in display_attr. */
|
||||
static bool angle_try_initialize(egl_ctx_data_t* egl,
|
||||
void* display_data, const EGLint* display_attr,
|
||||
EGLint* major, EGLint* minor) {
|
||||
|
||||
EGLDisplay dpy = EGL_NO_DISPLAY;
|
||||
EGLint* major, EGLint* minor)
|
||||
{
|
||||
EGLDisplay dpy = EGL_NO_DISPLAY;
|
||||
#if defined(HAVE_DYNAMIC) && defined(HAVE_DYNAMIC_EGL)
|
||||
if (!egl_init_dll())
|
||||
return false;
|
||||
#endif
|
||||
|
||||
PFNEGLGETPLATFORMDISPLAYEXTPROC ptr_eglGetPlatformDisplayEXT =
|
||||
(PFNEGLGETPLATFORMDISPLAYEXTPROC)eglGetProcAddress("eglGetPlatformDisplayEXT");
|
||||
(PFNEGLGETPLATFORMDISPLAYEXTPROC)egl_get_proc_address("eglGetPlatformDisplayEXT");
|
||||
|
||||
if (ptr_eglGetPlatformDisplayEXT == NULL)
|
||||
if (!ptr_eglGetPlatformDisplayEXT)
|
||||
return false;
|
||||
|
||||
dpy = ptr_eglGetPlatformDisplayEXT(EGL_PLATFORM_ANGLE_ANGLE, display_data, display_attr);
|
||||
if (dpy == EGL_NO_DISPLAY) return false;
|
||||
if (dpy == EGL_NO_DISPLAY)
|
||||
return false;
|
||||
|
||||
if (!eglInitialize(dpy, major, minor)) {
|
||||
eglTerminate(egl->dpy);
|
||||
if (!egl_initialize(dpy, major, minor))
|
||||
{
|
||||
egl_terminate(egl->dpy);
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -117,60 +122,23 @@ bool angle_init_context(egl_ctx_data_t *egl,
|
||||
EGLint *count, const EGLint *attrib_ptr,
|
||||
egl_accept_config_cb_t cb)
|
||||
{
|
||||
EGLint i; int j;
|
||||
EGLConfig *configs = NULL;
|
||||
EGLint matched = 0;
|
||||
int config_index = -1;
|
||||
int j;
|
||||
bool success = false;
|
||||
|
||||
for (j = 0; backendNamesList[j] != NULL; j++) {
|
||||
for (j = 0; backendNamesList[j] != NULL; j++)
|
||||
{
|
||||
RARCH_LOG("[ANGLE] Trying %s...\n", backendNamesList[j]);
|
||||
if (angle_try_initialize(egl, display_data, backendList[j], major, minor)) {
|
||||
if (angle_try_initialize(egl, display_data, backendList[j], major, minor))
|
||||
{
|
||||
success = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!success) return false;
|
||||
if (!success)
|
||||
return false;
|
||||
|
||||
RARCH_LOG("[EGL]: EGL version: %d.%d\n", *major, *minor);
|
||||
|
||||
if (!eglGetConfigs(egl->dpy, NULL, 0, count) || *count < 1)
|
||||
{
|
||||
RARCH_ERR("[EGL]: No configs to choose from.\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
configs = (EGLConfig*)malloc(*count * sizeof(*configs));
|
||||
if (!configs)
|
||||
return false;
|
||||
|
||||
if (!eglChooseConfig(egl->dpy, attrib_ptr,
|
||||
configs, *count, &matched) || !matched)
|
||||
{
|
||||
RARCH_ERR("[EGL]: No EGL configs with appropriate attributes.\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
for (i = 0; i < *count; i++)
|
||||
{
|
||||
if (!cb || cb(display_data, egl->dpy, configs[i]))
|
||||
{
|
||||
egl->config = configs[i];
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
free(configs);
|
||||
|
||||
if (i == *count)
|
||||
{
|
||||
RARCH_ERR("[EGL]: No EGL config found which satifies requirements.\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
egl->major = g_egl_major;
|
||||
egl->minor = g_egl_minor;
|
||||
|
||||
return true;
|
||||
return egl_init_context_common(egl, count, attrib_ptr, cb, display_data);
|
||||
}
|
||||
|
@ -43,8 +43,9 @@
|
||||
|
||||
RETRO_BEGIN_DECLS
|
||||
|
||||
bool angle_init_context(egl_ctx_data_t* egl, void* display_data, EGLint* major, EGLint* minor,
|
||||
EGLint* count, const EGLint* attrib_ptr, egl_accept_config_cb_t cb);
|
||||
bool angle_init_context(egl_ctx_data_t* egl,
|
||||
void* display_data, EGLint* major, EGLint* minor,
|
||||
EGLint* count, const EGLint* attrib_ptr, egl_accept_config_cb_t cb);
|
||||
|
||||
RETRO_END_DECLS
|
||||
|
||||
|
@ -38,9 +38,149 @@ bool g_egl_inited = false;
|
||||
unsigned g_egl_major = 0;
|
||||
unsigned g_egl_minor = 0;
|
||||
|
||||
#if defined(HAVE_DYNAMIC) && defined(HAVE_DYNAMIC_EGL)
|
||||
#include <dynamic/dylib.h>
|
||||
|
||||
typedef EGLBoolean(* PFN_EGL_QUERY_SURFACE)(
|
||||
EGLDisplay dpy,
|
||||
EGLSurface surface,
|
||||
EGLint attribute,
|
||||
EGLint *value);
|
||||
typedef void *(* PFN_EGL_GET_PROC_ADDRESS)(const char *procname);
|
||||
typedef EGLSurface(*PFN_EGL_CREATE_WINDOW_SURFACE) (EGLDisplay dpy,
|
||||
EGLConfig config,
|
||||
EGLNativeWindowType win,
|
||||
const EGLint * attrib_list);
|
||||
typedef EGLContext(*PFN_EGL_CREATE_CONTEXT)(EGLDisplay dpy, EGLConfig config,
|
||||
EGLContext share_context,
|
||||
const EGLint * attrib_list);
|
||||
typedef EGLBoolean(*PFN_EGL_GET_CONFIGS) (EGLDisplay dpy, EGLConfig * configs,
|
||||
EGLint config_size, EGLint * num_config);
|
||||
typedef EGLint(*PFN_EGL_GET_ERROR) (void);
|
||||
typedef EGLDisplay(*PFN_EGL_GET_DISPLAY) (EGLNativeDisplayType display_id);
|
||||
typedef EGLBoolean(*PFN_EGL_CHOOSE_CONFIG) (EGLDisplay dpy,
|
||||
const EGLint * attrib_list,
|
||||
EGLConfig * configs,
|
||||
EGLint config_size, EGLint * num_config);
|
||||
typedef EGLBoolean(*PFN_EGL_TERMINATE)(EGLDisplay dpy);
|
||||
typedef EGLBoolean(*PFN_EGL_INITIALIZE)(EGLDisplay dpy, EGLint * major,
|
||||
EGLint * minor);
|
||||
typedef EGLBoolean(*PFN_EGL_BIND_API) (EGLenum api);
|
||||
typedef EGLBoolean(*PFN_EGL_MAKE_CURRENT) (EGLDisplay dpy, EGLSurface draw,
|
||||
EGLSurface read, EGLContext ctx);
|
||||
typedef EGLBoolean(*PFN_EGL_DESTROY_SURFACE) (EGLDisplay dpy, EGLSurface surface);
|
||||
typedef EGLBoolean(*PFN_EGL_DESTROY_CONTEXT) (EGLDisplay dpy, EGLContext ctx);
|
||||
typedef EGLContext(*PFN_EGL_GET_CURRENT_CONTEXT) (void);
|
||||
typedef const char *(*PFN_EGL_QUERY_STRING) (EGLDisplay dpy, EGLint name);
|
||||
typedef EGLBoolean(*PFN_EGL_GET_CONFIG_ATTRIB) (EGLDisplay dpy,
|
||||
EGLConfig config,
|
||||
EGLint attribute, EGLint * value);
|
||||
typedef EGLBoolean(*PFN_EGL_SWAP_BUFFERS) (EGLDisplay dpy, EGLSurface surface);
|
||||
typedef EGLBoolean(*PFN_EGL_SWAP_INTERVAL) (EGLDisplay dpy, EGLint interval);
|
||||
|
||||
static PFN_EGL_QUERY_SURFACE _egl_query_surface;
|
||||
static PFN_EGL_GET_PROC_ADDRESS _egl_get_proc_address;
|
||||
static PFN_EGL_CREATE_WINDOW_SURFACE _egl_create_window_surface;
|
||||
static PFN_EGL_CREATE_CONTEXT _egl_create_context;
|
||||
static PFN_EGL_GET_CONFIGS _egl_get_configs;
|
||||
static PFN_EGL_GET_ERROR _egl_get_error;
|
||||
static PFN_EGL_GET_DISPLAY _egl_get_display;
|
||||
static PFN_EGL_CHOOSE_CONFIG _egl_choose_config;
|
||||
static PFN_EGL_TERMINATE _egl_terminate;
|
||||
static PFN_EGL_INITIALIZE _egl_initialize;
|
||||
static PFN_EGL_BIND_API _egl_bind_api;
|
||||
static PFN_EGL_MAKE_CURRENT _egl_make_current;
|
||||
static PFN_EGL_DESTROY_SURFACE _egl_destroy_surface;
|
||||
static PFN_EGL_DESTROY_CONTEXT _egl_destroy_context;
|
||||
static PFN_EGL_GET_CURRENT_CONTEXT _egl_get_current_context;
|
||||
static PFN_EGL_QUERY_STRING _egl_query_string;
|
||||
static PFN_EGL_GET_CONFIG_ATTRIB _egl_get_config_attrib;
|
||||
static PFN_EGL_SWAP_BUFFERS _egl_swap_buffers;
|
||||
static PFN_EGL_SWAP_INTERVAL _egl_swap_interval;
|
||||
|
||||
#else
|
||||
#define _egl_query_surface(a, b, c, d) eglQuerySurface(a, b, c, d)
|
||||
#define _egl_get_proc_address(a) eglGetProcAddress(a)
|
||||
#define _egl_create_window_surface(a, b, c, d) eglCreateWindowSurface(a, b, c, d)
|
||||
#define _egl_create_context(a, b, c, d) eglCreateContext(a, b, c, d)
|
||||
#define _egl_get_configs(a, b, c, d) eglGetConfigs(a, b, c, d)
|
||||
#define _egl_get_display(a) eglGetDisplay(a)
|
||||
#define _egl_choose_config(a, b, c, d, e) eglChooseConfig(a, b, c, d, e)
|
||||
#define _egl_make_current(a, b, c, d) eglMakeCurrent(a, b, c, d)
|
||||
#define _egl_initialize(a, b, c) eglInitialize(a, b, c)
|
||||
#define _egl_destroy_surface(a, b) eglDestroySurface(a, b)
|
||||
#define _egl_destroy_context(a, b) eglDestroyContext(a, b)
|
||||
#define _egl_get_current_context() eglGetCurrentContext()
|
||||
#define _egl_get_error() eglGetError()
|
||||
#define _egl_terminate(dpy) eglTerminate(dpy)
|
||||
#define _egl_bind_api(a) eglBindAPI(a)
|
||||
#define _egl_query_string(a, b) eglQueryString(a, b)
|
||||
#define _egl_get_config_attrib(a, b, c, d) eglGetConfigAttrib(a, b, c, d)
|
||||
#define _egl_swap_buffers(a, b) eglSwapBuffers(a, b)
|
||||
#define _egl_swap_interval(a, b) eglSwapInterval(a, b)
|
||||
#endif
|
||||
|
||||
bool egl_init_dll(void)
|
||||
{
|
||||
#if defined(HAVE_DYNAMIC) && defined(HAVE_DYNAMIC_EGL)
|
||||
static dylib_t egl_dll;
|
||||
|
||||
if (!egl_dll)
|
||||
{
|
||||
egl_dll = dylib_load("libEGL.dll");
|
||||
if (egl_dll)
|
||||
{
|
||||
/* Setup function callbacks once */
|
||||
_egl_query_surface = (PFN_EGL_QUERY_SURFACE)dylib_proc(
|
||||
egl_dll, "eglQuerySurface");
|
||||
_egl_get_proc_address = (PFN_EGL_GET_PROC_ADDRESS)dylib_proc(
|
||||
egl_dll, "eglGetProcAddress");
|
||||
_egl_create_window_surface = (PFN_EGL_CREATE_WINDOW_SURFACE)dylib_proc(
|
||||
egl_dll, "eglCreateWindowSurface");
|
||||
_egl_create_context = (PFN_EGL_CREATE_CONTEXT)dylib_proc(
|
||||
egl_dll, "eglCreateContext");
|
||||
_egl_get_configs = (PFN_EGL_GET_CONFIGS)dylib_proc(
|
||||
egl_dll, "eglGetConfigs");
|
||||
_egl_get_error = (PFN_EGL_GET_ERROR)dylib_proc(
|
||||
egl_dll, "eglGetError");
|
||||
_egl_get_display = (PFN_EGL_GET_DISPLAY)dylib_proc(
|
||||
egl_dll, "eglGetDisplay");
|
||||
_egl_choose_config = (PFN_EGL_CHOOSE_CONFIG)dylib_proc(
|
||||
egl_dll, "eglChooseConfig");
|
||||
_egl_terminate = (PFN_EGL_TERMINATE)dylib_proc(
|
||||
egl_dll, "eglTerminate");
|
||||
_egl_initialize = (PFN_EGL_INITIALIZE)dylib_proc(
|
||||
egl_dll, "eglInitialize");
|
||||
_egl_bind_api = (PFN_EGL_BIND_API)dylib_proc(
|
||||
egl_dll, "eglBindAPI");
|
||||
_egl_make_current = (PFN_EGL_MAKE_CURRENT)dylib_proc(
|
||||
egl_dll, "eglMakeCurrent");
|
||||
_egl_destroy_surface = (PFN_EGL_DESTROY_SURFACE)dylib_proc(
|
||||
egl_dll, "eglDestroySurface");
|
||||
_egl_destroy_context = (PFN_EGL_DESTROY_CONTEXT)dylib_proc(
|
||||
egl_dll, "eglDestroyContext");
|
||||
_egl_get_current_context = (PFN_EGL_GET_CURRENT_CONTEXT)dylib_proc(
|
||||
egl_dll, "eglGetCurrentContext");
|
||||
_egl_query_string = (PFN_EGL_QUERY_STRING)dylib_proc(
|
||||
egl_dll, "eglQueryString");
|
||||
_egl_get_config_attrib = (PFN_EGL_GET_CONFIG_ATTRIB)dylib_proc(
|
||||
egl_dll, "eglGetConfigAttrib");
|
||||
_egl_swap_buffers = (PFN_EGL_SWAP_BUFFERS)dylib_proc(
|
||||
egl_dll, "eglSwapBuffers");
|
||||
_egl_swap_interval = (PFN_EGL_SWAP_INTERVAL)dylib_proc(
|
||||
egl_dll, "eglSwapInterval");
|
||||
}
|
||||
}
|
||||
|
||||
if (egl_dll)
|
||||
return true;
|
||||
#endif
|
||||
return false;
|
||||
}
|
||||
|
||||
void egl_report_error(void)
|
||||
{
|
||||
EGLint error = eglGetError();
|
||||
EGLint error = _egl_get_error();
|
||||
const char *str = NULL;
|
||||
switch (error)
|
||||
{
|
||||
@ -106,7 +246,28 @@ void egl_report_error(void)
|
||||
|
||||
gfx_ctx_proc_t egl_get_proc_address(const char *symbol)
|
||||
{
|
||||
return eglGetProcAddress(symbol);
|
||||
return _egl_get_proc_address(symbol);
|
||||
}
|
||||
|
||||
void egl_terminate(EGLDisplay dpy)
|
||||
{
|
||||
_egl_terminate(dpy);
|
||||
}
|
||||
|
||||
bool egl_get_config_attrib(EGLDisplay dpy, EGLConfig config, EGLint attribute,
|
||||
EGLint *value)
|
||||
{
|
||||
return _egl_get_config_attrib(dpy, config, attribute, value);
|
||||
}
|
||||
|
||||
bool egl_initialize(EGLDisplay dpy, EGLint *major, EGLint *minor)
|
||||
{
|
||||
return _egl_initialize(dpy, major, minor);
|
||||
}
|
||||
|
||||
bool egl_bind_api(EGLenum egl_api)
|
||||
{
|
||||
return _egl_bind_api(egl_api);
|
||||
}
|
||||
|
||||
void egl_destroy(egl_ctx_data_t *egl)
|
||||
@ -123,17 +284,17 @@ void egl_destroy(egl_ctx_data_t *egl)
|
||||
#endif
|
||||
#endif
|
||||
|
||||
eglMakeCurrent(egl->dpy,
|
||||
_egl_make_current(egl->dpy,
|
||||
EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
|
||||
if (egl->ctx != EGL_NO_CONTEXT)
|
||||
eglDestroyContext(egl->dpy, egl->ctx);
|
||||
_egl_destroy_context(egl->dpy, egl->ctx);
|
||||
|
||||
if (egl->hw_ctx != EGL_NO_CONTEXT)
|
||||
eglDestroyContext(egl->dpy, egl->hw_ctx);
|
||||
_egl_destroy_context(egl->dpy, egl->hw_ctx);
|
||||
|
||||
if (egl->surf != EGL_NO_SURFACE)
|
||||
eglDestroySurface(egl->dpy, egl->surf);
|
||||
eglTerminate(egl->dpy);
|
||||
_egl_destroy_surface(egl->dpy, egl->surf);
|
||||
egl_terminate(egl->dpy);
|
||||
}
|
||||
|
||||
/* Be as careful as possible in deinit.
|
||||
@ -159,7 +320,7 @@ void egl_bind_hw_render(egl_ctx_data_t *egl, bool enable)
|
||||
if (egl->surf == EGL_NO_SURFACE)
|
||||
return;
|
||||
|
||||
eglMakeCurrent(egl->dpy, egl->surf,
|
||||
_egl_make_current(egl->dpy, egl->surf,
|
||||
egl->surf,
|
||||
enable ? egl->hw_ctx : egl->ctx);
|
||||
}
|
||||
@ -171,7 +332,7 @@ void egl_swap_buffers(void *data)
|
||||
egl->dpy != EGL_NO_DISPLAY &&
|
||||
egl->surf != EGL_NO_SURFACE
|
||||
)
|
||||
eglSwapBuffers(egl->dpy, egl->surf);
|
||||
_egl_swap_buffers(egl->dpy, egl->surf);
|
||||
}
|
||||
|
||||
void egl_set_swap_interval(egl_ctx_data_t *egl, int interval)
|
||||
@ -184,11 +345,11 @@ void egl_set_swap_interval(egl_ctx_data_t *egl, int interval)
|
||||
|
||||
if (egl->dpy == EGL_NO_DISPLAY)
|
||||
return;
|
||||
if (!(eglGetCurrentContext()))
|
||||
if (!_egl_get_current_context())
|
||||
return;
|
||||
|
||||
RARCH_LOG("[EGL]: eglSwapInterval(%u)\n", interval);
|
||||
if (!eglSwapInterval(egl->dpy, interval))
|
||||
if (!_egl_swap_interval(egl->dpy, interval))
|
||||
{
|
||||
RARCH_ERR("[EGL]: eglSwapInterval() failed.\n");
|
||||
egl_report_error();
|
||||
@ -204,8 +365,8 @@ void egl_get_video_size(egl_ctx_data_t *egl, unsigned *width, unsigned *height)
|
||||
{
|
||||
EGLint gl_width, gl_height;
|
||||
|
||||
eglQuerySurface(egl->dpy, egl->surf, EGL_WIDTH, &gl_width);
|
||||
eglQuerySurface(egl->dpy, egl->surf, EGL_HEIGHT, &gl_height);
|
||||
_egl_query_surface(egl->dpy, egl->surf, EGL_WIDTH, &gl_width);
|
||||
_egl_query_surface(egl->dpy, egl->surf, EGL_HEIGHT, &gl_height);
|
||||
*width = gl_width;
|
||||
*height = gl_height;
|
||||
}
|
||||
@ -215,7 +376,7 @@ bool check_egl_version(int minMajorVersion, int minMinorVersion)
|
||||
{
|
||||
int count;
|
||||
int major, minor;
|
||||
const char *str = eglQueryString(EGL_NO_DISPLAY, EGL_VERSION);
|
||||
const char *str = _egl_query_string(EGL_NO_DISPLAY, EGL_VERSION);
|
||||
|
||||
if (!str)
|
||||
return false;
|
||||
@ -239,7 +400,7 @@ bool check_egl_version(int minMajorVersion, int minMinorVersion)
|
||||
bool check_egl_client_extension(const char *name)
|
||||
{
|
||||
size_t nameLen;
|
||||
const char *str = eglQueryString(EGL_NO_DISPLAY, EGL_EXTENSIONS);
|
||||
const char *str = _egl_query_string(EGL_NO_DISPLAY, EGL_EXTENSIONS);
|
||||
|
||||
/* The EGL implementation doesn't support client extensions at all. */
|
||||
if (!str)
|
||||
@ -277,8 +438,9 @@ static EGLDisplay get_egl_display(EGLenum platform, void *native)
|
||||
|
||||
RARCH_LOG("[EGL] Found EGL client version >= 1.5, trying eglGetPlatformDisplay\n");
|
||||
ptr_eglGetPlatformDisplay = (pfn_eglGetPlatformDisplay)
|
||||
eglGetProcAddress("eglGetPlatformDisplay");
|
||||
if (ptr_eglGetPlatformDisplay != NULL)
|
||||
egl_get_proc_address("eglGetPlatformDisplay");
|
||||
|
||||
if (ptr_eglGetPlatformDisplay)
|
||||
{
|
||||
EGLDisplay dpy = ptr_eglGetPlatformDisplay(platform, native, NULL);
|
||||
if (dpy != EGL_NO_DISPLAY)
|
||||
@ -294,8 +456,9 @@ static EGLDisplay get_egl_display(EGLenum platform, void *native)
|
||||
|
||||
RARCH_LOG("[EGL] Found EGL_EXT_platform_base, trying eglGetPlatformDisplayEXT\n");
|
||||
ptr_eglGetPlatformDisplayEXT = (PFNEGLGETPLATFORMDISPLAYEXTPROC)
|
||||
eglGetProcAddress("eglGetPlatformDisplayEXT");
|
||||
if (ptr_eglGetPlatformDisplayEXT != NULL)
|
||||
egl_get_proc_address("eglGetPlatformDisplayEXT");
|
||||
|
||||
if (ptr_eglGetPlatformDisplayEXT)
|
||||
{
|
||||
EGLDisplay dpy = ptr_eglGetPlatformDisplayEXT(platform, native, NULL);
|
||||
if (dpy != EGL_NO_DISPLAY)
|
||||
@ -309,18 +472,30 @@ static EGLDisplay get_egl_display(EGLenum platform, void *native)
|
||||
* implementation doesn't support eglGetPlatformDisplay. In this case, try
|
||||
* eglGetDisplay and hope for the best. */
|
||||
RARCH_LOG("[EGL] Falling back to eglGetDisplay\n");
|
||||
return eglGetDisplay((EGLNativeDisplayType) native);
|
||||
return _egl_get_display((EGLNativeDisplayType) native);
|
||||
}
|
||||
|
||||
bool egl_get_native_visual_id(egl_ctx_data_t *egl, EGLint *value)
|
||||
{
|
||||
if (!egl_get_config_attrib(egl->dpy, egl->config,
|
||||
EGL_NATIVE_VISUAL_ID, value))
|
||||
{
|
||||
RARCH_ERR("[EGL]: egl_get_native_visual_id failed.\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool egl_default_accept_config_cb(void *display_data, EGLDisplay dpy, EGLConfig config)
|
||||
{
|
||||
/* Makes sure we have 8 bit color. */
|
||||
EGLint r, g, b;
|
||||
if (!eglGetConfigAttrib(dpy, config, EGL_RED_SIZE, &r))
|
||||
if (!egl_get_config_attrib(dpy, config, EGL_RED_SIZE, &r))
|
||||
return false;
|
||||
if (!eglGetConfigAttrib(dpy, config, EGL_GREEN_SIZE, &g))
|
||||
if (!egl_get_config_attrib(dpy, config, EGL_GREEN_SIZE, &g))
|
||||
return false;
|
||||
if (!eglGetConfigAttrib(dpy, config, EGL_BLUE_SIZE, &b))
|
||||
if (!egl_get_config_attrib(dpy, config, EGL_BLUE_SIZE, &b))
|
||||
return false;
|
||||
|
||||
if (r != 8 || g != 8 || b != 8)
|
||||
@ -329,33 +504,19 @@ bool egl_default_accept_config_cb(void *display_data, EGLDisplay dpy, EGLConfig
|
||||
return true;
|
||||
}
|
||||
|
||||
bool egl_init_context(egl_ctx_data_t *egl,
|
||||
EGLenum platform,
|
||||
void *display_data,
|
||||
EGLint *major, EGLint *minor,
|
||||
EGLint *count, const EGLint *attrib_ptr,
|
||||
egl_accept_config_cb_t cb)
|
||||
bool egl_init_context_common(
|
||||
egl_ctx_data_t *egl, EGLint *count,
|
||||
const EGLint *attrib_ptr,
|
||||
egl_accept_config_cb_t cb,
|
||||
void *display_data)
|
||||
{
|
||||
EGLint i;
|
||||
EGLConfig *configs = NULL;
|
||||
EGLint matched = 0;
|
||||
int config_index = -1;
|
||||
EGLDisplay dpy = get_egl_display(platform, display_data);
|
||||
|
||||
if (dpy == EGL_NO_DISPLAY)
|
||||
{
|
||||
RARCH_ERR("[EGL]: Couldn't get EGL display.\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
egl->dpy = dpy;
|
||||
|
||||
if (!eglInitialize(egl->dpy, major, minor))
|
||||
EGLConfig *configs = NULL;
|
||||
if (!egl)
|
||||
return false;
|
||||
|
||||
RARCH_LOG("[EGL]: EGL version: %d.%d\n", *major, *minor);
|
||||
|
||||
if (!eglGetConfigs(egl->dpy, NULL, 0, count) || *count < 1)
|
||||
if (!_egl_get_configs(egl->dpy, NULL, 0, count) || *count < 1)
|
||||
{
|
||||
RARCH_ERR("[EGL]: No configs to choose from.\n");
|
||||
return false;
|
||||
@ -365,7 +526,7 @@ bool egl_init_context(egl_ctx_data_t *egl,
|
||||
if (!configs)
|
||||
return false;
|
||||
|
||||
if (!eglChooseConfig(egl->dpy, attrib_ptr,
|
||||
if (!_egl_choose_config(egl->dpy, attrib_ptr,
|
||||
configs, *count, &matched) || !matched)
|
||||
{
|
||||
RARCH_ERR("[EGL]: No EGL configs with appropriate attributes.\n");
|
||||
@ -395,14 +556,37 @@ bool egl_init_context(egl_ctx_data_t *egl,
|
||||
return true;
|
||||
}
|
||||
|
||||
bool egl_bind_api(EGLenum egl_api)
|
||||
|
||||
bool egl_init_context(egl_ctx_data_t *egl,
|
||||
EGLenum platform,
|
||||
void *display_data,
|
||||
EGLint *major, EGLint *minor,
|
||||
EGLint *count, const EGLint *attrib_ptr,
|
||||
egl_accept_config_cb_t cb)
|
||||
{
|
||||
return eglBindAPI(egl_api);
|
||||
int config_index = -1;
|
||||
EGLDisplay dpy = get_egl_display(platform, display_data);
|
||||
|
||||
if (dpy == EGL_NO_DISPLAY)
|
||||
{
|
||||
RARCH_ERR("[EGL]: Couldn't get EGL display.\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
egl->dpy = dpy;
|
||||
|
||||
if (!egl_initialize(egl->dpy, major, minor))
|
||||
return false;
|
||||
|
||||
RARCH_LOG("[EGL]: EGL version: %d.%d\n", *major, *minor);
|
||||
|
||||
return egl_init_context_common(egl, count, attrib_ptr, cb,
|
||||
display_data);
|
||||
}
|
||||
|
||||
bool egl_create_context(egl_ctx_data_t *egl, const EGLint *egl_attribs)
|
||||
{
|
||||
EGLContext ctx = eglCreateContext(egl->dpy, egl->config, EGL_NO_CONTEXT,
|
||||
EGLContext ctx = _egl_create_context(egl->dpy, egl->config, EGL_NO_CONTEXT,
|
||||
egl_attribs);
|
||||
|
||||
if (ctx == EGL_NO_CONTEXT)
|
||||
@ -413,7 +597,7 @@ bool egl_create_context(egl_ctx_data_t *egl, const EGLint *egl_attribs)
|
||||
|
||||
if (egl->use_hw_ctx)
|
||||
{
|
||||
egl->hw_ctx = eglCreateContext(egl->dpy, egl->config, egl->ctx,
|
||||
egl->hw_ctx = _egl_create_context(egl->dpy, egl->config, egl->ctx,
|
||||
egl_attribs);
|
||||
RARCH_LOG("[EGL]: Created shared context: %p.\n", (void*)egl->hw_ctx);
|
||||
|
||||
@ -431,28 +615,16 @@ bool egl_create_surface(egl_ctx_data_t *egl, void *native_window)
|
||||
EGL_NONE,
|
||||
};
|
||||
|
||||
egl->surf = eglCreateWindowSurface(egl->dpy, egl->config, (NativeWindowType)native_window, window_attribs);
|
||||
egl->surf = _egl_create_window_surface(egl->dpy, egl->config, (NativeWindowType)native_window, window_attribs);
|
||||
|
||||
if (egl->surf == EGL_NO_SURFACE)
|
||||
return false;
|
||||
|
||||
/* Connect the context to the surface. */
|
||||
if (!eglMakeCurrent(egl->dpy, egl->surf, egl->surf, egl->ctx))
|
||||
if (!_egl_make_current(egl->dpy, egl->surf, egl->surf, egl->ctx))
|
||||
return false;
|
||||
|
||||
RARCH_LOG("[EGL]: Current context: %p.\n", (void*)eglGetCurrentContext());
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool egl_get_native_visual_id(egl_ctx_data_t *egl, EGLint *value)
|
||||
{
|
||||
if (!eglGetConfigAttrib(egl->dpy, egl->config,
|
||||
EGL_NATIVE_VISUAL_ID, value))
|
||||
{
|
||||
RARCH_ERR("[EGL]: egl_get_native_visual_id failed.\n");
|
||||
return false;
|
||||
}
|
||||
RARCH_LOG("[EGL]: Current context: %p.\n", (void*)_egl_get_current_context());
|
||||
|
||||
return true;
|
||||
}
|
||||
|
@ -80,6 +80,8 @@ void egl_destroy(egl_ctx_data_t *egl);
|
||||
|
||||
gfx_ctx_proc_t egl_get_proc_address(const char *symbol);
|
||||
|
||||
void egl_terminate(EGLDisplay dpy);
|
||||
|
||||
void egl_bind_hw_render(egl_ctx_data_t *egl, bool enable);
|
||||
|
||||
void egl_swap_buffers(void *data);
|
||||
@ -91,6 +93,16 @@ void egl_get_video_size(egl_ctx_data_t *egl, unsigned *width, unsigned *height);
|
||||
typedef bool (*egl_accept_config_cb_t)(void *display_data, EGLDisplay dpy, EGLConfig config);
|
||||
bool egl_default_accept_config_cb(void *display_data, EGLDisplay dpy, EGLConfig config);
|
||||
|
||||
bool egl_initialize(EGLDisplay dpy, EGLint *major, EGLint *minor);
|
||||
|
||||
bool egl_init_dll(void);
|
||||
|
||||
bool egl_init_context_common(
|
||||
egl_ctx_data_t *egl, EGLint *count,
|
||||
const EGLint *attrib_ptr,
|
||||
egl_accept_config_cb_t cb,
|
||||
void *display_data);
|
||||
|
||||
bool egl_init_context(egl_ctx_data_t *egl,
|
||||
EGLenum platform,
|
||||
void *display_data,
|
||||
@ -108,6 +120,9 @@ bool egl_create_surface(egl_ctx_data_t *egl, void *native_window);
|
||||
|
||||
bool egl_get_native_visual_id(egl_ctx_data_t *egl, EGLint *value);
|
||||
|
||||
bool egl_get_config_attrib(EGLDisplay dpy, EGLConfig config,
|
||||
EGLint attribute, EGLint *value);
|
||||
|
||||
bool egl_has_config(egl_ctx_data_t *egl);
|
||||
|
||||
RETRO_END_DECLS
|
||||
|
@ -321,7 +321,7 @@
|
||||
if (osd_params)
|
||||
{
|
||||
[rce pushDebugGroup:@"video stats"];
|
||||
font_driver_render_msg(video_info, NULL, video_info->stat_text, osd_params);
|
||||
font_driver_render_msg(data, video_info, video_info->stat_text, osd_params, NULL);
|
||||
[rce popDebugGroup];
|
||||
}
|
||||
}
|
||||
@ -383,7 +383,7 @@
|
||||
[_context drawQuadX:x y:y w:width h:height r:r g:g b:b a:a];
|
||||
}
|
||||
|
||||
font_driver_render_msg(video_info, NULL, msg, NULL);
|
||||
font_driver_render_msg(NULL, video_info, msg, NULL, NULL);
|
||||
}
|
||||
|
||||
- (void)_beginFrame
|
||||
|
@ -1,59 +0,0 @@
|
||||
/* RetroArch - A frontend for libretro.
|
||||
* Copyright (C) 2010-2014 - Hans-Kristian Arntzen
|
||||
* Copyright (C) 2011-2017 - Daniel De Matteis
|
||||
* Copyright (C) 2016-2019 - Brad Parker
|
||||
*
|
||||
* 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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <stddef.h>
|
||||
#include "../video_display_server.h"
|
||||
|
||||
static void* null_display_server_init(void)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static void null_display_server_destroy(void *data)
|
||||
{
|
||||
(void)data;
|
||||
}
|
||||
|
||||
static bool null_display_server_set_window_opacity(void *data, unsigned opacity)
|
||||
{
|
||||
(void)data;
|
||||
(void)opacity;
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool null_display_server_set_window_progress(void *data, int progress, bool finished)
|
||||
{
|
||||
(void)data;
|
||||
(void)progress;
|
||||
(void)finished;
|
||||
return true;
|
||||
}
|
||||
|
||||
const video_display_server_t dispserv_null = {
|
||||
null_display_server_init,
|
||||
null_display_server_destroy,
|
||||
null_display_server_set_window_opacity,
|
||||
null_display_server_set_window_progress,
|
||||
NULL, /* set_window_decorations */
|
||||
NULL, /* set_resolution */
|
||||
NULL, /* get_resolution_list */
|
||||
NULL, /* get_output_options */
|
||||
NULL, /* set_screen_orientation */
|
||||
NULL, /* get_screen_orientation */
|
||||
NULL, /* get_flags */
|
||||
"null"
|
||||
};
|
@ -160,7 +160,7 @@ static bool caca_gfx_frame(void *data, const void *frame,
|
||||
#endif
|
||||
|
||||
if (msg)
|
||||
font_driver_render_msg(video_info, NULL, msg, NULL);
|
||||
font_driver_render_msg(data, video_info, msg, NULL, NULL);
|
||||
|
||||
if (draw)
|
||||
{
|
||||
@ -281,14 +281,6 @@ static void caca_set_texture_frame(void *data,
|
||||
memcpy(caca_menu_frame, frame, pitch * height);
|
||||
}
|
||||
|
||||
static void caca_set_osd_msg(void *data,
|
||||
video_frame_info_t *video_info,
|
||||
const char *msg,
|
||||
const void *params, void *font)
|
||||
{
|
||||
font_driver_render_msg(video_info, font, msg, (const struct font_params*)params);
|
||||
}
|
||||
|
||||
static const video_poke_interface_t caca_poke_interface = {
|
||||
NULL, /* get_flags */
|
||||
NULL,
|
||||
@ -305,7 +297,7 @@ static const video_poke_interface_t caca_poke_interface = {
|
||||
NULL,
|
||||
caca_set_texture_frame,
|
||||
NULL,
|
||||
caca_set_osd_msg,
|
||||
font_driver_render_msg,
|
||||
NULL, /* show_mouse */
|
||||
NULL, /* grab_mouse_toggle */
|
||||
NULL, /* get_current_shader */
|
||||
|
@ -861,18 +861,14 @@ static bool ctr_frame(void* data, const void* frame,
|
||||
|
||||
if (osd_params)
|
||||
{
|
||||
font_driver_render_msg(video_info, NULL, video_info->stat_text,
|
||||
(const struct font_params*)&video_info->osd_stat_params);
|
||||
font_driver_render_msg(ctr, video_info, video_info->stat_text,
|
||||
(const struct font_params*)&video_info->osd_stat_params, NULL);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
if (msg)
|
||||
font_driver_render_msg(video_info, NULL, msg, NULL);
|
||||
|
||||
#if 0
|
||||
font_driver_render_msg(video_info, NULL, "TEST: 123 ABC àüî", NULL);
|
||||
#endif
|
||||
font_driver_render_msg(ctr, video_info, msg, NULL, NULL);
|
||||
|
||||
GPU_FinishDrawing();
|
||||
GPU_Finalize();
|
||||
@ -1192,7 +1188,7 @@ static void ctr_set_osd_msg(void *data,
|
||||
ctr_video_t* ctr = (ctr_video_t*)data;
|
||||
|
||||
if (ctr && ctr->msg_rendering_enabled)
|
||||
font_driver_render_msg(video_info, font, msg, params);
|
||||
font_driver_render_msg(data, video_info, msg, params, font);
|
||||
}
|
||||
|
||||
static uint32_t ctr_get_flags(void *data)
|
||||
|
@ -1473,9 +1473,9 @@ static bool d3d10_gfx_frame(
|
||||
D3D10SetViewports(context, 1, &d3d10->viewport);
|
||||
D3D10SetBlendState(d3d10->device, d3d10->blend_enable, NULL, D3D10_DEFAULT_SAMPLE_MASK);
|
||||
D3D10SetVertexBuffer(context, 0, d3d10->sprites.vbo, sizeof(d3d10_sprite_t), 0);
|
||||
font_driver_render_msg(
|
||||
video_info, NULL, video_info->stat_text,
|
||||
(const struct font_params*)&video_info->osd_stat_params);
|
||||
font_driver_render_msg(d3d10,
|
||||
video_info, video_info->stat_text,
|
||||
(const struct font_params*)&video_info->osd_stat_params, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1512,7 +1512,7 @@ static bool d3d10_gfx_frame(
|
||||
D3D10SetViewports(d3d10->device, 1, &d3d10->viewport);
|
||||
D3D10SetBlendState(d3d10->device, d3d10->blend_enable, NULL, D3D10_DEFAULT_SAMPLE_MASK);
|
||||
D3D10SetVertexBuffer(d3d10->device, 0, d3d10->sprites.vbo, sizeof(d3d10_sprite_t), 0);
|
||||
font_driver_render_msg(video_info, NULL, msg, NULL);
|
||||
font_driver_render_msg(d3d10, video_info, msg, NULL, NULL);
|
||||
dxgi_update_title(video_info);
|
||||
}
|
||||
d3d10->sprites.enabled = false;
|
||||
@ -1639,7 +1639,7 @@ static void d3d10_gfx_set_osd_msg(
|
||||
if (d3d10)
|
||||
{
|
||||
if (d3d10->sprites.enabled)
|
||||
font_driver_render_msg(video_info, font, msg, (const struct font_params*)params);
|
||||
font_driver_render_msg(d3d10, video_info, msg, (const struct font_params*)params, font);
|
||||
else
|
||||
printf("OSD msg: %s\n", msg);
|
||||
}
|
||||
|
@ -1549,9 +1549,9 @@ static bool d3d11_gfx_frame(
|
||||
D3D11SetViewports(context, 1, &d3d11->viewport);
|
||||
D3D11SetBlendState(d3d11->context, d3d11->blend_enable, NULL, D3D11_DEFAULT_SAMPLE_MASK);
|
||||
D3D11SetVertexBuffer(context, 0, d3d11->sprites.vbo, sizeof(d3d11_sprite_t), 0);
|
||||
font_driver_render_msg(
|
||||
video_info, NULL, video_info->stat_text,
|
||||
(const struct font_params*)&video_info->osd_stat_params);
|
||||
font_driver_render_msg(d3d11,
|
||||
video_info, video_info->stat_text,
|
||||
(const struct font_params*)&video_info->osd_stat_params, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1588,7 +1588,7 @@ static bool d3d11_gfx_frame(
|
||||
D3D11SetViewports(context, 1, &d3d11->viewport);
|
||||
D3D11SetBlendState(d3d11->context, d3d11->blend_enable, NULL, D3D11_DEFAULT_SAMPLE_MASK);
|
||||
D3D11SetVertexBuffer(context, 0, d3d11->sprites.vbo, sizeof(d3d11_sprite_t), 0);
|
||||
font_driver_render_msg(video_info, NULL, msg, NULL);
|
||||
font_driver_render_msg(d3d11, video_info, msg, NULL, NULL);
|
||||
dxgi_update_title(video_info);
|
||||
}
|
||||
d3d11->sprites.enabled = false;
|
||||
@ -1718,7 +1718,7 @@ static void d3d11_gfx_set_osd_msg(
|
||||
if (d3d11)
|
||||
{
|
||||
if (d3d11->sprites.enabled)
|
||||
font_driver_render_msg(video_info, font, msg, (const struct font_params*)params);
|
||||
font_driver_render_msg(d3d11, video_info, msg, (const struct font_params*)params, font);
|
||||
else
|
||||
printf("OSD msg: %s\n", msg);
|
||||
}
|
||||
|
@ -1517,8 +1517,8 @@ static bool d3d12_gfx_frame(
|
||||
D3D12RSSetViewports(d3d12->queue.cmd, 1, &d3d12->chain.viewport);
|
||||
D3D12RSSetScissorRects(d3d12->queue.cmd, 1, &d3d12->chain.scissorRect);
|
||||
D3D12IASetVertexBuffers(d3d12->queue.cmd, 0, 1, &d3d12->sprites.vbo_view);
|
||||
font_driver_render_msg(video_info, NULL, video_info->stat_text,
|
||||
(const struct font_params*)&video_info->osd_stat_params);
|
||||
font_driver_render_msg(d3d12, video_info, video_info->stat_text,
|
||||
(const struct font_params*)&video_info->osd_stat_params, NULL);
|
||||
}
|
||||
}
|
||||
#ifdef HAVE_OVERLAY
|
||||
@ -1571,7 +1571,7 @@ static bool d3d12_gfx_frame(
|
||||
D3D12RSSetScissorRects(d3d12->queue.cmd, 1, &d3d12->chain.scissorRect);
|
||||
D3D12IASetVertexBuffers(d3d12->queue.cmd, 0, 1, &d3d12->sprites.vbo_view);
|
||||
|
||||
font_driver_render_msg(video_info, NULL, msg, NULL);
|
||||
font_driver_render_msg(d3d12, video_info, msg, NULL, NULL);
|
||||
dxgi_update_title(video_info);
|
||||
}
|
||||
d3d12->sprites.enabled = false;
|
||||
@ -1728,8 +1728,8 @@ static void d3d12_gfx_set_osd_msg(
|
||||
if (!d3d12 || !d3d12->sprites.enabled)
|
||||
return;
|
||||
|
||||
font_driver_render_msg(video_info, font, msg,
|
||||
(const struct font_params*)params);
|
||||
font_driver_render_msg(d3d12, video_info, msg,
|
||||
(const struct font_params*)params, font);
|
||||
}
|
||||
|
||||
static uintptr_t d3d12_gfx_load_texture(
|
||||
|
@ -1100,7 +1100,7 @@ static void d3d8_set_osd_msg(void *data,
|
||||
d3d8_video_t *d3d = (d3d8_video_t*)data;
|
||||
|
||||
d3d8_begin_scene(d3d->dev);
|
||||
font_driver_render_msg(video_info, font, msg, params);
|
||||
font_driver_render_msg(d3d, video_info, msg, params, font);
|
||||
d3d8_end_scene(d3d->dev);
|
||||
}
|
||||
|
||||
@ -1556,10 +1556,8 @@ static bool d3d8_frame(void *data, const void *frame,
|
||||
&video_info->osd_stat_params;
|
||||
|
||||
if (osd_params)
|
||||
{
|
||||
font_driver_render_msg(video_info, NULL, video_info->stat_text,
|
||||
(const struct font_params*)&video_info->osd_stat_params);
|
||||
}
|
||||
font_driver_render_msg(d3d, video_info, video_info->stat_text,
|
||||
(const struct font_params*)&video_info->osd_stat_params, NULL);
|
||||
}
|
||||
#endif
|
||||
|
||||
@ -1576,7 +1574,7 @@ static bool d3d8_frame(void *data, const void *frame,
|
||||
{
|
||||
d3d8_set_viewports(d3d->dev, &screen_vp);
|
||||
d3d8_begin_scene(d3d->dev);
|
||||
font_driver_render_msg(video_info, NULL, msg, NULL);
|
||||
font_driver_render_msg(d3d, video_info, msg, NULL, NULL);
|
||||
d3d8_end_scene(d3d->dev);
|
||||
}
|
||||
|
||||
|
@ -1121,8 +1121,8 @@ static void d3d9_set_osd_msg(void *data,
|
||||
|
||||
d3d9_set_font_rect(d3d, d3d_font_params);
|
||||
d3d9_begin_scene(dev);
|
||||
font_driver_render_msg(video_info, font,
|
||||
msg, d3d_font_params);
|
||||
font_driver_render_msg(d3d, video_info,
|
||||
msg, d3d_font_params, font);
|
||||
d3d9_end_scene(dev);
|
||||
}
|
||||
|
||||
@ -1617,8 +1617,8 @@ static bool d3d9_frame(void *data, const void *frame,
|
||||
{
|
||||
d3d9_set_viewports(d3d->dev, &screen_vp);
|
||||
d3d9_begin_scene(d3d->dev);
|
||||
font_driver_render_msg(video_info, NULL, video_info->stat_text,
|
||||
(const struct font_params*)&video_info->osd_stat_params);
|
||||
font_driver_render_msg(d3d, video_info, video_info->stat_text,
|
||||
(const struct font_params*)&video_info->osd_stat_params, NULL);
|
||||
d3d9_end_scene(d3d->dev);
|
||||
}
|
||||
}
|
||||
@ -1644,7 +1644,7 @@ static bool d3d9_frame(void *data, const void *frame,
|
||||
{
|
||||
d3d9_set_viewports(d3d->dev, &screen_vp);
|
||||
d3d9_begin_scene(d3d->dev);
|
||||
font_driver_render_msg(video_info, NULL, msg, NULL);
|
||||
font_driver_render_msg(d3d, video_info, msg, NULL, NULL);
|
||||
d3d9_end_scene(d3d->dev);
|
||||
}
|
||||
|
||||
|
@ -1329,10 +1329,8 @@ static bool exynos_gfx_frame(void *data, const void *frame, unsigned width,
|
||||
(struct font_params*)&video_info->osd_stat_params : NULL;
|
||||
|
||||
if (osd_params)
|
||||
{
|
||||
font_driver_render_msg(video_info, NULL, video_info->stat_text,
|
||||
(const struct font_params*)&video_info->osd_stat_params);
|
||||
}
|
||||
font_driver_render_msg(vid, video_info, video_info->stat_text,
|
||||
(const struct font_params*)&video_info->osd_stat_params, NULL);
|
||||
}
|
||||
|
||||
if (msg)
|
||||
|
@ -335,7 +335,7 @@ static bool fpga_gfx_frame(void *data, const void *frame,
|
||||
}
|
||||
|
||||
if (msg)
|
||||
font_driver_render_msg(video_info, NULL, msg, NULL);
|
||||
font_driver_render_msg(fpga, video_info, msg, NULL, NULL);
|
||||
|
||||
return true;
|
||||
}
|
||||
@ -479,7 +479,7 @@ static void fpga_set_osd_msg(void *data,
|
||||
const char *msg,
|
||||
const void *params, void *font)
|
||||
{
|
||||
font_driver_render_msg(video_info, font, msg, params);
|
||||
font_driver_render_msg(data, video_info, msg, params, font);
|
||||
}
|
||||
|
||||
static void fpga_get_video_output_size(void *data,
|
||||
|
@ -358,7 +358,7 @@ static bool gdi_gfx_frame(void *data, const void *frame,
|
||||
free(info);
|
||||
|
||||
if (msg)
|
||||
font_driver_render_msg(video_info, NULL, msg, NULL);
|
||||
font_driver_render_msg(gdi, video_info, msg, NULL, NULL);
|
||||
|
||||
InvalidateRect(hwnd, NULL, false);
|
||||
|
||||
@ -511,15 +511,6 @@ static void gdi_set_texture_frame(void *data,
|
||||
}
|
||||
}
|
||||
|
||||
static void gdi_set_osd_msg(void *data,
|
||||
video_frame_info_t *video_info,
|
||||
const char *msg,
|
||||
const void *params, void *font)
|
||||
{
|
||||
font_driver_render_msg(video_info, font,
|
||||
msg, (const struct font_params *)params);
|
||||
}
|
||||
|
||||
static void gdi_get_video_output_size(void *data,
|
||||
unsigned *width, unsigned *height)
|
||||
{
|
||||
@ -628,7 +619,7 @@ static const video_poke_interface_t gdi_poke_interface = {
|
||||
NULL,
|
||||
gdi_set_texture_frame,
|
||||
NULL,
|
||||
gdi_set_osd_msg,
|
||||
font_driver_render_msg,
|
||||
NULL,
|
||||
NULL, /* grab_mouse_toggle */
|
||||
NULL, /* get_current_shader */
|
||||
|
@ -2407,14 +2407,6 @@ static void gl2_render_osd_background(
|
||||
video_info->height, false, true);
|
||||
}
|
||||
|
||||
static void gl2_set_osd_msg(void *data,
|
||||
video_frame_info_t *video_info,
|
||||
const char *msg,
|
||||
const void *params, void *font)
|
||||
{
|
||||
font_driver_render_msg(video_info, font, msg, (const struct font_params*)params);
|
||||
}
|
||||
|
||||
static void gl2_show_mouse(void *data, bool state)
|
||||
{
|
||||
gl_t *gl = (gl_t*)data;
|
||||
@ -3058,8 +3050,8 @@ static bool gl2_frame(void *data, const void *frame,
|
||||
&video_info->osd_stat_params;
|
||||
|
||||
if (osd_params)
|
||||
font_driver_render_msg(video_info, NULL, video_info->stat_text,
|
||||
(const struct font_params*)&video_info->osd_stat_params);
|
||||
font_driver_render_msg(gl, video_info, video_info->stat_text,
|
||||
(const struct font_params*)&video_info->osd_stat_params, NULL);
|
||||
}
|
||||
#endif
|
||||
|
||||
@ -3077,7 +3069,7 @@ static bool gl2_frame(void *data, const void *frame,
|
||||
{
|
||||
if (video_info->msg_bgcolor_enable)
|
||||
gl2_render_osd_background(gl, video_info, msg);
|
||||
font_driver_render_msg(video_info, NULL, msg, NULL);
|
||||
font_driver_render_msg(gl, video_info, msg, NULL, NULL);
|
||||
}
|
||||
|
||||
if (video_info->cb_update_window_title)
|
||||
@ -3637,7 +3629,10 @@ static void *gl2_init(const video_info_t *video,
|
||||
RARCH_LOG("[GL]: Found GL context: %s\n", ctx_driver->ident);
|
||||
|
||||
video_context_driver_get_video_size(&mode);
|
||||
|
||||
#if defined(DINGUX)
|
||||
mode.width = 320;
|
||||
mode.height = 240;
|
||||
#endif
|
||||
full_x = mode.width;
|
||||
full_y = mode.height;
|
||||
mode.width = 0;
|
||||
@ -3782,6 +3777,10 @@ static void *gl2_init(const video_info_t *video,
|
||||
|
||||
video_context_driver_get_video_size(&mode);
|
||||
|
||||
#if defined(DINGUX)
|
||||
mode.width = 320;
|
||||
mode.height = 240;
|
||||
#endif
|
||||
temp_width = mode.width;
|
||||
temp_height = mode.height;
|
||||
mode.width = 0;
|
||||
@ -4509,7 +4508,7 @@ static const video_poke_interface_t gl2_poke_interface = {
|
||||
gl2_apply_state_changes,
|
||||
gl2_set_texture_frame,
|
||||
gl2_set_texture_enable,
|
||||
gl2_set_osd_msg,
|
||||
font_driver_render_msg,
|
||||
gl2_show_mouse,
|
||||
NULL,
|
||||
gl2_get_current_shader,
|
||||
|
@ -858,13 +858,13 @@ static bool gl1_gfx_frame(void *data, const void *frame,
|
||||
|
||||
if (osd_params)
|
||||
{
|
||||
font_driver_render_msg(video_info, NULL, video_info->stat_text,
|
||||
(const struct font_params*)&video_info->osd_stat_params);
|
||||
font_driver_render_msg(gl1, video_info, video_info->stat_text,
|
||||
(const struct font_params*)&video_info->osd_stat_params, NULL);
|
||||
#if 0
|
||||
osd_params->y = 0.350f;
|
||||
osd_params->scale = 0.75f;
|
||||
font_driver_render_msg(video_info, NULL, video_info->chat_text,
|
||||
(const struct font_params*)&video_info->osd_stat_params);
|
||||
font_driver_render_msg(gl1, video_info, video_info->chat_text,
|
||||
(const struct font_params*)&video_info->osd_stat_params, NULL);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
@ -881,7 +881,7 @@ static bool gl1_gfx_frame(void *data, const void *frame,
|
||||
#endif
|
||||
|
||||
if (msg)
|
||||
font_driver_render_msg(video_info, NULL, msg, NULL);
|
||||
font_driver_render_msg(gl1, video_info, msg, NULL, NULL);
|
||||
|
||||
video_info->cb_update_window_title(
|
||||
video_info->context_data, video_info);
|
||||
@ -1174,15 +1174,6 @@ static void gl1_set_texture_frame(void *data,
|
||||
gl1_context_bind_hw_render(gl1, true);
|
||||
}
|
||||
|
||||
static void gl1_set_osd_msg(void *data,
|
||||
video_frame_info_t *video_info,
|
||||
const char *msg,
|
||||
const void *params, void *font)
|
||||
{
|
||||
font_driver_render_msg(video_info, font,
|
||||
msg, (const struct font_params *)params);
|
||||
}
|
||||
|
||||
static void gl1_get_video_output_size(void *data,
|
||||
unsigned *width, unsigned *height)
|
||||
{
|
||||
@ -1383,7 +1374,7 @@ static const video_poke_interface_t gl1_poke_interface = {
|
||||
NULL,
|
||||
gl1_set_texture_frame,
|
||||
gl1_set_texture_enable,
|
||||
gl1_set_osd_msg,
|
||||
font_driver_render_msg,
|
||||
NULL,
|
||||
NULL, /* grab_mouse_toggle */
|
||||
NULL, /* get_current_shader */
|
||||
|
@ -1708,8 +1708,8 @@ static bool gl_core_frame(void *data, const void *frame,
|
||||
&video_info->osd_stat_params;
|
||||
|
||||
if (osd_params)
|
||||
font_driver_render_msg(video_info, NULL, video_info->stat_text,
|
||||
(const struct font_params*)&video_info->osd_stat_params);
|
||||
font_driver_render_msg(gl, video_info, video_info->stat_text,
|
||||
(const struct font_params*)&video_info->osd_stat_params, NULL);
|
||||
}
|
||||
#endif
|
||||
|
||||
@ -1729,7 +1729,7 @@ static bool gl_core_frame(void *data, const void *frame,
|
||||
if (video_info->msg_bgcolor_enable)
|
||||
gl_core_render_osd_background(gl, video_info, msg);
|
||||
#endif
|
||||
font_driver_render_msg(video_info, NULL, msg, NULL);
|
||||
font_driver_render_msg(gl, video_info, msg, NULL, NULL);
|
||||
}
|
||||
|
||||
video_info->cb_update_window_title(
|
||||
@ -1903,14 +1903,6 @@ static void gl_core_show_mouse(void *data, bool state)
|
||||
gl->ctx_driver->show_mouse(gl->ctx_data, state);
|
||||
}
|
||||
|
||||
static void gl_core_set_osd_msg(void *data,
|
||||
video_frame_info_t *video_info,
|
||||
const char *msg,
|
||||
const void *params, void *font)
|
||||
{
|
||||
font_driver_render_msg(video_info, font, msg, (const struct font_params *)params);
|
||||
}
|
||||
|
||||
static void gl_core_set_texture_frame(void *data,
|
||||
const void *frame, bool rgb32, unsigned width, unsigned height,
|
||||
float alpha)
|
||||
@ -2016,7 +2008,7 @@ static const video_poke_interface_t gl_core_poke_interface = {
|
||||
gl_core_apply_state_changes,
|
||||
gl_core_set_texture_frame,
|
||||
gl_core_set_texture_enable,
|
||||
gl_core_set_osd_msg,
|
||||
font_driver_render_msg,
|
||||
gl_core_show_mouse,
|
||||
NULL, /* grab_mouse_toggle */
|
||||
gl_core_get_current_shader,
|
||||
|
@ -1338,10 +1338,8 @@ static bool wiiu_gfx_frame(void *data, const void *frame,
|
||||
&video_info->osd_stat_params;
|
||||
|
||||
if (osd_params)
|
||||
{
|
||||
font_driver_render_msg(video_info, NULL, video_info->stat_text,
|
||||
(const struct font_params*)&video_info->osd_stat_params);
|
||||
}
|
||||
font_driver_render_msg(wiiu, video_info, video_info->stat_text,
|
||||
(const struct font_params*)&video_info->osd_stat_params, NULL);
|
||||
}
|
||||
|
||||
#ifdef HAVE_MENU
|
||||
@ -1352,7 +1350,7 @@ static bool wiiu_gfx_frame(void *data, const void *frame,
|
||||
#endif
|
||||
|
||||
if (msg)
|
||||
font_driver_render_msg(video_info, NULL, msg, NULL);
|
||||
font_driver_render_msg(wiiu, video_info, msg, NULL, NULL);
|
||||
|
||||
wiiu->render_msg_enabled = false;
|
||||
|
||||
@ -1683,7 +1681,7 @@ static void wiiu_gfx_set_osd_msg(void *data,
|
||||
if (wiiu)
|
||||
{
|
||||
if (wiiu->render_msg_enabled)
|
||||
font_driver_render_msg(video_info, font, msg, params);
|
||||
font_driver_render_msg(wiiu, video_info, msg, params, font);
|
||||
else
|
||||
printf("OSD msg: %s\n", msg);
|
||||
}
|
||||
|
@ -281,14 +281,6 @@ static void metal_set_texture_enable(void *data, bool state, bool full_screen)
|
||||
#endif
|
||||
}
|
||||
|
||||
static void metal_set_osd_msg(void *data,
|
||||
video_frame_info_t *video_info,
|
||||
const char *msg,
|
||||
const void *params, void *font)
|
||||
{
|
||||
font_driver_render_msg(video_info, font, msg, (const struct font_params *)params);
|
||||
}
|
||||
|
||||
static void metal_show_mouse(void *data, bool state)
|
||||
{
|
||||
[apple_platform setCursorVisible:state];
|
||||
@ -330,7 +322,7 @@ static const video_poke_interface_t metal_poke_interface = {
|
||||
.apply_state_changes = metal_apply_state_changes,
|
||||
.set_texture_frame = metal_set_texture_frame,
|
||||
.set_texture_enable = metal_set_texture_enable,
|
||||
.set_osd_msg = metal_set_osd_msg,
|
||||
.set_osd_msg = font_driver_render_msg,
|
||||
.show_mouse = metal_show_mouse,
|
||||
.get_current_shader = metal_get_current_shader,
|
||||
};
|
||||
|
@ -320,7 +320,7 @@ static bool network_gfx_frame(void *data, const void *frame,
|
||||
}
|
||||
|
||||
if (msg)
|
||||
font_driver_render_msg(video_info, NULL, msg, NULL);
|
||||
font_driver_render_msg(network, video_info, msg, NULL, NULL);
|
||||
|
||||
return true;
|
||||
}
|
||||
@ -443,14 +443,6 @@ static void network_set_texture_frame(void *data,
|
||||
}
|
||||
}
|
||||
|
||||
static void network_set_osd_msg(void *data,
|
||||
video_frame_info_t *video_info,
|
||||
const char *msg,
|
||||
const void *params, void *font)
|
||||
{
|
||||
font_driver_render_msg(video_info, font, msg, (const struct font_params*)params);
|
||||
}
|
||||
|
||||
static void network_get_video_output_size(void *data,
|
||||
unsigned *width, unsigned *height)
|
||||
{
|
||||
@ -499,7 +491,7 @@ static const video_poke_interface_t network_poke_interface = {
|
||||
#if defined(HAVE_MENU)
|
||||
network_set_texture_frame,
|
||||
NULL,
|
||||
network_set_osd_msg,
|
||||
font_driver_render_msg,
|
||||
NULL,
|
||||
#else
|
||||
NULL,
|
||||
|
@ -1,146 +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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "../../driver.h"
|
||||
#include "../../retroarch.h"
|
||||
#include "../../verbosity.h"
|
||||
|
||||
static void *null_gfx_init(const video_info_t *video,
|
||||
input_driver_t **input, void **input_data)
|
||||
{
|
||||
RARCH_ERR("Using the null video driver. RetroArch will not be visible.");
|
||||
|
||||
*input = NULL;
|
||||
*input_data = NULL;
|
||||
(void)video;
|
||||
|
||||
return (void*)-1;
|
||||
}
|
||||
|
||||
static bool null_gfx_frame(void *data, const void *frame,
|
||||
unsigned width, unsigned height, uint64_t frame_count,
|
||||
unsigned pitch, const char *msg, video_frame_info_t *video_info)
|
||||
{
|
||||
(void)data;
|
||||
(void)frame;
|
||||
(void)width;
|
||||
(void)height;
|
||||
(void)pitch;
|
||||
(void)msg;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static void null_gfx_set_nonblock_state(void *data, bool toggle)
|
||||
{
|
||||
(void)data;
|
||||
(void)toggle;
|
||||
}
|
||||
|
||||
static bool null_gfx_alive(void *data)
|
||||
{
|
||||
(void)data;
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool null_gfx_focus(void *data)
|
||||
{
|
||||
(void)data;
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool null_gfx_suppress_screensaver(void *data, bool enable)
|
||||
{
|
||||
(void)data;
|
||||
(void)enable;
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool null_gfx_has_windowed(void *data)
|
||||
{
|
||||
(void)data;
|
||||
return true;
|
||||
}
|
||||
|
||||
static void null_gfx_free(void *data)
|
||||
{
|
||||
(void)data;
|
||||
}
|
||||
|
||||
static bool null_gfx_set_shader(void *data,
|
||||
enum rarch_shader_type type, const char *path)
|
||||
{
|
||||
(void)data;
|
||||
(void)type;
|
||||
(void)path;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
static void null_gfx_set_rotation(void *data,
|
||||
unsigned rotation)
|
||||
{
|
||||
(void)data;
|
||||
(void)rotation;
|
||||
}
|
||||
|
||||
static void null_gfx_viewport_info(void *data,
|
||||
struct video_viewport *vp)
|
||||
{
|
||||
(void)data;
|
||||
(void)vp;
|
||||
}
|
||||
|
||||
static bool null_gfx_read_viewport(void *data, uint8_t *buffer, bool is_idle)
|
||||
{
|
||||
(void)data;
|
||||
(void)buffer;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static void null_gfx_get_poke_interface(void *data,
|
||||
const video_poke_interface_t **iface)
|
||||
{
|
||||
(void)data;
|
||||
(void)iface;
|
||||
}
|
||||
|
||||
video_driver_t video_null = {
|
||||
null_gfx_init,
|
||||
null_gfx_frame,
|
||||
null_gfx_set_nonblock_state,
|
||||
null_gfx_alive,
|
||||
null_gfx_focus,
|
||||
null_gfx_suppress_screensaver,
|
||||
null_gfx_has_windowed,
|
||||
null_gfx_set_shader,
|
||||
null_gfx_free,
|
||||
"null",
|
||||
NULL, /* set_viewport */
|
||||
null_gfx_set_rotation,
|
||||
null_gfx_viewport_info,
|
||||
null_gfx_read_viewport,
|
||||
NULL, /* read_frame_raw */
|
||||
|
||||
#ifdef HAVE_OVERLAY
|
||||
NULL, /* overlay_interface */
|
||||
#endif
|
||||
#ifdef HAVE_VIDEO_LAYOUT
|
||||
NULL,
|
||||
#endif
|
||||
null_gfx_get_poke_interface,
|
||||
};
|
@ -303,19 +303,19 @@ static bool ps2_gfx_frame(void *data, const void *frame,
|
||||
gsKit_texture_upload(ps2->gsGlobal, ps2->menuTexture);
|
||||
prim_texture(ps2->gsGlobal, ps2->menuTexture, 2, ps2->fullscreen, empty_ps2_insets);
|
||||
}
|
||||
} else if (video_info->statistics_show) {
|
||||
}
|
||||
else if (video_info->statistics_show)
|
||||
{
|
||||
struct font_params *osd_params = (struct font_params*)
|
||||
&video_info->osd_stat_params;
|
||||
|
||||
if (osd_params) {
|
||||
font_driver_render_msg(video_info, NULL, video_info->stat_text,
|
||||
(const struct font_params*)&video_info->osd_stat_params);
|
||||
}
|
||||
if (osd_params)
|
||||
font_driver_render_msg(ps2, video_info, video_info->stat_text,
|
||||
(const struct font_params*)&video_info->osd_stat_params, NULL);
|
||||
}
|
||||
|
||||
if(!string_is_empty(msg)) {
|
||||
font_driver_render_msg(video_info, NULL, msg, NULL);
|
||||
}
|
||||
if(!string_is_empty(msg))
|
||||
font_driver_render_msg(ps2, video_info, msg, NULL, NULL);
|
||||
|
||||
refreshScreen(ps2);
|
||||
|
||||
@ -418,14 +418,6 @@ static void ps2_set_texture_enable(void *data, bool enable, bool fullscreen)
|
||||
ps2->fullscreen = fullscreen;
|
||||
}
|
||||
|
||||
static void ps2_set_osd_msg(void *data,
|
||||
video_frame_info_t *video_info,
|
||||
const char *msg,
|
||||
const void *params, void *font)
|
||||
{
|
||||
font_driver_render_msg(video_info, font, msg, params);
|
||||
}
|
||||
|
||||
static bool ps2_get_hw_render_interface(void* data,
|
||||
const struct retro_hw_render_interface** iface)
|
||||
{
|
||||
@ -453,7 +445,7 @@ static const video_poke_interface_t ps2_poke_interface = {
|
||||
NULL, /* apply_state_changes */
|
||||
ps2_set_texture_frame,
|
||||
ps2_set_texture_enable,
|
||||
ps2_set_osd_msg, /* set_osd_msg */
|
||||
font_driver_render_msg, /* set_osd_msg */
|
||||
NULL, /* show_mouse */
|
||||
NULL, /* grab_mouse_toggle */
|
||||
NULL, /* get_current_shader */
|
||||
|
359
gfx/drivers/sdl_dingux_gfx.c
Normal file
359
gfx/drivers/sdl_dingux_gfx.c
Normal file
@ -0,0 +1,359 @@
|
||||
/* RetroArch - A frontend for libretro.
|
||||
* Copyright (C) 2010-2014 - Hans-Kristian Arntzen
|
||||
* Copyright (C) 2011-2017 - Daniel De Matteis
|
||||
* Copyright (C) 2011-2017 - Higor Euripedes
|
||||
*
|
||||
* 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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <retro_assert.h>
|
||||
#include <gfx/video_frame.h>
|
||||
#include <retro_assert.h>
|
||||
#include "../../verbosity.h"
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../../config.h"
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_MENU
|
||||
#include "../../menu/menu_driver.h"
|
||||
#endif
|
||||
|
||||
#include <SDL/SDL.h>
|
||||
#include <SDL/SDL_video.h>
|
||||
|
||||
#include "../../configuration.h"
|
||||
#include "../../retroarch.h"
|
||||
|
||||
#define likely(x) __builtin_expect(!!(x), 1)
|
||||
#define unlikely(x) __builtin_expect(!!(x), 0)
|
||||
|
||||
#define VERBOSE 0
|
||||
|
||||
typedef struct sdl_dingux_video
|
||||
{
|
||||
SDL_Surface *screen;
|
||||
bool rgb;
|
||||
bool menu_active;
|
||||
bool was_in_menu;
|
||||
bool quitting;
|
||||
char menu_frame[320*240*32];
|
||||
|
||||
} sdl_dingux_video_t;
|
||||
|
||||
static void sdl_dingux_gfx_free(void *data)
|
||||
{
|
||||
sdl_dingux_video_t *vid = (sdl_dingux_video_t*)data;
|
||||
if (!vid)
|
||||
return;
|
||||
|
||||
SDL_QuitSubSystem(SDL_INIT_VIDEO);
|
||||
|
||||
free(vid);
|
||||
}
|
||||
|
||||
static void *sdl_dingux_gfx_init(const video_info_t *video,
|
||||
input_driver_t **input, void **input_data)
|
||||
{
|
||||
sdl_dingux_video_t *vid = NULL;
|
||||
settings_t *settings = config_get_ptr();
|
||||
|
||||
FILE* f = fopen("/sys/devices/platform/jz-lcd.0/allow_downscaling", "w");
|
||||
if (f) {
|
||||
fprintf(f, "%d", 1);
|
||||
fclose(f);
|
||||
}
|
||||
|
||||
if (SDL_WasInit(0) == 0)
|
||||
{
|
||||
if (SDL_Init(SDL_INIT_VIDEO) < 0)
|
||||
return NULL;
|
||||
}
|
||||
else if (SDL_InitSubSystem(SDL_INIT_VIDEO) < 0)
|
||||
return NULL;
|
||||
|
||||
vid = (sdl_dingux_video_t*)calloc(1, sizeof(*vid));
|
||||
if (!vid)
|
||||
return NULL;
|
||||
|
||||
#ifdef VERBOSE
|
||||
printf("sdl_dingux_gfx_init video %dx%d rgb32 %d smooth %d input_scale %u force_aspect %d fullscreen %d\n",
|
||||
video->width, video->height, video->rgb32, video->smooth, video->input_scale, video->force_aspect, video->fullscreen);
|
||||
#endif
|
||||
|
||||
vid->screen = SDL_SetVideoMode(320, 240, video->rgb32 ? 32 : 16, SDL_HWSURFACE | SDL_TRIPLEBUF | SDL_FULLSCREEN);
|
||||
if (!vid->screen)
|
||||
{
|
||||
RARCH_ERR("[SDL1]: Failed to init SDL surface: %s\n", SDL_GetError());
|
||||
goto error;
|
||||
}
|
||||
|
||||
vid->rgb = video->rgb32;
|
||||
vid->menu_active = false;
|
||||
vid->was_in_menu = false;
|
||||
|
||||
SDL_ShowCursor(SDL_DISABLE);
|
||||
|
||||
if (input && input_data)
|
||||
{
|
||||
void *sdl_input = input_sdl.init(settings->arrays.input_joypad_driver);
|
||||
|
||||
if (sdl_input)
|
||||
{
|
||||
*input = &input_sdl;
|
||||
*input_data = sdl_input;
|
||||
}
|
||||
else
|
||||
{
|
||||
*input = NULL;
|
||||
*input_data = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
return vid;
|
||||
|
||||
error:
|
||||
sdl_dingux_gfx_free(vid);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static void clear_screen(void* data)
|
||||
{
|
||||
sdl_dingux_video_t* vid = (sdl_dingux_video_t*)data;
|
||||
SDL_FillRect(vid->screen, 0, 0);
|
||||
SDL_Flip(vid->screen);
|
||||
SDL_FillRect(vid->screen, 0, 0);
|
||||
SDL_Flip(vid->screen);
|
||||
SDL_FillRect(vid->screen, 0, 0);
|
||||
SDL_Flip(vid->screen);
|
||||
}
|
||||
|
||||
static void set_output(sdl_dingux_video_t* vid, int width, int height, int pitch, bool rgb)
|
||||
{
|
||||
#ifdef VERBOSE
|
||||
printf("set_output current w %d h %d pitch %d new_w %d new_h %d pitch %d rgb %d\n",
|
||||
vid->screen->w, vid->screen->h, vid->screen->pitch, width, height, pitch, (int)vid->rgb);
|
||||
#endif
|
||||
|
||||
vid->screen = SDL_SetVideoMode(width, height, rgb ? 32 : 16, SDL_HWSURFACE | SDL_TRIPLEBUF | SDL_FULLSCREEN);
|
||||
if (!vid->screen)
|
||||
RARCH_ERR("[SDL1]: Failed to init SDL surface: %s\n", SDL_GetError());
|
||||
}
|
||||
|
||||
static void blit(uint32_t* d, uint32_t* s, int width, int height, int pitch)
|
||||
{
|
||||
int skip = pitch/4 - width;
|
||||
for (int i = 0; i < height; i++)
|
||||
{
|
||||
for (int j = 0; j < width; j++)
|
||||
*(d++) = *(s++);
|
||||
s += skip;
|
||||
}
|
||||
}
|
||||
|
||||
static bool sdl_dingux_gfx_frame(void *data, const void *frame, unsigned width,
|
||||
unsigned height, uint64_t frame_count,
|
||||
unsigned pitch, const char *msg, video_frame_info_t *video_info)
|
||||
{
|
||||
// printf("sdl_gfx_frame width %d height %d pitch %d frame_count %lu\n", width, height, pitch, frame_count);
|
||||
sdl_dingux_video_t* vid = (sdl_dingux_video_t*)data;
|
||||
|
||||
if (unlikely(!frame))
|
||||
return true;
|
||||
|
||||
if (unlikely((vid->screen->w != width || vid->screen->h != height) && !vid->menu_active))
|
||||
{
|
||||
set_output(vid, width, height, pitch, vid->rgb);
|
||||
}
|
||||
|
||||
menu_driver_frame(video_info);
|
||||
|
||||
if (likely(!vid->menu_active))
|
||||
{
|
||||
blit((uint32_t*)vid->screen->pixels, (uint32_t*)frame, vid->rgb ? width : width/2, height, pitch);
|
||||
if (unlikely(vid->was_in_menu))
|
||||
vid->was_in_menu = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!vid->was_in_menu)
|
||||
{
|
||||
set_output(vid, 320, 240, 320*2, false);
|
||||
vid->was_in_menu = true;
|
||||
}
|
||||
memcpy(vid->screen->pixels, vid->menu_frame, 320*240*2);
|
||||
}
|
||||
|
||||
SDL_Flip(vid->screen);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static void sdl_dingux_set_texture_enable(void *data, bool state, bool full_screen)
|
||||
{
|
||||
sdl_dingux_video_t *vid = (sdl_dingux_video_t*)data;
|
||||
(void)full_screen;
|
||||
|
||||
if (vid->menu_active != state)
|
||||
{
|
||||
vid->menu_active = state;
|
||||
}
|
||||
}
|
||||
|
||||
static void sdl_dingux_set_texture_frame(void *data, const void *frame, bool rgb32,
|
||||
unsigned width, unsigned height, float alpha)
|
||||
{
|
||||
sdl_dingux_video_t *vid = (sdl_dingux_video_t*)data;
|
||||
|
||||
int len = width * height * 2;
|
||||
memcpy(vid->menu_frame, frame, len);
|
||||
}
|
||||
|
||||
|
||||
static void sdl_dingux_gfx_set_nonblock_state(void *data, bool state)
|
||||
{
|
||||
(void)data; /* Can SDL even do this? */
|
||||
(void)state;
|
||||
}
|
||||
|
||||
static void sdl_dingux_gfx_check_window(sdl_dingux_video_t *vid)
|
||||
{
|
||||
SDL_Event event;
|
||||
|
||||
SDL_PumpEvents();
|
||||
while (SDL_PeepEvents(&event, 1, SDL_GETEVENT, SDL_QUITMASK))
|
||||
{
|
||||
if (event.type != SDL_QUIT)
|
||||
continue;
|
||||
|
||||
vid->quitting = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static bool sdl_dingux_gfx_alive(void *data)
|
||||
{
|
||||
sdl_dingux_video_t *vid = (sdl_dingux_video_t*)data;
|
||||
sdl_dingux_gfx_check_window(vid);
|
||||
return !vid->quitting;
|
||||
}
|
||||
|
||||
static bool sdl_dingux_gfx_focus(void *data)
|
||||
{
|
||||
(void)data;
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool sdl_dingux_gfx_suppress_screensaver(void *data, bool enable)
|
||||
{
|
||||
(void)data;
|
||||
(void)enable;
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool sdl_dingux_gfx_has_windowed(void *data)
|
||||
{
|
||||
(void)data;
|
||||
return false;
|
||||
}
|
||||
|
||||
static void sdl_dingux_gfx_viewport_info(void *data, struct video_viewport *vp)
|
||||
{
|
||||
sdl_dingux_video_t *vid = (sdl_dingux_video_t*)data;
|
||||
vp->x = 0;
|
||||
vp->y = 0;
|
||||
vp->width = vp->full_width = vid->screen->w;
|
||||
vp->height = vp->full_height = vid->screen->h;
|
||||
}
|
||||
|
||||
static void sdl_dingux_set_filtering(void *data, unsigned index, bool smooth)
|
||||
{
|
||||
(void)data;
|
||||
}
|
||||
|
||||
static void sdl_dingux_apply_state_changes(void *data)
|
||||
{
|
||||
(void)data;
|
||||
}
|
||||
|
||||
static uint32_t sdl_dingux_get_flags(void *data)
|
||||
{
|
||||
(void)data;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const video_poke_interface_t sdl_dingux_poke_interface = {
|
||||
sdl_dingux_get_flags,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL, /* get_refresh_rate */
|
||||
sdl_dingux_set_filtering,
|
||||
NULL, /* get_video_output_size */
|
||||
NULL, /* get_video_output_prev */
|
||||
NULL, /* get_video_output_next */
|
||||
NULL, /* get_current_framebuffer */
|
||||
NULL, /* get_proc_address */
|
||||
NULL,
|
||||
sdl_dingux_apply_state_changes,
|
||||
sdl_dingux_set_texture_frame,
|
||||
sdl_dingux_set_texture_enable,
|
||||
NULL,
|
||||
NULL,//sdl_show_mouse,
|
||||
NULL,//sdl_grab_mouse_toggle,
|
||||
NULL, /* get_current_shader */
|
||||
NULL, /* get_current_software_framebuffer */
|
||||
NULL /* get_hw_render_interface */
|
||||
};
|
||||
|
||||
static void sdl_dingux_get_poke_interface(void *data, const video_poke_interface_t **iface)
|
||||
{
|
||||
(void)data;
|
||||
*iface = &sdl_dingux_poke_interface;
|
||||
}
|
||||
|
||||
static bool sdl_dingux_gfx_set_shader(void *data,
|
||||
enum rarch_shader_type type, const char *path)
|
||||
{
|
||||
(void)data;
|
||||
(void)type;
|
||||
(void)path;
|
||||
return false;
|
||||
}
|
||||
|
||||
video_driver_t video_sdl_dingux = {
|
||||
sdl_dingux_gfx_init,
|
||||
sdl_dingux_gfx_frame,
|
||||
sdl_dingux_gfx_set_nonblock_state,
|
||||
sdl_dingux_gfx_alive,
|
||||
sdl_dingux_gfx_focus,
|
||||
sdl_dingux_gfx_suppress_screensaver,
|
||||
sdl_dingux_gfx_has_windowed,
|
||||
sdl_dingux_gfx_set_shader,
|
||||
sdl_dingux_gfx_free,
|
||||
"sdl_dingux",
|
||||
NULL,
|
||||
NULL, /* set_rotation */
|
||||
sdl_dingux_gfx_viewport_info,
|
||||
NULL, /* read_viewport */
|
||||
NULL, /* read_frame_raw */
|
||||
#ifdef HAVE_OVERLAY
|
||||
NULL,
|
||||
#endif
|
||||
#ifdef HAVE_VIDEO_LAYOUT
|
||||
NULL,
|
||||
#endif
|
||||
sdl_dingux_get_poke_interface
|
||||
};
|
@ -119,12 +119,13 @@ static void sdl_init_font(sdl_video_t *vid, const char *font_path, unsigned font
|
||||
}
|
||||
|
||||
static void sdl_render_msg(sdl_video_t *vid, SDL_Surface *buffer,
|
||||
const char *msg, unsigned width, unsigned height, const SDL_PixelFormat *fmt)
|
||||
const char *msg, unsigned width, unsigned height,
|
||||
const SDL_PixelFormat *fmt)
|
||||
{
|
||||
int x, y, msg_base_x, msg_base_y;
|
||||
unsigned rshift, gshift, bshift;
|
||||
const struct font_atlas *atlas = NULL;
|
||||
settings_t *settings = config_get_ptr();
|
||||
settings_t *settings = config_get_ptr();
|
||||
|
||||
if (!vid->font)
|
||||
return;
|
||||
|
@ -422,7 +422,7 @@ static bool sixel_gfx_frame(void *data, const void *frame,
|
||||
}
|
||||
|
||||
if (msg)
|
||||
font_driver_render_msg(video_info, NULL, msg, NULL);
|
||||
font_driver_render_msg(sixel, video_info, msg, NULL, NULL);
|
||||
|
||||
return true;
|
||||
}
|
||||
@ -544,14 +544,6 @@ static void sixel_set_texture_frame(void *data,
|
||||
}
|
||||
}
|
||||
|
||||
static void sixel_set_osd_msg(void *data,
|
||||
video_frame_info_t *video_info,
|
||||
const char *msg,
|
||||
const void *params, void *font)
|
||||
{
|
||||
font_driver_render_msg(video_info, font, msg, (const struct font_params*)params);
|
||||
}
|
||||
|
||||
static void sixel_get_video_output_size(void *data,
|
||||
unsigned *width, unsigned *height)
|
||||
{
|
||||
@ -600,7 +592,7 @@ static const video_poke_interface_t sixel_poke_interface = {
|
||||
#if defined(HAVE_MENU)
|
||||
sixel_set_texture_frame,
|
||||
NULL,
|
||||
sixel_set_osd_msg,
|
||||
font_driver_render_msg,
|
||||
NULL,
|
||||
#else
|
||||
NULL,
|
||||
|
@ -229,8 +229,8 @@ static bool switch_frame(void *data, const void *frame,
|
||||
&video_info->osd_stat_params;
|
||||
|
||||
if (osd_params)
|
||||
font_driver_render_msg(video_info, NULL, video_info->stat_text,
|
||||
(const struct font_params*)&video_info->osd_stat_params);
|
||||
font_driver_render_msg(sw, video_info, video_info->stat_text,
|
||||
(const struct font_params*)&video_info->osd_stat_params, NULL);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -486,12 +486,12 @@ static bool switch_frame(void *data, const void *frame,
|
||||
struct font_params *osd_params = (struct font_params *)&video_info->osd_stat_params;
|
||||
|
||||
if (osd_params)
|
||||
font_driver_render_msg(video_info, NULL, video_info->stat_text,
|
||||
(const struct font_params *)&video_info->osd_stat_params);
|
||||
font_driver_render_msg(sw, video_info, video_info->stat_text,
|
||||
(const struct font_params *)&video_info->osd_stat_params, NULL);
|
||||
}
|
||||
|
||||
if (msg)
|
||||
font_driver_render_msg(video_info, NULL, msg, NULL);
|
||||
font_driver_render_msg(sw, video_info, msg, NULL, NULL);
|
||||
|
||||
framebufferEnd(&sw->fb);
|
||||
|
||||
@ -645,17 +645,6 @@ static void switch_set_texture_enable(void *data, bool enable, bool full_screen)
|
||||
sw->menu_texture.fullscreen = full_screen;
|
||||
}
|
||||
|
||||
static void switch_set_osd_msg(void *data,
|
||||
video_frame_info_t *video_info,
|
||||
const char *msg,
|
||||
const void *params, void *font)
|
||||
{
|
||||
switch_video_t *sw = (switch_video_t *)data;
|
||||
|
||||
if (sw)
|
||||
font_driver_render_msg(video_info, font, msg, params);
|
||||
}
|
||||
|
||||
#ifdef HAVE_OVERLAY
|
||||
static void switch_overlay_enable(void *data, bool state)
|
||||
{
|
||||
@ -750,7 +739,7 @@ static const video_poke_interface_t switch_poke_interface = {
|
||||
switch_apply_state_changes, /* apply_state_changes */
|
||||
switch_set_texture_frame,
|
||||
switch_set_texture_enable,
|
||||
switch_set_osd_msg,
|
||||
font_driver_render_msg,
|
||||
NULL, /* show_mouse */
|
||||
NULL, /* grab_mouse_toggle */
|
||||
NULL, /* get_current_shader */
|
||||
|
@ -240,7 +240,7 @@ static bool vga_gfx_frame(void *data, const void *frame,
|
||||
}
|
||||
|
||||
if (msg)
|
||||
font_driver_render_msg(video_info, NULL, msg, NULL);
|
||||
font_driver_render_msg(data, video_info, msg, NULL, NULL);
|
||||
|
||||
video_info->cb_update_window_title(
|
||||
video_info->context_data, video_info);
|
||||
@ -359,14 +359,6 @@ static void vga_set_texture_frame(void *data,
|
||||
}
|
||||
}
|
||||
|
||||
static void vga_set_osd_msg(void *data,
|
||||
video_frame_info_t *video_info,
|
||||
const char *msg,
|
||||
const void *params, void *font)
|
||||
{
|
||||
font_driver_render_msg(video_info, font, msg, params);
|
||||
}
|
||||
|
||||
static uint32_t vga_get_flags(void *data)
|
||||
{
|
||||
uint32_t flags = 0;
|
||||
@ -390,7 +382,7 @@ static const video_poke_interface_t vga_poke_interface = {
|
||||
NULL,
|
||||
vga_set_texture_frame,
|
||||
NULL,
|
||||
vga_set_osd_msg,
|
||||
font_driver_render_msg,
|
||||
NULL, /* show_mouse */
|
||||
NULL, /* grab_mouse_toggle */
|
||||
NULL, /* get_current_shader */
|
||||
|
@ -253,10 +253,8 @@ static bool vita2d_gfx_frame(void *data, const void *frame,
|
||||
&video_info->osd_stat_params;
|
||||
|
||||
if (osd_params)
|
||||
{
|
||||
font_driver_render_msg(video_info, NULL, video_info->stat_text,
|
||||
(const struct font_params*)&video_info->osd_stat_params);
|
||||
}
|
||||
font_driver_render_msg(vita, video_info, video_info->stat_text,
|
||||
(const struct font_params*)&video_info->osd_stat_params, NULL);
|
||||
}
|
||||
|
||||
#ifdef HAVE_OVERLAY
|
||||
@ -269,7 +267,7 @@ static bool vita2d_gfx_frame(void *data, const void *frame,
|
||||
#endif
|
||||
|
||||
if(!string_is_empty(msg))
|
||||
font_driver_render_msg(video_info, NULL, msg, NULL);
|
||||
font_driver_render_msg(vita, video_info, msg, NULL, NULL);
|
||||
|
||||
vita2d_end_drawing();
|
||||
vita2d_swap_buffers();
|
||||
@ -725,14 +723,6 @@ static void vita_unload_texture(void *data, uintptr_t handle)
|
||||
//free(texture);
|
||||
}
|
||||
|
||||
static void vita_set_osd_msg(void *data,
|
||||
video_frame_info_t *video_info,
|
||||
const char *msg,
|
||||
const void *params, void *font)
|
||||
{
|
||||
font_driver_render_msg(video_info, font, msg, params);
|
||||
}
|
||||
|
||||
static bool vita_get_current_sw_framebuffer(void *data,
|
||||
struct retro_framebuffer *framebuffer)
|
||||
{
|
||||
@ -790,7 +780,7 @@ static const video_poke_interface_t vita_poke_interface = {
|
||||
vita_apply_state_changes,
|
||||
vita_set_texture_frame,
|
||||
vita_set_texture_enable,
|
||||
vita_set_osd_msg,
|
||||
font_driver_render_msg,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
|
@ -1959,10 +1959,8 @@ static bool vulkan_frame(void *data, const void *frame,
|
||||
&video_info->osd_stat_params;
|
||||
|
||||
if (osd_params)
|
||||
{
|
||||
font_driver_render_msg(video_info, NULL, video_info->stat_text,
|
||||
(const struct font_params*)&video_info->osd_stat_params);
|
||||
}
|
||||
font_driver_render_msg(vk, video_info, video_info->stat_text,
|
||||
&video_info->osd_stat_params, NULL);
|
||||
}
|
||||
#endif
|
||||
|
||||
@ -1972,7 +1970,7 @@ static bool vulkan_frame(void *data, const void *frame,
|
||||
#endif
|
||||
|
||||
if (!string_is_empty(msg))
|
||||
font_driver_render_msg(video_info, NULL, msg, NULL);
|
||||
font_driver_render_msg(vk, video_info, msg, NULL, NULL);
|
||||
|
||||
#ifdef HAVE_MENU_WIDGETS
|
||||
if (video_info->widgets_inited)
|
||||
@ -2322,14 +2320,6 @@ static void vulkan_set_texture_enable(void *data, bool state, bool full_screen)
|
||||
vk->menu.full_screen = full_screen;
|
||||
}
|
||||
|
||||
static void vulkan_set_osd_msg(void *data,
|
||||
video_frame_info_t *video_info,
|
||||
const char *msg,
|
||||
const void *params, void *font)
|
||||
{
|
||||
font_driver_render_msg(video_info, font, msg, (const struct font_params *)params);
|
||||
}
|
||||
|
||||
static uintptr_t vulkan_load_texture(void *video_data, void *data,
|
||||
bool threaded, enum texture_filter_type filter_type)
|
||||
{
|
||||
@ -2441,7 +2431,7 @@ static const video_poke_interface_t vulkan_poke_interface = {
|
||||
vulkan_apply_state_changes,
|
||||
vulkan_set_texture_frame,
|
||||
vulkan_set_texture_enable,
|
||||
vulkan_set_osd_msg,
|
||||
font_driver_render_msg,
|
||||
vulkan_show_mouse,
|
||||
NULL, /* grab_mouse_toggle */
|
||||
vulkan_get_current_shader,
|
||||
|
@ -508,17 +508,17 @@ static bool gbm_choose_xrgb8888_cb(void *display_data, EGLDisplay dpy, EGLConfig
|
||||
(void)display_data;
|
||||
|
||||
/* Makes sure we have 8 bit color. */
|
||||
if (!eglGetConfigAttrib(dpy, config, EGL_RED_SIZE, &r))
|
||||
if (!egl_get_config_attrib(dpy, config, EGL_RED_SIZE, &r))
|
||||
return false;
|
||||
if (!eglGetConfigAttrib(dpy, config, EGL_GREEN_SIZE, &g))
|
||||
if (!egl_get_config_attrib(dpy, config, EGL_GREEN_SIZE, &g))
|
||||
return false;
|
||||
if (!eglGetConfigAttrib(dpy, config, EGL_BLUE_SIZE, &b))
|
||||
if (!egl_get_config_attrib(dpy, config, EGL_BLUE_SIZE, &b))
|
||||
return false;
|
||||
|
||||
if (r != 8 || g != 8 || b != 8)
|
||||
return false;
|
||||
|
||||
if (!eglGetConfigAttrib(dpy, config, EGL_NATIVE_VISUAL_ID, &id))
|
||||
if (!egl_get_config_attrib(dpy, config, EGL_NATIVE_VISUAL_ID, &id))
|
||||
return false;
|
||||
|
||||
return id == GBM_FORMAT_XRGB8888;
|
||||
@ -875,8 +875,6 @@ static gfx_ctx_proc_t gfx_ctx_drm_get_proc_address(const char *symbol)
|
||||
case GFX_CTX_OPENVG_API:
|
||||
#ifdef HAVE_EGL
|
||||
return egl_get_proc_address(symbol);
|
||||
#else
|
||||
break;
|
||||
#endif
|
||||
case GFX_CTX_NONE:
|
||||
default:
|
||||
|
@ -165,7 +165,9 @@ static void gfx_ctx_emscripten_destroy(void *data)
|
||||
if (!emscripten)
|
||||
return;
|
||||
|
||||
#ifdef HAVE_EGL
|
||||
egl_destroy(&emscripten->egl);
|
||||
#endif
|
||||
|
||||
free(data);
|
||||
}
|
||||
@ -272,8 +274,10 @@ static bool gfx_ctx_emscripten_bind_api(void *data,
|
||||
|
||||
switch (api)
|
||||
{
|
||||
#ifdef HAVE_EGL
|
||||
case GFX_CTX_OPENGL_ES_API:
|
||||
return egl_bind_api(EGL_OPENGL_ES_API);
|
||||
#endif
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
@ -122,16 +122,13 @@ static void *gfx_ctx_mali_fbdev_init(video_frame_info_t *video_info,
|
||||
#ifdef HAVE_EGL
|
||||
if (!egl_init_context(&mali->egl, EGL_NONE, EGL_DEFAULT_DISPLAY,
|
||||
&major, &minor, &n, attribs, NULL))
|
||||
{
|
||||
egl_report_error();
|
||||
goto error;
|
||||
}
|
||||
#endif
|
||||
|
||||
return mali;
|
||||
|
||||
error:
|
||||
RARCH_ERR("[Mali fbdev]: EGL error: %d.\n", eglGetError());
|
||||
egl_report_error();
|
||||
gfx_ctx_mali_fbdev_destroy(video_driver);
|
||||
return NULL;
|
||||
}
|
||||
@ -190,10 +187,7 @@ static bool gfx_ctx_mali_fbdev_set_video_mode(void *data,
|
||||
|
||||
#ifdef HAVE_EGL
|
||||
if (!egl_create_context(&mali->egl, attribs))
|
||||
{
|
||||
egl_report_error();
|
||||
goto error;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_EGL
|
||||
@ -206,7 +200,7 @@ static bool gfx_ctx_mali_fbdev_set_video_mode(void *data,
|
||||
error:
|
||||
if (fd >= 0)
|
||||
close(fd);
|
||||
RARCH_ERR("[Mali fbdev]: EGL error: %d.\n", eglGetError());
|
||||
egl_report_error();
|
||||
gfx_ctx_mali_fbdev_destroy(data);
|
||||
return false;
|
||||
}
|
||||
|
@ -15,6 +15,7 @@
|
||||
*/
|
||||
|
||||
#include <signal.h>
|
||||
#include <retroarch.h>
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../../config.h"
|
||||
@ -89,17 +90,14 @@ static void *gfx_ctx_opendingux_init(video_frame_info_t *video_info, void *video
|
||||
if (!egl_init_context(&viv->egl, EGL_NONE, EGL_DEFAULT_DISPLAY,
|
||||
&major, &minor,
|
||||
&n, attribs, NULL))
|
||||
{
|
||||
egl_report_error();
|
||||
goto error;
|
||||
}
|
||||
#endif
|
||||
|
||||
return viv;
|
||||
|
||||
error:
|
||||
#ifdef HAVE_EGL
|
||||
RARCH_ERR("[opendingux fbdev]: EGL error: %d.\n", eglGetError());
|
||||
error:
|
||||
egl_report_error();
|
||||
#endif
|
||||
gfx_ctx_opendingux_destroy(viv);
|
||||
return NULL;
|
||||
@ -122,7 +120,6 @@ static void gfx_ctx_opendingux_check_window(void *data, bool *quit,
|
||||
|
||||
#ifdef HAVE_EGL
|
||||
egl_get_video_size(&viv->egl, &new_width, &new_height);
|
||||
#endif
|
||||
|
||||
if (new_width != *width || new_height != *height)
|
||||
{
|
||||
@ -130,6 +127,7 @@ static void gfx_ctx_opendingux_check_window(void *data, bool *quit,
|
||||
*height = new_height;
|
||||
*resize = true;
|
||||
}
|
||||
#endif
|
||||
|
||||
*quit = (bool)frontend_driver_get_signal_handler_state();
|
||||
}
|
||||
@ -158,10 +156,7 @@ static bool gfx_ctx_opendingux_set_video_mode(void *data,
|
||||
|
||||
#ifdef HAVE_EGL
|
||||
if (!egl_create_context(&viv->egl, attribs))
|
||||
{
|
||||
egl_report_error();
|
||||
goto error;
|
||||
}
|
||||
|
||||
viv->native_window = 0;
|
||||
if (!egl_create_surface(&viv->egl, viv->native_window))
|
||||
@ -170,9 +165,9 @@ static bool gfx_ctx_opendingux_set_video_mode(void *data,
|
||||
|
||||
return true;
|
||||
|
||||
error:
|
||||
#ifdef HAVE_EGL
|
||||
RARCH_ERR("[opendingux fbdev]: EGL error: %d.\n", eglGetError());
|
||||
error:
|
||||
egl_report_error();
|
||||
#endif
|
||||
gfx_ctx_opendingux_destroy(data);
|
||||
return false;
|
||||
@ -235,12 +230,12 @@ static void gfx_ctx_opendingux_set_swap_interval(
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef HAVE_EGL
|
||||
static gfx_ctx_proc_t gfx_ctx_opendingux_get_proc_address(const char *symbol)
|
||||
{
|
||||
#ifdef HAVE_EGL
|
||||
return egl_get_proc_address(symbol);
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
static void gfx_ctx_opendingux_bind_hw_render(void *data, bool enable)
|
||||
{
|
||||
@ -287,7 +282,11 @@ const gfx_ctx_driver_t gfx_ctx_opendingux_fbdev = {
|
||||
false, /* has_windowed */
|
||||
gfx_ctx_opendingux_swap_buffers,
|
||||
gfx_ctx_opendingux_input_driver,
|
||||
#ifdef HAVE_EGL
|
||||
gfx_ctx_opendingux_get_proc_address,
|
||||
#else
|
||||
NULL,
|
||||
#endif
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
|
@ -163,10 +163,7 @@ static bool orbis_ctx_set_video_mode(void *data,
|
||||
|
||||
#ifdef HAVE_EGL
|
||||
if (!egl_create_context(&ctx_orbis->egl, contextAttributeList))
|
||||
{
|
||||
egl_report_error();
|
||||
goto error;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_EGL
|
||||
@ -177,7 +174,9 @@ static bool orbis_ctx_set_video_mode(void *data,
|
||||
return true;
|
||||
|
||||
error:
|
||||
printf("[ctx_orbis]: EGL error: %d.\n", eglGetError());
|
||||
#ifdef HAVE_EGL
|
||||
egl_report_error();
|
||||
#endif
|
||||
orbis_ctx_destroy(data);
|
||||
|
||||
return false;
|
||||
@ -202,9 +201,11 @@ static bool orbis_ctx_bind_api(void *data,
|
||||
(void)data;
|
||||
ctx_orbis_api = api;
|
||||
|
||||
#ifdef HAVE_EGL
|
||||
if (api == GFX_CTX_OPENGL_ES_API)
|
||||
if (egl_bind_api(EGL_OPENGL_ES_API))
|
||||
return true;
|
||||
#endif
|
||||
|
||||
return false;
|
||||
}
|
||||
|
@ -135,16 +135,10 @@ static void *gfx_ctx_qnx_init(video_frame_info_t *video_info, void *video_driver
|
||||
#ifdef HAVE_EGL
|
||||
if (!egl_init_context(&qnx->egl, EGL_NONE, EGL_DEFAULT_DISPLAY, &major, &minor,
|
||||
&n, attribs, NULL))
|
||||
{
|
||||
egl_report_error();
|
||||
goto error;
|
||||
}
|
||||
|
||||
if (!egl_create_context(&qnx->egl, context_attributes))
|
||||
{
|
||||
egl_report_error();
|
||||
goto error;
|
||||
}
|
||||
#endif
|
||||
|
||||
if(!screen_win)
|
||||
@ -266,7 +260,7 @@ static void *gfx_ctx_qnx_init(video_frame_info_t *video_info, void *video_driver
|
||||
return qnx;
|
||||
|
||||
error:
|
||||
RARCH_ERR("EGL error: %d.\n", eglGetError());
|
||||
egl_report_error();
|
||||
gfx_ctx_qnx_destroy(video_driver);
|
||||
screen_error:
|
||||
screen_stop_events(screen_ctx);
|
||||
|
@ -376,12 +376,14 @@ static bool gfx_ctx_vc_bind_api(void *data,
|
||||
|
||||
switch (api)
|
||||
{
|
||||
#ifdef HAVE_EGL
|
||||
case GFX_CTX_OPENGL_API:
|
||||
return egl_bind_api(EGL_OPENGL_API);
|
||||
case GFX_CTX_OPENGL_ES_API:
|
||||
return egl_bind_api(EGL_OPENGL_ES_API);
|
||||
case GFX_CTX_OPENVG_API:
|
||||
return egl_bind_api(EGL_OPENVG_API);
|
||||
#endif
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@ -458,7 +460,7 @@ static void gfx_ctx_vc_destroy(void *data)
|
||||
gfx_ctx_vc_bind_api(data, vc_api, 0, 0);
|
||||
eglMakeCurrent(vc->egl.dpy,
|
||||
EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
|
||||
eglTerminate(vc->egl.dpy);
|
||||
egl_terminate(vc->egl.dpy);
|
||||
}
|
||||
|
||||
vc->egl.ctx = NULL;
|
||||
|
@ -93,18 +93,16 @@ static void *gfx_ctx_vivante_init(video_frame_info_t *video_info, void *video_dr
|
||||
system("setterm -cursor off");
|
||||
|
||||
#ifdef HAVE_EGL
|
||||
if (!egl_init_context(&viv->egl, EGL_NONE, EGL_DEFAULT_DISPLAY, &major, &minor,
|
||||
if (!egl_init_context(&viv->egl, EGL_NONE,
|
||||
EGL_DEFAULT_DISPLAY, &major, &minor,
|
||||
&n, attribs, NULL))
|
||||
{
|
||||
egl_report_error();
|
||||
goto error;
|
||||
}
|
||||
#endif
|
||||
|
||||
return viv;
|
||||
|
||||
error:
|
||||
RARCH_ERR("[Vivante fbdev]: EGL error: %d.\n", eglGetError());
|
||||
egl_report_error();
|
||||
gfx_ctx_vivante_destroy(viv);
|
||||
return NULL;
|
||||
}
|
||||
@ -164,10 +162,7 @@ static bool gfx_ctx_vivante_set_video_mode(void *data,
|
||||
|
||||
#ifdef HAVE_EGL
|
||||
if (!egl_create_context(&viv->egl, attribs))
|
||||
{
|
||||
egl_report_error();
|
||||
goto error;
|
||||
}
|
||||
#endif
|
||||
|
||||
viv->native_window = fbCreateWindow(fbGetDisplayByIndex(0), 0, 0, 0, 0);
|
||||
@ -180,7 +175,7 @@ static bool gfx_ctx_vivante_set_video_mode(void *data,
|
||||
return true;
|
||||
|
||||
error:
|
||||
RARCH_ERR("[Vivante fbdev]: EGL error: %d.\n", eglGetError());
|
||||
egl_report_error();
|
||||
gfx_ctx_vivante_destroy(data);
|
||||
return false;
|
||||
}
|
||||
|
@ -1687,9 +1687,11 @@ static bool gfx_ctx_wl_set_video_mode(void *data,
|
||||
|
||||
return true;
|
||||
|
||||
#if defined(HAVE_EGL) || defined(HAVE_VULKAN)
|
||||
error:
|
||||
gfx_ctx_wl_destroy(data);
|
||||
return false;
|
||||
#endif
|
||||
}
|
||||
|
||||
bool input_wl_init(void *data, const char *joypad_name);
|
||||
|
@ -123,38 +123,6 @@ static enum gfx_ctx_api win32_api = GFX_CTX_NONE;
|
||||
static dylib_t dll_handle = NULL; /* Handle to OpenGL32.dll/libGLESv2.dll */
|
||||
#endif
|
||||
|
||||
#if defined(HAVE_OPENGL) || defined(HAVE_OPENGL1) || defined(HAVE_OPENGL_CORE)
|
||||
static bool wgl_has_extension(const char *extension, const char *extensions)
|
||||
{
|
||||
const char *start = NULL;
|
||||
const char *terminator = NULL;
|
||||
const char *where = strchr(extension, ' ');
|
||||
|
||||
if (where || *extension == '\0')
|
||||
return false;
|
||||
|
||||
if (!extensions)
|
||||
return false;
|
||||
|
||||
start = extensions;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
where = strstr(start, extension);
|
||||
if (!where)
|
||||
break;
|
||||
|
||||
terminator = where + strlen(extension);
|
||||
if (where == start || *(where - 1) == ' ')
|
||||
if (*terminator == ' ' || *terminator == '\0')
|
||||
return true;
|
||||
|
||||
start = terminator;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
#endif
|
||||
|
||||
typedef struct gfx_ctx_cgl_data
|
||||
{
|
||||
void *empty;
|
||||
@ -185,6 +153,36 @@ static gfx_ctx_proc_t gfx_ctx_wgl_get_proc_address(const char *symbol)
|
||||
}
|
||||
|
||||
#if (defined(HAVE_OPENGL) || defined(HAVE_OPENGL1) || defined(HAVE_OPENGL_CORE)) && !defined(HAVE_OPENGLES)
|
||||
static bool wgl_has_extension(const char *extension, const char *extensions)
|
||||
{
|
||||
const char *start = NULL;
|
||||
const char *terminator = NULL;
|
||||
const char *where = strchr(extension, ' ');
|
||||
|
||||
if (where || *extension == '\0')
|
||||
return false;
|
||||
|
||||
if (!extensions)
|
||||
return false;
|
||||
|
||||
start = extensions;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
where = strstr(start, extension);
|
||||
if (!where)
|
||||
break;
|
||||
|
||||
terminator = where + strlen(extension);
|
||||
if (where == start || *(where - 1) == ' ')
|
||||
if (*terminator == ' ' || *terminator == '\0')
|
||||
return true;
|
||||
|
||||
start = terminator;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
static void create_gl_context(HWND hwnd, bool *quit)
|
||||
{
|
||||
struct retro_hw_render_callback *hwr = video_driver_get_hw_context();
|
||||
@ -654,9 +652,9 @@ static void *gfx_ctx_wgl_init(video_frame_info_t *video_info, void *video_driver
|
||||
|
||||
#ifdef HAVE_DYNAMIC
|
||||
#ifdef HAVE_OPENGL
|
||||
dll_handle = dylib_load("libGLESv2.dll");
|
||||
#else
|
||||
dll_handle = dylib_load("OpenGL32.dll");
|
||||
#else
|
||||
dll_handle = dylib_load("libGLESv2.dll");
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
@ -1031,12 +1031,14 @@ end:
|
||||
#endif
|
||||
|
||||
void font_driver_render_msg(
|
||||
void *data,
|
||||
video_frame_info_t *video_info,
|
||||
void *font_data,
|
||||
const char *msg,
|
||||
const struct font_params *params)
|
||||
const void *_params,
|
||||
void *font_data)
|
||||
{
|
||||
font_data_t *font = (font_data_t*)(font_data
|
||||
const struct font_params *params = (const struct font_params*)_params;
|
||||
font_data_t *font = (font_data_t*)(font_data
|
||||
? font_data : video_font_driver);
|
||||
|
||||
if (msg && *msg && font && font->renderer && font->renderer->render_msg)
|
||||
|
@ -130,8 +130,9 @@ int font_renderer_create_default(
|
||||
void **handle,
|
||||
const char *font_path, unsigned font_size);
|
||||
|
||||
void font_driver_render_msg(video_frame_info_t *video_info,
|
||||
void *font_data, const char *msg, const struct font_params *params);
|
||||
void font_driver_render_msg(void *data,
|
||||
video_frame_info_t *video_info,
|
||||
const char *msg, const void *params, void *font_data);
|
||||
|
||||
void font_driver_bind_block(void *font_data, void *block);
|
||||
|
||||
|
@ -20,6 +20,21 @@
|
||||
#include "../retroarch.h"
|
||||
#include "../verbosity.h"
|
||||
|
||||
static const video_display_server_t dispserv_null = {
|
||||
NULL, /* init */
|
||||
NULL, /* destroy */
|
||||
NULL, /* set_window_opacity */
|
||||
NULL, /* set_window_progress */
|
||||
NULL, /* set_window_decorations */
|
||||
NULL, /* set_resolution */
|
||||
NULL, /* get_resolution_list */
|
||||
NULL, /* get_output_options */
|
||||
NULL, /* set_screen_orientation */
|
||||
NULL, /* get_screen_orientation */
|
||||
NULL, /* get_flags */
|
||||
"null"
|
||||
};
|
||||
|
||||
static const video_display_server_t *current_display_server = &dispserv_null;
|
||||
static void *current_display_server_data = NULL;
|
||||
static enum rotation initial_screen_orientation = ORIENTATION_NORMAL;
|
||||
@ -59,7 +74,8 @@ void* video_display_server_init(void)
|
||||
break;
|
||||
}
|
||||
|
||||
current_display_server_data = current_display_server->init();
|
||||
if (current_display_server && current_display_server->init)
|
||||
current_display_server_data = current_display_server->init();
|
||||
|
||||
RARCH_LOG("[Video]: Found display server: %s\n",
|
||||
current_display_server->ident);
|
||||
@ -75,7 +91,7 @@ void video_display_server_destroy(void)
|
||||
if (initial_screen_orientation != current_screen_orientation)
|
||||
video_display_server_set_screen_orientation(initial_screen_orientation);
|
||||
|
||||
if (current_display_server && current_display_server->destroy)
|
||||
if (current_display_server)
|
||||
if (current_display_server_data)
|
||||
current_display_server->destroy(current_display_server_data);
|
||||
}
|
||||
|
@ -92,7 +92,6 @@ enum rotation video_display_server_get_screen_orientation(void);
|
||||
extern const video_display_server_t dispserv_win32;
|
||||
extern const video_display_server_t dispserv_x11;
|
||||
extern const video_display_server_t dispserv_android;
|
||||
extern const video_display_server_t dispserv_null;
|
||||
|
||||
RETRO_END_DECLS
|
||||
|
||||
|
@ -237,26 +237,28 @@ static bool create_softfilter_graph(rarch_softfilter_t *filt,
|
||||
}
|
||||
|
||||
#ifdef HAVE_THREADS
|
||||
filt->thread_data = (struct filter_thread_data*)
|
||||
calloc(threads, sizeof(*filt->thread_data));
|
||||
if (!filt->thread_data)
|
||||
return false;
|
||||
if(filt->threads>1){
|
||||
filt->thread_data = (struct filter_thread_data*)
|
||||
calloc(threads, sizeof(*filt->thread_data));
|
||||
if (!filt->thread_data)
|
||||
return false;
|
||||
|
||||
for (i = 0; i < threads; i++)
|
||||
{
|
||||
filt->thread_data[i].userdata = filt->impl_data;
|
||||
filt->thread_data[i].done = true;
|
||||
for (i = 0; i < threads; i++)
|
||||
{
|
||||
filt->thread_data[i].userdata = filt->impl_data;
|
||||
filt->thread_data[i].done = true;
|
||||
|
||||
filt->thread_data[i].lock = slock_new();
|
||||
if (!filt->thread_data[i].lock)
|
||||
return false;
|
||||
filt->thread_data[i].cond = scond_new();
|
||||
if (!filt->thread_data[i].cond)
|
||||
return false;
|
||||
filt->thread_data[i].thread = sthread_create(
|
||||
filter_thread_loop, &filt->thread_data[i]);
|
||||
if (!filt->thread_data[i].thread)
|
||||
return false;
|
||||
filt->thread_data[i].lock = slock_new();
|
||||
if (!filt->thread_data[i].lock)
|
||||
return false;
|
||||
filt->thread_data[i].cond = scond_new();
|
||||
if (!filt->thread_data[i].cond)
|
||||
return false;
|
||||
filt->thread_data[i].thread = sthread_create(
|
||||
filter_thread_loop, &filt->thread_data[i]);
|
||||
if (!filt->thread_data[i].thread)
|
||||
return false;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
@ -475,19 +477,21 @@ void rarch_softfilter_free(rarch_softfilter_t *filt)
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_THREADS
|
||||
for (i = 0; i < filt->threads; i++)
|
||||
{
|
||||
if (!filt->thread_data[i].thread)
|
||||
continue;
|
||||
slock_lock(filt->thread_data[i].lock);
|
||||
filt->thread_data[i].die = true;
|
||||
scond_signal(filt->thread_data[i].cond);
|
||||
slock_unlock(filt->thread_data[i].lock);
|
||||
sthread_join(filt->thread_data[i].thread);
|
||||
slock_free(filt->thread_data[i].lock);
|
||||
scond_free(filt->thread_data[i].cond);
|
||||
if(filt->threads>1){
|
||||
for (i = 0; i < filt->threads; i++)
|
||||
{
|
||||
if (!filt->thread_data[i].thread)
|
||||
continue;
|
||||
slock_lock(filt->thread_data[i].lock);
|
||||
filt->thread_data[i].die = true;
|
||||
scond_signal(filt->thread_data[i].cond);
|
||||
slock_unlock(filt->thread_data[i].lock);
|
||||
sthread_join(filt->thread_data[i].thread);
|
||||
slock_free(filt->thread_data[i].lock);
|
||||
scond_free(filt->thread_data[i].cond);
|
||||
}
|
||||
free(filt->thread_data);
|
||||
}
|
||||
free(filt->thread_data);
|
||||
#endif
|
||||
|
||||
if (filt->conf)
|
||||
@ -533,29 +537,34 @@ void rarch_softfilter_process(rarch_softfilter_t *filt,
|
||||
output, output_stride, input, width, height, input_stride);
|
||||
|
||||
#ifdef HAVE_THREADS
|
||||
/* Fire off workers */
|
||||
for (i = 0; i < filt->threads; i++)
|
||||
{
|
||||
if(filt->threads>1){
|
||||
/* Fire off workers */
|
||||
for (i = 0; i < filt->threads; i++)
|
||||
{
|
||||
#if 0
|
||||
RARCH_LOG("Firing off filter thread %u ...\n", i);
|
||||
RARCH_LOG("Firing off filter thread %u ...\n", i);
|
||||
#endif
|
||||
filt->thread_data[i].packet = &filt->packets[i];
|
||||
slock_lock(filt->thread_data[i].lock);
|
||||
filt->thread_data[i].done = false;
|
||||
scond_signal(filt->thread_data[i].cond);
|
||||
slock_unlock(filt->thread_data[i].lock);
|
||||
}
|
||||
filt->thread_data[i].packet = &filt->packets[i];
|
||||
slock_lock(filt->thread_data[i].lock);
|
||||
filt->thread_data[i].done = false;
|
||||
scond_signal(filt->thread_data[i].cond);
|
||||
slock_unlock(filt->thread_data[i].lock);
|
||||
}
|
||||
|
||||
/* Wait for workers */
|
||||
for (i = 0; i < filt->threads; i++)
|
||||
{
|
||||
/* Wait for workers */
|
||||
for (i = 0; i < filt->threads; i++)
|
||||
{
|
||||
#if 0
|
||||
RARCH_LOG("Waiting for filter thread %u ...\n", i);
|
||||
RARCH_LOG("Waiting for filter thread %u ...\n", i);
|
||||
#endif
|
||||
slock_lock(filt->thread_data[i].lock);
|
||||
while (!filt->thread_data[i].done)
|
||||
scond_wait(filt->thread_data[i].cond, filt->thread_data[i].lock);
|
||||
slock_unlock(filt->thread_data[i].lock);
|
||||
slock_lock(filt->thread_data[i].lock);
|
||||
while (!filt->thread_data[i].done)
|
||||
scond_wait(filt->thread_data[i].cond, filt->thread_data[i].lock);
|
||||
slock_unlock(filt->thread_data[i].lock);
|
||||
}
|
||||
} else {
|
||||
for (i = 0; i < filt->threads; i++)
|
||||
filt->packets[i].work(filt->impl_data, filt->packets[i].thread_data);
|
||||
}
|
||||
#else
|
||||
for (i = 0; i < filt->threads; i++)
|
||||
|
@ -7,20 +7,18 @@ PREFIX := /usr
|
||||
INSTALLDIR := $(PREFIX)/lib/retroarch/filters/video
|
||||
|
||||
ifeq ($(platform),)
|
||||
platform = unix
|
||||
ifeq ($(shell uname -a),)
|
||||
platform = win
|
||||
else ifneq ($(findstring MINGW,$(shell uname -a)),)
|
||||
platform = win
|
||||
else ifneq ($(findstring Darwin,$(shell uname -a)),)
|
||||
platform = osx
|
||||
arch = intel
|
||||
ifeq ($(shell uname -p),powerpc)
|
||||
arch = ppc
|
||||
endif
|
||||
else ifneq ($(findstring win,$(shell uname -a)),)
|
||||
platform = win
|
||||
endif
|
||||
platform = unix
|
||||
ifeq ($(shell uname -s),)
|
||||
platform = win
|
||||
else ifneq ($(findstring Darwin,$(shell uname -s)),)
|
||||
platform = osx
|
||||
arch = intel
|
||||
ifeq ($(shell uname -p),powerpc)
|
||||
arch = ppc
|
||||
endif
|
||||
else ifneq ($(findstring MINGW,$(shell uname -s)),)
|
||||
platform = win
|
||||
endif
|
||||
endif
|
||||
|
||||
ifeq ($(platform),gcc)
|
||||
|
@ -445,8 +445,6 @@ VIDEO DRIVER
|
||||
#include "../gfx/drivers/drm_gfx.c"
|
||||
#endif
|
||||
|
||||
#include "../gfx/display_servers/dispserv_null.c"
|
||||
|
||||
#ifdef HAVE_OPENGL1
|
||||
#include "../gfx/drivers/gl1.c"
|
||||
#endif
|
||||
@ -499,7 +497,6 @@ VIDEO DRIVER
|
||||
#elif defined(DJGPP)
|
||||
#include "../gfx/drivers/vga_gfx.c"
|
||||
#endif
|
||||
#include "../gfx/drivers/nullgfx.c"
|
||||
|
||||
#if defined(_WIN32) && !defined(_XBOX) && !defined(__WINRT__)
|
||||
#ifdef HAVE_GDI
|
||||
@ -713,16 +710,12 @@ INPUT
|
||||
#include "../input/drivers_joypad/udev_joypad.c"
|
||||
#endif
|
||||
|
||||
#include "../input/drivers/nullinput.c"
|
||||
#include "../input/drivers_joypad/null_joypad.c"
|
||||
|
||||
/*============================================================
|
||||
INPUT (HID)
|
||||
============================================================ */
|
||||
#ifdef HAVE_HID
|
||||
#include "../input/common/input_hid_common.c"
|
||||
#include "../input/drivers_joypad/hid_joypad.c"
|
||||
#include "../input/drivers_hid/null_hid.c"
|
||||
|
||||
#if defined(HAVE_LIBUSB) && defined(HAVE_THREADS)
|
||||
#include "../input/drivers_hid/libusb_hid.c"
|
||||
@ -776,7 +769,6 @@ AUDIO RESAMPLER
|
||||
#include "../libretro-common/audio/resampler/audio_resampler.c"
|
||||
#include "../libretro-common/audio/resampler/drivers/sinc_resampler.c"
|
||||
#include "../libretro-common/audio/resampler/drivers/nearest_resampler.c"
|
||||
#include "../libretro-common/audio/resampler/drivers/null_resampler.c"
|
||||
#ifdef HAVE_CC_RESAMPLER
|
||||
#include "../audio/drivers_resampler/cc_resampler.c"
|
||||
#endif
|
||||
@ -798,16 +790,12 @@ CAMERA
|
||||
#include "../cores/libretro-video-processor/video_processor_v4l2.c"
|
||||
#endif
|
||||
|
||||
#include "../camera/drivers/nullcamera.c"
|
||||
|
||||
/*============================================================
|
||||
LEDS
|
||||
============================================================ */
|
||||
|
||||
#include "../led/led_driver.c"
|
||||
|
||||
#include "../led/drivers/led_null.c"
|
||||
|
||||
#if defined(HAVE_RPILED)
|
||||
#include "../led/drivers/led_rpi.c"
|
||||
#endif
|
||||
@ -819,8 +807,6 @@ LOCATION
|
||||
#include "../location/drivers/android.c"
|
||||
#endif
|
||||
|
||||
#include "../location/drivers/nulllocation.c"
|
||||
|
||||
/*============================================================
|
||||
RSOUND
|
||||
============================================================ */
|
||||
@ -896,8 +882,6 @@ AUDIO
|
||||
#include "../audio/drivers/coreaudio.c"
|
||||
#endif
|
||||
|
||||
#include "../audio/drivers/nullaudio.c"
|
||||
|
||||
#if defined(HAVE_WASAPI) || ((_WIN32_WINNT >= 0x0602) && !defined(__WINRT__))
|
||||
#include "../audio/common/mmdevice_common.c"
|
||||
#endif
|
||||
@ -905,8 +889,6 @@ AUDIO
|
||||
/*============================================================
|
||||
MIDI
|
||||
============================================================ */
|
||||
#include "../midi/drivers/null_midi.c"
|
||||
|
||||
#ifdef HAVE_WINMM
|
||||
#include "../midi/drivers/winmm_midi.c"
|
||||
#endif
|
||||
@ -983,6 +965,7 @@ CORES
|
||||
FILE
|
||||
============================================================ */
|
||||
#include "../libretro-common/file/file_path.c"
|
||||
#include "../libretro-common/file/file_path_io.c"
|
||||
#include "../file_path_special.c"
|
||||
#include "../file_path_str.c"
|
||||
#include "../libretro-common/lists/dir_list.c"
|
||||
@ -1080,7 +1063,6 @@ FRONTEND
|
||||
#elif defined(DJGPP)
|
||||
#include "../frontend/drivers/platform_dos.c"
|
||||
#endif
|
||||
#include "../frontend/drivers/platform_null.c"
|
||||
|
||||
#include "../core_info.c"
|
||||
|
||||
@ -1140,8 +1122,6 @@ RETROARCH
|
||||
/*============================================================
|
||||
WIFI
|
||||
============================================================ */
|
||||
#include "../wifi/drivers/nullwifi.c"
|
||||
|
||||
#ifdef HAVE_LAKKA
|
||||
#include "../wifi/drivers/connmanctl.c"
|
||||
#endif
|
||||
@ -1149,8 +1129,6 @@ WIFI
|
||||
/*============================================================
|
||||
RECORDING
|
||||
============================================================ */
|
||||
#include "../record/drivers/record_null.c"
|
||||
|
||||
#ifdef HAVE_FFMPEG
|
||||
#include "../record/drivers/record_ffmpeg.c"
|
||||
#endif
|
||||
@ -1297,11 +1275,8 @@ MENU
|
||||
#include "../menu/menu_thumbnail_path.c"
|
||||
#include "../menu/menu_thumbnail.c"
|
||||
|
||||
#include "../menu/drivers/null.c"
|
||||
#include "../menu/drivers/menu_generic.c"
|
||||
|
||||
#include "../menu/drivers_display/menu_display_null.c"
|
||||
|
||||
#if defined(HAVE_D3D8)
|
||||
#include "../menu/drivers_display/menu_display_d3d8.c"
|
||||
#endif
|
||||
|
@ -1,98 +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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "../input_driver.h"
|
||||
#include "../../verbosity.h"
|
||||
|
||||
static void *nullinput_input_init(const char *joypad_driver)
|
||||
{
|
||||
RARCH_ERR("Using the null input driver. RetroArch will ignore you.");
|
||||
return (void*)-1;
|
||||
}
|
||||
|
||||
static void nullinput_input_poll(void *data)
|
||||
{
|
||||
(void)data;
|
||||
}
|
||||
|
||||
static int16_t nullinput_input_state(void *data,
|
||||
rarch_joypad_info_t joypad_info,
|
||||
const struct retro_keybind **retro_keybinds, unsigned port,
|
||||
unsigned device, unsigned idx, unsigned id)
|
||||
{
|
||||
(void)data;
|
||||
(void)retro_keybinds;
|
||||
(void)port;
|
||||
(void)device;
|
||||
(void)idx;
|
||||
(void)id;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void nullinput_input_free_input(void *data)
|
||||
{
|
||||
(void)data;
|
||||
}
|
||||
|
||||
static uint64_t nullinput_get_capabilities(void *data)
|
||||
{
|
||||
uint64_t caps = 0;
|
||||
|
||||
caps |= (1 << RETRO_DEVICE_JOYPAD);
|
||||
|
||||
return caps;
|
||||
}
|
||||
|
||||
static bool nullinput_set_sensor_state(void *data,
|
||||
unsigned port, enum retro_sensor_action action, unsigned event_rate)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
static void nullinput_grab_mouse(void *data, bool state)
|
||||
{
|
||||
(void)data;
|
||||
(void)state;
|
||||
}
|
||||
|
||||
static bool nullinput_set_rumble(void *data, unsigned port,
|
||||
enum retro_rumble_effect effect, uint16_t strength)
|
||||
{
|
||||
(void)data;
|
||||
(void)port;
|
||||
(void)effect;
|
||||
(void)strength;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
input_driver_t input_null = {
|
||||
nullinput_input_init,
|
||||
nullinput_input_poll,
|
||||
nullinput_input_state,
|
||||
nullinput_input_free_input,
|
||||
nullinput_set_sensor_state,
|
||||
NULL,
|
||||
nullinput_get_capabilities,
|
||||
"null",
|
||||
nullinput_grab_mouse,
|
||||
NULL,
|
||||
nullinput_set_rumble,
|
||||
NULL,
|
||||
NULL,
|
||||
false,
|
||||
};
|
@ -1,109 +0,0 @@
|
||||
/* RetroArch - A frontend for libretro.
|
||||
* Copyright (C) 2013-2014 - Jason Fetters
|
||||
* 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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "../input_defines.h"
|
||||
#include "../input_driver.h"
|
||||
#include "../include/hid_driver.h"
|
||||
|
||||
typedef struct null_hid
|
||||
{
|
||||
void *empty;
|
||||
} null_hid_t;
|
||||
|
||||
static bool null_hid_joypad_query(void *data, unsigned pad)
|
||||
{
|
||||
return pad < MAX_USERS;
|
||||
}
|
||||
|
||||
static const char *null_hid_joypad_name(void *data, unsigned pad)
|
||||
{
|
||||
/* TODO/FIXME - implement properly */
|
||||
if (pad >= MAX_USERS)
|
||||
return NULL;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static void null_hid_joypad_get_buttons(void *data,
|
||||
unsigned port, input_bits_t *state)
|
||||
{
|
||||
(void)data;
|
||||
(void)port;
|
||||
|
||||
BIT256_CLEAR_ALL_PTR(state);
|
||||
}
|
||||
|
||||
static bool null_hid_joypad_button(void *data, unsigned port, uint16_t joykey)
|
||||
{
|
||||
(void)data;
|
||||
(void)port;
|
||||
(void)joykey;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool null_hid_joypad_rumble(void *data, unsigned pad,
|
||||
enum retro_rumble_effect effect, uint16_t strength)
|
||||
{
|
||||
(void)data;
|
||||
(void)pad;
|
||||
(void)effect;
|
||||
(void)strength;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
static int16_t null_hid_joypad_axis(void *data, unsigned port, uint32_t joyaxis)
|
||||
{
|
||||
(void)data;
|
||||
(void)port;
|
||||
(void)joyaxis;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void *null_hid_init(void)
|
||||
{
|
||||
return (null_hid_t*)calloc(1, sizeof(null_hid_t));
|
||||
}
|
||||
|
||||
static void null_hid_free(const void *data)
|
||||
{
|
||||
null_hid_t *hid_null = (null_hid_t*)data;
|
||||
|
||||
if (hid_null)
|
||||
free(hid_null);
|
||||
}
|
||||
|
||||
static void null_hid_poll(void *data)
|
||||
{
|
||||
(void)data;
|
||||
}
|
||||
|
||||
hid_driver_t null_hid = {
|
||||
null_hid_init,
|
||||
null_hid_joypad_query,
|
||||
null_hid_free,
|
||||
null_hid_joypad_button,
|
||||
null_hid_joypad_get_buttons,
|
||||
null_hid_joypad_axis,
|
||||
null_hid_poll,
|
||||
null_hid_joypad_rumble,
|
||||
null_hid_joypad_name,
|
||||
"null",
|
||||
};
|
@ -1,74 +0,0 @@
|
||||
/* RetroArch - A frontend for libretro.
|
||||
* Copyright (C) 2010-2014 - Hans-Kristian Arntzen
|
||||
* Copyright (C) 2011-2017 - Daniel De Matteis
|
||||
* Copyright (C) 2013-2014 - CatalystG
|
||||
*
|
||||
* 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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stddef.h>
|
||||
#include <boolean.h>
|
||||
|
||||
#include "../input_driver.h"
|
||||
|
||||
static const char *null_joypad_name(unsigned pad)
|
||||
{
|
||||
return "null";
|
||||
}
|
||||
|
||||
static bool null_joypad_init(void *data)
|
||||
{
|
||||
(void)data;
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool null_joypad_button(unsigned port_num, uint16_t joykey)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
static void null_joypad_get_buttons(unsigned port_num, input_bits_t *state)
|
||||
{
|
||||
BIT256_CLEAR_ALL_PTR(state);
|
||||
}
|
||||
|
||||
static int16_t null_joypad_axis(unsigned port_num, uint32_t joyaxis)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void null_joypad_poll(void)
|
||||
{
|
||||
}
|
||||
|
||||
static bool null_joypad_query_pad(unsigned pad)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
static void null_joypad_destroy(void)
|
||||
{
|
||||
}
|
||||
|
||||
input_device_driver_t null_joypad = {
|
||||
null_joypad_init,
|
||||
null_joypad_query_pad,
|
||||
null_joypad_destroy,
|
||||
null_joypad_button,
|
||||
null_joypad_get_buttons,
|
||||
null_joypad_axis,
|
||||
null_joypad_poll,
|
||||
NULL,
|
||||
null_joypad_name,
|
||||
"null",
|
||||
};
|
@ -571,7 +571,6 @@ extern input_device_driver_t wiiu_joypad;
|
||||
extern input_device_driver_t hid_joypad;
|
||||
extern input_device_driver_t android_joypad;
|
||||
extern input_device_driver_t qnx_joypad;
|
||||
extern input_device_driver_t null_joypad;
|
||||
extern input_device_driver_t mfi_joypad;
|
||||
extern input_device_driver_t dos_joypad;
|
||||
extern input_device_driver_t rwebpad_joypad;
|
||||
@ -599,14 +598,12 @@ extern input_driver_t input_rwebinput;
|
||||
extern input_driver_t input_dos;
|
||||
extern input_driver_t input_winraw;
|
||||
extern input_driver_t input_wayland;
|
||||
extern input_driver_t input_null;
|
||||
|
||||
#ifdef HAVE_HID
|
||||
extern hid_driver_t iohidmanager_hid;
|
||||
extern hid_driver_t btstack_hid;
|
||||
extern hid_driver_t libusb_hid;
|
||||
extern hid_driver_t wiiusb_hid;
|
||||
extern hid_driver_t null_hid;
|
||||
#endif
|
||||
|
||||
typedef struct menu_input_ctx_line
|
||||
|
1240
intl/msg_hash_chs.h
1240
intl/msg_hash_chs.h
File diff suppressed because it is too large
Load Diff
@ -14,10 +14,6 @@ MSG_HASH(
|
||||
MSG_UNKNOWN_COMPILER,
|
||||
"未知的編譯器"
|
||||
)
|
||||
MSG_HASH(
|
||||
MSG_NATIVE,
|
||||
"Native"
|
||||
)
|
||||
MSG_HASH(
|
||||
MSG_DEVICE_DISCONNECTED_FROM_PORT,
|
||||
"設備已從連接口上移開"
|
||||
@ -568,10 +564,6 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_DIRECTORY_NOT_FOUND,
|
||||
"沒有找到文件夾。")
|
||||
MSG_HASH(MENU_ENUM_LABEL_VALUE_DIRECTORY_SETTINGS,
|
||||
"目錄")
|
||||
MSG_HASH(MENU_ENUM_LABEL_VALUE_DISK_CYCLE_TRAY_STATUS,
|
||||
"Disk Cycle Tray Status")
|
||||
MSG_HASH(MENU_ENUM_LABEL_VALUE_DISK_IMAGE_APPEND,
|
||||
"追加光碟鏡像")
|
||||
MSG_HASH(MENU_ENUM_LABEL_VALUE_DISK_INDEX,
|
||||
"光碟索引")
|
||||
MSG_HASH(MENU_ENUM_LABEL_VALUE_DISK_OPTIONS,
|
||||
@ -1569,8 +1561,6 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_ASPECT_RATIO_INDEX,
|
||||
"畫面比例選項")
|
||||
MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION,
|
||||
"黑色幀補間")
|
||||
MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_CROP_OVERSCAN,
|
||||
"Crop Overscan (Reload)")
|
||||
MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_DISABLE_COMPOSITION,
|
||||
"禁用桌面元素")
|
||||
#if defined(_3DS)
|
||||
@ -2042,8 +2032,6 @@ MSG_HASH(MSG_GAME_FOCUS_ON,
|
||||
"打開遊戲焦點")
|
||||
MSG_HASH(MSG_GAME_FOCUS_OFF,
|
||||
"取消遊戲焦點")
|
||||
MSG_HASH(MSG_HW_RENDERED_MUST_USE_POSTSHADED_RECORDING,
|
||||
"Libretro core is hardware rendered. Must use post-shaded recording as well.")
|
||||
MSG_HASH(MSG_INFLATED_CHECKSUM_DID_NOT_MATCH_CRC32,
|
||||
"比較檔案 CRC32 錯誤.")
|
||||
MSG_HASH(MSG_INPUT_CHEAT,
|
||||
@ -2220,10 +2208,6 @@ MSG_HASH(MENU_ENUM_SUBLABEL_AUDIO_LATENCY,
|
||||
"設定您想要的聲音延遲(毫秒). 假設預設的裝置無法支援設定值時該值可能無法成功套用.")
|
||||
MSG_HASH(MENU_ENUM_SUBLABEL_AUDIO_MUTE,
|
||||
"禁音/取消禁音。")
|
||||
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,
|
||||
"允許或禁止核心使用攝像頭。"
|
||||
@ -2236,10 +2220,6 @@ MSG_HASH(
|
||||
MENU_ENUM_SUBLABEL_INPUT_MAX_USERS,
|
||||
"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,
|
||||
"允許任何使用者去控制選單,如果取消,將只會有1個人可以控制選單."
|
||||
@ -2252,50 +2232,18 @@ MSG_HASH(
|
||||
MENU_ENUM_SUBLABEL_AUDIO_SYNC,
|
||||
"同步聲音。推薦。"
|
||||
)
|
||||
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_BIND_HOLD,
|
||||
"Amount of seconds to hold an input to bind it."
|
||||
)
|
||||
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,
|
||||
"同步顯卡的視訊輸出到營幕刷新率。推薦。"
|
||||
)
|
||||
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,
|
||||
"載入遊戲前檢查必要的韌體/BIOS是否存在."
|
||||
)
|
||||
MSG_HASH(
|
||||
MENU_ENUM_SUBLABEL_VIDEO_REFRESH_RATE,
|
||||
"Vertical refresh rate of your screen. Used to calculate a suitable audio input rate. NOTE: This will be ignored if 'Threaded Video' is enabled."
|
||||
)
|
||||
MSG_HASH(
|
||||
MENU_ENUM_SUBLABEL_AUDIO_ENABLE,
|
||||
"啟用聲音輸出。"
|
||||
)
|
||||
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,
|
||||
"已失敗"
|
||||
@ -2381,8 +2329,6 @@ MSG_HASH(MENU_ENUM_SUBLABEL_CONTENT_HISTORY_SIZE,
|
||||
"遊戲、圖片、音樂和視訊歷史記錄的數量限制。")
|
||||
MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_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,
|
||||
"顯示營幕消息。")
|
||||
MSG_HASH(MENU_ENUM_LABEL_VALUE_NETWORK_USER_REMOTE_ENABLE,
|
||||
@ -2642,8 +2588,6 @@ MSG_HASH(MSG_SCANNING_OF_FILE_FINISHED,
|
||||
"掃瞄檔案結束")
|
||||
MSG_HASH(MENU_ENUM_LABEL_VALUE_AUDIO_RESAMPLER_QUALITY,
|
||||
"聲音重採樣器品質")
|
||||
MSG_HASH(MENU_ENUM_SUBLABEL_AUDIO_RESAMPLER_QUALITY,
|
||||
"Lower this value to favor performance/lower latency over audio quality, increase if you want better audio quality at the expense of performance/lower latency.")
|
||||
MSG_HASH(MENU_ENUM_LABEL_VALUE_STATISTICS_SHOW,
|
||||
"顯示統計數字")
|
||||
MSG_HASH(MENU_ENUM_SUBLABEL_STATISTICS_SHOW,
|
||||
|
@ -42,10 +42,6 @@ MSG_HASH(
|
||||
MSG_UNKNOWN_COMPILER,
|
||||
"Unbekannter Compiler"
|
||||
)
|
||||
MSG_HASH(
|
||||
MSG_NATIVE,
|
||||
"Native"
|
||||
)
|
||||
MSG_HASH(
|
||||
MSG_DEVICE_DISCONNECTED_FROM_PORT,
|
||||
"Gerät von Anschluss getrennt"
|
||||
@ -601,10 +597,6 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_DIRECTORY_NOT_FOUND,
|
||||
"Verzeichnis nicht gefunden.")
|
||||
MSG_HASH(MENU_ENUM_LABEL_VALUE_DIRECTORY_SETTINGS,
|
||||
"Verzeichnisse")
|
||||
MSG_HASH(MENU_ENUM_LABEL_VALUE_DISK_CYCLE_TRAY_STATUS,
|
||||
"Datentägerstatus")
|
||||
MSG_HASH(MENU_ENUM_LABEL_VALUE_DISK_IMAGE_APPEND,
|
||||
"Füge Datenträgerabbild hinzu")
|
||||
MSG_HASH(MENU_ENUM_LABEL_VALUE_DISK_INDEX,
|
||||
"Datenträger-Nummer")
|
||||
MSG_HASH(MENU_ENUM_LABEL_VALUE_DISK_OPTIONS,
|
||||
@ -2360,8 +2352,6 @@ 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,
|
||||
@ -2607,18 +2597,10 @@ MSG_HASH(
|
||||
MENU_ENUM_LABEL_VALUE_BROWSE_URL,
|
||||
"URL-Pfad"
|
||||
)
|
||||
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,
|
||||
"Aktualisieren")
|
||||
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,
|
||||
"Kompatibler Inhalt gefunden")
|
||||
MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_CROP_OVERSCAN,
|
||||
@ -3040,14 +3022,8 @@ MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_INPUT_LATENCY_FRAMES_MIN,
|
||||
"Eingabeverzögerung in Einzelbildern, die im Netplay verwendet wird, um die Netzwerklatenz zu verbergen. Reduziert Bildruckeln und CPU-Last, verursacht jedoch erkennbare Eingabeverzögerung.")
|
||||
MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_INPUT_LATENCY_FRAMES_RANGE,
|
||||
"Der Bereich der Eingabeverzögerung in Einzelbildern, die im Netplay verwendet werden kann, um die Netzwerklatenz zu verbergen. Reduziert Bildruckeln und CPU-Last, verursacht jedoch unvorhersehbare Eingabeverzögerungen.")
|
||||
MSG_HASH(MENU_ENUM_SUBLABEL_DISK_CYCLE_TRAY_STATUS,
|
||||
"Datenträger auswerfen/einlegen. Wenn der Datenträger eingelegt ist, wird er ausgeworfen. Wenn er noch nicht eingelegt wurde, wird er jetzt eingelegt. ")
|
||||
MSG_HASH(MENU_ENUM_SUBLABEL_DISK_INDEX,
|
||||
"Ändere den Datenträger-Index.")
|
||||
MSG_HASH(MENU_ENUM_SUBLABEL_DISK_OPTIONS,
|
||||
"Verwaltung von Datenträger-Abbildern.")
|
||||
MSG_HASH(MENU_ENUM_SUBLABEL_DISK_IMAGE_APPEND,
|
||||
"Wähle ein Datenträger-Abbild, das eingelegt werden soll.")
|
||||
MSG_HASH(MENU_ENUM_SUBLABEL_MENU_ENUM_THROTTLE_FRAMERATE,
|
||||
"Stelle sicher, dass die Bildwiederholrate im Menü begrenzt wird.")
|
||||
MSG_HASH(MENU_ENUM_SUBLABEL_XMB_LAYOUT,
|
||||
@ -3198,8 +3174,6 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_ADD_TO_MIXER_AND_PLAY,
|
||||
"Add to mixer and play")
|
||||
MSG_HASH(MENU_ENUM_LABEL_VALUE_ADD_TO_MIXER_AND_COLLECTION,
|
||||
"zum Mixer hinzufügen")
|
||||
MSG_HASH(MENU_ENUM_LABEL_VALUE_ADD_TO_MIXER_AND_COLLECTION_AND_PLAY,
|
||||
"Add to mixer and play")
|
||||
MSG_HASH(MENU_ENUM_LABEL_VALUE_FILTER_BY_CURRENT_CORE,
|
||||
"Nach aktuellem Core filtern")
|
||||
MSG_HASH(
|
||||
@ -3611,22 +3585,6 @@ MSG_HASH(
|
||||
MENU_ENUM_LABEL_VALUE_STREAMING_URL,
|
||||
"Streaming URL"
|
||||
)
|
||||
MSG_HASH(
|
||||
MENU_ENUM_LABEL_VALUE_UDP_STREAM_PORT,
|
||||
"UDP Stream Port"
|
||||
)
|
||||
MSG_HASH(
|
||||
MENU_ENUM_LABEL_VALUE_ACCOUNTS_TWITCH,
|
||||
"Twitch"
|
||||
)
|
||||
MSG_HASH(
|
||||
MENU_ENUM_LABEL_VALUE_ACCOUNTS_YOUTUBE,
|
||||
"YouTube"
|
||||
)
|
||||
MSG_HASH(MENU_ENUM_LABEL_VALUE_TWITCH_STREAM_KEY,
|
||||
"Twitch Stream Key")
|
||||
MSG_HASH(MENU_ENUM_LABEL_VALUE_YOUTUBE_STREAM_KEY,
|
||||
"YouTube Stream Key")
|
||||
MSG_HASH(MENU_ENUM_LABEL_VALUE_STREAMING_MODE,
|
||||
"Streamingmodus")
|
||||
MSG_HASH(MENU_ENUM_LABEL_VALUE_STREAMING_TITLE,
|
||||
@ -3643,405 +3601,7 @@ MSG_HASH(
|
||||
MENU_ENUM_SUBLABEL_RESET_TO_DEFAULT_CONFIG,
|
||||
"Setzt die momentane Konfiguration auf die Standardwerte zurück."
|
||||
)
|
||||
MSG_HASH(
|
||||
MENU_ENUM_LABEL_VALUE_BASIC_MENU_CONTROLS_OK,
|
||||
"OK"
|
||||
)
|
||||
MSG_HASH(MENU_ENUM_LABEL_VALUE_OZONE_MENU_COLOR_THEME,
|
||||
"Menü-Farbschema")
|
||||
MSG_HASH(
|
||||
MENU_ENUM_LABEL_VALUE_OZONE_COLOR_THEME_BASIC_WHITE,
|
||||
"Basic White"
|
||||
)
|
||||
MSG_HASH(
|
||||
MENU_ENUM_LABEL_VALUE_OZONE_COLOR_THEME_BASIC_BLACK,
|
||||
"Basic Black"
|
||||
)
|
||||
MSG_HASH(
|
||||
MENU_ENUM_SUBLABEL_OZONE_MENU_COLOR_THEME,
|
||||
"Select a different color theme."
|
||||
)
|
||||
MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_USE_PREFERRED_SYSTEM_COLOR_THEME,
|
||||
"Use preferred system color theme")
|
||||
MSG_HASH(MENU_ENUM_SUBLABEL_MENU_USE_PREFERRED_SYSTEM_COLOR_THEME,
|
||||
"Use your operating system's color theme (if any) - overrides theme settings.")
|
||||
MSG_HASH(MSG_RESAMPLER_QUALITY_LOWEST,
|
||||
"Lowest")
|
||||
MSG_HASH(MSG_RESAMPLER_QUALITY_LOWER,
|
||||
"Lower")
|
||||
MSG_HASH(MSG_RESAMPLER_QUALITY_NORMAL,
|
||||
"Normal")
|
||||
MSG_HASH(MSG_RESAMPLER_QUALITY_HIGHER,
|
||||
"Higher")
|
||||
MSG_HASH(MSG_RESAMPLER_QUALITY_HIGHEST,
|
||||
"Highest")
|
||||
MSG_HASH(
|
||||
MENU_ENUM_LABEL_VALUE_NO_MUSIC_AVAILABLE,
|
||||
"No music available."
|
||||
)
|
||||
MSG_HASH(
|
||||
MENU_ENUM_LABEL_VALUE_NO_VIDEOS_AVAILABLE,
|
||||
"No videos available."
|
||||
)
|
||||
MSG_HASH(
|
||||
MENU_ENUM_LABEL_VALUE_NO_IMAGES_AVAILABLE,
|
||||
"No images available."
|
||||
)
|
||||
MSG_HASH(
|
||||
MENU_ENUM_LABEL_VALUE_NO_FAVORITES_AVAILABLE,
|
||||
"No favorites available."
|
||||
)
|
||||
MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_WINDOW_SAVE_POSITION,
|
||||
"Remember Window Position and Size")
|
||||
MSG_HASH(
|
||||
MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_COREAUDIO_SUPPORT,
|
||||
"CoreAudio support"
|
||||
)
|
||||
MSG_HASH(
|
||||
MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_COREAUDIO3_SUPPORT,
|
||||
"CoreAudio V3 support"
|
||||
)
|
||||
MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_WIDGETS_ENABLE,
|
||||
"Menu Widgets")
|
||||
MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADERS_ENABLE,
|
||||
"Video Shaders")
|
||||
MSG_HASH(MENU_ENUM_LABEL_VALUE_SCAN_WITHOUT_CORE_MATCH,
|
||||
"Scan without core match")
|
||||
MSG_HASH(MENU_ENUM_SUBLABEL_SCAN_WITHOUT_CORE_MATCH,
|
||||
"When disabled, content is only added to playlists if you have a core installed that supports its extension. By enabling this, it will add to playlist regardless. This way, you can install the core you need later on after scanning.")
|
||||
MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_XMB_ANIMATION_HORIZONTAL_HIGHLIGHT,
|
||||
"Animation Horizontal Icon Highlight")
|
||||
MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_XMB_ANIMATION_MOVE_UP_DOWN,
|
||||
"Animation Move Up/Down")
|
||||
MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_XMB_ANIMATION_OPENING_MAIN_MENU,
|
||||
"Animation Main Menu Opens/Closes")
|
||||
MSG_HASH(
|
||||
MENU_ENUM_LABEL_VALUE_DISC_INFORMATION,
|
||||
"Disc Information"
|
||||
)
|
||||
MSG_HASH(
|
||||
MENU_ENUM_SUBLABEL_DISC_INFORMATION,
|
||||
"View information about inserted media discs."
|
||||
)
|
||||
MSG_HASH(
|
||||
MENU_ENUM_LABEL_VALUE_FRONTEND_LOG_LEVEL,
|
||||
"Frontend Logging Level"
|
||||
)
|
||||
MSG_HASH(
|
||||
MENU_ENUM_SUBLABEL_FRONTEND_LOG_LEVEL,
|
||||
"Sets log level for the frontend. If a log level issued by the frontend is below this value, it is ignored."
|
||||
)
|
||||
MSG_HASH(MENU_ENUM_LABEL_VALUE_FPS_UPDATE_INTERVAL,
|
||||
"Framerate Update Interval (in frames)")
|
||||
MSG_HASH(MENU_ENUM_SUBLABEL_FPS_UPDATE_INTERVAL,
|
||||
"Framerate display will be updated at the set interval (in frames).")
|
||||
MSG_HASH(
|
||||
MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_RESTART_CONTENT,
|
||||
"Show Restart Content"
|
||||
)
|
||||
MSG_HASH(
|
||||
MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_RESTART_CONTENT,
|
||||
"Show/hide the 'Restart Content' option."
|
||||
)
|
||||
MSG_HASH(
|
||||
MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_CLOSE_CONTENT,
|
||||
"Show Close Content"
|
||||
)
|
||||
MSG_HASH(
|
||||
MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_CLOSE_CONTENT,
|
||||
"Show/hide the 'Close Content' option."
|
||||
)
|
||||
MSG_HASH(
|
||||
MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_RESUME_CONTENT,
|
||||
"Show Resume Content"
|
||||
)
|
||||
MSG_HASH(
|
||||
MENU_ENUM_SUBLABEL_QUICK_MENU_SHOW_RESUME_CONTENT,
|
||||
"Show/hide the 'Resume Content' option."
|
||||
)
|
||||
MSG_HASH(
|
||||
MENU_ENUM_LABEL_VALUE_SETTINGS_SHOW_INPUT,
|
||||
"Show Input"
|
||||
)
|
||||
MSG_HASH(
|
||||
MENU_ENUM_SUBLABEL_SETTINGS_SHOW_INPUT,
|
||||
"Show or hide 'Input Settings' on the Settings screen."
|
||||
)
|
||||
MSG_HASH(
|
||||
MENU_ENUM_LABEL_VALUE_AI_SERVICE_SETTINGS,
|
||||
"AI Service"
|
||||
)
|
||||
MSG_HASH(
|
||||
MENU_ENUM_SUBLABEL_AI_SERVICE_SETTINGS,
|
||||
"Change settings for the AI Service (Translation/TTS/Misc)."
|
||||
)
|
||||
MSG_HASH(MENU_ENUM_LABEL_VALUE_AI_SERVICE_MODE,
|
||||
"AI Service Output")
|
||||
MSG_HASH(MENU_ENUM_LABEL_VALUE_AI_SERVICE_URL,
|
||||
"AI Service URL")
|
||||
MSG_HASH(MENU_ENUM_LABEL_VALUE_AI_SERVICE_ENABLE,
|
||||
"AI Service Enabled")
|
||||
MSG_HASH(MENU_ENUM_SUBLABEL_AI_SERVICE_MODE,
|
||||
"Show translation as a text overlay (Image mode), or play as Text-To-Speech (Speech mode)")
|
||||
MSG_HASH(MENU_ENUM_SUBLABEL_AI_SERVICE_URL,
|
||||
"A http:// url pointing to the translation service to use.")
|
||||
MSG_HASH(MENU_ENUM_SUBLABEL_AI_SERVICE_ENABLE,
|
||||
"Enable AI Service to run when the AI Service hotkey is pressed.")
|
||||
MSG_HASH(MENU_ENUM_LABEL_VALUE_AI_SERVICE_TARGET_LANG,
|
||||
"Target Language")
|
||||
MSG_HASH(MENU_ENUM_SUBLABEL_AI_SERVICE_TARGET_LANG,
|
||||
"The language the service will translate to. If set to 'Don't Care', it will default to English.")
|
||||
MSG_HASH(MENU_ENUM_LABEL_VALUE_AI_SERVICE_SOURCE_LANG,
|
||||
"Source Language")
|
||||
MSG_HASH(MENU_ENUM_SUBLABEL_AI_SERVICE_SOURCE_LANG,
|
||||
"The language the service will translate from. If set to 'Don't Care', it will attempt to auto-detect the language. Setting it to a specific language will make the translation more accurate.")
|
||||
MSG_HASH(
|
||||
MENU_ENUM_LABEL_VALUE_LANG_CZECH,
|
||||
"Czech"
|
||||
)
|
||||
MSG_HASH(
|
||||
MENU_ENUM_LABEL_VALUE_LANG_DANISH,
|
||||
"Danish"
|
||||
)
|
||||
MSG_HASH(
|
||||
MENU_ENUM_LABEL_VALUE_LANG_SWEDISH,
|
||||
"Swedish"
|
||||
)
|
||||
MSG_HASH(
|
||||
MENU_ENUM_LABEL_VALUE_LANG_CROATIAN,
|
||||
"Croatian"
|
||||
)
|
||||
MSG_HASH(
|
||||
MENU_ENUM_LABEL_VALUE_LANG_CATALAN,
|
||||
"Catalan"
|
||||
)
|
||||
MSG_HASH(
|
||||
MENU_ENUM_LABEL_VALUE_LANG_BULGARIAN,
|
||||
"Bulgarian"
|
||||
)
|
||||
MSG_HASH(
|
||||
MENU_ENUM_LABEL_VALUE_LANG_BENGALI,
|
||||
"Bengali"
|
||||
)
|
||||
MSG_HASH(
|
||||
MENU_ENUM_LABEL_VALUE_LANG_BASQUE,
|
||||
"Basque"
|
||||
)
|
||||
MSG_HASH(
|
||||
MENU_ENUM_LABEL_VALUE_LANG_AZERBAIJANI,
|
||||
"Azerbaijani"
|
||||
)
|
||||
MSG_HASH(
|
||||
MENU_ENUM_LABEL_VALUE_LANG_ALBANIAN,
|
||||
"Albanian"
|
||||
)
|
||||
MSG_HASH(
|
||||
MENU_ENUM_LABEL_VALUE_LANG_AFRIKAANS,
|
||||
"Afrikaans"
|
||||
)
|
||||
MSG_HASH(
|
||||
MENU_ENUM_LABEL_VALUE_LANG_ESTONIAN,
|
||||
"Estonian"
|
||||
)
|
||||
MSG_HASH(
|
||||
MENU_ENUM_LABEL_VALUE_LANG_FILIPINO,
|
||||
"Filipino"
|
||||
)
|
||||
MSG_HASH(
|
||||
MENU_ENUM_LABEL_VALUE_LANG_FINNISH,
|
||||
"Finnish"
|
||||
)
|
||||
MSG_HASH(
|
||||
MENU_ENUM_LABEL_VALUE_LANG_GALICIAN,
|
||||
"Galician"
|
||||
)
|
||||
MSG_HASH(
|
||||
MENU_ENUM_LABEL_VALUE_LANG_GEORGIAN,
|
||||
"Georgian"
|
||||
)
|
||||
MSG_HASH(
|
||||
MENU_ENUM_LABEL_VALUE_LANG_GUJARATI,
|
||||
"Gujarati"
|
||||
)
|
||||
MSG_HASH(
|
||||
MENU_ENUM_LABEL_VALUE_LANG_HAITIAN_CREOLE,
|
||||
"Haitian Creole"
|
||||
)
|
||||
MSG_HASH(
|
||||
MENU_ENUM_LABEL_VALUE_LANG_HEBREW,
|
||||
"Hebrew"
|
||||
)
|
||||
MSG_HASH(
|
||||
MENU_ENUM_LABEL_VALUE_LANG_HINDI,
|
||||
"Hindi"
|
||||
)
|
||||
MSG_HASH(
|
||||
MENU_ENUM_LABEL_VALUE_LANG_HUNGARIAN,
|
||||
"Hungarian"
|
||||
)
|
||||
MSG_HASH(
|
||||
MENU_ENUM_LABEL_VALUE_LANG_ICELANDIC,
|
||||
"Icelandic"
|
||||
)
|
||||
MSG_HASH(
|
||||
MENU_ENUM_LABEL_VALUE_LANG_INDONESIAN,
|
||||
"Indonesian"
|
||||
)
|
||||
MSG_HASH(
|
||||
MENU_ENUM_LABEL_VALUE_LANG_IRISH,
|
||||
"Irish"
|
||||
)
|
||||
MSG_HASH(
|
||||
MENU_ENUM_LABEL_VALUE_LANG_KANNADA,
|
||||
"Kannada"
|
||||
)
|
||||
MSG_HASH(
|
||||
MENU_ENUM_LABEL_VALUE_LANG_LATIN,
|
||||
"Latin"
|
||||
)
|
||||
MSG_HASH(
|
||||
MENU_ENUM_LABEL_VALUE_LANG_LATVIAN,
|
||||
"Latvian"
|
||||
)
|
||||
MSG_HASH(
|
||||
MENU_ENUM_LABEL_VALUE_LANG_LITHUANIAN,
|
||||
"Lithuanian"
|
||||
)
|
||||
MSG_HASH(
|
||||
MENU_ENUM_LABEL_VALUE_LANG_MACEDONIAN,
|
||||
"Macedonian"
|
||||
)
|
||||
MSG_HASH(
|
||||
MENU_ENUM_LABEL_VALUE_LANG_MALAY,
|
||||
"Malay"
|
||||
)
|
||||
MSG_HASH(
|
||||
MENU_ENUM_LABEL_VALUE_LANG_MALTESE,
|
||||
"Maltese"
|
||||
)
|
||||
MSG_HASH(
|
||||
MENU_ENUM_LABEL_VALUE_LANG_NORWEGIAN,
|
||||
"Norwegian"
|
||||
)
|
||||
MSG_HASH(
|
||||
MENU_ENUM_LABEL_VALUE_LANG_PERSIAN,
|
||||
"Persian"
|
||||
)
|
||||
MSG_HASH(
|
||||
MENU_ENUM_LABEL_VALUE_LANG_ROMANIAN,
|
||||
"Romanian"
|
||||
)
|
||||
MSG_HASH(
|
||||
MENU_ENUM_LABEL_VALUE_LANG_SERBIAN,
|
||||
"Serbian"
|
||||
)
|
||||
MSG_HASH(
|
||||
MENU_ENUM_LABEL_VALUE_LANG_SLOVAK,
|
||||
"Slovak"
|
||||
)
|
||||
MSG_HASH(
|
||||
MENU_ENUM_LABEL_VALUE_LANG_SLOVENIAN,
|
||||
"Slovenian"
|
||||
)
|
||||
MSG_HASH(
|
||||
MENU_ENUM_LABEL_VALUE_LANG_SWAHILI,
|
||||
"Swahili"
|
||||
)
|
||||
MSG_HASH(
|
||||
MENU_ENUM_LABEL_VALUE_LANG_TAMIL,
|
||||
"Tamil"
|
||||
)
|
||||
MSG_HASH(
|
||||
MENU_ENUM_LABEL_VALUE_LANG_TELUGU,
|
||||
"Telugu"
|
||||
)
|
||||
MSG_HASH(
|
||||
MENU_ENUM_LABEL_VALUE_LANG_THAI,
|
||||
"Thai"
|
||||
)
|
||||
MSG_HASH(
|
||||
MENU_ENUM_LABEL_VALUE_LANG_UKRAINIAN,
|
||||
"Ukrainian"
|
||||
)
|
||||
MSG_HASH(
|
||||
MENU_ENUM_LABEL_VALUE_LANG_URDU,
|
||||
"Urdu"
|
||||
)
|
||||
MSG_HASH(
|
||||
MENU_ENUM_LABEL_VALUE_LANG_WELSH,
|
||||
"Welsh"
|
||||
)
|
||||
MSG_HASH(
|
||||
MENU_ENUM_LABEL_VALUE_LANG_YIDDISH,
|
||||
"Yiddish"
|
||||
)
|
||||
MSG_HASH(MENU_ENUM_SUBLABEL_LOAD_DISC,
|
||||
"Load a physical media disc. You should first select the core (Load Core) you intend to use with the disc.")
|
||||
MSG_HASH(MENU_ENUM_SUBLABEL_DUMP_DISC,
|
||||
"Dump the physical media disc to internal storage. It will be saved as an image file.")
|
||||
MSG_HASH(
|
||||
MENU_ENUM_LABEL_VALUE_AI_SERVICE_IMAGE_MODE,
|
||||
"Image Mode"
|
||||
)
|
||||
MSG_HASH(
|
||||
MENU_ENUM_LABEL_VALUE_AI_SERVICE_SPEECH_MODE,
|
||||
"Speech Mode"
|
||||
)
|
||||
MSG_HASH(
|
||||
MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_REMOVE,
|
||||
"Remove")
|
||||
MSG_HASH(
|
||||
MENU_ENUM_SUBLABEL_VIDEO_SHADER_PRESET_REMOVE,
|
||||
"Remove shader presets of a specific type.")
|
||||
MSG_HASH(
|
||||
MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_REMOVE_GLOBAL,
|
||||
"Remove Global Preset")
|
||||
MSG_HASH(
|
||||
MENU_ENUM_SUBLABEL_VIDEO_SHADER_PRESET_REMOVE_GLOBAL,
|
||||
"Remove the Global Preset, used by all content and all cores.")
|
||||
MSG_HASH(
|
||||
MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_REMOVE_CORE,
|
||||
"Remove Core Preset")
|
||||
MSG_HASH(
|
||||
MENU_ENUM_SUBLABEL_VIDEO_SHADER_PRESET_REMOVE_CORE,
|
||||
"Remove the Core Preset, used by all content ran with the currently loaded core.")
|
||||
MSG_HASH(
|
||||
MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_REMOVE_PARENT,
|
||||
"Remove Content Directory Preset")
|
||||
MSG_HASH(
|
||||
MENU_ENUM_SUBLABEL_VIDEO_SHADER_PRESET_REMOVE_PARENT,
|
||||
"Remove the Content Directory Preset, used by all content inside the current working directory.")
|
||||
MSG_HASH(
|
||||
MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_REMOVE_GAME,
|
||||
"Remove Game Preset")
|
||||
MSG_HASH(
|
||||
MENU_ENUM_SUBLABEL_VIDEO_SHADER_PRESET_REMOVE_GAME,
|
||||
"Remove the Game Preset, used only for the specific game in question.")
|
||||
MSG_HASH(MENU_ENUM_LABEL_VALUE_FRAME_TIME_COUNTER_SETTINGS,
|
||||
"Frame Time Counter")
|
||||
MSG_HASH(MENU_ENUM_SUBLABEL_FRAME_TIME_COUNTER_SETTINGS,
|
||||
"Adjust settings influencing the frame time counter (only active when threaded video is disabled).")
|
||||
MSG_HASH(MENU_ENUM_SUBLABEL_MENU_WIDGETS_ENABLE,
|
||||
"Use modern decorated animations, notifications, indicators and controls instead of the old text only system.")
|
||||
MSG_HASH(MENU_ENUM_LABEL_VALUE_DELETE_PLAYLIST,
|
||||
"Wiedergabeliste löschen")
|
||||
#ifdef HAVE_LAKKA
|
||||
MSG_HASH(MENU_ENUM_LABEL_VALUE_LOCALAP_ENABLE,
|
||||
"Wi-Fi Access Point")
|
||||
MSG_HASH(MENU_ENUM_SUBLABEL_LOCALAP_ENABLE,
|
||||
"Enable or disable Wi-Fi Access Point.")
|
||||
MSG_HASH(MSG_LOCALAP_SWITCHING_OFF,
|
||||
"Switching off Wi-Fi Access Point.")
|
||||
MSG_HASH(MSG_WIFI_DISCONNECT_FROM,
|
||||
"Disconnecting from Wi-Fi '%s'")
|
||||
MSG_HASH(MSG_LOCALAP_ALREADY_RUNNING,
|
||||
"Wi-Fi Access Point is already started")
|
||||
MSG_HASH(MSG_LOCALAP_NOT_RUNNING,
|
||||
"Wi-Fi Access Point is not running")
|
||||
MSG_HASH(MSG_LOCALAP_STARTING,
|
||||
"Starting Wi-Fi Access Point with SSID=%s and Passkey=%s")
|
||||
MSG_HASH(MSG_LOCALAP_ERROR_CONFIG_CREATE,
|
||||
"Could not create Wi-Fi Access Point configuration file.")
|
||||
MSG_HASH(MSG_LOCALAP_ERROR_CONFIG_PARSE,
|
||||
"Wrong configuration file - could not find APNAME or PASSWORD in %s")
|
||||
#endif
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user