Merge branch 'master' of https://github.com/dolphin-emu/dolphin into pull-upstream-2023-02-25

This commit is contained in:
Nikhil Narayana 2023-02-25 11:48:31 -08:00
commit 79ae6b461e
3867 changed files with 696007 additions and 504379 deletions

View file

@ -9,3 +9,59 @@
# Reformat Android code
248ee12aed057acd0bdd310359c328e8d4fd5e5a
# Enum and struct indentation cleanup
40182a48a56b8e294e126c64f5f37910a40c67cd
ebb48d019eec1c29a37a406e2db16d7565367faa
# SVN line-ending conversion
30c883bcfc65761dc9fb61fea16a25fb61a7e220
3b36e0657140a8f54729f55f94ad108547362ed5
473cd01181be6c8160ce477f25ca6bd39f8cc083
49cfded60bb5b444d1828190eacc52bbb49a9cb8
4a0c8fc0c9b6666e7933683260e2befbc81917ff
4b5b9ad05c10d95c9af43502ecc6877d6e680c4d
4b68a543ba30ec18e79c93b742bc6f110ccd4561
4f889ca1a3cb66ff78f11aa6864edf8ce51b8c93
578c402d2ce5e6a7b6e42a4c7449d9aeac61e5e2
5e81298ef0147bf36c4aaafa35accc2700777bd3
7efbc879e544cba7f205b3eeaeff050f46fd9607
7f4ebed1ddb7ca9aaa49172946fc1f7dc2dc3c75
8151b21ec75107b73a5863177f29d6f69b7174fc
8fca9a8e8d547653581ecb4aac12a09a4311eba3
901fe7c00fec5e2aaf55d184edbcb6d092345d52
90bac5731cc4b15f40be9cf3a51a2c88ca6b53bf
9146b9b261c34f476c9f83934e6da6a463ad51c7
a41c1b2d0a9fab51f8a75ccdb7dba0890f766820
a524cecfabbd4e321485e0cbac9325efde2123ef
ab76cbf2fcf31b059edf10c220800150313ddf18
bbb98d8e2e8259213cc231041eba922471555eb9
e6fe5ec42f025a710918c1aaf8643da36a13bb3e
fc1c7c31a08d55be4c756a1ed599d6afeedd9a11
# Trailing whitespace
c579637eafb9e9eb7f83711569254bd8da6d09d2
664c8d30a055f4762a2a60be77c1c8eaec1a5d85
84ae817c180556badd1a810fceff4c4168672541
8da425b008b46ef90d649e55c6c0d4a0bc2b556b
8f7c6286f4d4b3e1dccc7076012fe6e593e78c8b
# Additional reformatting
40bb9974f21878e64fb03d70e717cb996bf13a29
# Tabs vs spaces
0e3d8e2e9f1b3eab593b09be986c4ff12a0221e2
16a74a9557779cd15890b0a3bb2924cb4b00ad6f
1db10b139cb1f9b92b2e90eb86f236dcd30333b4
1de39a4a6e6b5ef3ec55bd717d4ba02c02ff8d29
2316cb6876e6d79584ce0cc50771d2fb8495fe45
2d4c3c7c918877c844babaa5ac4c23f8a441fb64
31f037b187525d72c10b83695f780ede1ad9db68
3c6d0fc7106131098fe1a79d2deb0f39671c5252
3fd87a7636ff434118a5d7f7334550be8db55c0b
71ef0a02451393b32fc2304008f87d5b29b61444
7ab0cca6455830a838b1b1e38e2c3f265e4e5d0b
d800b5fb74c077522ef7a0752e49968df46e745e
edd9d0e0ef6898a0528ac6389e93e9fca6132ff6
ee61bd6f2e4db8df8e92be6f92c02b808aa92234
ef85b9af45922c6ca364930d40f8aacf1a6dfe64

1
.gitattributes vendored Normal file
View file

@ -0,0 +1 @@
*.sln text eol=crlf

1
.gitignore vendored
View file

@ -3,6 +3,7 @@ Thumbs.db
# Ignore Finder view option files created by OS X
.DS_Store
# Ignore autogenerated source files
Externals/mGBA/version.c
Source/Core/Common/scmrev.h
# Ignore files output by build
/[Bb]uild*/

48
.gitmodules vendored
View file

@ -3,3 +3,51 @@
url = https://github.com/dolphin-emu/ext-win-qt.git
branch = master
shallow = true
[submodule "Externals/mGBA/mgba"]
path = Externals/mGBA/mgba
url = https://github.com/mgba-emu/mgba.git
branch = master
shallow = true
[submodule "Externals/FFmpeg-bin"]
path = Externals/FFmpeg-bin
url = https://github.com/dolphin-emu/ext-win-ffmpeg.git
branch = master
shallow = true
[submodule "libusb"]
path = Externals/libusb/libusb
url = https://github.com/libusb/libusb.git
branch = master
shallow = true
[submodule "Externals/spirv_cross/SPIRV-Cross"]
path = Externals/spirv_cross/SPIRV-Cross
url = https://github.com/KhronosGroup/SPIRV-Cross.git
branch = main
shallow = true
[submodule "SDL"]
path = Externals/SDL/SDL
url = https://github.com/libsdl-org/SDL.git
branch = SDL2
shallow = true
[submodule "Externals/zlib-ng/zlib-ng"]
path = Externals/zlib-ng/zlib-ng
url = https://github.com/zlib-ng/zlib-ng.git
shallow = true
[submodule "Externals/libspng/libspng"]
path = Externals/libspng/libspng
url = https://github.com/randy408/libspng.git
branch = v0.7.2
shallow = true
[submodule "Externals/VulkanMemoryAllocator"]
path = Externals/VulkanMemoryAllocator
url = https://github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator.git
[submodule "Externals/cubeb/cubeb"]
path = Externals/cubeb/cubeb
url = https://github.com/mozilla/cubeb.git
branch = master
shallow = true
[submodule "Externals/implot/implot"]
path = Externals/implot/implot
url = https://github.com/epezent/implot.git
[submodule "Externals/gtest"]
path = Externals/gtest
url = https://github.com/google/googletest.git

View file

@ -1,8 +1,8 @@
[main]
host = https://www.transifex.com
[dolphin-emu.emulator]
file_filter = Languages/po/<lang>.po
source_file = Languages/po/dolphin-emu.pot
source_lang = en-US
type = PO
[main]
host = https://www.transifex.com
[o:delroth:p:dolphin-emu:r:emulator]
file_filter = Languages/po/<lang>.po
source_file = Languages/po/dolphin-emu.pot
source_lang = en-US
type = PO

View file

