mirror of
https://github.com/libretro/RetroArch
synced 2025-03-20 10:20:51 +00:00
commit
46afabee6a
@ -10,7 +10,7 @@ matrix:
|
||||
- g++-mingw-w64-i686
|
||||
- mingw-w64-i686-dev
|
||||
script:
|
||||
- CROSS_COMPILE=i686-w64-mingw32- ./configure --disable-d3d9 && 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-d3d9 && 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
|
||||
|
250
.vscode/c_cpp_properties.json
vendored
250
.vscode/c_cpp_properties.json
vendored
@ -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
43
.vscode/launch.json
vendored
@ -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
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
|
||||
]
|
||||
}
|
1
.vscode/settings.json
vendored
1
.vscode/settings.json
vendored
@ -14,4 +14,5 @@
|
||||
"*.in": "c",
|
||||
"*.rh": "c"
|
||||
},
|
||||
"C_Cpp.dimInactiveRegions": false,
|
||||
}
|
56
CHANGES.md
56
CHANGES.md
@ -1,21 +1,58 @@
|
||||
# 1.7.2 (future)
|
||||
# 1.7.3 (future)
|
||||
|
||||
# 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.
|
||||
- CHEEVOS: Support Atari 2600, Virtual Boy, Neo Geo (Arcade).
|
||||
- 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.
|
||||
- MENU: Disable XMB shadow icons by default for PowerPC and ARM for performance reasons.
|
||||
- LOCALIZATION: Update Polish translation.
|
||||
- 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.
|
||||
@ -26,8 +63,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
|
||||
@ -68,9 +107,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.
|
||||
@ -309,7 +347,7 @@ Skipped this one.
|
||||
- MISC: Various frontend optimizations.
|
||||
- NET: Fix bug #4703 (https://github.com/libretro/RetroArch/issues/4703)
|
||||
- OSX/MACOS: Fixes serious memory leak
|
||||
- THUMBNAILS: Thumbnails show up now in Load Content -> Collection, Information -> Database
|
||||
- THUMBNAILS: Thumbnails show up now in Load Content -> Collection, Information -> Database
|
||||
- VIDEO: Fix threaded video regression; tickering of menu entries would no longer work.
|
||||
- VITA: Fix 30fps menu (poke into input now instead of reading the entire input buffer which apparently is slow)
|
||||
- VITA: Fix frame throttle
|
||||
|
4
Makefile
4
Makefile
@ -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)
|
||||
@ -133,7 +133,7 @@ RARCH_OBJ := $(addprefix $(OBJDIR)/,$(OBJ))
|
||||
|
||||
ifneq ($(X86),)
|
||||
CFLAGS += -m32
|
||||
CXXLAGS += -m32
|
||||
CXXFLAGS += -m32
|
||||
LDFLAGS += -m32
|
||||
endif
|
||||
|
||||
|
@ -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,7 +200,9 @@ 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 \
|
||||
@ -259,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)
|
||||
@ -1023,9 +1038,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 \
|
||||
@ -1255,7 +1267,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
|
||||
|
||||
@ -1425,6 +1439,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\""
|
||||
@ -1451,7 +1467,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)
|
||||
@ -1462,7 +1479,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 \
|
||||
@ -1481,19 +1498,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)
|
||||
@ -1595,10 +1620,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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
@ -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 :=
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -213,7 +213,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
|
||||
@ -524,7 +524,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");
|
||||
@ -576,20 +576,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 +603,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 +659,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)
|
||||
{
|
||||
@ -976,6 +973,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);
|
||||
|
||||
@ -1074,6 +1077,16 @@ 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;
|
||||
|
@ -203,9 +203,6 @@ error:
|
||||
static bool sl_stop(void *data)
|
||||
{
|
||||
sl_t *sl = (sl_t*)data;
|
||||
|
||||
opensl_callback((SLAndroidSimpleBufferQueueItf) 0, data);
|
||||
|
||||
sl->is_paused = (SLPlayItf_SetPlayState(sl->player, SL_PLAYSTATE_STOPPED)
|
||||
== SL_RESULT_SUCCESS) ? true : false;
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
25
command.c
25
command.c
@ -1015,7 +1015,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 +1029,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;
|
||||
@ -1708,14 +1708,8 @@ void command_playlist_update_write(
|
||||
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;
|
||||
|
||||
@ -2202,11 +2196,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:
|
||||
|
16
config.def.h
16
config.def.h
@ -297,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;
|
||||
@ -304,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__)
|
||||
@ -593,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;
|
||||
@ -605,11 +613,7 @@ static const unsigned default_content_history_size = 100;
|
||||
/* Show Menu start-up screen on boot. */
|
||||
static const bool default_menu_show_start_screen = true;
|
||||
|
||||
#ifdef RARCH_MOBILE
|
||||
static const bool menu_dpi_override_enable = false;
|
||||
#else
|
||||
static const bool menu_dpi_override_enable = true;
|
||||
#endif
|
||||
|
||||
#ifdef RARCH_MOBILE
|
||||
static const unsigned menu_dpi_override_value = 72;
|
||||
@ -654,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
|
||||
|
@ -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);
|
||||
@ -1220,6 +1221,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);
|
||||
@ -1310,10 +1313,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);
|
||||
@ -1328,8 +1335,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
|
||||
@ -1356,9 +1369,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
|
||||
@ -1463,9 +1473,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
|
||||
@ -1473,8 +1480,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);
|
||||
@ -1515,6 +1524,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;
|
||||
@ -1714,6 +1725,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();
|
||||
@ -2928,7 +2940,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));
|
||||
|
||||
@ -3016,7 +3028,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';
|
||||
|
||||
@ -3101,7 +3113,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;
|
||||
@ -3121,12 +3133,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,
|
||||
@ -3228,7 +3240,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));
|
||||
|
||||
@ -3766,8 +3778,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;
|
||||
}
|
||||
|
||||
@ -4179,28 +4190,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);
|
||||
|
@ -147,8 +147,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;
|
||||
@ -157,6 +164,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;
|
||||
@ -224,6 +232,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;
|
||||
@ -350,10 +360,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;
|
||||
@ -377,11 +389,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
|
||||
@ -397,6 +411,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];
|
||||
|
@ -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
3
core.h
@ -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);
|
||||
|
21
core_impl.c
21
core_impl.c
@ -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;
|
||||
|
65
core_info.c
65
core_info.c
@ -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;
|
||||
@ -224,21 +221,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;
|
||||
@ -518,7 +517,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 +535,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 +546,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 +634,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 +653,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 +751,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 +785,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)
|
||||
{
|
||||
|
10
core_info.h
10
core_info.h
@ -97,7 +97,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 +111,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);
|
||||
|
||||
|
@ -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>
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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);
|
||||
|
5463
deps/dr/dr_flac.h
vendored
Normal file
5463
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
2745
deps/dr/dr_mp3.h
vendored
Normal file
File diff suppressed because it is too large
Load Diff
2
deps/libFLAC/bitmath.c
vendored
2
deps/libFLAC/bitmath.c
vendored
@ -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:
|
||||
*
|
||||
|
14
deps/libFLAC/bitreader.c
vendored
14
deps/libFLAC/bitreader.c
vendored
@ -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
7
deps/libFLAC/cpu.c
vendored
@ -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
2
deps/libFLAC/crc.c
vendored
@ -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
10
deps/libFLAC/fixed.c
vendored
@ -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
|
||||
|
6
deps/libFLAC/float.c
vendored
6
deps/libFLAC/float.c
vendored
@ -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
12
deps/libFLAC/format.c
vendored
@ -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)
|
||||
|
2
deps/libFLAC/include/FLAC/format.h
vendored
2
deps/libFLAC/include/FLAC/format.h
vendored
@ -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;
|
||||
|
||||
|
6
deps/libFLAC/include/private/bitmath.h
vendored
6
deps/libFLAC/include/private/bitmath.h
vendored
@ -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* */
|
||||
|
2
deps/libFLAC/include/private/bitreader.h
vendored
2
deps/libFLAC/include/private/bitreader.h
vendored
@ -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"
|
||||
|
||||
/*
|
||||
|
2
deps/libFLAC/include/private/cpu.h
vendored
2
deps/libFLAC/include/private/cpu.h
vendored
@ -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>
|
||||
|
2
deps/libFLAC/include/private/crc.h
vendored
2
deps/libFLAC/include/private/crc.h
vendored
@ -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
|
||||
|
6
deps/libFLAC/include/private/fixed.h
vendored
6
deps/libFLAC/include/private/fixed.h
vendored
@ -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()
|
||||
|
2
deps/libFLAC/include/private/float.h
vendored
2
deps/libFLAC/include/private/float.h
vendored
@ -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
|
||||
|
2
deps/libFLAC/include/private/format.h
vendored
2
deps/libFLAC/include/private/format.h
vendored
@ -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);
|
||||
|
6
deps/libFLAC/include/private/lpc.h
vendored
6
deps/libFLAC/include/private/lpc.h
vendored
@ -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
|
||||
|
||||
|
2
deps/libFLAC/include/private/md5.h
vendored
2
deps/libFLAC/include/private/md5.h
vendored
@ -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;
|
||||
|
4
deps/libFLAC/include/private/memory.h
vendored
4
deps/libFLAC/include/private/memory.h
vendored
@ -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.
|
||||
|
@ -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 {
|
||||
|
32
deps/libFLAC/include/share/alloc.h
vendored
32
deps/libFLAC/include/share/alloc.h
vendored
@ -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
12
deps/libFLAC/lpc.c
vendored
@ -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
|
||||
|
8
deps/libFLAC/lpc_intrin_avx2.c
vendored
8
deps/libFLAC/lpc_intrin_avx2.c
vendored
@ -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 */
|
||||
|
||||
|
8
deps/libFLAC/lpc_intrin_sse.c
vendored
8
deps/libFLAC/lpc_intrin_sse.c
vendored
@ -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 */
|
||||
|
||||
|
8
deps/libFLAC/lpc_intrin_sse2.c
vendored
8
deps/libFLAC/lpc_intrin_sse2.c
vendored
@ -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 */
|
||||
|
||||
|
8
deps/libFLAC/lpc_intrin_sse41.c
vendored
8
deps/libFLAC/lpc_intrin_sse41.c
vendored
@ -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
6
deps/libFLAC/md5.c
vendored
@ -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.
|
||||
|
6
deps/libFLAC/memory.c
vendored
6
deps/libFLAC/memory.c
vendored
@ -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)
|
||||
{
|
||||
|
28
deps/libFLAC/stream_decoder.c
vendored
28
deps/libFLAC/stream_decoder.c
vendored
@ -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 */
|
||||
|
5
deps/miniupnpc/minissdpc.c
vendored
5
deps/miniupnpc/minissdpc.c
vendored
@ -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;
|
||||
}
|
||||
|
||||
|
5
deps/stb/stb_rect_pack.h
vendored
5
deps/stb/stb_rect_pack.h
vendored
@ -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);
|
||||
|
2
deps/stb/stb_vorbis.h
vendored
2
deps/stb/stb_vorbis.h
vendored
@ -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
|
||||
|
83
dynamic.c
83
dynamic.c
@ -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(¤t_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;
|
||||
|
@ -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:
|
||||
*
|
||||
|
97
experimental-audio.diff
Normal file
97
experimental-audio.diff
Normal file
@ -0,0 +1,97 @@
|
||||
diff --git a/audio/audio_driver.c b/audio/audio_driver.c
|
||||
index 3209354b19..caf10dbed2 100644
|
||||
--- a/audio/audio_driver.c
|
||||
+++ b/audio/audio_driver.c
|
||||
@@ -606,7 +606,6 @@ static void audio_driver_flush(const int16_t *data, size_t samples)
|
||||
src_data.data_in = audio_driver_input_data;
|
||||
src_data.input_frames = samples >> 1;
|
||||
|
||||
-
|
||||
if (audio_driver_dsp)
|
||||
{
|
||||
struct retro_dsp_data dsp_data;
|
||||
@@ -722,6 +721,19 @@ void audio_driver_sample(int16_t left, int16_t right)
|
||||
audio_driver_data_ptr = 0;
|
||||
}
|
||||
|
||||
+void audio_driver_menu_sample(void)
|
||||
+{
|
||||
+ static unsigned count = 0;
|
||||
+ audio_driver_output_samples_conv_buf[count++] = 0;
|
||||
+ audio_driver_output_samples_conv_buf[count++] = 0;
|
||||
+
|
||||
+ if (audio_driver_data_ptr < audio_driver_chunk_size)
|
||||
+ return;
|
||||
+
|
||||
+ audio_driver_flush(audio_driver_output_samples_conv_buf,
|
||||
+ count);
|
||||
+}
|
||||
+
|
||||
/**
|
||||
* audio_driver_sample_batch:
|
||||
* @data : pointer to audio buffer.
|
||||
diff --git a/audio/audio_driver.h b/audio/audio_driver.h
|
||||
index 6dfacaa89f..e5c37a344c 100644
|
||||
--- a/audio/audio_driver.h
|
||||
+++ b/audio/audio_driver.h
|
||||
@@ -271,6 +271,8 @@ bool audio_driver_deinit(void);
|
||||
|
||||
bool audio_driver_init(void);
|
||||
|
||||
+void audio_driver_menu_sample(void);
|
||||
+
|
||||
bool audio_driver_mixer_add_stream(audio_mixer_stream_params_t *params);
|
||||
|
||||
enum resampler_quality audio_driver_get_resampler_quality(void);
|
||||
diff --git a/menu/menu_driver.c b/menu/menu_driver.c
|
||||
index 45580c12f5..894cbf56bc 100644
|
||||
--- a/menu/menu_driver.c
|
||||
+++ b/menu/menu_driver.c
|
||||
@@ -1683,8 +1683,10 @@ static void menu_driver_toggle(bool on)
|
||||
/* Stop all rumbling before entering the menu. */
|
||||
command_event(CMD_EVENT_RUMBLE_STOP, NULL);
|
||||
|
||||
+#if 0
|
||||
if (pause_libretro)
|
||||
command_event(CMD_EVENT_AUDIO_STOP, NULL);
|
||||
+#endif
|
||||
|
||||
/* Override keyboard callback to redirect to menu instead.
|
||||
* We'll use this later for something ... */
|
||||
@@ -1702,8 +1704,10 @@ static void menu_driver_toggle(bool on)
|
||||
if (!rarch_ctl(RARCH_CTL_IS_SHUTDOWN, NULL))
|
||||
driver_set_nonblock_state();
|
||||
|
||||
+#if 0
|
||||
if (pause_libretro)
|
||||
command_event(CMD_EVENT_AUDIO_START, NULL);
|
||||
+#endif
|
||||
|
||||
/* Restore libretro keyboard callback. */
|
||||
if (key_event && frontend_key_event)
|
||||
diff --git a/retroarch.c b/retroarch.c
|
||||
index 537ed82f37..29df4434b0 100644
|
||||
--- a/retroarch.c
|
||||
+++ b/retroarch.c
|
||||
@@ -2608,6 +2608,7 @@ static enum runloop_state runloop_check_state(
|
||||
|
||||
retro_ctx.poll_cb();
|
||||
|
||||
+
|
||||
{
|
||||
enum menu_action action;
|
||||
bool focused = false;
|
||||
@@ -2627,10 +2628,13 @@ static enum runloop_state runloop_check_state(
|
||||
rarch_menu_running_finished();
|
||||
|
||||
if (focused || !runloop_idle)
|
||||
+ {
|
||||
menu_driver_render(runloop_idle, rarch_is_inited,
|
||||
(current_core_type == CORE_TYPE_DUMMY)
|
||||
)
|
||||
;
|
||||
+ audio_driver_menu_sample();
|
||||
+ }
|
||||
|
||||
old_input = current_input;
|
||||
|
@ -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,
|
||||
|
@ -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;
|
||||
|
@ -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" );
|
||||
|
@ -54,9 +54,6 @@
|
||||
|
||||
#ifdef ANDROID
|
||||
#include <sys/system_properties.h>
|
||||
#ifdef __arm__
|
||||
#include <machine/cpu-features.h>
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include <boolean.h>
|
||||
@ -2372,8 +2369,15 @@ static bool frontend_unix_check_for_path_changes(path_change_data_t *change_data
|
||||
{
|
||||
unsigned j;
|
||||
|
||||
/* A successful close does not guarantee that the data has been successfully saved to disk, as the kernel defers writes. It is not common for a file system to flush the buffers when the stream is closed.
|
||||
* So we manually fsync() here to flush the data to disk, to make sure that the new data is immediately available when the file is re-read.
|
||||
/* A successful close does not guarantee that the
|
||||
* data has been successfully saved to disk,
|
||||
* as the kernel defers writes. It is
|
||||
* not common for a file system to flush
|
||||
* the buffers when the stream is closed.
|
||||
*
|
||||
* So we manually fsync() here to flush the data
|
||||
* to disk, to make sure that the new data is
|
||||
* immediately available when the file is re-read.
|
||||
*/
|
||||
for (j = 0; j < inotify_data->wd_list->count; j++)
|
||||
{
|
||||
@ -2381,7 +2385,7 @@ static bool frontend_unix_check_for_path_changes(path_change_data_t *change_data
|
||||
{
|
||||
/* found the right file, now sync it */
|
||||
const char *path = inotify_data->path_list->elems[j].data;
|
||||
FILE *fp = fopen_utf8(path, "rb");
|
||||
FILE *fp = (FILE*)fopen_utf8(path, "rb");
|
||||
|
||||
RARCH_LOG("file change detected: %s\n", path);
|
||||
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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,
|
||||
|
@ -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(
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -18,166 +18,399 @@
|
||||
|
||||
#include <boolean.h>
|
||||
#include <retro_common_api.h>
|
||||
#include <retro_inline.h>
|
||||
|
||||
#include <d3d8.h>
|
||||
|
||||
#include "../video_driver.h"
|
||||
#include "../../verbosity.h"
|
||||
|
||||
RETRO_BEGIN_DECLS
|
||||
|
||||
bool d3d8_swap(void *data, void *dev);
|
||||
static INLINE bool d3d8_swap(void *data, LPDIRECT3DDEVICE8 dev)
|
||||
{
|
||||
if (IDirect3DDevice8_Present(dev, NULL, NULL, NULL, NULL)
|
||||
== D3DERR_DEVICELOST)
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
void *d3d8_vertex_buffer_new(void *dev,
|
||||
unsigned length, unsigned usage, unsigned fvf,
|
||||
INT32 pool, void *handle);
|
||||
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;
|
||||
}
|
||||
|
||||
void *d3d8_vertex_buffer_lock(void *data);
|
||||
void d3d8_vertex_buffer_unlock(void *data);
|
||||
static INLINE void *
|
||||
d3d8_vertex_buffer_lock(LPDIRECT3DVERTEXBUFFER8 vertbuf)
|
||||
{
|
||||
void *buf = NULL;
|
||||
|
||||
void d3d8_vertex_buffer_free(void *vertex_data, void *vertex_declaration);
|
||||
if (!vertbuf)
|
||||
return NULL;
|
||||
|
||||
bool d3d8_texture_get_level_desc(void *tex,
|
||||
unsigned idx, void *_ppsurface_level);
|
||||
IDirect3DVertexBuffer8_Lock(vertbuf, 0, 0, (BYTE**)&buf, 0);
|
||||
|
||||
bool d3d8_texture_get_surface_level(void *tex,
|
||||
unsigned idx, void **_ppsurface_level);
|
||||
if (!buf)
|
||||
return NULL;
|
||||
|
||||
void *d3d8_texture_new(void *dev,
|
||||
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 +418,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 +446,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
@ -18,27 +18,76 @@
|
||||
|
||||
#include <boolean.h>
|
||||
#include <retro_common_api.h>
|
||||
#include <retro_inline.h>
|
||||
|
||||
#include <d3d9.h>
|
||||
|
||||
#include "../video_driver.h"
|
||||
#include "../../verbosity.h"
|
||||
|
||||
RETRO_BEGIN_DECLS
|
||||
|
||||
bool d3d9_swap(void *data, void *dev);
|
||||
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 +96,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 +573,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 +603,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 +629,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 +656,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
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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
|
||||
|
||||
|
@ -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)
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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))
|
||||
|
||||
|
@ -31,10 +31,10 @@
|
||||
#include "../../libretro-common/include/retro_timers.h"
|
||||
#include "../../configuration.h"
|
||||
|
||||
static dylib_t vulkan_library;
|
||||
static VkInstance cached_instance;
|
||||
static VkDevice cached_device;
|
||||
static retro_vulkan_destroy_device_t cached_destroy_device;
|
||||
static dylib_t vulkan_library;
|
||||
static VkInstance cached_instance_vk;
|
||||
static VkDevice cached_device_vk;
|
||||
static retro_vulkan_destroy_device_t cached_destroy_device_vk;
|
||||
|
||||
#ifdef VULKAN_DEBUG
|
||||
static VKAPI_ATTR VkBool32 VKAPI_CALL vulkan_debug_cb(
|
||||
@ -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)
|
||||
@ -1437,7 +1465,7 @@ static bool vulkan_context_init_device(gfx_ctx_vulkan_data_t *vk)
|
||||
iface = NULL;
|
||||
}
|
||||
|
||||
if (!cached_device && iface && iface->create_device)
|
||||
if (!cached_device_vk && iface && iface->create_device)
|
||||
{
|
||||
struct retro_vulkan_context context = { 0 };
|
||||
const VkPhysicalDeviceFeatures features = { 0 };
|
||||
@ -1478,10 +1506,10 @@ static bool vulkan_context_init_device(gfx_ctx_vulkan_data_t *vk)
|
||||
}
|
||||
}
|
||||
|
||||
if (cached_device && cached_destroy_device)
|
||||
if (cached_device_vk && cached_destroy_device_vk)
|
||||
{
|
||||
vk->context.destroy_device = cached_destroy_device;
|
||||
cached_destroy_device = NULL;
|
||||
vk->context.destroy_device = cached_destroy_device_vk;
|
||||
cached_destroy_device_vk = NULL;
|
||||
}
|
||||
|
||||
if (!vulkan_context_init_gpu(vk))
|
||||
@ -1565,10 +1593,10 @@ static bool vulkan_context_init_device(gfx_ctx_vulkan_data_t *vk)
|
||||
device_info.ppEnabledLayerNames = device_layers;
|
||||
#endif
|
||||
|
||||
if (cached_device)
|
||||
if (cached_device_vk)
|
||||
{
|
||||
vk->context.device = cached_device;
|
||||
cached_device = NULL;
|
||||
vk->context.device = cached_device_vk;
|
||||
cached_device_vk = NULL;
|
||||
|
||||
video_driver_set_video_cache_context_ack();
|
||||
RARCH_LOG("[Vulkan]: Using cached Vulkan context.\n");
|
||||
@ -1736,10 +1764,10 @@ bool vulkan_context_init(gfx_ctx_vulkan_data_t *vk,
|
||||
}
|
||||
}
|
||||
|
||||
if (cached_instance)
|
||||
if (cached_instance_vk)
|
||||
{
|
||||
vk->context.instance = cached_instance;
|
||||
cached_instance = NULL;
|
||||
vk->context.instance = cached_instance_vk;
|
||||
cached_instance_vk = NULL;
|
||||
res = VK_SUCCESS;
|
||||
}
|
||||
else
|
||||
@ -2239,9 +2267,9 @@ void vulkan_context_destroy(gfx_ctx_vulkan_data_t *vk,
|
||||
|
||||
if (video_driver_is_video_cache_context())
|
||||
{
|
||||
cached_device = vk->context.device;
|
||||
cached_instance = vk->context.instance;
|
||||
cached_destroy_device = vk->context.destroy_device;
|
||||
cached_device_vk = vk->context.device;
|
||||
cached_instance_vk = vk->context.instance;
|
||||
cached_destroy_device_vk = vk->context.destroy_device;
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -2253,6 +2281,7 @@ void vulkan_context_destroy(gfx_ctx_vulkan_data_t *vk,
|
||||
vk->context.destroy_device();
|
||||
|
||||
vkDestroyInstance(vk->context.instance, NULL);
|
||||
|
||||
if (vulkan_library)
|
||||
{
|
||||
dylib_close(vulkan_library);
|
||||
|
@ -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)
|
||||
|
@ -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,22 @@ extern void *dinput_wgl;
|
||||
extern void *dinput;
|
||||
#endif
|
||||
|
||||
unsigned g_resize_width = 0;
|
||||
unsigned g_resize_height = 0;
|
||||
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 +160,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 +268,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 +290,7 @@ void win32_monitor_get_info(void)
|
||||
|
||||
GetMonitorInfo(win32_monitor_last, (LPMONITORINFO)¤t_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 +392,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 +410,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);
|
||||
}
|
||||
}
|
||||
|
||||
@ -424,9 +436,7 @@ static int win32_drag_query_file(HWND hwnd, WPARAM wparam)
|
||||
static LRESULT win32_handle_keyboard_event(HWND hwnd, UINT message,
|
||||
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 +457,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 +465,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 +553,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);
|
||||
@ -838,9 +850,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 +863,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 +910,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 +948,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 +974,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;
|
||||
@ -1032,8 +1041,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 +1149,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 +1243,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 +1265,57 @@ 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 TopologyID;
|
||||
unsigned int NumPathArrayElements = 0;
|
||||
unsigned int NumModeInfoArrayElements = 0;
|
||||
DISPLAYCONFIG_PATH_INFO *PathInfoArray = NULL;
|
||||
DISPLAYCONFIG_MODE_INFO *ModeInfoArray = NULL;
|
||||
int result = 0;
|
||||
|
||||
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 = GetDisplayConfigBufferSizes(QDC_DATABASE_CURRENT,
|
||||
&NumPathArrayElements,
|
||||
&NumModeInfoArrayElements);
|
||||
|
||||
if (result != ERROR_SUCCESS)
|
||||
return refresh_rate;
|
||||
|
||||
PathInfoArray = (DISPLAYCONFIG_PATH_INFO *)
|
||||
malloc(sizeof(DISPLAYCONFIG_PATH_INFO) * NumPathArrayElements);
|
||||
ModeInfoArray = (DISPLAYCONFIG_MODE_INFO *)
|
||||
malloc(sizeof(DISPLAYCONFIG_MODE_INFO) * NumModeInfoArrayElements);
|
||||
|
||||
result = QueryDisplayConfig(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 +1341,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 +1351,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)
|
||||
{
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
@ -49,6 +49,8 @@ const video_display_server_t dispserv_null = {
|
||||
null_set_window_opacity,
|
||||
null_set_window_progress,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
"null"
|
||||
};
|
||||
|
||||
|
@ -67,8 +67,8 @@ be received by your application before it calls any ITaskbarList3 method.
|
||||
|
||||
static void* win32_display_server_init(void)
|
||||
{
|
||||
dispserv_win32_t *dispserv = (dispserv_win32_t*)calloc(1, sizeof(*dispserv));
|
||||
HRESULT hr;
|
||||
dispserv_win32_t *dispserv = (dispserv_win32_t*)calloc(1, sizeof(*dispserv));
|
||||
|
||||
(void)hr;
|
||||
|
||||
@ -77,11 +77,13 @@ static void* win32_display_server_init(void)
|
||||
|
||||
#ifdef HAS_TASKBAR_EXT
|
||||
#ifdef __cplusplus
|
||||
/* when compiling in C++ mode, GUIDs are references instead of pointers */
|
||||
hr = CoCreateInstance(CLSID_TaskbarList, NULL, CLSCTX_INPROC_SERVER, IID_ITaskbarList3, (void**)&g_taskbarList);
|
||||
/* When compiling in C++ mode, GUIDs are references instead of pointers */
|
||||
hr = CoCreateInstance(CLSID_TaskbarList, NULL,
|
||||
CLSCTX_INPROC_SERVER, IID_ITaskbarList3, (void**)&g_taskbarList);
|
||||
#else
|
||||
/* mingw GUIDs are pointers instead of references since we're in C mode */
|
||||
hr = CoCreateInstance(&CLSID_TaskbarList, NULL, CLSCTX_INPROC_SERVER, &IID_ITaskbarList3, (void**)&g_taskbarList);
|
||||
/* Mingw GUIDs are pointers instead of references since we're in C mode */
|
||||
hr = CoCreateInstance(&CLSID_TaskbarList, NULL,
|
||||
CLSCTX_INPROC_SERVER, &IID_ITaskbarList3, (void**)&g_taskbarList);
|
||||
#endif
|
||||
|
||||
if (!SUCCEEDED(hr))
|
||||
@ -115,7 +117,8 @@ static bool win32_set_window_opacity(void *data, unsigned opacity)
|
||||
HWND hwnd = win32_get_window();
|
||||
dispserv_win32_t *serv = (dispserv_win32_t*)data;
|
||||
|
||||
serv->opacity = opacity;
|
||||
if (serv)
|
||||
serv->opacity = opacity;
|
||||
|
||||
#if defined(_WIN32_WINNT) && _WIN32_WINNT >= 0x0500
|
||||
/* Set window transparency on Windows 2000 and above */
|
||||
@ -126,24 +129,23 @@ static bool win32_set_window_opacity(void *data, unsigned opacity)
|
||||
GetWindowLongPtr(hwnd, GWL_EXSTYLE) | WS_EX_LAYERED);
|
||||
return SetLayeredWindowAttributes(hwnd, 0, (255 * opacity) / 100, LWA_ALPHA);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetWindowLongPtr(hwnd,
|
||||
GWL_EXSTYLE,
|
||||
GetWindowLongPtr(hwnd, GWL_EXSTYLE) & ~WS_EX_LAYERED);
|
||||
return true;
|
||||
}
|
||||
#endif
|
||||
|
||||
SetWindowLongPtr(hwnd,
|
||||
GWL_EXSTYLE,
|
||||
GetWindowLongPtr(hwnd, GWL_EXSTYLE) & ~WS_EX_LAYERED);
|
||||
return true;
|
||||
#else
|
||||
return false;
|
||||
#endif
|
||||
}
|
||||
|
||||
static bool win32_set_window_progress(void *data, int progress, bool finished)
|
||||
{
|
||||
HWND hwnd = win32_get_window();
|
||||
dispserv_win32_t *serv = (dispserv_win32_t*)data;
|
||||
bool ret = false;
|
||||
|
||||
serv->progress = progress;
|
||||
if (serv)
|
||||
serv->progress = progress;
|
||||
|
||||
#ifdef HAS_TASKBAR_EXT
|
||||
if (!g_taskbarList || !win32_taskbar_is_created())
|
||||
@ -151,53 +153,140 @@ static bool win32_set_window_progress(void *data, int progress, bool finished)
|
||||
|
||||
if (progress == -1)
|
||||
{
|
||||
if (ITaskbarList3_SetProgressState(g_taskbarList, hwnd, TBPF_INDETERMINATE) == S_OK)
|
||||
ret = true;
|
||||
|
||||
if (!ret)
|
||||
if (ITaskbarList3_SetProgressState(
|
||||
g_taskbarList, hwnd, TBPF_INDETERMINATE) != S_OK)
|
||||
return false;
|
||||
}
|
||||
else if (finished)
|
||||
{
|
||||
if (ITaskbarList3_SetProgressState(g_taskbarList, hwnd, TBPF_NOPROGRESS) == S_OK)
|
||||
ret = true;
|
||||
|
||||
if (!ret)
|
||||
if (ITaskbarList3_SetProgressState(
|
||||
g_taskbarList, hwnd, TBPF_NOPROGRESS) != S_OK)
|
||||
return false;
|
||||
}
|
||||
else if (progress >= 0)
|
||||
{
|
||||
if (ITaskbarList3_SetProgressState(g_taskbarList, hwnd, TBPF_NORMAL) == S_OK)
|
||||
ret = true;
|
||||
|
||||
if (!ret)
|
||||
if (ITaskbarList3_SetProgressState(
|
||||
g_taskbarList, hwnd, TBPF_NORMAL) != S_OK)
|
||||
return false;
|
||||
|
||||
if (ITaskbarList3_SetProgressValue(g_taskbarList, hwnd, progress, 100) == S_OK)
|
||||
ret = true;
|
||||
if (ITaskbarList3_SetProgressValue(
|
||||
g_taskbarList, hwnd, progress, 100) != S_OK)
|
||||
return false;
|
||||
}
|
||||
#endif
|
||||
|
||||
return ret;
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool win32_set_window_decorations(void *data, bool on)
|
||||
{
|
||||
dispserv_win32_t *serv = (dispserv_win32_t*)data;
|
||||
|
||||
serv->decorations = on;
|
||||
if (serv)
|
||||
serv->decorations = on;
|
||||
|
||||
/* menu_setting performs a reinit instead to properly apply decoration changes */
|
||||
/* menu_setting performs a reinit instead to properly
|
||||
* apply decoration changes */
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool win32_display_server_set_resolution(void *data,
|
||||
unsigned width, unsigned height, int f_restore, int hz)
|
||||
{
|
||||
LONG res;
|
||||
DEVMODE curDevmode;
|
||||
DEVMODE devmode;
|
||||
|
||||
int iModeNum;
|
||||
int freq = 0;
|
||||
DWORD flags = 0;
|
||||
int depth = 0;
|
||||
dispserv_win32_t *serv = (dispserv_win32_t*)data;
|
||||
|
||||
if (!serv)
|
||||
return false;
|
||||
|
||||
if (f_restore == 0)
|
||||
freq = hz;
|
||||
|
||||
EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &curDevmode);
|
||||
|
||||
/* Used to stop super resolution bug */
|
||||
if (width == curDevmode.dmPelsWidth)
|
||||
width = 0;
|
||||
if (width == 0)
|
||||
width = curDevmode.dmPelsWidth;
|
||||
if (height == 0)
|
||||
height = curDevmode.dmPelsHeight;
|
||||
if (depth == 0)
|
||||
depth = curDevmode.dmBitsPerPel;
|
||||
if (freq == 0)
|
||||
freq = curDevmode.dmDisplayFrequency;
|
||||
|
||||
for (iModeNum = 0; ; iModeNum++)
|
||||
{
|
||||
if (!EnumDisplaySettings(NULL, iModeNum, &devmode))
|
||||
break;
|
||||
|
||||
if (devmode.dmPelsWidth != width)
|
||||
continue;
|
||||
|
||||
if (devmode.dmPelsHeight != height)
|
||||
continue;
|
||||
|
||||
if (devmode.dmBitsPerPel != depth)
|
||||
continue;
|
||||
|
||||
if (devmode.dmDisplayFrequency != freq)
|
||||
continue;
|
||||
|
||||
devmode.dmFields |=
|
||||
DM_PELSWIDTH | DM_PELSHEIGHT | DM_BITSPERPEL | DM_DISPLAYFREQUENCY;
|
||||
res =
|
||||
win32_change_display_settings(NULL, &devmode, CDS_TEST);
|
||||
|
||||
switch (res)
|
||||
{
|
||||
case DISP_CHANGE_SUCCESSFUL:
|
||||
res = win32_change_display_settings(NULL, &devmode, flags);
|
||||
switch (res)
|
||||
{
|
||||
case DISP_CHANGE_SUCCESSFUL:
|
||||
return true;
|
||||
case DISP_CHANGE_NOTUPDATED:
|
||||
return true;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case DISP_CHANGE_RESTART:
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void win32_display_server_get_current_resolution(
|
||||
unsigned *width, unsigned *height)
|
||||
{
|
||||
if (width)
|
||||
*width = GetSystemMetrics(SM_CYSCREEN);
|
||||
if (height)
|
||||
*height = GetSystemMetrics(SM_CXSCREEN);
|
||||
}
|
||||
|
||||
const video_display_server_t dispserv_win32 = {
|
||||
win32_display_server_init,
|
||||
win32_display_server_destroy,
|
||||
win32_set_window_opacity,
|
||||
win32_set_window_progress,
|
||||
win32_set_window_decorations,
|
||||
win32_display_server_get_current_resolution,
|
||||
win32_display_server_set_resolution,
|
||||
"win32"
|
||||
};
|
||||
|
||||
|
@ -78,6 +78,8 @@ const video_display_server_t dispserv_x11 = {
|
||||
x11_set_window_opacity,
|
||||
NULL,
|
||||
x11_set_window_decorations,
|
||||
NULL, /* get_current_resolution */
|
||||
NULL, /* set_resolution */
|
||||
"x11"
|
||||
};
|
||||
|
||||
|
@ -305,6 +305,7 @@ static void caca_set_osd_msg(void *data,
|
||||
}
|
||||
|
||||
static const video_poke_interface_t caca_poke_interface = {
|
||||
NULL, /* get_flags */
|
||||
NULL, /* set_coords */
|
||||
NULL, /* set_mvp */
|
||||
NULL,
|
||||
@ -318,6 +319,7 @@ static const video_poke_interface_t caca_poke_interface = {
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
caca_set_texture_frame,
|
||||
NULL,
|
||||
caca_set_osd_msg,
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user