Merge pull request #33 from libretro/master

MME Update 172
This commit is contained in:
alphanu1 2018-04-28 20:51:51 +01:00 committed by GitHub
commit 46afabee6a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
650 changed files with 27166 additions and 9646 deletions

View File

@ -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

View File

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

43
.vscode/launch.json vendored
View File

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

View File

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

View File

@ -1,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

View File

@ -46,7 +46,7 @@ endif
include Makefile.common
ifeq ($(shell $(CC) -v 2>&1 | grep -c "clang"),1)
DEFINES += -Wno-invalid-source-encoding
DEFINES += -Wno-invalid-source-encoding -Wno-incompatible-ms-struct
endif
ifeq ($(shell $(CC) -v 2>&1 | grep -c "tcc"),1)
@ -133,7 +133,7 @@ RARCH_OBJ := $(addprefix $(OBJDIR)/,$(OBJ))
ifneq ($(X86),)
CFLAGS += -m32
CXXLAGS += -m32
CXXFLAGS += -m32
LDFLAGS += -m32
endif

View File

@ -147,6 +147,8 @@ ifneq ($(GIT_VERSION),)
endif
# General object files
DEFINES += -DHAVE_DR_MP3
CFLAGS += -DHAVE_DR_MP3
OBJ += frontend/frontend.o \
frontend/frontend_driver.o \
@ -198,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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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;

View File

@ -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;

View File

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

View File

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

View File

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

View File

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

View File

@ -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:

View File

@ -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

View File

@ -1033,6 +1033,7 @@ static struct config_array_setting *populate_settings_array(settings_t *settings
#ifdef HAVE_CHEEVOS
SETTING_ARRAY("cheevos_username", settings->arrays.cheevos_username, false, NULL, true);
SETTING_ARRAY("cheevos_password", settings->arrays.cheevos_password, false, NULL, true);
SETTING_ARRAY("cheevos_token", settings->arrays.cheevos_token, false, NULL, true);
#endif
SETTING_ARRAY("video_context_driver", settings->arrays.video_context_driver, false, NULL, true);
SETTING_ARRAY("audio_driver", settings->arrays.audio_driver, false, NULL, true);
@ -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);

View File

@ -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];

View File

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

3
core.h
View File

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

View File

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

View File

@ -17,6 +17,7 @@
#include <compat/strl.h>
#include <string/stdstring.h>
#include <file/config_file.h>
#include <file/file_path.h>
#include <lists/dir_list.h>
#include <file/archive_file.h>
@ -26,14 +27,10 @@
#include "config.h"
#endif
#include "retroarch.h"
#include "verbosity.h"
#include "config.def.h"
#include "core_info.h"
#include "configuration.h"
#include "file_path_special.h"
#include "list_special.h"
static const char *core_info_tmp_path = NULL;
static const struct string_list *core_info_tmp_list = NULL;
@ -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)
{

View File

@ -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);

View File

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

View File

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

View File

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

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

File diff suppressed because it is too large Load Diff

View File

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

View File

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

7
deps/libFLAC/cpu.c vendored
View File

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

2
deps/libFLAC/crc.c vendored
View File

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

10
deps/libFLAC/fixed.c vendored
View File

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

View File

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

12
deps/libFLAC/format.c vendored
View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

12
deps/libFLAC/lpc.c vendored
View File

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

View File

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

View File

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

View File

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

View File

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

6
deps/libFLAC/md5.c vendored
View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

97
experimental-audio.diff Normal file
View 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;

View File

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

View File

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

View File

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

View File

@ -54,9 +54,6 @@
#ifdef ANDROID
#include <sys/system_properties.h>
#ifdef __arm__
#include <machine/cpu-features.h>
#endif
#endif
#include <boolean.h>
@ -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);

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -18,166 +18,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

View File

@ -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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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);

View File

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

View File

@ -13,6 +13,22 @@
* If not, see <http://www.gnu.org/licenses/>.
*/
#if !defined(_XBOX)
#ifndef _WIN32_WINNT
#define _WIN32_WINNT 0x0601 /* Windows 7 */
#endif
#if !defined(_MSC_VER) || _WIN32_WINNT >= 0x0601
#undef WINVER
#define WINVER 0x0601
#endif
#define IDI_ICON 1
#include <windows.h>
#endif /* !defined(_XBOX) */
#include <retro_miscellaneous.h>
#include <string/stdstring.h>
@ -33,13 +49,6 @@
#if !defined(_XBOX)
#define IDI_ICON 1
#ifndef _WIN32_WINNT
#define _WIN32_WINNT 0x0500 /* _WIN32_WINNT_WIN2K */
#endif
#include <windows.h>
#include <commdlg.h>
#include <dbt.h>
#include "../../retroarch.h"
@ -83,18 +92,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)&current_mon);
#if _WIN32_WINDOWS >= 0x0410 || _WIN32_WINNT >= 0x0410
/* Windows 98 and later codepath */
ChangeDisplaySettingsEx(current_mon.szDevice, NULL, NULL, 0, NULL);
#else
/* Windows 95 / NT codepath */
ChangeDisplaySettings(NULL, 0);
#endif
win32_change_display_settings(current_mon.szDevice, NULL, 0);
}
void win32_monitor_info(void *data, void *hm_data, unsigned *mon_id)
@ -373,10 +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)
{

View File

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

View File

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

View File

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

View File

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

View File

@ -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"
};

View File

@ -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"
};

View File

@ -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