@ -4,47 +4,23 @@ If you'd like to contribute to the Android project, but do not currently have a
## Prerequisites
* [Android Studio](http://developer.android.com/tools/studio/index.html)
* [Android Studio](https://developer.android.com/studio/)
If you downloaded Android Studio, extract it and then see [Setting up Android Studio](#setting-up-android-studio).
If you downloaded Android Studio, install it with the default options and open the project located in `dolphin/Source/Android`
## Setting up Android Studio
## Setting Up Android Studio
1. Launch Android Studio, which will start a first-launch wizard.
2. Choose a custom installation.
3. If offered a choice of themes, select your preference.
4. When offered a choice of components, uncheck the "Android Virtual Device" option. ![Android Studio Components][components]
5. Accept all licenses, and click Finish. Android Studio will download the SDK Tools package automatically. (Ubuntu users, if you get an error running the `mksdcard` tool, make sure the `lib32stdc++6` package is installed.)
6. At the Android Studio welcome screen, click "Configure", then "SDK Manager".
7. Use the SDK Manager to get necessary dependencies, as described in [Getting Dependencies](#getting-dependencies).
8. When done, follow the steps in [Readme.md](Readme.md#installation-on-android) to compile and deploy the application.
## Executing Gradle Tasks
In Android Studio, you can find a list of possible Gradle tasks in a tray at the top right of the screen:
![Gradle Tasks][gradle]
Double clicking any of these tasks will execute it, and also add it to a short list in the main toolbar:
![Gradle Task Shortcuts][shortcut]
Clicking the green triangle next to this list will execute the currently selected task.
For command-line users, any task may be executed with `Source/Android/gradlew <task-name>`.
## Getting Dependencies
Most dependencies for the Android project are supplied by Gradle automatically. However, Android platform libraries (and a few Google-supplied supplementary libraries) must be downloaded through the Android package manager.
1. Launch the Android SDK Manager by clicking on its icon in Android Studio's main toolbar:
1. Wait for background tasks to complete on the bottom of the window.
2. Launch the Android SDK Manager by clicking on its icon in Android Studio's main toolbar:
![Android Studio Package Icon][package-icon]
2. Install or update the SDK Platform. Choose the API level selected as [compileSdkVersion](Source/Android/app/build.gradle#L5).
3. Install or update the SDK Tools. CMake, LLDB and NDK. If you don't use android-studio, please check out https://github.com/Commit451/android-cmake-installer.
3. Install or update the SDK Platform. Choose the API level as defined in the app module's [build.gradle](Source/Android/app/build.gradle#L7) file.
4. Install a CMake version as defined in the app module's [build.gradle](Source/Android/app/build.gradle#L99) file. The option won't appear until you select `Show Package Details`.
5. Select `Build Variants` on the left side of the window to choose the build variant and ABI you would like to compile for the `:app` module.
6. Select the green hammer icon in the main toolbar to build and create the apk in `Source/Android/app/build/outputs/apk`
In the future, if the project targets a newer version of Android, or use newer versions of the tools/build-tools packages, it will be necessary to use this tool to download updates.
## Compiling from the Command-Line
[components]: http://i.imgur.com/Oo1Fs93.png
[package-icon]: http://i.imgur.com/NUpkAH8.png
[gradle]: http://i.imgur.com/dXIH6o3.png
[shortcut]: http://i.imgur.com/eCWP4Yy.png
For command-line users, any task may be executed with `cd Source/Android` followed by `gradlew <task-name>`. In particular, `gradlew assemble` builds debug and release versions of the application (which are placed in `Source/Android/app/build/outputs/apk`).
[package-icon]: https://i.imgur.com/hgmMlsM.png
[code-style]: https://i.imgur.com/3b3UBhb.png

392
BuildMacOSUniversalBinary.py Executable file
View file

@ -0,0 +1,392 @@
#!/usr/bin/env python3
"""
The current tooling supported in CMake, Homebrew, and Qt5 are insufficient for
creating macOS universal binaries automatically for applications like Dolphin
which have more complicated build requirements (like different libraries, build
flags and source files for each target architecture).
So instead, this script manages the configuration and compilation of distinct
builds and project files for each target architecture and then merges the two
binaries into a single universal binary.
Running this script will:
1) Generate Xcode project files for the ARM build (if project files don't
already exist)
2) Generate Xcode project files for the x64 build (if project files don't
already exist)
3) Build the ARM project for the selected build_target
4) Build the x64 project for the selected build_target
5) Generate universal .app packages combining the ARM and x64 packages
6) Use the lipo tool to combine the binary objects inside each of the
packages into universal binaries
7) Code sign the final universal binaries using the specified
codesign_identity
"""
import argparse
import filecmp
import glob
import json
import multiprocessing
import os
import shutil
import subprocess
# The config variables listed below are the defaults, but they can be
# overridden by command line arguments see parse_args(), or run:
# BuildMacOSUniversalBinary.py --help
DEFAULT_CONFIG = {
# Location of destination universal binary
"dst_app": "universal/",
# Build Target (dolphin-emu to just build the emulator and skip the tests)
"build_target": "ALL_BUILD",
# Location for CMake to search for files (default is for homebrew)
"arm64_cmake_prefix": "/opt/homebrew",
"x86_64_cmake_prefix": "/usr/local",
# Locations to qt5 directories for arm and x64 libraries
# The default values of these paths are taken from the default
# paths used for homebrew
"arm64_qt5_path": "/opt/homebrew/opt/qt5",
"x86_64_qt5_path": "/usr/local/opt/qt5",
# Identity to use for code signing. "-" indicates that the app will not
# be cryptographically signed/notarized but will instead just use a
# SHA checksum to verify the integrity of the app. This doesn't
# protect against malicious actors, but it does protect against
# running corrupted binaries and allows for access to the extended
# permisions needed for ARM builds
"codesign_identity": "-",
# Entitlements file to use for code signing
"entitlements": "../Source/Core/DolphinQt/DolphinEmu.entitlements",
# Minimum macOS version for each architecture slice
"arm64_mac_os_deployment_target": "11.0.0",
"x86_64_mac_os_deployment_target": "10.15.0",
# CMake Generator to use for building
"generator": "Unix Makefiles",
"build_type": "Release",
"run_unit_tests": False,
# Whether we should make a build for Steam.
"steam": False,
# Whether our autoupdate functionality is enabled or not.
"autoupdate": True
}
# Architectures to build for. This is explicity left out of the command line
# config options for several reasons:
# 1) Adding new architectures will generally require more code changes
# 2) Single architecture builds should utilize the normal generated cmake
# project files rather than this wrapper script
ARCHITECTURES = ["x86_64", "arm64"]
def parse_args(conf=DEFAULT_CONFIG):
"""
Parses the command line arguments into a config dictionary.
"""
parser = argparse.ArgumentParser(
formatter_class=argparse.ArgumentDefaultsHelpFormatter)
parser.add_argument(
"--target",
help="Build target in generated project files",
default=conf["build_target"],
dest="build_target")
parser.add_argument(
"-G",
help="CMake Generator to use for creating project files",
default=conf["generator"],
dest="generator")
parser.add_argument(
"--build_type",
help="CMake build type [Debug, Release, RelWithDebInfo, MinSizeRel]",
default=conf["build_type"],
dest="build_type")
parser.add_argument(
"--dst_app",
help="Directory where universal binary will be stored",
default=conf["dst_app"])
parser.add_argument(
"--entitlements",
help="Path to .entitlements file for code signing",
default=conf["entitlements"])
parser.add_argument("--run_unit_tests", action="store_true",
default=conf["run_unit_tests"])
parser.add_argument(
"--steam",
help="Create a build for Steam",
action="store_true",
default=conf["steam"])
parser.add_argument(
"--autoupdate",
help="Enables our autoupdate functionality",
action=argparse.BooleanOptionalAction,
default=conf["autoupdate"])
parser.add_argument(
"--codesign",
help="Code signing identity to use to sign the applications",
default=conf["codesign_identity"],
dest="codesign_identity")
for arch in ARCHITECTURES:
parser.add_argument(
f"--{arch}_cmake_prefix",
help="Folder for cmake to search for packages",
default=conf[arch+"_cmake_prefix"],
dest=arch+"_cmake_prefix")
parser.add_argument(
f"--{arch}_qt5_path",
help=f"Install path for {arch} qt5 libraries",
default=conf[arch+"_qt5_path"])
parser.add_argument(
f"--{arch}_mac_os_deployment_target",
help=f"Deployment architecture for {arch} slice",
default=conf[arch+"_mac_os_deployment_target"])
return vars(parser.parse_args())
def lipo(path0, path1, dst):
if subprocess.call(["lipo", "-create", "-output", dst, path0, path1]) != 0:
print(f"WARNING: {path0} and {path1} cannot be lipo'd")
shutil.copy(path0, dst)
def recursive_merge_binaries(src0, src1, dst):
"""
Merges two build trees together for different architectures into a single
universal binary.
The rules for merging are:
1) Files that exist in either src tree are copied into the dst tree
2) Files that exist in both trees and are identical are copied over
unmodified
3) Files that exist in both trees and are non-identical are lipo'd
4) Symlinks are created in the destination tree to mirror the hierarchy in
the source trees
"""
# Check that all files present in the folder are of the same type and that
# links link to the same relative location
for newpath0 in glob.glob(src0+"/*"):
filename = os.path.basename(newpath0)
newpath1 = os.path.join(src1, filename)
if not os.path.exists(newpath1):
continue
if os.path.islink(newpath0) and os.path.islink(newpath1):
if os.path.relpath(newpath0, src0) == os.path.relpath(newpath1, src1):
continue
if os.path.isdir(newpath0) and os.path.isdir(newpath1):
continue
# isfile() can be true for links so check that both are not links
# before checking if they are both files
if (not os.path.islink(newpath0)) and (not os.path.islink(newpath1)):
if os.path.isfile(newpath0) and os.path.isfile(newpath1):
continue
raise Exception(f"{newpath0} and {newpath1} cannot be " +
"merged into a universal binary because they are of " +
"incompatible types. Perhaps the installed libraries" +
" are from different versions for each architecture")
for newpath0 in glob.glob(src0+"/*"):
filename = os.path.basename(newpath0)
newpath1 = os.path.join(src1, filename)
new_dst_path = os.path.join(dst, filename)
if os.path.islink(newpath0):
# Symlinks will be fixed after files are resolved
continue
if not os.path.exists(newpath1):
if os.path.isdir(newpath0):
shutil.copytree(newpath0, new_dst_path)
else:
shutil.copy(newpath0, new_dst_path)
continue
if os.path.isdir(newpath1):
os.mkdir(new_dst_path)
recursive_merge_binaries(newpath0, newpath1, new_dst_path)
continue
if filecmp.cmp(newpath0, newpath1):
shutil.copy(newpath0, new_dst_path)
else:
lipo(newpath0, newpath1, new_dst_path)
# Loop over files in src1 and copy missing things over to dst
for newpath1 in glob.glob(src1+"/*"):
filename = os.path.basename(newpath1)
newpath0 = os.path.join(src0, filename)
new_dst_path = os.path.join(dst, filename)
if (not os.path.exists(newpath0)) and (not os.path.islink(newpath1)):
if os.path.isdir(newpath1):
shutil.copytree(newpath1, new_dst_path)
else:
shutil.copy(newpath1, new_dst_path)
# Fix up symlinks for path0
for newpath0 in glob.glob(src0+"/*"):
filename = os.path.basename(newpath0)
new_dst_path = os.path.join(dst, filename)
if os.path.islink(newpath0):
relative_path = os.path.relpath(os.path.realpath(newpath0), src0)
os.symlink(relative_path, new_dst_path)
# Fix up symlinks for path1
for newpath1 in glob.glob(src1+"/*"):
filename = os.path.basename(newpath1)
new_dst_path = os.path.join(dst, filename)
newpath0 = os.path.join(src0, filename)
if os.path.islink(newpath1) and not os.path.exists(newpath0):
relative_path = os.path.relpath(os.path.realpath(newpath1), src1)
os.symlink(relative_path, new_dst_path)
def python_to_cmake_bool(boolean):
return "ON" if boolean else "OFF"
def build(config):
"""
Builds the project with the parameters specified in config.
"""
print("Building config:")
print(json.dumps(config, indent=4))
# Configure and build single architecture builds for each architecture
for arch in ARCHITECTURES:
if not os.path.exists(arch):
os.mkdir(arch)
# Place Qt on the prefix path.
prefix_path = config[arch+"_qt5_path"]+';'+config[arch+"_cmake_prefix"]
env = os.environ.copy()
env["CMAKE_OSX_ARCHITECTURES"] = arch
env["CMAKE_PREFIX_PATH"] = prefix_path
# Add the other architecture's prefix path to the ignore path so that
# CMake doesn't try to pick up the wrong architecture's libraries when
# cross compiling.
ignore_path = ""
for a in ARCHITECTURES:
if a != arch:
ignore_path = config[a+"_cmake_prefix"]
subprocess.check_call([
"cmake", "../../", "-G", config["generator"],
"-DCMAKE_BUILD_TYPE=" + config["build_type"],
'-DCMAKE_CXX_FLAGS="-DMACOS_UNIVERSAL_BUILD=1"',
'-DCMAKE_C_FLAGS="-DMACOS_UNIVERSAL_BUILD=1"',
# System name needs to be specified for CMake to use
# the specified CMAKE_SYSTEM_PROCESSOR
"-DCMAKE_SYSTEM_NAME=Darwin",
"-DCMAKE_PREFIX_PATH="+prefix_path,
"-DCMAKE_SYSTEM_PROCESSOR="+arch,
"-DCMAKE_IGNORE_PATH="+ignore_path,
"-DCMAKE_OSX_DEPLOYMENT_TARGET="
+ config[arch+"_mac_os_deployment_target"],
"-DMACOS_CODE_SIGNING_IDENTITY="
+ config["codesign_identity"],
"-DMACOS_CODE_SIGNING_IDENTITY_UPDATER="
+ config["codesign_identity"],
'-DMACOS_CODE_SIGNING="ON"',
"-DSTEAM="
+ python_to_cmake_bool(config["steam"]),
"-DENABLE_AUTOUPDATE="
+ python_to_cmake_bool(config["autoupdate"]),
],
env=env, cwd=arch)
threads = multiprocessing.cpu_count()
subprocess.check_call(["cmake", "--build", ".",
"--config", config["build_type"],
"--parallel", f"{threads}"], cwd=arch)
dst_app = config["dst_app"]
if os.path.exists(dst_app):
shutil.rmtree(dst_app)
# Create and codesign the universal binary/
os.mkdir(dst_app)
# Source binary trees to merge together
src_app0 = ARCHITECTURES[0]+"/Binaries/"
src_app1 = ARCHITECTURES[1]+"/Binaries/"
recursive_merge_binaries(src_app0, src_app1, dst_app)
for path in glob.glob(dst_app+"/*"):
if os.path.isdir(path) and os.path.splitext(path)[1] != ".app":
continue
subprocess.check_call([
"codesign",
"-d",
"--force",
"-s",
config["codesign_identity"],
"--options=runtime",
"--entitlements", config["entitlements"],
"--deep",
"--verbose=2",
path])
print("Built Universal Binary successfully!")
# Build and run unit tests for each architecture
unit_test_results = {}
if config["run_unit_tests"]:
for arch in ARCHITECTURES:
if not os.path.exists(arch):
os.mkdir(arch)
print(f"Building and running unit tests for: {arch}")
unit_test_results[arch] = \
subprocess.call(["cmake", "--build", ".",
"--config", config["build_type"],
"--target", "unittests",
"--parallel", f"{threads}"], cwd=arch)
passed_unit_tests = True
for a in unit_test_results:
code = unit_test_results[a]
passed = code == 0
status_string = "PASSED"
if not passed:
passed_unit_tests = False
status_string = f"FAILED ({code})"
print(a + " Unit Tests: " + status_string)
if not passed_unit_tests:
exit(-1)
print("Passed all unit tests")
if __name__ == "__main__":
conf = parse_args()
build(conf)

View file

@ -1,7 +1,6 @@
find_program(CCACHE_BIN ccache)
find_program(CCACHE_BIN NAMES ccache sccache)
if(CCACHE_BIN)
set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ${CCACHE_BIN})
set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK ${CCACHE_BIN})
# ccache uses -I when compiling without preprocessor, which makes clang complain.
if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")

View file

@ -29,20 +29,27 @@ function(check_and_add_flag var flag)
set(is_c "$<COMPILE_LANGUAGE:C>")
set(is_cxx "$<COMPILE_LANGUAGE:CXX>")
set(test_flags_c)
set(test_flags_cxx)
# The Visual Studio generators don't support COMPILE_LANGUAGE
# So we fail all the C flags and only actually test CXX ones
if(CMAKE_GENERATOR MATCHES "Visual Studio")
set(is_c "0")
set(is_cxx "1")
else()
# Otherwise assume the compile follows GCC syntax
# and fail when the option is known but invalid.
set(test_flags_c "${test_flags_c}-Werror ")
set(test_flags_cxx "${test_flags_cxx}-Werror ")
endif()
check_c_compiler_flag(${flag} FLAG_C_${var})
check_c_compiler_flag("${test_flags_c}${flag}" FLAG_C_${var})
if(FLAG_C_${var})
add_compile_options("$<$<AND:${is_c},${genexp_config_test}>:${flag}>")
endif()
check_cxx_compiler_flag(${flag} FLAG_CXX_${var})
check_cxx_compiler_flag("${test_flags_cxx}${flag}" FLAG_CXX_${var})
if(FLAG_CXX_${var})
add_compile_options("$<$<AND:${is_cxx},${genexp_config_test}>:${flag}>")
endif()

View file

@ -0,0 +1,18 @@
include(RemoveCompileFlag)
macro(dolphin_disable_warnings_msvc _target)
if (MSVC)
get_target_property(_target_cxx_flags ${_target} COMPILE_OPTIONS)
if (_target_cxx_flags)
set(new_flags "")
foreach(flag IN LISTS _target_cxx_flags)
# all warning flags start with "/W" or "/w" or "-W" or "-w"
if (NOT "${flag}" MATCHES "^[-/][Ww]")
list(APPEND new_flags "${flag}")
endif()
endforeach()
set_target_properties(${_target} PROPERTIES COMPILE_OPTIONS "${new_flags}")
endif()
target_compile_options(${_target} PRIVATE "/W0")
endif()
endmacro()

View file

@ -0,0 +1,20 @@
# like add_library(new ALIAS old) but avoids add_library cannot create ALIAS target "new" because target "old" is imported but not globally visible. on older cmake
# This can be replaced with a direct alias call once our minimum is cmake 3.18
function(dolphin_alias_library new old)
string(REPLACE "::" "" library_no_namespace ${old})
if (NOT TARGET _alias_${library_no_namespace})
add_library(_alias_${library_no_namespace} INTERFACE)
target_link_libraries(_alias_${library_no_namespace} INTERFACE ${old})
endif()
add_library(${new} ALIAS _alias_${library_no_namespace})
endfunction()
# Makes an imported target if it doesn't exist. Useful for when find scripts from older versions of cmake don't make the targets you need
function(dolphin_make_imported_target_if_missing target lib)
if(${lib}_FOUND AND NOT TARGET ${target})
add_library(_${lib} INTERFACE)
target_link_libraries(_${lib} INTERFACE "${${lib}_LIBRARIES}")
target_include_directories(_${lib} INTERFACE "${${lib}_INCLUDE_DIRS}")
add_library(${target} ALIAS _${lib})
endif()
endfunction()

15
CMake/FindLIBMGBA.cmake Normal file
View file

@ -0,0 +1,15 @@
find_path(LIBMGBA_INCLUDE_DIR mgba/flags.h)
find_library(LIBMGBA_LIBRARY mgba)
mark_as_advanced(LIBMGBA_INCLUDE_DIR LIBMGBA_LIBRARY)
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(LIBMGBA DEFAULT_MSG
LIBMGBA_INCLUDE_DIR LIBMGBA_LIBRARY)
if(LIBMGBA_FOUND AND NOT mGBA::mgba)
add_library(mGBA::mgba UNKNOWN IMPORTED)
set_target_properties(mGBA::mgba PROPERTIES
IMPORTED_LOCATION "${LIBMGBA_LIBRARY}"
INTERFACE_INCLUDE_DIRECTORIES "${LIBMGBA_INCLUDE_DIR}"
)
endif()

View file

@ -10,7 +10,7 @@ set(MBEDTLS_LIBRARIES ${MBEDTLS_LIBRARY} ${MBEDX509_LIBRARY} ${MBEDCRYPTO_LIBRAR
set(CMAKE_REQUIRED_INCLUDES ${MBEDTLS_INCLUDE_DIRS})
check_cxx_source_compiles("
#include <mbedtls/version.h>
#if MBEDTLS_VERSION_NUMBER < 0x02040000
#if MBEDTLS_VERSION_NUMBER < 0x021C0000
#error \"Your mbed TLS version is too old.\"
#endif
int main() {}"

View file

@ -0,0 +1,4 @@
find_program(POWERSHELL_EXE NAMES powershell)
INCLUDE(FindPackageHandleStandardArgs)
find_package_handle_standard_args(PowerShell DEFAULT_MSG POWERSHELL_EXE)

11
CMake/FlagsOverride.cmake Normal file
View file

@ -0,0 +1,11 @@
if(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
# The default MSVC flags for Release and RelWithDebInfo are poorly chosen
# (see issue https://gitlab.kitware.com/cmake/cmake/-/issues/20812)
# By default, inlining is disabled for RelWithDebInfo.
# Manually redefine MSVC flags to match Visual Studio defaults
# and ensure that Release builds generate debug info.
foreach(f CMAKE_C_FLAGS_RELWITHDEBINFO CMAKE_C_FLAGS_RELEASE CMAKE_CXX_FLAGS_RELWITHDEBINFO CMAKE_CXX_FLAGS_RELEASE)
# optimize, define NDEBUG, generate debug info
set(${f} "/O2 /DNDEBUG /Z7")
endforeach()
endif()

View file

@ -0,0 +1,16 @@
# from https://stackoverflow.com/a/49216539
# The linked answer does some weird preconfiguring by manually splitting the CMAKE_CXX_FLAGS variable and applying it to a target,
# but as far as I can tell none of that is necessary, this works just fine as-is.
#
# Removes the specified compile flag from the specified target.
# _target - The target to remove the compile flag from
# _flag - The compile flag to remove
#
macro(remove_cxx_flag_from_target _target _flag)
get_target_property(_target_cxx_flags ${_target} COMPILE_OPTIONS)
if(_target_cxx_flags)
list(REMOVE_ITEM _target_cxx_flags ${_flag})
set_target_properties(${_target} PROPERTIES COMPILE_OPTIONS "${_target_cxx_flags}")
endif()
endmacro()

View file

@ -1,29 +1,61 @@
########################################
# General setup
#
cmake_minimum_required(VERSION 3.10)
set(CMAKE_OSX_ARCHITECTURES "x86_64")
cmake_minimum_required(VERSION 3.13)
cmake_policy(SET CMP0079 NEW) # let target_link_libraries() link to a target defined in a different directory
cmake_policy(SET CMP0080 OLD) # allow using BundleUtilities at configure time
# Weird chicken-and-egg problem: We can't check the compiler before the project() call, but we have to set the policies before it.
# So we do this in two steps: Set the policies if they exist, then error out afterwards if we end up being MSVC and they don't exist.
if (POLICY CMP0117)
cmake_policy(SET CMP0091 NEW) # MSVC runtime library flags are selected by an abstraction.
cmake_policy(SET CMP0092 NEW) # MSVC warning flags are not in CMAKE_{C,CXX}_FLAGS by default.
cmake_policy(SET CMP0117 NEW) # MSVC RTTI flag will not be added by default.
endif()
if (POLICY CMP0141)
cmake_policy(SET CMP0141 NEW) # MSVC debug information format flags are selected by an abstraction.
endif()
# Minimum OS X version.
# This is inserted into the Info.plist as well.
set(CMAKE_OSX_DEPLOYMENT_TARGET "10.15.0" CACHE STRING "")
# MacOS prior to 10.12 did not fully support C++17, which is used to
# handle configuration options
set(CMAKE_OSX_DEPLOYMENT_TARGET "10.12.0" CACHE STRING "")
set(CMAKE_USER_MAKE_RULES_OVERRIDE "CMake/FlagsOverride.cmake")
project(dolphin-emu)
if (MSVC)
if (POLICY CMP0117)
# cmake is a weird language. You can't do if(not POLICY)
else()
message(FATAL_ERROR "Please update to CMake 3.20 or higher.")
endif()
set(CMAKE_C_STANDARD 99)
set(CMAKE_CXX_STANDARD 23)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
endif()
# Name of the Dolphin distributor. If you redistribute Dolphin builds (forks,
# unofficial builds) please consider identifying your distribution with a
# unique name here.
set(DISTRIBUTOR "None" CACHE STRING "Name of the distributor.")
set(DOLPHIN_DEFAULT_UPDATE_TRACK "" CACHE STRING "Name of the default update track. If empty, disables auto-update.")
if(UNIX AND NOT APPLE AND NOT ANDROID)
option(ENABLE_X11 "Enables X11 Support" ON)
endif()
if(NOT WIN32 AND NOT APPLE)
if(NOT WIN32 AND NOT APPLE AND NOT HAIKU)
option(ENABLE_EGL "Enables EGL OpenGL Interface" ON)
endif()
if(NOT ANDROID)
option(ENABLE_CLI_TOOL "Enable dolphin-tool, a CLI-based utility for functions such as managing disc images" ON)
endif()
option(USE_SHARED_ENET "Use shared libenet if found rather than Dolphin's soon-to-compatibly-diverge version" OFF)
option(USE_UPNP "Enables UPnP port mapping support" ON)
option(ENABLE_NOGUI "Enable NoGUI frontend" ON)
@ -37,6 +69,9 @@ option(ENABLE_LLVM "Enables LLVM support, for disassembly" ON)
option(ENABLE_TESTS "Enables building the unit tests" ON)
option(ENABLE_VULKAN "Enables vulkan video backend" ON)
option(USE_DISCORD_PRESENCE "Enables Discord Rich Presence, show the current game on Discord" ON)
option(USE_MGBA "Enables GBA controllers emulation using libmgba" ON)
option(ENABLE_AUTOUPDATE "Enables support for automatic updates" ON)
option(STEAM "Creates a build for Steam" OFF)
# Maintainers: if you consider blanket disabling this for your users, please
# consider the following points:
@ -52,23 +87,28 @@ option(SLIPPI_PLAYBACK "Enable Playback changes" OFF)
option(ENCODE_FRAMEDUMPS "Encode framedumps in AVI format" ON)
option(ENABLE_GPROF "Enable gprof profiling (must be using Debug build)" OFF)
option(FASTLOG "Enable all logs" OFF)
option(FASTLOG "Enable all logs" OFF)
option(GDBSTUB "Enable gdb stub for remote debugging." OFF)
option(OPROFILING "Enable profiling" OFF)
# TODO: Add DSPSpy
option(DSPTOOL "Build dsptool" OFF)
# Enable SDL for default on operating systems that aren't Android, Linux or Windows.
if(NOT ANDROID AND NOT CMAKE_SYSTEM_NAME STREQUAL "Linux" AND NOT MSVC)
# Enable SDL for default on operating systems that aren't Android or Linux.
if(NOT ANDROID AND NOT CMAKE_SYSTEM_NAME STREQUAL "Linux")
option(ENABLE_SDL "Enables SDL as a generic controller backend" ON)
else()
option(ENABLE_SDL "Enables SDL as a generic controller backend" OFF)
endif()
if(APPLE)
option(OSX_USE_DEFAULT_SEARCH_PATH "Don't prioritize system library paths" OFF)
option(MACOS_USE_DEFAULT_SEARCH_PATH "Don't prioritize system library paths" OFF)
option(SKIP_POSTPROCESS_BUNDLE "Skip postprocessing bundle for redistributability" OFF)
# Enable adhoc code signing by default (otherwise makefile builds on ARM will not work)
option(MACOS_CODE_SIGNING "Enable codesigning" ON)
option(USE_BUNDLED_MOLTENVK "Build MoltenVK from Externals with Dolphin-specific patches" ON)
set(MACOS_CODE_SIGNING_IDENTITY "-" CACHE STRING "The identity used for codesigning.")
set(MACOS_CODE_SIGNING_IDENTITY_UPDATER "-" CACHE STRING "The identity used for codesigning, for the updater.")
endif()
if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
@ -94,14 +134,16 @@ include(CheckAndAddFlag)
include(CheckCCompilerFlag)
include(CheckVendoringApproved)
include(DolphinCompileDefinitions)
include(DolphinDisableWarningsMSVC)
include(DolphinLibraryTools)
include(GNUInstallDirs)
include(RemoveCompileFlag)
# Enable folders for IDE
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
# Set up paths
set(bindir ${CMAKE_INSTALL_PREFIX}/bin CACHE PATH "bindir")
set(datadir ${CMAKE_INSTALL_PREFIX}/share/dolphin-emu CACHE PATH "datadir")
set(mandir ${CMAKE_INSTALL_PREFIX}/share/man CACHE PATH "mandir")
set(datadir ${CMAKE_INSTALL_FULL_DATADIR}/dolphin-emu CACHE PATH "datadir")
add_definitions(-DDATA_DIR="${datadir}/")
if(CMAKE_SYSROOT)
@ -118,14 +160,11 @@ set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/Binaries)
if (WIN32)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/Binary)
if (CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64")
if (CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64|amd64|AMD64")
string(APPEND CMAKE_RUNTIME_OUTPUT_DIRECTORY /x64)
elseif (CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64")
string(APPEND CMAKE_RUNTIME_OUTPUT_DIRECTORY /ARM64)
endif()
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${CMAKE_RUNTIME_OUTPUT_DIRECTORY})
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${CMAKE_RUNTIME_OUTPUT_DIRECTORY})
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_MINSIZEREL ${CMAKE_RUNTIME_OUTPUT_DIRECTORY})
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELWITHDEBINFO ${CMAKE_RUNTIME_OUTPUT_DIRECTORY})
endif()
# setup CCache
@ -209,7 +248,7 @@ elseif(_ARCH_64 AND CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64|amd64|AMD64")
add_definitions(-D_M_X86=1)
add_definitions(-D_M_X86_64=1)
check_and_add_flag(HAVE_SSE2 -msse2)
elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64")
elseif(_ARCH_64 AND CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64|arm64")
set(_M_ARM_64 1)
add_definitions(-D_M_ARM_64=1)
# CRC instruction set is used in the CRC32 hash function
@ -233,29 +272,76 @@ elseif(CMAKE_GENERATOR MATCHES "Visual Studio")
add_compile_options("/MP")
endif()
if(CMAKE_C_COMPILER_ID MATCHES "MSVC")
if(MSVC)
check_and_add_flag(EXCEPTIONS /EHsc)
dolphin_compile_definitions(_DEBUG DEBUG_ONLY)
# Enforce C++ standard conforming conversion rules to catch possible bugs
add_compile_options(/permissive-)
# Remove unreferenced inline functions/data to reduce link time and catch bugs
add_compile_options(/Zc:inline)
# Assume `new` (w/o std::nothrow) throws to reduce binary size
add_compile_options(/Zc:throwingNew)
# Enforce strict volatile semantics as per ISO C++
add_compile_options(/volatile:iso)
# Fix non-conformant lambda behavior (constexpr variables shouldn't need capturing)
add_compile_options(/experimental:newLambdaProcessor)
# Fix various other non-conformant behaviors
add_compile_options(/Zc:externConstexpr,lambda,preprocessor)
# Disable RTTI
add_compile_options(/GR-)
# Temporarily disable warnings to enable /Zc:preprocessor compatibility with WinSDK headers.
# Set warning level 4 (the highest)
add_compile_options(/W4)
# Treat all warnings as errors
add_compile_options(/WX)
# Disable some warnings
add_compile_options(
/wd5105 # macro expansion producing 'defined' has undefined behavior
/wd4201 # nonstandard extension used : nameless struct/union
/wd4127 # conditional expression is constant
/wd4100 # 'identifier' : unreferenced formal parameter
/wd4200 # InputCommon fix temp.
/wd4244 # 'conversion' conversion from 'type1' to 'type2', possible loss of data
/wd4121 # 'symbol' : alignment of a member was sensitive to packing
/wd4324 # Padding was added at the end of a structure because you specified a __declspec(align) value.
/wd4714 # function 'function' marked as __forceinline not inlined
/wd4351 # new behavior: elements of array 'array' will be default initialized
# TODO: Enable this warning once possible
/wd4245 # conversion from 'type1' to 'type2', signed/unsigned mismatch
# Currently jits use some annoying code patterns which makes this common
)
# Additional warnings
add_compile_options(
/w44263 # Non-virtual member function hides base class virtual function
/w44265 # Class has virtual functions, but destructor is not virtual
/w44946 # Reinterpret cast between related types
)
# All files are encoded as UTF-8
add_compile_options(/utf-8)
# Ignore warnings in external headers
add_compile_options(/external:anglebrackets)
add_compile_options(/external:W0)
add_compile_options(/external:templates-)
# Request deterministic builds
add_compile_options(/experimental:deterministic)
add_link_options(/experimental:deterministic)
# Enable function-level linking
add_compile_options(/Gy)
# Generate intrinsic functions
add_compile_options(/Oi)
# Enable buffer security check on Debug, disable otherwise
add_compile_options($<IF:$<CONFIG:Debug>,/GS,/GS->)
# Remove unreferenced inline functions/data to reduce link time and catch bugs
# Note: In msbuild build, this gets set by msbuild by default
add_compile_options(/Zc:inline)
# Fix various other non-conformant behaviors
add_compile_options(/Zc:__cplusplus,enumTypes,externConstexpr,preprocessor,throwingNew)
# Enforce strict volatile semantics as per ISO C++
add_compile_options(/volatile:iso)
# Use 'precise' floating point model
add_compile_options(/fp:precise)
string(APPEND CMAKE_EXE_LINKER_FLAGS " /NXCOMPAT")
# Generate debug data
string(APPEND CMAKE_EXE_LINKER_FLAGS " /DEBUG")
# Eliminate dead code and data
string(APPEND CMAKE_EXE_LINKER_FLAGS " /OPT:REF /OPT:ICF")
else()
add_definitions(-D_DEFAULT_SOURCE)
@ -282,7 +368,7 @@ else()
endif()
if(CMAKE_SYSTEM_NAME MATCHES "Darwin")
if(NOT OSX_USE_DEFAULT_SEARCH_PATH)
if(NOT MACOS_USE_DEFAULT_SEARCH_PATH)
# Hack up the path to prioritize the path to built-in OS libraries to
# increase the chance of not depending on a bunch of copies of them
# installed by MacPorts, Fink, Homebrew, etc, and ending up copying
@ -294,20 +380,24 @@ if(CMAKE_SYSTEM_NAME MATCHES "Darwin")
list(APPEND CMAKE_PREFIX_PATH "/usr")
endif()
# Specify target CPUs.
check_and_add_flag(HAVE_MSSSE3 -mssse3)
check_and_add_flag(HAVE_ARCH_CORE2 -march=core2)
# Prevents Xcode from overriding the -fno-strict-aliasing flag
set(CMAKE_XCODE_ATTRIBUTE_GCC_STRICT_ALIASING NO)
# Specify target CPUs.
if(_ARCH_64 AND CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64|amd64|AMD64")
check_and_add_flag(HAVE_MSSSE3 -mssse3)
check_and_add_flag(HAVE_ARCH_CORE2 -march=core2)
endif()
# Linker flags.
# Drop unreachable code and data.
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-dead_strip,-dead_strip_dylibs")
# Set -fno-objc-exceptions, for consistency with -fno-exceptions earlier.
# Set FMT_EXCEPTIONS = 0, for consistency with -fno-exceptions earlier.
# If we set only -fno-exceptions, fmt fails to compile when included from
# Objective-C++ because fmt tries try to use throw because __EXCEPTIONS is defined.
add_compile_options("$<$<COMPILE_LANGUAGE:OBJC>:-fno-objc-exceptions>")
add_compile_options("$<$<COMPILE_LANGUAGE:OBJCXX>:-fno-objc-exceptions>")
dolphin_compile_definitions(FMT_EXCEPTIONS=0)
add_definitions(-DFMT_EXCEPTIONS=0)
find_library(APPKIT_LIBRARY AppKit)
find_library(APPSERV_LIBRARY ApplicationServices)
@ -323,15 +413,22 @@ if(CMAKE_SYSTEM_NAME MATCHES "Darwin")
endif()
if(ENABLE_LTO)
check_and_add_flag(LTO -flto)
if(CMAKE_CXX_COMPILER_ID STREQUAL GNU)
set(CMAKE_AR gcc-ar)
set(CMAKE_RANLIB gcc-ranlib)
if(CMAKE_C_COMPILER_ID MATCHES "MSVC")
add_compile_options(/GL)
string(APPEND CMAKE_EXE_LINKER_FLAGS " /LTCG")
else()
check_and_add_flag(LTO -flto)
if(CMAKE_CXX_COMPILER_ID STREQUAL GNU)
set(CMAKE_AR gcc-ar)
set(CMAKE_RANLIB gcc-ranlib)
endif()
endif()
endif()
if(UNIX AND LINUX_LOCAL_DEV)
add_definitions(-DLINUX_LOCAL_DEV)
if(UNIX)
if(LINUX_LOCAL_DEV OR (CMAKE_SYSTEM_NAME STREQUAL "Linux" AND STEAM))
add_definitions(-DLINUX_LOCAL_DEV)
endif()
endif()
# BSDs put packages in /usr/local instead of /usr, so we need to
@ -343,6 +440,12 @@ if(CMAKE_SYSTEM_NAME MATCHES "FreeBSD|NetBSD")
set(CMAKE_PREFIX_PATH "${CMAKE_PREFIX_PATH};/usr/local")
set(CMAKE_REQUIRED_INCLUDES "/usr/local/include")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -L/usr/local/lib")
if (CMAKE_CXX_COMPILER_ID MATCHES "Clang" AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 14.0)
# Workaround: the llvm libc++ and versions of clang eariler than 14 have a bug with consteval
# so we define FMT_CONSTEVAL to blank to just disable consteval in fmt
add_definitions(-DFMT_CONSTEVAL=)
endif()
endif()
# Dolphin requires threads.
@ -365,10 +468,6 @@ if(FASTLOG)
add_definitions(-DDEBUGFAST)
endif()
if(GDBSTUB)
add_definitions(-DUSE_GDBSTUB)
endif()
if(ENABLE_VTUNE)
set(VTUNE_DIR "/opt/intel/vtune_amplifier")
add_definitions(-DUSE_VTUNE)
@ -409,12 +508,15 @@ if(ENABLE_HEADLESS)
set(USE_DISCORD_PRESENCE 0)
endif()
# Set file offset size to 64 bits.
# Set file offset size to 64 bits. On modern Unixes, this is typically already the case. Exceptions:
#
# On modern Unixes, this is typically already the case. The lone exception is
# glibc, which may default to 32 bits. glibc allows this to be configured
# by setting _FILE_OFFSET_BITS.
if(NOT CMAKE_SYSTEM_NAME MATCHES "Windows")
# glibc may default to 32 bits. This can be configured by setting _FILE_OFFSET_BITS=64.
#
# bionic (Android) defaults to 32 bits for 32-bit ABIs. Here too we can use _FILE_OFFSET_BITS=64,
# but only on API 25 and up. Since we're currently supporting older API levels and 32-bit Android
# isn't a build configuration we officially support, let's leave this as it is for now.
# More details: https://android.googlesource.com/platform/bionic/+/master/docs/32-bit-abi.md
if(NOT ANDROID AND NOT CMAKE_SYSTEM_NAME MATCHES "Windows")
add_definitions(-D_FILE_OFFSET_BITS=64)
add_definitions(-D_LARGEFILE_SOURCE)
endif()
@ -442,8 +544,6 @@ if(ENABLE_X11)
check_lib(XRANDR xrandr Xrandr)
if(XRANDR_FOUND)
add_definitions(-DHAVE_XRANDR=1)
else()
add_definitions(-DHAVE_XRANDR=0)
endif()
pkg_check_modules(X11_INPUT REQUIRED xi>=1.5.0)
message(STATUS "X11 support enabled")
@ -463,13 +563,29 @@ if(ENABLE_EGL)
endif()
if(ENCODE_FRAMEDUMPS)
if(WIN32 AND _M_X86_64)
set(FFMPEG_DIR Externals/ffmpeg)
if(WIN32)
if(_M_X86_64)
set(FFMPEG_DIR Externals/FFmpeg-bin/x64)
elseif(_M_ARM_64)
set(FFMPEG_DIR Externals/FFmpeg-bin/ARM64)
endif()
endif()
find_package(FFmpeg COMPONENTS avcodec avformat avutil swscale)
find_package(FFmpeg COMPONENTS avcodec avformat avutil swresample swscale)
if(FFmpeg_FOUND)
if(APPLE)
find_library(COREMEDIA_LIBRARY CoreMedia)
find_library(VIDEOTOOLBOX_LIBRARY VideoToolbox)
find_library(COREVIDEO_LIBRARY CoreVideo)
find_library(AUDIOTOOLBOX_LIBRARY AudioToolbox)
endif()
message(STATUS "libav/ffmpeg found, enabling AVI frame dumps")
add_definitions(-DHAVE_FFMPEG)
if(WIN32)
# Our prebuilt binaries depend on Bcrypt
set_property(TARGET FFmpeg::avutil APPEND PROPERTY
INTERFACE_LINK_LIBRARIES "Bcrypt.lib"
)
endif()
else()
message(STATUS "libav/ffmpeg not found, disabling AVI frame dumps")
endif()
@ -504,6 +620,35 @@ if(UNIX)
add_definitions(-DUSE_MEMORYWATCHER=1)
endif()
if(ENABLE_SDL)
find_package(SDL2)
if(SDL2_FOUND)
message(STATUS "Using system SDL2")
else()
message(STATUS "Using static SDL2 from Externals")
option(SDL2_DISABLE_SDL2MAIN "" ON)
option(SDL2_DISABLE_INSTALL "" ON)
option(SDL2_DISABLE_UNINSTALL "" ON)
set(SDL_SHARED OFF)
set(SDL_SHARED_ENABLED_BY_DEFAULT OFF)
set(SDL_STATIC ON)
set(SDL_STATIC_ENABLED_BY_DEFAULT ON)
set(SDL_TEST OFF)
set(SDL_TEST_ENABLED_BY_DEFAULT OFF)
set(OPT_DEF_LIBC ON)
add_subdirectory(Externals/SDL/SDL)
if (TARGET SDL2)
dolphin_disable_warnings_msvc(SDL2)
endif()
if (TARGET SDL2-static)
dolphin_disable_warnings_msvc(SDL2-static)
endif()
set(SDL2_FOUND TRUE)
endif()
add_definitions(-DHAVE_SDL2=1)
endif()
if(ENABLE_ANALYTICS)
message(STATUS "Enabling analytics collection (subject to end-user opt-in)")
add_definitions(-DUSE_ANALYTICS=1)
@ -542,7 +687,7 @@ if (_M_X86)
endif()
add_subdirectory(Externals/cpp-optparse)
find_package(fmt 7.1)
find_package(fmt 8)
if(fmt_FOUND)
message(STATUS "Using shared fmt ${fmt_VERSION}")
else()
@ -552,6 +697,7 @@ else()
include_directories(Externals/fmt/include)
endif()
add_subdirectory(Externals/imgui)
add_subdirectory(Externals/implot)
add_subdirectory(Externals/glslang)
add_subdirectory(Externals/SlippiLib)
include_directories(Externals/SlippiLib)
@ -559,10 +705,15 @@ include_directories(Externals/nlohmann)
add_subdirectory(Externals/semver)
include_directories(Externals/semver/include)
add_subdirectory(Externals/open-vcdiff)
add_subdirectory(Externals/spirv_cross)
include_directories(Externals)
if(ENABLE_VULKAN)
add_definitions(-DHAS_VULKAN)
if(APPLE AND USE_BUNDLED_MOLTENVK)
add_subdirectory(Externals/MoltenVK)
endif()
endif()
if(NOT WIN32 OR (NOT (CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64")))
@ -621,41 +772,33 @@ endif()
# macOS ships with liblzma.dylib but no headers, so check for the headers too
find_package(LibLZMA)
check_include_file(lzma.h HAVE_LZMA_H)
if(LIBLZMA_FOUND AND HAVE_LZMA_H)
if(LIBLZMA_FOUND)
# Imported target added in CMake 3.14
dolphin_make_imported_target_if_missing(LibLZMA::LibLZMA LIBLZMA)
message(STATUS "Using shared lzma")
else()
check_vendoring_approved(lzma)
if(LIBLZMA_FOUND AND NOT HAVE_LZMA_H)
message(STATUS "Shared lzma found but lacks headers, falling back to the static library")
else()
message(STATUS "Shared lzma not found, falling back to the static library")
endif()
message(STATUS "Shared lzma not found, falling back to the static library")
add_subdirectory(Externals/liblzma)
endif()
pkg_check_modules(ZSTD QUIET libzstd>=1.4.0)
if(ZSTD_FOUND AND NOT APPLE)
pkg_check_modules(ZSTD QUIET libzstd>=1.4.0 IMPORTED_TARGET)
# if(ZSTD_FOUND AND NOT APPLE)
if(ZSTD_FOUND)
message(STATUS "Using shared zstd version: " ${ZSTD_VERSION})
dolphin_alias_library(zstd::zstd PkgConfig::ZSTD)
else()
check_vendoring_approved(zstd)
message(STATUS "Shared zstd not found, falling back to the static library")
add_subdirectory(Externals/zstd)
endif()
find_package(ZLIB)
if(ZLIB_FOUND)
message(STATUS "Using shared zlib")
else()
check_vendoring_approved(zlib)
message(STATUS "Shared zlib not found, falling back to the static library")
add_subdirectory(Externals/zlib)
endif()
add_subdirectory(Externals/zlib-ng)
pkg_check_modules(MINIZIP minizip>=2.0.0)
pkg_check_modules(MINIZIP minizip>=3.0.0)
if(MINIZIP_FOUND)
message(STATUS "Using shared minizip")
include_directories(${MINIZIP_INCLUDE_DIRS})
include_directories(${MINIZIP_INCLUDE_DIRS})
else()
check_vendoring_approved(minizip)
message(STATUS "Shared minizip not found, falling back to the static library")
@ -675,16 +818,14 @@ else()
set(LZO lzo2)
endif()
if(NOT APPLE)
check_lib(PNG libpng png png.h QUIET)
endif()
if (PNG_FOUND)
message(STATUS "Using shared libpng")
pkg_check_modules(pc_spng IMPORTED_TARGET spng)
if (pc_spng_FOUND AND TARGET PkgConfig::pc_spng)
message(STATUS "Using the system libspng")
set(spng_target PkgConfig::pc_spng)
else()
check_vendoring_approved(libpng)
message(STATUS "Using static libpng from Externals")
add_subdirectory(Externals/libpng)
set(PNG png)
message(STATUS "Using static libspng from Externals")
add_subdirectory(Externals/libspng)
set(spng_target spng)
endif()
# Using static FreeSurround from Externals
@ -809,10 +950,21 @@ endif()
if(USE_DISCORD_PRESENCE)
message(STATUS "Using static DiscordRPC from Externals")
add_subdirectory(Externals/discord-rpc)
add_subdirectory(Externals/discord-rpc EXCLUDE_FROM_ALL)
include_directories(Externals/discord-rpc/include)
endif()
if(NOT ENABLE_QT)
set(USE_MGBA 0)
endif()
if(USE_MGBA)
find_package(LIBMGBA)
if(NOT LIBMGBA_FOUND)
message(STATUS "Using static libmgba from Externals")
add_subdirectory(Externals/mGBA)
endif()
endif()
find_package(SYSTEMD)
if(SYSTEMD_FOUND)
message(STATUS "libsystemd found, enabling traversal server watchdog support")
@ -821,14 +973,23 @@ else()
message(STATUS "libsystemd not found, disabling traversal server watchdog support")
endif()
if(STEAM)
add_definitions(-DSTEAM)
endif()
if (WIN32)
include_directories(Externals/WIL/include)
include_directories(Externals/OpenAL/include)
endif()
include_directories(Externals/picojson)
add_subdirectory(Externals/expr)
add_subdirectory(Externals/rangeset)
add_subdirectory(Externals/FatFs)
########################################
# Pre-build events: Define configuration variables and write SCM info header
#
@ -838,6 +999,10 @@ else()
set(DOLPHIN_WC_IS_STABLE "0")
endif()
# Remove in-tree revision information generated by Visual Studio
# This is because the compiler will check in-tree first and use this, even if it is outdated
file(REMOVE "${PROJECT_SOURCE_DIR}/Source/Core/Common/scmrev.h")
configure_file(
"${PROJECT_SOURCE_DIR}/Source/Core/Common/scmrev.h.in"
"${PROJECT_BINARY_DIR}/Source/Core/Common/scmrev.h"
@ -849,6 +1014,8 @@ include_directories("${PROJECT_BINARY_DIR}/Source/Core")
#
if(ENABLE_TESTS)
message(STATUS "Using static gtest from Externals")
# Force gtest to link the C runtime dynamically on Windows in order to avoid runtime mismatches.
set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
add_subdirectory(Externals/gtest EXCLUDE_FROM_ALL)
else()
message(STATUS "Unit tests are disabled")
@ -879,9 +1046,9 @@ if(CMAKE_SYSTEM_NAME MATCHES "Linux|FreeBSD|OpenBSD")
DESTINATION ${CMAKE_INSTALL_PREFIX}/share/applications)
# Install manpages
install(FILES Data/dolphin-emu.6
DESTINATION ${mandir}/man6)
DESTINATION ${CMAKE_INSTALL_MANDIR}/man6)
install(FILES Data/dolphin-emu-nogui.6
DESTINATION ${mandir}/man6)
DESTINATION ${CMAKE_INSTALL_MANDIR}/man6)
endif()
# packaging information
@ -901,6 +1068,10 @@ set(CPACK_RPM_PACKAGE_LICENSE GPL-2.0)
# TODO: CPACK_NSIS_*
# TODO: Use CPack components for DSPSpy, etc => cpack_add_component
# Debian Specific. Install dpkg-dev for automatic deps generation
set(CPACK_DEBIAN_PACKAGE_SHLIBDEPS ON)
set(CPACK_DEBIAN_PACKAGE_SECTION "Games")
set(CPACK_SET_DESTDIR ON)
set(CPACK_SOURCE_GENERATOR "TGZ;TBZ2;ZIP")
set(CPACK_SOURCE_IGNORE_FILES "\\\\.#;/#;.*~;\\\\.swp;/\\\\.git")

119
CODE_OF_CONDUCT.md Normal file
View file

@ -0,0 +1,119 @@
# Dolphin Emulator Code of Conduct
Like many Open Source projects and the greater FLOSS community, Dolphin is a
collaborative open source community comprised of a diverse group of
contributors and users from around the globe. We find the contributions,
collaborations, and mentorships within our community to be the essential
lifeblood of our project and appreciate the efforts of those who participate to
nurture and grow those, and all other aspects of our community.
However, when a large and sufficiently diverse group of people work together,
there are often cultural, communication, and compatibility issues. In order to
minimize conflict, and provide a framework for resolution, we have a brief code
of conduct that we ask all participants in the Dolphin community adhere to.
These rules should apply to everyone, regardless of their status within the
community, and anyone can serve to remind, or ask the project leads to help
resolve issues.
No list is ever exhaustive, so we encourage members of the Dolphin community to
adhere to the spirit, rather than the letter, of this code, as that is how it
will be enforced. Places where this code may be particularly applicable are
GitHub issues and pull requests, bug tracker comments, IRC, Discord, forums,
Twitter discussions broadly directed at or between members of the community,
and other direct interactions within the community. Any violations, especially
continued or flagrant offenses, may affect an individuals (or organizations)
ability to participate within the Dolphin community.
If you feel that someone is in violation of the code of conduct, whether in
letter or in spirit, we request that you email as detailed a description as
possible of the offense and offending party/parties to
[conduct@dolphin-emu.org](mailto:conduct@dolphin-emu.org). If you have
questions, concerns, or any other inquiries please feel free to contact the
project leads.
## Rules
1. **Be friendly and patient.** We were all new or suffered from a lack of
knowledge at one point in time. Please try to remember what it felt like to
be on that end, and treat people accordingly.
2. **Be welcoming.** We strive to be a community that welcomes and supports
people of all backgrounds and identities. This includes, but is not limited
to members of any race, ethnicity, culture, national origin, colour,
immigration status, social and economic class, educational level, sex,
sexual orientation, gender identity and expression, age, size, family
status, political belief, religion, and mental and physical ability.
3. **Be helpful.** By helping others to learn our entire ecosystem is enriched.
We encourage members of the Dolphin community to mentor each other and help
to raise the general level of knowledge in the community whenever possible.
4. **Be considerate.** Your work will be used by other people, and you in turn
will depend on the work of others. Any decision you take will affect users
and colleagues, and you should take those consequences into account when
making decisions. Remember that were a world-wide community, so you might
not be communicating in someone elses primary language.
5. **Be respectful.** Not all of us will agree all the time, but disagreement
is no excuse for poor behavior and poor manners. We might all experience
some frustration now and then, but we cannot allow that frustration to turn
into a personal attack. Its important to remember that a community where
people feel uncomfortable or threatened is not a productive one. Members of
the Dolphin community should be respectful when dealing with other members
as well as with people outside the Dolphin community.
6. **Be careful in the words that you choose.** We are a community of
professionals, and we conduct ourselves professionally. Be kind to others.
Do not insult or put down other participants. Harassment and other
exclusionary behavior arent acceptable. This includes, but is not limited
to:
- Violent threats or language directed against another person.
- Discriminatory jokes and language.
- Posting sexually explicit or violent material.
- Posting (or threatening to post) other peoples personally identifying
information (“doxing”), regardless of whether it is publicly available.
- Personal insults, especially those using racist, sexist, or otherwise
discriminatory terms.
- Deliberately referring to others by names or pronouns counter to their
identity.
- Unwelcome sexual attention.
- Advocating for, or encouraging, any of the above behavior.
- Repeated harassment of others. In general, if someone asks you to stop,
then stop.
7. **When we disagree, try to understand why.** Disagreements, both social and
technical, happen all the time and Dolphin is no exception. It is important
that we resolve disagreements and differing views constructively. Remember
that were different. The strength of Dolphin comes from its varied
community, people from a wide range of backgrounds. Different people have
different perspectives on issues. Being unable to understand why someone
holds a viewpoint doesnt mean that theyre wrong. Dont forget that it is
human to err and blaming each other doesnt get us anywhere. Instead, focus
on helping to resolve issues and learning from mistakes.
## Consequences
Except in flagrant or otherwise egregious cases, the first infraction will
result in a verbal warning. Everyone slips up or acts out of frustration at
times, we just ask that you work to not repeat the behavior. Continued
infractions will be dealt with on a case-by-case basis, and could lead to
actions including:
- Temporary suspension from one or all avenues of Dolphin community
participation. This includes, but is not limited to, IRC, Discord, GitHub,
Redmine, and the Dolphin Forums.
- Permanent suspension from participating in the Dolphin community.
Moderators should generally assume good intent when evaluating infractions, but
should also keep in mind that good intent does not override the Code of Conduct
rules.
## Acknowledgments
This text is adapted from the [Asahi Linux Code of
Conduct](https://asahilinux.org/code-of-conduct/), itself derived from the
[Ceph Code of Conduct](https://ceph.io/community/code-of-conduct/), and the
[Django Project Code of Conduct](https://www.djangoproject.com/conduct/). Feel
free to reuse under the terms of the [CC-BY-SA 4.0
license](https://creativecommons.org/licenses/by-sa/4.0/).

10
COPYING Normal file
View file

@ -0,0 +1,10 @@
Most of Dolphin's original source code is licensed under GPLv2+. Part of the
source code distributed in this repository is derived from other projects and
may have stronger or weaker licensing requirement. Overall, in aggregate, the
entirety of this repository is compatible with the GPLv3 license.
Per-file licensing information is provided via SPDX tags [1]. The licenses
referenced in these tags can be found in the LICENSES/ directory within this
source repository.
[1] https://spdx.dev/

View file

@ -7,7 +7,8 @@ If you make any contributions to Dolphin after December 1st, 2014, you are agree
- [Introduction](#introduction)
- [C++ coding style and formatting](#cpp-coding-style-and-formatting)
- [C++ code-specific guidelines](#cpp-code-specific-guidelines)
- [Android and Java](#android-and-java)
- [Android](#android)
- [Help](#help)
# <a name="introduction"></a>Introduction
@ -25,7 +26,6 @@ Following this guide and formatting your code as detailed will likely get your p
This project uses clang-format (stable branch) to check for common style issues. In case of conflicts between this guide and clang-format rules, the latter should be followed instead of this guide.
## <a name="intro-formatting-issues"></a>Checking and fixing formatting issues
Windows users need to be careful about line endings. Windows users should configure git to checkout UNIX-style line endings to keep clang-format simple.
@ -51,6 +51,8 @@ In most cases, clang-format can and **should** be used to automatically reformat
echo '/Source/Core/**/*.mm filter=clang_format' >> .git/info/attributes
```
- Visual Studio supports automatically formatting the current document according to the clang-format configuration by pressing <kbd>Control</kbd>+<kbd>K</kbd> followed by <kbd>Control</kbd>+<kbd>D</kbd> (or selecting Edit &rarr; Advanced &rarr; Format Document). This can be used without separately installing clang-format.
# <a name="cpp-coding-style-and-formatting"></a>C++ coding style and formatting
Summary:
@ -95,7 +97,7 @@ Summary:
- `constexpr int MAX_PATH = 260;`
- All variables should be lowercase with underscores separating the individual words in the name.
- `int this_variable_name;`
- Please do not use [Hungarian notation](http://en.wikipedia.org/wiki/Hungarian_notation) prefixes with variables. The only exceptions to this are the variable prefixes below.
- Please do not use [Hungarian notation](https://en.wikipedia.org/wiki/Hungarian_notation) prefixes with variables. The only exceptions to this are the variable prefixes below.
- Global variables `g_`
- Class variables `m_`
- Static variables `s_`
@ -135,7 +137,7 @@ Summary:
## <a name="cpp-style-classes-and-structs"></a>Classes and structs
- If making a [POD](http://en.wikipedia.org/wiki/Plain_Old_Data_Structures) type, use a `struct` for this. Use a `class` otherwise.
- If making a [POD](https://en.wikipedia.org/wiki/Passive_data_structure) type, use a `struct` for this. Use a `class` otherwise.
- Class layout should be in the order, `public`, `protected`, and then `private`.
- If one or more of these sections are not needed, then simply don't include them.
- For each of the above specified access levels, the contents of each should follow this given order: constructor, destructor, operator overloads, functions, then variables.
@ -172,8 +174,8 @@ Summary:
## <a name="cpp-code-general"></a>General
- The codebase currently uses C++17.
- Use the [nullptr](http://en.cppreference.com/w/cpp/language/nullptr) type over the macro `NULL`.
- If a [range-based for loop](http://en.cppreference.com/w/cpp/language/range-for) can be used instead of container iterators, use it.
- Use the [nullptr](https://en.cppreference.com/w/cpp/language/nullptr) type over the macro `NULL`.
- If a [range-based for loop](https://en.cppreference.com/w/cpp/language/range-for) can be used instead of container iterators, use it.
- Obviously, try not to use `goto` unless you have a *really* good reason for it.
- If a compiler warning is found, please try and fix it.
- Try to avoid using raw pointers (pointers allocated with `new`) as much as possible. There are cases where using a raw pointer is unavoidable, and in these situations it is OK to use them. An example of this is functions from a C library that require them. In cases where it is avoidable, the STL usually has a means to solve this (`vector`, `unique_ptr`, etc).
@ -203,6 +205,7 @@ Summary:
```c++
do
{
// code
} while (false);
```
@ -269,6 +272,15 @@ Summary:
};
```
# <a name="android-and-java"></a>Android and Java
# <a name="android"></a>Android
The Android project is currently written in Java. If you are using Android Studio to contribute, you can import the project's code style from `code-style-java.jar`, located in `[Dolphin Root]/Source/Android`. Please organize imports before committing.
If you are using Kotlin, just use the built-in official Kotlin code style.
To install the Java code style in Android Studio, select the gear icon in the Code Style settings as shown, select `Import Scheme...` and select `dolphin/Source/Android/code-style-java.xml`. The Code Style menu should look like this when complete. ![Code Style Window][code-style]
You can now select any section of code and press `Ctrl + Alt + L` to automatically format it.
# <a name="help"></a>Help
If you have any questions about Dolphin's development or would like some help, Dolphin developers use `#dolphin-emu @ irc.libera.chat` to communicate. If you are new to IRC, [Libera.Chat has resources to get started chatting with IRC.](https://libera.chat/)
[code-style]: https://i.imgur.com/3b3UBhb.png

Binary file not shown.

View file

@ -0,0 +1,15 @@
{
"meta":
{
"title": "Bloom Removal",
"author": "Dolphin Team",
"description": "Skips drawing bloom effects. May be preferable when using a bloom solution from Dolphin's post processing shaders or a third party tool."
},
"features":
[
{
"group": "Bloom",
"action": "skip"
}
]
}

View file

@ -0,0 +1,14 @@
{
"meta":
{
"title": "Remove HUD",
"author": "Dolphin Team",
"description": "Skips drawing elements designated as the HUD. Can be used for taking screenshots or increasing immersion."
},
"features": [
{
"group": "HUD",
"action": "skip"
}
]
}

View file

@ -0,0 +1,20 @@
{
"meta":
{
"title": "Native Resolution Bloom",
"author": "Dolphin Team",
"description": "Scales bloom effects to draw at their native resolution, regardless of internal resolution. Results in bloom looking much more natural at higher resolutions but may cause shimmering."
},
"features":
[
{
"group": "Bloom",
"action": "scale",
"action_data": {
"X": 1.0,
"Y": 1.0,
"Z": 1.0
}
}
]
}

View file

@ -0,0 +1,19 @@
{
"meta":
{
"title": "Bloom Texture Definitions",
"author": "iwubcode"
},
"groups":
[
{
"name": "Bloom",
"targets": [
{
"type": "efb",
"texture_filename": "efb1_n33_160x112_6"
}
]
}
]
}

View file

@ -0,0 +1,19 @@
{
"meta":
{
"title": "Bloom Texture Definitions",
"author": "iwubcode"
},
"groups":
[
{
"name": "Bloom",
"targets": [
{
"type": "efb",
"texture_filename": "efb1_n000023_80x60_6"
}
]
}
]
}

View file

@ -0,0 +1,19 @@
{
"meta":
{
"title": "Bloom Texture Definitions",
"author": "iwubcode"
},
"groups":
[
{
"name": "Bloom",
"targets": [
{
"type": "efb",
"texture_filename": "efb1_n2_320x224_4"
}
]
}
]
}

View file

@ -0,0 +1,47 @@
{
"meta":
{
"title": "HUD definitions",
"author": "iwubcode"
},
"groups": [
{
"name": "HUD",
"targets": [
{
"type": "draw_started",
"prettyname": "map border",
"texture_filename": "tex1_180x180_6e5c9aa7004f377b_1"
},
{
"type": "projection",
"value": "2d",
"prettyname": "map border",
"texture_filename": "tex1_180x180_6e5c9aa7004f377b_1"
},
{
"type": "draw_started",
"prettyname": "map player marker",
"texture_filename": "tex1_64x64_f84b318707ee8455_1"
},
{
"type": "projection",
"value": "2d",
"prettyname": "map player marker",
"texture_filename": "tex1_64x64_f84b318707ee8455_1"
},
{
"type": "draw_started",
"prettyname": "map player facing pointer",
"texture_filename": "tex1_64x64_2ece13b26442de5a_0"
},
{
"type": "projection",
"value": "2d",
"prettyname": "map player facing pointer",
"texture_filename": "tex1_64x64_2ece13b26442de5a_0"
}
]
}
]
}

View file

@ -0,0 +1,23 @@
{
"meta":
{
"title": "Bloom Texture Definitions",
"author": "iwubcode"
},
"groups":
[
{
"name": "Bloom",
"targets": [
{
"type": "efb",
"texture_filename": "efb1_n23_80x57_6"
},
{
"type": "efb",
"texture_filename": "efb1_n22_160x114_6"
}
]
}
]
}

View file

@ -0,0 +1,167 @@
{
"meta":
{
"title": "Bloom and HUD definitions",
"author": "iwubcode"
},
"groups": [
{
"name": "HUD",
"targets": [
{
"type": "draw_started",
"texture_filename": "tex1_96x96_7b5b0f693c1200ad_5"
},
{
"type": "draw_started",
"texture_filename": "tex1_40x48_b510b4434b7de70c_5"
},
{
"type": "draw_started",
"texture_filename": "tex1_96x96_633c30835459df0f_5"
},
{
"type": "draw_started",
"texture_filename": "tex1_24x68_715518a00c14e148_5"
},
{
"type": "draw_started",
"texture_filename": "tex1_32x80_f310048c1139815d_14"
},
{
"type": "draw_started",
"texture_filename": "tex1_12x16_1e9016c61dfffb7a_14"
},
{
"type": "draw_started",
"texture_filename": "tex1_12x16_459c7d7576547909_14"
},
{
"type": "draw_started",
"texture_filename": "tex1_12x16_d1b77f0000ff337a_14"
},
{
"type": "draw_started",
"texture_filename": "tex1_20x16_798aee4dc7001432_14"
},
{
"type": "draw_started",
"texture_filename": "tex1_108x122_911fa08f1554752c_5"
},
{
"type": "draw_started",
"texture_filename": "tex1_64x64_96894941f5454ead_3"
},
{
"type": "draw_started",
"texture_filename": "tex1_8x8_0017d44adaf2291b_14"
},
{
"type": "draw_started",
"texture_filename": "tex1_10x8_7a6a869d5553c4a0_14"
},
{
"type": "draw_started",
"texture_filename": "tex1_16x16_49c191eaf4314e9d_14"
},
{
"type": "draw_started",
"texture_filename": "tex1_18x16_472b403cdcfc31a3_3"
},
{
"type": "draw_started",
"texture_filename": "tex1_30x26_629956a45175e53a_14"
},
{
"type": "projection",
"value": "2d",
"texture_filename": "tex1_96x96_7b5b0f693c1200ad_5"
},
{
"type": "projection",
"value": "2d",
"texture_filename": "tex1_40x48_b510b4434b7de70c_5"
},
{
"type": "projection",
"value": "2d",
"texture_filename": "tex1_96x96_633c30835459df0f_5"
},
{
"type": "projection",
"value": "2d",
"texture_filename": "tex1_24x68_715518a00c14e148_5"
},
{
"type": "projection",
"value": "2d",
"texture_filename": "tex1_32x80_f310048c1139815d_14"
},
{
"type": "projection",
"value": "2d",
"texture_filename": "tex1_12x16_1e9016c61dfffb7a_14"
},
{
"type": "projection",
"value": "2d",
"texture_filename": "tex1_12x16_459c7d7576547909_14"
},
{
"type": "projection",
"value": "2d",
"texture_filename": "tex1_12x16_d1b77f0000ff337a_14"
},
{
"type": "projection",
"value": "2d",
"texture_filename": "tex1_20x16_798aee4dc7001432_14"
},
{
"type": "projection",
"value": "2d",
"texture_filename": "tex1_108x122_911fa08f1554752c_5"
},
{
"type": "projection",
"value": "2d",
"texture_filename": "tex1_64x64_96894941f5454ead_3"
},
{
"type": "projection",
"value": "2d",
"texture_filename": "tex1_8x8_0017d44adaf2291b_14"
},
{
"type": "projection",
"value": "2d",
"texture_filename": "tex1_10x8_7a6a869d5553c4a0_14"
},
{
"type": "projection",
"value": "2d",
"texture_filename": "tex1_16x16_49c191eaf4314e9d_14"
},
{
"type": "projection",
"value": "2d",
"texture_filename": "tex1_18x16_472b403cdcfc31a3_3"
},
{
"type": "projection",
"value": "2d",
"texture_filename": "tex1_30x26_629956a45175e53a_14"
}
]
},
{
"name": "Bloom",
"targets": [
{
"type": "efb",
"texture_filename": "efb1_n1_320x240_6"
}
]
}
]
}

View file

@ -0,0 +1,19 @@
{
"meta":
{
"title": "Bloom Texture Definitions",
"author": "iwubcode"
},
"groups":
[
{
"name": "Bloom",
"targets": [
{
"type": "efb",
"texture_filename": "efb1_n49_152x114_6"
}
]
}
]
}

View file

@ -0,0 +1,31 @@
{
"meta":
{
"title": "Bloom Texture Definitions",
"author": "iwubcode"
},
"groups":
[
{
"name": "Bloom",
"targets": [
{
"type": "efb",
"texture_filename": "efb1_n001461_40x28_1"
},
{
"type": "efb",
"texture_filename": "efb1_n001460_80x56_1"
},
{
"type": "efb",
"texture_filename": "efb1_n001459_160x112_1"
},
{
"type": "efb",
"texture_filename": "efb1_n001458_320x224_1"
}
]
}
]
}

View file

@ -0,0 +1,23 @@
{
"meta":
{
"title": "Bloom Texture Definitions",
"author": "autofire372"
},
"groups":
[
{
"name": "Bloom",
"targets": [
{
"type": "efb",
"texture_filename": "efb1_n000023_320x224_4"
},
{
"type": "efb",
"texture_filename": "efb1_n000024_320x224_4"
}
]
}
]
}

View file

@ -0,0 +1,27 @@
{
"meta":
{
"title": "Bloom Texture Definitions",
"author": "iwubcode"
},
"groups":
[
{
"name": "Bloom",
"targets": [
{
"type": "efb",
"texture_filename": "efb1_n3_80x56_6"
},
{
"type": "efb",
"texture_filename": "efb1_n2_160x112_6"
},
{
"type": "efb",
"texture_filename": "efb1_n6_320x224_6"
}
]
}
]
}

View file

@ -0,0 +1,19 @@
{
"meta":
{
"title": "Bloom Texture Definitions",
"author": "iwubcode"
},
"groups":
[
{
"name": "Bloom",
"targets": [
{
"type": "efb",
"texture_filename": "efb1_n000019_128x128_4"
}
]
}
]
}

View file

View file

@ -0,0 +1,19 @@
{
"meta":
{
"title": "Bloom Texture Definitions",
"author": "iwubcode"
},
"groups":
[
{
"name": "Bloom",
"targets": [
{
"type": "efb",
"texture_filename": "efb1_n51_320x240_6"
}
]
}
]
}

View file

@ -0,0 +1,112 @@
{
"meta":
{
"title": "Bloom and HUD Texture Definitions",
"author": "iwubcode"
},
"groups":
[
{
"name": "HUD",
"targets": [
{
"type": "draw_started",
"pretty_name": "hp_rp",
"texture_filename": "tex1_200x64_29bf40765535b389_fb4403f0539ecfc6_9"
},
{
"type": "projection",
"value": "2d",
"pretty_name": "hp_rp",
"texture_filename": "tex1_200x64_29bf40765535b389_fb4403f0539ecfc6_9"
},
{
"type": "draw_started",
"pretty_name": "hp_gradient",
"texture_filename": "tex1_96x8_491977b196c249d8_1feafe410943bfac_8"
},
{
"type": "projection",
"value": "2d",
"pretty_name": "hp_gradient",
"texture_filename": "tex1_96x8_491977b196c249d8_1feafe410943bfac_8"
},
{
"type": "draw_started",
"pretty_name": "rp_gradient",
"texture_filename": "tex1_96x8_cdcb5c030686767c_2c5a8138bfca228c_8"
},
{
"type": "projection",
"value": "2d",
"pretty_name": "rp_gradient",
"texture_filename": "tex1_96x8_cdcb5c030686767c_2c5a8138bfca228c_8"
},
{
"type": "draw_started",
"pretty_name": "spring_season",
"texture_filename": "tex1_256x40_30d99f26895bc811_02e626cce31a83ae_9"
},
{
"type": "projection",
"value": "2d",
"pretty_name": "spring_season",
"texture_filename": "tex1_256x40_30d99f26895bc811_02e626cce31a83ae_9"
},
{
"type": "draw_started",
"pretty_name": "quick_pick_box",
"texture_filename": "tex1_128x128_b87c102764a80c67_0488ebdbd87cfc9d_9"
},
{
"type": "projection",
"value": "2d",
"pretty_name": "quick_pick_box",
"texture_filename": "tex1_128x128_b87c102764a80c67_0488ebdbd87cfc9d_9"
},
{
"type": "draw_started",
"pretty_name": "face",
"texture_filename": "tex1_48x48_92405f9277895cd2_914f5a4762aa04ae_9"
},
{
"type": "projection",
"value": "2d",
"pretty_name": "face",
"texture_filename": "tex1_48x48_92405f9277895cd2_914f5a4762aa04ae_9"
},
{
"type": "draw_started",
"pretty_name": "sunny_icon",
"texture_filename": "tex1_24x24_3791555ba7e8186f_e82e2316ceba262d_9"
},
{
"type": "projection",
"value": "2d",
"pretty_name": "sunny_icon",
"texture_filename": "tex1_24x24_3791555ba7e8186f_e82e2316ceba262d_9"
},
{
"type": "draw_started",
"pretty_name": "text",
"texture_filename": "tex1_256x256_83aa16840fa69ffb_0"
},
{
"type": "projection",
"value": "2d",
"pretty_name": "text",
"texture_filename": "tex1_256x256_83aa16840fa69ffb_0"
}
]
},
{
"name": "Bloom",
"targets": [
{
"type": "efb",
"texture_filename": "efb1_n000002_320x240_1"
}
]
}
]
}

View file

@ -0,0 +1,27 @@
{
"meta":
{
"title": "Bloom Texture Definitions",
"author": "Silent Hell"
},
"groups":
[
{
"name": "Bloom",
"targets": [
{
"type": "efb",
"texture_filename": "efb1_n000142_38x28_6"
},
{
"type": "efb",
"texture_filename": "efb1_n000143_19x14_6"
},
{
"type": "efb",
"texture_filename": "efb1_n000144_9x7_6"
}
]
}
]
}

View file

@ -0,0 +1,27 @@
{
"meta":
{
"title": "Bloom Texture Definitions",
"author": "iwubcode"
},
"groups":
[
{
"name": "Bloom",
"targets": [
{
"type": "efb",
"texture_filename": "efb1_n000046_57x76_6"
},
{
"type": "efb",
"texture_filename": "efb1_n000045_114x152_6"
},
{
"type": "efb",
"texture_filename": "efb1_n000107_228x304_6"
}
]
}
]
}

View file

@ -0,0 +1,51 @@
{
"meta":
{
"title": "Bloom Texture Definitions",
"author": "Silent Hell"
},
"groups":
[
{
"name": "Bloom",
"targets": [
{
"type": "efb",
"texture_filename": "efb1_n000007_160x120_6"
},
{
"type": "efb",
"texture_filename": "efb1_n000008_160x120_6"
},
{
"type": "efb",
"texture_filename": "efb1_n000009_80x60_6"
},
{
"type": "efb",
"texture_filename": "efb1_n000010_80x60_6"
},
{
"type": "efb",
"texture_filename": "efb1_n000011_40x30_6"
},
{
"type": "efb",
"texture_filename": "efb1_n000012_40x30_6"
},
{
"type": "efb",
"texture_filename": "efb1_n000013_20x15_6"
},
{
"type": "efb",
"texture_filename": "efb1_n000014_20x15_6"
},
{
"type": "efb",
"texture_filename": "efb1_n000015_160x120_6"
}
]
}
]
}

View file

@ -0,0 +1,27 @@
{
"meta":
{
"title": "Bloom Texture Definitions",
"author": "iwubcode"
},
"groups":
[
{
"name": "Bloom",
"targets": [
{
"type": "efb",
"texture_filename": "efb1_n000031_80x57_4"
},
{
"type": "efb",
"texture_filename": "efb1_n000033_160x114_4"
},
{
"type": "efb",
"texture_filename": "efb1_n000038_320x228_4"
}
]
}
]
}

View file

@ -0,0 +1,23 @@
{
"meta":
{
"title": "Bloom Texture Definitions",
"author": "iwubcode"
},
"groups":
[
{
"name": "Bloom",
"targets": [
{
"type": "efb",
"texture_filename": "efb1_n000010_80x57_4"
},
{
"type": "efb",
"texture_filename": "efb1_n000011_160x114_4"
}
]
}
]
}

View file

@ -0,0 +1,68 @@
{
"meta":
{
"title": "Native Resolution Goop",
"author": "Techjar",
"description": "Scales goop maps to draw at their native resolution, regardless of internal resolution. Results in goop having more rounded off edges rather than looking very blocky at higher resolutions."
},
"groups":
[
{
"name": "Goop",
"targets": [
{
"type": "efb",
"texture_filename": "efb1_n000000_32x32_1"
},
{
"type": "efb",
"texture_filename": "efb1_n000000_64x32_1"
},
{
"type": "efb",
"texture_filename": "efb1_n000000_32x64_1"
},
{
"type": "efb",
"texture_filename": "efb1_n000000_64x64_1"
},
{
"type": "efb",
"texture_filename": "efb1_n000000_128x64_1"
},
{
"type": "efb",
"texture_filename": "efb1_n000000_64x128_1"
},
{
"type": "efb",
"texture_filename": "efb1_n000000_128x128_1"
},
{
"type": "efb",
"texture_filename": "efb1_n000000_256x128_1"
},
{
"type": "efb",
"texture_filename": "efb1_n000000_128x256_1"
},
{
"type": "efb",
"texture_filename": "efb1_n000000_256x256_1"
}
]
}
],
"features":
[
{
"group": "Goop",
"action": "scale",
"action_data": {
"X": 1.0,
"Y": 1.0,
"Z": 1.0
}
}
]
}

View file

@ -0,0 +1,31 @@
{
"meta":
{
"title": "Bloom Texture Definitions",
"author": "iwubcode"
},
"groups":
[
{
"name": "Bloom",
"targets": [
{
"type": "efb",
"texture_filename": "efb1_n000022_40x28_6"
},
{
"type": "efb",
"texture_filename": "efb1_n000021_80x56_6"
},
{
"type": "efb",
"texture_filename": "efb1_n000020_160x112_6"
},
{
"type": "efb",
"texture_filename": "efb1_n000025_320x224_6"
}
]
}
]
}

View file

@ -0,0 +1,19 @@
{
"meta":
{
"title": "Bloom Texture Definitions",
"author": "iwubcode"
},
"groups":
[
{
"name": "Bloom",
"targets": [
{
"type": "efb",
"texture_filename": "efb1_n000008_80x60_6"
}
]
}
]
}

View file

@ -0,0 +1,157 @@
{
"meta":
{
"title": "Bloom and HUD Texture Definitions",
"author": "iwubcode"
},
"groups":
[
{
"name": "HUD",
"targets": [
{
"type": "draw_started",
"pretty_name": "faces",
"texture_filename": "tex1_512x256_ff742945bb1f5cd6_14"
},
{
"type": "projection",
"value": "2d",
"pretty_name": "faces",
"texture_filename": "tex1_512x256_ff742945bb1f5cd6_14"
},
{
"type": "draw_started",
"pretty_name": "text",
"texture_filename": "tex1_512x512_09ca8ef639199fa9_0"
},
{
"type": "projection",
"value": "2d",
"pretty_name": "text",
"texture_filename": "tex1_512x512_09ca8ef639199fa9_0"
},
{
"type": "draw_started",
"pretty_name": "text2",
"texture_filename": "tex1_512x512_79e54f19ff7811de_0"
},
{
"type": "projection",
"value": "2d",
"pretty_name": "text2",
"texture_filename": "tex1_512x512_79e54f19ff7811de_0"
},
{
"type": "draw_started",
"pretty_name": "text3",
"texture_filename": "tex1_512x256_cb8c5f14fa63398f_0"
},
{
"type": "projection",
"value": "2d",
"pretty_name": "text3",
"texture_filename": "tex1_512x256_cb8c5f14fa63398f_0"
},
{
"type": "draw_started",
"pretty_name": "text4",
"texture_filename": "tex1_256x256_d315e7747da82c51_2"
},
{
"type": "projection",
"value": "2d",
"pretty_name": "text4",
"texture_filename": "tex1_256x256_d315e7747da82c51_2"
},
{
"type": "draw_started",
"pretty_name": "text5",
"texture_filename": "tex1_256x256_3b4f6a3796d8e193_0"
},
{
"type": "projection",
"value": "2d",
"pretty_name": "text5",
"texture_filename": "tex1_256x256_3b4f6a3796d8e193_0"
},
{
"type": "draw_started",
"pretty_name": "text6",
"texture_filename": "tex1_256x128_50cf981847978524_0"
},
{
"type": "projection",
"value": "2d",
"pretty_name": "text6",
"texture_filename": "tex1_256x128_50cf981847978524_0"
},
{
"type": "draw_started",
"pretty_name": "text7",
"texture_filename": "tex1_128x128_73d3f8a2f0347b4a_0"
},
{
"type": "projection",
"value": "2d",
"pretty_name": "text7",
"texture_filename": "tex1_128x128_73d3f8a2f0347b4a_0"
},
{
"type": "draw_started",
"pretty_name": "large numbers",
"texture_filename": "tex1_128x256_5fd7e727abd256a9_0"
},
{
"type": "projection",
"value": "2d",
"pretty_name": "large numbers",
"texture_filename": "tex1_128x256_5fd7e727abd256a9_0"
},
{
"type": "draw_started",
"pretty_name": "life gradient",
"texture_filename": "tex1_128x64_e3c9e617a9fdf915_14"
},
{
"type": "projection",
"value": "2d",
"pretty_name": "life gradient",
"texture_filename": "tex1_128x64_e3c9e617a9fdf915_14"
},
{
"type": "draw_started",
"pretty_name": "life outline",
"texture_filename": "tex1_128x64_deeeaa33ca3dc0f1_14"
},
{
"type": "projection",
"value": "2d",
"pretty_name": "life outline",
"texture_filename": "tex1_128x64_deeeaa33ca3dc0f1_14"
}
]
},
{
"name": "Bloom",
"targets": [
{
"type": "efb",
"texture_filename": "efb1_n56_80x56_6"
},
{
"type": "efb",
"texture_filename": "efb1_n04_80x56_6"
},
{
"type": "efb",
"texture_filename": "efb1_n359_160x112_1"
},
{
"type": "efb",
"texture_filename": "efb1_n432_320x224_6"
}
]
}
]
}

View file

@ -0,0 +1,23 @@
{
"meta":
{
"title": "Bloom Texture Definitions",
"author": "iwubcode"
},
"groups":
[
{
"name": "Bloom",
"targets": [
{
"type": "efb",
"texture_filename": "efb1_n55_80x57_6"
},
{
"type": "efb",
"texture_filename": "efb1_n54_160x114_6"
}
]
}
]
}

View file

@ -0,0 +1,27 @@
{
"meta":
{
"title": "Bloom Texture Definitions",
"author": "iwubcode"
},
"groups":
[
{
"name": "Bloom",
"targets": [
{
"type": "efb",
"texture_filename": "efb1_n9_80x58_6"
},
{
"type": "efb",
"texture_filename": "efb1_n21_80x57_6"
},
{
"type": "efb",
"texture_filename": "efb1_n2_320x228_6"
}
]
}
]
}

View file

@ -0,0 +1,31 @@
{
"meta":
{
"title": "Bloom Texture Definitions",
"author": "iwubcode"
},
"groups":
[
{
"name": "Bloom",
"targets": [
{
"type": "efb",
"texture_filename": "efb1_n15_20x16_4"
},
{
"type": "efb",
"texture_filename": "efb1_n9_40x30_4"
},
{
"type": "efb",
"texture_filename": "efb1_n7_80x58_4"
},
{
"type": "efb",
"texture_filename": "efb1_n1_320x228_4"
}
]
}
]
}

View file

@ -1,41 +0,0 @@
.text
80003488 000000b8 80003488 0 __fill_mem
80003540 00000050 80003540 0 memcpy
8006cff8 0000004c 8006cff8 0 .LoadQuantizers
8006d044 0000002c 8006d044 0 .kill_infinites_helper
8006d070 00000018 8006d070 0 .kill_infinites
8006d088 0000002c 8006d088 0 .rsqrt
8006d0b4 00000034 8006d0b4 0 .sqrt_internal_fz
8006d0e8 00000030 8006d0e8 0 .rsqrt_internal_fz
8006d118 00000070 8006d118 0 .sqrt_fz
8006d188 00000030 8006d188 0 .wrapping_once_fp_lookup
8006d1b8 00000064 8006d1b8 0 .weird2
8006d1c4 00000058 8006d1c4 0 .into_weird2
8006d21c 00000030 8006d21c 0 .lookup_some_float_in_table_with_neg_wrap
8006d24c 00000184 8006d24c 0 .atan2
8006d3d0 0000009c 8006d3d0 0 .asin_fz
8006d46c 000000c8 8006d46c 0 .acos_fz
8006d534 00000070 8006d534 0 .evil_vec_cosine
8006d5f0 00000078 8006d5f0 0 .evil_vec_setlength
8006d668 00000094 8006d668 0 .evil_vec_something
8006d6fc 0000005c 8006d6fc 0 .func
8006d784 0000002c 8006d784 0 .load_strange_matrix1
8006d7b0 0000002c 8006d7b0 0 .load_strange_matrix2
8006d7f4 0000003c 8006d7f4 0 .some_strange_destination
8006db30 00000044 8006db30 0 .push_matrix_3x3?
8006db74 00000038 8006db74 0 .write_top_3x3_matrix
8006dbe4 0000003c 8006dbe4 0 .read_current_3x3_matrix
8006dc20 00000014 8006dc20 0 .pop_matrix_stack
8006e424 00000074 8006e424 0 .weird_param_in_p1_p2
8006e978 000001d4 8006e978 0 zz_006e978_
8006eb4c 000001c0 8006eb4c 0 zz_006eb4c_
8006f6a8 000000cc 8006f6a8 0 .z_last_skum_function
800798f0 000000ec 800798f0 0 __div2u
800799dc 00000138 800799dc 0 __div2i
80079b14 000000e0 80079b14 0 __mod2u
80079bf8 0000010c 80079bf8 0 __mod2i
80079d04 00000024 80079d04 0 __shl2i
80079d28 00000024 80079d28 0 __shr2u
80079d4c 00000028 80079d4c 0 __shr2i
8008596c 00000310 8008596c 0 big_matrix_trickery
80088538 00000020 80088538 0 zz_0088538_

View file

@ -1,34 +0,0 @@
.text
800031f0 0000001c 800031f0 0 load_sp_rtoc
80007034 0000004c 80007034 0 .LoadQuantizers
80007080 00000030 80007080 0 .LoadInfinitiesEtc
800070b0 00000038 800070b0 0 .rsqrt
800070ec 00000040 800070ec 0 .sqrt_internal_needs_cr1
8000712c 00000040 8000712c 0 .rsqrt_internal_needs_cr1
800071e0 00000030 800071e0 0 .wrapping_once_fp_lookup
80007210 00000064 80007210 0 .weird2
80007274 00000030 80007274 0 .lookup_some_float_in_table_with_neg_wrap
800072a4 00000180 800072a4 0 .atan2
80007424 000000b8 80007424 0 .calls_sqrt
800074dc 0000005c 800074dc 0 .func
80007538 0000002c 80007538 0 .load_strange_matrix1
80007564 0000002c 80007564 0 .load_strange_matrix3
80007590 0000002c 80007590 0 .load_strange_matrix2
80007834 00000044 80007834 0 .push_matrix_3x3?
80007878 00000038 80007878 0 .read_top_3x3matrix
800078b0 00000038 800078b0 0 .write_top_3x3_matrix
800078e8 0000003c 800078e8 0 .read_current_3x3_matrix
80007924 00000014 80007924 0 .pop_matrix_stack
80007a50 00000170 80007a50 0 .mult_matrix?
80007ecc 000000bc 80007ecc 0 .weird_vector_op_status_in_cr2
80007f88 00000074 80007f88 0 .weird_param_in_p1_p2
800080fc 00000078 800080fc 0 .evil_normalize
80008174 00000078 80008174 0 .evil_vec_setlength
800081ec 00000070 800081ec 0 .evil_vec_cosine
80008538 000000f0 80008538 0 .calls_evil1
8000875c 00000088 8000875c 0 .another_caller
800087e4 0000008c 800087e4 0 .another_caller2
80008d30 000001b4 80008d30 0 .another_caller3
80036544 000001b4 80036544 0 .fctiwi_weird2
8003dd1c 00000110 8003dd1c 0 .fctwi_weird
80043b48 000005bc 80043b48 0 .fctwi_weird3

Binary file not shown.

Before

Width:  |  Height:  |  Size: 215 B

After

Width:  |  Height:  |  Size: 256 B

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 308 B

After

Width:  |  Height:  |  Size: 368 B

Before After
Before After

Binary file not shown.

After

Width:  |  Height:  |  Size: 672 B

View file

@ -0,0 +1,182 @@
// Set aspect ratio to 'stretch'
// Integer Scaling shader by One_More_Try / TryTwo
// Uses Sharp Bilinear from
// https://github.com/libretro/slang-shaders/blob/master/interpolation/shaders/sharp-bilinear.slang
// by Themaister, Public Domain license
/*
[configuration]
[OptionBool]
GUIName = Please set aspect ratio to stretch
OptionName = ASPECT_MSG
DefaultValue = false
[OptionBool]
GUIName = Use non-integer width
OptionName = WIDTH_UNLOCK
DefaultValue = false
[OptionBool]
GUIName = Stretch width to window
OptionName = WIDTH_SKIP
DependentOption = WIDTH_UNLOCK
DefaultValue = false
[OptionBool]
GUIName = Scale width to fit 4:3
OptionName = WIDTH_43
DependentOption = WIDTH_UNLOCK
DefaultValue = false
[OptionBool]
GUIName = Scale width to fit 16:9
OptionName = WIDTH_169
DependentOption = WIDTH_UNLOCK
DefaultValue = false
[OptionBool]
GUIName = Apply sharp bilinear for custom widths
OptionName = SHARP_BILINEAR
DefaultValue = false
[OptionRangeFloat]
GUIName = Sharp bilinear factor (0 = auto)
OptionName = SHARP_PRESCALE
MinValue = 0.0
MaxValue = 16.0
StepAmount = 1.0
DefaultValue = 0.0
[OptionBool]
GUIName = Manual scale - Set IR first
OptionName = MANUALSCALE
DefaultValue = false
[OptionRangeFloat]
GUIName = Integer scale - No higher than IR
OptionName = INTEGER_SCALE
DependentOption = MANUALSCALE
MaxValue = 5.0
MinValue = 1.0
DefaultValue = 1.0
StepAmount = 1.0
[OptionRangeFloat]
GUIName = Scale width
OptionName = WIDTH_SCALE
DependentOption = MANUALSCALE
MaxValue = 5.0
MinValue = -2.0
DefaultValue = 0.0
StepAmount = 1.0
[OptionBool]
GUIName = Auto downscaling
OptionName = DOWNSCALE
DefaultValue = false
[/configuration]
*/
void main()
{
float4 c0 = float4(0.0, 0.0, 0.0, 0.0);
float2 scale = float2(1.0, 1.0);
float2 xfb_res = GetResolution();
float2 win_res = GetWindowResolution();
float2 coords = GetCoordinates();
// ratio is used to rescale the coords to the xfb size, which allows for integer scaling.
// ratio can then be multiplied by an integer to upscale/downscale, but upscale isn't supported by
// point-sampling.
float2 ratio = win_res / xfb_res;
if (OptionEnabled(WIDTH_UNLOCK))
{
if (OptionEnabled(WIDTH_SKIP))
ratio.x = 1.0;
else if (OptionEnabled(WIDTH_43))
ratio.x = win_res.x / (xfb_res.y * 4 / 3);
else if (OptionEnabled(WIDTH_169))
ratio.x = win_res.x / (xfb_res.y * 16 / 9);
}
if (OptionEnabled(MANUALSCALE))
{
// There's no IR variable, so this guesses the IR, but may be off for some games.
float calc_ir = ceil(xfb_res.y / 500);
scale.y = calc_ir / GetOption(INTEGER_SCALE);
float manual_width = GetOption(WIDTH_SCALE);
if (manual_width < 0.0)
scale.x = scale.y * (abs(manual_width) + 1);
else
scale.x = scale.y / (manual_width + 1);
ratio = ratio * scale;
}
else if (OptionEnabled(DOWNSCALE) && (ratio.x < 1 || ratio.y < 1))
{
scale.x = ceil(max(1.0 / ratio.y, 1.0 / ratio.x));
scale.y = scale.x;
ratio = ratio * scale;
}
// y and x are used to determine black bars vs drawable space.
float y = win_res.y - xfb_res.y / scale.y;
float y_top = (y / 2.0) * GetInvWindowResolution().y;
float y_bottom = (win_res.y - y / 2.0) * GetInvWindowResolution().y;
float yloc = (coords.y - y_top) * ratio.y;
float x = win_res.x - xfb_res.x / scale.x;
if (OptionEnabled(WIDTH_UNLOCK))
{
if (OptionEnabled(WIDTH_SKIP))
x = 0.0;
else if (OptionEnabled(WIDTH_43))
x = win_res.x - xfb_res.y / scale.y * 4 / 3;
else if (OptionEnabled(WIDTH_169))
x = win_res.x - xfb_res.y / scale.y * 16 / 9;
}
float x_left = (x / 2.0) * GetInvWindowResolution().x;
float x_right = (win_res.x - x / 2.0) * GetInvWindowResolution().x;
float xloc = (coords.x - x_left) * ratio.x;
if (OptionEnabled(SHARP_BILINEAR) &&
(OptionEnabled(WIDTH_SKIP) || OptionEnabled(WIDTH_43) || OptionEnabled(WIDTH_169) ||
(OptionEnabled(MANUALSCALE) && GetOption(WIDTH_SCALE) != 0.0)))
{
float texel = xloc * xfb_res.x;
float texel_floored = floor(texel);
float s = frac(texel);
float scale_sharp = GetOption(SHARP_PRESCALE);
if (scale_sharp == 0)
{
if (OptionEnabled(WIDTH_43))
scale_sharp = (4 / 3 * xfb_res.y / xfb_res.x);
else if (OptionEnabled(WIDTH_169))
scale_sharp = (16 / 9 * xfb_res.y / xfb_res.x);
else
scale_sharp = ceil(win_res.x / xfb_res.x);
}
float region_range = 0.5 - 0.5 / scale_sharp;
float center_dist = s - 0.5;
float f = (center_dist - clamp(center_dist, -region_range, region_range)) * scale_sharp + 0.5;
float mod_texel = texel_floored + f;
xloc = mod_texel / xfb_res.x;
}
if (coords.x >= x_left && x_right >= coords.x && coords.y >= y_top && y_bottom >= coords.y)
{
float2 sample_loc = float2(xloc, yloc);
c0 = SampleLocation(sample_loc);
}
SetOutput(c0);
}

View file

@ -53,7 +53,7 @@ void main()
float offsetAdd;
// layer0 = left eye, layer1 = right eye
if (layer == 1)
if (src_layer == 1)
{
offsetAdd = stereoOffset;
}
@ -63,7 +63,7 @@ void main()
}
// convert coordinates to NDC space
float2 fragPos = (GetCoordinates() - 0.5f - vec2(offsetAdd, 0.0f)) * 2.0f;
float2 fragPos = (GetCoordinates() - 0.5f - float2(offsetAdd, 0.0f)) * 2.0f;
// Calculate the source location "radius" (distance from the centre of the viewport)
float destR = length(fragPos);
@ -72,16 +72,16 @@ void main()
float srcR = destR * sizeAdjust + ( ka * pow(destR, 2.0) + kb * pow(destR, 4.0));
// Calculate the source vector (radial)
vec2 correctedRadial = normalize(fragPos) * srcR;
float2 correctedRadial = normalize(fragPos) * srcR;
// fix aspect ratio
vec2 widenedRadial = correctedRadial * vec2(aspectAdjustment, 1.0f);
float2 widenedRadial = correctedRadial * float2(aspectAdjustment, 1.0f);
// Transform the coordinates (from [-1,1]^2 to [0, 1]^2)
vec2 uv = (widenedRadial/2.0f) + vec2(0.5f) + vec2(offsetAdd, 0.0f);
float2 uv = (widenedRadial/2.0f) + float2(0.5f, 0.5f) + float2(offsetAdd, 0.0f);
// Sample the texture at the source location
if(clamp(uv, 0.0, 1.0) != uv)
if(any(clamp(uv, 0.0, 1.0) != uv))
{
// black if beyond bounds
SetOutput(float4(0.0, 0.0, 0.0, 0.0));

View file

@ -0,0 +1,47 @@
// Based on https://github.com/libretro/slang-shaders/blob/master/interpolation/shaders/sharp-bilinear.slang
// by Themaister, Public Domain license
// Does a bilinear stretch, with a preapplied Nx nearest-neighbor scale,
// giving a sharper image than plain bilinear.
/*
[configuration]
[OptionRangeFloat]
GUIName = Prescale Factor (set to 0 for automatic)
OptionName = PRESCALE_FACTOR
MinValue = 0.0
MaxValue = 16.0
StepAmount = 1.0
DefaultValue = 0.0
[/configuration]
*/
float CalculatePrescale(float config_scale) {
if (config_scale == 0.0) {
float2 source_size = GetResolution();
float2 window_size = GetWindowResolution();
return ceil(max(window_size.x / source_size.x, window_size.y / source_size.y));
} else {
return config_scale;
}
}
void main()
{
float2 source_size = GetResolution();
float2 texel = GetCoordinates() * source_size;
float2 texel_floored = floor(texel);
float2 s = fract(texel);
float config_scale = GetOption(PRESCALE_FACTOR);
float scale = CalculatePrescale(config_scale);
float region_range = 0.5 - 0.5 / scale;
// Figure out where in the texel to sample to get correct pre-scaled bilinear.
// Uses the hardware bilinear interpolator to avoid having to sample 4 times manually.
float2 center_dist = s - 0.5;
float2 f = (center_dist - clamp(center_dist, -region_range, region_range)) * scale + 0.5;
float2 mod_texel = texel_floored + f;
SetOutput(SampleLocation(mod_texel / source_size));
}

View file

@ -1,4 +1,4 @@
void main()
{
SetOutput(Sample());
SetOutput(Sample().gbra);
}

View file

@ -1,4 +1,4 @@
void main()
{
SetOutput(Sample());
SetOutput(Sample().grba);
}

View file

@ -4,6 +4,7 @@ add_library(bdisasm STATIC
resolve.cc
syntax.cc
)
dolphin_disable_warnings_msvc(bdisasm)
if (WIN32)
target_sources(bdisasm

13
Externals/Bochs_disasm/exports.props vendored Normal file
View file

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<Project>
<ItemDefinitionGroup>
<ClCompile>
<AdditionalIncludeDirectories>$(ExternalsDir)Bochs_disasm;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
</ItemDefinitionGroup>
<ItemGroup>
<ProjectReference Include="$(ExternalsDir)Bochs_disasm\Bochs_disasm.vcxproj">
<Project>{8ada04d7-6db1-4da4-ab55-64fb12a0997b}</Project>
</ProjectReference>
</ItemGroup>
</Project>

1
Externals/FFmpeg-bin vendored Submodule

@ -0,0 +1 @@
Subproject commit 9bc087fbca36ce5a85eb4fd73f0c73813593e5a2

359
Externals/FatFs/00history.txt vendored Normal file
View file

@ -0,0 +1,359 @@
----------------------------------------------------------------------------
Revision history of FatFs module
----------------------------------------------------------------------------
R0.00 (February 26, 2006)
Prototype.
R0.01 (April 29, 2006)
The first release.
R0.02 (June 01, 2006)
Added FAT12 support.
Removed unbuffered mode.
Fixed a problem on small (<32M) partition.
R0.02a (June 10, 2006)
Added a configuration option (_FS_MINIMUM).
R0.03 (September 22, 2006)
Added f_rename().
Changed option _FS_MINIMUM to _FS_MINIMIZE.
R0.03a (December 11, 2006)
Improved cluster scan algorithm to write files fast.
Fixed f_mkdir() creates incorrect directory on FAT32.
R0.04 (February 04, 2007)
Added f_mkfs().
Supported multiple drive system.
Changed some interfaces for multiple drive system.
Changed f_mountdrv() to f_mount().
R0.04a (April 01, 2007)
Supported multiple partitions on a physical drive.
Added a capability of extending file size to f_lseek().
Added minimization level 3.
Fixed an endian sensitive code in f_mkfs().
R0.04b (May 05, 2007)
Added a configuration option _USE_NTFLAG.
Added FSINFO support.
Fixed DBCS name can result FR_INVALID_NAME.
Fixed short seek (<= csize) collapses the file object.
R0.05 (August 25, 2007)
Changed arguments of f_read(), f_write() and f_mkfs().
Fixed f_mkfs() on FAT32 creates incorrect FSINFO.
Fixed f_mkdir() on FAT32 creates incorrect directory.
R0.05a (February 03, 2008)
Added f_truncate() and f_utime().
Fixed off by one error at FAT sub-type determination.
Fixed btr in f_read() can be mistruncated.
Fixed cached sector is not flushed when create and close without write.
R0.06 (April 01, 2008)
Added fputc(), fputs(), fprintf() and fgets().
Improved performance of f_lseek() on moving to the same or following cluster.
R0.07 (April 01, 2009)
Merged Tiny-FatFs as a configuration option. (_FS_TINY)
Added long file name feature. (_USE_LFN)
Added multiple code page feature. (_CODE_PAGE)
Added re-entrancy for multitask operation. (_FS_REENTRANT)
Added auto cluster size selection to f_mkfs().
Added rewind option to f_readdir().
Changed result code of critical errors.
Renamed string functions to avoid name collision.
R0.07a (April 14, 2009)
Septemberarated out OS dependent code on reentrant cfg.
Added multiple sector size feature.
R0.07c (June 21, 2009)
Fixed f_unlink() can return FR_OK on error.
Fixed wrong cache control in f_lseek().
Added relative path feature.
Added f_chdir() and f_chdrive().
Added proper case conversion to extended character.
R0.07e (November 03, 2009)
Septemberarated out configuration options from ff.h to ffconf.h.
Fixed f_unlink() fails to remove a sub-directory on _FS_RPATH.
Fixed name matching error on the 13 character boundary.
Added a configuration option, _LFN_UNICODE.
Changed f_readdir() to return the SFN with always upper case on non-LFN cfg.
R0.08 (May 15, 2010)
Added a memory configuration option. (_USE_LFN = 3)
Added file lock feature. (_FS_SHARE)
Added fast seek feature. (_USE_FASTSEEK)
Changed some types on the API, XCHAR->TCHAR.
Changed .fname in the FILINFO structure on Unicode cfg.
String functions support UTF-8 encoding files on Unicode cfg.
R0.08a (August 16, 2010)
Added f_getcwd(). (_FS_RPATH = 2)
Added sector erase feature. (_USE_ERASE)
Moved file lock semaphore table from fs object to the bss.
Fixed f_mkfs() creates wrong FAT32 volume.
R0.08b (January 15, 2011)
Fast seek feature is also applied to f_read() and f_write().
f_lseek() reports required table size on creating CLMP.
Extended format syntax of f_printf().
Ignores duplicated directory separators in given path name.
R0.09 (September 06, 2011)
f_mkfs() supports multiple partition to complete the multiple partition feature.
Added f_fdisk().
R0.09a (August 27, 2012)
Changed f_open() and f_opendir() reject null object pointer to avoid crash.
Changed option name _FS_SHARE to _FS_LOCK.
Fixed assertion failure due to OS/2 EA on FAT12/16 volume.
R0.09b (January 24, 2013)
Added f_setlabel() and f_getlabel().
R0.10 (October 02, 2013)
Added selection of character encoding on the file. (_STRF_ENCODE)
Added f_closedir().
Added forced full FAT scan for f_getfree(). (_FS_NOFSINFO)
Added forced mount feature with changes of f_mount().
Improved behavior of volume auto detection.
Improved write throughput of f_puts() and f_printf().
Changed argument of f_chdrive(), f_mkfs(), disk_read() and disk_write().
Fixed f_write() can be truncated when the file size is close to 4GB.
Fixed f_open(), f_mkdir() and f_setlabel() can return incorrect value on error.
R0.10a (January 15, 2014)
Added arbitrary strings as drive number in the path name. (_STR_VOLUME_ID)
Added a configuration option of minimum sector size. (_MIN_SS)
2nd argument of f_rename() can have a drive number and it will be ignored.
Fixed f_mount() with forced mount fails when drive number is >= 1. (appeared at R0.10)
Fixed f_close() invalidates the file object without volume lock.
Fixed f_closedir() returns but the volume lock is left acquired. (appeared at R0.10)
Fixed creation of an entry with LFN fails on too many SFN collisions. (appeared at R0.07)
R0.10b (May 19, 2014)
Fixed a hard error in the disk I/O layer can collapse the directory entry.
Fixed LFN entry is not deleted when delete/rename an object with lossy converted SFN. (appeared at R0.07)
R0.10c (November 09, 2014)
Added a configuration option for the platforms without RTC. (_FS_NORTC)
Changed option name _USE_ERASE to _USE_TRIM.
Fixed volume label created by Mac OS X cannot be retrieved with f_getlabel(). (appeared at R0.09b)
Fixed a potential problem of FAT access that can appear on disk error.
Fixed null pointer dereference on attempting to delete the root direcotry. (appeared at R0.08)
R0.11 (February 09, 2015)
Added f_findfirst(), f_findnext() and f_findclose(). (_USE_FIND)
Fixed f_unlink() does not remove cluster chain of the file. (appeared at R0.10c)
Fixed _FS_NORTC option does not work properly. (appeared at R0.10c)
R0.11a (September 05, 2015)
Fixed wrong media change can lead a deadlock at thread-safe configuration.
Added code page 771, 860, 861, 863, 864, 865 and 869. (_CODE_PAGE)
Removed some code pages actually not exist on the standard systems. (_CODE_PAGE)
Fixed errors in the case conversion teble of code page 437 and 850 (ff.c).
Fixed errors in the case conversion teble of Unicode (cc*.c).
R0.12 (April 12, 2016)
Added support for exFAT file system. (_FS_EXFAT)
Added f_expand(). (_USE_EXPAND)
Changed some members in FINFO structure and behavior of f_readdir().
Added an option _USE_CHMOD.
Removed an option _WORD_ACCESS.
Fixed errors in the case conversion table of Unicode (cc*.c).
R0.12a (July 10, 2016)
Added support for creating exFAT volume with some changes of f_mkfs().
Added a file open method FA_OPEN_APPEND. An f_lseek() following f_open() is no longer needed.
f_forward() is available regardless of _FS_TINY.
Fixed f_mkfs() creates wrong volume. (appeared at R0.12)
Fixed wrong memory read in create_name(). (appeared at R0.12)
Fixed compilation fails at some configurations, _USE_FASTSEEK and _USE_FORWARD.
R0.12b (September 04, 2016)
Made f_rename() be able to rename objects with the same name but case.
Fixed an error in the case conversion teble of code page 866. (ff.c)
Fixed writing data is truncated at the file offset 4GiB on the exFAT volume. (appeared at R0.12)
Fixed creating a file in the root directory of exFAT volume can fail. (appeared at R0.12)
Fixed f_mkfs() creating exFAT volume with too small cluster size can collapse unallocated memory. (appeared at R0.12)
Fixed wrong object name can be returned when read directory at Unicode cfg. (appeared at R0.12)
Fixed large file allocation/removing on the exFAT volume collapses allocation bitmap. (appeared at R0.12)
Fixed some internal errors in f_expand() and f_lseek(). (appeared at R0.12)
R0.12c (March 04, 2017)
Improved write throughput at the fragmented file on the exFAT volume.
Made memory usage for exFAT be able to be reduced as decreasing _MAX_LFN.
Fixed successive f_getfree() can return wrong count on the FAT12/16 volume. (appeared at R0.12)
Fixed configuration option _VOLUMES cannot be set 10. (appeared at R0.10c)
R0.13 (May 21, 2017)
Changed heading character of configuration keywords "_" to "FF_".
Removed ASCII-only configuration, FF_CODE_PAGE = 1. Use FF_CODE_PAGE = 437 instead.
Added f_setcp(), run-time code page configuration. (FF_CODE_PAGE = 0)
Improved cluster allocation time on stretch a deep buried cluster chain.
Improved processing time of f_mkdir() with large cluster size by using FF_USE_LFN = 3.
Improved NoFatChain flag of the fragmented file to be set after it is truncated and got contiguous.
Fixed archive attribute is left not set when a file on the exFAT volume is renamed. (appeared at R0.12)
Fixed exFAT FAT entry can be collapsed when write or lseek operation to the existing file is done. (appeared at R0.12c)
Fixed creating a file can fail when a new cluster allocation to the exFAT directory occures. (appeared at R0.12c)
R0.13a (October 14, 2017)
Added support for UTF-8 encoding on the API. (FF_LFN_UNICODE = 2)
Added options for file name output buffer. (FF_LFN_BUF, FF_SFN_BUF).
Added dynamic memory allocation option for working buffer of f_mkfs() and f_fdisk().
Fixed f_fdisk() and f_mkfs() create the partition table with wrong CHS parameters. (appeared at R0.09)
Fixed f_unlink() can cause lost clusters at fragmented file on the exFAT volume. (appeared at R0.12c)
Fixed f_setlabel() rejects some valid characters for exFAT volume. (appeared at R0.12)
R0.13b (April 07, 2018)
Added support for UTF-32 encoding on the API. (FF_LFN_UNICODE = 3)
Added support for Unix style volume ID. (FF_STR_VOLUME_ID = 2)
Fixed accesing any object on the exFAT root directory beyond the cluster boundary can fail. (appeared at R0.12c)
Fixed f_setlabel() does not reject some invalid characters. (appeared at R0.09b)
R0.13c (October 14, 2018)
Supported stdint.h for C99 and later. (integer.h was included in ff.h)
Fixed reading a directory gets infinite loop when the last directory entry is not empty. (appeared at R0.12)
Fixed creating a sub-directory in the fragmented sub-directory on the exFAT volume collapses FAT chain of the parent directory. (appeared at R0.12)
Fixed f_getcwd() cause output buffer overrun when the buffer has a valid drive number. (appeared at R0.13b)
R0.14 (October 14, 2019)
Added support for 64-bit LBA and GUID partition table (FF_LBA64 = 1)
Changed some API functions, f_mkfs() and f_fdisk().
Fixed f_open() function cannot find the file with file name in length of FF_MAX_LFN characters.
Fixed f_readdir() function cannot retrieve long file names in length of FF_MAX_LFN - 1 characters.
Fixed f_readdir() function returns file names with wrong case conversion. (appeared at R0.12)
Fixed f_mkfs() function can fail to create exFAT volume in the second partition. (appeared at R0.12)
R0.14a (December 5, 2020)
Limited number of recursive calls in f_findnext().
Fixed old floppy disks formatted with MS-DOS 2.x and 3.x cannot be mounted.
Fixed some compiler warnings.
R0.14b (April 17, 2021)
Made FatFs uses standard library <string.h> for copy, compare and search instead of built-in string functions.
Added support for long long integer and floating point to f_printf(). (FF_STRF_LLI and FF_STRF_FP)
Made path name parser ignore the terminating separator to allow "dir/".
Improved the compatibility in Unix style path name feature.
Fixed the file gets dead-locked when f_open() failed with some conditions. (appeared at R0.12a)
Fixed f_mkfs() can create wrong exFAT volume due to a timing dependent error. (appeared at R0.12)
Fixed code page 855 cannot be set by f_setcp().
Fixed some compiler warnings.

21
Externals/FatFs/00readme.txt vendored Normal file
View file

@ -0,0 +1,21 @@
FatFs Module Source Files R0.14b
FILES
00readme.txt This file.
00history.txt Revision history.
ff.c FatFs module.
ffconf.h Configuration file of FatFs module.
ff.h Common include file for FatFs and application module.
diskio.h Common include file for FatFs and disk I/O module.
diskio.c An example of glue function to attach existing disk I/O module to FatFs.
ffunicode.c Optional Unicode utility functions.
ffsystem.c An example of optional O/S related functions.
Low level disk I/O module is not included in this archive because the FatFs
module is only a generic file system layer and it does not depend on any specific
storage device. You need to provide a low level disk I/O module written to
control the storage device that attached to the target system.

12
Externals/FatFs/CMakeLists.txt vendored Normal file
View file

@ -0,0 +1,12 @@
add_library(FatFs STATIC
ff.c
ffunicode.c
diskio.h
ff.h
ffconf.h
)
target_include_directories(FatFs
PUBLIC
${CMAKE_CURRENT_SOURCE_DIR}
)

24
Externals/FatFs/LICENSE.txt vendored Normal file
View file

@ -0,0 +1,24 @@
FatFs License
FatFs has being developped as a personal project of the author, ChaN. It is free from the code anyone else wrote at current release. Following code block shows a copy of the FatFs license document that heading the source files.
/*----------------------------------------------------------------------------/
/ FatFs - Generic FAT Filesystem Module Rx.xx /
/-----------------------------------------------------------------------------/
/
/ Copyright (C) 20xx, ChaN, all right reserved.
/
/ FatFs module is an open source software. Redistribution and use of FatFs in
/ source and binary forms, with or without modification, are permitted provided
/ that the following condition is met:
/
/ 1. Redistributions of source code must retain the above copyright notice,
/ this condition and the following disclaimer.
/
/ This software is provided by the copyright holder and contributors "AS IS"
/ and any warranties related to this software are DISCLAIMED.
/ The copyright owner or contributors be NOT LIABLE for any damages caused
/ by use of this software.
/----------------------------------------------------------------------------*/
Therefore FatFs license is one of the BSD-style licenses, but there is a significant feature. FatFs is mainly intended for embedded systems. In order to extend the usability for commercial products, the redistributions of FatFs in binary form, such as embedded code, binary library and any forms without source code, do not need to include about FatFs in the documentations. This is equivalent to the 1-clause BSD license. Of course FatFs is compatible with the most of open source software licenses include GNU GPL. When you redistribute the FatFs source code with changes or create a fork, the license can also be changed to GNU GPL, BSD-style license or any open source software license that not conflict with FatFs license.

229
Externals/FatFs/diskio.c vendored Normal file
View file

@ -0,0 +1,229 @@
/*-----------------------------------------------------------------------*/
/* Low level disk I/O module SKELETON for FatFs (C)ChaN, 2019 */
/*-----------------------------------------------------------------------*/
/* If a working storage control module is available, it should be */
/* attached to the FatFs via a glue function rather than modifying it. */
/* This is an example of glue functions to attach various exsisting */
/* storage control modules to the FatFs module with a defined API. */
/*-----------------------------------------------------------------------*/
#include "ff.h" /* Obtains integer types */
#include "diskio.h" /* Declarations of disk functions */
/* Definitions of physical drive number for each drive */
#define DEV_RAM 0 /* Example: Map Ramdisk to physical drive 0 */
#define DEV_MMC 1 /* Example: Map MMC/SD card to physical drive 1 */
#define DEV_USB 2 /* Example: Map USB MSD to physical drive 2 */
/*-----------------------------------------------------------------------*/
/* Get Drive Status */
/*-----------------------------------------------------------------------*/
DSTATUS disk_status (
BYTE pdrv /* Physical drive nmuber to identify the drive */
)
{
DSTATUS stat;
int result;
switch (pdrv) {
case DEV_RAM :
result = RAM_disk_status();
// translate the reslut code here
return stat;
case DEV_MMC :
result = MMC_disk_status();
// translate the reslut code here
return stat;
case DEV_USB :
result = USB_disk_status();
// translate the reslut code here
return stat;
}
return STA_NOINIT;
}
/*-----------------------------------------------------------------------*/
/* Inidialize a Drive */
/*-----------------------------------------------------------------------*/
DSTATUS disk_initialize (
BYTE pdrv /* Physical drive nmuber to identify the drive */
)
{
DSTATUS stat;
int result;
switch (pdrv) {
case DEV_RAM :
result = RAM_disk_initialize();
// translate the reslut code here
return stat;
case DEV_MMC :
result = MMC_disk_initialize();
// translate the reslut code here
return stat;
case DEV_USB :
result = USB_disk_initialize();
// translate the reslut code here
return stat;
}
return STA_NOINIT;
}
/*-----------------------------------------------------------------------*/
/* Read Sector(s) */
/*-----------------------------------------------------------------------*/
DRESULT disk_read (
BYTE pdrv, /* Physical drive nmuber to identify the drive */
BYTE *buff, /* Data buffer to store read data */
LBA_t sector, /* Start sector in LBA */
UINT count /* Number of sectors to read */
)
{
DRESULT res;
int result;
switch (pdrv) {
case DEV_RAM :
// translate the arguments here
result = RAM_disk_read(buff, sector, count);
// translate the reslut code here
return res;
case DEV_MMC :
// translate the arguments here
result = MMC_disk_read(buff, sector, count);
// translate the reslut code here
return res;
case DEV_USB :
// translate the arguments here
result = USB_disk_read(buff, sector, count);
// translate the reslut code here
return res;
}
return RES_PARERR;
}
/*-----------------------------------------------------------------------*/
/* Write Sector(s) */
/*-----------------------------------------------------------------------*/
#if FF_FS_READONLY == 0
DRESULT disk_write (
BYTE pdrv, /* Physical drive nmuber to identify the drive */
const BYTE *buff, /* Data to be written */
LBA_t sector, /* Start sector in LBA */
UINT count /* Number of sectors to write */
)
{
DRESULT res;
int result;
switch (pdrv) {
case DEV_RAM :
// translate the arguments here
result = RAM_disk_write(buff, sector, count);
// translate the reslut code here
return res;
case DEV_MMC :
// translate the arguments here
result = MMC_disk_write(buff, sector, count);
// translate the reslut code here
return res;
case DEV_USB :
// translate the arguments here
result = USB_disk_write(buff, sector, count);
// translate the reslut code here
return res;
}
return RES_PARERR;
}
#endif
/*-----------------------------------------------------------------------*/
/* Miscellaneous Functions */
/*-----------------------------------------------------------------------*/
DRESULT disk_ioctl (
BYTE pdrv, /* Physical drive nmuber (0..) */
BYTE cmd, /* Control code */
void *buff /* Buffer to send/receive control data */
)
{
DRESULT res;
int result;
switch (pdrv) {
case DEV_RAM :
// Process of the command for the RAM drive
return res;
case DEV_MMC :
// Process of the command for the MMC/SD card
return res;
case DEV_USB :
// Process of the command the USB drive
return res;
}
return RES_PARERR;
}

77
Externals/FatFs/diskio.h vendored Normal file
View file

@ -0,0 +1,77 @@
/*-----------------------------------------------------------------------/
/ Low level disk interface modlue include file (C)ChaN, 2019 /
/-----------------------------------------------------------------------*/
#ifndef _DISKIO_DEFINED
#define _DISKIO_DEFINED
#ifdef __cplusplus
extern "C" {
#endif
/* Status of Disk Functions */
typedef BYTE DSTATUS;
/* Results of Disk Functions */
typedef enum {
RES_OK = 0, /* 0: Successful */
RES_ERROR, /* 1: R/W Error */
RES_WRPRT, /* 2: Write Protected */
RES_NOTRDY, /* 3: Not Ready */
RES_PARERR /* 4: Invalid Parameter */
} DRESULT;
/*---------------------------------------*/
/* Prototypes for disk control functions */
DSTATUS disk_initialize (BYTE pdrv);
DSTATUS disk_status (BYTE pdrv);
DRESULT disk_read (BYTE pdrv, BYTE* buff, LBA_t sector, UINT count);
DRESULT disk_write (BYTE pdrv, const BYTE* buff, LBA_t sector, UINT count);
DRESULT disk_ioctl (BYTE pdrv, BYTE cmd, void* buff);
/* Disk Status Bits (DSTATUS) */
#define STA_NOINIT 0x01 /* Drive not initialized */
#define STA_NODISK 0x02 /* No medium in the drive */
#define STA_PROTECT 0x04 /* Write protected */
/* Command code for disk_ioctrl fucntion */
/* Generic command (Used by FatFs) */
#define CTRL_SYNC 0 /* Complete pending write process (needed at FF_FS_READONLY == 0) */
#define GET_SECTOR_COUNT 1 /* Get media size (needed at FF_USE_MKFS == 1) */
#define GET_SECTOR_SIZE 2 /* Get sector size (needed at FF_MAX_SS != FF_MIN_SS) */
#define GET_BLOCK_SIZE 3 /* Get erase block size (needed at FF_USE_MKFS == 1) */
#define CTRL_TRIM 4 /* Inform device that the data on the block of sectors is no longer used (needed at FF_USE_TRIM == 1) */
/* Generic command (Not used by FatFs) */
#define CTRL_POWER 5 /* Get/Set power status */
#define CTRL_LOCK 6 /* Lock/Unlock media removal */
#define CTRL_EJECT 7 /* Eject media */
#define CTRL_FORMAT 8 /* Create physical format on the media */
/* MMC/SDC specific ioctl command */
#define MMC_GET_TYPE 10 /* Get card type */
#define MMC_GET_CSD 11 /* Get CSD */
#define MMC_GET_CID 12 /* Get CID */
#define MMC_GET_OCR 13 /* Get OCR */
#define MMC_GET_SDSTAT 14 /* Get SD status */
#define ISDIO_READ 55 /* Read data form SD iSDIO register */
#define ISDIO_WRITE 56 /* Write data to SD iSDIO register */
#define ISDIO_MRITE 57 /* Masked write data to SD iSDIO register */
/* ATA/CF specific ioctl command */
#define ATA_GET_REV 20 /* Get F/W revision */
#define ATA_GET_MODEL 21 /* Get model name */
#define ATA_GET_SN 22 /* Get serial number */
#ifdef __cplusplus
}
#endif
#endif

13
Externals/FatFs/exports.props vendored Normal file
View file

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<Project>
<ItemDefinitionGroup>
<ClCompile>
<AdditionalIncludeDirectories>$(ExternalsDir)FatFs;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
</ItemDefinitionGroup>
<ItemGroup>
<ProjectReference Include="$(ExternalsDir)FatFs\FatFs.vcxproj">
<Project>{3F17D282-A77D-4931-B844-903AD0809A5E}</Project>
</ProjectReference>
</ItemGroup>
</Project>

6982
Externals/FatFs/ff.c vendored Normal file

File diff suppressed because it is too large Load diff

422
Externals/FatFs/ff.h vendored Normal file
View file

@ -0,0 +1,422 @@
/*----------------------------------------------------------------------------/
/ FatFs - Generic FAT Filesystem module R0.14b /
/-----------------------------------------------------------------------------/
/
/ Copyright (C) 2021, ChaN, all right reserved.
/
/ FatFs module is an open source software. Redistribution and use of FatFs in
/ source and binary forms, with or without modification, are permitted provided
/ that the following condition is met:
/ 1. Redistributions of source code must retain the above copyright notice,
/ this condition and the following disclaimer.
/
/ This software is provided by the copyright holder and contributors "AS IS"
/ and any warranties related to this software are DISCLAIMED.
/ The copyright owner or contributors be NOT LIABLE for any damages caused
/ by use of this software.
/
/----------------------------------------------------------------------------*/
#ifndef FF_DEFINED
#define FF_DEFINED 86631 /* Revision ID */
#ifdef __cplusplus
extern "C" {
#endif
#include "ffconf.h" /* FatFs configuration options */
#if FF_DEFINED != FFCONF_DEF
#error Wrong configuration file (ffconf.h).
#endif
/* Integer types used for FatFs API */
#if defined(_WIN32) /* Windows VC++ (for development only) */
#define FF_INTDEF 2
#include <windows.h>
typedef unsigned __int64 QWORD;
#include <float.h>
#define isnan(v) _isnan(v)
#define isinf(v) (!_finite(v))
#elif (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || defined(__cplusplus) /* C99 or later */
#define FF_INTDEF 2
#include <stdint.h>
typedef unsigned int UINT; /* int must be 16-bit or 32-bit */
typedef unsigned char BYTE; /* char must be 8-bit */
typedef uint16_t WORD; /* 16-bit unsigned integer */
typedef uint32_t DWORD; /* 32-bit unsigned integer */
typedef uint64_t QWORD; /* 64-bit unsigned integer */
typedef WORD WCHAR; /* UTF-16 character type */
#else /* Earlier than C99 */
#define FF_INTDEF 1
typedef unsigned int UINT; /* int must be 16-bit or 32-bit */
typedef unsigned char BYTE; /* char must be 8-bit */
typedef unsigned short WORD; /* 16-bit unsigned integer */
typedef unsigned long DWORD; /* 32-bit unsigned integer */
typedef WORD WCHAR; /* UTF-16 character type */
#endif
/* Type of file size and LBA variables */
#if FF_FS_EXFAT
#if FF_INTDEF != 2
#error exFAT feature wants C99 or later
#endif
typedef QWORD FSIZE_t;
#if FF_LBA64
typedef QWORD LBA_t;
#else
typedef DWORD LBA_t;
#endif
#else
#if FF_LBA64
#error exFAT needs to be enabled when enable 64-bit LBA
#endif
typedef DWORD FSIZE_t;
typedef DWORD LBA_t;
#endif
/* Type of path name strings on FatFs API (FATFS_TCHAR) */
#if FF_USE_LFN && FF_LFN_UNICODE == 1 /* Unicode in UTF-16 encoding */
typedef WCHAR FATFS_TCHAR;
#define FATFS__T(x) L ## x
#define FATFS__TEXT(x) L ## x
#elif FF_USE_LFN && FF_LFN_UNICODE == 2 /* Unicode in UTF-8 encoding */
typedef char FATFS_TCHAR;
#define FATFS__T(x) u8 ## x
#define FATFS__TEXT(x) u8 ## x
#elif FF_USE_LFN && FF_LFN_UNICODE == 3 /* Unicode in UTF-32 encoding */
typedef DWORD FATFS_TCHAR;
#define FATFS__T(x) U ## x
#define FATFS__TEXT(x) U ## x
#elif FF_USE_LFN && (FF_LFN_UNICODE < 0 || FF_LFN_UNICODE > 3)
#error Wrong FF_LFN_UNICODE setting
#else /* ANSI/OEM code in SBCS/DBCS */
typedef char FATFS_TCHAR;
#define FATFS__T(x) x
#define FATFS__TEXT(x) x
#endif
/* Definitions of volume management */
#if FF_MULTI_PARTITION /* Multiple partition configuration */
typedef struct {
BYTE pd; /* Physical drive number */
BYTE pt; /* Partition: 0:Auto detect, 1-4:Forced partition) */
} PARTITION;
extern PARTITION VolToPart[]; /* Volume - Partition mapping table */
#endif
#if FF_STR_VOLUME_ID
#ifndef FF_VOLUME_STRS
extern const char* VolumeStr[FF_VOLUMES]; /* User defied volume ID */
#endif
#endif
/* Filesystem object structure (FATFS) */
typedef struct {
BYTE fs_type; /* Filesystem type (0:not mounted) */
BYTE pdrv; /* Associated physical drive */
BYTE n_fats; /* Number of FATs (1 or 2) */
BYTE wflag; /* win[] flag (b0:dirty) */
BYTE fsi_flag; /* FSINFO flags (b7:disabled, b0:dirty) */
WORD id; /* Volume mount ID */
WORD n_rootdir; /* Number of root directory entries (FAT12/16) */
WORD csize; /* Cluster size [sectors] */
#if FF_MAX_SS != FF_MIN_SS
WORD ssize; /* Sector size (512, 1024, 2048 or 4096) */
#endif
#if FF_USE_LFN
WCHAR* lfnbuf; /* LFN working buffer */
#endif
#if FF_FS_EXFAT
BYTE* dirbuf; /* Directory entry block scratchpad buffer for exFAT */
#endif
#if FF_FS_REENTRANT
FF_SYNC_t sobj; /* Identifier of sync object */
#endif
#if !FF_FS_READONLY
DWORD last_clst; /* Last allocated cluster */
DWORD free_clst; /* Number of free clusters */
#endif
#if FF_FS_RPATH
DWORD cdir; /* Current directory start cluster (0:root) */
#if FF_FS_EXFAT
DWORD cdc_scl; /* Containing directory start cluster (invalid when cdir is 0) */
DWORD cdc_size; /* b31-b8:Size of containing directory, b7-b0: Chain status */
DWORD cdc_ofs; /* Offset in the containing directory (invalid when cdir is 0) */
#endif
#endif
DWORD n_fatent; /* Number of FAT entries (number of clusters + 2) */
DWORD fsize; /* Size of an FAT [sectors] */
LBA_t volbase; /* Volume base sector */
LBA_t fatbase; /* FAT base sector */
LBA_t dirbase; /* Root directory base sector/cluster */
LBA_t database; /* Data base sector */
#if FF_FS_EXFAT
LBA_t bitbase; /* Allocation bitmap base sector */
#endif
LBA_t winsect; /* Current sector appearing in the win[] */
BYTE win[FF_MAX_SS]; /* Disk access window for Directory, FAT (and file data at tiny cfg) */
} FATFS;
/* Object ID and allocation information (FFOBJID) */
typedef struct {
FATFS* fs; /* Pointer to the hosting volume of this object */
WORD id; /* Hosting volume mount ID */
BYTE attr; /* Object attribute */
BYTE stat; /* Object chain status (b1-0: =0:not contiguous, =2:contiguous, =3:fragmented in this session, b2:sub-directory stretched) */
DWORD sclust; /* Object data start cluster (0:no cluster or root directory) */
FSIZE_t objsize; /* Object size (valid when sclust != 0) */
#if FF_FS_EXFAT
DWORD n_cont; /* Size of first fragment - 1 (valid when stat == 3) */
DWORD n_frag; /* Size of last fragment needs to be written to FAT (valid when not zero) */
DWORD c_scl; /* Containing directory start cluster (valid when sclust != 0) */
DWORD c_size; /* b31-b8:Size of containing directory, b7-b0: Chain status (valid when c_scl != 0) */
DWORD c_ofs; /* Offset in the containing directory (valid when file object and sclust != 0) */
#endif
#if FF_FS_LOCK
UINT lockid; /* File lock ID origin from 1 (index of file semaphore table Files[]) */
#endif
} FFOBJID;
/* File object structure (FIL) */
typedef struct {
FFOBJID obj; /* Object identifier (must be the 1st member to detect invalid object pointer) */
BYTE flag; /* File status flags */
BYTE err; /* Abort flag (error code) */
FSIZE_t fptr; /* File read/write pointer (Zeroed on file open) */
DWORD clust; /* Current cluster of fpter (invalid when fptr is 0) */
LBA_t sect; /* Sector number appearing in buf[] (0:invalid) */
#if !FF_FS_READONLY
LBA_t dir_sect; /* Sector number containing the directory entry (not used at exFAT) */
BYTE* dir_ptr; /* Pointer to the directory entry in the win[] (not used at exFAT) */
#endif
#if FF_USE_FASTSEEK
DWORD* cltbl; /* Pointer to the cluster link map table (nulled on open, set by application) */
#endif
#if !FF_FS_TINY
BYTE buf[FF_MAX_SS]; /* File private data read/write window */
#endif
} FIL;
/* Directory object structure (DIR) */
typedef struct {
FFOBJID obj; /* Object identifier */
DWORD dptr; /* Current read/write offset */
DWORD clust; /* Current cluster */
LBA_t sect; /* Current sector (0:Read operation has terminated) */
BYTE* dir; /* Pointer to the directory item in the win[] */
BYTE fn[12]; /* SFN (in/out) {body[8],ext[3],status[1]} */
#if FF_USE_LFN
DWORD blk_ofs; /* Offset of current entry block being processed (0xFFFFFFFF:Invalid) */
#endif
#if FF_USE_FIND
const FATFS_TCHAR* pat; /* Pointer to the name matching pattern */
#endif
} DIR;
/* File information structure (FILINFO) */
typedef struct {
FSIZE_t fsize; /* File size */
WORD fdate; /* Modified date */
WORD ftime; /* Modified time */
BYTE fattrib; /* File attribute */
#if FF_USE_LFN
FATFS_TCHAR altname[FF_SFN_BUF + 1];/* Altenative file name */
FATFS_TCHAR fname[FF_LFN_BUF + 1]; /* Primary file name */
#else
FATFS_TCHAR fname[12 + 1]; /* File name */
#endif
} FILINFO;
/* Format parameter structure (MKFS_PARM) */
typedef struct {
BYTE fmt; /* Format option (FM_FAT, FM_FAT32, FM_EXFAT and FM_SFD) */
BYTE n_fat; /* Number of FATs */
UINT align; /* Data area alignment (sector) */
UINT n_root; /* Number of root directory entries */
DWORD au_size; /* Cluster size (byte) */
} MKFS_PARM;
/* File function return code (FRESULT) */
typedef enum {
FR_OK = 0, /* (0) Succeeded */
FR_DISK_ERR, /* (1) A hard error occurred in the low level disk I/O layer */
FR_INT_ERR, /* (2) Assertion failed */
FR_NOT_READY, /* (3) The physical drive cannot work */
FR_NO_FILE, /* (4) Could not find the file */
FR_NO_PATH, /* (5) Could not find the path */
FR_INVALID_NAME, /* (6) The path name format is invalid */
FR_DENIED, /* (7) Access denied due to prohibited access or directory full */
FR_EXIST, /* (8) Access denied due to prohibited access */
FR_INVALID_OBJECT, /* (9) The file/directory object is invalid */
FR_WRITE_PROTECTED, /* (10) The physical drive is write protected */
FR_INVALID_DRIVE, /* (11) The logical drive number is invalid */
FR_NOT_ENABLED, /* (12) The volume has no work area */
FR_NO_FILESYSTEM, /* (13) There is no valid FAT volume */
FR_MKFS_ABORTED, /* (14) The f_mkfs() aborted due to any problem */
FR_TIMEOUT, /* (15) Could not get a grant to access the volume within defined period */
FR_LOCKED, /* (16) The operation is rejected according to the file sharing policy */
FR_NOT_ENOUGH_CORE, /* (17) LFN working buffer could not be allocated */
FR_TOO_MANY_OPEN_FILES, /* (18) Number of open files > FF_FS_LOCK */
FR_INVALID_PARAMETER /* (19) Given parameter is invalid */
} FRESULT;
/*--------------------------------------------------------------*/
/* FatFs module application interface */
FRESULT f_open (FIL* fp, const FATFS_TCHAR* path, BYTE mode); /* Open or create a file */
FRESULT f_close (FIL* fp); /* Close an open file object */
FRESULT f_read (FIL* fp, void* buff, UINT btr, UINT* br); /* Read data from the file */
FRESULT f_write (FIL* fp, const void* buff, UINT btw, UINT* bw); /* Write data to the file */
FRESULT f_lseek (FIL* fp, FSIZE_t ofs); /* Move file pointer of the file object */
FRESULT f_truncate (FIL* fp); /* Truncate the file */
FRESULT f_sync (FIL* fp); /* Flush cached data of the writing file */
FRESULT f_opendir (DIR* dp, const FATFS_TCHAR* path); /* Open a directory */
FRESULT f_closedir (DIR* dp); /* Close an open directory */
FRESULT f_readdir (DIR* dp, FILINFO* fno); /* Read a directory item */
FRESULT f_findfirst (DIR* dp, FILINFO* fno, const FATFS_TCHAR* path, const FATFS_TCHAR* pattern); /* Find first file */
FRESULT f_findnext (DIR* dp, FILINFO* fno); /* Find next file */
FRESULT f_mkdir (const FATFS_TCHAR* path); /* Create a sub directory */
FRESULT f_unlink (const FATFS_TCHAR* path); /* Delete an existing file or directory */
FRESULT f_rename (const FATFS_TCHAR* path_old, const FATFS_TCHAR* path_new); /* Rename/Move a file or directory */
FRESULT f_stat (const FATFS_TCHAR* path, FILINFO* fno); /* Get file status */
FRESULT f_chmod (const FATFS_TCHAR* path, BYTE attr, BYTE mask); /* Change attribute of a file/dir */
FRESULT f_utime (const FATFS_TCHAR* path, const FILINFO* fno); /* Change timestamp of a file/dir */
FRESULT f_chdir (const FATFS_TCHAR* path); /* Change current directory */
FRESULT f_chdrive (const FATFS_TCHAR* path); /* Change current drive */
FRESULT f_getcwd (FATFS_TCHAR* buff, UINT len); /* Get current directory */
FRESULT f_getfree (const FATFS_TCHAR* path, DWORD* nclst, FATFS** fatfs); /* Get number of free clusters on the drive */
FRESULT f_getlabel (const FATFS_TCHAR* path, FATFS_TCHAR* label, DWORD* vsn); /* Get volume label */
FRESULT f_setlabel (const FATFS_TCHAR* label); /* Set volume label */
FRESULT f_forward (FIL* fp, UINT(*func)(const BYTE*,UINT), UINT btf, UINT* bf); /* Forward data to the stream */
FRESULT f_expand (FIL* fp, FSIZE_t fsz, BYTE opt); /* Allocate a contiguous block to the file */
FRESULT f_mount (FATFS* fs, const FATFS_TCHAR* path, BYTE opt); /* Mount/Unmount a logical drive */
FRESULT f_mkfs (const FATFS_TCHAR* path, const MKFS_PARM* opt, void* work, UINT len); /* Create a FAT volume */
FRESULT f_fdisk (BYTE pdrv, const LBA_t ptbl[], void* work); /* Divide a physical drive into some partitions */
FRESULT f_setcp (WORD cp); /* Set current code page */
int f_putc (FATFS_TCHAR c, FIL* fp); /* Put a character to the file */
int f_puts (const FATFS_TCHAR* str, FIL* cp); /* Put a string to the file */
int f_printf (FIL* fp, const FATFS_TCHAR* str, ...); /* Put a formatted string to the file */
FATFS_TCHAR* f_gets (FATFS_TCHAR* buff, int len, FIL* fp); /* Get a string from the file */
#define f_eof(fp) ((int)((fp)->fptr == (fp)->obj.objsize))
#define f_error(fp) ((fp)->err)
#define f_tell(fp) ((fp)->fptr)
#define f_size(fp) ((fp)->obj.objsize)
#define f_rewind(fp) f_lseek((fp), 0)
#define f_rewinddir(dp) f_readdir((dp), 0)
#define f_rmdir(path) f_unlink(path)
#define f_unmount(path) f_mount(0, path, 0)
/*--------------------------------------------------------------*/
/* Additional user defined functions */
/* RTC function */
#if !FF_FS_READONLY && !FF_FS_NORTC
DWORD get_fattime (void);
#endif
/* LFN support functions */
#if FF_USE_LFN >= 1 /* Code conversion (defined in unicode.c) */
WCHAR ff_oem2uni (WCHAR oem, WORD cp); /* OEM code to Unicode conversion */
WCHAR ff_uni2oem (DWORD uni, WORD cp); /* Unicode to OEM code conversion */
DWORD ff_wtoupper (DWORD uni); /* Unicode upper-case conversion */
#endif
#if FF_USE_LFN == 3 /* Dynamic memory allocation */
void* ff_memalloc (UINT msize); /* Allocate memory block */
void ff_memfree (void* mblock); /* Free memory block */
#endif
/* Sync functions */
#if FF_FS_REENTRANT
int ff_cre_syncobj (BYTE vol, FF_SYNC_t* sobj); /* Create a sync object */
int ff_req_grant (FF_SYNC_t sobj); /* Lock sync object */
void ff_rel_grant (FF_SYNC_t sobj); /* Unlock sync object */
int ff_del_syncobj (FF_SYNC_t sobj); /* Delete a sync object */
#endif
/*--------------------------------------------------------------*/
/* Flags and offset address */
/* File access mode and open method flags (3rd argument of f_open) */
#define FA_READ 0x01
#define FA_WRITE 0x02
#define FA_OPEN_EXISTING 0x00
#define FA_CREATE_NEW 0x04
#define FA_CREATE_ALWAYS 0x08
#define FA_OPEN_ALWAYS 0x10
#define FA_OPEN_APPEND 0x30
/* Fast seek controls (2nd argument of f_lseek) */
#define CREATE_LINKMAP ((FSIZE_t)0 - 1)
/* Format options (2nd argument of f_mkfs) */
#define FM_FAT 0x01
#define FM_FAT32 0x02
#define FM_EXFAT 0x04
#define FM_ANY 0x07
#define FM_SFD 0x08
/* Filesystem type (FATFS.fs_type) */
#define FS_FAT12 1
#define FS_FAT16 2
#define FS_FAT32 3
#define FS_EXFAT 4
/* File attribute bits for directory entry (FILINFO.fattrib) */
#define AM_RDO 0x01 /* Read only */
#define AM_HID 0x02 /* Hidden */
#define AM_SYS 0x04 /* System */
#define AM_DIR 0x10 /* Directory */
#define AM_ARC 0x20 /* Archive */
#ifdef __cplusplus
}
#endif
#endif /* FF_DEFINED */

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