update and merge to current Retroarch version

This commit is contained in:
ceb33 2018-05-05 12:59:04 +02:00
commit 67784c85cf
702 changed files with 38142 additions and 13586 deletions

View File

@ -10,7 +10,7 @@ matrix:
- g++-mingw-w64-i686
- mingw-w64-i686-dev
script:
- CROSS_COMPILE=i686-w64-mingw32- ./configure --disable-d3d8 --disable-d3d9 --disable-d3d10 --disable-d3d11 --disable-d3d12 && make HAVE_ZLIB=1 HAVE_BUILTINZLIB=1 HAVE_RPNG=1
- CROSS_COMPILE=i686-w64-mingw32- CFLAGS="-D_WIN32_WINNT=0x0501" ./configure --disable-d3d8 --disable-d3d9 --disable-d3d10 --disable-d3d11 --disable-d3d12 && make HAVE_ZLIB=1 HAVE_BUILTINZLIB=1 HAVE_RPNG=1
- compiler: mingw-x64
addons:
apt:
@ -18,7 +18,7 @@ matrix:
- g++-mingw-w64-x86-64
- mingw-w64-x86-64-dev
script:
- CROSS_COMPILE=x86_64-w64-mingw32- ./configure --disable-d3d8 --disable-d3d9 --disable-d3d10 --disable-d3d11 --disable-d3d12 && make HAVE_ZLIB=1 HAVE_BUILTINZLIB=1 HAVE_RPNG=1
- CROSS_COMPILE=x86_64-w64-mingw32- CFLAGS="-D_WIN32_WINNT=0x0501" ./configure --disable-d3d8 --disable-d3d9 --disable-d3d10 --disable-d3d11 --disable-d3d12 && make HAVE_ZLIB=1 HAVE_BUILTINZLIB=1 HAVE_RPNG=1
- compiler: gcc
- compiler: clang
addons:
@ -64,3 +64,5 @@ addons:
build_command_prepend: "./configure; make clean"
build_command: "make"
branch_pattern: coverity_scan
notifications:
email: false

View File

@ -1,125 +1,127 @@
{
"configurations": [
{
"name": "Mac",
"includePath": [
"/usr/include",
"/usr/local/include",
"${workspaceRoot}"
],
"defines": [],
"intelliSenseMode": "clang-x64",
"browse": {
"path": [
"/usr/include",
"/usr/local/include",
"${workspaceRoot}"
],
"limitSymbolsToIncludedHeaders": true,
"databaseFilename": ""
},
"macFrameworkPath": [
"/System/Library/Frameworks",
"/Library/Frameworks"
]
},
{
"name": "Linux",
"includePath": [
"/usr/include",
"/usr/local/include",
"${workspaceRoot}"
],
"defines": [],
"intelliSenseMode": "clang-x64",
"browse": {
"path": [
"/usr/include",
"/usr/local/include",
"${workspaceRoot}"
],
"limitSymbolsToIncludedHeaders": true,
"databaseFilename": ""
}
},
{
"name": "Win32",
"includePath": [
"C:/Program Files (x86)/Windows Kits/10/Include/10.0.15063.0/um",
"C:/Program Files (x86)/Windows Kits/10/Include/10.0.15063.0/ucrt",
"C:/Program Files (x86)/Windows Kits/10/Include/10.0.15063.0/shared",
"C:/Program Files (x86)/Windows Kits/10/Include/10.0.15063.0/winrt",
"${workspaceRoot}"
],
"defines": [
"_DEBUG",
"UNICODE"
],
"intelliSenseMode": "msvc-x64",
"browse": {
"path": [
"C:/Program Files (x86)/Windows Kits/10/Include/10.0.15063.0/um",
"C:/Program Files (x86)/Windows Kits/10/Include/10.0.15063.0/ucrt",
"C:/Program Files (x86)/Windows Kits/10/Include/10.0.15063.0/shared",
"C:/Program Files (x86)/Windows Kits/10/Include/10.0.15063.0/winrt",
"${workspaceRoot}"
],
"limitSymbolsToIncludedHeaders": true,
"databaseFilename": ""
}
},
{
"name": "msys2-mingw32",
"includePath": [
"C:/msys64/mingw32/include",
"C:/msys64/mingw32/i686-w64-mingw32/include",
"${workspaceRoot}/libretro-common/include",
"${workspaceRoot}/include",
"${workspaceRoot}"
],
"defines": [
"_DEBUG",
"UNICODE"
],
"intelliSenseMode": "msvc-x64",
"browse": {
"path": [
"C:/msys64/mingw32/include",
"C:/msys64/mingw32/i686-w64-mingw32/include",
"${workspaceRoot}/libretro-common/include",
"${workspaceRoot}/include",
"${workspaceRoot}"
],
"limitSymbolsToIncludedHeaders": true,
"databaseFilename": ""
}
},
{
"name": "msys2-mingw64",
"includePath": [
"C:/msys64/mingw64/include",
"C:/msys64/mingw64/x86_64-w64-mingw32/include",
"${workspaceRoot}/libretro-common/include",
"${workspaceRoot}/include",
"${workspaceRoot}"
],
"defines": [
"_DEBUG",
"UNICODE"
],
"intelliSenseMode": "msvc-x64",
"browse": {
"path": [
"C:/msys64/mingw64/include",
"C:/msys64/mingw64/x86_64-w64-mingw32/include",
"${workspaceRoot}/libretro-common/include",
"${workspaceRoot}/include",
"${workspaceRoot}"
],
"limitSymbolsToIncludedHeaders": true,
"databaseFilename": ""
}
}
],
"version": 3
{
"configurations": [
{
"name": "Mac",
"includePath": [
"/usr/include",
"/usr/local/include",
"${workspaceRoot}"
],
"defines": [],
"intelliSenseMode": "clang-x64",
"browse": {
"path": [
"/usr/include",
"/usr/local/include",
"${workspaceRoot}"
],
"limitSymbolsToIncludedHeaders": true,
"databaseFilename": ""
},
"macFrameworkPath": [
"/System/Library/Frameworks",
"/Library/Frameworks"
]
},
{
"name": "Linux",
"includePath": [
"/usr/include",
"/usr/local/include",
"${workspaceRoot}"
],
"defines": [],
"intelliSenseMode": "clang-x64",
"browse": {
"path": [
"/usr/include",
"/usr/local/include",
"${workspaceRoot}"
],
"limitSymbolsToIncludedHeaders": true,
"databaseFilename": ""
}
},
{
"name": "Win32",
"includePath": [
"C:/Program Files (x86)/Windows Kits/10/Include/10.0.15063.0/um",
"C:/Program Files (x86)/Windows Kits/10/Include/10.0.15063.0/ucrt",
"C:/Program Files (x86)/Windows Kits/10/Include/10.0.15063.0/shared",
"C:/Program Files (x86)/Windows Kits/10/Include/10.0.15063.0/winrt",
"${workspaceRoot}"
],
"defines": [
"_DEBUG",
"UNICODE"
],
"intelliSenseMode": "msvc-x64",
"browse": {
"path": [
"C:/Program Files (x86)/Windows Kits/10/Include/10.0.15063.0/um",
"C:/Program Files (x86)/Windows Kits/10/Include/10.0.15063.0/ucrt",
"C:/Program Files (x86)/Windows Kits/10/Include/10.0.15063.0/shared",
"C:/Program Files (x86)/Windows Kits/10/Include/10.0.15063.0/winrt",
"${workspaceRoot}"
],
"limitSymbolsToIncludedHeaders": true,
"databaseFilename": ""
},
"cStandard": "c11",
"cppStandard": "c++17"
},
{
"name": "msys2-mingw32",
"includePath": [
"C:/msys64/mingw32/include",
"C:/msys64/mingw32/i686-w64-mingw32/include",
"${workspaceRoot}/libretro-common/include",
"${workspaceRoot}/include",
"${workspaceRoot}"
],
"defines": [
"_DEBUG",
"UNICODE"
],
"intelliSenseMode": "msvc-x64",
"browse": {
"path": [
"C:/msys64/mingw32/include",
"C:/msys64/mingw32/i686-w64-mingw32/include",
"${workspaceRoot}/libretro-common/include",
"${workspaceRoot}/include",
"${workspaceRoot}"
],
"limitSymbolsToIncludedHeaders": true,
"databaseFilename": ""
}
},
{
"name": "msys2-mingw64",
"includePath": [
"C:/msys64/mingw64/include",
"C:/msys64/mingw64/x86_64-w64-mingw32/include",
"${workspaceRoot}/libretro-common/include",
"${workspaceRoot}/include",
"${workspaceRoot}"
],
"defines": [
"_DEBUG",
"UNICODE"
],
"intelliSenseMode": "msvc-x64",
"browse": {
"path": [
"C:/msys64/mingw64/include",
"C:/msys64/mingw64/x86_64-w64-mingw32/include",
"${workspaceRoot}/libretro-common/include",
"${workspaceRoot}/include",
"${workspaceRoot}"
],
"limitSymbolsToIncludedHeaders": true,
"databaseFilename": ""
}
}
],
"version": 3
}

43
.vscode/launch.json vendored
View File

@ -5,44 +5,41 @@
"version": "0.2.0",
"configurations": [
{
"name": "msys2-mingw64 debug",
"name": "(gdb) Launch",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/retroarch.exe",
"args": [],
"args": ["-v"],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": true,
"externalConsole": false,
"MIMode": "gdb",
"miDebuggerPath": "c:\\msys64\\mingw64\\bin\\gdb.exe",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
]
},
{
"name": "msys2-mingw32 debug",
{
"name": "(gdb) Attach",
"type": "cppdbg",
"request": "launch",
"request": "attach",
"program": "${workspaceFolder}/retroarch.exe",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": true,
"processId": "${command:pickProcess}",
"MIMode": "gdb",
"miDebuggerPath": "c:\\msys64\\mingw32\\bin\\gdb.exe",
"miDebuggerPath": "c:\\msys64\\mingw64\\bin\\gdb.exe",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
]
}
},
]
}

View File

@ -14,4 +14,5 @@
"*.in": "c",
"*.rh": "c"
},
"C_Cpp.dimInactiveRegions": false,
}

View File

@ -1,22 +1,75 @@
# 1.7.2 (future)
# 1.7.4 (future)
# 1.7.3
- AUDIO: Audio mixer supports FLAC/MP3 file types now!
- COMMON: Fixed bug 'crashing in cores that don't range check retro_set_controller_type'. Some people were having crashes when device is set to RETRO_DEVICE_NONE and the cores don't check the number of ports, in VBAM's case it was overflowing and crashing. QuickNES was crashing too.
- COMMON: Fixed buffer overflow in url encoding (affecting MSVC2010/2013).
- COMMON: (QuickMenu) Added Configuration Override submenu.
- HID: Merge new HID subsystem.
- HID: Fix WaveBird support for the Wii U GCA.
- HID/OSX: Fix regression with IODHIDManager - gamepads which are connected later would not be autoconfigured.
- LOCALIZATION: Update Italian translation.
- LOCALIZATION: Update Japanese translation.
- LOCALIZATION: Update Portuguese translation.
- MENU: New WIMP Qt GUI!
- MENU: Audio mixer now works in the menu without any cores loaded. You have to enable the setting 'Enable menu audio' for this to work.
- REMAPPING/OVERLAYS: Fix regression - overlays could no longer be remapped.
- SCANNER: Add Wii Backup File WBFS support.
- X11: CRT SwitchRes support for X11/Linux.
# 1.7.2
- ANDROID/OPENSL: Prevent crashes when setting audio latency too low (buffer count can never be lower than 2 now).
- CRT: Added CRT SwitchRes.
- COMMON: Hide the 'Core delete' option if the 'Core updater' is also hidden.
- COMMON: Add way to reset core association for playlist entry.
- COMMON: Fix invalid long command line options causing infinite loop on Windows
- COMMON: Add OSD statistics for video/audio/core.
- COMMON: Added runahead system; allows you to drive down latency even further.
- COMMON: Fix buggy behavior that could happen with ZIP file reading on some platforms as a result of not initializing struct.
- CHEEVOS: Support Atari 2600, Virtual Boy, and Arcade (only Neo Geo, CPS-1, CPS-2 and CPS-3 and only with fbalpha core).
- CHEEVOS: Add option to automatically take a screenshot when an achievement is triggered.
- D3D11: Experimental hardware renderer. Allows for libretro cores to use D3D11 for hardware rendering.
- CHEEVOS: Fixed incompatibilities with Neo Geo Pocket achievement sets.
- CHEEVOS: Store only login token, not password.
- D3D10: Added D3D10 driver to release build. Has working shaders (Slang), overlay, and menu display driver support. Should be on par capabilities wise
with D3D11 driver except for there being no hardware rendering right now.
- D3D11: Experimental hardware renderer. Allows for libretro cores to use D3D11 for hardware rendering. First core to use this is PPSSPP.
- D3D11: Increase backwards compatibility, shaders compile with Shader Model 4.0 now, added support for more feature levels.
- D3D10/D3D11/D3D12: Fix crashes with completely black or white thumbnail textures in XMB.
- GUI: Support disabling window decorations on Windows and Linux.
- LIBRETRO: Addition - Functions to enable and disable audio and video, and an environment function to query status of audio and video enables.
- LOCALIZATION: Update Italian translation.
- LOCALIZATION: Update Polish translation.
- MENU: Disable XMB shadow icons by default for PowerPC and ARM for performance reasons.
- MENU: Add Rewind/Latency/Overlay settings to Quick Menu, add options to show/hide them (User Interface -> Views -> Quick Menu)
- MENU/RGUI: Only show Menu Linear Filter for RGUI and only show it for
video drivers that implement it (D3D8/9/10/11/12/GL)
- MENU/RGUI: Add User Interface -> Appearance options.
- MENU/RGUI: D3D8/D3D9: Hookup Menu Linear Filter
- MENU/XMB: Disable XMB shadow icons by default for PowerPC and ARM for performance reasons.
- MENU/XMB: Left/right thumbnails are now automatically scaled according to layout.
- MENU/XMB: Add Left Thumbnails (additional to the right).
- MENU/XMB: Fixed left/right tab regression.
- MENU/XMB: Fix scaling of tall images that were cut on bottom previously.
- MENU/XMB: Menu scale factor setting now changes texts length, image scaling and margins.
- MENU/XMB: Mouse cursor scales correctly now.
- MENU/XMB: Add toggle to show/hide Playlist tabs.
- MENU/XMB: Add menu layout - can switch between Desktop, Handheld and Auto.
- MENU/XMB: Don't load menu pipeline shaders unless XMB is selected (D3D10/D3D11/D3D12/GL/Vulkan)
- MENU/VIDEO: Only show black frame insertion for the video drivers/context drivers
that support it (so far this includes - D3D8/D3D9, OpenGL, Vulkan)
- MENU/VIDEO: Only show max swapchain images if supported by video driver and/or context driver (so far this includes - DRM EGL context driver, VideoCore EGL context driver, Vulkan)
- MENU/MaterialUI: Automatic DPI Scaling should be much improved now, now scales as expected at 1440p and 4K resolutions.
- MENU/MaterialUI: Fix wrong calculation of an entry height causing long playlists to end up outside of screen range. This also could cause crashes on low DPI screens.
- IOS: Fixed crash when opening downloaded roms from Safari or using the "Open in.." functionality. Added the compiler flag to support keyboard remapping to controls.
- IOS: Fixed buffer overlap that caused a crash while trying to download GLSL shaders from the buildbot.
- PS3: fix URLS
- REMAPS: Mapping keyboard keys from more than one gamepad (works with dosbox)
- REMAPS: Mapping more than one button to the same action
- REMAPS: Unmapping buttons
- REMAPS: Unmapping analogs
- REMAPS: Mapping a button to trigger an analog response (tested with mupen, can run on SM64 with the d-pad now, triggers a full analog tilt)
- REMAPS: Mapping an analog to another analog (having more than one analog mapped to the same output causes issues)
- REMAPS: Mapping an analog to produce a button response
- SCANNER: Should be able to scan dual-layer Wii disc images now, filestream code now supports files larger than 4GB.
- SHADERS/SLANG: Slang shaders should work again on Android version and MSVC versions (basically all the Griffin-based versions).
- SHADERS: If GL context is GLES2/3/Core context, Cg shaders are unavailable. Applies to shader list too.
- SHADERS: Hide cg/glsl shaders from being able to be selected if D3D8/9/10/11/Vulkan video drivers are selected.
@ -27,8 +80,10 @@
- VULKAN/X11: Fix X11 Vulkan bug from Wayland driver.
- VULKAN: Fix multi-line text spacing in menus with Vulkan driver.
- WINDOWS XP: Add Cheevos support.
- WINDOWS/MSVC 2005: Add Cheevos support.
- WINDOWS/MSVC 2003/2005/2010/2013/2015/2017: Add Cheevos support.
- VITA: Bugfix for 'PS Vita takes many time to start to accept input' issue.
- X11: Allow compositor disabling on X11 fullscreen through _NET_WM_BYPASS_COMPOSITOR
- X11: Prioritize _NET_WM_STATE_FULLSCREEN_ in true fullscreen mode
- WIIU: Fix OOB read/write in keyboard driver.
# 1.7.1
@ -69,9 +124,8 @@
- LOCALIZATION: Update Spanish translation.
- NETPLAY: Add menu option to select different MITM (relay) server locations.
- OSX: Modify HID buttons detection algorithm.
- QB: Added --datarootdir.
- QB: Added --bindir and --mandir and deprecated --with-bin_dir and --with-man_dir.
- QB: Added --docdir.
- QB: Added --datarootdir, --sysconfdir, --bindir, --docdir and --mandir.
- QB: Deprecated --global-config-dir, --with-bin_dir and --with-man_dir.
- SHADERS: Allow saving of shader presets based on the parent directory (Saving one for */foo/bar/mario.sfc* would result in *shaders/presets/corename/bar.ext*). We decided it's safer to still isolate the presets to a single core because different cores may treat video output differently.
- SHADERS: Don't save the path to the current preset to the main config. This was causing weird behavior, instead it will try to load *currentconfig.ext* and it will save a preset with that name when select *apply shader preset*. The resulting shader will restore properly after restarting and even after core/parent/game specific presets are loaded
- SOLARIS: Initial port.

View File

@ -46,7 +46,7 @@ endif
include Makefile.common
ifeq ($(shell $(CC) -v 2>&1 | grep -c "clang"),1)
DEFINES += -Wno-invalid-source-encoding
DEFINES += -Wno-invalid-source-encoding -Wno-incompatible-ms-struct
endif
ifeq ($(shell $(CC) -v 2>&1 | grep -c "tcc"),1)
@ -92,21 +92,22 @@ APPEND_CFLAGS := $(CFLAGS)
CXXFLAGS += $(APPEND_CFLAGS) -std=c++11 -D__STDC_CONSTANT_MACROS
OBJCFLAGS := $(CFLAGS) -D__STDC_CONSTANT_MACROS
ifeq ($(CXX_BUILD), 1)
LINK = $(CXX)
CFLAGS := $(CXXFLAGS) -xc++
CFLAGS += -DCXX_BUILD
CXXFLAGS += -DCXX_BUILD
else
ifeq ($(NEED_CXX_LINKER),1)
ifeq ($(HAVE_CXX), 1)
ifeq ($(CXX_BUILD), 1)
LINK = $(CXX)
CFLAGS := $(CXXFLAGS) -xc++
CFLAGS += -DCXX_BUILD
CXXFLAGS += -DCXX_BUILD
else ifeq ($(NEED_CXX_LINKER),1)
LINK = $(CXX)
else ifeq ($(findstring Win32,$(OS)),)
LINK = $(CC)
else
# directx-related code is c++
LINK = $(CXX)
LINK = $(CC)
endif
else
LINK = $(CC)
endif
ifneq ($(CXX_BUILD), 1)
ifneq ($(GNU90_BUILD), 1)
ifneq ($(findstring icc,$(CC)),)
CFLAGS += -std=c99 -D_GNU_SOURCE
@ -133,7 +134,7 @@ RARCH_OBJ := $(addprefix $(OBJDIR)/,$(OBJ))
ifneq ($(X86),)
CFLAGS += -m32
CXXLAGS += -m32
CXXFLAGS += -m32
LDFLAGS += -m32
endif
@ -150,8 +151,29 @@ ifneq ($(findstring $(GPERFTOOLS),tcmalloc),)
LIBS += -ltcmalloc
endif
# Qt MOC generation, required for QObject-derived classes
ifneq ($(MOC_HEADERS),)
# prefix moc_ to base filename of paths and change extension from h to cpp, so a/b/foo.h becomes a/b/moc_foo.cpp
MOC_SRC := $(join $(addsuffix moc_,$(addprefix $(OBJDIR)/,$(dir $(MOC_HEADERS)))), $(notdir $(MOC_HEADERS:.h=.cpp)))
MOC_OBJ := $(patsubst %.cpp,%.o,$(MOC_SRC))
RARCH_OBJ += $(MOC_OBJ)
endif
all: $(TARGET) config.mk
$(MOC_SRC):
@$(if $(Q), $(shell echo echo MOC $<),)
$(eval MOC_TMP := $(patsubst %.h,%_moc.cpp,$@))
$(Q)$(MOC) -o $(MOC_TMP) $<
$(foreach x,$(join $(addsuffix :,$(MOC_SRC)),$(MOC_HEADERS)),$(eval $x))
$(MOC_OBJ):
@$(if $(Q), $(shell echo echo CXX $<),)
$(Q)$(CXX) $(CPPFLAGS) $(CXXFLAGS) $(DEFINES) -MMD -c -o $@ $<
$(foreach x,$(join $(addsuffix :,$(MOC_OBJ)),$(MOC_SRC)),$(eval $x))
ifeq ($(MAKECMDGOALS),clean)
config.mk:
else
@ -250,3 +272,6 @@ clean:
rm -f *.d
.PHONY: all install uninstall clean
print-%:
@echo '$*=$($*)'

View File

@ -147,6 +147,8 @@ ifneq ($(GIT_VERSION),)
endif
# General object files
DEFINES += -DHAVE_DR_MP3
CFLAGS += -DHAVE_DR_MP3
OBJ += frontend/frontend.o \
frontend/frontend_driver.o \
@ -198,12 +200,15 @@ OBJ += frontend/frontend.o \
$(LIBRETRO_COMM_DIR)/hash/rhash.o \
audio/audio_driver.o \
$(LIBRETRO_COMM_DIR)/audio/audio_mixer.o \
input/common/input_common.o \
input/input_driver.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_driver.o \
gfx/video_crt_switch.o \
camera/camera_driver.o \
wifi/wifi_driver.o \
location/location_driver.o \
@ -258,7 +263,18 @@ OBJ += frontend/frontend.o \
record/drivers/record_null.o \
$(LIBRETRO_COMM_DIR)/features/features_cpu.o \
performance_counters.o \
verbosity.o
verbosity.o \
ifeq ($(HAVE_RUNAHEAD), 1)
DEFINES += -DHAVE_RUNAHEAD
OBJ += runahead/copy_load_info.o \
runahead/dirty_input.o \
runahead/mem_util.o \
runahead/mylist.o \
runahead/run_ahead.o \
runahead/secondary_core.o
endif
ifeq ($(HAVE_CC_RESAMPLER), 1)
@ -308,23 +324,27 @@ DEFINES += -DHAVE_IMAGEVIEWER
OBJ += cores/libretro-imageviewer/image_core.o
endif
# Qt
ifeq ($(HAVE_QT_WRAPPER), 1)
OBJ += ui/drivers/ui_qt.o
LIBS += -lQt5Quick -lQt5Widgets -lQt5Gui -lQt5Qml -lQt5Network -lQt5Core -L./ui/drivers/qt/build/release/
LIBS += -lwrapper
endif
# Qt WIMP GUI
ifeq ($(HAVE_QT), 1)
OBJ += ui/drivers/ui_qt.o \
ui/drivers/qt/ui_qt_application.o \
ui/drivers/qt/ui_qt_window.o \
ui/drivers/qt/ui_qt_browser_window.o \
ui/drivers/qt/ui_qt_load_core_window.o \
ui/drivers/qt/ui_qt_msg_window.o
MOC_HEADERS += ui/drivers/ui_qt.h \
ui/drivers/qt/ui_qt_load_core_window.h
DEFINES += $(QT5CORE_CFLAGS) $(QT5GUI_CFLAGS) $(QT5WIDGETS_CFLAGS) -DHAVE_MAIN
#DEFINES += $(QT5WEBENGINE_CFLAGS)
LIBS += $(QT5CORE_LIBS) $(QT5GUI_LIBS) $(QT5WIDGETS_LIBS)
#LIBS += $(QT5WEBENGINE_LIBS)
NEED_CXX_LINKER = 1
ifneq ($(findstring Linux,$(OS)),)
DEFINES += -I/usr/include/qt -fPIC
DEFINES += -fPIC
endif
endif
@ -1022,9 +1042,6 @@ ifeq ($(HAVE_PLAIN_DRM), 1)
LIBS += -ldrm
endif
OBJ += \
gfx/drivers_renderchain/null_renderchain.o
ifeq ($(HAVE_GL_CONTEXT), 1)
DEFINES += -DHAVE_OPENGL -DHAVE_GLSL
OBJ += gfx/drivers/gl.o \
@ -1172,7 +1189,7 @@ ifeq ($(HAVE_VULKAN), 1)
ifeq ($(HAVE_MENU_COMMON), 1)
OBJ += menu/drivers_display/menu_display_vulkan.o
endif
LIBS += -lstdc++
NEED_CXX_LINKER = 1
DEFINES += -DHAVE_VULKAN
INCLUDE_DIRS += -Igfx/include
@ -1254,7 +1271,9 @@ endif
ifeq ($(HAVE_D3D10), 1)
OBJ += gfx/drivers/d3d10.o \
gfx/common/d3d10_common.o
gfx/common/d3d10_common.o \
gfx/drivers_font/d3d10_font.o \
menu/drivers_display/menu_display_d3d10.o
DEFINES += -DHAVE_D3D10
endif
@ -1424,6 +1443,8 @@ endif
ifeq ($(HAVE_BUILTINFLAC),1)
HAVE_FLAC = 1
DEFINES += -DHAVE_DR_FLAC -I$(DEPS_DIR)
CFLAGS += -DHAVE_DR_FLAC
CFLAGS += -DHAVE_FLAC -I$(DEPS_DIR)/libFLAC/include
DEFINES += -DHAVE_STDINT_H -DHAVE_LROUND -DFLAC__HAS_OGG=0 \
-DFLAC_PACKAGE_VERSION="\"retroarch\""
@ -1450,7 +1471,8 @@ ifeq ($(HAVE_BUILTINFLAC),1)
endif
OBJ += $(FLACOBJ)
else ifeq ($(HAVE_FLAC),1)
LIBS += $(FLAC_LIBS)
DEFINES += -DHAVE_FLAC
LIBS += $(FLAC_LIBS)
endif
ifeq ($(HAVE_ZLIB), 1)
@ -1461,7 +1483,7 @@ ifeq ($(HAVE_ZLIB), 1)
ifeq ($(HAVE_BUILTINZLIB), 1)
OBJ += $(DEPS_DIR)/libz/adler32.o \
$(DEPS_DIR)/libz/compress.o \
$(DEPS_DIR)/libz/crc32.o \
$(DEPS_DIR)/libz/libz-crc32.o \
$(DEPS_DIR)/libz/deflate.o \
$(DEPS_DIR)/libz/gzclose.o \
$(DEPS_DIR)/libz/gzlib.o \
@ -1480,19 +1502,27 @@ ifeq ($(HAVE_ZLIB), 1)
endif
endif
ifeq ($(HAVE_FLAC), 1)
ifeq ($(HAVE_7ZIP), 1)
ifeq ($(HAVE_ZLIB), 1)
DEFINES += -DHAVE_CHD -DWANT_SUBCODE -DWANT_RAW_DATA_SECTOR
ifeq ($(HAVE_CHD), 1)
CFLAGS += -I$(LIBRETRO_COMM_DIR)/formats/libchdr
OBJ += $(LIBRETRO_COMM_DIR)/formats/libchdr/bitstream.o \
$(LIBRETRO_COMM_DIR)/formats/libchdr/cdrom.o \
$(LIBRETRO_COMM_DIR)/formats/libchdr/chd.o \
$(LIBRETRO_COMM_DIR)/formats/libchdr/flac.o \
$(LIBRETRO_COMM_DIR)/formats/libchdr/huffman.o \
DEFINES += -DHAVE_CHD -DWANT_SUBCODE -DWANT_RAW_DATA_SECTOR
OBJ += $(LIBRETRO_COMM_DIR)/formats/libchdr/libchdr_bitstream.o \
$(LIBRETRO_COMM_DIR)/formats/libchdr/libchdr_cdrom.o \
$(LIBRETRO_COMM_DIR)/formats/libchdr/libchdr_chd.o \
$(LIBRETRO_COMM_DIR)/formats/libchdr/libchdr_huffman.o \
$(LIBRETRO_COMM_DIR)/streams/chd_stream.o
endif
endif
ifeq ($(HAVE_FLAC), 1)
OBJ += $(LIBRETRO_COMM_DIR)/formats/libchdr/libchdr_flac.o \
$(LIBRETRO_COMM_DIR)/formats/libchdr/libchdr_flac_codec.o
endif
ifeq ($(HAVE_7ZIP), 1)
OBJ += $(LIBRETRO_COMM_DIR)/formats/libchdr/libchdr_lzma.o
endif
ifeq ($(HAVE_ZLIB), 1)
OBJ += $(LIBRETRO_COMM_DIR)/formats/libchdr/libchdr_zlib.o
endif
endif
ifeq ($(HAVE_RTGA), 1)
@ -1594,10 +1624,6 @@ ifeq ($(HAVE_NETWORKING), 1)
$(LIBRETRO_COMM_DIR)/utils/md5.o
endif
ifeq ($(HAVE_KEYMAPPER), 1)
OBJ += input/input_mapper.o
endif
ifeq ($(HAVE_NETWORKGAMEPAD), 1)
OBJ += input/input_remote.o \
cores/libretro-net-retropad/net_retropad_core.o

View File

@ -178,6 +178,7 @@ else ifeq ($(libogc_platform), 1)
CFLAGS += -DGEKKO -U__INT32_TYPE__ -U __UINT32_TYPE__ -D__INT32_TYPE__=int
HAVE_RUNAHEAD := 1
HAVE_FILTERS_BUILTIN := 1
HAVE_THREADS := 1
HAVE_RPNG := 1
@ -840,6 +841,10 @@ ifeq ($(HAVE_IMAGEVIEWER), 1)
CFLAGS += -DHAVE_IMAGEVIEWER
endif
ifeq ($(HAVE_RUNAHEAD), 1)
CFLAGS += -DHAVE_RUNAHEAD
endif
ifeq ($(HAVE_7ZIP), 1)
CFLAGS += -DHAVE_7ZIP
endif

View File

@ -53,7 +53,6 @@ HAVE_NETWORK_CMD := 1
HAVE_OVERLAY := 1
HAVE_LANGEXTRA := 1
HAVE_CHEEVOS := 1
HAVE_KEYMAPPER := 1
HAVE_SHADERPIPELINE := 1
HAVE_IMAGEVIEWER := 1

View File

@ -4,7 +4,7 @@ include version.all
#set to GCC for debug builds for use with debugger
CELL_BUILD_TOOLS = SNC
CELL_GPU_TYPE = RSX
CELL_PSGL_VERSION = ultra-opt
CELL_PSGL_VERSION = opt
ASSETS_DIR := media/assets
@ -63,7 +63,7 @@ endif
PPU_SRCS = griffin/griffin.c
DEFINES += -DHAVE_MENU -DHAVE_RGUI -DHAVE_XMB -DHAVE_LIBRETRODB -DHAVE_MATERIALUI -DHAVE_SHADERPIPELINE -DRARCH_INTERNAL -DMSB_FIRST -DHAVE_OVERLAY -DHAVE_CC_RESAMPLER -DHAVE_STB_VORBIS -DHAVE_STB_FONT
DEFINES += -DHAVE_MENU -DHAVE_RGUI -DHAVE_XMB -DHAVE_LIBRETRODB -DHAVE_MATERIALUI -DHAVE_SHADERPIPELINE -DRARCH_INTERNAL -DMSB_FIRST -DHAVE_OVERLAY -DHAVE_CC_RESAMPLER -DHAVE_STB_VORBIS -DHAVE_STB_FONT -DHAVE_RUNAHEAD
ifeq ($(DEX_BUILD), 1)
DEFINES += -DDEX_BUILD
@ -96,7 +96,7 @@ ifeq ($(CELL_BUILD_TOOLS), SNC)
PPU_CXXLD = $(CELL_SDK)/host-win32/sn/bin/ps3ppuld.exe
PPU_CXX = $(CELL_SDK)/host-win32/sn/bin/ps3ppusnc.exe
PPU_CC = $(CELL_SDK)/host-win32/sn/bin/ps3ppusnc.exe
else ifneq($(system_platform), win)
else ifneq ($(system_platform), win)
PPU_CXX = $(CELL_SDK)/host-win32/ppu/bin/ppu-lv2-g++.exe
PPU_CC = $(CELL_SDK)/host-win32/ppu/bin/ppu-lv2-gcc.exe
PPU_CXXLD = $(CELL_SDK)/host-win32/ppu/bin/ppu-lv2-ld.exe
@ -119,7 +119,7 @@ DEFINES += -DHAVE_THREADS -DRARCH_CONSOLE -DHAVE_OPENGL -DHAVE_HEADSET -DHAVE_LA
ifeq ($(DEBUG), 1)
PPU_OPTIMIZE_LV := -O0 -g
else
PPU_OPTIMIZE_LV := -O3 -g
PPU_OPTIMIZE_LV := -O2 -g
endif
ifeq ($(HAVE_LOGGER), 1)

View File

@ -2,7 +2,7 @@ include version.all
#which compiler to build with - GCC or SNC
#set to GCC for debug builds for use with debugger
CELL_BUILD_TOOLS = SNC
CELL_BUILD_TOOLS = GCC
CELL_GPU_TYPE = RSX
CELL_PSGL_VERSION = ultra-opt

View File

@ -1,4 +1,4 @@
CELL_BUILD_TOOLS = SNC
CELL_BUILD_TOOLS = GCC
CELL_SDK ?= /usr/local/cell
HAVE_LOGGER = 0
CELL_MK_DIR ?= $(CELL_SDK)/samples/mk

View File

@ -12,6 +12,7 @@ ifeq ($(GRIFFIN_BUILD), 1)
OBJ += griffin/griffin.o
DEFINES += -DHAVE_GRIFFIN=1 -DHAVE_NEON -DHAVE_MATERIALUI -DHAVE_LIBRETRODB -DHAVE_CC_RESAMPLER
DEFINES += -DHAVE_ZLIB -DHAVE_RPNG -DHAVE_RJPEG -DHAVE_RBMP -DHAVE_RTGA -DWANT_ZLIB
DEFINES += -DHAVE_RUNAHEAD
else
HAVE_CC_RESAMPLER = 1
HAVE_MENU_COMMON = 1
@ -29,6 +30,7 @@ else
HAVE_STATIC_VIDEO_FILTERS = 1
HAVE_STATIC_AUDIO_FILTERS = 1
HAVE_MENU = 1
HAVE_RUNAHEAD = 1
include Makefile.common
BLACKLIST :=

View File

@ -16,7 +16,7 @@ DEFINES :=
ifeq ($(GRIFFIN_BUILD), 1)
OBJ += griffin/griffin.o
DEFINES += -DHAVE_GRIFFIN=1
DEFINES += -DHAVE_NEON -DHAVE_MENU -DHAVE_XMB -DHAVE_MATERIALUI -DHAVE_LIBRETRODB
DEFINES += -DHAVE_NEON -DHAVE_MENU -DHAVE_XMB -DHAVE_MATERIALUI -DHAVE_LIBRETRODB DEFINES -DHAVE_KEYMAPPER
DEFINES += -DHAVE_ZLIB -DHAVE_RPNG -DHAVE_RJPEG -DHAVE_RBMP -DHAVE_RTGA -DWANT_ZLIB -DHAVE_CC_RESAMPLER
ifeq ($(DEBUG), 1)
DEFINES += -DHAVE_NETLOGGER

View File

@ -6,7 +6,8 @@ DEBUG = 0
GRIFFIN_BUILD = 0
SALAMANDER_BUILD = 0
WHOLE_ARCHIVE_LINK = 0
WIIU_HID = 0
WIIU_HID = 1
HAVE_RUNAHEAD = 1
WIIU_LOG_RPX = 0
BUILD_DIR = objs/wiiu
PC_DEVELOPMENT_IP_ADDRESS ?=
@ -32,6 +33,7 @@ OBJ += wiiu/input/wpad_driver.o
OBJ += wiiu/input/kpad_driver.o
OBJ += wiiu/input/pad_functions.o
OBJ += wiiu/system/memory.o
OBJ += wiiu/system/atomic.o
OBJ += wiiu/system/exception_handler.o
OBJ += wiiu/fs/sd_fat_devoptab.o
OBJ += wiiu/fs/fs_utils.o
@ -48,15 +50,11 @@ ifeq ($(WIIU_HID),1)
OBJ += wiiu/input/hidpad_driver.o
OBJ += wiiu/input/wiiu_hid.o
OBJ += input/connect/joypad_connection.o \
input/connect/connect_ps2adapter.o \
input/connect/connect_psxadapter.o \
input/connect/connect_ps3.o \
input/connect/connect_ps4.o \
input/connect/connect_wii.o \
input/connect/connect_nesusb.o \
input/connect/connect_snesusb.o \
input/connect/connect_wiiupro.o \
input/connect/connect_wiiugca.o
input/common/hid/hid_device_driver.o \
input/common/hid/device_wiiu_gca.o \
input/common/hid/device_ds3.o \
input/common/hid/device_ds4.o \
input/common/hid/device_null.o
endif
ifeq ($(SALAMANDER_BUILD),1)
@ -88,6 +86,10 @@ else
DEFINES += -DHAVE_SLANG
DEFINES += -DHAVE_SHADERPIPELINE
ifeq ($(HAVE_RUNAHEAD),1)
DEFINES += -DHAVE_RUNAHEAD
endif
OBJ += wiiu/system/missing_libc_functions.o
OBJ += wiiu/shader_utils.o
OBJ += gfx/drivers/gx2_shaders/tex.o
@ -120,7 +122,6 @@ else
HAVE_ZLIB = 1
HAVE_7ZIP = 1
HAVE_BUILTINZLIB = 1
HAVE_KEYMAPPER = 1
HAVE_LIBRETRODB = 1
HAVE_ZARCH = 0
HAVE_MATERIALUI = 1

116
README.md
View File

@ -4,7 +4,7 @@
# RetroArch
RetroArch is the reference frontend for the libretro API.
Popular examples of implementations for this API includes videogame system emulators and game engines as well as
Popular examples of implementations for this API includes video game system emulators and game engines as well as
more generalized 3D programs.
These programs are instantiated as dynamic libraries. We refer to these as "libretro cores".
@ -79,7 +79,7 @@ RetroArch has been ported to the following platforms:
- Original Microsoft Xbox
- Microsoft Xbox 360 (Libxenon/XeXDK)
- Nintendo Wii, GameCube (Libogc)
- Nintendo WiiU
- Nintendo Wii U
- Nintendo 3DS
- Nintendo Switch
- Raspberry Pi
@ -144,3 +144,115 @@ To configure joypads, use the built-in menu or the `retroarch-joyconfig` command
## Compiling and installing
Instructions for compiling and installing RetroArch can be found in the [Libretro/RetroArch Documentation Center](https://docs.libretro.com/).
## CRT 15Khz Resolution Switching
CRT Switch res will turn on, on the fly. However, you will need to restart retroarch to disable it. With CRT SwitchRes enable Retroarch will start in 2560 x 480 @ 60.
If you are running windows, before enabling the CRT SwitchRes options please make sure you have installed CRTEmudriver and installed some modelines. The minimum modelins for all games to switch correctly are:
- 2560 x 192 @ 60.000000
- 2560 x 200 @ 60.000000
- 2560 x 240 @ 60.000000
- 2560 x 224 @ 60.000000
- 2560 x 237 @ 60.000000
- 2560 x 256 @ 50.000000
- 2560 x 254 @ 55.000000
- 2560 x 448 @ 60.000000
- 2560 x 480 @ 60.000000
Install these modelines replacing 2560 with your desired super resolution. The above resolutions are NTSC only so if you would be playing any PAL content please add pal modelines:
- 2560 x 192 @ 50.000000
- 2560 x 200 @ 50.000000
- 2560 x 240 @ 50.000000
- 2560 x 224 @ 50.000000
- 2560 x 288 @ 50.000000
- 2560 x 237 @ 50.000000
- 2560 x 254 @ 55.000000
- 2560 x 448 @ 50.000000
- 2560 x 480 @ 50.000000
Some games will require higher PAL resolutions which should also be installed:
- 2560 x 512 @ 50.000000
- 2560 x 576 @ 50.000000
Ideally install all these modelines and everything will work great.
## Super Resolutions
The default super resolution is 2560. It is displayed just under the CRT switch option, which can be found in video settings. This can be changed within the retroarch.cfg. The only compatible resolutions are 1920, 2560 and 3840. Any other resolutions will be ignored and native switching will be activated.
## Native Resolutions
If native resolutions are activated you will need a whole new set of modelines:
- 512 x 240 @ 50.006977 SNESpal
- 512 x 224 @ 50.006977 SNESpal
- 512 x 448 @ 50.006977 SNESpal
- 512 x 240 @ 60.098812 SNESntsc
- 512 x 224 @ 60.098812 SNESntsc
- 512 x 448 @ 60.098812 SNESntsc
- 256 x 240 @ 50.006977 SNESpal
- 256 x 448 @ 50.006977 SNESpal
- 256 x 240 @ 60.098812 SNESntsc
- 256 x 448 @ 60.098812 SNESntsc
- 320 x 240 @ 59.922745 MDntsc
- 320 x 448 @ 59.922745 MDntp
- 320 x 480 @ 59.922745 MDntsc
- 256 x 192 @ 59.922745 MDntsc
- 320 x 224 @ 59.922745 MDntsc
- 256 x 224 @ 59.922745 MDntsc
- 320 x 288 @ 49.701458 MDpal
- 320 x 576 @ 49.701458 MDpal
- 256 x 192 @ 49.701458 MDpal
- 320 x 224 @ 49.701458 MDpal
- 320 x 240 @ 49.701458 MDpal
- 320 x 448 @ 49.701458 MDpal
- 320 x 480 @ 49.701458 MDpal
- 256 x 224 @ 49.701458 MDpal
- 256 x 288 @ 49.701458 MSYSpal
- 256 x 240 @ 60.098812 NESntsc
- 256 x 240 @ 50.006977 NESpal
- 640 x 480 @ 60.130001 N64ntsc
- 640 x 237 @ 60.130001 N64ntsc
- 640 x 240 @ 60.130001 N64ntsc
- 640 x 480 @ 50.000000 N64pal
- 640 x 576 @ 50.000000 n64pal
- 640 x 288 @ 50.000000 n64pal
- 256 x 252 @ 49.759998 PSXpal
- 384 x 252 @ 49.759998 PSXpal
- 640 x 540 @ 49.759998 PSXpal
- 320 x 252 @ 49.759998 PSXpal
- 640 x 252 @ 49.759998 PSXpal
- 384 x 240 @ 59.941002 PSXntsc
- 256 x 480 @ 59.941002 PSXntsc
- 352 x 240 @ 59.820000 Saturn/SGFX_NTSCp
- 704 x 240 @ 59.820000 SaturnNTSCp
- 352 x 480 @ 59.820000 SaturnNTSCi
- 704 x 480 @ 59.820000 SaturnNTSCi
- 352 x 288 @ 49.701458 SaturnPALp
- 704 x 288 @ 49.701458 SaturnPALp
- 352 x 576 @ 49.701458 SaturnPALi
- 704 x 576 @ 49.701458 SaturnPALi
- 240 x 160 @ 59.730000 GBA
- 320 x 200 @ 60.000000 Doom
// Arcade
- 400 x 254 @ 54.706841 MK
- 384 x 224 @ 59.637405 CPS1
These modelines are more accurate giving exact hz. However, some games may have unwanted results. This is due to mid-scanline resolution changes on the original hardware. For the best results super resolutions are the way to go.
## CRT resolution switching & Mame
Some arcade resolutions can be a lot different. There is resolution detection to ensure mame games will be displayed in the closest available resolution but drawn at their native resolution within this resolution. Meaning that the mame game will look just like the original hardware.
Mame roms that run in a vertical aspect like DoDonPachi need to be rotated within mame before resolution switching and aspect correction will work. Do this before enabling CRT switchRes so that Retroarch will run in your desktop resolution. Once you have roted any games that may need it switch CRT SwitchRes on.

View File

@ -45,7 +45,15 @@
#define AUDIO_BUFFER_FREE_SAMPLES_COUNT (8 * 1024)
#define AUDIO_MIXER_MAX_STREAMS 8
/**
* db_to_gain:
* @db : Decibels.
*
* Converts decibels to voltage gain.
*
* Returns: voltage gain value.
**/
#define db_to_gain(db) (powf(10.0f, (db) / 20.0f))
static const audio_driver_t *audio_drivers[] = {
#ifdef HAVE_ALSA
@ -122,18 +130,6 @@ static const audio_driver_t *audio_drivers[] = {
NULL,
};
struct audio_mixer_stream
{
audio_mixer_sound_t *handle;
audio_mixer_voice_t *voice;
audio_mixer_stop_cb_t stop_cb;
enum audio_mixer_state state;
float volume;
void *buf;
size_t bufsize;
};
static unsigned audio_mixer_current_max_idx = 0;
static struct audio_mixer_stream audio_mixer_streams[AUDIO_MIXER_MAX_STREAMS] = {{0}};
static size_t audio_driver_chunk_size = 0;
@ -183,6 +179,11 @@ static void *audio_driver_context_audio_data = NULL;
static bool audio_suspended = false;
static void audio_mixer_play_stop_sequential_cb(
audio_mixer_sound_t *sound, unsigned reason);
static void audio_mixer_play_stop_cb(
audio_mixer_sound_t *sound, unsigned reason);
enum resampler_quality audio_driver_get_resampler_quality(void)
{
settings_t *settings = config_get_ptr();
@ -193,6 +194,22 @@ enum resampler_quality audio_driver_get_resampler_quality(void)
return (enum resampler_quality)settings->uints.audio_resampler_quality;
}
audio_mixer_stream_t *audio_driver_mixer_get_stream(unsigned i)
{
if (i > (AUDIO_MIXER_MAX_STREAMS-1))
return NULL;
return &audio_mixer_streams[i];
}
const char *audio_driver_mixer_get_stream_name(unsigned i)
{
if (i > (AUDIO_MIXER_MAX_STREAMS-1))
return "N/A";
if (!string_is_empty(audio_mixer_streams[i].name))
return audio_mixer_streams[i].name;
return "N/A";
}
/**
* compute_audio_buffer_statistics:
*
@ -213,7 +230,7 @@ bool compute_audio_buffer_statistics(audio_statistics_t *stats)
if (!stats || samples < 3)
return false;
stats->samples = audio_driver_free_samples_count;
stats->samples = (unsigned)audio_driver_free_samples_count;
#ifdef WARPUP
/* uint64 to double not implemented, fair chance
@ -368,6 +385,12 @@ static bool audio_driver_deinit_internal(void)
return true;
}
static void audio_driver_mixer_init(unsigned out_rate)
{
audio_mixer_init(out_rate);
}
static bool audio_driver_init_internal(bool audio_cb_inited)
{
unsigned new_rate = 0;
@ -524,7 +547,7 @@ static bool audio_driver_init_internal(bool audio_cb_inited)
{
audio_driver_buffer_size =
current_audio->buffer_size(audio_driver_context_audio_data);
audio_driver_control = true;
audio_driver_control = true;
}
else
RARCH_WARN("Audio rate control was desired, but driver does not support needed features.\n");
@ -534,7 +557,7 @@ static bool audio_driver_init_internal(bool audio_cb_inited)
audio_driver_free_samples_count = 0;
audio_mixer_init(settings->uints.audio_out_rate);
audio_driver_mixer_init(settings->uints.audio_out_rate);
/* Threaded driver is initially stopped. */
if (
@ -576,20 +599,17 @@ void audio_driver_set_nonblocking_state(bool enable)
static void audio_driver_flush(const int16_t *data, size_t samples)
{
struct resampler_data src_data;
bool is_perfcnt_enable = false;
bool is_paused = false;
bool is_idle = false;
bool is_slowmotion = false;
const void *output_data = NULL;
unsigned output_frames = 0;
float audio_volume_gain = !audio_driver_mute_enable ?
bool is_perfcnt_enable = false;
bool is_paused = false;
bool is_idle = false;
bool is_slowmotion = false;
const void *output_data = NULL;
unsigned output_frames = 0;
float audio_volume_gain = !audio_driver_mute_enable ?
audio_driver_volume_gain : 0.0f;
src_data.data_in = NULL;
src_data.data_out = NULL;
src_data.input_frames = 0;
src_data.output_frames = 0;
src_data.ratio = 0.0f;
src_data.data_out = NULL;
src_data.output_frames = 0;
if (recording_data)
recording_push_audio(data, samples);
@ -606,8 +626,8 @@ static void audio_driver_flush(const int16_t *data, size_t samples)
convert_s16_to_float(audio_driver_input_data, data, samples,
audio_volume_gain);
src_data.data_in = audio_driver_input_data;
src_data.input_frames = samples >> 1;
src_data.data_in = audio_driver_input_data;
src_data.input_frames = samples >> 1;
if (audio_driver_dsp)
@ -662,7 +682,7 @@ static void audio_driver_flush(const int16_t *data, size_t samples)
#endif
}
src_data.ratio = audio_source_ratio_current;
src_data.ratio = audio_source_ratio_current;
if (is_slowmotion)
{
@ -675,7 +695,7 @@ static void audio_driver_flush(const int16_t *data, size_t samples)
if (audio_mixer_active)
{
bool override = audio_driver_mixer_mute_enable ? true :
(audio_driver_mixer_volume_gain != 0.0f) ? true : false;
(audio_driver_mixer_volume_gain != 1.0f) ? true : false;
float mixer_gain = !audio_driver_mixer_mute_enable ?
audio_driver_mixer_volume_gain : 0.0f;
audio_mixer_mix(audio_driver_output_samples_buf,
@ -725,6 +745,22 @@ void audio_driver_sample(int16_t left, int16_t right)
audio_driver_data_ptr = 0;
}
void audio_driver_menu_sample(void)
{
static int16_t samples_buf[1024] = {0};
struct retro_system_av_info
*av_info = video_viewport_get_system_av_info();
const struct retro_system_timing *info =
(const struct retro_system_timing*)&av_info->timing;
unsigned sample_count = (info->sample_rate / info->fps) * 2;
while (sample_count > 1024)
{
audio_driver_flush(samples_buf, 1024);
sample_count -= 1024;
}
audio_driver_flush(samples_buf, sample_count);
}
/**
* audio_driver_sample_batch:
* @data : pointer to audio buffer.
@ -840,13 +876,13 @@ void audio_driver_monitor_adjust_system_rates(void)
{
float timing_skew;
settings_t *settings = config_get_ptr();
struct retro_system_av_info *av_info = video_viewport_get_system_av_info();
float video_refresh_rate = settings->floats.video_refresh_rate;
float max_timing_skew = settings->floats.audio_max_timing_skew;
const struct retro_system_timing *info = av_info ?
(const struct retro_system_timing*)&av_info->timing : NULL;
struct retro_system_av_info *av_info = video_viewport_get_system_av_info();
const struct retro_system_timing *info =
(const struct retro_system_timing*)&av_info->timing;
if (!info || info->sample_rate <= 0.0)
if (info->sample_rate <= 0.0)
return;
timing_skew = fabs(1.0f - info->fps / video_refresh_rate);
@ -976,6 +1012,12 @@ bool audio_driver_mixer_extension_supported(const char *ext)
string_list_append(str_list, "mod", attr);
string_list_append(str_list, "s3m", attr);
string_list_append(str_list, "xm", attr);
#endif
#ifdef HAVE_DR_FLAC
string_list_append(str_list, "flac", attr);
#endif
#ifdef HAVE_DR_MP3
string_list_append(str_list, "mp3", attr);
#endif
string_list_append(str_list, "wav", attr);
@ -1021,18 +1063,16 @@ static void audio_mixer_play_stop_cb(
{
unsigned i = (unsigned)idx;
#if 0
if (audio_mixer_streams[i].buf != NULL)
free(audio_mixer_streams[i].buf);
#endif
if (!string_is_empty(audio_mixer_streams[i].name))
free(audio_mixer_streams[i].name);
audio_mixer_streams[i].name = NULL;
audio_mixer_streams[i].state = AUDIO_STREAM_STATE_NONE;
audio_mixer_streams[i].volume = 0.0f;
audio_mixer_streams[i].buf = NULL;
audio_mixer_streams[i].stop_cb = NULL;
audio_mixer_streams[i].handle = NULL;
audio_mixer_streams[i].voice = NULL;
audio_mixer_current_max_idx--;
}
break;
case AUDIO_MIXER_SOUND_STOPPED:
@ -1042,15 +1082,75 @@ static void audio_mixer_play_stop_cb(
}
}
static void audio_mixer_play_stop_sequential_cb(
audio_mixer_sound_t *sound, unsigned reason)
{
int idx = audio_mixer_find_index(sound);
switch (reason)
{
case AUDIO_MIXER_SOUND_FINISHED:
audio_mixer_destroy(sound);
if (idx >= 0)
{
unsigned i = (unsigned)idx;
if (!string_is_empty(audio_mixer_streams[i].name))
free(audio_mixer_streams[i].name);
audio_mixer_streams[i].name = NULL;
audio_mixer_streams[i].state = AUDIO_STREAM_STATE_NONE;
audio_mixer_streams[i].volume = 0.0f;
audio_mixer_streams[i].buf = NULL;
audio_mixer_streams[i].stop_cb = NULL;
audio_mixer_streams[i].handle = NULL;
audio_mixer_streams[i].voice = NULL;
i++;
for (; i < AUDIO_MIXER_MAX_STREAMS; i++)
{
if (audio_mixer_streams[i].state == AUDIO_STREAM_STATE_STOPPED)
{
audio_driver_mixer_play_stream_sequential(i);
break;
}
}
}
break;
case AUDIO_MIXER_SOUND_STOPPED:
break;
case AUDIO_MIXER_SOUND_REPEATED:
break;
}
}
bool audio_driver_mixer_get_free_stream_slot(unsigned *id)
{
unsigned i;
for (i = 0; i < AUDIO_MIXER_MAX_STREAMS; i++)
{
if (audio_mixer_streams[i].state == AUDIO_STREAM_STATE_NONE)
{
*id = i;
return true;
}
}
return false;
}
bool audio_driver_mixer_add_stream(audio_mixer_stream_params_t *params)
{
unsigned free_slot = 0;
audio_mixer_voice_t *voice = NULL;
audio_mixer_sound_t *handle = NULL;
audio_mixer_stop_cb_t stop_cb = audio_mixer_play_stop_cb;
bool looped = false;
void *buf = NULL;
if (audio_mixer_current_max_idx >= AUDIO_MIXER_MAX_STREAMS)
if (!audio_driver_mixer_get_free_stream_slot(&free_slot))
return false;
if (params->state == AUDIO_STREAM_STATE_NONE)
@ -1074,9 +1174,18 @@ bool audio_driver_mixer_add_stream(audio_mixer_stream_params_t *params)
case AUDIO_MIXER_TYPE_MOD:
handle = audio_mixer_load_mod(buf, (int32_t)params->bufsize);
break;
case AUDIO_MIXER_TYPE_FLAC:
#ifdef HAVE_DR_FLAC
handle = audio_mixer_load_flac(buf, (int32_t)params->bufsize);
#endif
break;
case AUDIO_MIXER_TYPE_MP3:
#ifdef HAVE_DR_MP3
handle = audio_mixer_load_mp3(buf, (int32_t)params->bufsize);
#endif
break;
case AUDIO_MIXER_TYPE_NONE:
free(buf);
return false;
break;
}
if (!handle)
@ -1085,74 +1194,193 @@ bool audio_driver_mixer_add_stream(audio_mixer_stream_params_t *params)
return false;
}
if (params->state == AUDIO_STREAM_STATE_PLAYING)
switch (params->state)
{
voice = audio_mixer_play(handle, looped, params->volume, stop_cb);
audio_set_bool(AUDIO_ACTION_MIXER, true);
}
else if (params->state == AUDIO_STREAM_STATE_PLAYING_LOOPED)
{
looped = true;
voice = audio_mixer_play(handle, looped, params->volume, stop_cb);
audio_set_bool(AUDIO_ACTION_MIXER, true);
case AUDIO_STREAM_STATE_PLAYING_LOOPED:
looped = true;
voice = audio_mixer_play(handle, looped, params->volume, stop_cb);
break;
case AUDIO_STREAM_STATE_PLAYING:
voice = audio_mixer_play(handle, looped, params->volume, stop_cb);
break;
case AUDIO_STREAM_STATE_PLAYING_SEQUENTIAL:
stop_cb = audio_mixer_play_stop_sequential_cb;
voice = audio_mixer_play(handle, looped, params->volume, stop_cb);
break;
default:
break;
}
audio_mixer_streams[audio_mixer_current_max_idx].buf = buf;
audio_mixer_streams[audio_mixer_current_max_idx].handle = handle;
audio_mixer_streams[audio_mixer_current_max_idx].voice = voice;
audio_mixer_streams[audio_mixer_current_max_idx].state = params->state;
audio_mixer_streams[audio_mixer_current_max_idx].volume = params->volume;
audio_mixer_streams[audio_mixer_current_max_idx].stop_cb = stop_cb;
audio_mixer_active = true;
audio_mixer_current_max_idx++;
audio_mixer_streams[free_slot].name = !string_is_empty(params->basename) ? strdup(params->basename) : NULL;
audio_mixer_streams[free_slot].buf = buf;
audio_mixer_streams[free_slot].handle = handle;
audio_mixer_streams[free_slot].voice = voice;
audio_mixer_streams[free_slot].state = params->state;
audio_mixer_streams[free_slot].volume = params->volume;
audio_mixer_streams[free_slot].stop_cb = stop_cb;
return true;
}
static void audio_driver_mixer_remove_stream(unsigned i)
enum audio_mixer_state audio_driver_mixer_get_stream_state(unsigned i)
{
audio_mixer_sound_t *handle = audio_mixer_streams[i].handle;
audio_mixer_voice_t *voice = audio_mixer_streams[i].voice;
if (i >= AUDIO_MIXER_MAX_STREAMS)
return AUDIO_STREAM_STATE_NONE;
return audio_mixer_streams[i].state;
}
static void audio_driver_mixer_play_stream_internal(unsigned i, unsigned type)
{
bool set_state = false;
if (i >= AUDIO_MIXER_MAX_STREAMS)
return;
switch (audio_mixer_streams[i].state)
{
case AUDIO_STREAM_STATE_STOPPED:
audio_mixer_streams[i].voice = audio_mixer_play(audio_mixer_streams[i].handle,
(type == AUDIO_STREAM_STATE_PLAYING_LOOPED) ? true : false,
1.0f, audio_mixer_streams[i].stop_cb);
set_state = true;
break;
case AUDIO_STREAM_STATE_PLAYING:
case AUDIO_STREAM_STATE_PLAYING_LOOPED:
case AUDIO_STREAM_STATE_PLAYING_SEQUENTIAL:
case AUDIO_STREAM_STATE_NONE:
break;
}
if (set_state)
audio_mixer_streams[i].state = (enum audio_mixer_state)type;
}
void audio_driver_mixer_play_stream(unsigned i)
{
audio_mixer_streams[i].stop_cb = audio_mixer_play_stop_cb;
audio_driver_mixer_play_stream_internal(i, AUDIO_STREAM_STATE_PLAYING);
}
void audio_driver_mixer_play_stream_looped(unsigned i)
{
audio_mixer_streams[i].stop_cb = audio_mixer_play_stop_cb;
audio_driver_mixer_play_stream_internal(i, AUDIO_STREAM_STATE_PLAYING_LOOPED);
}
void audio_driver_mixer_play_stream_sequential(unsigned i)
{
audio_mixer_streams[i].stop_cb = audio_mixer_play_stop_sequential_cb;
audio_driver_mixer_play_stream_internal(i, AUDIO_STREAM_STATE_PLAYING_SEQUENTIAL);
}
float audio_driver_mixer_get_stream_volume(unsigned i)
{
if (i >= AUDIO_MIXER_MAX_STREAMS)
return 0.0f;
return audio_mixer_streams[i].volume;
}
void audio_driver_mixer_set_stream_volume(unsigned i, float vol)
{
audio_mixer_voice_t *voice = NULL;
if (i >= AUDIO_MIXER_MAX_STREAMS)
return;
audio_mixer_streams[i].volume = vol;
voice = audio_mixer_streams[i].voice;
if (voice)
audio_mixer_voice_set_volume(voice, db_to_gain(vol));
}
void audio_driver_mixer_stop_stream(unsigned i)
{
bool set_state = false;
if (i >= AUDIO_MIXER_MAX_STREAMS)
return;
switch (audio_mixer_streams[i].state)
{
case AUDIO_STREAM_STATE_PLAYING:
if (voice)
audio_mixer_stop(voice);
if (handle)
audio_mixer_destroy(handle);
break;
case AUDIO_STREAM_STATE_PLAYING_LOOPED:
if (voice)
audio_mixer_stop(voice);
if (handle)
audio_mixer_destroy(handle);
case AUDIO_STREAM_STATE_PLAYING_SEQUENTIAL:
set_state = true;
break;
case AUDIO_STREAM_STATE_STOPPED:
if (handle)
audio_mixer_destroy(handle);
case AUDIO_STREAM_STATE_NONE:
break;
}
if (set_state)
{
audio_mixer_voice_t *voice = audio_mixer_streams[i].voice;
if (voice)
audio_mixer_stop(voice);
audio_mixer_streams[i].state = AUDIO_STREAM_STATE_STOPPED;
audio_mixer_streams[i].volume = 1.0f;
}
}
void audio_driver_mixer_remove_stream(unsigned i)
{
bool destroy = false;
if (i >= AUDIO_MIXER_MAX_STREAMS)
return;
switch (audio_mixer_streams[i].state)
{
case AUDIO_STREAM_STATE_PLAYING:
case AUDIO_STREAM_STATE_PLAYING_LOOPED:
case AUDIO_STREAM_STATE_PLAYING_SEQUENTIAL:
audio_driver_mixer_stop_stream(i);
destroy = true;
break;
case AUDIO_STREAM_STATE_STOPPED:
destroy = true;
break;
case AUDIO_STREAM_STATE_NONE:
break;
}
audio_mixer_streams[i].state = AUDIO_STREAM_STATE_NONE;
audio_mixer_streams[i].volume = 0.0f;
audio_mixer_streams[i].stop_cb = NULL;
audio_mixer_streams[i].handle = NULL;
audio_mixer_streams[i].voice = NULL;
if (destroy)
{
audio_mixer_sound_t *handle = audio_mixer_streams[i].handle;
if (handle)
audio_mixer_destroy(handle);
if (!string_is_empty(audio_mixer_streams[i].name))
free(audio_mixer_streams[i].name);
audio_mixer_streams[i].state = AUDIO_STREAM_STATE_NONE;
audio_mixer_streams[i].stop_cb = NULL;
audio_mixer_streams[i].volume = 0.0f;
audio_mixer_streams[i].handle = NULL;
audio_mixer_streams[i].voice = NULL;
audio_mixer_streams[i].name = NULL;
}
}
static void audio_driver_mixer_deinit(void)
{
unsigned i;
audio_set_bool(AUDIO_ACTION_MIXER, false);
audio_mixer_active = false;
for (i = 0; i < AUDIO_MIXER_MAX_STREAMS; i++)
{
audio_driver_mixer_stop_stream(i);
audio_driver_mixer_remove_stream(i);
}
audio_mixer_current_max_idx = 0;
audio_mixer_done();
}
@ -1351,15 +1579,6 @@ void audio_set_bool(enum audio_action action, bool val)
}
}
/**
* db_to_gain:
* @db : Decibels.
*
* Converts decibels to voltage gain.
*
* Returns: voltage gain value.
**/
#define db_to_gain(db) (powf(10.0f, (db) / 20.0f))
void audio_set_float(enum audio_action action, float val)
{

View File

@ -35,6 +35,8 @@ RETRO_BEGIN_DECLS
#define AUDIO_MAX_RATIO 16
#define AUDIO_MIXER_MAX_STREAMS 16
enum audio_action
{
AUDIO_ACTION_NONE = 0,
@ -46,6 +48,27 @@ enum audio_action
AUDIO_ACTION_MIXER
};
enum audio_mixer_state
{
AUDIO_STREAM_STATE_NONE = 0,
AUDIO_STREAM_STATE_STOPPED,
AUDIO_STREAM_STATE_PLAYING,
AUDIO_STREAM_STATE_PLAYING_LOOPED,
AUDIO_STREAM_STATE_PLAYING_SEQUENTIAL
};
typedef struct audio_mixer_stream
{
audio_mixer_sound_t *handle;
audio_mixer_voice_t *voice;
audio_mixer_stop_cb_t stop_cb;
enum audio_mixer_state state;
float volume;
void *buf;
char *name;
size_t bufsize;
} audio_mixer_stream_t;
typedef struct audio_statistics
{
float average_buffer_saturation;
@ -137,20 +160,13 @@ typedef struct audio_driver
size_t (*buffer_size)(void *data);
} audio_driver_t;
enum audio_mixer_state
{
AUDIO_STREAM_STATE_NONE = 0,
AUDIO_STREAM_STATE_STOPPED,
AUDIO_STREAM_STATE_PLAYING,
AUDIO_STREAM_STATE_PLAYING_LOOPED
};
typedef struct audio_mixer_stream_params
{
float volume;
enum audio_mixer_type type;
enum audio_mixer_state state;
void *buf;
char *basename;
size_t bufsize;
audio_mixer_stop_cb_t cb;
} audio_mixer_stream_params_t;
@ -271,10 +287,32 @@ bool audio_driver_deinit(void);
bool audio_driver_init(void);
void audio_driver_menu_sample(void);
audio_mixer_stream_t *audio_driver_mixer_get_stream(unsigned i);
bool audio_driver_mixer_add_stream(audio_mixer_stream_params_t *params);
void audio_driver_mixer_play_stream(unsigned i);
void audio_driver_mixer_play_stream_sequential(unsigned i);
void audio_driver_mixer_play_stream_looped(unsigned i);
void audio_driver_mixer_stop_stream(unsigned i);
float audio_driver_mixer_get_stream_volume(unsigned i);
void audio_driver_mixer_set_stream_volume(unsigned i, float vol);
void audio_driver_mixer_remove_stream(unsigned i);
enum resampler_quality audio_driver_get_resampler_quality(void);
enum audio_mixer_state audio_driver_mixer_get_stream_state(unsigned i);
const char *audio_driver_mixer_get_stream_name(unsigned i);
bool compute_audio_buffer_statistics(audio_statistics_t *stats);
extern audio_driver_t audio_rsound;

View File

@ -107,6 +107,8 @@
#define CHEEVOS_JSON_KEY_LEADERBOARDS 0xf1247d2dU
#define CHEEVOS_JSON_KEY_MEM 0x0b8807e4U
#define CHEEVOS_JSON_KEY_FORMAT 0xb341208eU
#define CHEEVOS_JSON_KEY_SUCCESS 0x110461deU
#define CHEEVOS_JSON_KEY_ERROR 0x0d2011cfU
typedef struct
{
@ -299,6 +301,15 @@ int cheats_were_enabled = 0;
Supporting functions.
*****************************************************************************/
#ifndef CHEEVOS_VERBOSE
void cheevos_log(const char *fmt, ...)
{
(void)fmt;
}
#endif
static unsigned size_in_megabytes(unsigned val)
{
return (val * 1024 * 1024);
@ -308,7 +319,7 @@ static unsigned size_in_megabytes(unsigned val)
static void cheevos_log_url(const char* format, const char* url)
{
#ifdef CHEEVOS_LOG_PASSWORD
RARCH_LOG(format, url);
CHEEVOS_LOG(format, url);
#else
char copy[256];
char* aux = NULL;
@ -359,340 +370,11 @@ static void cheevos_log_url(const char* format, const char* url)
*aux = 0;
}
RARCH_LOG(format, copy);
CHEEVOS_LOG(format, copy);
#endif
}
#endif
#ifdef CHEEVOS_VERBOSE
static void cheevos_add_char(char** aux, size_t* left, char k)
{
if (*left >= 1)
{
**aux = k;
(*aux)++;
(*left)--;
}
}
static void cheevos_add_string(char** aux, size_t* left, const char* s)
{
size_t len = strlen(s);
if (*left >= len)
{
strcpy(*aux, s);
*aux += len;
*left -= len;
}
}
static void cheevos_add_hex(char** aux, size_t* left, unsigned v)
{
char buffer[32];
snprintf(buffer, sizeof(buffer), "%06x", v);
buffer[sizeof(buffer) - 1] = 0;
cheevos_add_string(aux, left, buffer);
}
static void cheevos_add_uint(char** aux, size_t* left, unsigned v)
{
char buffer[32];
snprintf(buffer, sizeof(buffer), "%u", v);
buffer[sizeof(buffer) - 1] = 0;
cheevos_add_string(aux, left, buffer);
}
static void cheevos_add_int(char** aux, size_t* left, int v)
{
char buffer[32];
snprintf(buffer, sizeof(buffer), "%d", v);
buffer[sizeof(buffer) - 1] = 0;
cheevos_add_string(aux, left, buffer);
}
static void cheevos_log_var(const cheevos_var_t* var)
{
if (!var)
return;
RARCH_LOG("[CHEEVOS]: size: %s\n",
var->size == CHEEVOS_VAR_SIZE_BIT_0 ? "bit 0" :
var->size == CHEEVOS_VAR_SIZE_BIT_1 ? "bit 1" :
var->size == CHEEVOS_VAR_SIZE_BIT_2 ? "bit 2" :
var->size == CHEEVOS_VAR_SIZE_BIT_3 ? "bit 3" :
var->size == CHEEVOS_VAR_SIZE_BIT_4 ? "bit 4" :
var->size == CHEEVOS_VAR_SIZE_BIT_5 ? "bit 5" :
var->size == CHEEVOS_VAR_SIZE_BIT_6 ? "bit 6" :
var->size == CHEEVOS_VAR_SIZE_BIT_7 ? "bit 7" :
var->size == CHEEVOS_VAR_SIZE_NIBBLE_LOWER ? "low nibble" :
var->size == CHEEVOS_VAR_SIZE_NIBBLE_UPPER ? "high nibble" :
var->size == CHEEVOS_VAR_SIZE_EIGHT_BITS ? "byte" :
var->size == CHEEVOS_VAR_SIZE_SIXTEEN_BITS ? "word" :
var->size == CHEEVOS_VAR_SIZE_THIRTYTWO_BITS ? "dword" :
"?"
);
RARCH_LOG("[CHEEVOS]: type: %s\n",
var->type == CHEEVOS_VAR_TYPE_ADDRESS ? "address" :
var->type == CHEEVOS_VAR_TYPE_VALUE_COMP ? "value" :
var->type == CHEEVOS_VAR_TYPE_DELTA_MEM ? "delta" :
var->type == CHEEVOS_VAR_TYPE_DYNAMIC_VAR ? "dynamic" :
"?"
);
RARCH_LOG("[CHEEVOS]: value: %u\n", var->value);
}
static void cheevos_log_cond(const cheevos_cond_t* cond)
{
if (!cond)
return;
RARCH_LOG("[CHEEVOS]: condition %p\n", cond);
RARCH_LOG("[CHEEVOS]: type: %s\n",
cond->type == CHEEVOS_COND_TYPE_STANDARD ? "standard" :
cond->type == CHEEVOS_COND_TYPE_PAUSE_IF ? "pause" :
cond->type == CHEEVOS_COND_TYPE_RESET_IF ? "reset" :
cond->type == CHEEVOS_COND_TYPE_ADD_SOURCE ? "add source" :
cond->type == CHEEVOS_COND_TYPE_SUB_SOURCE ? "sub source" :
cond->type == CHEEVOS_COND_TYPE_ADD_HITS ? "add hits" :
"?"
);
RARCH_LOG("[CHEEVOS]: req_hits: %u\n", cond->req_hits);
RARCH_LOG("[CHEEVOS]: source:\n");
cheevos_log_var(&cond->source);
RARCH_LOG("[CHEEVOS]: op: %s\n",
cond->op == CHEEVOS_COND_OP_EQUALS ? "==" :
cond->op == CHEEVOS_COND_OP_LESS_THAN ? "<" :
cond->op == CHEEVOS_COND_OP_LESS_THAN_OR_EQUAL ? "<=" :
cond->op == CHEEVOS_COND_OP_GREATER_THAN ? ">" :
cond->op == CHEEVOS_COND_OP_GREATER_THAN_OR_EQUAL ? ">=" :
cond->op == CHEEVOS_COND_OP_NOT_EQUAL_TO ? "!=" :
"?"
);
RARCH_LOG("[CHEEVOS]: target:\n");
cheevos_log_var(&cond->target);
}
static void cheevos_log_cheevo(const cheevo_t* cheevo,
const cheevos_field_t* memaddr_ud)
{
if (!cheevo || !memaddr_ud)
return;
RARCH_LOG("[CHEEVOS]: cheevo %p\n", cheevo);
RARCH_LOG("[CHEEVOS]: id: %u\n", cheevo->id);
RARCH_LOG("[CHEEVOS]: title: %s\n", cheevo->title);
RARCH_LOG("[CHEEVOS]: desc: %s\n", cheevo->description);
RARCH_LOG("[CHEEVOS]: author: %s\n", cheevo->author);
RARCH_LOG("[CHEEVOS]: badge: %s\n", cheevo->badge);
RARCH_LOG("[CHEEVOS]: points: %u\n", cheevo->points);
RARCH_LOG("[CHEEVOS]: sets: TBD\n");
RARCH_LOG("[CHEEVOS]: memaddr: %.*s\n",
(int)memaddr_ud->length, memaddr_ud->string);
}
static void cheevos_add_var_size(char** aux, size_t* left,
const cheevos_var_t* var)
{
if (!var)
return;
switch( var->size )
{
case CHEEVOS_VAR_SIZE_BIT_0:
cheevos_add_char(aux, left, 'M');
break;
case CHEEVOS_VAR_SIZE_BIT_1:
cheevos_add_char(aux, left, 'N');
break;
case CHEEVOS_VAR_SIZE_BIT_2:
cheevos_add_char(aux, left, 'O');
break;
case CHEEVOS_VAR_SIZE_BIT_3:
cheevos_add_char(aux, left, 'P');
break;
case CHEEVOS_VAR_SIZE_BIT_4:
cheevos_add_char(aux, left, 'Q');
break;
case CHEEVOS_VAR_SIZE_BIT_5:
cheevos_add_char(aux, left, 'R');
break;
case CHEEVOS_VAR_SIZE_BIT_6:
cheevos_add_char(aux, left, 'S');
break;
case CHEEVOS_VAR_SIZE_BIT_7:
cheevos_add_char(aux, left, 'T');
break;
case CHEEVOS_VAR_SIZE_NIBBLE_LOWER:
cheevos_add_char(aux, left, 'L');
break;
case CHEEVOS_VAR_SIZE_NIBBLE_UPPER:
cheevos_add_char(aux, left, 'U');
break;
case CHEEVOS_VAR_SIZE_EIGHT_BITS:
cheevos_add_char(aux, left, 'H');
break;
case CHEEVOS_VAR_SIZE_THIRTYTWO_BITS:
cheevos_add_char(aux, left, 'X');
break;
case CHEEVOS_VAR_SIZE_SIXTEEN_BITS:
default:
cheevos_add_char(aux, left, ' ');
break;
}
}
static void cheevos_add_var(const cheevos_var_t* var, char** memaddr,
size_t *left)
{
if (!var)
return;
if ( var->type == CHEEVOS_VAR_TYPE_ADDRESS
|| var->type == CHEEVOS_VAR_TYPE_DELTA_MEM)
{
if (var->type == CHEEVOS_VAR_TYPE_DELTA_MEM)
cheevos_add_char(memaddr, left, 'd');
else if (var->is_bcd)
cheevos_add_char(memaddr, left, 'b');
cheevos_add_string(memaddr, left, "0x");
cheevos_add_var_size(memaddr, left, var);
cheevos_add_hex(memaddr, left, var->value);
}
else if (var->type == CHEEVOS_VAR_TYPE_VALUE_COMP)
{
cheevos_add_uint(memaddr, left, var->value);
}
}
static void cheevos_build_memaddr(const cheevos_condition_t* condition,
char* memaddr, size_t left)
{
size_t i, j;
const cheevos_cond_t* cond;
const cheevos_condset_t *condset;
char *aux = memaddr;
left--; /* reserve one char for the null terminator */
for (i = 0, condset = condition->condsets;
i < condition->count; i++, condset++)
{
if (i != 0)
cheevos_add_char(&aux, &left, 'S');
for (j = 0, cond = condset->conds;
j < condset->count; j++, cond++)
{
if (j != 0)
cheevos_add_char(&aux, &left, '_');
if (cond->type == CHEEVOS_COND_TYPE_RESET_IF)
cheevos_add_string(&aux, &left, "R:");
else if (cond->type == CHEEVOS_COND_TYPE_PAUSE_IF)
cheevos_add_string(&aux, &left, "P:");
else if (cond->type == CHEEVOS_COND_TYPE_ADD_SOURCE)
cheevos_add_string(&aux, &left, "A:");
else if (cond->type == CHEEVOS_COND_TYPE_SUB_SOURCE)
cheevos_add_string(&aux, &left, "B:");
else if (cond->type == CHEEVOS_COND_TYPE_ADD_HITS)
cheevos_add_string(&aux, &left, "C:");
cheevos_add_var(&cond->source, &aux, &left);
switch (cond->op)
{
case CHEEVOS_COND_OP_EQUALS:
cheevos_add_char(&aux, &left, '=');
break;
case CHEEVOS_COND_OP_GREATER_THAN:
cheevos_add_char(&aux, &left, '>');
break;
case CHEEVOS_COND_OP_GREATER_THAN_OR_EQUAL:
cheevos_add_string(&aux, &left, ">=");
break;
case CHEEVOS_COND_OP_LESS_THAN:
cheevos_add_char(&aux, &left, '<');
break;
case CHEEVOS_COND_OP_LESS_THAN_OR_EQUAL:
cheevos_add_string(&aux, &left, "<=");
break;
case CHEEVOS_COND_OP_NOT_EQUAL_TO:
cheevos_add_string(&aux, &left, "!=");
break;
}
cheevos_add_var(&cond->target, &aux, &left);
if (cond->req_hits > 0)
{
cheevos_add_char(&aux, &left, '.');
cheevos_add_uint(&aux, &left, cond->req_hits);
cheevos_add_char(&aux, &left, '.');
}
}
}
*aux = 0;
}
static void cheevos_post_log_cheevo(const cheevo_t* cheevo)
{
char memaddr[256];
if (!cheevo)
return;
cheevos_build_memaddr(&cheevo->condition, memaddr, sizeof(memaddr));
RARCH_LOG("[CHEEVOS]: memaddr (computed): %s\n", memaddr);
}
static void cheevos_log_lboard(const cheevos_leaderboard_t* lb)
{
unsigned i;
char mem[256];
char* aux = NULL;
size_t left = 0;
if (!lb)
return;
RARCH_LOG("[CHEEVOS]: leaderboard %p\n", lb);
RARCH_LOG("[CHEEVOS]: id: %u\n", lb->id);
RARCH_LOG("[CHEEVOS]: title: %s\n", lb->title);
RARCH_LOG("[CHEEVOS]: desc: %s\n", lb->description);
cheevos_build_memaddr(&lb->start, mem, sizeof(mem));
RARCH_LOG("[CHEEVOS]: start: %s\n", mem);
cheevos_build_memaddr(&lb->cancel, mem, sizeof(mem));
RARCH_LOG("[CHEEVOS]: cancel: %s\n", mem);
cheevos_build_memaddr(&lb->submit, mem, sizeof(mem));
RARCH_LOG("[CHEEVOS]: submit: %s\n", mem);
left = sizeof(mem);
aux = mem;
for (i = 0; i < lb->value.count; i++)
{
if (i != 0)
cheevos_add_char(&aux, &left, '_');
cheevos_add_var(&lb->value.terms[i].var, &aux, &left);
cheevos_add_char(&aux, &left, '*');
cheevos_add_int(&aux, &left, lb->value.terms[i].multiplier);
}
RARCH_LOG("[CHEEVOS]: value: %s\n", mem);
}
#endif
static uint32_t cheevos_djb2(const char* str, size_t length)
{
const unsigned char *aux = (const unsigned char*)str;
@ -962,10 +644,8 @@ static int cheevos_parse_condition(
cheevos_cond_count_in_set(memaddr, set);
condset->conds = NULL;
#ifdef CHEEVOS_VERBOSE
RARCH_LOG("[CHEEVOS]: set %p (index=%u)\n", condset, set);
RARCH_LOG("[CHEEVOS]: conds: %u\n", condset->count);
#endif
CHEEVOS_LOG("[CHEEVOS]: set %p (index=%u)\n", condset, set);
CHEEVOS_LOG("[CHEEVOS]: conds: %u\n", condset->count);
if (condset->count)
{
@ -1216,17 +896,9 @@ static int cheevos_new_cheevo(cheevos_readud_t *ud)
!cheevo->badge)
goto error;
#ifdef CHEEVOS_VERBOSE
cheevos_log_cheevo(cheevo, &ud->memaddr);
#endif
if (cheevos_parse_condition(&cheevo->condition, ud->memaddr.string))
goto error;
#ifdef CHEEVOS_VERBOSE
cheevos_post_log_cheevo(cheevo);
#endif
return 0;
error:
@ -1334,12 +1006,10 @@ static int cheevos_new_lboard(cheevos_readud_t *ud)
if (!ldb || !ud)
return -1;
lboard = ldb + ud->lboard_count++;
if (!lboard)
return -1;
lboard->id = strtol(ud->id.string, NULL, 10);
lboard->id = (unsigned)strtol(ud->id.string, NULL, 10);
lboard->format = cheevos_parse_format(&ud->format);
lboard->title = cheevos_dupstr(&ud->title);
lboard->description = cheevos_dupstr(&ud->desc);
@ -1350,10 +1020,6 @@ static int cheevos_new_lboard(cheevos_readud_t *ud)
if (cheevos_parse_mem(lboard, ud->memaddr.string))
goto error;
#ifdef CHEEVOS_VERBOSE
cheevos_log_lboard(lboard);
#endif
return 0;
error:
@ -1896,14 +1562,14 @@ static void cheevos_unlocked(void *task_data, void *user_data,
if (!error)
{
RARCH_LOG("[CHEEVOS]: awarded achievement %u.\n", cheevo->id);
CHEEVOS_LOG("[CHEEVOS]: awarded achievement %u.\n", cheevo->id);
}
else
{
char url[256];
url[0] = '\0';
RARCH_ERR("[CHEEVOS]: error awarding achievement %u, retrying...\n", cheevo->id);
CHEEVOS_ERR("[CHEEVOS]: error awarding achievement %u, retrying...\n", cheevo->id);
cheevos_make_unlock_url(cheevo, url, sizeof(url));
task_push_http_transfer(url, true, NULL, cheevos_unlocked, cheevo);
@ -1951,7 +1617,7 @@ static void cheevos_test_cheevo_set(const cheevoset_t *set)
if (mode == CHEEVOS_ACTIVE_HARDCORE)
cheevo->active &= ~CHEEVOS_ACTIVE_SOFTCORE;
RARCH_LOG("[CHEEVOS]: awarding cheevo %u: %s (%s).\n",
CHEEVOS_LOG("[CHEEVOS]: awarding cheevo %u: %s (%s).\n",
cheevo->id, cheevo->title, cheevo->description);
snprintf(msg, sizeof(msg), "Achievement Unlocked: %s",
@ -1976,9 +1642,9 @@ static void cheevos_test_cheevo_set(const cheevoset_t *set)
if (take_screenshot(shotname, true,
video_driver_cached_frame_has_valid_framebuffer()))
RARCH_LOG("[CHEEVOS]: got a screenshot for cheevo %u\n", cheevo->id);
CHEEVOS_LOG("[CHEEVOS]: got a screenshot for cheevo %u\n", cheevo->id);
else
RARCH_LOG("[CHEEVOS]: failed to get screenshot for cheevo %u\n", cheevo->id);
CHEEVOS_LOG("[CHEEVOS]: failed to get screenshot for cheevo %u\n", cheevo->id);
}
}
@ -2044,7 +1710,7 @@ static int cheevos_expr_value(cheevos_expr_t* expr)
if (expr->compare_count >= ARRAY_SIZE(values))
{
RARCH_ERR("[CHEEVOS]: too many values in the leaderboard expression: %u\n", expr->compare_count);
CHEEVOS_ERR("[CHEEVOS]: too many values in the leaderboard expression: %u\n", expr->compare_count);
return 0;
}
@ -2054,7 +1720,7 @@ static int cheevos_expr_value(cheevos_expr_t* expr)
{
if (current_value >= ARRAY_SIZE(values))
{
RARCH_ERR("[CHEEVOS]: too many values in the leaderboard expression: %u\n", current_value);
CHEEVOS_ERR("[CHEEVOS]: too many values in the leaderboard expression: %u\n", current_value);
return 0;
}
@ -2128,11 +1794,11 @@ static void cheevos_lboard_submit(void *task_data, void *user_data,
if (!error)
{
RARCH_ERR("[CHEEVOS]: error submitting leaderboard %u\n", lboard->id);
CHEEVOS_ERR("[CHEEVOS]: error submitting leaderboard %u\n", lboard->id);
return;
}
RARCH_LOG("[CHEEVOS]: submitted leaderboard %u.\n", lboard->id);
CHEEVOS_LOG("[CHEEVOS]: submitted leaderboard %u.\n", lboard->id);
}
static void cheevos_test_leaderboards(void)
@ -2151,10 +1817,8 @@ static void cheevos_test_leaderboards(void)
if (value != lboard->last_value)
{
#ifdef CHEEVOS_VERBOSE
RARCH_LOG("[CHEEVOS]: value lboard %s %u\n",
CHEEVOS_LOG("[CHEEVOS]: value lboard %s %u\n",
lboard->title, value);
#endif
lboard->last_value = value;
}
@ -2165,7 +1829,7 @@ static void cheevos_test_leaderboards(void)
/* failsafe for improper LBs */
if (value == 0)
{
RARCH_LOG("[CHEEVOS]: error: lboard %s tried to submit 0\n",
CHEEVOS_LOG("[CHEEVOS]: error: lboard %s tried to submit 0\n",
lboard->title);
runloop_msg_queue_push("Leaderboard attempt cancelled!",
0, 2 * 60, false);
@ -2179,7 +1843,7 @@ static void cheevos_test_leaderboards(void)
cheevos_make_lboard_url(lboard, url, sizeof(url));
task_push_http_transfer(url, true, NULL,
cheevos_lboard_submit, lboard);
RARCH_LOG("[CHEEVOS]: submit lboard %s\n", lboard->title);
CHEEVOS_LOG("[CHEEVOS]: submit lboard %s\n", lboard->title);
cheevos_format_value(value, lboard->format,
formatted_value, sizeof(formatted_value));
@ -2192,7 +1856,7 @@ static void cheevos_test_leaderboards(void)
if (cheevos_test_lboard_condition(&lboard->cancel))
{
RARCH_LOG("[CHEEVOS]: cancel lboard %s\n", lboard->title);
CHEEVOS_LOG("[CHEEVOS]: cancel lboard %s\n", lboard->title);
lboard->active = 0;
runloop_msg_queue_push("Leaderboard attempt cancelled!",
0, 2 * 60, false);
@ -2204,7 +1868,7 @@ static void cheevos_test_leaderboards(void)
{
char msg[256];
RARCH_LOG("[CHEEVOS]: start lboard %s\n", lboard->title);
CHEEVOS_LOG("[CHEEVOS]: start lboard %s\n", lboard->title);
lboard->active = 1;
lboard->last_value = -1;
@ -2317,10 +1981,10 @@ static int cheevos_deactivate__json_number(void *userdata,
}
if (found)
RARCH_LOG("[CHEEVOS]: deactivated unlocked cheevo %u (%s).\n",
CHEEVOS_LOG("[CHEEVOS]: deactivated unlocked cheevo %u (%s).\n",
cheevo->id, cheevo->title);
else
RARCH_ERR("[CHEEVOS]: unknown cheevo to deactivate: %u.\n", id);
CHEEVOS_ERR("[CHEEVOS]: unknown cheevo to deactivate: %u.\n", id);
}
return 0;
@ -2516,9 +2180,7 @@ bool cheevos_unload(void)
if (running)
{
#ifdef CHEEVOS_VERBOSE
RARCH_LOG("[CHEEVOS]: Asked the load thread to terminate\n");
#endif
CHEEVOS_LOG("[CHEEVOS]: Asked the load thread to terminate\n");
task_queue_cancel_task(cheevos_locals.task);
#ifdef HAVE_THREADS
@ -2568,7 +2230,7 @@ bool cheevos_toggle_hardcore_mode(void)
if (settings->bools.rewind_enable)
command_event(CMD_EVENT_REWIND_DEINIT, NULL);
RARCH_LOG("%s\n", msg);
CHEEVOS_LOG("%s\n", msg);
runloop_msg_queue_push(msg, 0, 3 * 60, true);
}
else
@ -2612,7 +2274,7 @@ static void cheevos_patch_addresses(cheevoset_t* set)
cheevos_var_patch_addr(&cond->source,
cheevos_locals.console_id);
#ifdef CHEEVOS_DUMP_ADDRS
RARCH_LOG("[CHEEVOS]: s-var %03d:%08X\n",
CHEEVOS_LOG("[CHEEVOS]: s-var %03d:%08X\n",
cond->source.bank_id + 1, cond->source.value);
#endif
break;
@ -2628,7 +2290,7 @@ static void cheevos_patch_addresses(cheevoset_t* set)
cheevos_var_patch_addr(&cond->target,
cheevos_locals.console_id);
#ifdef CHEEVOS_DUMP_ADDRS
RARCH_LOG("[CHEEVOS]: t-var %03d:%08X\n",
CHEEVOS_LOG("[CHEEVOS]: t-var %03d:%08X\n",
cond->target.bank_id + 1, cond->target.value);
#endif
break;
@ -2665,7 +2327,7 @@ static void cheevos_patch_lb_conditions(cheevos_condition_t* condition)
cheevos_var_patch_addr(&cond->source,
cheevos_locals.console_id);
#ifdef CHEEVOS_DUMP_ADDRS
RARCH_LOG("[CHEEVOS]: s-var %03d:%08X\n",
CHEEVOS_LOG("[CHEEVOS]: s-var %03d:%08X\n",
cond->source.bank_id + 1, cond->source.value);
#endif
break;
@ -2679,7 +2341,7 @@ static void cheevos_patch_lb_conditions(cheevos_condition_t* condition)
cheevos_var_patch_addr(&cond->target,
cheevos_locals.console_id);
#ifdef CHEEVOS_DUMP_ADDRS
RARCH_LOG("[CHEEVOS]: t-var %03d:%08X\n",
CHEEVOS_LOG("[CHEEVOS]: t-var %03d:%08X\n",
cond->target.bank_id + 1, cond->target.value);
#endif
break;
@ -2708,7 +2370,7 @@ static void cheevos_patch_lb_expressions(cheevos_expr_t* expression)
case CHEEVOS_VAR_TYPE_DELTA_MEM:
cheevos_var_patch_addr(&term->var, cheevos_locals.console_id);
#ifdef CHEEVOS_DUMP_ADDRS
RARCH_LOG("[CHEEVOS]: s-var %03d:%08X\n",
CHEEVOS_LOG("[CHEEVOS]: s-var %03d:%08X\n",
term->var.bank_id + 1, term->var.value);
#endif
break;
@ -2927,16 +2589,16 @@ static int cheevos_iterate(coro_t *coro)
cheevos_locals.meminfo[3].id = RETRO_MEMORY_RTC;
core_get_memory(&cheevos_locals.meminfo[3]);
RARCH_LOG("[CHEEVOS]: system RAM: %p %u\n",
CHEEVOS_LOG("[CHEEVOS]: system RAM: %p %u\n",
cheevos_locals.meminfo[0].data,
cheevos_locals.meminfo[0].size);
RARCH_LOG("[CHEEVOS]: save RAM: %p %u\n",
CHEEVOS_LOG("[CHEEVOS]: save RAM: %p %u\n",
cheevos_locals.meminfo[1].data,
cheevos_locals.meminfo[1].size);
RARCH_LOG("[CHEEVOS]: video RAM: %p %u\n",
CHEEVOS_LOG("[CHEEVOS]: video RAM: %p %u\n",
cheevos_locals.meminfo[2].data,
cheevos_locals.meminfo[2].size);
RARCH_LOG("[CHEEVOS]: RTC: %p %u\n",
CHEEVOS_LOG("[CHEEVOS]: RTC: %p %u\n",
cheevos_locals.meminfo[3].data,
cheevos_locals.meminfo[3].size);
@ -3034,7 +2696,7 @@ static int cheevos_iterate(coro_t *coro)
{
if (finders[coro->i].ext_hashes[coro->j] == hash)
{
RARCH_LOG("[CHEEVOS]: testing %s.\n",
CHEEVOS_LOG("[CHEEVOS]: testing %s.\n",
finders[coro->i].name);
/*
@ -3059,7 +2721,7 @@ static int cheevos_iterate(coro_t *coro)
if (finders[coro->i].ext_hashes)
continue;
RARCH_LOG("[CHEEVOS]: testing %s.\n",
CHEEVOS_LOG("[CHEEVOS]: testing %s.\n",
finders[coro->i].name);
/*
@ -3072,7 +2734,7 @@ static int cheevos_iterate(coro_t *coro)
goto found;
}
RARCH_LOG("[CHEEVOS]: this game doesn't feature achievements.\n");
CHEEVOS_LOG("[CHEEVOS]: this game doesn't feature achievements.\n");
CORO_STOP();
found:
@ -3098,7 +2760,7 @@ found:
if (!coro->json)
{
runloop_msg_queue_push("Error loading achievements.", 0, 5 * 60, false);
RARCH_ERR("[CHEEVOS]: error loading achievements.\n");
CHEEVOS_ERR("[CHEEVOS]: error loading achievements.\n");
CORO_STOP();
}
#endif
@ -3428,7 +3090,7 @@ found:
{
char gameid[16];
RARCH_LOG(
CHEEVOS_LOG(
"[CHEEVOS]: getting game id for hash %02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x\n",
coro->hash[ 0], coro->hash[ 1], coro->hash[ 2], coro->hash[ 3],
coro->hash[ 4], coro->hash[ 5], coro->hash[ 6], coro->hash[ 7],
@ -3461,14 +3123,14 @@ found:
{
if ((void*)coro->json)
free((void*)coro->json);
RARCH_ERR("[CHEEVOS]: error getting game_id.\n");
CHEEVOS_ERR("[CHEEVOS]: error getting game_id.\n");
CORO_RET();
}
if ((void*)coro->json)
free((void*)coro->json);
RARCH_LOG("[CHEEVOS]: got game id %s.\n", gameid);
coro->gameid = strtol(gameid, NULL, 10);
CHEEVOS_LOG("[CHEEVOS]: got game id %s.\n", gameid);
coro->gameid = (unsigned)strtol(gameid, NULL, 10);
CORO_RET();
}
@ -3497,11 +3159,11 @@ found:
if (!coro->json)
{
RARCH_ERR("[CHEEVOS]: error getting achievements for game id %u.\n", coro->gameid);
CHEEVOS_ERR("[CHEEVOS]: error getting achievements for game id %u.\n", coro->gameid);
CORO_STOP();
}
RARCH_LOG("[CHEEVOS]: got achievements for game id %u.\n", coro->gameid);
CHEEVOS_LOG("[CHEEVOS]: got achievements for game id %u.\n", coro->gameid);
CORO_RET();
/**************************************************************************
@ -3554,7 +3216,7 @@ found:
if (!badge_exists(coro->badge_fullpath))
{
#ifdef CHEEVOS_LOG_BADGES
RARCH_LOG(
CHEEVOS_LOG(
"[CHEEVOS]: downloading badge %s\n",
coro->badge_fullpath);
#endif
@ -3569,7 +3231,7 @@ found:
{
if (!filestream_write_file(coro->badge_fullpath,
coro->json, coro->k))
RARCH_ERR("[CHEEVOS]: error writing badge %s\n", coro->badge_fullpath);
CHEEVOS_ERR("[CHEEVOS]: error writing badge %s\n", coro->badge_fullpath);
else
free(coro->json);
}
@ -3589,29 +3251,46 @@ found:
{
char urle_user[64];
char urle_pwd[64];
char urle_login[64];
const char *username = coro ? coro->settings->arrays.cheevos_username : NULL;
const char *password = coro ? coro->settings->arrays.cheevos_password : NULL;
const char *login;
bool via_token;
if (!username || !*username || !password || !*password)
if (coro)
{
if (string_is_empty(coro->settings->arrays.cheevos_password))
{
via_token = true;
login = coro->settings->arrays.cheevos_token;
}
else
{
via_token = false;
login = coro->settings->arrays.cheevos_password;
}
}
else
login = NULL;
if (string_is_empty(username) || string_is_empty(login))
{
runloop_msg_queue_push(
"Missing Retro Achievements account information.",
"Missing RetroAchievements account information.",
0, 5 * 60, false);
runloop_msg_queue_push(
"Please fill in your account information in Settings.",
0, 5 * 60, false);
RARCH_ERR("[CHEEVOS]: username and/or password not informed.\n");
CHEEVOS_ERR("[CHEEVOS]: login info not informed.\n");
CORO_STOP();
}
cheevos_url_encode(username, urle_user, sizeof(urle_user));
cheevos_url_encode(password, urle_pwd, sizeof(urle_pwd));
cheevos_url_encode(login, urle_login, sizeof(urle_login));
snprintf(
coro->url, sizeof(coro->url),
"http://retroachievements.org/dorequest.php?r=login&u=%s&p=%s",
urle_user, urle_pwd
"http://retroachievements.org/dorequest.php?r=login&u=%s&%c=%s",
urle_user, via_token ? 't' : 'p', urle_login
);
coro->url[sizeof(coro->url) - 1] = 0;
@ -3626,32 +3305,67 @@ found:
if (coro->json)
{
int res = cheevos_get_value(
char error_response[64];
char error_message[256];
cheevos_get_value(
coro->json,
CHEEVOS_JSON_KEY_ERROR,
error_response,
sizeof(error_response)
);
/* No error, continue with login */
if (string_is_empty(error_response))
{
int res = cheevos_get_value(
coro->json,
CHEEVOS_JSON_KEY_TOKEN,
cheevos_locals.token,
sizeof(cheevos_locals.token));
if ((void*)coro->json)
free((void*)coro->json);
if (!res)
{
if (coro->settings->bools.cheevos_verbose_enable)
{
char msg[256];
snprintf(msg, sizeof(msg),
"RetroAchievements: Logged in as \"%s\".",
coro->settings->arrays.cheevos_username);
msg[sizeof(msg) - 1] = 0;
runloop_msg_queue_push(msg, 0, 3 * 60, false);
}
/* Save token to config and clear pass on success */
*coro->settings->arrays.cheevos_password = '\0';
strncpy(
coro->settings->arrays.cheevos_token,
cheevos_locals.token, sizeof(cheevos_locals.token)
);
CORO_RET();
}
}
if ((void*)coro->json)
free((void*)coro->json);
if (!res)
{
if (coro->settings->bools.cheevos_verbose_enable)
{
char msg[256];
snprintf(msg, sizeof(msg),
"RetroAchievements: logged in as \"%s\".",
coro->settings->arrays.cheevos_username);
msg[sizeof(msg) - 1] = 0;
runloop_msg_queue_push(msg, 0, 3 * 60, false);
}
CORO_RET();
}
/* Site returned error, display it */
snprintf(error_message, sizeof(error_message),
"RetroAchievements: %s",
error_response);
error_message[sizeof(error_message) - 1] = 0;
runloop_msg_queue_push(error_message, 0, 5 * 60, false);
*coro->settings->arrays.cheevos_token = '\0';
CORO_STOP();
}
runloop_msg_queue_push("Retro Achievements login error.", 0, 5 * 60, false);
RARCH_ERR("[CHEEVOS]: error getting user token.\n");
runloop_msg_queue_push("RetroAchievements: Error contacting server.", 0, 5 * 60, false);
CHEEVOS_ERR("[CHEEVOS]: error getting user token.\n");
CORO_STOP();
/**************************************************************************
@ -3682,7 +3396,7 @@ found:
for (coro->k = 0; coro->k < 5; coro->k++)
{
if (coro->k != 0)
RARCH_LOG("[CHEEVOS]: Retrying HTTP request: %u of 5\n", coro->k + 1);
CHEEVOS_LOG("[CHEEVOS]: Retrying HTTP request: %u of 5\n", coro->k + 1);
coro->json = NULL;
coro->conn = net_http_connection_new(
@ -3733,7 +3447,7 @@ found:
coro->json[length] = 0;
}
coro->k = length;
coro->k = (unsigned)length;
net_http_delete(coro->http);
net_http_connection_free(coro->conn);
CORO_RET();
@ -3744,7 +3458,7 @@ found:
net_http_connection_free(coro->conn);
}
RARCH_LOG("[CHEEVOS]: Couldn't connect to server after 5 tries\n");
CHEEVOS_LOG("[CHEEVOS]: Couldn't connect to server after 5 tries\n");
CORO_RET();
/**************************************************************************
@ -3776,15 +3490,15 @@ found:
if (coro->json)
{
if (!cheevos_deactivate_unlocks(coro->json, CHEEVOS_ACTIVE_SOFTCORE))
RARCH_LOG("[CHEEVOS]: deactivated unlocked achievements in softcore mode.\n");
CHEEVOS_LOG("[CHEEVOS]: deactivated unlocked achievements in softcore mode.\n");
else
RARCH_ERR("[CHEEVOS]: error deactivating unlocked achievements in softcore mode.\n");
CHEEVOS_ERR("[CHEEVOS]: error deactivating unlocked achievements in softcore mode.\n");
if ((void*)coro->json)
free((void*)coro->json);
}
else
RARCH_ERR("[CHEEVOS]: error retrieving list of unlocked achievements in softcore mode.\n");
CHEEVOS_ERR("[CHEEVOS]: error retrieving list of unlocked achievements in softcore mode.\n");
/* Deactivate achievements in hardcore mode. */
snprintf(
@ -3805,15 +3519,15 @@ found:
if (coro->json)
{
if (!cheevos_deactivate_unlocks(coro->json, CHEEVOS_ACTIVE_HARDCORE))
RARCH_LOG("[CHEEVOS]: deactivated unlocked achievements in hardcore mode.\n");
CHEEVOS_LOG("[CHEEVOS]: deactivated unlocked achievements in hardcore mode.\n");
else
RARCH_ERR("[CHEEVOS]: error deactivating unlocked achievements in hardcore mode.\n");
CHEEVOS_ERR("[CHEEVOS]: error deactivating unlocked achievements in hardcore mode.\n");
if ((void*)coro->json)
free((void*)coro->json);
}
else
RARCH_ERR("[CHEEVOS]: error retrieving list of unlocked achievements in hardcore mode.\n");
CHEEVOS_ERR("[CHEEVOS]: error retrieving list of unlocked achievements in hardcore mode.\n");
#endif
CORO_RET();
@ -3842,14 +3556,14 @@ found:
if (coro->json)
{
RARCH_LOG("[CHEEVOS]: posted playing activity.\n");
CHEEVOS_LOG("[CHEEVOS]: posted playing activity.\n");
if ((void*)coro->json)
free((void*)coro->json);
}
else
RARCH_ERR("[CHEEVOS]: error posting playing activity.\n");
CHEEVOS_ERR("[CHEEVOS]: error posting playing activity.\n");
RARCH_LOG("[CHEEVOS]: posted playing activity.\n");
CHEEVOS_LOG("[CHEEVOS]: posted playing activity.\n");
CORO_RET();
CORO_LEAVE();
@ -3870,16 +3584,14 @@ static void cheevos_task_handler(retro_task_t *task)
cheevos_locals.task = NULL;
CHEEVOS_UNLOCK(cheevos_locals.task_lock);
#ifdef CHEEVOS_VERBOSE
if (task_get_cancelled(task))
{
RARCH_LOG("[CHEEVOS]: Load task cancelled\n");
CHEEVOS_LOG("[CHEEVOS]: Load task cancelled\n");
}
else
{
RARCH_LOG("[CHEEVOS]: Load task finished\n");
CHEEVOS_LOG("[CHEEVOS]: Load task finished\n");
}
#endif
if (coro->data)
free(coro->data);

View File

@ -38,6 +38,20 @@ End of setup
#define CHEEVOS_TAG "[CHEEVOS]: "
#ifdef CHEEVOS_VERBOSE
#define CHEEVOS_LOG RARCH_LOG
#define CHEEVOS_ERR RARCH_ERR
#else
void cheevos_log(const char *fmt, ...);
#define CHEEVOS_LOG cheevos_log
#define CHEEVOS_ERR cheevos_log
#endif
typedef struct cheevos_ctx_desc
{
unsigned idx;

View File

@ -65,7 +65,7 @@ static cheevos_cond_op_t cheevos_cond_parse_operator(const char** memaddr)
}
else
{
RARCH_ERR(CHEEVOS_TAG "unknown operator %c\n.", *str);
CHEEVOS_ERR(CHEEVOS_TAG "unknown operator %c\n.", *str);
op = CHEEVOS_COND_OP_EQUALS;
}
@ -168,9 +168,6 @@ void cheevos_cond_parse_in_set(cheevos_cond_t* cond, const char* memaddr, unsign
if (index == which)
{
cheevos_cond_parse(cond, &memaddr);
#ifdef CHEEVOS_VERBOSE
/*cheevos_log_cond(cond);*/
#endif
cond++;
}
else

View File

@ -24,17 +24,6 @@
#include "../core.h"
#include "../verbosity.h"
static void STUB_LOG(const char *fmt, ...)
{
(void)fmt;
}
#ifdef CHEEVOS_VERBOSE
#define CHEEVOS_LOG RARCH_LOG
#else
#define CHEEVOS_LOG STUB_LOG
#endif
/*****************************************************************************
Parsing
*****************************************************************************/
@ -191,12 +180,6 @@ void cheevos_var_patch_addr(cheevos_var_t* var, cheevos_console_t console)
var->value -= 0x2000;
}
}
else if (console == CHEEVOS_CONSOLE_NEOGEO_POCKET)
{
if (var->value >= 0x4000 && var->value <= 0x7fff)
CHEEVOS_LOG(CHEEVOS_TAG "NGP memory address %X adjusted to %X\n", var->value, var->value - 0x004000);
var->value -= 0x4000;
}
if (system->mmaps.num_descriptors != 0)
{
@ -333,7 +316,7 @@ uint8_t* cheevos_var_get_memory(const cheevos_var_t* var)
meminfo.id = RETRO_MEMORY_RTC;
break;
default:
RARCH_ERR(CHEEVOS_TAG "invalid bank id: %s\n", var->bank_id);
CHEEVOS_ERR(CHEEVOS_TAG "invalid bank id: %s\n", var->bank_id);
break;
}

View File

@ -169,6 +169,7 @@ static const struct cmd_map map[] = {
{ "DISK_NEXT", RARCH_DISK_NEXT },
{ "DISK_PREV", RARCH_DISK_PREV },
{ "GRAB_MOUSE_TOGGLE", RARCH_GRAB_MOUSE_TOGGLE },
{ "UI_COMPANION_TOGGLE", RARCH_UI_COMPANION_TOGGLE },
{ "GAME_FOCUS_TOGGLE", RARCH_GAME_FOCUS_TOGGLE },
{ "MENU_TOGGLE", RARCH_MENU_TOGGLE },
{ "MENU_UP", RETRO_DEVICE_ID_JOYPAD_UP },
@ -1015,7 +1016,7 @@ static void command_event_init_controllers(void)
/* Ideally these checks shouldn't be required but if we always
* call core_set_controller_port_device input won't work on
* cores that don't set port information properly */
if (info && info->ports.size != 0 && i < info->ports.size)
if (info && info->ports.size != 0)
set_controller = true;
break;
default:
@ -1029,7 +1030,7 @@ static void command_event_init_controllers(void)
break;
}
if (set_controller)
if (set_controller && i < info->ports.size)
{
pad.device = device;
pad.port = i;
@ -1705,17 +1706,11 @@ void command_playlist_update_write(
const char *core_path,
const char *core_display_name,
const char *crc32,
const char *db_name)
const char *db_name)
{
playlist_t *plist = (playlist_t*)data;
playlist_t *playlist = NULL;
playlist_t *playlist = plist ? plist : playlist_get_cached();
if (plist)
playlist = plist;
#ifdef HAVE_MENU
else
menu_driver_ctl(RARCH_MENU_CTL_PLAYLIST_GET, &playlist);
#endif
if (!playlist)
return;
@ -1793,10 +1788,11 @@ bool command_event(enum event_command cmd, void *data)
return false;
#endif
libretro_get_system_info(
if (!libretro_get_system_info(
core_path,
system,
&system_info->load_no_content);
&system_info->load_no_content))
return false;
info_find.path = core_path;
if (!core_info_load(&info_find))
@ -1809,11 +1805,17 @@ bool command_event(enum event_command cmd, void *data)
}
break;
case CMD_EVENT_LOAD_CORE:
command_event(CMD_EVENT_LOAD_CORE_PERSIST, NULL);
{
bool success = command_event(CMD_EVENT_LOAD_CORE_PERSIST, NULL);
#ifndef HAVE_DYNAMIC
command_event(CMD_EVENT_QUIT, NULL);
#else
if (!success)
return false;
#endif
break;
}
case CMD_EVENT_LOAD_STATE:
/* Immutable - disallow savestate load when
* we absolutely cannot change game state. */
@ -1931,7 +1933,7 @@ bool command_event(enum event_command cmd, void *data)
cheevos_toggle_hardcore_mode();
#endif
break;
/* this fallthrough is on purpose, it should do
/* this fallthrough is on purpose, it should do
a CMD_EVENT_REINIT too */
case CMD_EVENT_REINIT_FROM_TOGGLE:
retroarch_unset_forced_fullscreen();
@ -2016,7 +2018,7 @@ TODO: Add a setting for these tweaks */
case CMD_EVENT_AUTOSAVE_INIT:
command_event(CMD_EVENT_AUTOSAVE_DEINIT, NULL);
#ifdef HAVE_THREADS
{
{
#ifdef HAVE_NETWORKING
/* Only enable state manager if netplay is not underway
TODO: Add a setting for these tweaks */
@ -2030,7 +2032,7 @@ TODO: Add a setting for these tweaks */
else
runloop_unset(RUNLOOP_ACTION_AUTOSAVE);
}
}
}
#endif
break;
case CMD_EVENT_AUTOSAVE_STATE:
@ -2202,11 +2204,22 @@ TODO: Add a setting for these tweaks */
break;
case CMD_EVENT_CORE_INFO_INIT:
{
char ext_name[255];
settings_t *settings = config_get_ptr();
ext_name[0] = '\0';
command_event(CMD_EVENT_CORE_INFO_DEINIT, NULL);
if (!frontend_driver_get_core_extension(ext_name, sizeof(ext_name)))
return false;
if (!string_is_empty(settings->paths.directory_libretro))
core_info_init_list();
core_info_init_list(settings->paths.path_libretro_info,
settings->paths.directory_libretro,
ext_name,
settings->bools.show_hidden_files
);
}
break;
case CMD_EVENT_CORE_DEINIT:
@ -2301,7 +2314,7 @@ TODO: Add a setting for these tweaks */
case CMD_EVENT_RESUME:
rarch_menu_running_finished();
if (ui_companion_is_on_foreground())
ui_companion_driver_toggle();
ui_companion_driver_toggle(false);
break;
case CMD_EVENT_ADD_TO_FAVORITES:
{
@ -2350,7 +2363,7 @@ TODO: Add a setting for these tweaks */
runloop_msg_queue_push(msg_hash_to_str(MSG_RESET_CORE_ASSOCIATION), 1, 180, true);
break;
}
}
case CMD_EVENT_RESTART_RETROARCH:
if (!frontend_driver_set_fork(FRONTEND_FORK_RESTART))
return false;
@ -2572,7 +2585,7 @@ TODO: Add a setting for these tweaks */
case CMD_EVENT_FULLSCREEN_TOGGLE:
{
settings_t *settings = config_get_ptr();
bool new_fullscreen_state = !settings->bools.video_fullscreen
bool new_fullscreen_state = !settings->bools.video_fullscreen
&& !retroarch_is_forced_fullscreen();
if (!video_driver_has_windowed())
return false;
@ -2731,6 +2744,11 @@ TODO: Add a setting for these tweaks */
video_driver_show_mouse();
}
break;
case CMD_EVENT_UI_COMPANION_TOGGLE:
{
ui_companion_driver_toggle(true);
break;
}
case CMD_EVENT_GAME_FOCUS_TOGGLE:
{
static bool game_focus_state = false;

View File

@ -139,7 +139,7 @@ enum event_command
/* Add a playlist entry to favorites. */
CMD_EVENT_ADD_TO_FAVORITES,
/* Reset playlist entry associated core to DETECT */
CMD_EVENT_RESET_CORE_ASSOCIATION,
CMD_EVENT_RESET_CORE_ASSOCIATION,
/* Toggles pause. */
CMD_EVENT_PAUSE_TOGGLE,
/* Pauses RetroArch. */
@ -218,6 +218,8 @@ enum event_command
CMD_EVENT_GRAB_MOUSE_TOGGLE,
/* Toggles game focus. */
CMD_EVENT_GAME_FOCUS_TOGGLE,
/* Toggles desktop menu. */
CMD_EVENT_UI_COMPANION_TOGGLE,
/* Toggles fullscreen mode. */
CMD_EVENT_FULLSCREEN_TOGGLE,
CMD_EVENT_PERFCNT_REPORT_FRONTEND_LOG,
@ -271,7 +273,7 @@ void command_playlist_push_write(
void command_playlist_update_write(
void *data,
size_t idx,
const char *path,
const char *path,
const char *label,
const char *core_path,
const char *core_display_name,

View File

@ -67,6 +67,10 @@ static bool bundle_assets_extract_enable = false;
static bool materialui_icons_enable = true;
#endif
static const bool crt_switch_resolution = false;
static const int crt_switch_resolution_super = 2560;
static const bool def_history_list_enable = true;
static const bool def_playlist_entry_remove = true;
static const bool def_playlist_entry_rename = true;
@ -293,6 +297,7 @@ static bool content_show_history = true;
#ifdef HAVE_LIBRETRODB
static bool content_show_add = true;
#endif
static bool content_show_playlists = true;
#ifdef HAVE_XMB
static unsigned xmb_scale_factor = 100;
@ -300,6 +305,7 @@ static unsigned xmb_alpha_factor = 75;
static unsigned menu_font_color_red = 255;
static unsigned menu_font_color_green = 255;
static unsigned menu_font_color_blue = 255;
static unsigned xmb_menu_layout = 0;
static unsigned xmb_icon_theme = XMB_ICON_THEME_MONOCHROME;
static unsigned xmb_theme = XMB_THEME_ELECTRIC_BLUE;
#if defined(HAVE_LAKKA) || defined(__arm__) || defined(__PPC64__) || defined(__ppc64__) || defined(__powerpc64__) || defined(__powerpc__) || defined(__ppc__) || defined(__POWERPC__)
@ -589,6 +595,12 @@ static const float slowmotion_ratio = 3.0;
/* Maximum fast forward ratio. */
static const float fastforward_ratio = 0.0;
/* Run core logic one or more frames ahead then load the state back to reduce perceived input lag. */
static const unsigned run_ahead_frames = 1;
/* When using the Run Ahead feature, use a secondary instance of the core. */
static const bool run_ahead_secondary_instance = true;
/* Enable stdin/network command interface. */
static const bool network_cmd_enable = false;
static const uint16_t network_cmd_port = 55355;
@ -646,6 +658,10 @@ static const unsigned input_bind_timeout = 5;
static const unsigned menu_thumbnails_default = 3;
static const unsigned menu_left_thumbnails_default = 0;
static const bool xmb_vertical_thumbnails = false;
#ifdef IOS
static const bool ui_companion_start_on_boot = false;
#else
@ -654,6 +670,12 @@ static const bool ui_companion_start_on_boot = true;
static const bool ui_companion_enable = false;
/* Currently only used to show the WIMP UI on startup */
static const bool ui_companion_toggle = false;
/* Only init the WIMP UI for this session if this is enabled */
static const bool desktop_menu_enable = true;
#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)

View File

@ -97,6 +97,7 @@ static const struct retro_keybind retro_keybinds_1[] = {
{ true, RARCH_DISK_PREV, MENU_ENUM_LABEL_VALUE_INPUT_META_DISK_PREV, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE },
{ true, RARCH_GRAB_MOUSE_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_GRAB_MOUSE_TOGGLE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE },
{ true, RARCH_GAME_FOCUS_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_GAME_FOCUS_TOGGLE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE },
{ true, RARCH_UI_COMPANION_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_UI_COMPANION_TOGGLE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE },
{ true, RARCH_MENU_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_MENU_TOGGLE, RETROK_SPACE, NO_BTN, NO_BTN, 0, AXIS_NONE },
#else
{ true, RETRO_DEVICE_ID_JOYPAD_B, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_B, RETROK_z, NO_BTN, NO_BTN, 0, AXIS_NONE },
@ -172,6 +173,7 @@ static const struct retro_keybind retro_keybinds_1[] = {
{ true, RARCH_DISK_PREV, MENU_ENUM_LABEL_VALUE_INPUT_META_DISK_PREV, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE },
{ true, RARCH_GRAB_MOUSE_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_GRAB_MOUSE_TOGGLE, RETROK_F11, NO_BTN, NO_BTN, 0, AXIS_NONE },
{ true, RARCH_GAME_FOCUS_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_GAME_FOCUS_TOGGLE, RETROK_SCROLLOCK, NO_BTN, NO_BTN, 0, AXIS_NONE },
{ true, RARCH_UI_COMPANION_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_UI_COMPANION_TOGGLE, RETROK_F5, NO_BTN, NO_BTN, 0, AXIS_NONE },
{ true, RARCH_MENU_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_MENU_TOGGLE, RETROK_F1, NO_BTN, NO_BTN, 0, AXIS_NONE },
#endif
};

View File

@ -1033,6 +1033,7 @@ static struct config_array_setting *populate_settings_array(settings_t *settings
#ifdef HAVE_CHEEVOS
SETTING_ARRAY("cheevos_username", settings->arrays.cheevos_username, false, NULL, true);
SETTING_ARRAY("cheevos_password", settings->arrays.cheevos_password, false, NULL, true);
SETTING_ARRAY("cheevos_token", settings->arrays.cheevos_token, false, NULL, true);
#endif
SETTING_ARRAY("video_context_driver", settings->arrays.video_context_driver, false, NULL, true);
SETTING_ARRAY("audio_driver", settings->arrays.audio_driver, false, NULL, true);
@ -1179,6 +1180,8 @@ static struct config_bool_setting *populate_settings_bool(settings_t *settings,
SETTING_BOOL("automatically_add_content_to_playlist", &settings->bools.automatically_add_content_to_playlist, true, automatically_add_content_to_playlist, false);
SETTING_BOOL("ui_companion_start_on_boot", &settings->bools.ui_companion_start_on_boot, true, ui_companion_start_on_boot, false);
SETTING_BOOL("ui_companion_enable", &settings->bools.ui_companion_enable, true, ui_companion_enable, false);
SETTING_BOOL("ui_companion_toggle", &settings->bools.ui_companion_toggle, false, ui_companion_toggle, false);
SETTING_BOOL("desktop_menu_enable", &settings->bools.desktop_menu_enable, true, desktop_menu_enable, false);
SETTING_BOOL("video_gpu_record", &settings->bools.video_gpu_record, true, gpu_record, false);
SETTING_BOOL("input_remap_binds_enable", &settings->bools.input_remap_binds_enable, true, true, false);
SETTING_BOOL("all_users_control_menu", &settings->bools.input_all_users_control_menu, true, all_users_control_menu, false);
@ -1220,6 +1223,8 @@ static struct config_bool_setting *populate_settings_bool(settings_t *settings,
SETTING_BOOL("ui_menubar_enable", &settings->bools.ui_menubar_enable, true, true, false);
SETTING_BOOL("suspend_screensaver_enable", &settings->bools.ui_suspend_screensaver_enable, true, true, false);
SETTING_BOOL("rewind_enable", &settings->bools.rewind_enable, true, rewind_enable, false);
SETTING_BOOL("run_ahead_enabled", &settings->bools.run_ahead_enabled, true, false, false);
SETTING_BOOL("run_ahead_secondary_instance", &settings->bools.run_ahead_secondary_instance, true, false, false);
SETTING_BOOL("audio_sync", &settings->bools.audio_sync, true, audio_sync, false);
SETTING_BOOL("video_shader_enable", &settings->bools.video_shader_enable, true, shader_enable, false);
SETTING_BOOL("video_shader_watch_files", &settings->bools.video_shader_watch_files, true, video_shader_watch_files, false);
@ -1242,6 +1247,7 @@ static struct config_bool_setting *populate_settings_bool(settings_t *settings,
SETTING_BOOL("video_vsync", &settings->bools.video_vsync, true, vsync, false);
SETTING_BOOL("video_hard_sync", &settings->bools.video_hard_sync, true, hard_sync, false);
SETTING_BOOL("video_black_frame_insertion", &settings->bools.video_black_frame_insertion, true, black_frame_insertion, false);
SETTING_BOOL("crt_switch_resolution", &settings->bools.crt_switch_resolution, true, crt_switch_resolution, false);
SETTING_BOOL("video_disable_composition", &settings->bools.video_disable_composition, true, disable_composition, false);
SETTING_BOOL("pause_nonactive", &settings->bools.pause_nonactive, true, pause_nonactive, false);
SETTING_BOOL("video_gpu_screenshot", &settings->bools.video_gpu_screenshot, true, gpu_screenshot, false);
@ -1249,6 +1255,7 @@ static struct config_bool_setting *populate_settings_bool(settings_t *settings,
SETTING_BOOL("keyboard_gamepad_enable", &settings->bools.input_keyboard_gamepad_enable, true, true, false);
SETTING_BOOL("core_set_supports_no_game_enable", &settings->bools.set_supports_no_game_enable, true, true, false);
SETTING_BOOL("audio_enable", &settings->bools.audio_enable, true, audio_enable, false);
SETTING_BOOL("audio_enable_menu", &settings->bools.audio_enable_menu, true, false, false);
SETTING_BOOL("audio_mute_enable", audio_get_bool_ptr(AUDIO_ACTION_MUTE_ENABLE), true, false, false);
SETTING_BOOL("audio_mixer_mute_enable", audio_get_bool_ptr(AUDIO_ACTION_MIXER_MUTE_ENABLE), true, false, false);
SETTING_BOOL("location_allow", &settings->bools.location_allow, true, false, false);
@ -1309,10 +1316,14 @@ static struct config_bool_setting *populate_settings_bool(settings_t *settings,
#ifdef HAVE_LIBRETRODB
SETTING_BOOL("content_show_add", &settings->bools.menu_content_show_add, true, content_show_add, false);
#endif
SETTING_BOOL("content_show_playlists", &settings->bools.menu_content_show_playlists, true, content_show_playlists, false);
SETTING_BOOL("menu_show_load_core", &settings->bools.menu_show_load_core, true, menu_show_load_core, false);
SETTING_BOOL("menu_show_load_content", &settings->bools.menu_show_load_content, true, menu_show_load_content, false);
SETTING_BOOL("menu_show_information", &settings->bools.menu_show_information, true, menu_show_information, false);
SETTING_BOOL("menu_show_configurations", &settings->bools.menu_show_configurations, true, menu_show_configurations, false);
SETTING_BOOL("menu_show_latency", &settings->bools.menu_show_latency, true, true, false);
SETTING_BOOL("menu_show_rewind", &settings->bools.menu_show_rewind, true, true, false);
SETTING_BOOL("menu_show_overlays", &settings->bools.menu_show_overlays, true, true, false);
SETTING_BOOL("menu_show_help", &settings->bools.menu_show_help, true, menu_show_help, false);
SETTING_BOOL("menu_show_quit_retroarch", &settings->bools.menu_show_quit_retroarch, true, menu_show_quit_retroarch, false);
SETTING_BOOL("menu_show_reboot", &settings->bools.menu_show_reboot, true, menu_show_reboot, false);
@ -1327,8 +1338,14 @@ static struct config_bool_setting *populate_settings_bool(settings_t *settings,
#ifdef HAVE_MATERIALUI
SETTING_BOOL("materialui_icons_enable", &settings->bools.menu_materialui_icons_enable, true, materialui_icons_enable, false);
#endif
#ifdef HAVE_RGUI
SETTING_BOOL("rgui_background_filler_thickness_enable", &settings->bools.menu_rgui_background_filler_thickness_enable, true, true, false);
SETTING_BOOL("rgui_border_filler_thickness_enable", &settings->bools.menu_rgui_border_filler_thickness_enable, true, true, false);
SETTING_BOOL("rgui_border_filler_enable", &settings->bools.menu_rgui_border_filler_enable, true, true, false);
#endif
#ifdef HAVE_XMB
SETTING_BOOL("xmb_shadows_enable", &settings->bools.menu_xmb_shadows_enable, true, xmb_shadows_enable, false);
SETTING_BOOL("xmb_vertical_thumbnails", &settings->bools.menu_xmb_vertical_thumbnails, true, xmb_vertical_thumbnails, false);
#endif
#endif
#ifdef HAVE_CHEEVOS
@ -1355,9 +1372,6 @@ static struct config_bool_setting *populate_settings_bool(settings_t *settings,
#ifdef HAVE_NETWORKGAMEPAD
SETTING_BOOL("network_remote_enable", &settings->bools.network_remote_enable, false, false /* TODO */, false);
#endif
#ifdef HAVE_KEYMAPPER
SETTING_BOOL("keymapper_enable", &settings->bools.keymapper_enable, true, true /* TODO */, false);
#endif
#ifdef HAVE_NETWORKING
SETTING_BOOL("netplay_nat_traversal", &settings->bools.netplay_nat_traversal, true, true, false);
#endif
@ -1462,9 +1476,6 @@ static struct config_uint_setting *populate_settings_uint(settings_t *settings,
#ifdef HAVE_NETWORKGAMEPAD
SETTING_UINT("network_remote_base_port", &settings->uints.network_remote_base_port, true, network_remote_base_port, false);
#endif
#ifdef HAVE_KEYMAPPER
SETTING_UINT("keymapper_port", &settings->uints.keymapper_port, true, 0, false);
#endif
#ifdef GEKKO
SETTING_UINT("video_viwidth", &settings->uints.video_viwidth, true, video_viwidth, false);
#endif
@ -1472,8 +1483,10 @@ static struct config_uint_setting *populate_settings_uint(settings_t *settings,
SETTING_UINT("dpi_override_value", &settings->uints.menu_dpi_override_value, true, menu_dpi_override_value, false);
SETTING_UINT("menu_thumbnails", &settings->uints.menu_thumbnails, true, menu_thumbnails_default, false);
#ifdef HAVE_XMB
SETTING_UINT("menu_left_thumbnails", &settings->uints.menu_left_thumbnails, true, menu_left_thumbnails_default, false);
SETTING_UINT("xmb_alpha_factor", &settings->uints.menu_xmb_alpha_factor, true, xmb_alpha_factor, false);
SETTING_UINT("xmb_scale_factor", &settings->uints.menu_xmb_scale_factor, true, xmb_scale_factor, false);
SETTING_UINT("xmb_layout", &settings->uints.menu_xmb_layout, true, xmb_menu_layout, false);
SETTING_UINT("xmb_theme", &settings->uints.menu_xmb_theme, true, xmb_icon_theme, false);
SETTING_UINT("xmb_menu_color_theme", &settings->uints.menu_xmb_color_theme, true, xmb_theme, false);
SETTING_UINT("menu_font_color_red", &settings->uints.menu_font_color_red, true, menu_font_color_red, false);
@ -1485,6 +1498,7 @@ static struct config_uint_setting *populate_settings_uint(settings_t *settings,
#endif
SETTING_UINT("audio_out_rate", &settings->uints.audio_out_rate, true, out_rate, false);
SETTING_UINT("custom_viewport_width", &settings->video_viewport_custom.width, false, 0 /* TODO */, false);
SETTING_UINT("crt_switch_resolution_super", &settings->uints.crt_switch_resolution_super, true, crt_switch_resolution_super, false);
SETTING_UINT("custom_viewport_height", &settings->video_viewport_custom.height, false, 0 /* TODO */, false);
SETTING_UINT("custom_viewport_x", (unsigned*)&settings->video_viewport_custom.x, false, 0 /* TODO */, false);
SETTING_UINT("custom_viewport_y", (unsigned*)&settings->video_viewport_custom.y, false, 0 /* TODO */, false);
@ -1513,6 +1527,8 @@ static struct config_uint_setting *populate_settings_uint(settings_t *settings,
SETTING_UINT("video_msg_bgcolor_green", &settings->uints.video_msg_bgcolor_green, true, message_bgcolor_green, false);
SETTING_UINT("video_msg_bgcolor_blue", &settings->uints.video_msg_bgcolor_blue, true, message_bgcolor_blue, false);
SETTING_UINT("run_ahead_frames", &settings->uints.run_ahead_frames, true, 1, false);
*size = count;
return tmp;
@ -1712,6 +1728,7 @@ static void config_set_defaults(void)
#ifdef HAVE_CHEEVOS
*settings->arrays.cheevos_username = '\0';
*settings->arrays.cheevos_password = '\0';
*settings->arrays.cheevos_token = '\0';
#endif
input_config_reset();
@ -2926,7 +2943,7 @@ bool config_load_override(void)
config_file_t *new_conf = NULL;
bool should_append = false;
rarch_system_info_t *system = runloop_get_system_info();
const char *core_name = system ?
const char *core_name = system ?
system->info.library_name : NULL;
const char *game_name = path_basename(path_get(RARCH_PATH_BASENAME));
@ -3014,7 +3031,7 @@ bool config_load_override(void)
if (!should_append)
goto error;
/* Re-load the configuration with any overrides
/* Re-load the configuration with any overrides
* that might have been found */
buf[0] = '\0';
@ -3099,7 +3116,7 @@ bool config_unload_override(void)
bool config_load_remap(void)
{
size_t path_size = PATH_MAX_LENGTH * sizeof(char);
char *remap_directory = NULL;
char *remap_directory = NULL;
char *core_path = NULL;
char *game_path = NULL;
config_file_t *new_conf = NULL;
@ -3119,12 +3136,12 @@ bool config_load_remap(void)
/* path to the directory containing retroarch.cfg (prefix) */
remap_directory = (char*)
malloc(PATH_MAX_LENGTH * sizeof(char));
/* final path for core-specific configuration (prefix+suffix) */
/* final path for core-specific configuration (prefix+suffix) */
core_path = (char*)
malloc(PATH_MAX_LENGTH * sizeof(char));
/* final path for game-specific configuration (prefix+suffix) */
game_path = (char*)
malloc(PATH_MAX_LENGTH * sizeof(char));
malloc(PATH_MAX_LENGTH * sizeof(char));
remap_directory[0] = core_path[0] = game_path[0] = '\0';
strlcpy(remap_directory,
@ -3226,7 +3243,7 @@ bool config_load_shader_preset(void)
char *parent_path = NULL;
settings_t *settings = config_get_ptr();
rarch_system_info_t *system = runloop_get_system_info();
const char *core_name = system
const char *core_name = system
? system->info.library_name : NULL;
const char *game_name = path_basename(path_get(RARCH_PATH_BASENAME));
@ -3511,14 +3528,14 @@ static void save_keybind_mbutton(config_file_t *conf,
const char *base,
const struct retro_keybind *bind, bool save_empty)
{
char key[64];
char key[64];
key[0] = '\0';
key[0] = '\0';
fill_pathname_join_delim_concat(key, prefix,
base, '_', "_mbtn", sizeof(key));
fill_pathname_join_delim_concat(key, prefix,
base, '_', "_mbtn", sizeof(key));
switch ( bind->mbutton )
switch ( bind->mbutton )
{
case RETRO_DEVICE_ID_MOUSE_LEFT:
config_set_uint64(conf, key, 1);
@ -3764,8 +3781,7 @@ bool config_save_autoconf_profile(const char *path, unsigned user)
error:
free(buf);
free(autoconf_file);
if (path_new)
free(path_new);
free(path_new);
return false;
}
@ -4177,28 +4193,28 @@ bool config_save_overrides(int override_type)
char cfg[64];
cfg[0] = '\0';
if (settings->uints.input_device[i]
if (settings->uints.input_device[i]
!= overrides->uints.input_device[i])
{
snprintf(cfg, sizeof(cfg), "input_device_p%u", i + 1);
config_set_int(conf, cfg, overrides->uints.input_device[i]);
}
if (settings->uints.input_joypad_map[i]
if (settings->uints.input_joypad_map[i]
!= overrides->uints.input_joypad_map[i])
{
snprintf(cfg, sizeof(cfg), "input_player%u_joypad_index", i + 1);
config_set_int(conf, cfg, overrides->uints.input_joypad_map[i]);
}
if (settings->uints.input_libretro_device[i]
if (settings->uints.input_libretro_device[i]
!= overrides->uints.input_libretro_device[i])
{
snprintf(cfg, sizeof(cfg), "input_libretro_device_p%u", i + 1);
config_set_int(conf, cfg, overrides->uints.input_libretro_device[i]);
}
if (settings->uints.input_analog_dpad_mode[i]
if (settings->uints.input_analog_dpad_mode[i]
!= overrides->uints.input_analog_dpad_mode[i])
{
snprintf(cfg, sizeof(cfg), "input_player%u_analog_dpad_mode", i + 1);

View File

@ -95,9 +95,11 @@ typedef struct settings
bool video_statistics_show;
bool video_framecount_show;
bool video_msg_bgcolor_enable;
bool crt_switch_resolution;
/* Audio */
bool audio_enable;
bool audio_enable_menu;
bool audio_sync;
bool audio_rate_control;
bool audio_wasapi_exclusive_mode;
@ -146,8 +148,15 @@ typedef struct settings
bool menu_show_help;
bool menu_show_quit_retroarch;
bool menu_show_reboot;
bool menu_show_latency;
bool menu_show_rewind;
bool menu_show_overlays;
bool menu_materialui_icons_enable;
bool menu_rgui_background_filler_thickness_enable;
bool menu_rgui_border_filler_thickness_enable;
bool menu_rgui_border_filler_enable;
bool menu_xmb_shadows_enable;
bool menu_xmb_vertical_thumbnails;
bool menu_content_show_settings;
bool menu_content_show_favorites;
bool menu_content_show_images;
@ -156,6 +165,7 @@ typedef struct settings
bool menu_content_show_netplay;
bool menu_content_show_history;
bool menu_content_show_add;
bool menu_content_show_playlists;
bool menu_unified_controls;
bool quick_menu_show_take_screenshot;
bool quick_menu_show_save_load_state;
@ -188,6 +198,8 @@ typedef struct settings
bool ui_suspend_screensaver_enable;
bool ui_companion_start_on_boot;
bool ui_companion_enable;
bool ui_companion_toggle;
bool desktop_menu_enable;
/* Cheevos */
bool cheevos_enable;
@ -223,6 +235,8 @@ typedef struct settings
bool playlist_entry_remove;
bool playlist_entry_rename;
bool rewind_enable;
bool run_ahead_enabled;
bool run_ahead_secondary_instance;
bool pause_nonactive;
bool block_sram_overwrite;
bool savestate_auto_index;
@ -333,6 +347,7 @@ typedef struct settings
unsigned video_window_x;
unsigned video_window_y;
unsigned video_window_opacity;
unsigned crt_switch_resolution_super;
unsigned video_monitor_index;
unsigned video_fullscreen_x;
unsigned video_fullscreen_y;
@ -348,10 +363,12 @@ typedef struct settings
unsigned video_msg_bgcolor_blue;
unsigned menu_thumbnails;
unsigned menu_left_thumbnails;
unsigned menu_dpi_override_value;
unsigned menu_entry_normal_color;
unsigned menu_entry_hover_color;
unsigned menu_title_color;
unsigned menu_xmb_layout;
unsigned menu_xmb_shader_pipeline;
unsigned menu_xmb_scale_factor;
unsigned menu_xmb_alpha_factor;
@ -375,11 +392,13 @@ typedef struct settings
unsigned input_libretro_device[MAX_USERS];
unsigned input_analog_dpad_mode[MAX_USERS];
unsigned input_keymapper_ids[RARCH_CUSTOM_BIND_LIST_END];
unsigned input_keymapper_ids[MAX_USERS][RARCH_CUSTOM_BIND_LIST_END];
unsigned input_remap_ids[MAX_USERS][RARCH_CUSTOM_BIND_LIST_END];
unsigned led_map[MAX_LEDS];
unsigned run_ahead_frames;
} uints;
struct
@ -395,6 +414,7 @@ typedef struct settings
char menu_driver[32];
char cheevos_username[32];
char cheevos_password[32];
char cheevos_token[32];
char video_context_driver[32];
char audio_driver[32];
char audio_resampler[32];

View File

@ -92,17 +92,16 @@ void content_clear_subsystem(void);
void content_set_subsystem(unsigned subsystem);
/* Get the current subsystem*/
int content_get_subsystem();
int content_get_subsystem(void);
/* Add a rom to the subsystem rom buffer */
void content_add_subsystem(const char* path);
/* Get the current subsystem rom id */
int content_get_subsystem_rom_id();
unsigned content_get_subsystem_rom_id(void);
/* Set environment variables before a subsystem load */
void content_set_subsystem_info();
void content_set_subsystem_info(void);
RETRO_END_DECLS

3
core.h
View File

@ -170,6 +170,9 @@ bool core_set_poll_type(unsigned *type);
/* Runs the core for one frame. */
bool core_run(void);
/* Runs the core for one frame, but does not trigger any input polling */
bool core_run_no_input_polling(void);
bool core_init(void);
bool core_deinit(void *data);

View File

@ -44,6 +44,11 @@
#include "gfx/video_driver.h"
#include "audio/audio_driver.h"
#ifdef HAVE_RUNAHEAD
#include "runahead/copy_load_info.h"
#include "runahead/secondary_core.h"
#endif
struct retro_callbacks retro_ctx;
struct retro_core_t current_core;
@ -262,6 +267,11 @@ bool core_set_controller_port_device(retro_ctx_controller_info_t *pad)
{
if (!pad)
return false;
#ifdef HAVE_RUNAHEAD
remember_controller_port_device(pad->port, pad->device);
#endif
current_core.retro_set_controller_port_device(pad->port, pad->device);
return true;
}
@ -280,6 +290,11 @@ bool core_load_game(retro_ctx_load_content_info_t *load_info)
bool contentless = false;
bool is_inited = false;
#ifdef HAVE_RUNAHEAD
set_load_content_info(load_info);
clear_controller_port_map();
#endif
content_get_status(&contentless, &is_inited);
if (load_info && load_info->special)
@ -424,6 +439,12 @@ bool core_run(void)
return true;
}
bool core_run_no_input_polling(void)
{
current_core.retro_run();
return true;
}
bool core_load(unsigned poll_type_behavior)
{
current_core.poll_type = poll_type_behavior;

View File

@ -17,6 +17,7 @@
#include <compat/strl.h>
#include <string/stdstring.h>
#include <file/config_file.h>
#include <file/file_path.h>
#include <lists/dir_list.h>
#include <file/archive_file.h>
@ -26,14 +27,10 @@
#include "config.h"
#endif
#include "retroarch.h"
#include "verbosity.h"
#include "config.def.h"
#include "core_info.h"
#include "configuration.h"
#include "file_path_special.h"
#include "list_special.h"
static const char *core_info_tmp_path = NULL;
static const struct string_list *core_info_tmp_list = NULL;
@ -154,6 +151,7 @@ static void core_info_list_free(core_info_list_t *core_info_list)
free(info->systemname);
free(info->system_manufacturer);
free(info->display_name);
free(info->display_version);
free(info->supported_extensions);
free(info->authors);
free(info->permissions);
@ -224,21 +222,23 @@ static bool core_info_list_iterate(
return true;
}
static core_info_list_t *core_info_list_new(const char *path)
static core_info_list_t *core_info_list_new(const char *path,
const char *libretro_info_dir,
const char *exts,
bool show_hidden_files)
{
size_t i;
core_info_t *core_info = NULL;
core_info_list_t *core_info_list = NULL;
struct string_list *contents = dir_list_new_special(
path, DIR_LIST_CORES, NULL);
settings_t *settings = config_get_ptr();
const char *path_basedir = !string_is_empty(settings->paths.path_libretro_info) ?
settings->paths.path_libretro_info : settings->paths.directory_libretro;
const char *path_basedir = libretro_info_dir;
struct string_list *contents = dir_list_new(
path, exts,
false,
show_hidden_files,
false, false);
if (!contents)
return NULL;
core_info_list = (core_info_list_t*)calloc(1, sizeof(*core_info_list));
if (!core_info_list)
goto error;
@ -279,6 +279,13 @@ static core_info_list_t *core_info_list_new(const char *path)
free(tmp);
tmp = NULL;
}
if (config_get_string(conf, "display_version", &tmp)
&& !string_is_empty(tmp))
{
core_info[i].display_version = strdup(tmp);
free(tmp);
tmp = NULL;
}
if (config_get_string(conf, "corename", &tmp)
&& !string_is_empty(tmp))
{
@ -518,7 +525,8 @@ static core_info_t *core_info_find_internal(
static bool core_info_list_update_missing_firmware_internal(
core_info_list_t *core_info_list,
const char *core,
const char *systemdir)
const char *systemdir,
bool *set_missing_bios)
{
size_t i;
core_info_t *info = NULL;
@ -535,7 +543,6 @@ static bool core_info_list_update_missing_firmware_internal(
path = (char*)malloc(PATH_MAX_LENGTH * sizeof(char));
path[0] = '\0';
rarch_ctl(RARCH_CTL_UNSET_MISSING_BIOS, NULL);
for (i = 0; i < info->firmware_count; i++)
{
@ -547,7 +554,7 @@ static bool core_info_list_update_missing_firmware_internal(
info->firmware[i].missing = !filestream_exists(path);
if (info->firmware[i].missing && !info->firmware[i].optional)
{
rarch_ctl(RARCH_CTL_SET_MISSING_BIOS, NULL);
*set_missing_bios = true;
RARCH_WARN("Firmware missing: %s\n", info->firmware[i].path);
}
}
@ -635,14 +642,13 @@ void core_info_deinit_list(void)
core_info_curr_list = NULL;
}
bool core_info_init_list(void)
bool core_info_init_list(const char *path_info, const char *dir_cores,
const char *exts, bool show_hidden_files)
{
settings_t *settings = config_get_ptr();
if (settings)
core_info_curr_list = core_info_list_new(settings->paths.directory_libretro);
if (!core_info_curr_list)
if (!(core_info_curr_list = core_info_list_new(dir_cores,
!string_is_empty(path_info) ? path_info : dir_cores,
exts,
show_hidden_files)))
return false;
return true;
}
@ -655,13 +661,15 @@ bool core_info_get_list(core_info_list_t **core)
return true;
}
bool core_info_list_update_missing_firmware(core_info_ctx_firmware_t *info)
bool core_info_list_update_missing_firmware(core_info_ctx_firmware_t *info,
bool *set_missing_bios)
{
if (!info)
return false;
return core_info_list_update_missing_firmware_internal(
core_info_curr_list,
info->path, info->directory.system);
info->path, info->directory.system,
set_missing_bios);
}
bool core_info_load(core_info_ctx_find_t *info)
@ -751,16 +759,15 @@ void core_info_list_get_supported_cores(core_info_list_t *core_info_list,
*num_infos = supported;
}
void core_info_get_name(const char *path, char *s, size_t len)
void core_info_get_name(const char *path, char *s, size_t len,
const char *path_info, const char *dir_cores,
const char *exts, bool show_hidden_files)
{
size_t i;
settings_t *settings = config_get_ptr();
struct string_list *contents = dir_list_new_special(
settings->paths.directory_libretro,
DIR_LIST_CORES, NULL);
const char *path_basedir = !string_is_empty(settings->paths.path_libretro_info) ?
settings->paths.path_libretro_info : settings->paths.directory_libretro;
const char *path_basedir = !string_is_empty(path_info) ?
path_info : dir_cores;
struct string_list *contents = dir_list_new(
dir_cores, exts, false, show_hidden_files, false, false);
if (!contents)
return;
@ -786,7 +793,7 @@ void core_info_get_name(const char *path, char *s, size_t len)
continue;
}
conf = config_file_new(info_path);
conf = config_file_new(info_path);
if (!conf)
{

View File

@ -43,6 +43,7 @@ typedef struct
char *path;
void *config_data;
char *display_name;
char *display_version;
char *core_name;
char *system_manufacturer;
char *systemname;
@ -97,7 +98,9 @@ bool core_info_list_get_display_name(core_info_list_t *list,
bool core_info_get_display_name(const char *path, char *s, size_t len);
void core_info_get_name(const char *path, char *s, size_t len);
void core_info_get_name(const char *path, char *s, size_t len,
const char *path_info, const char *dir_cores,
const char *exts, bool show_hidden_files);
core_info_t *core_info_get(core_info_list_t *list, size_t i);
@ -109,11 +112,13 @@ bool core_info_get_current_core(core_info_t **core);
void core_info_deinit_list(void);
bool core_info_init_list(void);
bool core_info_init_list(const char *path_info, const char *dir_cores,
const char *exts, bool show_hidden_files);
bool core_info_get_list(core_info_list_t **core);
bool core_info_list_update_missing_firmware(core_info_ctx_firmware_t *info);
bool core_info_list_update_missing_firmware(core_info_ctx_firmware_t *info,
bool *set_missing_bios);
bool core_info_find(core_info_ctx_find_t *info, const char *name);

View File

@ -1,5 +1,6 @@
#include <3ds.h>
#include <sys/iosupport.h>
#include <3ds/services/apt.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>

View File

@ -21,11 +21,13 @@
#include <compat/strl.h>
#include <retro_endianness.h>
#include <file/file_path.h>
#include <lists/string_list.h>
#include <lists/dir_list.h>
#include <string/stdstring.h>
#include "libretro-db/libretrodb.h"
#include "list_special.h"
#include "core_info.h"
#include "database_info.h"
#include "verbosity.h"
@ -366,16 +368,22 @@ static void dir_list_prioritize(struct string_list *list)
}
database_info_handle_t *database_info_dir_init(const char *dir,
enum database_type type, retro_task_t *task)
enum database_type type, retro_task_t *task,
bool show_hidden_files)
{
struct string_list *list = NULL;
database_info_handle_t *db = (database_info_handle_t*)
core_info_list_t *core_info_list = NULL;
struct string_list *list = NULL;
database_info_handle_t *db = (database_info_handle_t*)
calloc(1, sizeof(*db));
if (!db)
return NULL;
list = dir_list_new_special(dir, DIR_LIST_RECURSIVE, NULL);
core_info_get_list(&core_info_list);
list = dir_list_new(dir, core_info_list->all_ext,
false, show_hidden_files,
false, true);
if (!list)
{

View File

@ -126,7 +126,8 @@ database_info_list_t *database_info_list_new(const char *rdb_path,
void database_info_list_free(database_info_list_t *list);
database_info_handle_t *database_info_dir_init(const char *dir,
enum database_type type, retro_task_t *task);
enum database_type type, retro_task_t *task,
bool show_hidden_files);
database_info_handle_t *database_info_file_init(const char *path,
enum database_type type, retro_task_t *task);

5461
deps/dr/dr_flac.h vendored Normal file

File diff suppressed because it is too large Load Diff

2745
deps/dr/dr_mp3.h vendored Normal file

File diff suppressed because it is too large Load Diff

View File

@ -34,7 +34,7 @@
# include <config.h>
#endif
#include "private/bitmath.h"
#include "include/private/bitmath.h"
/* An example of what FLAC__bitmath_silog2() computes:
*

View File

@ -38,13 +38,13 @@
#include <stdlib.h>
#include <string.h>
#include "private/bitmath.h"
#include "private/bitreader.h"
#include "private/crc.h"
#include "private/macros.h"
#include "FLAC/assert.h"
#include "share/compat.h"
#include "share/endswap.h"
#include "include/private/bitmath.h"
#include "include/private/bitreader.h"
#include "include/private/crc.h"
#include "include/private/macros.h"
#include "include/FLAC/assert.h"
#include "include/share/compat.h"
#include "include/share/endswap.h"
/* Things should be fastest when this matches the machine word size */
/* WATCHOUT: if you change this you must also change the following #defines down to COUNT_ZERO_MSBS2 below to match */

7
deps/libFLAC/cpu.c vendored
View File

@ -34,11 +34,12 @@
# include <config.h>
#endif
#include "private/cpu.h"
#include "share/compat.h"
#include <stdlib.h>
#include <string.h>
#include "include/private/cpu.h"
#include "include/share/compat.h"
#if defined(_MSC_VER)
# include <intrin.h> /* for __cpuid() and _xgetbv() */
#endif
@ -83,7 +84,7 @@ cpu_xgetbv_x86(void)
return (uint32_t)_xgetbv(0);
#elif defined __GNUC__
uint32_t lo, hi;
asm volatile (".byte 0x0f, 0x01, 0xd0" : "=a"(lo), "=d"(hi) : "c" (0));
__asm__ volatile (".byte 0x0f, 0x01, 0xd0" : "=a"(lo), "=d"(hi) : "c" (0));
return lo;
#else
return 0;

2
deps/libFLAC/crc.c vendored
View File

@ -34,7 +34,7 @@
# include <config.h>
#endif
#include "private/crc.h"
#include "include/private/crc.h"
/* CRC-8, poly = x^8 + x^2 + x^1 + x^0, init = 0 */

10
deps/libFLAC/fixed.c vendored
View File

@ -38,11 +38,11 @@
#include <math.h>
#include <string.h>
#include "share/compat.h"
#include "private/bitmath.h"
#include "private/fixed.h"
#include "private/macros.h"
#include "FLAC/assert.h"
#include "include/share/compat.h"
#include "include/private/bitmath.h"
#include "include/private/fixed.h"
#include "include/private/macros.h"
#include "include/FLAC/assert.h"
#ifdef local_abs
#undef local_abs

View File

@ -34,9 +34,9 @@
# include <config.h>
#endif
#include "FLAC/assert.h"
#include "share/compat.h"
#include "private/float.h"
#include "include/FLAC/assert.h"
#include "include/share/compat.h"
#include "include/private/float.h"
#ifdef FLAC__INTEGER_ONLY_LIBRARY

12
deps/libFLAC/format.c vendored
View File

@ -40,12 +40,12 @@
#include <retro_miscellaneous.h>
#include "FLAC/assert.h"
#include "FLAC/format.h"
#include "share/alloc.h"
#include "share/compat.h"
#include "private/format.h"
#include "private/macros.h"
#include "include/FLAC/assert.h"
#include "include/FLAC/format.h"
#include "include/share/alloc.h"
#include "include/share/compat.h"
#include "include/private/format.h"
#include "include/private/macros.h"
/* FLAC_PACKAGE_VERSION should come from configure */
#if defined(__LIBRETRO__) || defined(RARCH_INTERNAL)

View File

@ -512,7 +512,7 @@ typedef enum {
FLAC__METADATA_TYPE_UNDEFINED = 7,
/**< marker to denote beginning of undefined type range; this number will increase as new metadata types are added */
FLAC__MAX_METADATA_TYPE = FLAC__MAX_METADATA_TYPE_CODE,
FLAC__MAX_METADATA_TYPE = FLAC__MAX_METADATA_TYPE_CODE
/**< No type will ever be greater than this. There is not enough room in the protocol block. */
} FLAC__MetadataType;

View File

@ -35,10 +35,10 @@
#include <retro_inline.h>
#include "FLAC/ordinals.h"
#include "FLAC/assert.h"
#include "../FLAC/ordinals.h"
#include "../FLAC/assert.h"
#include "share/compat.h"
#include "../share/compat.h"
#if defined(_MSC_VER)
#include <intrin.h> /* for _BitScanReverse* */

View File

@ -34,7 +34,7 @@
#define FLAC__PRIVATE__BITREADER_H
#include <stdio.h> /* for FILE */
#include "FLAC/ordinals.h"
#include "../FLAC/ordinals.h"
#include "cpu.h"
/*

View File

@ -33,7 +33,7 @@
#ifndef FLAC__PRIVATE__CPU_H
#define FLAC__PRIVATE__CPU_H
#include "FLAC/ordinals.h"
#include "../FLAC/ordinals.h"
#ifdef HAVE_CONFIG_H
#include <config.h>

View File

@ -33,7 +33,7 @@
#ifndef FLAC__PRIVATE__CRC_H
#define FLAC__PRIVATE__CRC_H
#include "FLAC/ordinals.h"
#include "../FLAC/ordinals.h"
/* 8 bit CRC generator, MSB shifted first
** polynomial = x^8 + x^2 + x^1 + x^0

View File

@ -37,9 +37,9 @@
#include <config.h>
#endif
#include "private/cpu.h"
#include "private/float.h"
#include "FLAC/format.h"
#include "../private/cpu.h"
#include "../private/float.h"
#include "../FLAC/format.h"
/*
* FLAC__fixed_compute_best_predictor()

View File

@ -37,7 +37,7 @@
#include <config.h>
#endif
#include "FLAC/ordinals.h"
#include "../FLAC/ordinals.h"
/*
* All the code in libFLAC that uses float and double

View File

@ -33,7 +33,7 @@
#ifndef FLAC__PRIVATE__FORMAT_H
#define FLAC__PRIVATE__FORMAT_H
#include "FLAC/format.h"
#include "../FLAC/format.h"
unsigned FLAC__format_get_max_rice_partition_order(unsigned blocksize, unsigned predictor_order);
unsigned FLAC__format_get_max_rice_partition_order_from_blocksize(unsigned blocksize);

View File

@ -37,9 +37,9 @@
#include <config.h>
#endif
#include "private/cpu.h"
#include "private/float.h"
#include "FLAC/format.h"
#include "../private/cpu.h"
#include "../private/float.h"
#include "../FLAC/format.h"
#ifndef FLAC__INTEGER_ONLY_LIBRARY

View File

@ -26,7 +26,7 @@
* Still in the public domain, with no warranty.
*/
#include "FLAC/ordinals.h"
#include "../FLAC/ordinals.h"
typedef union {
FLAC__byte *p8;

View File

@ -39,8 +39,8 @@
#include <stdlib.h> /* for size_t */
#include "private/float.h"
#include "FLAC/ordinals.h" /* for FLAC__bool */
#include "../private/float.h"
#include "../FLAC/ordinals.h" /* for FLAC__bool */
/* Returns the unaligned address returned by malloc.
* Use free() on this address to deallocate.

View File

@ -33,9 +33,9 @@
#ifndef FLAC__PROTECTED__STREAM_DECODER_H
#define FLAC__PROTECTED__STREAM_DECODER_H
#include "FLAC/stream_decoder.h"
#include "../FLAC/stream_decoder.h"
#if FLAC__HAS_OGG
#include "private/ogg_decoder_aspect.h"
#include "../private/ogg_decoder_aspect.h"
#endif
typedef struct FLAC__StreamDecoderProtected {

View File

@ -33,6 +33,8 @@
#ifndef FLAC__SHARE__ALLOC_H
#define FLAC__SHARE__ALLOC_H
#include <retro_inline.h>
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
@ -46,7 +48,7 @@
#include <stdint.h> /* for SIZE_MAX in case limits.h didn't get it */
#endif
#include <stdlib.h> /* for size_t, malloc(), etc */
#include "share/compat.h"
#include "../share/compat.h"
#ifndef SIZE_MAX
# ifndef SIZE_T_MAX
@ -66,7 +68,7 @@
/* avoid malloc()ing 0 bytes, see:
* https://www.securecoding.cert.org/confluence/display/seccode/MEM04-A.+Do+not+make+assumptions+about+the+result+of+allocating+0+bytes?focusedCommentId=5407003
*/
static inline void *safe_malloc_(size_t size)
static INLINE void *safe_malloc_(size_t size)
{
/* malloc(0) is undefined; FLAC src convention is to always allocate */
if(!size)
@ -74,7 +76,7 @@ static inline void *safe_malloc_(size_t size)
return malloc(size);
}
static inline void *safe_calloc_(size_t nmemb, size_t size)
static INLINE void *safe_calloc_(size_t nmemb, size_t size)
{
if(!nmemb || !size)
return malloc(1); /* malloc(0) is undefined; FLAC src convention is to always allocate */
@ -83,7 +85,7 @@ static inline void *safe_calloc_(size_t nmemb, size_t size)
/*@@@@ there's probably a better way to prevent overflows when allocating untrusted sums but this works for now */
static inline void *safe_malloc_add_2op_(size_t size1, size_t size2)
static INLINE void *safe_malloc_add_2op_(size_t size1, size_t size2)
{
size2 += size1;
if(size2 < size1)
@ -91,7 +93,7 @@ static inline void *safe_malloc_add_2op_(size_t size1, size_t size2)
return safe_malloc_(size2);
}
static inline void *safe_malloc_add_3op_(size_t size1, size_t size2, size_t size3)
static INLINE void *safe_malloc_add_3op_(size_t size1, size_t size2, size_t size3)
{
size2 += size1;
if(size2 < size1)
@ -102,7 +104,7 @@ static inline void *safe_malloc_add_3op_(size_t size1, size_t size2, size_t size
return safe_malloc_(size3);
}
static inline void *safe_malloc_add_4op_(size_t size1, size_t size2, size_t size3, size_t size4)
static INLINE void *safe_malloc_add_4op_(size_t size1, size_t size2, size_t size3, size_t size4)
{
size2 += size1;
if(size2 < size1)
@ -118,7 +120,7 @@ static inline void *safe_malloc_add_4op_(size_t size1, size_t size2, size_t size
void *safe_malloc_mul_2op_(size_t size1, size_t size2) ;
static inline void *safe_malloc_mul_3op_(size_t size1, size_t size2, size_t size3)
static INLINE void *safe_malloc_mul_3op_(size_t size1, size_t size2, size_t size3)
{
if(!size1 || !size2 || !size3)
return malloc(1); /* malloc(0) is undefined; FLAC src convention is to always allocate */
@ -131,7 +133,7 @@ static inline void *safe_malloc_mul_3op_(size_t size1, size_t size2, size_t size
}
/* size1*size2 + size3 */
static inline void *safe_malloc_mul2add_(size_t size1, size_t size2, size_t size3)
static INLINE void *safe_malloc_mul2add_(size_t size1, size_t size2, size_t size3)
{
if(!size1 || !size2)
return safe_malloc_(size3);
@ -141,7 +143,7 @@ static inline void *safe_malloc_mul2add_(size_t size1, size_t size2, size_t size
}
/* size1 * (size2 + size3) */
static inline void *safe_malloc_muladd2_(size_t size1, size_t size2, size_t size3)
static INLINE void *safe_malloc_muladd2_(size_t size1, size_t size2, size_t size3)
{
if(!size1 || (!size2 && !size3))
return malloc(1); /* malloc(0) is undefined; FLAC src convention is to always allocate */
@ -153,7 +155,7 @@ static inline void *safe_malloc_muladd2_(size_t size1, size_t size2, size_t size
return malloc(size1*size2);
}
static inline void *safe_realloc_(void *ptr, size_t size)
static INLINE void *safe_realloc_(void *ptr, size_t size)
{
void *oldptr = ptr;
void *newptr = realloc(ptr, size);
@ -161,7 +163,7 @@ static inline void *safe_realloc_(void *ptr, size_t size)
free(oldptr);
return newptr;
}
static inline void *safe_realloc_add_2op_(void *ptr, size_t size1, size_t size2)
static INLINE void *safe_realloc_add_2op_(void *ptr, size_t size1, size_t size2)
{
size2 += size1;
if(size2 < size1) {
@ -171,7 +173,7 @@ static inline void *safe_realloc_add_2op_(void *ptr, size_t size1, size_t size2)
return realloc(ptr, size2);
}
static inline void *safe_realloc_add_3op_(void *ptr, size_t size1, size_t size2, size_t size3)
static INLINE void *safe_realloc_add_3op_(void *ptr, size_t size1, size_t size2, size_t size3)
{
size2 += size1;
if(size2 < size1)
@ -182,7 +184,7 @@ static inline void *safe_realloc_add_3op_(void *ptr, size_t size1, size_t size2,
return realloc(ptr, size3);
}
static inline void *safe_realloc_add_4op_(void *ptr, size_t size1, size_t size2, size_t size3, size_t size4)
static INLINE void *safe_realloc_add_4op_(void *ptr, size_t size1, size_t size2, size_t size3, size_t size4)
{
size2 += size1;
if(size2 < size1)
@ -196,7 +198,7 @@ static inline void *safe_realloc_add_4op_(void *ptr, size_t size1, size_t size2,
return realloc(ptr, size4);
}
static inline void *safe_realloc_mul_2op_(void *ptr, size_t size1, size_t size2)
static INLINE void *safe_realloc_mul_2op_(void *ptr, size_t size1, size_t size2)
{
if(!size1 || !size2)
return realloc(ptr, 0); /* preserve POSIX realloc(ptr, 0) semantics */
@ -206,7 +208,7 @@ static inline void *safe_realloc_mul_2op_(void *ptr, size_t size1, size_t size2)
}
/* size1 * (size2 + size3) */
static inline void *safe_realloc_muladd2_(void *ptr, size_t size1, size_t size2, size_t size3)
static INLINE void *safe_realloc_muladd2_(void *ptr, size_t size1, size_t size2, size_t size3)
{
if(!size1 || (!size2 && !size3))
return realloc(ptr, 0); /* preserve POSIX realloc(ptr, 0) semantics */

12
deps/libFLAC/lpc.c vendored
View File

@ -36,12 +36,12 @@
#include <math.h>
#include "FLAC/assert.h"
#include "FLAC/format.h"
#include "share/compat.h"
#include "private/bitmath.h"
#include "private/lpc.h"
#include "private/macros.h"
#include "include/FLAC/assert.h"
#include "include/FLAC/format.h"
#include "include/share/compat.h"
#include "include/private/bitmath.h"
#include "include/private/lpc.h"
#include "include/private/macros.h"
#if defined DEBUG || defined FLAC__OVERFLOW_DETECT || defined FLAC__OVERFLOW_DETECT_VERBOSE
#include <stdio.h>
#endif

View File

@ -34,16 +34,16 @@
# include <config.h>
#endif
#include "private/cpu.h"
#include "include/private/cpu.h"
#ifndef FLAC__INTEGER_ONLY_LIBRARY
#ifndef FLAC__NO_ASM
#if (defined FLAC__CPU_IA32 || defined FLAC__CPU_X86_64) && FLAC__HAS_X86INTRIN
#include "private/lpc.h"
#include "include/private/lpc.h"
#ifdef FLAC__AVX2_SUPPORTED
#include "FLAC/assert.h"
#include "FLAC/format.h"
#include "include/FLAC/assert.h"
#include "include/FLAC/format.h"
#include <immintrin.h> /* AVX2 */

View File

@ -34,15 +34,15 @@
# include <config.h>
#endif
#include "private/cpu.h"
#include "include/private/cpu.h"
#ifndef FLAC__INTEGER_ONLY_LIBRARY
#ifndef FLAC__NO_ASM
#if (defined FLAC__CPU_IA32 || defined FLAC__CPU_X86_64) && FLAC__HAS_X86INTRIN
#include "private/lpc.h"
#include "include/private/lpc.h"
#ifdef FLAC__SSE_SUPPORTED
#include "FLAC/assert.h"
#include "FLAC/format.h"
#include "include/FLAC/assert.h"
#include "include/FLAC/format.h"
#include <xmmintrin.h> /* SSE */

View File

@ -34,16 +34,16 @@
# include <config.h>
#endif
#include "private/cpu.h"
#include "include/private/cpu.h"
#ifndef FLAC__INTEGER_ONLY_LIBRARY
#ifndef FLAC__NO_ASM
#if (defined FLAC__CPU_IA32 || defined FLAC__CPU_X86_64) && FLAC__HAS_X86INTRIN
#include "private/lpc.h"
#include "include/private/lpc.h"
#ifdef FLAC__SSE2_SUPPORTED
#include "FLAC/assert.h"
#include "FLAC/format.h"
#include "include/FLAC/assert.h"
#include "include/FLAC/format.h"
#include <emmintrin.h> /* SSE2 */

View File

@ -34,16 +34,16 @@
# include <config.h>
#endif
#include "private/cpu.h"
#include "include/private/cpu.h"
#ifndef FLAC__INTEGER_ONLY_LIBRARY
#ifndef FLAC__NO_ASM
#if (defined FLAC__CPU_IA32 || defined FLAC__CPU_X86_64) && FLAC__HAS_X86INTRIN
#include "private/lpc.h"
#include "include/private/lpc.h"
#ifdef FLAC__SSE4_1_SUPPORTED
#include "FLAC/assert.h"
#include "FLAC/format.h"
#include "include/FLAC/assert.h"
#include "include/FLAC/format.h"
#include <smmintrin.h> /* SSE4.1 */

6
deps/libFLAC/md5.c vendored
View File

@ -5,9 +5,9 @@
#include <stdlib.h> /* for malloc() */
#include <string.h> /* for memcpy() */
#include "private/md5.h"
#include "share/alloc.h"
#include "share/endswap.h"
#include "include/private/md5.h"
#include "include/share/alloc.h"
#include "include/share/endswap.h"
/*
* This code implements the MD5 message-digest algorithm.

View File

@ -38,9 +38,9 @@
#include <stdint.h>
#endif
#include "private/memory.h"
#include "FLAC/assert.h"
#include "share/alloc.h"
#include "include/private/memory.h"
#include "include/FLAC/assert.h"
#include "include/share/alloc.h"
void *FLAC__memory_alloc_aligned(size_t bytes, void **aligned_address)
{

View File

@ -42,20 +42,20 @@
#include <retro_miscellaneous.h>
#include "share/compat.h"
#include "FLAC/assert.h"
#include "share/alloc.h"
#include "protected/stream_decoder.h"
#include "private/bitreader.h"
#include "private/bitmath.h"
#include "private/cpu.h"
#include "private/crc.h"
#include "private/fixed.h"
#include "private/format.h"
#include "private/lpc.h"
#include "private/md5.h"
#include "private/memory.h"
#include "private/macros.h"
#include "include/share/compat.h"
#include "include/FLAC/assert.h"
#include "include/share/alloc.h"
#include "include/protected/stream_decoder.h"
#include "include/private/bitreader.h"
#include "include/private/bitmath.h"
#include "include/private/cpu.h"
#include "include/private/crc.h"
#include "include/private/fixed.h"
#include "include/private/format.h"
#include "include/private/lpc.h"
#include "include/private/md5.h"
#include "include/private/memory.h"
#include "include/private/macros.h"
/* technically this should be in an "export.c" but this is convenient enough */

View File

@ -145,7 +145,7 @@ getDevicesFromMiniSSDPD(const char * devtype, const char * socketpath, int * err
if(n<=0) break; \
bufferindex = 0; \
} \
lcopy = MIN(l, (n - bufferindex)); \
lcopy = (unsigned int)MIN(l, (n - bufferindex)); \
memcpy(p, buffer + bufferindex, lcopy); \
l -= lcopy; \
p += lcopy; \
@ -584,7 +584,7 @@ ssdpDiscoverDevices(const char * const deviceTypes[],
struct in_addr mc_if;
memset(&mc_if, 0, sizeof(mc_if));
mc_if.s_addr = pIPAddrTable->table[i].dwAddr;
setsockopt(sudp, IPPROTO_IP, IP_MULTICAST_IF, (const char *)&mc_if, sizeof(mc_if)) < 0;
setsockopt(sudp, IPPROTO_IP, IP_MULTICAST_IF, (const char *)&mc_if, sizeof(mc_if));
((struct sockaddr_in *)&sockudp_r)->sin_addr.s_addr = pIPAddrTable->table[i].dwAddr;
#ifndef DEBUG
break;
@ -606,6 +606,7 @@ ssdpDiscoverDevices(const char * const deviceTypes[],
{
if(error)
*error = MINISSDPC_SOCKET_ERROR;
closesocket(sudp);
return NULL;
}

View File

@ -528,12 +528,7 @@ STBRP_DEF void stbrp_pack_rects(stbrp_context *context, stbrp_rect *rects, int n
/* we use the 'was_packed' field internally to allow sorting/unsorting */
for (i=0; i < num_rects; ++i)
{
rects[i].was_packed = i;
#ifndef STBRP_LARGE_RECTS
STBRP_ASSERT(rects[i].w <= 0xffff && rects[i].h <= 0xffff);
#endif
}
/* sort according to heuristic */
STBRP_SORT(rects, num_rects, sizeof(rects[0]), rect_height_compare);

View File

@ -3278,7 +3278,7 @@ static stb_vorbis * vorbis_alloc(stb_vorbis *f)
unsigned int stb_vorbis_get_file_offset(stb_vorbis *f)
{
return f->stream - f->stream_start;
return (unsigned int)(f->stream - f->stream_start);
}
#ifndef STB_VORBIS_NO_PULLDATA_API

View File

@ -66,9 +66,14 @@
#include "msg_hash.h"
#include "verbosity.h"
#ifdef HAVE_RUNAHEAD
#include "runahead/secondary_core.h"
#include "runahead/run_ahead.h"
#endif
#ifdef HAVE_DYNAMIC
#define SYMBOL(x) do { \
function_t func = dylib_proc(lib_handle, #x); \
function_t func = dylib_proc(lib_handle_local, #x); \
memcpy(&current_core->x, &func, sizeof(func)); \
if (current_core->x == NULL) { RARCH_ERR("Failed to load symbol: \"%s\"\n", #x); retroarch_fail(1, "init_libretro_sym()"); } \
} while (0)
@ -383,14 +388,36 @@ bool libretro_get_system_info(const char *path,
* Setup libretro callback symbols. Returns true on success,
* or false if symbols could not be loaded.
**/
static bool load_symbols(enum rarch_core_type type, struct retro_core_t *current_core)
bool init_libretro_sym_custom(enum rarch_core_type type, struct retro_core_t *current_core, const char *lib_path, dylib_t *lib_handle_p)
{
/* the library handle for use with the SYMBOL macro */
dylib_t lib_handle_local;
switch (type)
{
case CORE_TYPE_PLAIN:
#ifdef HAVE_DYNAMIC
if (!load_dynamic_core())
return false;
#ifdef HAVE_RUNAHEAD
if (!lib_path || !lib_handle_p)
#endif
{
if (!load_dynamic_core())
return false;
lib_handle_local = lib_handle;
}
#ifdef HAVE_RUNAHEAD
else
{
/* for a secondary core, we already have a
* primary library loaded, so we can skip
* some checks and just load the library */
retro_assert(lib_path != NULL && lib_handle_p != NULL);
lib_handle_local = dylib_load(lib_path);
if (!lib_handle_local)
return false;
*lib_handle_p = lib_handle_local;
}
#endif
#endif
SYMBOL(retro_init);
@ -615,6 +642,11 @@ static bool load_symbols(enum rarch_core_type type, struct retro_core_t *current
return true;
}
static bool load_symbols(enum rarch_core_type type, struct retro_core_t *current_core)
{
return init_libretro_sym_custom(type, current_core, NULL, NULL);
}
/**
* init_libretro_sym:
* @type : Type of core to be loaded.
@ -634,6 +666,11 @@ bool init_libretro_sym(enum rarch_core_type type, struct retro_core_t *current_c
if (!load_symbols(type, current_core))
return false;
#ifdef HAVE_RUNAHEAD
/* remember last core type created, so creating a
* secondary core will know what core type to use. */
set_last_core_type(type);
#endif
return true;
}
@ -885,23 +922,27 @@ static bool dynamic_request_hw_context(enum retro_hw_context_type type,
break;
#endif
case RETRO_HW_CONTEXT_DIRECT3D:
switch(major)
{
#if defined(HAVE_D3D9) || defined(HAVE_D3D11)
case RETRO_HW_CONTEXT_DIRECT3D:
switch (major)
{
#ifdef HAVE_D3D9
case 9:
case 9:
RARCH_LOG("Requesting D3D9 context.\n");
break;
#endif
#ifdef HAVE_D3D11
case 11:
case 11:
RARCH_LOG("Requesting D3D11 context.\n");
break;
#endif
default:
RARCH_LOG("Requesting unknown context.\n");
return false;
}
break;
#endif
RARCH_LOG("Requesting D3D%i context.\n", major);
break;
default:
goto unknown;
}
break;
unknown:
default:
RARCH_LOG("Requesting unknown context.\n");
return false;
@ -1718,13 +1759,15 @@ bool rarch_environment_cb(unsigned cmd, void *data)
{
int result = 0;
if (!audio_driver_is_suspended() && audio_driver_is_active())
{
result |= 2;
}
if (video_driver_is_active() && !video_driver_is_stub_frame())
{
result |= 1;
}
#ifdef HAVE_RUNAHEAD
if (want_fast_savestate())
result |= 4;
if (get_hard_disable_audio())
result |= 8;
#endif
if (data != NULL)
{
int* result_p = (int*)data;

View File

@ -20,6 +20,7 @@
#include <boolean.h>
#include <retro_common_api.h>
#include <libretro.h>
#include <dynamic/dylib.h>
#include "core_type.h"
@ -132,6 +133,8 @@ bool libretro_get_shared_context(void);
bool init_libretro_sym(enum rarch_core_type type,
struct retro_core_t *core);
bool init_libretro_sym_custom(enum rarch_core_type type, struct retro_core_t *current_core, const char *lib_path, dylib_t *lib_handle_p);
/**
* uninit_libretro_sym:
*

View File

@ -86,6 +86,8 @@ enum file_path_enum
FILE_PATH_ZIP_EXTENSION,
FILE_PATH_7Z_EXTENSION,
FILE_PATH_OGG_EXTENSION,
FILE_PATH_MP3_EXTENSION,
FILE_PATH_FLAC_EXTENSION,
FILE_PATH_WAV_EXTENSION,
FILE_PATH_MOD_EXTENSION,
FILE_PATH_S3M_EXTENSION,

View File

@ -101,6 +101,12 @@ const char *file_path_str(enum file_path_enum enum_idx)
case FILE_PATH_PNG_EXTENSION:
str = ".png";
break;
case FILE_PATH_MP3_EXTENSION:
str = ".mp3";
break;
case FILE_PATH_FLAC_EXTENSION:
str = ".flac";
break;
case FILE_PATH_OGG_EXTENSION:
str = ".ogg";
break;

View File

@ -142,7 +142,9 @@ static void frontend_qnx_get_environment_settings(int *argc, char *argv[],
file_path_str(FILE_PATH_MAIN_CONFIG), sizeof(g_defaults.path.config));
/* bundle copy */
sprintf(data_assets_path, "%s/%s", data_path, "assets");
snprintf(data_assets_path,
sizeof(data_assets_path),
"%s/%s", data_path, "assets");
if (!filestream_exists(data_assets_path))
{
@ -150,7 +152,9 @@ static void frontend_qnx_get_environment_settings(int *argc, char *argv[],
RARCH_LOG( "Copying application assets to data directory...\n" );
sprintf(copy_command, "cp -r %s/. %s", assets_path, data_path);
snprintf(copy_command,
sizeof(copy_command),
"cp -r %s/. %s", assets_path, data_path);
if(system(copy_command) == -1)
RARCH_LOG( "Asset copy failed: Shell could not be run.\n" );

View File

@ -54,9 +54,6 @@
#ifdef ANDROID
#include <sys/system_properties.h>
#ifdef __arm__
#include <machine/cpu-features.h>
#endif
#endif
#include <boolean.h>

View File

@ -148,15 +148,15 @@ static void gfx_set_dwm(void)
static void frontend_win32_get_os(char *s, size_t len, int *major, int *minor)
{
char buildStr[11] = {0};
bool server = false;
const char *arch = "";
bool serverR2 = false;
char buildStr[11] = {0};
bool server = false;
const char *arch = "";
bool serverR2 = false;
#if defined(_WIN32_WINNT) && _WIN32_WINNT >= 0x0500
/* Windows 2000 and later */
SYSTEM_INFO si = {0};
OSVERSIONINFOEX vi = {0};
SYSTEM_INFO si = {{0}};
OSVERSIONINFOEX vi = {0};
vi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
GetSystemInfo(&si);
@ -359,7 +359,7 @@ enum frontend_architecture frontend_win32_get_architecture(void)
{
#if defined(_WIN32_WINNT) && _WIN32_WINNT >= 0x0500
/* Windows 2000 and later */
SYSTEM_INFO si = {0};
SYSTEM_INFO si = {{0}};
GetSystemInfo(&si);

View File

@ -37,6 +37,13 @@
#include "../paths.h"
#include "../retroarch.h"
/* griffin hack */
#ifdef HAVE_QT
#ifndef HAVE_MAIN
#define HAVE_MAIN
#endif
#endif
#ifndef HAVE_MAIN
#include "../retroarch.h"
#endif
@ -98,6 +105,9 @@ void main_exit(void *args)
int rarch_main(int argc, char *argv[], void *data)
{
void *args = (void*)data;
#if defined(HAVE_MAIN) && defined(HAVE_QT)
const ui_application_t *ui_application = NULL;
#endif
rarch_ctl(RARCH_CTL_PREINIT, NULL);
frontend_driver_init_first(args);
@ -124,7 +134,7 @@ int rarch_main(int argc, char *argv[], void *data)
ui_companion_driver_init_first();
#ifndef HAVE_MAIN
#if !defined(HAVE_MAIN)
do
{
unsigned sleep_ms = 0;
@ -140,6 +150,11 @@ int rarch_main(int argc, char *argv[], void *data)
}while(1);
main_exit(args);
#elif defined(HAVE_QT)
ui_application = ui_companion_driver_get_qt_application_ptr();
if (ui_application && ui_application->run)
ui_application->run(args);
#endif
return 0;

View File

@ -18,6 +18,7 @@
#include <gfx/scaler/pixconv.h>
#include "d3d10_common.h"
#include "d3dcompiler_common.h"
#ifdef HAVE_DYNAMIC
#include <dynamic/dylib.h>
@ -67,43 +68,72 @@ HRESULT WINAPI D3D10CreateDeviceAndSwapChain(
void d3d10_init_texture(D3D10Device device, d3d10_texture_t* texture)
{
Release(texture->handle);
Release(texture->staging);
Release(texture->view);
bool is_render_target = texture->desc.BindFlags & D3D10_BIND_RENDER_TARGET;
UINT format_support = D3D10_FORMAT_SUPPORT_TEXTURE2D | D3D10_FORMAT_SUPPORT_SHADER_SAMPLE;
// .Usage = D3D10_USAGE_DYNAMIC,
// .CPUAccessFlags = D3D10_CPU_ACCESS_WRITE,
d3d10_release_texture(texture);
texture->desc.MipLevels = 1;
texture->desc.ArraySize = 1;
texture->desc.SampleDesc.Count = 1;
texture->desc.SampleDesc.Quality = 0;
texture->desc.BindFlags = D3D10_BIND_SHADER_RESOURCE;
texture->desc.CPUAccessFlags = 0;
texture->desc.MiscFlags = 0;
texture->desc.BindFlags |= D3D10_BIND_SHADER_RESOURCE;
texture->desc.CPUAccessFlags =
texture->desc.Usage == D3D10_USAGE_DYNAMIC ? D3D10_CPU_ACCESS_WRITE : 0;
if (texture->desc.MiscFlags & D3D10_RESOURCE_MISC_GENERATE_MIPS)
{
unsigned width, height;
texture->desc.BindFlags |= D3D10_BIND_RENDER_TARGET;
width = texture->desc.Width >> 5;
height = texture->desc.Height >> 5;
while (width && height)
{
width >>= 1;
height >>= 1;
texture->desc.MipLevels++;
}
}
if (texture->desc.BindFlags & D3D10_BIND_RENDER_TARGET)
format_support |= D3D10_FORMAT_SUPPORT_RENDER_TARGET;
texture->desc.Format = d3d10_get_closest_match(device, texture->desc.Format, format_support);
D3D10CreateTexture2D(device, &texture->desc, NULL, &texture->handle);
{
D3D10_SHADER_RESOURCE_VIEW_DESC view_desc = { DXGI_FORMAT_UNKNOWN };
view_desc.Format = texture->desc.Format;
view_desc.ViewDimension = D3D_SRV_DIMENSION_TEXTURE2D;
view_desc.Texture2D.MostDetailedMip = 0;
view_desc.Texture2D.MipLevels = -1;
D3D10CreateTexture2DShaderResourceView(device,
texture->handle, &view_desc, &texture->view);
view_desc.Format = texture->desc.Format;
view_desc.ViewDimension = D3D_SRV_DIMENSION_TEXTURE2D;
view_desc.Texture2D.MostDetailedMip = 0;
view_desc.Texture2D.MipLevels = -1;
D3D10CreateTexture2DShaderResourceView(device, texture->handle, &view_desc, &texture->view);
}
if (is_render_target)
D3D10CreateTexture2DRenderTargetView(device, texture->handle, NULL, &texture->rt_view);
else
{
D3D10_TEXTURE2D_DESC desc = texture->desc;
desc.MipLevels = 1;
desc.BindFlags = 0;
desc.MiscFlags = 0;
desc.Usage = D3D10_USAGE_STAGING;
desc.CPUAccessFlags = D3D10_CPU_ACCESS_WRITE;
D3D10CreateTexture2D(device, &desc, NULL, &texture->staging);
}
texture->size_data.x = texture->desc.Width;
texture->size_data.y = texture->desc.Height;
texture->size_data.z = 1.0f / texture->desc.Width;
texture->size_data.w = 1.0f / texture->desc.Height;
}
void d3d10_update_texture(
D3D10Device ctx,
int width,
int height,
int pitch,
@ -112,8 +142,14 @@ void d3d10_update_texture(
d3d10_texture_t* texture)
{
D3D10_MAPPED_TEXTURE2D mapped_texture;
D3D10_BOX frame_box = { 0, 0, 0, (UINT)width,
(UINT)height, 1 };
D3D10MapTexture2D(texture->staging, 0, D3D10_MAP_WRITE, 0,
if (!texture || !texture->staging)
return;
D3D10MapTexture2D(texture->staging,
0, D3D10_MAP_WRITE, 0,
&mapped_texture);
#if 0
@ -130,8 +166,11 @@ void d3d10_update_texture(
D3D10UnmapTexture2D(texture->staging, 0);
if (texture->desc.Usage == D3D10_USAGE_DEFAULT)
texture->dirty = true;
D3D10CopyTexture2DSubresourceRegion(
ctx, texture->handle, 0, 0, 0, 0, texture->staging, 0, &frame_box);
if (texture->desc.MiscFlags & D3D10_RESOURCE_MISC_GENERATE_MIPS)
D3D10GenerateMips(ctx, texture->view);
}
DXGI_FORMAT
@ -155,3 +194,65 @@ d3d10_get_closest_match(D3D10Device device,
assert(*format);
return *format;
}
bool d3d10_init_shader(
D3D10Device device,
const char* src,
size_t size,
const void* src_name,
LPCSTR vs_entry,
LPCSTR ps_entry,
LPCSTR gs_entry,
const D3D10_INPUT_ELEMENT_DESC* input_element_descs,
UINT num_elements,
d3d10_shader_t* out)
{
D3DBlob vs_code = NULL;
D3DBlob ps_code = NULL;
D3DBlob gs_code = NULL;
bool success = true;
if (!src) /* LPCWSTR filename */
{
if (vs_entry && !d3d_compile_from_file((LPCWSTR)src_name, vs_entry, "vs_4_0", &vs_code))
success = false;
if (ps_entry && !d3d_compile_from_file((LPCWSTR)src_name, ps_entry, "ps_4_0", &ps_code))
success = false;
if (gs_entry && !d3d_compile_from_file((LPCWSTR)src_name, gs_entry, "gs_4_0", &gs_code))
success = false;
}
else /* char array */
{
if (vs_entry && !d3d_compile(src, size, (LPCSTR)src_name, vs_entry, "vs_4_0", &vs_code))
success = false;
if (ps_entry && !d3d_compile(src, size, (LPCSTR)src_name, ps_entry, "ps_4_0", &ps_code))
success = false;
if (gs_entry && !d3d_compile(src, size, (LPCSTR)src_name, gs_entry, "gs_4_0", &gs_code))
success = false;
}
if (vs_code)
D3D10CreateVertexShader(
device, D3DGetBufferPointer(vs_code), D3DGetBufferSize(vs_code), &out->vs);
if (ps_code)
D3D10CreatePixelShader(
device, D3DGetBufferPointer(ps_code), D3DGetBufferSize(ps_code), &out->ps);
if (gs_code)
D3D10CreateGeometryShader(
device, D3DGetBufferPointer(gs_code), D3DGetBufferSize(gs_code), &out->gs);
if (vs_code && input_element_descs)
D3D10CreateInputLayout(
device,
(D3D10_INPUT_ELEMENT_DESC*)input_element_descs, num_elements, D3DGetBufferPointer(vs_code),
D3DGetBufferSize(vs_code), &out->layout);
Release(vs_code);
Release(ps_code);
Release(gs_code);
return success;
}

View File

@ -20,6 +20,10 @@
#include "dxgi_common.h"
#include <d3d10.h>
#include "../drivers_shader/slang_process.h"
typedef const ID3D10SamplerState* D3D10SamplerStateRef;
typedef ID3D10InputLayout* D3D10InputLayout;
typedef ID3D10RasterizerState* D3D10RasterizerState;
typedef ID3D10DepthStencilState* D3D10DepthStencilState;
@ -50,6 +54,7 @@ typedef ID3D10Debug* D3D10Debug;
typedef ID3D10SwitchToRef* D3D10SwitchToRef;
typedef ID3D10InfoQueue* D3D10InfoQueue;
#if !defined(__cplusplus) || defined(CINTERFACE)
static INLINE void D3D10SetResourceEvictionPriority(D3D10Resource resource, UINT eviction_priority)
{
@ -236,6 +241,7 @@ static INLINE void D3D10SetVShader(D3D10Device device, D3D10VertexShader vertex_
{
device->lpVtbl->VSSetShader(device, vertex_shader);
}
static INLINE void D3D10DrawIndexed(
D3D10Device device, UINT index_count, UINT start_index_location, INT base_vertex_location)
{
@ -265,6 +271,28 @@ static INLINE void D3D10SetVertexBuffers(
device->lpVtbl->IASetVertexBuffers(
device, start_slot, num_buffers, vertex_buffers, strides, offsets);
}
static INLINE void D3D10SetVertexBuffer(
D3D10Device device_context,
UINT slot,
D3D10Buffer const vertex_buffer,
UINT stride,
UINT offset)
{
D3D10SetVertexBuffers(device_context, slot, 1, (D3D10Buffer* const)&vertex_buffer, &stride, &offset);
}
static INLINE void D3D10SetVShaderConstantBuffer(
D3D10Device device_context, UINT slot, D3D10Buffer const constant_buffer)
{
D3D10SetVShaderConstantBuffers(device_context, slot, 1, (ID3D10Buffer ** const)&constant_buffer);
}
static INLINE void D3D10SetPShaderConstantBuffer(
D3D10Device device_context, UINT slot, D3D10Buffer const constant_buffer)
{
D3D10SetPShaderConstantBuffers(device_context, slot, 1, (ID3D10Buffer** const)&constant_buffer);
}
static INLINE void
D3D10SetIndexBuffer(D3D10Device device, D3D10Buffer index_buffer, DXGI_FORMAT format, UINT offset)
{
@ -1047,25 +1075,74 @@ typedef struct
D3D10Texture2D handle;
D3D10Texture2D staging;
D3D10_TEXTURE2D_DESC desc;
D3D10RenderTargetView rt_view;
D3D10ShaderResourceView view;
bool dirty;
bool ignore_alpha;
D3D10SamplerStateRef sampler;
float4_t size_data;
} d3d10_texture_t;
typedef struct
{
struct
{
float x, y, w, h;
} pos;
struct
{
float u, v, w, h;
} coords;
UINT32 colors[4];
struct
{
float scaling;
float rotation;
} params;
} d3d10_sprite_t;
#ifndef ALIGN
#ifdef _MSC_VER
#define ALIGN(x) __declspec(align(x))
#else
#define ALIGN(x) __attribute__((aligned(x)))
#endif
#endif
typedef struct ALIGN(16)
{
math_matrix_4x4 mvp;
struct
{
float width;
float height;
} OutputSize;
float time;
} d3d10_uniform_t;
static_assert(
(!(sizeof(d3d10_uniform_t) & 0xF)), "sizeof(d3d10_uniform_t) must be a multiple of 16");
typedef struct d3d10_shader_t
{
D3D10VertexShader vs;
D3D10PixelShader ps;
D3D10GeometryShader gs;
D3D10InputLayout layout;
} d3d10_shader_t;
typedef struct
{
unsigned cur_mon_id;
DXGISwapChain swapChain;
D3D10Device device;
D3D10RasterizerState state;
D3D10RenderTargetView renderTargetView;
D3D10InputLayout layout;
D3D10Buffer ubo;
D3D10VertexShader vs;
D3D10PixelShader ps;
D3D10SamplerState sampler_nearest;
D3D10SamplerState sampler_linear;
d3d10_uniform_t ubo_values;
D3D10SamplerState samplers[RARCH_FILTER_MAX][RARCH_WRAP_MAX];
D3D10BlendState blend_enable;
D3D10BlendState blend_disable;
D3D10BlendState blend_pipeline;
D3D10Buffer menu_pipeline_vbo;
math_matrix_4x4 mvp, mvp_no_rot;
struct video_viewport vp;
D3D10_VIEWPORT viewport;
@ -1075,28 +1152,74 @@ typedef struct
bool resize_chain;
bool keep_aspect;
bool resize_viewport;
bool resize_render_targets;
bool init_history;
d3d10_shader_t shaders[GFX_MAX_SHADERS];
struct
{
d3d10_shader_t shader;
d3d10_shader_t shader_font;
D3D10Buffer vbo;
int offset;
int capacity;
bool enabled;
} sprites;
#ifdef HAVE_OVERLAY
struct
{
D3D10Buffer vbo;
d3d10_texture_t* textures;
bool enabled;
bool fullscreen;
int count;
} overlays;
#endif
struct
{
d3d10_texture_t texture;
D3D10Buffer vbo;
D3D10SamplerState sampler;
bool enabled;
bool fullscreen;
} menu;
struct
{
d3d10_texture_t texture;
d3d10_texture_t texture[GFX_MAX_FRAME_HISTORY + 1];
D3D10Buffer vbo;
D3D10Buffer ubo;
D3D10SamplerState sampler;
D3D10_VIEWPORT viewport;
float4_t output_size;
int rotation;
} frame;
struct
{
d3d10_shader_t shader;
D3D10Buffer buffers[SLANG_CBUFFER_MAX];
d3d10_texture_t rt;
d3d10_texture_t feedback;
D3D10_VIEWPORT viewport;
pass_semantics_t semantics;
uint32_t frame_count;
} pass[GFX_MAX_SHADERS];
struct video_shader* shader_preset;
d3d10_texture_t luts[GFX_MAX_TEXTURES];
} d3d10_video_t;
void d3d10_init_texture(D3D10Device device, d3d10_texture_t* texture);
static INLINE void d3d10_release_texture(d3d10_texture_t* texture)
{
Release(texture->handle);
Release(texture->staging);
Release(texture->view);
Release(texture->rt_view);
}
void d3d10_update_texture(
D3D10Device ctx,
int width,
int height,
int pitch,
@ -1107,6 +1230,26 @@ void d3d10_update_texture(
DXGI_FORMAT d3d10_get_closest_match(
D3D10Device device, DXGI_FORMAT desired_format, UINT desired_format_support);
bool d3d10_init_shader(
D3D10Device device,
const char* src,
size_t size,
const void* src_name,
LPCSTR vs_entry,
LPCSTR ps_entry,
LPCSTR gs_entry,
const D3D10_INPUT_ELEMENT_DESC* input_element_descs,
UINT num_elements,
d3d10_shader_t* out);
static INLINE void d3d10_release_shader(d3d10_shader_t* shader)
{
Release(shader->layout);
Release(shader->vs);
Release(shader->ps);
Release(shader->gs);
}
static INLINE DXGI_FORMAT
d3d10_get_closest_match_texture2D(D3D10Device device, DXGI_FORMAT desired_format)
{
@ -1114,3 +1257,20 @@ d3d10_get_closest_match_texture2D(D3D10Device device, DXGI_FORMAT desired_format
device, desired_format,
D3D10_FORMAT_SUPPORT_TEXTURE2D | D3D10_FORMAT_SUPPORT_SHADER_SAMPLE);
}
static INLINE void d3d10_set_shader(D3D10Device ctx, d3d10_shader_t* shader)
{
D3D10SetInputLayout(ctx, shader->layout);
D3D10SetVShader(ctx, shader->vs);
D3D10SetPShader(ctx, shader->ps);
D3D10SetGShader(ctx, shader->gs);
}
#if !defined(__cplusplus) || defined(CINTERFACE)
static INLINE void
d3d10_set_texture_and_sampler(D3D10Device ctx, UINT slot, d3d10_texture_t* texture)
{
D3D10SetPShaderResources(ctx, slot, 1, &texture->view);
D3D10SetPShaderSamplers(ctx, slot, 1, (D3D10SamplerState*)&texture->sampler);
}
#endif

View File

@ -137,11 +137,23 @@ void d3d11_update_texture(
D3D11_MAPPED_SUBRESOURCE mapped_texture;
D3D11_BOX frame_box = { 0, 0, 0, width, height, 1 };
D3D11MapTexture2D(ctx, texture->staging, 0, D3D11_MAP_WRITE, 0, &mapped_texture);
if (!texture || !texture->staging)
return;
D3D11MapTexture2D(ctx, texture->staging,
0, D3D11_MAP_WRITE, 0, &mapped_texture);
#if 0
PERF_START();
conv_rgb565_argb8888(mapped_texture.pData, data, width, height,
mapped_texture.RowPitch, pitch);
PERF_STOP();
#else
dxgi_copy(
width, height, format, pitch, data, texture->desc.Format, mapped_texture.RowPitch,
width, height, format, pitch, data,
texture->desc.Format, mapped_texture.RowPitch,
mapped_texture.pData);
#endif
D3D11UnmapTexture2D(ctx, texture->staging, 0);
@ -193,20 +205,20 @@ bool d3d11_init_shader(
if (!src) /* LPCWSTR filename */
{
if (vs_entry && !d3d_compile_from_file((LPCWSTR)src_name, vs_entry, "vs_5_0", &vs_code))
if (vs_entry && !d3d_compile_from_file((LPCWSTR)src_name, vs_entry, "vs_4_0", &vs_code))
success = false;
if (ps_entry && !d3d_compile_from_file((LPCWSTR)src_name, ps_entry, "ps_5_0", &ps_code))
if (ps_entry && !d3d_compile_from_file((LPCWSTR)src_name, ps_entry, "ps_4_0", &ps_code))
success = false;
if (gs_entry && !d3d_compile_from_file((LPCWSTR)src_name, gs_entry, "gs_5_0", &gs_code))
if (gs_entry && !d3d_compile_from_file((LPCWSTR)src_name, gs_entry, "gs_4_0", &gs_code))
success = false;
}
else /* char array */
{
if (vs_entry && !d3d_compile(src, size, (LPCSTR)src_name, vs_entry, "vs_5_0", &vs_code))
if (vs_entry && !d3d_compile(src, size, (LPCSTR)src_name, vs_entry, "vs_4_0", &vs_code))
success = false;
if (ps_entry && !d3d_compile(src, size, (LPCSTR)src_name, ps_entry, "ps_5_0", &ps_code))
if (ps_entry && !d3d_compile(src, size, (LPCSTR)src_name, ps_entry, "ps_4_0", &ps_code))
success = false;
if (gs_entry && !d3d_compile(src, size, (LPCSTR)src_name, gs_entry, "gs_5_0", &gs_code))
if (gs_entry && !d3d_compile(src, size, (LPCSTR)src_name, gs_entry, "gs_4_0", &gs_code))
success = false;
}

View File

@ -237,6 +237,7 @@ static INLINE void D3D11SetPShaderSamplers(
device_context->lpVtbl->PSSetSamplers(
device_context, start_slot, num_samplers, samplers);
}
static INLINE void D3D11SetVShader(
D3D11DeviceContext device_context,
D3D11VertexShader vertex_shader,

View File

@ -206,36 +206,39 @@ bool d3d12_init_queue(d3d12_video_t* d3d12)
return true;
}
bool d3d12_init_swapchain(d3d12_video_t* d3d12, int width, int height, HWND hwnd)
bool d3d12_init_swapchain(d3d12_video_t* d3d12,
int width, int height, HWND hwnd)
{
{
DXGI_SWAP_CHAIN_DESC desc = { 0 };
desc.BufferCount = countof(d3d12->chain.renderTargets);
desc.BufferDesc.Width = width;
desc.BufferDesc.Height = height;
desc.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
desc.SampleDesc.Count = 1;
unsigned i;
DXGI_SWAP_CHAIN_DESC desc;
memset(&desc, 0, sizeof(DXGI_SWAP_CHAIN_DESC));
desc.BufferCount = countof(d3d12->chain.renderTargets);
desc.BufferDesc.Width = width;
desc.BufferDesc.Height = height;
desc.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
desc.SampleDesc.Count = 1;
#if 0
desc.BufferDesc.RefreshRate.Numerator = 60;
desc.BufferDesc.RefreshRate.Denominator = 1;
desc.SampleDesc.Quality = 0;
desc.BufferDesc.RefreshRate.Numerator = 60;
desc.BufferDesc.RefreshRate.Denominator = 1;
desc.SampleDesc.Quality = 0;
#endif
desc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
desc.OutputWindow = hwnd;
desc.Windowed = TRUE;
desc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
desc.OutputWindow = hwnd;
desc.Windowed = TRUE;
#if 0
desc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL;
desc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL;
#else
desc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_DISCARD;
desc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_DISCARD;
#endif
DXGICreateSwapChain(d3d12->factory, d3d12->queue.handle, &desc, &d3d12->chain.handle);
}
DXGICreateSwapChain(d3d12->factory, d3d12->queue.handle, &desc, &d3d12->chain.handle);
DXGIMakeWindowAssociation(d3d12->factory, hwnd, DXGI_MWA_NO_ALT_ENTER);
d3d12->chain.frame_index = DXGIGetCurrentBackBufferIndex(d3d12->chain.handle);
for (int i = 0; i < countof(d3d12->chain.renderTargets); i++)
for (i = 0; i < countof(d3d12->chain.renderTargets); i++)
{
DXGIGetSwapChainBuffer(d3d12->chain.handle, i, &d3d12->chain.renderTargets[i]);
D3D12CreateRenderTargetView(
@ -270,7 +273,7 @@ static D3D12_CPU_DESCRIPTOR_HANDLE d3d12_descriptor_heap_slot_alloc(d3d12_descri
int i;
D3D12_CPU_DESCRIPTOR_HANDLE handle = { 0 };
for (i = heap->start; i < heap->desc.NumDescriptors; i++)
for (i = heap->start; i < (int)heap->desc.NumDescriptors; i++)
{
if (!heap->map[i])
{
@ -372,18 +375,18 @@ bool d3d12_init_descriptors(d3d12_video_t* d3d12)
cs_root_params[CS_ROOT_ID_TEXTURE_T].ParameterType = D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE;
cs_root_params[CS_ROOT_ID_TEXTURE_T].DescriptorTable.NumDescriptorRanges = countof(srv_tbl);
cs_root_params[CS_ROOT_ID_TEXTURE_T].DescriptorTable.pDescriptorRanges = srv_tbl;
cs_root_params[CS_ROOT_ID_TEXTURE_T].ShaderVisibility = 0;
cs_root_params[CS_ROOT_ID_TEXTURE_T].ShaderVisibility = D3D12_SHADER_VISIBILITY_ALL;
cs_root_params[CS_ROOT_ID_UAV_T].ParameterType = D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE;
cs_root_params[CS_ROOT_ID_UAV_T].DescriptorTable.NumDescriptorRanges = countof(uav_tbl);
cs_root_params[CS_ROOT_ID_UAV_T].DescriptorTable.pDescriptorRanges = uav_tbl;
cs_root_params[CS_ROOT_ID_UAV_T].ShaderVisibility = 0;
cs_root_params[CS_ROOT_ID_UAV_T].ShaderVisibility = D3D12_SHADER_VISIBILITY_ALL;
cs_root_params[CS_ROOT_ID_CONSTANTS].ParameterType = D3D12_ROOT_PARAMETER_TYPE_32BIT_CONSTANTS;
cs_root_params[CS_ROOT_ID_CONSTANTS].Constants.Num32BitValues = 3;
cs_root_params[CS_ROOT_ID_CONSTANTS].Constants.RegisterSpace = 0;
cs_root_params[CS_ROOT_ID_CONSTANTS].Constants.ShaderRegister = 0;
cs_root_params[CS_ROOT_ID_CONSTANTS].ShaderVisibility = 0;
cs_root_params[CS_ROOT_ID_CONSTANTS].ShaderVisibility = D3D12_SHADER_VISIBILITY_ALL;
static_sampler.AddressU = D3D12_TEXTURE_ADDRESS_MODE_CLAMP;
static_sampler.AddressV = D3D12_TEXTURE_ADDRESS_MODE_CLAMP;
@ -733,6 +736,9 @@ void d3d12_update_texture(
uint8_t* dst;
D3D12_RANGE read_range = { 0, 0 };
if (!texture || !texture->upload_buffer)
return;
D3D12Map(texture->upload_buffer, 0, &read_range, (void**)&dst);
dxgi_copy(

View File

@ -13,6 +13,8 @@
* If not, see <http://www.gnu.org/licenses/>.
*/
#define CINTERFACE
/* For Xbox we will just link statically
* to Direct3D libraries instead. */
@ -24,18 +26,11 @@
#include <dynamic/dylib.h>
#endif
#include "../../configuration.h"
#include "../../verbosity.h"
#include <d3d8.h>
#ifdef HAVE_D3DX
#ifdef _XBOX
#include <d3dx8core.h>
#include <d3dx8tex.h>
#else
#include "../include/d3d8/d3dx8tex.h"
#endif
#endif
#include "d3d8_common.h"
@ -172,143 +167,32 @@ void d3d8_deinitialize_symbols(void)
#endif
}
bool d3d8_check_device_type(void *_d3d,
unsigned idx,
INT32 disp_format,
INT32 backbuffer_format,
bool windowed_mode)
{
LPDIRECT3D8 d3d = (LPDIRECT3D8)_d3d;
if (!d3d)
return false;
#ifdef __cplusplus
if (FAILED(d3d->CheckDeviceType(
0,
D3DDEVTYPE_HAL,
(D3DFORMAT)disp_format,
(D3DFORMAT)backbuffer_format,
windowed_mode)))
return false;
#else
if (FAILED(IDirect3D8_CheckDeviceType(d3d,
0,
D3DDEVTYPE_HAL,
disp_format,
backbuffer_format,
windowed_mode)))
return false;
#endif
return true;
}
bool d3d8_get_adapter_display_mode(
void *_d3d,
unsigned idx,
void *display_mode)
{
LPDIRECT3D8 d3d = (LPDIRECT3D8)_d3d;
if (!d3d)
return false;
#ifdef __cplusplus
if (FAILED(d3d->GetAdapterDisplayMode(idx, (D3DDISPLAYMODE*)display_mode)))
return false;
#else
if (FAILED(IDirect3D8_GetAdapterDisplayMode(d3d, idx, (D3DDISPLAYMODE*)display_mode)))
return false;
#endif
return true;
}
bool d3d8_swap(void *data, void *_dev)
{
LPDIRECT3DDEVICE8 dev = (LPDIRECT3DDEVICE8)_dev;
#ifdef __cplusplus
if (dev->Present(NULL, NULL, NULL, NULL) != D3D_OK)
return false;
#else
if (IDirect3DDevice8_Present(dev, NULL, NULL, NULL, NULL)
== D3DERR_DEVICELOST)
return false;
#endif
return true;
}
void d3d8_set_transform(void *_dev,
INT32 state, const void *_matrix)
{
CONST D3DMATRIX *matrix = (CONST D3DMATRIX*)_matrix;
LPDIRECT3DDEVICE8 dev = (LPDIRECT3DDEVICE8)_dev;
#ifdef __cplusplus
dev->SetTransform((D3DTRANSFORMSTATETYPE)state, matrix);
#else
IDirect3DDevice8_SetTransform(dev, (D3DTRANSFORMSTATETYPE)state, matrix);
#endif
}
bool d3d8_texture_get_level_desc(void *_tex,
unsigned idx, void *_ppsurface_level)
{
LPDIRECT3DTEXTURE8 tex = (LPDIRECT3DTEXTURE8)_tex;
#ifdef __cplusplus
if (SUCCEEDED(tex->GetLevelDesc(idx, (D3DSURFACE_DESC*)_ppsurface_level)))
return true;
#else
if (SUCCEEDED(IDirect3DTexture8_GetLevelDesc(tex, idx, (D3DSURFACE_DESC*)_ppsurface_level)))
return true;
#endif
return false;
}
bool d3d8_texture_get_surface_level(void *_tex,
unsigned idx, void **_ppsurface_level)
{
LPDIRECT3DTEXTURE8 tex = (LPDIRECT3DTEXTURE8)_tex;
if (!tex)
return false;
#ifdef __cplusplus
if (SUCCEEDED(tex->GetSurfaceLevel(idx, (IDirect3DSurface8**)_ppsurface_level)))
return true;
#else
if (SUCCEEDED(IDirect3DTexture8_GetSurfaceLevel(tex, idx, (IDirect3DSurface8**)_ppsurface_level)))
return true;
#endif
return false;
}
#ifdef HAVE_D3DX
static void *d3d8_texture_new_from_file(
void *dev,
LPDIRECT3DDEVICE8 dev,
const char *path, unsigned width, unsigned height,
unsigned miplevels, unsigned usage, D3DFORMAT format,
INT32 pool, unsigned filter, unsigned mipfilter,
D3DPOOL pool, unsigned filter, unsigned mipfilter,
INT32 color_key, void *src_info_data,
PALETTEENTRY *palette)
{
void *buf = NULL;
HRESULT hr = D3DCreateTextureFromFile((LPDIRECT3DDEVICE8)dev,
if (FAILED(D3DCreateTextureFromFile(dev,
path, width, height, miplevels, usage, format,
(D3DPOOL)pool, filter, mipfilter, color_key, src_info_data,
palette, (struct IDirect3DTeture8**)&buf);
if (FAILED(hr))
pool, filter, mipfilter, color_key, src_info_data,
palette, (struct IDirect3DTeture8**)&buf)))
return NULL;
return buf;
}
#endif
void *d3d8_texture_new(void *_dev,
void *d3d8_texture_new(LPDIRECT3DDEVICE8 dev,
const char *path, unsigned width, unsigned height,
unsigned miplevels, unsigned usage, INT32 format,
INT32 pool, unsigned filter, unsigned mipfilter,
INT32 color_key, void *src_info_data,
PALETTEENTRY *palette, bool want_mipmap)
{
HRESULT hr = S_OK;
void *buf = NULL;
if (path)
@ -324,528 +208,53 @@ void *d3d8_texture_new(void *_dev,
#endif
}
{
LPDIRECT3DDEVICE8 dev = (LPDIRECT3DDEVICE8)_dev;
#ifdef __cplusplus
hr = dev->CreateTexture(
width, height, miplevels, usage,
(D3DFORMAT)format, (D3DPOOL)pool, (IDirect3DTexture8**)&buf);
#else
hr = IDirect3DDevice8_CreateTexture(dev,
width, height, miplevels, usage,
(D3DFORMAT)format, (D3DPOOL)pool, (struct IDirect3DTexture8**)&buf);
#endif
}
if (FAILED(hr))
if (FAILED(IDirect3DDevice8_CreateTexture(dev,
width, height, miplevels, usage,
(D3DFORMAT)format, (D3DPOOL)pool,
(struct IDirect3DTexture8**)&buf)))
return NULL;
return buf;
}
void d3d8_texture_free(void *_tex)
{
LPDIRECT3DTEXTURE8 tex = (LPDIRECT3DTEXTURE8)_tex;
if (!tex)
return;
#ifdef __cplusplus
tex->Release();
#else
IDirect3DTexture8_Release(tex);
#endif
}
bool d3d8_surface_lock_rect(void *data, void *data2)
{
LPDIRECT3DSURFACE8 surf = (LPDIRECT3DSURFACE8)data;
if (!surf)
return false;
#ifdef __cplusplus
if (FAILED(surf->LockRect((D3DLOCKED_RECT*)data2, NULL, D3DLOCK_READONLY)))
return false;
#else
if (FAILED(IDirect3DSurface8_LockRect(surf, (D3DLOCKED_RECT*)data2, NULL, D3DLOCK_READONLY)))
return false;
#endif
return true;
}
void d3d8_surface_unlock_rect(void *data)
{
LPDIRECT3DSURFACE8 surf = (LPDIRECT3DSURFACE8)data;
if (!surf)
return;
#ifdef __cplusplus
surf->UnlockRect();
#else
IDirect3DSurface8_UnlockRect(surf);
#endif
}
void d3d8_surface_free(void *data)
{
LPDIRECT3DSURFACE8 surf = (LPDIRECT3DSURFACE8)data;
if (!surf)
return;
#ifdef __cplusplus
surf->Release();
#else
IDirect3DSurface8_Release(surf);
#endif
}
void *d3d8_vertex_buffer_new(void *_dev,
unsigned length, unsigned usage,
unsigned fvf, INT32 pool, void *handle)
{
void *buf = NULL;
LPDIRECT3DDEVICE8 dev = (LPDIRECT3DDEVICE8)_dev;
#ifdef __cplusplus
HRESULT hr = dev->CreateVertexBuffer(
length, usage, fvf, (D3DPOOL)pool, (IDirect3DVertexBuffer8**)&buf);
#else
HRESULT hr = IDirect3DDevice8_CreateVertexBuffer(
dev, length, usage, fvf,
(D3DPOOL)pool,
(struct IDirect3DVertexBuffer8**)&buf);
#endif
if (FAILED(hr))
return NULL;
return buf;
}
void d3d8_vertex_buffer_unlock(void *vertbuf_ptr)
{
LPDIRECT3DVERTEXBUFFER8 vertbuf = (LPDIRECT3DVERTEXBUFFER8)vertbuf_ptr;
if (!vertbuf)
return;
#ifdef __cplusplus
vertbuf->Unlock();
#else
IDirect3DVertexBuffer8_Unlock(vertbuf);
#endif
}
void *d3d8_vertex_buffer_lock(void *vertbuf_ptr)
{
void *buf = NULL;
LPDIRECT3DVERTEXBUFFER8 vertbuf = (LPDIRECT3DVERTEXBUFFER8)vertbuf_ptr;
if (!vertbuf)
return NULL;
#ifdef __cplusplus
vertbuf->Lock(0, 0, (BYTE**)&buf, 0);
#else
IDirect3DVertexBuffer8_Lock(vertbuf, 0, 0, (BYTE**)&buf, 0);
#endif
if (!buf)
return NULL;
return buf;
}
void d3d8_vertex_buffer_free(void *vertex_data, void *vertex_declaration)
{
if (vertex_data)
{
LPDIRECT3DVERTEXBUFFER8 buf = (LPDIRECT3DVERTEXBUFFER8)vertex_data;
#ifdef __cplusplus
buf->Release();
#else
IDirect3DVertexBuffer8_Release(buf);
#endif
buf = NULL;
}
}
void d3d8_set_stream_source(void *_dev, unsigned stream_no,
void *stream_vertbuf_ptr, unsigned offset_bytes,
unsigned stride)
{
LPDIRECT3DDEVICE8 dev = (LPDIRECT3DDEVICE8)_dev;
LPDIRECT3DVERTEXBUFFER8 stream_vertbuf = (LPDIRECT3DVERTEXBUFFER8)stream_vertbuf_ptr;
if (!stream_vertbuf)
return;
#ifdef __cplusplus
dev->SetStreamSource(stream_no, stream_vertbuf, offset_bytes, stride);
#else
IDirect3DDevice8_SetStreamSource(dev, stream_no, stream_vertbuf, stride);
#endif
}
static void d3d8_set_texture_stage_state(void *_dev,
unsigned sampler, unsigned type, unsigned value)
{
LPDIRECT3DDEVICE8 dev = (LPDIRECT3DDEVICE8)_dev;
#ifdef __cplusplus
if (dev->SetTextureStageState(sampler, (D3DTEXTURESTAGESTATETYPE)type, value) != D3D_OK)
RARCH_ERR("SetTextureStageState call failed, sampler: %d, value: %d, type: %d\n", sampler, value, type);
#else
if (IDirect3DDevice8_SetTextureStageState(dev, sampler, (D3DTEXTURESTAGESTATETYPE)type, value) != D3D_OK)
RARCH_ERR("SetTextureStageState call failed, sampler: %d, value: %d, type: %d\n", sampler, value, type);
#endif
}
void d3d8_set_sampler_address_u(void *_dev,
unsigned sampler, unsigned value)
{
LPDIRECT3DDEVICE8 dev = (LPDIRECT3DDEVICE8)_dev;
d3d8_set_texture_stage_state(dev, sampler, D3DTSS_ADDRESSU, value);
}
void d3d8_set_sampler_address_v(void *_dev,
unsigned sampler, unsigned value)
{
LPDIRECT3DDEVICE8 dev = (LPDIRECT3DDEVICE8)_dev;
d3d8_set_texture_stage_state(dev, sampler, D3DTSS_ADDRESSV, value);
}
void d3d8_set_sampler_minfilter(void *_dev,
unsigned sampler, unsigned value)
{
d3d8_set_texture_stage_state(_dev, sampler, D3DTSS_MINFILTER, value);
}
void d3d8_set_sampler_magfilter(void *_dev,
unsigned sampler, unsigned value)
{
d3d8_set_texture_stage_state(_dev, sampler, D3DTSS_MAGFILTER, value);
}
bool d3d8_begin_scene(void *_dev)
{
LPDIRECT3DDEVICE8 dev = (LPDIRECT3DDEVICE8)_dev;
if (!dev)
return false;
#ifdef __cplusplus
#ifdef _XBOX
dev->BeginScene();
#else
if (FAILED(dev->BeginScene()))
return false;
#endif
#else
#ifdef _XBOX
IDirect3DDevice8_BeginScene(dev);
#else
if (FAILED(IDirect3DDevice8_BeginScene(dev)))
return false;
#endif
#endif
return true;
}
void d3d8_end_scene(void *_dev)
{
LPDIRECT3DDEVICE8 dev = (LPDIRECT3DDEVICE8)_dev;
if (!dev)
return;
#ifdef __cplusplus
dev->EndScene();
#else
IDirect3DDevice8_EndScene(dev);
#endif
}
static void d3d8_draw_primitive_internal(void *_dev,
D3DPRIMITIVETYPE type, unsigned start, unsigned count)
{
LPDIRECT3DDEVICE8 dev = (LPDIRECT3DDEVICE8)_dev;
if (!dev)
return;
#ifdef __cplusplus
dev->DrawPrimitive(type, start, count);
#else
IDirect3DDevice8_DrawPrimitive(dev, type, start, count);
#endif
}
void d3d8_draw_primitive(void *dev,
INT32 type, unsigned start, unsigned count)
{
if (!d3d8_begin_scene(dev))
return;
d3d8_draw_primitive_internal(dev, (D3DPRIMITIVETYPE)type, start, count);
d3d8_end_scene(dev);
}
void d3d8_clear(void *_dev,
unsigned count, const void *rects, unsigned flags,
INT32 color, float z, unsigned stencil)
{
LPDIRECT3DDEVICE8 dev = (LPDIRECT3DDEVICE8)_dev;
if (!dev)
return;
#ifdef __cplusplus
dev->Clear(count, (const D3DRECT*)rects, flags, color, z, stencil);
#else
IDirect3DDevice8_Clear(dev, count, (const D3DRECT*)rects, flags,
color, z, stencil);
#endif
}
bool d3d8_device_get_render_target(void *_dev,
unsigned idx, void **data)
{
LPDIRECT3DDEVICE8 dev = (LPDIRECT3DDEVICE8)_dev;
if (!dev)
return false;
#ifdef __cplusplus
if (SUCCEEDED(dev->GetRenderTarget(
(LPDIRECT3DSURFACE8*)data)))
return true;
#else
if (SUCCEEDED(IDirect3DDevice8_GetRenderTarget(dev,
(LPDIRECT3DSURFACE8*)data)))
return true;
#endif
return false;
}
bool d3d8_lock_rectangle(void *_tex,
unsigned level, void *_lr, RECT *rect,
unsigned rectangle_height, unsigned flags)
{
D3DLOCKED_RECT *lr = (D3DLOCKED_RECT*)_lr;
LPDIRECT3DTEXTURE8 tex = (LPDIRECT3DTEXTURE8)_tex;
if (!tex)
return false;
#ifdef __cplusplus
if (FAILED(tex->LockRect(level, lr, rect, flags)))
return false;
#else
if (IDirect3DTexture8_LockRect(tex, level, lr, rect, flags) != D3D_OK)
return false;
#endif
return true;
}
void d3d8_unlock_rectangle(void *_tex)
{
LPDIRECT3DTEXTURE8 tex = (LPDIRECT3DTEXTURE8)_tex;
if (!tex)
return;
#ifdef __cplusplus
tex->UnlockRect(0);
#else
IDirect3DTexture8_UnlockRect(tex, 0);
#endif
}
void d3d8_lock_rectangle_clear(void *tex,
unsigned level, void *_lr, RECT *rect,
unsigned rectangle_height, unsigned flags)
{
D3DLOCKED_RECT *lr = (D3DLOCKED_RECT*)_lr;
#if defined(_XBOX)
level = 0;
#endif
memset(lr->pBits, level, rectangle_height * lr->Pitch);
d3d8_unlock_rectangle(tex);
}
void d3d8_set_viewports(void *_dev, void *_vp)
{
LPDIRECT3DDEVICE8 dev = (LPDIRECT3DDEVICE8)_dev;
D3DVIEWPORT8 *vp = (D3DVIEWPORT8*)_vp;
if (!dev)
return;
#ifdef __cplusplus
dev->SetViewport(vp);
#else
IDirect3DDevice8_SetViewport(dev, vp);
#endif
}
void d3d8_set_texture(void *_dev, unsigned sampler,
void *tex_data)
{
LPDIRECT3DTEXTURE8 tex = (LPDIRECT3DTEXTURE8)tex_data;
LPDIRECT3DDEVICE8 dev = (LPDIRECT3DDEVICE8)_dev;
if (!dev || !tex)
return;
#ifdef __cplusplus
dev->SetTexture(sampler, tex);
#else
IDirect3DDevice8_SetTexture(dev, sampler,
(IDirect3DBaseTexture8*)tex);
#endif
}
bool d3d8_set_vertex_shader(void *_dev, unsigned index,
void *data)
{
LPDIRECT3DDEVICE8 dev = (LPDIRECT3DDEVICE8)_dev;
#ifdef __cplusplus
LPDIRECT3DVERTEXSHADER8 shader = (LPDIRECT3DVERTEXSHADER8)data;
if (dev->SetVertexShader(shader) != D3D_OK)
return false;
#else
if (IDirect3DDevice8_SetVertexShader(dev, index) != D3D_OK)
return false;
#endif
return true;
}
void d3d8_texture_blit(unsigned pixel_size,
void *tex,
void *_lr, const void *frame,
unsigned width, unsigned height, unsigned pitch)
{
unsigned y;
D3DLOCKED_RECT *lr = (D3DLOCKED_RECT*)_lr;
for (y = 0; y < height; y++)
{
const uint8_t *in = (const uint8_t*)frame + y * pitch;
uint8_t *out = (uint8_t*)lr->pBits + y * lr->Pitch;
memcpy(out, in, width * pixel_size);
}
}
bool d3d8_get_render_state(void *data, INT32 state, DWORD *value)
{
LPDIRECT3DDEVICE8 dev = (LPDIRECT3DDEVICE8)data;
#ifdef __cplusplus
if (dev && dev->GetRenderState((D3DRENDERSTATETYPE)state, value) == D3D_OK)
return true;
#else
if (dev && IDirect3DDevice8_GetRenderState(dev, (D3DRENDERSTATETYPE)state, value) == D3D_OK)
return true;
#endif
return false;
}
void d3d8_set_render_state(void *data, INT32 state, DWORD value)
{
LPDIRECT3DDEVICE8 dev = (LPDIRECT3DDEVICE8)data;
if (!dev)
return;
#ifdef __cplusplus
dev->SetRenderState((D3DRENDERSTATETYPE)state, value);
#else
IDirect3DDevice8_SetRenderState(dev, (D3DRENDERSTATETYPE)state, value);
#endif
}
void d3d8_enable_blend_func(void *data)
{
if (!data)
return;
d3d8_set_render_state(data, D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
d3d8_set_render_state(data, D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
d3d8_set_render_state(data, D3DRS_ALPHABLENDENABLE, true);
}
void d3d8_device_set_render_target(void *_dev, unsigned idx,
void *data)
{
LPDIRECT3DSURFACE8 surf = (LPDIRECT3DSURFACE8)data;
LPDIRECT3DDEVICE8 dev = (LPDIRECT3DDEVICE8)_dev;
if (!dev)
return;
#ifdef __cplusplus
dev->SetRenderTarget(idx, surf);
#else
IDirect3DDevice8_SetRenderTarget(dev, surf, NULL);
#endif
}
void d3d8_enable_alpha_blend_texture_func(void *data)
{
/* Also blend the texture with the set alpha value. */
d3d8_set_texture_stage_state(data, 0, D3DTSS_ALPHAOP, D3DTOP_MODULATE);
d3d8_set_texture_stage_state(data, 0, D3DTSS_ALPHAARG1, D3DTA_DIFFUSE);
d3d8_set_texture_stage_state(data, 0, D3DTSS_ALPHAARG2, D3DTA_TEXTURE);
}
void d3d8_frame_postprocess(void *data)
{
#if defined(_XBOX)
global_t *global = global_get_ptr();
#ifdef __cplusplus
LPDIRECT3DDEVICE8 dev = (LPDIRECT3DDEVICE8)data;
if (!dev)
return;
dev->SetFlickerFilter(global->console.screen.flicker_filter_index);
dev->SetSoftDisplayFilter(global->console.softfilter_enable);
#else
D3DDevice_SetFlickerFilter(global->console.screen.flicker_filter_index);
D3DDevice_SetSoftDisplayFilter(global->console.softfilter_enable);
#endif
#endif
}
void d3d8_disable_blend_func(void *data)
{
d3d8_set_render_state(data, D3DRS_ALPHABLENDENABLE, false);
}
static bool d3d8_reset_internal(void *data,
static bool d3d8_reset_internal(LPDIRECT3DDEVICE8 dev,
D3DPRESENT_PARAMETERS *d3dpp
)
{
LPDIRECT3DDEVICE8 dev = (LPDIRECT3DDEVICE8)data;
if (!dev)
return false;
#ifdef __cplusplus
if ((dev->Reset(d3dpp) == D3D_OK))
if (dev &&
IDirect3DDevice8_Reset(dev, d3dpp) == D3D_OK)
return true;
#else
if (IDirect3DDevice8_Reset(dev, d3dpp) == D3D_OK)
return true;
#endif
return false;
}
static HRESULT d3d8_test_cooperative_level(void *data)
static HRESULT d3d8_test_cooperative_level(LPDIRECT3DDEVICE8 dev)
{
#ifdef _XBOX
#ifndef _XBOX
if (dev)
return IDirect3DDevice8_TestCooperativeLevel(dev);
#endif
return E_FAIL;
#else
LPDIRECT3DDEVICE8 dev = (LPDIRECT3DDEVICE8)data;
if (!dev)
return E_FAIL;
#ifdef __cplusplus
return dev->TestCooperativeLevel();
#else
return IDirect3DDevice8_TestCooperativeLevel(dev);
#endif
#endif
}
static bool d3d8_create_device_internal(
void *data,
LPDIRECT3DDEVICE8 dev,
D3DPRESENT_PARAMETERS *d3dpp,
void *_d3d,
LPDIRECT3D8 d3d,
HWND focus_window,
unsigned cur_mon_id,
DWORD behavior_flags)
{
LPDIRECT3D8 d3d = (LPDIRECT3D8)_d3d;
LPDIRECT3DDEVICE8 dev = (LPDIRECT3DDEVICE8)data;
if (!dev)
return false;
#ifdef __cplusplus
if (SUCCEEDED(d3d->CreateDevice(
if (dev &&
SUCCEEDED(IDirect3D8_CreateDevice(d3d,
cur_mon_id,
D3DDEVTYPE_HAL,
focus_window,
@ -853,23 +262,13 @@ static bool d3d8_create_device_internal(
d3dpp,
(IDirect3DDevice8**)dev)))
return true;
#else
if (SUCCEEDED(IDirect3D8_CreateDevice(d3d,
cur_mon_id,
D3DDEVTYPE_HAL,
focus_window,
behavior_flags,
d3dpp,
(IDirect3DDevice8**)dev)))
return true;
#endif
return false;
}
bool d3d8_create_device(void *dev,
void *d3dpp,
void *d3d,
LPDIRECT3D8 d3d,
HWND focus_window,
unsigned cur_mon_id)
{
@ -922,165 +321,47 @@ bool d3d8_reset(void *dev, void *d3dpp)
return false;
}
bool d3d8_device_get_backbuffer(void *_dev,
unsigned idx, unsigned swapchain_idx,
unsigned backbuffer_type, void **data)
{
LPDIRECT3DDEVICE8 dev = (LPDIRECT3DDEVICE8)_dev;
if (!dev)
return false;
#ifdef __cplusplus
if (SUCCEEDED(dev->GetBackBuffer(idx,
(D3DBACKBUFFER_TYPE)backbuffer_type,
(LPDIRECT3DSURFACE8*)data)))
return true;
#else
if (SUCCEEDED(IDirect3DDevice8_GetBackBuffer(dev, idx,
(D3DBACKBUFFER_TYPE)backbuffer_type,
(LPDIRECT3DSURFACE8*)data)))
return true;
#endif
return false;
}
void d3d8_device_free(void *_dev, void *_pd3d)
{
LPDIRECT3D8 pd3d = (LPDIRECT3D8)_pd3d;
LPDIRECT3DDEVICE8 dev = (LPDIRECT3DDEVICE8)_dev;
if (dev)
{
#ifdef __cplusplus
dev->Release();
#else
IDirect3DDevice8_Release(dev);
#endif
}
if (pd3d)
{
#if defined(__cplusplus)
pd3d->Release();
#else
IDirect3D8_Release(pd3d);
#endif
}
}
INT32 d3d8_translate_filter(unsigned type)
{
switch (type)
{
case RARCH_FILTER_UNSPEC:
{
settings_t *settings = config_get_ptr();
if (!settings->bools.video_smooth)
break;
}
/* fall-through */
case RARCH_FILTER_LINEAR:
return D3DTEXF_LINEAR;
case RARCH_FILTER_NEAREST:
break;
}
return D3DTEXF_POINT;
}
bool d3d8x_create_font_indirect(void *_dev,
bool d3d8x_create_font_indirect(LPDIRECT3DDEVICE8 dev,
void *desc, void **font_data)
{
#ifdef HAVE_D3DX
LPDIRECT3DDEVICE8 dev = (LPDIRECT3DDEVICE8)_dev;
if (SUCCEEDED(D3DCreateFontIndirect(
dev, (CONST LOGFONT*)desc,
(struct ID3DXFont**)font_data)))
return true;
#endif
return false;
}
void d3d8x_font_draw_text(void *data, void *sprite_data, void *string_data,
unsigned count, void *rect_data, unsigned format, unsigned color)
void d3d8x_font_draw_text(void *data,
void *sprite_data, void *string_data,
unsigned count, void *rect_data,
unsigned format, unsigned color)
{
#ifdef HAVE_D3DX
#if !defined(__cplusplus) || defined(CINTERFACE)
ID3DXFont *font = (ID3DXFont*)data;
if (!font)
return;
font->lpVtbl->DrawText(font, (LPD3DXSPRITE)sprite_data,
(LPCTSTR)string_data, count, (LPRECT)rect_data,
(DWORD)format, (D3DCOLOR)color);
#else
LPD3DXFONT font = (LPD3DXFONT)data;
if (!font)
return;
font->DrawText((LPD3DXSPRITE)sprite_data,
(LPCTSTR)string_data, count, (LPRECT)rect_data,
(DWORD)format, (D3DCOLOR)color);
#endif
if (font)
font->lpVtbl->DrawText(font, (LPD3DXSPRITE)sprite_data,
(LPCTSTR)string_data, count, (LPRECT)rect_data,
(DWORD)format, (D3DCOLOR)color);
#endif
}
void d3d8x_font_release(void *data)
{
#ifdef HAVE_D3DX
#if !defined(__cplusplus) || defined(CINTERFACE)
ID3DXFont *font = (ID3DXFont*)data;
if (!font)
return;
font->lpVtbl->Release(font);
#else
LPD3DXFONT font = (LPD3DXFONT)data;
if (!font)
return;
font->Release();
#endif
if (font)
font->lpVtbl->Release(font);
#endif
}
void d3d8x_font_get_text_metrics(void *data, void *metrics)
{
#ifdef HAVE_D3DX
#if !defined(__cplusplus) || defined(CINTERFACE)
ID3DXFont *font = (ID3DXFont*)data;
if (!font)
return;
font->lpVtbl->GetTextMetrics(font, (TEXTMETRICA*)metrics);
#else
LPD3DXFONT font = (LPD3DXFONT)data;
if (!font)
return;
font->GetTextMetricsA((TEXTMETRICA*)metrics);
#endif
if (font)
font->lpVtbl->GetTextMetrics(font, (TEXTMETRICA*)metrics);
#endif
}
INT32 d3d8_get_rgb565_format(void)
{
#ifdef _XBOX
return D3DFMT_LIN_R5G6B5;
#else
return D3DFMT_R5G6B5;
#endif
}
INT32 d3d8_get_argb8888_format(void)
{
#ifdef _XBOX
return D3DFMT_LIN_A8R8G8B8;
#else
return D3DFMT_A8R8G8B8;
#endif
}
INT32 d3d8_get_xrgb8888_format(void)
{
#ifdef _XBOX
return D3DFMT_LIN_X8R8G8B8;
#else
return D3DFMT_X8R8G8B8;
#endif
}

View File

@ -18,166 +18,444 @@
#include <boolean.h>
#include <retro_common_api.h>
#include <retro_inline.h>
#include <d3d8.h>
#include "../drivers/d3d.h"
#include "../video_driver.h"
#include "../../verbosity.h"
RETRO_BEGIN_DECLS
bool d3d8_swap(void *data, void *dev);
typedef struct d3d8_video
{
bool keep_aspect;
bool should_resize;
bool quitting;
bool needs_restore;
bool overlays_enabled;
/* TODO - refactor this away properly. */
bool resolution_hd_enable;
void *d3d8_vertex_buffer_new(void *dev,
unsigned length, unsigned usage, unsigned fvf,
INT32 pool, void *handle);
unsigned cur_mon_id;
unsigned dev_rotation;
void *d3d8_vertex_buffer_lock(void *data);
void d3d8_vertex_buffer_unlock(void *data);
overlay_t *menu;
const d3d_renderchain_driver_t *renderchain_driver;
void *renderchain_data;
void d3d8_vertex_buffer_free(void *vertex_data, void *vertex_declaration);
RECT font_rect;
RECT font_rect_shifted;
math_matrix_4x4 mvp;
math_matrix_4x4 mvp_rotate;
math_matrix_4x4 mvp_transposed;
bool d3d8_texture_get_level_desc(void *tex,
unsigned idx, void *_ppsurface_level);
struct video_viewport vp;
struct video_shader shader;
video_info_t video_info;
WNDCLASSEX windowClass;
LPDIRECT3DDEVICE8 dev;
d3d_video_viewport_t final_viewport;
bool d3d8_texture_get_surface_level(void *tex,
unsigned idx, void **_ppsurface_level);
char *shader_path;
void *d3d8_texture_new(void *dev,
struct
{
int size;
int offset;
void *buffer;
void *decl;
}menu_display;
size_t overlays_size;
overlay_t *overlays;
} d3d8_video_t;
static INLINE bool d3d8_swap(void *data, LPDIRECT3DDEVICE8 dev)
{
if (IDirect3DDevice8_Present(dev, NULL, NULL, NULL, NULL)
== D3DERR_DEVICELOST)
return false;
return true;
}
static INLINE void *d3d8_vertex_buffer_new(
LPDIRECT3DDEVICE8 dev,
unsigned length, unsigned usage,
unsigned fvf, D3DPOOL pool, void *handle)
{
void *buf = NULL;
if (FAILED(IDirect3DDevice8_CreateVertexBuffer(
dev, length, usage, fvf,
pool,
(struct IDirect3DVertexBuffer8**)&buf)))
return NULL;
return buf;
}
static INLINE void *
d3d8_vertex_buffer_lock(LPDIRECT3DVERTEXBUFFER8 vertbuf)
{
void *buf = NULL;
if (!vertbuf)
return NULL;
IDirect3DVertexBuffer8_Lock(vertbuf, 0, 0, (BYTE**)&buf, 0);
if (!buf)
return NULL;
return buf;
}
static INLINE void d3d8_vertex_buffer_unlock(
LPDIRECT3DVERTEXBUFFER8 vertbuf)
{
if (vertbuf)
IDirect3DVertexBuffer8_Unlock(vertbuf);
}
static INLINE void d3d8_vertex_buffer_free(
LPDIRECT3DVERTEXBUFFER8 buf,
void *vertex_declaration)
{
if (buf)
{
IDirect3DVertexBuffer8_Release(buf);
buf = NULL;
}
}
static INLINE bool d3d8_texture_get_level_desc(
LPDIRECT3DTEXTURE8 tex,
unsigned idx, void *_ppsurface_level)
{
if (SUCCEEDED(IDirect3DTexture8_GetLevelDesc(
tex, idx, (D3DSURFACE_DESC*)_ppsurface_level)))
return true;
return false;
}
static INLINE bool d3d8_texture_get_surface_level(
LPDIRECT3DTEXTURE8 tex,
unsigned idx, void **_ppsurface_level)
{
if (tex &&
SUCCEEDED(
IDirect3DTexture8_GetSurfaceLevel(
tex, idx, (IDirect3DSurface8**)_ppsurface_level)))
return true;
return false;
}
void *d3d8_texture_new(LPDIRECT3DDEVICE8 dev,
const char *path, unsigned width, unsigned height,
unsigned miplevels, unsigned usage, INT32 format,
INT32 pool, unsigned filter, unsigned mipfilter,
INT32 color_key, void *src_info,
INT32 color_key, void *src_info_data,
PALETTEENTRY *palette, bool want_mipmap);
void d3d8_set_stream_source(void *dev, unsigned stream_no,
void *stream_vertbuf, unsigned offset_bytes,
unsigned stride);
static INLINE void d3d8_set_stream_source(LPDIRECT3DDEVICE8 dev,
unsigned stream_no,
LPDIRECT3DVERTEXBUFFER8 stream_vertbuf,
unsigned offset_bytes,
unsigned stride)
{
if (stream_vertbuf)
IDirect3DDevice8_SetStreamSource(dev,
stream_no, stream_vertbuf, stride);
}
void d3d8_texture_free(void *tex);
static INLINE void d3d8_texture_free(LPDIRECT3DTEXTURE8 tex)
{
if (tex)
IDirect3DTexture8_Release(tex);
}
void d3d8_set_transform(void *dev,
INT32 state, const void *_matrix);
static INLINE void d3d8_set_transform(LPDIRECT3DDEVICE8 dev,
D3DTRANSFORMSTATETYPE state, const D3DMATRIX *matrix)
{
IDirect3DDevice8_SetTransform(dev, state, matrix);
}
void d3d8_set_sampler_address_u(void *dev,
unsigned sampler, unsigned value);
static INLINE void d3d8_set_texture_stage_state(LPDIRECT3DDEVICE8 dev,
unsigned sampler, D3DTEXTURESTAGESTATETYPE type, unsigned value)
{
if (IDirect3DDevice8_SetTextureStageState(dev, sampler,
(D3DTEXTURESTAGESTATETYPE)type, value) != D3D_OK)
RARCH_ERR("SetTextureStageState call failed, sampler: %d, value: %d, type: %d\n", sampler, value, type);
}
void d3d8_set_sampler_address_v(void *dev,
unsigned sampler, unsigned value);
static INLINE void d3d8_set_sampler_address_u(LPDIRECT3DDEVICE8 dev,
unsigned sampler, unsigned value)
{
d3d8_set_texture_stage_state(dev, sampler, D3DTSS_ADDRESSU, value);
}
void d3d8_set_sampler_minfilter(void *dev,
unsigned sampler, unsigned value);
static INLINE void d3d8_set_sampler_address_v(LPDIRECT3DDEVICE8 dev,
unsigned sampler, unsigned value)
{
d3d8_set_texture_stage_state(dev, sampler, D3DTSS_ADDRESSV, value);
}
void d3d8_set_sampler_magfilter(void *dev,
unsigned sampler, unsigned value);
static INLINE void d3d8_set_sampler_minfilter(void *_dev,
unsigned sampler, unsigned value)
{
d3d8_set_texture_stage_state(_dev, sampler, D3DTSS_MINFILTER, value);
}
static INLINE void d3d8_set_sampler_magfilter(void *_dev,
unsigned sampler, unsigned value)
{
d3d8_set_texture_stage_state(_dev, sampler, D3DTSS_MAGFILTER, value);
}
void d3d8_set_sampler_mipfilter(void *dev,
unsigned sampler, unsigned value);
bool d3d8_begin_scene(void *dev);
static INLINE bool d3d8_begin_scene(LPDIRECT3DDEVICE8 dev)
{
if (!dev)
return false;
#ifdef _XBOX
IDirect3DDevice8_BeginScene(dev);
#else
if (FAILED(IDirect3DDevice8_BeginScene(dev)))
return false;
#endif
void d3d8_end_scene(void *dev);
return true;
}
void d3d8_draw_primitive(void *dev,
INT32 type, unsigned start, unsigned count);
static INLINE void d3d8_end_scene(LPDIRECT3DDEVICE8 dev)
{
if (dev)
IDirect3DDevice8_EndScene(dev);
}
void d3d8_clear(void *dev,
static INLINE void d3d8_draw_primitive(LPDIRECT3DDEVICE8 dev,
D3DPRIMITIVETYPE type, unsigned start, unsigned count)
{
if (!d3d8_begin_scene(dev))
return;
IDirect3DDevice8_DrawPrimitive(dev, type, start, count);
d3d8_end_scene(dev);
}
static INLINE void d3d8_clear(LPDIRECT3DDEVICE8 dev,
unsigned count, const void *rects, unsigned flags,
INT32 color, float z, unsigned stencil);
INT32 color, float z, unsigned stencil)
{
if (dev)
IDirect3DDevice8_Clear(dev, count, (const D3DRECT*)rects, flags,
color, z, stencil);
}
bool d3d8_lock_rectangle(void *tex,
unsigned level, void *lock_rect, RECT *rect,
unsigned rectangle_height, unsigned flags);
static INLINE bool d3d8_lock_rectangle(
LPDIRECT3DTEXTURE8 tex,
unsigned level, D3DLOCKED_RECT *lr, RECT *rect,
unsigned rectangle_height, unsigned flags)
{
if (tex &&
IDirect3DTexture8_LockRect(tex,
level, lr, rect, flags) == D3D_OK)
return true;
return false;
}
void d3d8_lock_rectangle_clear(void *tex,
unsigned level, void *lock_rect, RECT *rect,
unsigned rectangle_height, unsigned flags);
static INLINE void d3d8_unlock_rectangle(LPDIRECT3DTEXTURE8 tex)
{
if (tex)
IDirect3DTexture8_UnlockRect(tex, 0);
}
void d3d8_unlock_rectangle(void *tex);
void d3d8_set_texture(void *dev, unsigned sampler,
void *tex_data);
bool d3d8_create_vertex_shader(void *dev,
const DWORD *a, void **b);
bool d3d8_create_pixel_shader(void *dev,
const DWORD *a, void **b);
void d3d8_free_vertex_shader(void *dev, void *data);
bool d3d8_set_vertex_shader(void *dev, unsigned index,
void *data);
void d3d8_texture_blit(unsigned pixel_size,
static INLINE void d3d8_lock_rectangle_clear(
void *tex,
void *lr, const void *frame,
unsigned width, unsigned height, unsigned pitch);
unsigned level, void *_lr, RECT *rect,
unsigned rectangle_height, unsigned flags)
{
D3DLOCKED_RECT *lr = (D3DLOCKED_RECT*)_lr;
#if defined(_XBOX)
level = 0;
#endif
memset(lr->pBits, level, rectangle_height * lr->Pitch);
d3d8_unlock_rectangle(tex);
}
bool d3d8_vertex_declaration_new(void *dev,
const void *vertex_data, void **decl_data);
static INLINE void d3d8_set_texture(
LPDIRECT3DDEVICE8 dev, unsigned sampler,
LPDIRECT3DTEXTURE8 tex)
{
if (dev && tex)
IDirect3DDevice8_SetTexture(dev, sampler,
(IDirect3DBaseTexture8*)tex);
}
void d3d8_vertex_declaration_free(void *data);
static INLINE bool d3d8_set_vertex_shader(
LPDIRECT3DDEVICE8 dev,
unsigned index,
void *data)
{
if (IDirect3DDevice8_SetVertexShader(dev, index) != D3D_OK)
return false;
return true;
}
void d3d8_set_viewports(void *dev, void *vp);
static INLINE void d3d8_texture_blit(
unsigned pixel_size,
void *tex,
D3DLOCKED_RECT *lr,
const void *frame,
unsigned width, unsigned height, unsigned pitch)
{
unsigned y;
void d3d8_enable_blend_func(void *data);
for (y = 0; y < height; y++)
{
const uint8_t *in = (const uint8_t*)frame + y * pitch;
uint8_t *out = (uint8_t*)lr->pBits + y * lr->Pitch;
memcpy(out, in, width * pixel_size);
}
}
void d3d8_disable_blend_func(void *data);
static INLINE void d3d8_set_viewports(
LPDIRECT3DDEVICE8 dev,
void *vp)
{
if (dev)
IDirect3DDevice8_SetViewport(dev, (D3DVIEWPORT8*)vp);
}
void d3d8_set_vertex_declaration(void *data, void *vertex_data);
static INLINE void d3d8_set_render_state(
LPDIRECT3DDEVICE8 dev,
D3DRENDERSTATETYPE state,
DWORD value)
{
if (dev)
IDirect3DDevice8_SetRenderState(dev, state, value);
}
void d3d8_enable_alpha_blend_texture_func(void *data);
static INLINE void d3d8_enable_blend_func(void *data)
{
if (!data)
return;
d3d8_set_render_state(data, D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
d3d8_set_render_state(data, D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
d3d8_set_render_state(data, D3DRS_ALPHABLENDENABLE, true);
}
static INLINE void d3d8_disable_blend_func(void *data)
{
d3d8_set_render_state(data, D3DRS_ALPHABLENDENABLE, false);
}
static INLINE void d3d8_enable_alpha_blend_texture_func(void *data)
{
/* Also blend the texture with the set alpha value. */
d3d8_set_texture_stage_state(data, 0, D3DTSS_ALPHAOP, D3DTOP_MODULATE);
d3d8_set_texture_stage_state(data, 0, D3DTSS_ALPHAARG1, D3DTA_DIFFUSE);
d3d8_set_texture_stage_state(data, 0, D3DTSS_ALPHAARG2, D3DTA_TEXTURE);
}
void d3d8_frame_postprocess(void *data);
void d3d8_surface_free(void *data);
static INLINE void d3d8_surface_free(LPDIRECT3DSURFACE8 surf)
{
if (surf)
IDirect3DSurface8_Release(surf);
}
bool d3d8_device_get_render_target_data(void *dev,
void *_src, void *_dst);
static INLINE bool d3d8_device_get_render_target(
LPDIRECT3DDEVICE8 dev,
unsigned idx, void **data)
{
if (dev &&
SUCCEEDED(IDirect3DDevice8_GetRenderTarget(dev,
(LPDIRECT3DSURFACE8*)data)))
return true;
return false;
}
bool d3d8_device_get_render_target(void *dev,
unsigned idx, void **data);
static INLINE void d3d8_device_set_render_target(
LPDIRECT3DDEVICE8 dev, unsigned idx,
LPDIRECT3DSURFACE8 surf)
{
if (dev)
IDirect3DDevice8_SetRenderTarget(dev, surf, NULL);
}
void d3d8_device_set_render_target(void *dev, unsigned idx,
void *data);
static INLINE bool d3d8_get_render_state(LPDIRECT3DDEVICE8 dev,
D3DRENDERSTATETYPE state, DWORD *value)
{
if (dev &&
IDirect3DDevice8_GetRenderState(dev, state, value) == D3D_OK)
return true;
return false;
}
bool d3d8_get_render_state(void *data,
INT32 state, DWORD *value);
static INLINE bool d3d8_surface_lock_rect(
LPDIRECT3DSURFACE8 surf, void *data2)
{
if (surf &&
SUCCEEDED(
IDirect3DSurface8_LockRect(
surf, (D3DLOCKED_RECT*)data2,
NULL, D3DLOCK_READONLY)))
return true;
return false;
}
void d3d8_set_render_state(void *data,
INT32 state, DWORD value);
static INLINE void d3d8_surface_unlock_rect(LPDIRECT3DSURFACE8 surf)
{
if (surf)
IDirect3DSurface8_UnlockRect(surf);
}
void d3d8_device_set_render_target(void *dev, unsigned idx,
void *data);
bool d3d8_device_create_offscreen_plain_surface(
void *dev,
unsigned width,
unsigned height,
unsigned format,
unsigned pool,
void **surf_data,
void *data);
bool d3d8_surface_lock_rect(void *data, void *data2);
void d3d8_surface_unlock_rect(void *data);
bool d3d8_get_adapter_display_mode(void *d3d,
static INLINE bool d3d8_get_adapter_display_mode(
LPDIRECT3D8 d3d,
unsigned idx,
void *display_mode);
void *display_mode)
{
if (d3d &&
SUCCEEDED(IDirect3D8_GetAdapterDisplayMode(
d3d, idx, (D3DDISPLAYMODE*)display_mode)))
return true;
return false;
}
bool d3d8_create_device(void *dev,
void *d3dpp,
void *d3d,
LPDIRECT3D8 d3d,
HWND focus_window,
unsigned cur_mon_id);
bool d3d8_reset(void *dev, void *d3dpp);
bool d3d8_device_get_backbuffer(void *dev,
static INLINE bool d3d8_device_get_backbuffer(
LPDIRECT3DDEVICE8 dev,
unsigned idx, unsigned swapchain_idx,
unsigned backbuffer_type, void **data);
unsigned backbuffer_type, void **data)
{
if (dev &&
SUCCEEDED(IDirect3DDevice8_GetBackBuffer(dev, idx,
(D3DBACKBUFFER_TYPE)backbuffer_type,
(LPDIRECT3DSURFACE8*)data)))
return true;
return false;
}
void d3d8_device_free(void *dev, void *pd3d);
static INLINE void d3d8_device_free(
LPDIRECT3DDEVICE8 dev, LPDIRECT3D8 pd3d)
{
if (dev)
IDirect3DDevice8_Release(dev);
if (pd3d)
IDirect3D8_Release(pd3d);
}
void *d3d8_create(void);
@ -185,13 +463,25 @@ bool d3d8_initialize_symbols(enum gfx_ctx_api api);
void d3d8_deinitialize_symbols(void);
bool d3d8_check_device_type(void *d3d,
static INLINE bool d3d8_check_device_type(
LPDIRECT3D8 d3d,
unsigned idx,
INT32 disp_format,
INT32 backbuffer_format,
bool windowed_mode);
bool windowed_mode)
{
if (d3d &&
SUCCEEDED(IDirect3D8_CheckDeviceType(d3d,
0,
D3DDEVTYPE_HAL,
disp_format,
backbuffer_format,
windowed_mode)))
return true;
return false;
}
bool d3d8x_create_font_indirect(void *dev,
bool d3d8x_create_font_indirect(LPDIRECT3DDEVICE8 dev,
void *desc, void **font_data);
void d3d8x_font_draw_text(void *data, void *sprite_data, void *string_data,
@ -201,11 +491,32 @@ void d3d8x_font_get_text_metrics(void *data, void *metrics);
void d3d8x_font_release(void *data);
INT32 d3d8_translate_filter(unsigned type);
static INLINE INT32 d3d8_get_rgb565_format(void)
{
#ifdef _XBOX
return D3DFMT_LIN_R5G6B5;
#else
return D3DFMT_R5G6B5;
#endif
}
INT32 d3d8_get_rgb565_format(void);
INT32 d3d8_get_argb8888_format(void);
INT32 d3d8_get_xrgb8888_format(void);
static INLINE INT32 d3d8_get_argb8888_format(void)
{
#ifdef _XBOX
return D3DFMT_LIN_A8R8G8B8;
#else
return D3DFMT_A8R8G8B8;
#endif
}
static INLINE INT32 d3d8_get_xrgb8888_format(void)
{
#ifdef _XBOX
return D3DFMT_LIN_X8R8G8B8;
#else
return D3DFMT_X8R8G8B8;
#endif
}
RETRO_END_DECLS

File diff suppressed because it is too large Load Diff

View File

@ -18,27 +18,122 @@
#include <boolean.h>
#include <retro_common_api.h>
#include <retro_inline.h>
#include <gfx/math/matrix_4x4.h>
#include <d3d9.h>
#include "../drivers/d3d.h"
#include "../video_driver.h"
#include "../../verbosity.h"
RETRO_BEGIN_DECLS
bool d3d9_swap(void *data, void *dev);
typedef struct d3d9_video
{
bool keep_aspect;
bool should_resize;
bool quitting;
bool needs_restore;
bool overlays_enabled;
/* TODO - refactor this away properly. */
bool resolution_hd_enable;
unsigned cur_mon_id;
unsigned dev_rotation;
overlay_t *menu;
const d3d_renderchain_driver_t *renderchain_driver;
void *renderchain_data;
RECT font_rect;
RECT font_rect_shifted;
math_matrix_4x4 mvp;
math_matrix_4x4 mvp_rotate;
math_matrix_4x4 mvp_transposed;
struct video_viewport vp;
struct video_shader shader;
video_info_t video_info;
WNDCLASSEX windowClass;
LPDIRECT3DDEVICE9 dev;
d3d_video_viewport_t final_viewport;
char *shader_path;
struct
{
int size;
int offset;
void *buffer;
void *decl;
}menu_display;
size_t overlays_size;
overlay_t *overlays;
} d3d9_video_t;
static INLINE bool d3d9_swap(void *data, LPDIRECT3DDEVICE9 dev)
{
#ifdef _XBOX
IDirect3DDevice9_Present(dev, NULL, NULL, NULL, NULL);
#else
if (IDirect3DDevice9_Present(dev, NULL, NULL, NULL, NULL)
== D3DERR_DEVICELOST)
return false;
#endif
return true;
}
void *d3d9_vertex_buffer_new(void *dev,
unsigned length, unsigned usage, unsigned fvf,
INT32 pool, void *handle);
void *d3d9_vertex_buffer_lock(void *data);
void d3d9_vertex_buffer_unlock(void *data);
static INLINE void *d3d9_vertex_buffer_lock(LPDIRECT3DVERTEXBUFFER9 vertbuf)
{
void *buf = NULL;
if (!vertbuf)
return NULL;
IDirect3DVertexBuffer9_Lock(vertbuf, 0, 0, &buf, 0);
if (!buf)
return NULL;
return buf;
}
static INLINE void d3d9_vertex_buffer_unlock(LPDIRECT3DVERTEXBUFFER9 vertbuf)
{
if (vertbuf)
IDirect3DVertexBuffer9_Unlock(vertbuf);
}
void d3d9_vertex_buffer_free(void *vertex_data, void *vertex_declaration);
bool d3d9_texture_get_level_desc(void *tex,
unsigned idx, void *_ppsurface_level);
static INLINE bool d3d9_texture_get_level_desc(
LPDIRECT3DTEXTURE9 tex,
unsigned idx,
D3DSURFACE_DESC *_ppsurface_level)
{
#if defined(_XBOX)
D3DTexture_GetLevelDesc(tex, idx, _ppsurface_level);
#else
if (FAILED(IDirect3DTexture9_GetLevelDesc(tex, idx, _ppsurface_level)))
return false;
#endif
return true;
}
bool d3d9_texture_get_surface_level(void *tex,
unsigned idx, void **_ppsurface_level);
static INLINE bool d3d9_texture_get_surface_level(
LPDIRECT3DTEXTURE9 tex,
unsigned idx, void **_ppsurface_level)
{
if (tex &&
SUCCEEDED(IDirect3DTexture9_GetSurfaceLevel(
tex, idx, (IDirect3DSurface9**)_ppsurface_level)))
return true;
return false;
}
void *d3d9_texture_new(void *dev,
const char *path, unsigned width, unsigned height,
@ -47,130 +142,474 @@ void *d3d9_texture_new(void *dev,
INT32 color_key, void *src_info,
PALETTEENTRY *palette, bool want_mipmap);
void d3d9_set_stream_source(void *dev, unsigned stream_no,
void *stream_vertbuf, unsigned offset_bytes,
unsigned stride);
static INLINE void d3d9_set_stream_source(
LPDIRECT3DDEVICE9 dev,
unsigned stream_no,
LPDIRECT3DVERTEXBUFFER9 stream_vertbuf,
unsigned offset_bytes,
unsigned stride)
{
if (stream_vertbuf)
IDirect3DDevice9_SetStreamSource(dev, stream_no, stream_vertbuf,
offset_bytes,
stride);
}
void d3d9_texture_free(void *tex);
static INLINE void d3d9_texture_free(LPDIRECT3DTEXTURE9 tex)
{
if (tex)
IDirect3DTexture9_Release(tex);
}
void d3d9_set_transform(void *dev,
INT32 state, const void *_matrix);
static INLINE void d3d9_set_transform(
LPDIRECT3DDEVICE9 dev,
D3DTRANSFORMSTATETYPE state,
const void *_matrix)
{
#ifndef _XBOX
CONST D3DMATRIX *matrix = (CONST D3DMATRIX*)_matrix;
/* XBox 360 D3D9 does not support fixed-function pipeline. */
IDirect3DDevice9_SetTransform(dev, state, matrix);
#endif
}
void d3d9_set_sampler_address_u(void *dev,
unsigned sampler, unsigned value);
static INLINE void d3d9_set_sampler_address_u(
LPDIRECT3DDEVICE9 dev,
unsigned sampler, unsigned value)
{
IDirect3DDevice9_SetSamplerState(dev,
sampler, D3DSAMP_ADDRESSU, value);
}
void d3d9_set_sampler_address_v(void *dev,
unsigned sampler, unsigned value);
static INLINE void d3d9_set_sampler_address_v(
LPDIRECT3DDEVICE9 dev,
unsigned sampler, unsigned value)
{
IDirect3DDevice9_SetSamplerState(dev,
sampler, D3DSAMP_ADDRESSV, value);
}
void d3d9_set_sampler_minfilter(void *dev,
unsigned sampler, unsigned value);
static INLINE void d3d9_set_sampler_minfilter(
LPDIRECT3DDEVICE9 dev,
unsigned sampler, unsigned value)
{
if (dev)
IDirect3DDevice9_SetSamplerState(dev,
sampler, D3DSAMP_MINFILTER, value);
}
void d3d9_set_sampler_magfilter(void *dev,
unsigned sampler, unsigned value);
static INLINE void d3d9_set_sampler_magfilter(
LPDIRECT3DDEVICE9 dev,
unsigned sampler, unsigned value)
{
if (dev)
IDirect3DDevice9_SetSamplerState(dev,
sampler, D3DSAMP_MAGFILTER, value);
}
void d3d9_set_sampler_mipfilter(void *dev,
unsigned sampler, unsigned value);
static INLINE void d3d9_set_sampler_mipfilter(
LPDIRECT3DDEVICE9 dev,
unsigned sampler, unsigned value)
{
if (dev)
IDirect3DDevice9_SetSamplerState(dev, sampler,
D3DSAMP_MIPFILTER, value);
}
bool d3d9_begin_scene(void *dev);
static INLINE bool d3d9_begin_scene(LPDIRECT3DDEVICE9 dev)
{
if (!dev)
return false;
#if defined(_XBOX)
IDirect3DDevice9_BeginScene(dev);
#else
if (FAILED(IDirect3DDevice9_BeginScene(dev)))
return false;
#endif
void d3d9_end_scene(void *dev);
return true;
}
void d3d9_draw_primitive(void *dev,
INT32 type, unsigned start, unsigned count);
static INLINE void d3d9_end_scene(LPDIRECT3DDEVICE9 dev)
{
if (dev)
IDirect3DDevice9_EndScene(dev);
}
void d3d9_clear(void *dev,
unsigned count, const void *rects, unsigned flags,
INT32 color, float z, unsigned stencil);
static INLINE void d3d9_draw_primitive(
LPDIRECT3DDEVICE9 dev,
D3DPRIMITIVETYPE type,
unsigned start, unsigned count)
{
if (!dev || !d3d9_begin_scene(dev))
return;
IDirect3DDevice9_DrawPrimitive(dev, type, start, count);
d3d9_end_scene(dev);
}
bool d3d9_lock_rectangle(void *tex,
unsigned level, void *lock_rect, RECT *rect,
unsigned rectangle_height, unsigned flags);
static INLINE void d3d9_clear(
LPDIRECT3DDEVICE9 dev,
unsigned count, const D3DRECT *rects, unsigned flags,
INT32 color, float z, unsigned stencil)
{
if (dev)
IDirect3DDevice9_Clear(dev, count, rects, flags,
color, z, stencil);
}
void d3d9_lock_rectangle_clear(void *tex,
unsigned level, void *lock_rect, RECT *rect,
unsigned rectangle_height, unsigned flags);
static INLINE bool d3d9_lock_rectangle(
LPDIRECT3DTEXTURE9 tex,
unsigned level,
D3DLOCKED_RECT *lr,
const RECT *rect,
unsigned rectangle_height, unsigned flags)
{
if (!tex)
return false;
#ifdef _XBOX
IDirect3DTexture9_LockRect(tex, level, lr, rect, flags);
#else
if (IDirect3DTexture9_LockRect(tex, level, lr, rect, flags) != D3D_OK)
return false;
#endif
void d3d9_unlock_rectangle(void *tex);
return true;
}
void d3d9_set_texture(void *dev, unsigned sampler,
void *tex_data);
static INLINE void d3d9_unlock_rectangle(LPDIRECT3DTEXTURE9 tex)
{
if (tex)
IDirect3DTexture9_UnlockRect(tex, 0);
}
bool d3d9_create_vertex_shader(void *dev,
const DWORD *a, void **b);
static INLINE void d3d9_lock_rectangle_clear(void *tex,
unsigned level, void *_lr, RECT *rect,
unsigned rectangle_height, unsigned flags)
{
D3DLOCKED_RECT *lr = (D3DLOCKED_RECT*)_lr;
#if defined(_XBOX)
level = 0;
#endif
memset(lr->pBits, level, rectangle_height * lr->Pitch);
d3d9_unlock_rectangle((LPDIRECT3DTEXTURE9)tex);
}
bool d3d9_create_pixel_shader(void *dev,
const DWORD *a, void **b);
static INLINE void d3d9_set_texture(
LPDIRECT3DDEVICE9 dev,
unsigned sampler,
LPDIRECT3DTEXTURE9 tex)
{
if (dev && tex)
IDirect3DDevice9_SetTexture(dev, sampler,
(IDirect3DBaseTexture9*)tex);
}
void d3d9_free_pixel_shader(void *dev, void *data);
static INLINE bool d3d9_create_vertex_shader(
LPDIRECT3DDEVICE9 dev, const DWORD *a, void **b)
{
if (dev && IDirect3DDevice9_CreateVertexShader(dev, a,
(LPDIRECT3DVERTEXSHADER9*)b) == D3D_OK)
return true;
return false;
}
void d3d9_free_vertex_shader(void *dev, void *data);
static INLINE bool d3d9_create_pixel_shader(
LPDIRECT3DDEVICE9 dev, const DWORD *a, void **b)
{
if (dev &&
IDirect3DDevice9_CreatePixelShader(dev, a,
(LPDIRECT3DPIXELSHADER9*)b) == D3D_OK)
return true;
return false;
}
bool d3d9_set_pixel_shader(void *dev, void *data);
static INLINE void d3d9_free_vertex_shader(
LPDIRECT3DDEVICE9 dev, IDirect3DVertexShader9 *vs)
{
if (dev && vs)
IDirect3DVertexShader9_Release(vs);
}
bool d3d9_set_vertex_shader(void *dev, unsigned index,
void *data);
static INLINE void d3d9_free_pixel_shader(LPDIRECT3DDEVICE9 dev,
IDirect3DPixelShader9 *ps)
{
if (dev && ps)
IDirect3DPixelShader9_Release(ps);
}
bool d3d9_set_vertex_shader_constantf(void *dev,
UINT start_register,const float* constant_data, unsigned vector4f_count);
static INLINE bool d3d9_set_pixel_shader(
LPDIRECT3DDEVICE9 dev,
LPDIRECT3DPIXELSHADER9 d3dps)
{
if (!dev || !d3dps)
return false;
void d3d9_texture_blit(unsigned pixel_size,
#ifdef _XBOX
/* Returns void on Xbox */
IDirect3DDevice9_SetPixelShader(dev, d3dps);
#else
if (IDirect3DDevice9_SetPixelShader(dev, d3dps) != D3D_OK)
return false;
#endif
return true;
}
static INLINE bool d3d9_set_vertex_shader(
LPDIRECT3DDEVICE9 dev, unsigned index,
LPDIRECT3DVERTEXSHADER9 shader)
{
#ifdef _XBOX
IDirect3DDevice9_SetVertexShader(dev, shader);
#else
if (IDirect3DDevice9_SetVertexShader(dev, shader) != D3D_OK)
return false;
#endif
return true;
}
static INLINE bool d3d9_set_vertex_shader_constantf(
LPDIRECT3DDEVICE9 dev,
UINT start_register,
const float* constant_data,
unsigned vector4f_count)
{
#ifdef _XBOX
IDirect3DDevice9_SetVertexShaderConstantF(dev,
start_register, constant_data, vector4f_count);
#else
if (IDirect3DDevice9_SetVertexShaderConstantF(dev,
start_register, constant_data, vector4f_count) != D3D_OK)
return false;
#endif
return true;
}
static INLINE void d3d9_texture_blit(
unsigned pixel_size,
void *tex,
void *lr, const void *frame,
unsigned width, unsigned height, unsigned pitch);
D3DLOCKED_RECT *lr, const void *frame,
unsigned width, unsigned height, unsigned pitch)
{
unsigned y;
bool d3d9_vertex_declaration_new(void *dev,
const void *vertex_data, void **decl_data);
for (y = 0; y < height; y++)
{
const uint8_t *in = (const uint8_t*)frame + y * pitch;
uint8_t *out = (uint8_t*)lr->pBits + y * lr->Pitch;
memcpy(out, in, width * pixel_size);
}
}
void d3d9_vertex_declaration_free(void *data);
static INLINE bool d3d9_vertex_declaration_new(
LPDIRECT3DDEVICE9 dev,
const void *vertex_data, void **decl_data)
{
const D3DVERTEXELEMENT9 *vertex_elements = (const D3DVERTEXELEMENT9*)vertex_data;
LPDIRECT3DVERTEXDECLARATION9 **vertex_decl = (LPDIRECT3DVERTEXDECLARATION9**)decl_data;
void d3d9_set_viewports(void *dev, void *vp);
if (SUCCEEDED(IDirect3DDevice9_CreateVertexDeclaration(dev,
vertex_elements, (IDirect3DVertexDeclaration9**)vertex_decl)))
return true;
void d3d9_enable_blend_func(void *data);
return false;
}
void d3d9_disable_blend_func(void *data);
static INLINE void d3d9_vertex_declaration_free(
LPDIRECT3DVERTEXDECLARATION9 decl)
{
if (decl)
IDirect3DVertexDeclaration9_Release(decl);
}
void d3d9_set_vertex_declaration(void *data, void *vertex_data);
static INLINE void d3d9_set_viewports(LPDIRECT3DDEVICE9 dev,
void *vp)
{
if (dev)
IDirect3DDevice9_SetViewport(dev, (D3DVIEWPORT9*)vp);
}
void d3d9_enable_alpha_blend_texture_func(void *data);
static INLINE void d3d9_set_render_state(
LPDIRECT3DDEVICE9 dev, D3DRENDERSTATETYPE state, DWORD value)
{
IDirect3DDevice9_SetRenderState(dev, state, value);
}
static INLINE void d3d9_enable_blend_func(LPDIRECT3DDEVICE9 dev)
{
if (!dev)
return;
d3d9_set_render_state(dev, D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
d3d9_set_render_state(dev, D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
d3d9_set_render_state(dev, D3DRS_ALPHABLENDENABLE, true);
}
static INLINE void d3d9_disable_blend_func(LPDIRECT3DDEVICE9 dev)
{
if (dev)
d3d9_set_render_state(dev, D3DRS_ALPHABLENDENABLE, false);
}
static INLINE void
d3d9_set_vertex_declaration(LPDIRECT3DDEVICE9 dev,
LPDIRECT3DVERTEXDECLARATION9 vertex_data)
{
if (dev)
IDirect3DDevice9_SetVertexDeclaration(dev, vertex_data);
}
static INLINE void d3d9_set_texture_stage_state(
LPDIRECT3DDEVICE9 dev,
unsigned sampler,
D3DTEXTURESTAGESTATETYPE type,
unsigned value)
{
#ifndef _XBOX
/* XBox 360 has no fixed-function pipeline. */
if (IDirect3DDevice9_SetTextureStageState(dev, sampler,
type, value) != D3D_OK)
RARCH_ERR("SetTextureStageState call failed, sampler"
": %d, value: %d, type: %d\n", sampler, value, type);
#endif
}
static INLINE void d3d9_enable_alpha_blend_texture_func(LPDIRECT3DDEVICE9 dev)
{
if (!dev)
return;
/* Also blend the texture with the set alpha value. */
d3d9_set_texture_stage_state(dev, 0, D3DTSS_ALPHAOP, D3DTOP_MODULATE);
d3d9_set_texture_stage_state(dev, 0, D3DTSS_ALPHAARG1, D3DTA_DIFFUSE);
d3d9_set_texture_stage_state(dev, 0, D3DTSS_ALPHAARG2, D3DTA_TEXTURE);
}
void d3d9_frame_postprocess(void *data);
void d3d9_surface_free(void *data);
static INLINE void d3d9_surface_free(LPDIRECT3DSURFACE9 surf)
{
if (surf)
IDirect3DSurface9_Release(surf);
}
bool d3d9_device_get_render_target_data(void *dev,
void *_src, void *_dst);
static INLINE bool d3d9_device_get_render_target_data(
void *_dev,
void *_src, void *_dst)
{
#ifndef _XBOX
LPDIRECT3DSURFACE9 src = (LPDIRECT3DSURFACE9)_src;
LPDIRECT3DSURFACE9 dst = (LPDIRECT3DSURFACE9)_dst;
LPDIRECT3DDEVICE9 dev = (LPDIRECT3DDEVICE9)_dev;
if (dev &&
SUCCEEDED(IDirect3DDevice9_GetRenderTargetData(
dev, src, dst)))
return true;
#endif
bool d3d9_device_get_render_target(void *dev,
unsigned idx, void **data);
return false;
}
void d3d9_device_set_render_target(void *dev, unsigned idx,
void *data);
static INLINE bool d3d9_device_get_render_target(
LPDIRECT3DDEVICE9 dev,
unsigned idx, void **data)
{
if (dev &&
SUCCEEDED(IDirect3DDevice9_GetRenderTarget(dev,
idx, (LPDIRECT3DSURFACE9*)data)))
return true;
return false;
}
bool d3d9_get_render_state(void *data,
INT32 state, DWORD *value);
static INLINE void d3d9_device_set_render_target(
void *_dev, unsigned idx,
void *data)
{
LPDIRECT3DSURFACE9 surf = (LPDIRECT3DSURFACE9)data;
LPDIRECT3DDEVICE9 dev = (LPDIRECT3DDEVICE9)_dev;
if (dev)
IDirect3DDevice9_SetRenderTarget(dev, idx, surf);
}
void d3d9_set_render_state(void *data,
INT32 state, DWORD value);
static INLINE bool d3d9_get_render_state(
void *data, INT32 state, DWORD *value)
{
LPDIRECT3DDEVICE9 dev = (LPDIRECT3DDEVICE9)data;
if (!dev)
return false;
void d3d9_device_set_render_target(void *dev, unsigned idx,
void *data);
#ifdef _XBOX
IDirect3DDevice9_GetRenderState(dev,
(D3DRENDERSTATETYPE)state, value);
#else
if (IDirect3DDevice9_GetRenderState(dev,
(D3DRENDERSTATETYPE)state, value) != D3D_OK)
return false;
#endif
return true;
}
bool d3d9_device_create_offscreen_plain_surface(
void *dev,
static INLINE bool d3d9_device_create_offscreen_plain_surface(
void *_dev,
unsigned width,
unsigned height,
unsigned format,
unsigned pool,
void **surf_data,
void *data);
void *data)
{
#ifndef _XBOX
LPDIRECT3DDEVICE9 dev = (LPDIRECT3DDEVICE9)_dev;
if (SUCCEEDED(IDirect3DDevice9_CreateOffscreenPlainSurface(dev,
width, height,
(D3DFORMAT)format, (D3DPOOL)pool,
(LPDIRECT3DSURFACE9*)surf_data,
(HANDLE*)data)))
return true;
#endif
return false;
}
bool d3d9_surface_lock_rect(void *data, void *data2);
static INLINE bool d3d9_surface_lock_rect(LPDIRECT3DSURFACE9 surf,
D3DLOCKED_RECT *data2)
{
if (!surf)
return false;
#if defined(_XBOX)
IDirect3DSurface9_LockRect(surf,
data2, NULL, D3DLOCK_READONLY);
#else
if (FAILED(IDirect3DSurface9_LockRect(surf,
data2, NULL, D3DLOCK_READONLY)))
return false;
#endif
void d3d9_surface_unlock_rect(void *data);
return true;
}
bool d3d9_get_adapter_display_mode(void *d3d,
static INLINE void d3d9_surface_unlock_rect(LPDIRECT3DSURFACE9 surf)
{
if (surf)
IDirect3DSurface9_UnlockRect(surf);
}
static INLINE bool d3d9_get_adapter_display_mode(
LPDIRECT3D9 d3d,
unsigned idx,
void *display_mode);
void *display_mode)
{
if (!d3d)
return false;
#ifndef _XBOX
if (FAILED(
IDirect3D9_GetAdapterDisplayMode(
d3d, idx, (D3DDISPLAYMODE*)display_mode)))
return false;
#endif
return true;
}
bool d3d9_create_device(void *dev,
void *d3dpp,
@ -180,11 +619,29 @@ bool d3d9_create_device(void *dev,
bool d3d9_reset(void *dev, void *d3dpp);
bool d3d9_device_get_backbuffer(void *dev,
static INLINE bool d3d9_device_get_backbuffer(
LPDIRECT3DDEVICE9 dev,
unsigned idx, unsigned swapchain_idx,
unsigned backbuffer_type, void **data);
unsigned backbuffer_type, void **data)
{
if (dev &&
SUCCEEDED(IDirect3DDevice9_GetBackBuffer(dev,
swapchain_idx, idx,
(D3DBACKBUFFER_TYPE)backbuffer_type,
(LPDIRECT3DSURFACE9*)data)))
return true;
return false;
}
void d3d9_device_free(void *dev, void *pd3d);
static INLINE void d3d9_device_free(void *_dev, void *_pd3d)
{
LPDIRECT3D9 pd3d = (LPDIRECT3D9)_pd3d;
LPDIRECT3DDEVICE9 dev = (LPDIRECT3DDEVICE9)_dev;
if (dev)
IDirect3DDevice9_Release(dev);
if (pd3d)
IDirect3D9_Release(pd3d);
}
void *d3d9_create(void);
@ -192,11 +649,23 @@ bool d3d9_initialize_symbols(enum gfx_ctx_api api);
void d3d9_deinitialize_symbols(void);
bool d3d9_check_device_type(void *d3d,
static INLINE bool d3d9_check_device_type(
LPDIRECT3D9 d3d,
unsigned idx,
INT32 disp_format,
INT32 backbuffer_format,
bool windowed_mode);
bool windowed_mode)
{
if (d3d &&
SUCCEEDED(IDirect3D9_CheckDeviceType(d3d,
0,
D3DDEVTYPE_HAL,
(D3DFORMAT)disp_format,
(D3DFORMAT)backbuffer_format,
windowed_mode)))
return true;
return false;
}
bool d3d9x_create_font_indirect(void *dev,
void *desc, void **font_data);
@ -206,12 +675,10 @@ void d3d9x_font_draw_text(void *data, void *sprite_data, void *string_data,
void d3d9x_font_get_text_metrics(void *data, void *metrics);
void d3dxbuffer_release(void *data);
void d3d9x_buffer_release(void *data);
void d3d9x_font_release(void *data);
INT32 d3d9_translate_filter(unsigned type);
bool d3d9x_compile_shader(
const char *src,
unsigned src_data_len,
@ -235,14 +702,49 @@ bool d3d9x_compile_shader_from_file(
void *pperrormsgs,
void *ppconstanttable);
void d3d9x_constant_table_set_float_array(LPDIRECT3DDEVICE9 dev,
void *p, void *_handle, const void *_pf, unsigned count);
void d3d9x_constant_table_set_defaults(LPDIRECT3DDEVICE9 dev,
void *p);
void d3d9x_constant_table_set_matrix(LPDIRECT3DDEVICE9 dev,
void *p, void *data, const void *matrix);
const void *d3d9x_get_buffer_ptr(void *data);
const bool d3d9x_constant_table_set_float(void *p,
void *a, const void *b, float val);
void *a, void *b, float val);
INT32 d3d9_get_rgb565_format(void);
INT32 d3d9_get_argb8888_format(void);
INT32 d3d9_get_xrgb8888_format(void);
void *d3d9x_constant_table_get_constant_by_name(void *_tbl,
void *_handle, void *_name);
static INLINE INT32 d3d9_get_rgb565_format(void)
{
#ifdef _XBOX
return D3DFMT_LIN_R5G6B5;
#else
return D3DFMT_R5G6B5;
#endif
}
static INLINE INT32 d3d9_get_argb8888_format(void)
{
#ifdef _XBOX
return D3DFMT_LIN_A8R8G8B8;
#else
return D3DFMT_A8R8G8B8;
#endif
}
static INLINE INT32 d3d9_get_xrgb8888_format(void)
{
#ifdef _XBOX
return D3DFMT_LIN_X8R8G8B8;
#else
return D3DFMT_X8R8G8B8;
#endif
}
RETRO_END_DECLS

View File

@ -86,7 +86,8 @@ void *d3d_matrix_identity(void *_pout)
return pout;
}
void *d3d_matrix_ortho_off_center_lh(void *_pout, float l, float r, float b, float t, float zn, float zf)
void *d3d_matrix_ortho_off_center_lh(void *_pout,
float l, float r, float b, float t, float zn, float zf)
{
D3DMATRIX *pout = (D3DMATRIX*)_pout;
@ -101,7 +102,8 @@ void *d3d_matrix_ortho_off_center_lh(void *_pout, float l, float r, float b, flo
return pout;
}
void *d3d_matrix_multiply(void *_pout, const void *_pm1, const void *_pm2)
void *d3d_matrix_multiply(void *_pout,
const void *_pm1, const void *_pm2)
{
unsigned i,j;
D3DMATRIX *pout = (D3DMATRIX*)_pout;
@ -127,3 +129,23 @@ void *d3d_matrix_rotation_z(void *_pout, float angle)
pout->m[1][0] = -sin(angle);
return pout;
}
int32_t d3d_translate_filter(unsigned type)
{
switch (type)
{
case RARCH_FILTER_UNSPEC:
{
settings_t *settings = config_get_ptr();
if (!settings->bools.video_smooth)
break;
}
/* fall-through */
case RARCH_FILTER_LINEAR:
return (int32_t)D3DTEXF_LINEAR;
case RARCH_FILTER_NEAREST:
break;
}
return (int32_t)D3DTEXF_POINT;
}

View File

@ -33,248 +33,26 @@ typedef struct d3d_texture
#define BYTE_CLAMP(i) (int) ((((i) > 255) ? 255 : (((i) < 0) ? 0 : (i))))
#endif
#ifndef D3DCOLOR_ARGB
#define D3DCOLOR_ARGB(_a, _r, _g, _b) ( (DWORD)( ( ( (_a)&0xff)<<24)|( ( (_r)&0xff)<<16)|( ( (_g)&0xff)<<8)|( (_b)&0xff) ) )
#endif
#define D3DTADDRESS_COMM_CLAMP 3
#define D3DTEXF_COMM_LINEAR 2
#define D3DPT_COMM_TRIANGLESTRIP 5
#define D3D_COMM_CLEAR_TARGET 0x00000001l /* Clear target surface */
bool d3d_swap(void *data, void *dev);
void *d3d_vertex_buffer_new(void *dev,
unsigned length, unsigned usage, unsigned fvf,
INT32 pool, void *handle);
void *d3d_vertex_buffer_lock(void *data);
void d3d_vertex_buffer_unlock(void *data);
void d3d_vertex_buffer_free(void *vertex_data, void *vertex_declaration);
bool d3d_texture_get_level_desc(void *tex,
unsigned idx, void *_ppsurface_level);
bool d3d_texture_get_surface_level(void *tex,
unsigned idx, void **_ppsurface_level);
void *d3d_texture_new(void *dev,
const char *path, unsigned width, unsigned height,
unsigned miplevels, unsigned usage, INT32 format,
INT32 pool, unsigned filter, unsigned mipfilter,
INT32 color_key, void *src_info,
PALETTEENTRY *palette, bool want_mipmap);
void d3d_set_stream_source(void *dev, unsigned stream_no,
void *stream_vertbuf, unsigned offset_bytes,
unsigned stride);
void d3d_texture_free(void *tex);
void d3d_set_transform(void *dev,
INT32 state, const void *_matrix);
void d3d_set_sampler_address_u(void *dev,
unsigned sampler, unsigned value);
void d3d_set_sampler_address_v(void *dev,
unsigned sampler, unsigned value);
void d3d_set_sampler_minfilter(void *dev,
unsigned sampler, unsigned value);
void d3d_set_sampler_magfilter(void *dev,
unsigned sampler, unsigned value);
void d3d_set_sampler_mipfilter(void *dev,
unsigned sampler, unsigned value);
bool d3d_begin_scene(void *dev);
void d3d_end_scene(void *dev);
void d3d_draw_primitive(void *dev,
INT32 type, unsigned start, unsigned count);
void d3d_clear(void *dev,
unsigned count, const void *rects, unsigned flags,
INT32 color, float z, unsigned stencil);
bool d3d_lock_rectangle(void *tex,
unsigned level, void *lock_rect, RECT *rect,
unsigned rectangle_height, unsigned flags);
void d3d_lock_rectangle_clear(void *tex,
unsigned level, void *lock_rect, RECT *rect,
unsigned rectangle_height, unsigned flags);
void d3d_unlock_rectangle(void *tex);
void d3d_set_texture(void *dev, unsigned sampler,
void *tex_data);
bool d3d_create_vertex_shader(void *dev,
const DWORD *a, void **b);
bool d3d_create_pixel_shader(void *dev,
const DWORD *a, void **b);
void d3d_free_pixel_shader(void *dev, void *data);
void d3d_free_vertex_shader(void *dev, void *data);
bool d3d_set_pixel_shader(void *dev, void *data);
bool d3d_set_vertex_shader(void *dev, unsigned index,
void *data);
bool d3d_set_vertex_shader_constantf(void *dev,
UINT start_register,const float* constant_data, unsigned vector4f_count);
void d3d_texture_blit(unsigned pixel_size,
void *tex,
void *lr, const void *frame,
unsigned width, unsigned height, unsigned pitch);
bool d3d_vertex_declaration_new(void *dev,
const void *vertex_data, void **decl_data);
void d3d_vertex_declaration_free(void *data);
void d3d_set_viewports(void *dev, void *vp);
void d3d_enable_blend_func(void *data);
void d3d_disable_blend_func(void *data);
void d3d_set_vertex_declaration(void *data, void *vertex_data);
void d3d_enable_alpha_blend_texture_func(void *data);
void d3d_frame_postprocess(void *data);
void d3d_surface_free(void *data);
bool d3d_device_get_render_target_data(void *dev,
void *_src, void *_dst);
bool d3d_device_get_render_target(void *dev,
unsigned idx, void **data);
void d3d_device_set_render_target(void *dev, unsigned idx,
void *data);
bool d3d_get_render_state(void *data,
INT32 state, DWORD *value);
void d3d_set_render_state(void *data,
INT32 state, DWORD value);
void d3d_device_set_render_target(void *dev, unsigned idx,
void *data);
bool d3d_device_create_offscreen_plain_surface(
void *dev,
unsigned width,
unsigned height,
unsigned format,
unsigned pool,
void **surf_data,
void *data);
bool d3d_surface_lock_rect(void *data, void *data2);
void d3d_surface_unlock_rect(void *data);
/* Clear target surface */
#define D3D_COMM_CLEAR_TARGET 0x00000001l
void *d3d_matrix_transpose(void *_pout, const void *_pm);
void *d3d_matrix_multiply(void *_pout,
const void *_pm1, const void *_pm2);
void *d3d_matrix_identity(void *_pout);
void *d3d_matrix_ortho_off_center_lh(void *_pout,
float l, float r, float b, float t, float zn, float zf);
void * d3d_matrix_identity(void *_pout);
void *d3d_matrix_multiply(void *_pout,
const void *_pm1, const void *_pm2);
void *d3d_matrix_rotation_z(void *_pout, float angle);
bool d3d_get_adapter_display_mode(void *d3d,
unsigned idx,
void *display_mode);
bool d3d_create_device(void *dev,
void *d3dpp,
void *d3d,
HWND focus_window,
unsigned cur_mon_id);
bool d3d_reset(void *dev, void *d3dpp);
bool d3d_device_get_backbuffer(void *dev,
unsigned idx, unsigned swapchain_idx,
unsigned backbuffer_type, void **data);
void d3d_device_free(void *dev, void *pd3d);
void *d3d_create(void);
bool d3d_initialize_symbols(enum gfx_ctx_api api);
void d3d_deinitialize_symbols(void);
bool d3d_check_device_type(void *d3d,
unsigned idx,
INT32 disp_format,
INT32 backbuffer_format,
bool windowed_mode);
bool d3dx_create_font_indirect(void *dev,
void *desc, void **font_data);
void d3dx_font_draw_text(void *data, void *sprite_data, void *string_data,
unsigned count, void *rect_data, unsigned format, unsigned color);
void d3dx_font_get_text_metrics(void *data, void *metrics);
void d3dxbuffer_release(void *data);
void d3dx_font_release(void *data);
INT32 d3d_translate_filter(unsigned type);
bool d3dx_compile_shader(
const char *src,
unsigned src_data_len,
const void *pdefines,
void *pinclude,
const char *pfunctionname,
const char *pprofile,
unsigned flags,
void *ppshader,
void *pperrormsgs,
void *ppconstanttable);
bool d3dx_compile_shader_from_file(
const char *src,
const void *pdefines,
void *pinclude,
const char *pfunctionname,
const char *pprofile,
unsigned flags,
void *ppshader,
void *pperrormsgs,
void *ppconstanttable);
const void *d3dx_get_buffer_ptr(void *data);
const bool d3dx_constant_table_set_float(void *p,
void *a, const void *b, float val);
INT32 d3d_get_rgb565_format(void);
INT32 d3d_get_argb8888_format(void);
INT32 d3d_get_xrgb8888_format(void);
int32_t d3d_translate_filter(unsigned type);
RETRO_END_DECLS

View File

@ -168,6 +168,18 @@ void drm_setup(int fd)
RARCH_WARN("[DRM]: Cannot find original CRTC.\n");
}
float drm_get_refresh_rate(void *data)
{
float refresh_rate = 0.0f;
if (g_drm_mode)
{
refresh_rate = g_drm_mode->clock * 1000.0f / g_drm_mode->htotal / g_drm_mode->vtotal;
}
return refresh_rate;
}
void drm_free(void)
{
if (g_drm_encoder)

View File

@ -55,6 +55,8 @@ void drm_free(void);
bool drm_get_connector(int fd, video_frame_info_t *video_info);
float drm_get_refresh_rate(void *data);
static INLINE bool drm_wait_flip(int timeout)
{
g_drm_fds.revents = 0;

View File

@ -767,7 +767,7 @@ static INLINE HRESULT DXGICreateFactory(DXGIFactory* factory)
#define DXGI_COLOR_RGBA(r, g, b, a) (((UINT32)(a) << 24) | ((UINT32)(b) << 16) | ((UINT32)(g) << 8) | ((UINT32)(r) << 0))
typedef enum {
DXGI_FORMAT_EX_A4R4G4B4_UNORM = 1000,
DXGI_FORMAT_EX_A4R4G4B4_UNORM = 1000
} DXGI_FORMAT_EX;
typedef struct

View File

@ -2,11 +2,13 @@
#include <wiiu/gx2.h>
#include "gfx/drivers/gx2_shaders/frame.h"
#include "gfx/drivers/gx2_shaders/tex.h"
#include "gfx/drivers/gx2_shaders/sprite.h"
#include "gfx/drivers/gx2_shaders/menu_shaders.h"
#include "gfx/video_shader_parse.h"
#include "../video_defines.h"
#include "../video_shader_parse.h"
#include "../drivers/gx2_shaders/frame.h"
#include "../drivers/gx2_shaders/tex.h"
#include "../drivers/gx2_shaders/sprite.h"
#include "../drivers/gx2_shaders/menu_shaders.h"
#undef _X
#undef _B
@ -23,7 +25,6 @@
#define _1 0x05
#define GX2_COMP_SEL(c0, c1, c2, c3) (((c0) << 24) | ((c1) << 16) | ((c2) << 8) | (c3))
#define COLOR_ABGR(r, g, b, a) (((u32)(a) << 24) | ((u32)(b) << 16) | ((u32)(g) << 8) | ((u32)(r) << 0))
#define COLOR_ARGB(r, g, b, a) (((u32)(a) << 24) | ((u32)(r) << 16) | ((u32)(g) << 8) | ((u32)(b) << 0))
#define COLOR_RGBA(r, g, b, a) (((u32)(r) << 24) | ((u32)(g) << 16) | ((u32)(b) << 8) | ((u32)(a) << 0))

View File

@ -962,6 +962,34 @@ void vulkan_image_layout_transition(
1, &barrier);
}
void vulkan_image_layout_transition_levels(
VkCommandBuffer cmd, VkImage image, uint32_t levels,
VkImageLayout old_layout, VkImageLayout new_layout,
VkAccessFlags src_access, VkAccessFlags dst_access,
VkPipelineStageFlags src_stages, VkPipelineStageFlags dst_stages)
{
VkImageMemoryBarrier barrier = { VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER };
barrier.srcAccessMask = src_access;
barrier.dstAccessMask = dst_access;
barrier.oldLayout = old_layout;
barrier.newLayout = new_layout;
barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
barrier.image = image;
barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
barrier.subresourceRange.levelCount = levels;
barrier.subresourceRange.layerCount = VK_REMAINING_ARRAY_LAYERS;
vkCmdPipelineBarrier(cmd,
src_stages,
dst_stages,
false,
0, NULL,
0, NULL,
1, &barrier);
}
struct vk_buffer vulkan_create_buffer(
const struct vulkan_context *context,
size_t size, VkBufferUsageFlags usage)

View File

@ -446,6 +446,12 @@ void vulkan_image_layout_transition(vk_t *vk,
VkAccessFlags srcAccess, VkAccessFlags dstAccess,
VkPipelineStageFlags srcStages, VkPipelineStageFlags dstStages);
void vulkan_image_layout_transition_levels(
VkCommandBuffer cmd, VkImage image, uint32_t levels,
VkImageLayout old_layout, VkImageLayout new_layout,
VkAccessFlags src_access, VkAccessFlags dst_access,
VkPipelineStageFlags src_stages, VkPipelineStageFlags dst_stages);
static INLINE unsigned vulkan_format_to_bpp(VkFormat format)
{
switch (format)

View File

@ -13,6 +13,22 @@
* If not, see <http://www.gnu.org/licenses/>.
*/
#if !defined(_XBOX)
#ifndef _WIN32_WINNT
#define _WIN32_WINNT 0x0601 /* Windows 7 */
#endif
#if !defined(_MSC_VER) || _WIN32_WINNT >= 0x0601
#undef WINVER
#define WINVER 0x0601
#endif
#define IDI_ICON 1
#include <windows.h>
#endif /* !defined(_XBOX) */
#include <retro_miscellaneous.h>
#include <string/stdstring.h>
@ -33,13 +49,6 @@
#if !defined(_XBOX)
#define IDI_ICON 1
#ifndef _WIN32_WINNT
#define _WIN32_WINNT 0x0500 /* _WIN32_WINNT_WIN2K */
#endif
#include <windows.h>
#include <commdlg.h>
#include <dbt.h>
#include "../../retroarch.h"
@ -83,18 +92,192 @@ extern void *dinput_wgl;
extern void *dinput;
#endif
unsigned g_resize_width = 0;
unsigned g_resize_height = 0;
typedef enum {
DISPLAYCONFIG_SCANLINE_ORDERING_UNSPECIFIED_CUSTOM = 0,
DISPLAYCONFIG_SCANLINE_ORDERING_PROGRESSIVE_CUSTOM = 1,
DISPLAYCONFIG_SCANLINE_ORDERING_INTERLACED_CUSTOM = 2,
DISPLAYCONFIG_SCANLINE_ORDERING_INTERLACED_UPPERFIELDFIRST_CUSTOM = DISPLAYCONFIG_SCANLINE_ORDERING_INTERLACED_CUSTOM,
DISPLAYCONFIG_SCANLINE_ORDERING_INTERLACED_LOWERFIELDFIRST_CUSTOM = 3,
DISPLAYCONFIG_SCANLINE_ORDERING_FORCE_UINT32_CUSTOM = 0xFFFFFFFF
} DISPLAYCONFIG_SCANLINE_ORDERING_CUSTOM;
typedef enum {
DISPLAYCONFIG_MODE_INFO_TYPE_SOURCE_CUSTOM = 1,
DISPLAYCONFIG_MODE_INFO_TYPE_TARGET_CUSTOM = 2,
DISPLAYCONFIG_MODE_INFO_TYPE_DESKTOP_IMAGE_CUSTOM = 3,
DISPLAYCONFIG_MODE_INFO_TYPE_FORCE_UINT32_CUSTOM = 0xFFFFFFFF
} DISPLAYCONFIG_MODE_INFO_TYPE_CUSTOM;
typedef enum {
DISPLAYCONFIG_PIXELFORMAT_8BPP_CUSTOM = 1,
DISPLAYCONFIG_PIXELFORMAT_16BPP_CUSTOM = 2,
DISPLAYCONFIG_PIXELFORMAT_24BPP_CUSTOM = 3,
DISPLAYCONFIG_PIXELFORMAT_32BPP_CUSTOM = 4,
DISPLAYCONFIG_PIXELFORMAT_NONGDI_CUSTOM = 5,
DISPLAYCONFIG_PIXELFORMAT_FORCE_UINT32_CUSTOM = 0xffffffff
} DISPLAYCONFIG_PIXELFORMAT_CUSTOM;
typedef enum {
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_OTHER_CUSTOM = -1,
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_HD15_CUSTOM = 0,
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_SVIDEO_CUSTOM = 1,
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_COMPOSITE_VIDEO_CUSTOM = 2,
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_COMPONENT_VIDEO_CUSTOM = 3,
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_DVI_CUSTOM = 4,
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_HDMI_CUSTOM = 5,
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_LVDS_CUSTOM = 6,
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_D_JPN_CUSTOM = 8,
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_SDI_CUSTOM = 9,
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_DISPLAYPORT_EXTERNAL_CUSTOM = 10,
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_DISPLAYPORT_EMBEDDED_CUSTOM = 11,
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_UDI_EXTERNAL_CUSTOM = 12,
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_UDI_EMBEDDED_CUSTOM = 13,
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_SDTVDONGLE_CUSTOM = 14,
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_MIRACAST_CUSTOM = 15,
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_INTERNAL_CUSTOM = 0x80000000,
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_FORCE_UINT32_CUSTOM = 0xFFFFFFFF
} DISPLAYCONFIG_VIDEO_OUTPUT_TECHNOLOGY_CUSTOM;
typedef enum {
DISPLAYCONFIG_ROTATION_IDENTITY_CUSTOM = 1,
DISPLAYCONFIG_ROTATION_ROTATE90_CUSTOM = 2,
DISPLAYCONFIG_ROTATION_ROTATE180_CUSTOM = 3,
DISPLAYCONFIG_ROTATION_ROTATE270_CUSTOM = 4,
DISPLAYCONFIG_ROTATION_FORCE_UINT32_CUSTOM = 0xFFFFFFFF
} DISPLAYCONFIG_ROTATION_CUSTOM;
typedef enum {
DISPLAYCONFIG_SCALING_IDENTITY_CUSTOM = 1,
DISPLAYCONFIG_SCALING_CENTERED_CUSTOM = 2,
DISPLAYCONFIG_SCALING_STRETCHED_CUSTOM = 3,
DISPLAYCONFIG_SCALING_ASPECTRATIOCENTEREDMAX_CUSTOM = 4,
DISPLAYCONFIG_SCALING_CUSTOM_CUSTOM = 5,
DISPLAYCONFIG_SCALING_PREFERRED_CUSTOM = 128,
DISPLAYCONFIG_SCALING_FORCE_UINT32_CUSTOM = 0xFFFFFFFF
} DISPLAYCONFIG_SCALING_CUST;
typedef enum {
DISPLAYCONFIG_TOPOLOGY_INTERNAL_CUSTOM = 0x00000001,
DISPLAYCONFIG_TOPOLOGY_CLONE_CUSTOM = 0x00000002,
DISPLAYCONFIG_TOPOLOGY_EXTEND_CUSTOM = 0x00000004,
DISPLAYCONFIG_TOPOLOGY_EXTERNAL_CUSTOM = 0x00000008,
DISPLAYCONFIG_TOPOLOGY_FORCE_UINT32_CUSTOM = 0xFFFFFFFF
} DISPLAYCONFIG_TOPOLOGY_ID_CUSTOM;
typedef struct DISPLAYCONFIG_RATIONAL_CUSTOM {
UINT32 Numerator;
UINT32 Denominator;
} DISPLAYCONFIG_RATIONAL_CUSTOM;
typedef struct DISPLAYCONFIG_2DREGION_CUSTOM {
UINT32 cx;
UINT32 cy;
} DISPLAYCONFIG_2DREGION_CUSTOM;
typedef struct DISPLAYCONFIG_VIDEO_SIGNAL_INFO_CUSTOM {
UINT64 pixelRate;
DISPLAYCONFIG_RATIONAL_CUSTOM hSyncFreq;
DISPLAYCONFIG_RATIONAL_CUSTOM vSyncFreq;
DISPLAYCONFIG_2DREGION_CUSTOM activeSize;
DISPLAYCONFIG_2DREGION_CUSTOM totalSize;
union {
struct {
UINT32 videoStandard :16;
UINT32 vSyncFreqDivider :6;
UINT32 reserved :10;
} AdditionalSignalInfo;
UINT32 videoStandard;
};
DISPLAYCONFIG_SCANLINE_ORDERING_CUSTOM scanLineOrdering;
} DISPLAYCONFIG_VIDEO_SIGNAL_INFO_CUSTOM;
typedef struct DISPLAYCONFIG_TARGET_MODE_CUSTOM {
DISPLAYCONFIG_VIDEO_SIGNAL_INFO_CUSTOM targetVideoSignalInfo;
} DISPLAYCONFIG_TARGET_MODE_CUSTOM;
typedef struct DISPLAYCONFIG_PATH_SOURCE_INFO_CUSTOM {
LUID adapterId;
UINT32 id;
union {
UINT32 modeInfoIdx;
struct {
UINT32 cloneGroupId :16;
UINT32 sourceModeInfoIdx :16;
} DUMMYSTRUCTNAME;
} DUMMYUNIONNAME;
UINT32 statusFlags;
} DISPLAYCONFIG_PATH_SOURCE_INFO_CUSTOM;
typedef struct DISPLAYCONFIG_DESKTOP_IMAGE_INFO_CUSTOM {
POINTL PathSourceSize;
RECTL DesktopImageRegion;
RECTL DesktopImageClip;
} DISPLAYCONFIG_DESKTOP_IMAGE_INFO_CUSTOM;
typedef struct DISPLAYCONFIG_SOURCE_MODE_CUSTOM {
UINT32 width;
UINT32 height;
DISPLAYCONFIG_PIXELFORMAT_CUSTOM pixelFormat;
POINTL position;
} DISPLAYCONFIG_SOURCE_MODE_CUSTOM;
typedef struct DISPLAYCONFIG_MODE_INFO_CUSTOM {
DISPLAYCONFIG_MODE_INFO_TYPE_CUSTOM infoType;
UINT32 id;
LUID adapterId;
union {
DISPLAYCONFIG_TARGET_MODE_CUSTOM targetMode;
DISPLAYCONFIG_SOURCE_MODE_CUSTOM sourceMode;
DISPLAYCONFIG_DESKTOP_IMAGE_INFO_CUSTOM desktopImageInfo;
};
} DISPLAYCONFIG_MODE_INFO_CUSTOM;
typedef struct DISPLAYCONFIG_PATH_TARGET_INFO_CUSTOM {
LUID adapterId;
UINT32 id;
union {
UINT32 modeInfoIdx;
struct {
UINT32 desktopModeInfoIdx :16;
UINT32 targetModeInfoIdx :16;
};
};
DISPLAYCONFIG_VIDEO_OUTPUT_TECHNOLOGY_CUSTOM outputTechnology;
DISPLAYCONFIG_ROTATION_CUSTOM rotation;
DISPLAYCONFIG_SCALING_CUST scaling;
DISPLAYCONFIG_RATIONAL_CUSTOM refreshRate;
DISPLAYCONFIG_SCANLINE_ORDERING_CUSTOM scanLineOrdering;
BOOL targetAvailable;
UINT32 statusFlags;
} DISPLAYCONFIG_PATH_TARGET_INFO_CUSTOM;
typedef struct DISPLAYCONFIG_PATH_INFO_CUSTOM {
DISPLAYCONFIG_PATH_SOURCE_INFO_CUSTOM sourceInfo;
DISPLAYCONFIG_PATH_TARGET_INFO_CUSTOM targetInfo;
UINT32 flags;
} DISPLAYCONFIG_PATH_INFO_CUSTOM;
typedef LONG (WINAPI *QUERYDISPLAYCONFIG)(UINT32, UINT32*, DISPLAYCONFIG_PATH_INFO_CUSTOM*, UINT32*, DISPLAYCONFIG_MODE_INFO_CUSTOM*, DISPLAYCONFIG_TOPOLOGY_ID_CUSTOM*);
typedef LONG (WINAPI *GETDISPLAYCONFIGBUFFERSIZES)(UINT32, UINT32*, UINT32*);
static bool g_resized = false;
bool g_restore_desktop = false;
static bool doubleclick_on_titlebar = false;
static bool g_taskbar_is_created = false;
bool g_inited = false;
static bool g_quit = false;
static int g_pos_x = CW_USEDEFAULT;
static int g_pos_y = CW_USEDEFAULT;
static void *curD3D = NULL;
static bool g_taskbar_is_created = false;
unsigned g_resize_width = 0;
unsigned g_resize_height = 0;
static unsigned g_taskbar_message = 0;
static unsigned win32_monitor_count = 0;
static void *curD3D = NULL;
ui_window_win32_t main_window;
@ -147,7 +330,6 @@ typedef REASON_CONTEXT POWER_REQUEST_CONTEXT, *PPOWER_REQUEST_CONTEXT, *LPPOWER_
static HMONITOR win32_monitor_last;
static HMONITOR win32_monitor_all[MAX_MONITORS];
static unsigned win32_monitor_count = 0;
bool win32_taskbar_is_created(void)
{
@ -256,6 +438,19 @@ void win32_monitor_from_window(void)
#endif
}
int win32_change_display_settings(const char *str, void *devmode_data,
unsigned flags)
{
#if _WIN32_WINDOWS >= 0x0410 || _WIN32_WINNT >= 0x0410
/* Windows 98 and later codepath */
return ChangeDisplaySettingsEx(str, (DEVMODE*)devmode_data,
NULL, flags, NULL);
#else
/* Windows 95 / NT codepath */
return ChangeDisplaySettings((DEVMODE*)devmode_data, flags);
#endif
}
void win32_monitor_get_info(void)
{
MONITORINFOEX current_mon;
@ -265,13 +460,7 @@ void win32_monitor_get_info(void)
GetMonitorInfo(win32_monitor_last, (LPMONITORINFO)&current_mon);
#if _WIN32_WINDOWS >= 0x0410 || _WIN32_WINNT >= 0x0410
/* Windows 98 and later codepath */
ChangeDisplaySettingsEx(current_mon.szDevice, NULL, NULL, 0, NULL);
#else
/* Windows 95 / NT codepath */
ChangeDisplaySettings(NULL, 0);
#endif
win32_change_display_settings(current_mon.szDevice, NULL, 0);
}
void win32_monitor_info(void *data, void *hm_data, unsigned *mon_id)
@ -373,10 +562,10 @@ static int win32_drag_query_file(HWND hwnd, WPARAM wparam)
{
const core_info_t *info = (const core_info_t*)&core_info[i];
if(!string_is_equal(info->systemname, current_core->systemname))
if (!string_is_equal(info->systemname, current_core->systemname))
break;
if(string_is_equal(path_get(RARCH_PATH_CORE), info->path))
if (string_is_equal(path_get(RARCH_PATH_CORE), info->path))
{
/* Our previous core supports the current rom */
content_ctx_info_t content_info = {0};
@ -391,29 +580,22 @@ static int win32_drag_query_file(HWND hwnd, WPARAM wparam)
}
/* Poll for cores for current rom since none exist. */
if(list_size ==1)
if (list_size ==1)
{
/*pick core that only exists and is bound to work. Ish. */
const core_info_t *info = (const core_info_t*)&core_info[0];
if (info)
task_push_load_content_with_new_core_from_companion_ui(
info->path, NULL,
&content_info,
NULL, NULL);
info->path, NULL, &content_info, NULL, NULL);
}
else
{
/* Pick one core that could be compatible, ew */
if(DialogBoxParam(GetModuleHandle(NULL),MAKEINTRESOURCE(IDD_PICKCORE),
if (DialogBoxParam(GetModuleHandle(NULL),MAKEINTRESOURCE(IDD_PICKCORE),
hwnd,PickCoreProc,(LPARAM)NULL)==IDOK)
{
task_push_load_content_with_current_core_from_companion_ui(
NULL,
&content_info,
CORE_TYPE_PLAIN,
NULL, NULL);
}
NULL, &content_info, CORE_TYPE_PLAIN, NULL, NULL);
}
}
@ -422,11 +604,9 @@ static int win32_drag_query_file(HWND hwnd, WPARAM wparam)
#ifndef _XBOX
static LRESULT win32_handle_keyboard_event(HWND hwnd, UINT message,
WPARAM wparam, LPARAM lparam)
WPARAM wparam, LPARAM lparam)
{
unsigned keycode;
uint16_t mod = 0;
bool keydown = true;
uint16_t mod = 0;
if (GetKeyState(VK_SHIFT) & 0x80)
mod |= RETROKMOD_SHIFT;
@ -447,7 +627,7 @@ static LRESULT win32_handle_keyboard_event(HWND hwnd, UINT message,
* WM_CHAR and WM_KEYDOWN properly.
*/
case WM_CHAR:
input_keyboard_event(keydown, RETROK_UNKNOWN, wparam, mod,
input_keyboard_event(true, RETROK_UNKNOWN, wparam, mod,
RETRO_DEVICE_KEYBOARD);
return TRUE;
@ -455,34 +635,35 @@ static LRESULT win32_handle_keyboard_event(HWND hwnd, UINT message,
case WM_SYSKEYUP:
case WM_KEYDOWN:
case WM_SYSKEYDOWN:
/* Key released? */
if (message == WM_KEYUP || message == WM_SYSKEYUP)
keydown = false;
#if _WIN32_WINNT >= 0x0501 /* XP */
if (string_is_equal(config_get_ptr()->arrays.input_driver, "raw"))
keycode = input_keymaps_translate_keysym_to_rk((unsigned)(wparam));
else
#endif
keycode = input_keymaps_translate_keysym_to_rk((lparam >> 16) & 0xff);
input_keyboard_event(keydown, keycode, 0, mod, RETRO_DEVICE_KEYBOARD);
if (message == WM_SYSKEYDOWN)
{
switch (wparam)
{
case VK_F10:
case VK_MENU:
case VK_RSHIFT:
return 0;
default:
break;
}
}
else
return 0;
unsigned keycode = 0;
bool keydown = true;
unsigned keysym = (lparam >> 16) & 0xff;
#if _WIN32_WINNT >= 0x0501 /* XP */
settings_t *settings = config_get_ptr();
if (settings && string_is_equal(settings->arrays.input_driver, "raw"))
keysym = (unsigned)wparam;
#endif
/* Key released? */
if (message == WM_KEYUP || message == WM_SYSKEYUP)
keydown = false;
keycode = input_keymaps_translate_keysym_to_rk(keysym);
input_keyboard_event(keydown, keycode,
0, mod, RETRO_DEVICE_KEYBOARD);
if (message != WM_SYSKEYDOWN)
return 0;
if (
wparam == VK_F10 ||
wparam == VK_MENU ||
wparam == VK_RSHIFT
)
return 0;
}
break;
}
@ -542,7 +723,8 @@ static LRESULT CALLBACK WndProcCommon(bool *quit, HWND hwnd, UINT message,
break;
case WM_SIZE:
/* Do not send resize message if we minimize. */
if (wparam != SIZE_MAXHIDE && wparam != SIZE_MINIMIZED)
if ( wparam != SIZE_MAXHIDE &&
wparam != SIZE_MINIMIZED)
{
g_resize_width = LOWORD(lparam);
g_resize_height = HIWORD(lparam);
@ -806,7 +988,7 @@ bool win32_window_create(void *data, unsigned style,
notification_filter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
notification_filter.dbcc_classguid = GUID_DEVINTERFACE_HID;
notification_handler = RegisterDeviceNotification(
main_window.hwnd, &notification_filter, DEVICE_NOTIFY_WINDOW_HANDLE);
main_window.hwnd, &notification_filter, DEVICE_NOTIFY_WINDOW_HANDLE);
if (!notification_handler)
RARCH_ERR("Error registering for notifications\n");
@ -838,9 +1020,7 @@ bool win32_window_create(void *data, unsigned style,
bool win32_get_metrics(void *data,
enum display_metric_types type, float *value)
{
#ifdef _XBOX
return false;
#else
#ifndef _XBOX
HDC monitor = GetDC(NULL);
int pixels_x = GetDeviceCaps(monitor, HORZRES);
int pixels_y = GetDeviceCaps(monitor, VERTRES);
@ -853,22 +1033,22 @@ bool win32_get_metrics(void *data,
{
case DISPLAY_METRIC_MM_WIDTH:
*value = physical_width;
break;
return true;
case DISPLAY_METRIC_MM_HEIGHT:
*value = physical_height;
break;
return true;
case DISPLAY_METRIC_DPI:
/* 25.4 mm in an inch. */
*value = 254 * pixels_x / physical_width / 10;
break;
return true;
case DISPLAY_METRIC_NONE:
default:
*value = 0;
return false;
break;
}
return true;
#endif
return false;
}
void win32_monitor_init(void)
@ -900,14 +1080,8 @@ static bool win32_monitor_set_fullscreen(
RARCH_LOG("Setting fullscreen to %ux%u @ %uHz on device %s.\n",
width, height, refresh, dev_name);
#if _WIN32_WINDOWS >= 0x0410 || _WIN32_WINNT >= 0x0410
/* Windows 98 and later codepath */
return ChangeDisplaySettingsEx(dev_name, &devmode,
NULL, CDS_FULLSCREEN, NULL) == DISP_CHANGE_SUCCESSFUL;
#else
/* Windows 95 / NT codepath */
return ChangeDisplaySettings(&devmode, CDS_FULLSCREEN);
#endif
return win32_change_display_settings(dev_name, &devmode,
CDS_FULLSCREEN) == DISP_CHANGE_SUCCESSFUL;
#endif
}
@ -944,10 +1118,11 @@ void win32_check_window(bool *quit, bool *resize,
bool win32_suppress_screensaver(void *data, bool enable)
{
#ifndef _XBOX
if(enable)
if (enable)
{
int major, minor;
char tmp[PATH_MAX_LENGTH];
int major = 0;
int minor = 0;
const frontend_ctx_driver_t *frontend = frontend_get_ptr();
if (!frontend)
@ -969,16 +1144,20 @@ bool win32_suppress_screensaver(void *data, bool enable)
PowerSetRequestPtr powerSetRequest =
(PowerSetRequestPtr)GetProcAddress(kernel32, "PowerSetRequest");
if(powerCreateRequest && powerSetRequest)
if (powerCreateRequest && powerSetRequest)
{
POWER_REQUEST_CONTEXT RequestContext;
HANDLE Request;
RequestContext.Version = POWER_REQUEST_CONTEXT_VERSION;
RequestContext.Flags = POWER_REQUEST_CONTEXT_SIMPLE_STRING;
RequestContext.Reason.SimpleReasonString = (LPWSTR)L"RetroArch running";
RequestContext.Version =
POWER_REQUEST_CONTEXT_VERSION;
RequestContext.Flags =
POWER_REQUEST_CONTEXT_SIMPLE_STRING;
RequestContext.Reason.SimpleReasonString = (LPWSTR)
L"RetroArch running";
Request = powerCreateRequest(&RequestContext);
Request =
powerCreateRequest(&RequestContext);
powerSetRequest( Request, PowerRequestDisplayRequired);
return true;
@ -1020,7 +1199,7 @@ void win32_set_style(MONITORINFOEX *current_mon, HMONITOR *hm_to_use,
float refresh_mod = settings->bools.video_black_frame_insertion ? 2.0f : 1.0f;
unsigned refresh = roundf(settings->floats.video_refresh_rate
* refresh_mod * settings->uints.video_swap_interval);
if (windowed_full)
{
*style = WS_EX_TOPMOST | WS_POPUP;
@ -1032,8 +1211,7 @@ void win32_set_style(MONITORINFOEX *current_mon, HMONITOR *hm_to_use,
*style = WS_POPUP | WS_VISIBLE;
if (!win32_monitor_set_fullscreen(*width, *height,
refresh, current_mon->szDevice))
{}
refresh, current_mon->szDevice)) { }
/* Display settings might have changed, get new coordinates. */
GetMonitorInfo(*hm_to_use, (LPMONITORINFO)current_mon);
@ -1141,11 +1319,9 @@ bool win32_set_video_mode(void *data,
RARCH_ERR("GetMessage error code %d\n", GetLastError());
break;
}
else
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
TranslateMessage(&msg);
DispatchMessage(&msg);
}
if (g_quit)
@ -1237,7 +1413,7 @@ void win32_get_video_output_prev(
EnumDisplaySettings(NULL, i, &dm) != 0;
i++)
{
if ( dm.dmPelsWidth == curr_width
if ( dm.dmPelsWidth == curr_width
&& dm.dmPelsHeight == curr_height)
{
if ( prev_width != curr_width
@ -1259,6 +1435,70 @@ void win32_get_video_output_prev(
}
}
float win32_get_refresh_rate(void *data)
{
float refresh_rate = 0.0f;
#if _WIN32_WINNT >= 0x0601 || _WIN32_WINDOWS >= 0x0601 /* Win 7 */
OSVERSIONINFO version_info;
DISPLAYCONFIG_TOPOLOGY_ID_CUSTOM TopologyID;
unsigned int NumPathArrayElements = 0;
unsigned int NumModeInfoArrayElements = 0;
DISPLAYCONFIG_PATH_INFO_CUSTOM *PathInfoArray = NULL;
DISPLAYCONFIG_MODE_INFO_CUSTOM *ModeInfoArray = NULL;
int result = 0;
#ifdef HAVE_DYNAMIC
static QUERYDISPLAYCONFIG pQueryDisplayConfig;
static GETDISPLAYCONFIGBUFFERSIZES pGetDisplayConfigBufferSizes;
if (!pQueryDisplayConfig)
pQueryDisplayConfig = (QUERYDISPLAYCONFIG)GetProcAddress(GetModuleHandle("user32.dll"), "QueryDisplayConfig");
if (!pGetDisplayConfigBufferSizes)
pGetDisplayConfigBufferSizes = (GETDISPLAYCONFIGBUFFERSIZES)GetProcAddress(GetModuleHandle("user32.dll"), "GetDisplayConfigBufferSizes");
#else
static QUERYDISPLAYCONFIG pQueryDisplayConfig = QueryDisplayConfig;
static GETDISPLAYCONFIGBUFFERSIZES pGetDisplayConfigBufferSizes = GetDisplayConfigBufferSizes;
#endif
version_info.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
if (!GetVersionEx(&version_info))
return refresh_rate;
if (version_info.dwMajorVersion < 6 ||
(version_info.dwMajorVersion == 6 && version_info.dwMinorVersion < 1))
return refresh_rate;
result = pGetDisplayConfigBufferSizes(QDC_DATABASE_CURRENT,
&NumPathArrayElements,
&NumModeInfoArrayElements);
if (result != ERROR_SUCCESS)
return refresh_rate;
PathInfoArray = (DISPLAYCONFIG_PATH_INFO_CUSTOM *)
malloc(sizeof(DISPLAYCONFIG_PATH_INFO_CUSTOM) * NumPathArrayElements);
ModeInfoArray = (DISPLAYCONFIG_MODE_INFO_CUSTOM *)
malloc(sizeof(DISPLAYCONFIG_MODE_INFO_CUSTOM) * NumModeInfoArrayElements);
result = pQueryDisplayConfig(QDC_DATABASE_CURRENT,
&NumPathArrayElements,
PathInfoArray,
&NumModeInfoArrayElements,
ModeInfoArray,
&TopologyID);
if (result == ERROR_SUCCESS && NumPathArrayElements >= 1)
{
refresh_rate = (float) PathInfoArray[0].targetInfo.refreshRate.Numerator /
PathInfoArray[0].targetInfo.refreshRate.Denominator;
}
free(ModeInfoArray);
free(PathInfoArray);
#endif
return refresh_rate;
}
void win32_get_video_output_next(
unsigned *width, unsigned *height)
{
@ -1284,7 +1524,7 @@ void win32_get_video_output_next(
break;
}
if ( dm.dmPelsWidth == curr_width
if ( dm.dmPelsWidth == curr_width
&& dm.dmPelsHeight == curr_height)
found = true;
}
@ -1294,7 +1534,7 @@ void win32_get_video_output_size(unsigned *width, unsigned *height)
{
DEVMODE dm;
memset(&dm, 0, sizeof(dm));
dm.dmSize = sizeof(dm);
dm.dmSize = sizeof(dm);
if (EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &dm) != 0)
{

View File

@ -56,14 +56,15 @@ void win32_monitor_get_info(void);
void win32_monitor_info(void *data, void *hm_data, unsigned *mon_id);
int win32_change_display_settings(const char *str, void *devmode_data,
unsigned flags);
void create_graphics_context(HWND hwnd, bool *quit);
void create_gdi_context(HWND hwnd, bool *quit);
bool gdi_has_menu_frame(void);
bool win32_shader_dlg_init(void);
void shader_dlg_show(HWND parent_hwnd);
void shader_dlg_params_reload(void);
#endif
@ -127,6 +128,8 @@ bool win32_taskbar_is_created(void);
void win32_set_taskbar_created(bool created);
float win32_get_refresh_rate(void *data);
#if defined(HAVE_D3D8) || defined(HAVE_D3D9) || defined (HAVE_D3D10) || defined (HAVE_D3D11) || defined (HAVE_D3D12)
LRESULT CALLBACK WndProcD3D(HWND hwnd, UINT message,
WPARAM wparam, LPARAM lparam);

View File

@ -66,7 +66,7 @@ Display *g_x11_dpy = NULL;
unsigned g_x11_screen = 0;
Colormap g_x11_cmap;
Window g_x11_win;
Window g_x11_win = None;
static Atom XA_NET_WM_STATE;
static Atom XA_NET_WM_STATE_FULLSCREEN;
@ -107,7 +107,7 @@ void x11_show_mouse(Display *dpy, Window win, bool state)
x11_hide_mouse(dpy, win);
}
void x11_windowed_fullscreen(Display *dpy, Window win)
void x11_set_net_wm_fullscreen(Display *dpy, Window win)
{
XEvent xev = {0};
@ -234,6 +234,28 @@ void x11_suspend_screensaver(Window wnd, bool enable)
x11_suspend_screensaver_xdg_screensaver(wnd, enable);
}
float x11_get_refresh_rate(void *data)
{
XWindowAttributes attr;
XF86VidModeModeLine modeline;
Screen *screen;
int screenid;
int dotclock;
if (!g_x11_dpy || g_x11_win == None)
return 0.0f;
if (!XGetWindowAttributes(g_x11_dpy, g_x11_win, &attr))
return 0.0f;
screen = attr.screen;
screenid = XScreenNumberOfScreen(screen);
XF86VidModeGetModeLine(g_x11_dpy, screenid, &dotclock, &modeline);
return (float) dotclock * 1000.0f / modeline.htotal / modeline.vtotal;
}
static bool get_video_mode(video_frame_info_t *video_info,
Display *dpy, unsigned width, unsigned height,
XF86VidModeModeInfo *mode, XF86VidModeModeInfo *desktop_mode)
@ -408,7 +430,8 @@ static void x11_handle_key_event(XEvent *event, XIC ic, bool filter)
status = 0;
/* XwcLookupString doesn't seem to work. */
num = Xutf8LookupString(ic, &event->xkey, keybuf, ARRAY_SIZE(keybuf), &keysym, &status);
num = Xutf8LookupString(ic, &event->xkey, keybuf,
ARRAY_SIZE(keybuf), &keysym, &status);
/* libc functions need UTF-8 locale to work properly,
* which makes mbrtowc a bit impractical.
@ -417,7 +440,8 @@ static void x11_handle_key_event(XEvent *event, XIC ic, bool filter)
num = utf8_conv_utf32(chars, ARRAY_SIZE(chars), keybuf, num);
#else
(void)ic;
num = XLookupString(&event->xkey, keybuf, sizeof(keybuf), &keysym, NULL); /* ASCII only. */
num = XLookupString(&event->xkey, keybuf,
sizeof(keybuf), &keysym, NULL); /* ASCII only. */
for (i = 0; i < num; i++)
chars[i] = keybuf[i] & 0x7f;
#endif
@ -685,3 +709,104 @@ void x11_event_queue_check(XEvent *event)
XIfEvent(g_x11_dpy, event, x11_wait_notify, NULL);
}
static bool x11_check_atom_supported(Display *dpy, Atom atom)
{
Atom XA_NET_SUPPORTED = XInternAtom(dpy, "_NET_SUPPORTED", True);
Atom type;
int format;
unsigned long nitems;
unsigned long bytes_after;
Atom *prop;
int i;
if (XA_NET_SUPPORTED == None)
return false;
XGetWindowProperty(dpy, DefaultRootWindow(dpy), XA_NET_SUPPORTED,
0, UINT_MAX, False, XA_ATOM, &type, &format,&nitems,
&bytes_after, (unsigned char **) &prop);
if (!prop || type != XA_ATOM)
return false;
for (i = 0; i < nitems; i++)
{
if (prop[i] == atom)
{
XFree(prop);
return true;
}
}
XFree(prop);
return false;
}
bool x11_has_net_wm_fullscreen(Display *dpy)
{
XA_NET_WM_STATE_FULLSCREEN = XInternAtom(dpy, "_NET_WM_STATE_FULLSCREEN", False);
return x11_check_atom_supported(dpy, XA_NET_WM_STATE_FULLSCREEN);
}
char *x11_get_wm_name(Display *dpy)
{
Atom XA_NET_SUPPORTING_WM_CHECK = XInternAtom(g_x11_dpy, "_NET_SUPPORTING_WM_CHECK", False);
Atom XA_NET_WM_NAME = XInternAtom(g_x11_dpy, "_NET_WM_NAME", False);
Atom XA_UTF8_STRING = XInternAtom(g_x11_dpy, "UTF8_STRING", False);
int status;
Atom type;
int format;
unsigned long nitems;
unsigned long bytes_after;
unsigned char *propdata;
char *title;
Window window;
if (!XA_NET_SUPPORTING_WM_CHECK || !XA_NET_WM_NAME)
return NULL;
status = XGetWindowProperty(dpy,
DefaultRootWindow(dpy),
XA_NET_SUPPORTING_WM_CHECK,
0,
1,
False,
XA_WINDOW,
&type,
&format,
&nitems,
&bytes_after,
&propdata);
if (status == Success && propdata)
window = ((Window *) propdata)[0];
else
return NULL;
XFree(propdata);
status = XGetWindowProperty(dpy,
window,
XA_NET_WM_NAME,
0,
8192,
False,
XA_UTF8_STRING,
&type,
&format,
&nitems,
&bytes_after,
&propdata);
if (status == Success && propdata)
title = strdup((char *) propdata);
else
return NULL;
XFree(propdata);
return title;
}

View File

@ -29,7 +29,7 @@ extern Colormap g_x11_cmap;
extern unsigned g_x11_screen;
void x11_show_mouse(Display *dpy, Window win, bool state);
void x11_windowed_fullscreen(Display *dpy, Window win);
void x11_set_net_wm_fullscreen(Display *dpy, Window win);
void x11_suspend_screensaver(Window win, bool enable);
bool x11_enter_fullscreen(video_frame_info_t *video_info,
Display *dpy, unsigned width,
@ -48,6 +48,8 @@ void x11_destroy_input_context(XIM *xim, XIC *xic);
bool x11_get_metrics(void *data,
enum display_metric_types type, float *value);
float x11_get_refresh_rate(void *data);
void x11_check_window(void *data, bool *quit,
bool *resize, unsigned *width, unsigned *height, bool is_shutdown);
@ -75,5 +77,9 @@ void x11_install_quit_atom(void);
void x11_event_queue_check(XEvent *event);
char *x11_get_wm_name(Display *dpy);
bool x11_has_net_wm_fullscreen(Display *dpy);
#endif

View File

@ -49,6 +49,7 @@ const video_display_server_t dispserv_null = {
null_set_window_opacity,
null_set_window_progress,
NULL,
NULL,
"null"
};

Some files were not shown because too many files have changed in this diff Show More