mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-08-22 10:19:01 +00:00
Merge branch 'master' of https://github.com/dolphin-emu/dolphin into pull-upstream-2023-02-25
This commit is contained in:
commit
79ae6b461e
3867 changed files with 696007 additions and 504379 deletions
|
@ -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
1
.gitattributes
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
*.sln text eol=crlf
|
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -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
48
.gitmodules
vendored
|
@ -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
|
||||
|
|
16
.tx/config
16
.tx/config
|
@ -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
|
||||
|
|
|
@ -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
392
BuildMacOSUniversalBinary.py
Executable 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)
|
|
@ -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")
|
||||
|
|
|
@ -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()
|
||||
|
|
18
CMake/DolphinDisableWarningsMSVC.cmake
Normal file
18
CMake/DolphinDisableWarningsMSVC.cmake
Normal 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()
|
20
CMake/DolphinLibraryTools.cmake
Normal file
20
CMake/DolphinLibraryTools.cmake
Normal 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
15
CMake/FindLIBMGBA.cmake
Normal 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()
|
|
@ -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() {}"
|
||||
|
|
4
CMake/FindPowerShell.cmake
Normal file
4
CMake/FindPowerShell.cmake
Normal 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
11
CMake/FlagsOverride.cmake
Normal 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()
|
16
CMake/RemoveCompileFlag.cmake
Normal file
16
CMake/RemoveCompileFlag.cmake
Normal 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()
|
357
CMakeLists.txt
357
CMakeLists.txt
|
@ -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
119
CODE_OF_CONDUCT.md
Normal 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 individual’s (or organization’s)
|
||||
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 we’re a world-wide community, so you might
|
||||
not be communicating in someone else’s 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. It’s 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 aren’t 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 people’s 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 we’re 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 doesn’t mean that they’re wrong. Don’t forget that it is
|
||||
human to err and blaming each other doesn’t 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
10
COPYING
Normal 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/
|
|
@ -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 → Advanced → 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.
|
@ -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"
|
||||
}
|
||||
]
|
||||
}
|
0
Data/Sys/Load/GraphicMods/All Games HUD Removal/all.txt
Normal file
0
Data/Sys/Load/GraphicMods/All Games HUD Removal/all.txt
Normal 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"
|
||||
}
|
||||
]
|
||||
}
|
|
@ -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
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
0
Data/Sys/Load/GraphicMods/Arc Rise Fantasia/RPJ.txt
Normal file
0
Data/Sys/Load/GraphicMods/Arc Rise Fantasia/RPJ.txt
Normal file
19
Data/Sys/Load/GraphicMods/Arc Rise Fantasia/metadata.json
Normal file
19
Data/Sys/Load/GraphicMods/Arc Rise Fantasia/metadata.json
Normal file
|
@ -0,0 +1,19 @@
|
|||
{
|
||||
"meta":
|
||||
{
|
||||
"title": "Bloom Texture Definitions",
|
||||
"author": "iwubcode"
|
||||
},
|
||||
"groups":
|
||||
[
|
||||
{
|
||||
"name": "Bloom",
|
||||
"targets": [
|
||||
{
|
||||
"type": "efb",
|
||||
"texture_filename": "efb1_n33_160x112_6"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
0
Data/Sys/Load/GraphicMods/Battalion Wars 2/RBW.txt
Normal file
0
Data/Sys/Load/GraphicMods/Battalion Wars 2/RBW.txt
Normal file
19
Data/Sys/Load/GraphicMods/Battalion Wars 2/metadata.json
Normal file
19
Data/Sys/Load/GraphicMods/Battalion Wars 2/metadata.json
Normal file
|
@ -0,0 +1,19 @@
|
|||
{
|
||||
"meta":
|
||||
{
|
||||
"title": "Bloom Texture Definitions",
|
||||
"author": "iwubcode"
|
||||
},
|
||||
"groups":
|
||||
[
|
||||
{
|
||||
"name": "Bloom",
|
||||
"targets": [
|
||||
{
|
||||
"type": "efb",
|
||||
"texture_filename": "efb1_n000023_80x60_6"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
|
@ -0,0 +1,19 @@
|
|||
{
|
||||
"meta":
|
||||
{
|
||||
"title": "Bloom Texture Definitions",
|
||||
"author": "iwubcode"
|
||||
},
|
||||
"groups":
|
||||
[
|
||||
{
|
||||
"name": "Bloom",
|
||||
"targets": [
|
||||
{
|
||||
"type": "efb",
|
||||
"texture_filename": "efb1_n2_320x224_4"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
|
@ -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"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
|
@ -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"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
0
Data/Sys/Load/GraphicMods/Little King's Story/RO3.txt
Normal file
0
Data/Sys/Load/GraphicMods/Little King's Story/RO3.txt
Normal file
167
Data/Sys/Load/GraphicMods/Little King's Story/metadata.json
Normal file
167
Data/Sys/Load/GraphicMods/Little King's Story/metadata.json
Normal 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"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
0
Data/Sys/Load/GraphicMods/Mario Kart Wii/RMC.txt
Normal file
0
Data/Sys/Load/GraphicMods/Mario Kart Wii/RMC.txt
Normal file
19
Data/Sys/Load/GraphicMods/Mario Kart Wii/metadata.json
Normal file
19
Data/Sys/Load/GraphicMods/Mario Kart Wii/metadata.json
Normal file
|
@ -0,0 +1,19 @@
|
|||
{
|
||||
"meta":
|
||||
{
|
||||
"title": "Bloom Texture Definitions",
|
||||
"author": "iwubcode"
|
||||
},
|
||||
"groups":
|
||||
[
|
||||
{
|
||||
"name": "Bloom",
|
||||
"targets": [
|
||||
{
|
||||
"type": "efb",
|
||||
"texture_filename": "efb1_n49_152x114_6"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
0
Data/Sys/Load/GraphicMods/Mario Strikers Charged/R4Q.txt
Normal file
0
Data/Sys/Load/GraphicMods/Mario Strikers Charged/R4Q.txt
Normal 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"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
|
@ -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"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
0
Data/Sys/Load/GraphicMods/Monster Hunter Tri/DMH.txt
Normal file
0
Data/Sys/Load/GraphicMods/Monster Hunter Tri/DMH.txt
Normal file
0
Data/Sys/Load/GraphicMods/Monster Hunter Tri/RMH.txt
Normal file
0
Data/Sys/Load/GraphicMods/Monster Hunter Tri/RMH.txt
Normal file
27
Data/Sys/Load/GraphicMods/Monster Hunter Tri/metadata.json
Normal file
27
Data/Sys/Load/GraphicMods/Monster Hunter Tri/metadata.json
Normal 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"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
|
@ -0,0 +1,19 @@
|
|||
{
|
||||
"meta":
|
||||
{
|
||||
"title": "Bloom Texture Definitions",
|
||||
"author": "iwubcode"
|
||||
},
|
||||
"groups":
|
||||
[
|
||||
{
|
||||
"name": "Bloom",
|
||||
"targets": [
|
||||
{
|
||||
"type": "efb",
|
||||
"texture_filename": "efb1_n000019_128x128_4"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
0
Data/Sys/Load/GraphicMods/Okami/ROW.txt
Normal file
0
Data/Sys/Load/GraphicMods/Okami/ROW.txt
Normal file
19
Data/Sys/Load/GraphicMods/Okami/metadata.json
Normal file
19
Data/Sys/Load/GraphicMods/Okami/metadata.json
Normal file
|
@ -0,0 +1,19 @@
|
|||
{
|
||||
"meta":
|
||||
{
|
||||
"title": "Bloom Texture Definitions",
|
||||
"author": "iwubcode"
|
||||
},
|
||||
"groups":
|
||||
[
|
||||
{
|
||||
"name": "Bloom",
|
||||
"targets": [
|
||||
{
|
||||
"type": "efb",
|
||||
"texture_filename": "efb1_n51_320x240_6"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
0
Data/Sys/Load/GraphicMods/Rune Factory Frontier/RUF.txt
Normal file
0
Data/Sys/Load/GraphicMods/Rune Factory Frontier/RUF.txt
Normal file
112
Data/Sys/Load/GraphicMods/Rune Factory Frontier/metadata.json
Normal file
112
Data/Sys/Load/GraphicMods/Rune Factory Frontier/metadata.json
Normal 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"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
|
@ -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"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
0
Data/Sys/Load/GraphicMods/Skyward Sword Bloom/SOU.txt
Normal file
0
Data/Sys/Load/GraphicMods/Skyward Sword Bloom/SOU.txt
Normal file
27
Data/Sys/Load/GraphicMods/Skyward Sword Bloom/metadata.json
Normal file
27
Data/Sys/Load/GraphicMods/Skyward Sword Bloom/metadata.json
Normal 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"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
0
Data/Sys/Load/GraphicMods/Sonic Colors/SNC.txt
Normal file
0
Data/Sys/Load/GraphicMods/Sonic Colors/SNC.txt
Normal file
51
Data/Sys/Load/GraphicMods/Sonic Colors/metadata.json
Normal file
51
Data/Sys/Load/GraphicMods/Sonic Colors/metadata.json
Normal 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"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
0
Data/Sys/Load/GraphicMods/Super Mario Galaxy 2/SB4.txt
Normal file
0
Data/Sys/Load/GraphicMods/Super Mario Galaxy 2/SB4.txt
Normal file
27
Data/Sys/Load/GraphicMods/Super Mario Galaxy 2/metadata.json
Normal file
27
Data/Sys/Load/GraphicMods/Super Mario Galaxy 2/metadata.json
Normal 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"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
0
Data/Sys/Load/GraphicMods/Super Mario Galaxy/RMG.txt
Normal file
0
Data/Sys/Load/GraphicMods/Super Mario Galaxy/RMG.txt
Normal file
23
Data/Sys/Load/GraphicMods/Super Mario Galaxy/metadata.json
Normal file
23
Data/Sys/Load/GraphicMods/Super Mario Galaxy/metadata.json
Normal 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"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
0
Data/Sys/Load/GraphicMods/Super Mario Sunshine/GMS.txt
Normal file
0
Data/Sys/Load/GraphicMods/Super Mario Sunshine/GMS.txt
Normal file
68
Data/Sys/Load/GraphicMods/Super Mario Sunshine/metadata.json
Normal file
68
Data/Sys/Load/GraphicMods/Super Mario Sunshine/metadata.json
Normal 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
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
0
Data/Sys/Load/GraphicMods/The Conduit/RCJ.txt
Normal file
0
Data/Sys/Load/GraphicMods/The Conduit/RCJ.txt
Normal file
31
Data/Sys/Load/GraphicMods/The Conduit/metadata.json
Normal file
31
Data/Sys/Load/GraphicMods/The Conduit/metadata.json
Normal 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"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
|
@ -0,0 +1,19 @@
|
|||
{
|
||||
"meta":
|
||||
{
|
||||
"title": "Bloom Texture Definitions",
|
||||
"author": "iwubcode"
|
||||
},
|
||||
"groups":
|
||||
[
|
||||
{
|
||||
"name": "Bloom",
|
||||
"targets": [
|
||||
{
|
||||
"type": "efb",
|
||||
"texture_filename": "efb1_n000008_80x60_6"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
0
Data/Sys/Load/GraphicMods/The Last Story/SLS.txt
Normal file
0
Data/Sys/Load/GraphicMods/The Last Story/SLS.txt
Normal file
157
Data/Sys/Load/GraphicMods/The Last Story/metadata.json
Normal file
157
Data/Sys/Load/GraphicMods/The Last Story/metadata.json
Normal 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"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
|
@ -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"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
0
Data/Sys/Load/GraphicMods/Wii Play/RHA.txt
Normal file
0
Data/Sys/Load/GraphicMods/Wii Play/RHA.txt
Normal file
27
Data/Sys/Load/GraphicMods/Wii Play/metadata.json
Normal file
27
Data/Sys/Load/GraphicMods/Wii Play/metadata.json
Normal 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"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
0
Data/Sys/Load/GraphicMods/Xenoblade Chronicles/SX4.txt
Normal file
0
Data/Sys/Load/GraphicMods/Xenoblade Chronicles/SX4.txt
Normal file
31
Data/Sys/Load/GraphicMods/Xenoblade Chronicles/metadata.json
Normal file
31
Data/Sys/Load/GraphicMods/Xenoblade Chronicles/metadata.json
Normal 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"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
|
@ -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_
|
|
@ -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 |
Binary file not shown.
Before Width: | Height: | Size: 308 B After Width: | Height: | Size: 368 B |
BIN
Data/Sys/Resources/nobanner@4x.png
Normal file
BIN
Data/Sys/Resources/nobanner@4x.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 672 B |
182
Data/Sys/Shaders/integer_scaling.glsl
Normal file
182
Data/Sys/Shaders/integer_scaling.glsl
Normal 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);
|
||||
}
|
|
@ -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));
|
||||
|
|
47
Data/Sys/Shaders/sharp_bilinear.glsl
Normal file
47
Data/Sys/Shaders/sharp_bilinear.glsl
Normal 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));
|
||||
}
|
|
@ -1,4 +1,4 @@
|
|||
void main()
|
||||
{
|
||||
SetOutput(Sample());
|
||||
SetOutput(Sample().gbra);
|
||||
}
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
void main()
|
||||
{
|
||||
SetOutput(Sample());
|
||||
SetOutput(Sample().grba);
|
||||
}
|
||||
|
|
1
Externals/Bochs_disasm/CMakeLists.txt
vendored
1
Externals/Bochs_disasm/CMakeLists.txt
vendored
|
@ -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
13
Externals/Bochs_disasm/exports.props
vendored
Normal 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
1
Externals/FFmpeg-bin
vendored
Submodule
|
@ -0,0 +1 @@
|
|||
Subproject commit 9bc087fbca36ce5a85eb4fd73f0c73813593e5a2
|
359
Externals/FatFs/00history.txt
vendored
Normal file
359
Externals/FatFs/00history.txt
vendored
Normal 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
21
Externals/FatFs/00readme.txt
vendored
Normal 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
12
Externals/FatFs/CMakeLists.txt
vendored
Normal 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
24
Externals/FatFs/LICENSE.txt
vendored
Normal 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
229
Externals/FatFs/diskio.c
vendored
Normal 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
77
Externals/FatFs/diskio.h
vendored
Normal 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
13
Externals/FatFs/exports.props
vendored
Normal 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
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
422
Externals/FatFs/ff.h
vendored
Normal 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
Loading…
Add table
Add a link
Reference in a new issue