mirror of
https://git.eden-emu.dev/eden-emu/eden.git
synced 2026-09-08 21:15:58 +00:00
Compare commits
187 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| a986cc8565 | |||
| 5cebeabe03 | |||
| 690c1e9e12 | |||
| ecc981bd20 | |||
| 7eda109134 | |||
| fcaea7d502 | |||
| 80f0239a68 | |||
| fa8c5291df | |||
| 28af06a351 | |||
| cddcd580e8 | |||
| 45371b6a3a | |||
| 1b5c489ebb | |||
| 1fdc31de6b | |||
| 6c12de4930 | |||
| 151de110b5 | |||
| f40461d0ad | |||
| 74ccea3def | |||
| 11de264541 | |||
| f6e7686038 | |||
| 1dcc574591 | |||
| 5c20f244c9 | |||
| aa4e494c08 | |||
| 858f9e5aea | |||
| e53e76168c | |||
| cb9ec1dc1a | |||
| f7e5ceeacb | |||
| b7f0f98519 | |||
| 7fda6dde73 | |||
| 106a61c943 | |||
| e5b656e372 | |||
| 297e797a32 | |||
| 48a95da874 | |||
| 2fd1dc0ff9 | |||
| 45b6ecff05 | |||
| 672bcbae01 | |||
| 28ab4a1a01 | |||
| ccf3de02cf | |||
| 1f03dee126 | |||
| 3df41c1e7a | |||
| f4a8f9421a | |||
| c0a85d0e53 | |||
| 54cd5fb8eb | |||
| 119291dc77 | |||
| f7dbff2157 | |||
| b859d7fdf4 | |||
| f635827fa6 | |||
| 243453c172 | |||
| 39158b67a7 | |||
| 50cb8fd1c9 | |||
| faaf1bac64 | |||
| 0295dc5fff | |||
| 60a474b8df | |||
| d9336ce6ce | |||
| 4eb8dd1458 | |||
| 4a3cc9a3c2 | |||
| 86ba79b1ba | |||
| b610b03d29 | |||
| 421e0b834c | |||
| 55acf5d260 | |||
| 3e07b466eb | |||
| 5b86242313 | |||
| d24e79c991 | |||
| df05d3de23 | |||
| c249ff462b | |||
| 056d11027c | |||
| 61ffb309a3 | |||
| 65a3cfd2be | |||
| 5c54abf353 | |||
| 0465292a81 | |||
| a41a98028a | |||
| 265c27f391 | |||
| fb2202d69c | |||
| 2000fdfb7b | |||
| dc95cd09ee | |||
| e7a931d06b | |||
| 8648c27cbb | |||
| def76946f0 | |||
| 13d39f39aa | |||
| 7731b5bc86 | |||
| c4ab2f6b9e | |||
| dd12266c26 | |||
| a3d32a18b8 | |||
| c0ffc900cd | |||
| 3f52bf4b4b | |||
| 5ec94b1971 | |||
| 627770cd3a | |||
| a43664c0fd | |||
| a0f1cd1baf | |||
| 49a0ca6d5d | |||
| 5e1d5e82dc | |||
| ba9130fbf9 | |||
| 7d5f390ffb | |||
| 8fe1e6efa2 | |||
| ee197e6222 | |||
| 612409c7ba | |||
| 54046ac60e | |||
| 39763e7321 | |||
| e69415c07b | |||
| dc1486485b | |||
| f561a10bd8 | |||
| 6272f8ab24 | |||
| eebb4bd91e | |||
| 58dee53305 | |||
| 7b13113fbe | |||
| b9a88297cb | |||
| 0133caf702 | |||
| 9d60030af5 | |||
| f5d1a78846 | |||
| 5d3ad94e18 | |||
| 479df9809a | |||
| 5b4c29b123 | |||
| 5b4dc32c1a | |||
| a90ba7f6ac | |||
| 9b2a36791d | |||
| b85f289048 | |||
| 89004124a5 | |||
| eb9280dedf | |||
| 8b8034a2a0 | |||
| 9a0e6b3c28 | |||
| defb8bf2e2 | |||
| 6295d23581 | |||
| 7f85c6e282 | |||
| 39b2c79985 | |||
| a27d35463e | |||
| 5606edd1a6 | |||
| cd003e5ec9 | |||
| 813b248bc3 | |||
| 3fd6eeaf9f | |||
| 372bdfccbc | |||
| 3699795315 | |||
| 3a6ac6e418 | |||
| 8225151a44 | |||
| 41762940d6 | |||
| c2e74a9380 | |||
| e401414aab | |||
| e662108584 | |||
| 29f712d3b5 | |||
| ae75ba4883 | |||
| 7b750bf5bb | |||
| 94e9c2bd74 | |||
| 9677522e6c | |||
| f423471cc0 | |||
| ce043aceb9 | |||
| 1643d8766f | |||
| fe1b8ff0ab | |||
| f22fd1714b | |||
| 6119e8fad2 | |||
| bfc0e60333 | |||
| 072be286d1 | |||
| 66b073ab8d | |||
| 4c65780f11 | |||
| a9c4c8aefd | |||
| a769505a45 | |||
| 54c3d10b86 | |||
| bdf60d79a0 | |||
| 2068b5d452 | |||
| 1b482fa99b | |||
| b6ee847947 | |||
| 6c16440996 | |||
| 09c583506b | |||
| 894add43f3 | |||
| d142b5dd6a | |||
| 0c2894eabf | |||
| d8a8169eb2 | |||
| 81c6e56713 | |||
| b4b41ee62c | |||
| 0d6a2158f0 | |||
| 09b6b3b71e | |||
| 629ebf1bde | |||
| c993bc01a4 | |||
| 6bdb03d8ac | |||
| 599ab16288 | |||
| 30a42c5a6a | |||
| 3aa0d46259 | |||
| f8facda35f | |||
| 39be450fa3 | |||
| 68aaea6085 | |||
| ba608d2b57 | |||
| c22f57bc4e | |||
| 7b97ec4594 | |||
| e63b248e54 | |||
| 97a8470b12 | |||
| 102d254530 | |||
| 7c0e993b5b | |||
| ce14fc91fb | |||
| c27266c4cd | |||
| 02eaf3c5a7 |
@@ -1,9 +1,9 @@
|
|||||||
name: tx-pull
|
name: tx-pull
|
||||||
|
|
||||||
on:
|
on:
|
||||||
# tuesday, saturday at 2pm
|
# monday at 4pm
|
||||||
schedule:
|
schedule:
|
||||||
- cron: '0 14 * * 2,6'
|
- cron: '0 16 * * 1'
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
@@ -52,7 +52,7 @@ jobs:
|
|||||||
}
|
}
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
curl -X 'POST' \
|
curl -XPOST \
|
||||||
'https://git.eden-emu.dev/api/v1/repos/eden-emu/eden/pulls' \
|
'https://git.eden-emu.dev/api/v1/repos/eden-emu/eden/pulls' \
|
||||||
-H 'accept: application/json' \
|
-H 'accept: application/json' \
|
||||||
-H 'Authorization: Bearer ${{ secrets.CI_FJ_TOKEN }}' \
|
-H 'Authorization: Bearer ${{ secrets.CI_FJ_TOKEN }}' \
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
name: update-deps
|
name: Update Dependencies
|
||||||
|
|
||||||
on:
|
on:
|
||||||
# saturday at noon
|
# saturday at noon
|
||||||
@@ -7,7 +7,7 @@ on:
|
|||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
tx-update:
|
update-deps:
|
||||||
runs-on: source
|
runs-on: source
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
@@ -24,18 +24,21 @@ jobs:
|
|||||||
git remote set-url origin ci:eden-emu/eden.git
|
git remote set-url origin ci:eden-emu/eden.git
|
||||||
|
|
||||||
DATE=$(date +"%b %d")
|
DATE=$(date +"%b %d")
|
||||||
|
TIMESTAMP=$(date +"%s")
|
||||||
echo "DATE=$DATE" >> "$GITHUB_ENV"
|
echo "DATE=$DATE" >> "$GITHUB_ENV"
|
||||||
|
echo "TIMESTAMP=$TIMESTAMP" >> "$GITHUB_ENV"
|
||||||
|
|
||||||
git switch -c update-deps-$DATE
|
git switch -c update-deps-$TIMESTAMP
|
||||||
tools/cpmutil.sh package update -ac
|
tools/cpmutil.sh package update -ac
|
||||||
git push
|
git push
|
||||||
|
|
||||||
- name: Create PR
|
- name: Create PR
|
||||||
run: |
|
run: |
|
||||||
|
set -x
|
||||||
TITLE="[externals] Dependency update for $DATE"
|
TITLE="[externals] Dependency update for $DATE"
|
||||||
BODY="$(git show -s --format='%b')"
|
BODY="$(git show -s --format='%b')"
|
||||||
BASE=master
|
BASE=master
|
||||||
HEAD=update-deps-$DATE
|
HEAD=update-deps-$TIMESTAMP
|
||||||
|
|
||||||
cat << EOF > data.json
|
cat << EOF > data.json
|
||||||
{
|
{
|
||||||
@@ -46,7 +49,7 @@ jobs:
|
|||||||
}
|
}
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
curl -X 'POST' \
|
curl -XPOST \
|
||||||
'https://git.eden-emu.dev/api/v1/repos/eden-emu/eden/pulls' \
|
'https://git.eden-emu.dev/api/v1/repos/eden-emu/eden/pulls' \
|
||||||
-H 'accept: application/json' \
|
-H 'accept: application/json' \
|
||||||
-H 'Authorization: Bearer ${{ secrets.CI_FJ_TOKEN }}' \
|
-H 'Authorization: Bearer ${{ secrets.CI_FJ_TOKEN }}' \
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ description: File a bug report
|
|||||||
body:
|
body:
|
||||||
- type: markdown
|
- type: markdown
|
||||||
attributes:
|
attributes:
|
||||||
value: Tech support does not belong here. You should only file an issue here if you think you have experienced an actual bug with yuzu.
|
value: Tech support does not belong here. You should only file an issue here if you think you have experienced an actual bug with Eden.
|
||||||
- type: checkboxes
|
- type: checkboxes
|
||||||
attributes:
|
attributes:
|
||||||
label: Is there an existing issue for this?
|
label: Is there an existing issue for this?
|
||||||
@@ -43,7 +43,7 @@ body:
|
|||||||
id: log
|
id: log
|
||||||
attributes:
|
attributes:
|
||||||
label: Log File
|
label: Log File
|
||||||
description: A log file will help our developers to better diagnose and fix the issue. Instructions can be found [here](https://yuzu-emu.org/help/reference/log-files).
|
description: A log file will help our developers to better diagnose and fix the issue. Instructions can be found [here](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/HowToAccessLogs.md).
|
||||||
validations:
|
validations:
|
||||||
required: true
|
required: true
|
||||||
- type: textarea
|
- type: textarea
|
||||||
+2
-2
@@ -4,7 +4,7 @@ labels: "request"
|
|||||||
body:
|
body:
|
||||||
- type: markdown
|
- type: markdown
|
||||||
attributes:
|
attributes:
|
||||||
value: Tech support does not belong here. You should only file an issue here if you are requesting a feature you believe would make yuzu better.
|
value: Tech support does not belong here. You should only file an issue here if you are requesting a feature you believe would make Eden better.
|
||||||
- type: checkboxes
|
- type: checkboxes
|
||||||
attributes:
|
attributes:
|
||||||
label: Is there an existing issue for this?
|
label: Is there an existing issue for this?
|
||||||
@@ -23,6 +23,6 @@ body:
|
|||||||
id: why-feature
|
id: why-feature
|
||||||
attributes:
|
attributes:
|
||||||
label: Why would this feature be useful?
|
label: Why would this feature be useful?
|
||||||
description: A brief description of why this feature would make yuzu better.
|
description: A brief description of why this feature would make Eden better.
|
||||||
validations:
|
validations:
|
||||||
required: true
|
required: true
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
- [ ] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions).
|
||||||
|
- [ ] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md)
|
||||||
|
- [ ] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability.
|
||||||
|
|
||||||
|
-------------------
|
||||||
+3
-1
@@ -7,7 +7,6 @@
|
|||||||
# Build directory
|
# Build directory
|
||||||
/[Bb]uild*/
|
/[Bb]uild*/
|
||||||
doc-build/
|
doc-build/
|
||||||
out/
|
|
||||||
AppDir/
|
AppDir/
|
||||||
uruntime
|
uruntime
|
||||||
|
|
||||||
@@ -64,3 +63,6 @@ artifacts
|
|||||||
/install*
|
/install*
|
||||||
vulkansdk*.exe
|
vulkansdk*.exe
|
||||||
*.tar.zst
|
*.tar.zst
|
||||||
|
|
||||||
|
# Build-time generated external sources
|
||||||
|
externals/generated
|
||||||
|
|||||||
@@ -1,20 +0,0 @@
|
|||||||
diff --git a/CMakeLists.txt b/CMakeLists.txt
|
|
||||||
index 16c6092..9e75548 100644
|
|
||||||
--- a/CMakeLists.txt
|
|
||||||
+++ b/CMakeLists.txt
|
|
||||||
@@ -8,7 +8,14 @@ project(adrenotools LANGUAGES CXX C)
|
|
||||||
|
|
||||||
set(GEN_INSTALL_TARGET OFF CACHE BOOL "")
|
|
||||||
|
|
||||||
-add_subdirectory(lib/linkernsbypass)
|
|
||||||
+include(CPM)
|
|
||||||
+set(CPM_USE_LOCAL_PACKAGES OFF)
|
|
||||||
+
|
|
||||||
+CPMAddPackage(
|
|
||||||
+ NAME linkernsbypass
|
|
||||||
+ URL "https://github.com/bylaws/liblinkernsbypass/archive/aa3975893d.zip"
|
|
||||||
+ URL_HASH SHA512=43d3d146facb7ec99d066a9b8990369ab7b9eec0d5f9a67131b0a0744fde0af27d884ca1f2a272cd113718a23356530ed97703c8c0659c4c25948d50c106119e
|
|
||||||
+)
|
|
||||||
|
|
||||||
set(LIB_SOURCES src/bcenabler.cpp
|
|
||||||
src/driver.cpp
|
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
From 52bbc5af6523daa22ad62fe4b84bc8d623d11a53 Mon Sep 17 00:00:00 2001
|
||||||
|
From: crueter <crueter@eden-emu.dev>
|
||||||
|
Date: Fri, 26 Jun 2026 01:09:40 -0400
|
||||||
|
Subject: [PATCH] use cpmfile def for linkernsbypass
|
||||||
|
|
||||||
|
---
|
||||||
|
CMakeLists.txt | 3 ++-
|
||||||
|
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/CMakeLists.txt b/CMakeLists.txt
|
||||||
|
index 16c6092..85b242c 100644
|
||||||
|
--- a/CMakeLists.txt
|
||||||
|
+++ b/CMakeLists.txt
|
||||||
|
@@ -8,7 +8,8 @@ project(adrenotools LANGUAGES CXX C)
|
||||||
|
|
||||||
|
set(GEN_INSTALL_TARGET OFF CACHE BOOL "")
|
||||||
|
|
||||||
|
-add_subdirectory(lib/linkernsbypass)
|
||||||
|
+include(CPMUtil)
|
||||||
|
+AddJsonPackage(linkernsbypass)
|
||||||
|
|
||||||
|
set(LIB_SOURCES src/bcenabler.cpp
|
||||||
|
src/driver.cpp
|
||||||
|
--
|
||||||
|
2.54.0
|
||||||
|
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
--- a/source/effect_lexer.cpp
|
||||||
|
+++ b/source/effect_lexer.cpp
|
||||||
|
@@ -1181,7 +1181,7 @@
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
-#if 0
|
||||||
|
+#if !defined(__cpp_lib_to_chars)
|
||||||
|
exponent += decimal_location - mantissa_size;
|
||||||
|
|
||||||
|
const bool exponent_negative = exponent < 0;
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
From b3622608433c183ba868a1dc8dd9cf285eb3b916 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Dario Petrillo <dario.pk1@gmail.com>
|
|
||||||
Date: Thu, 27 Nov 2025 23:12:38 +0100
|
|
||||||
Subject: [PATCH] avoid extra memset when clearing an empty table
|
|
||||||
|
|
||||||
---
|
|
||||||
include/ankerl/unordered_dense.h | 6 ++++--
|
|
||||||
1 file changed, 4 insertions(+), 2 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/include/ankerl/unordered_dense.h b/include/ankerl/unordered_dense.h
|
|
||||||
index 0835342..4938212 100644
|
|
||||||
--- a/include/ankerl/unordered_dense.h
|
|
||||||
+++ b/include/ankerl/unordered_dense.h
|
|
||||||
@@ -1490,8 +1490,10 @@ class table : public std::conditional_t<is_map_v<T>, base_table_type_map<T>, bas
|
|
||||||
// modifiers //////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
void clear() {
|
|
||||||
- m_values.clear();
|
|
||||||
- clear_buckets();
|
|
||||||
+ if (!empty()) {
|
|
||||||
+ m_values.clear();
|
|
||||||
+ clear_buckets();
|
|
||||||
+ }
|
|
||||||
}
|
|
||||||
|
|
||||||
auto insert(value_type const& value) -> std::pair<iterator, bool> {
|
|
||||||
@@ -0,0 +1,112 @@
|
|||||||
|
diff --git a/include/vk_mem_alloc.h b/include/vk_mem_alloc.h
|
||||||
|
index 8df0364..4856064 100644
|
||||||
|
--- a/include/vk_mem_alloc.h
|
||||||
|
+++ b/include/vk_mem_alloc.h
|
||||||
|
@@ -3017,7 +3017,7 @@ remove them if not needed.
|
||||||
|
|
||||||
|
#if defined(__ANDROID_API__) && (__ANDROID_API__ < 16)
|
||||||
|
#include <cstdlib>
|
||||||
|
-static void* vma_aligned_alloc(size_t alignment, size_t size)
|
||||||
|
+static inline void* vma_aligned_alloc(size_t alignment, size_t size)
|
||||||
|
{
|
||||||
|
// alignment must be >= sizeof(void*)
|
||||||
|
if(alignment < sizeof(void*))
|
||||||
|
@@ -3860,7 +3860,7 @@ Returned value is the found element, if present in the collection or place where
|
||||||
|
new element with value (key) should be inserted.
|
||||||
|
*/
|
||||||
|
template <typename CmpLess, typename IterT, typename KeyT>
|
||||||
|
-static IterT VmaBinaryFindFirstNotLess(IterT beg, IterT end, const KeyT& key, const CmpLess& cmp)
|
||||||
|
+static inline IterT VmaBinaryFindFirstNotLess(IterT beg, IterT end, const KeyT& key, const CmpLess& cmp)
|
||||||
|
{
|
||||||
|
size_t down = 0;
|
||||||
|
size_t up = size_t(end - beg);
|
||||||
|
@@ -3898,7 +3898,7 @@ Warning! O(n^2) complexity. Use only inside VMA_HEAVY_ASSERT.
|
||||||
|
T must be pointer type, e.g. VmaAllocation, VmaPool.
|
||||||
|
*/
|
||||||
|
template<typename T>
|
||||||
|
-static bool VmaValidatePointerArray(uint32_t count, const T* arr)
|
||||||
|
+static inline bool VmaValidatePointerArray(uint32_t count, const T* arr)
|
||||||
|
{
|
||||||
|
for (uint32_t i = 0; i < count; ++i)
|
||||||
|
{
|
||||||
|
@@ -4188,13 +4188,13 @@ static void VmaFree(const VkAllocationCallbacks* pAllocationCallbacks, void* ptr
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
-static T* VmaAllocate(const VkAllocationCallbacks* pAllocationCallbacks)
|
||||||
|
+static inline T* VmaAllocate(const VkAllocationCallbacks* pAllocationCallbacks)
|
||||||
|
{
|
||||||
|
return (T*)VmaMalloc(pAllocationCallbacks, sizeof(T), VMA_ALIGN_OF(T));
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
-static T* VmaAllocateArray(const VkAllocationCallbacks* pAllocationCallbacks, size_t count)
|
||||||
|
+static inline T* VmaAllocateArray(const VkAllocationCallbacks* pAllocationCallbacks, size_t count)
|
||||||
|
{
|
||||||
|
return (T*)VmaMalloc(pAllocationCallbacks, sizeof(T) * count, VMA_ALIGN_OF(T));
|
||||||
|
}
|
||||||
|
@@ -4204,14 +4204,14 @@ static T* VmaAllocateArray(const VkAllocationCallbacks* pAllocationCallbacks, si
|
||||||
|
#define vma_new_array(allocator, type, count) new(VmaAllocateArray<type>((allocator), (count)))(type)
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
-static void vma_delete(const VkAllocationCallbacks* pAllocationCallbacks, T* ptr)
|
||||||
|
+static inline void vma_delete(const VkAllocationCallbacks* pAllocationCallbacks, T* ptr)
|
||||||
|
{
|
||||||
|
ptr->~T();
|
||||||
|
VmaFree(pAllocationCallbacks, ptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
-static void vma_delete_array(const VkAllocationCallbacks* pAllocationCallbacks, T* ptr, size_t count)
|
||||||
|
+static inline void vma_delete_array(const VkAllocationCallbacks* pAllocationCallbacks, T* ptr, size_t count)
|
||||||
|
{
|
||||||
|
if (ptr != VMA_NULL)
|
||||||
|
{
|
||||||
|
@@ -4658,13 +4658,13 @@ void VmaVector<T, AllocatorT>::remove(size_t index)
|
||||||
|
#endif // _VMA_VECTOR_FUNCTIONS
|
||||||
|
|
||||||
|
template<typename T, typename allocatorT>
|
||||||
|
-static void VmaVectorInsert(VmaVector<T, allocatorT>& vec, size_t index, const T& item)
|
||||||
|
+static inline void VmaVectorInsert(VmaVector<T, allocatorT>& vec, size_t index, const T& item)
|
||||||
|
{
|
||||||
|
vec.insert(index, item);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T, typename allocatorT>
|
||||||
|
-static void VmaVectorRemove(VmaVector<T, allocatorT>& vec, size_t index)
|
||||||
|
+static inline void VmaVectorRemove(VmaVector<T, allocatorT>& vec, size_t index)
|
||||||
|
{
|
||||||
|
vec.remove(index);
|
||||||
|
}
|
||||||
|
@@ -10620,19 +10620,19 @@ static void VmaFree(VmaAllocator hAllocator, void* ptr)
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
-static T* VmaAllocate(VmaAllocator hAllocator)
|
||||||
|
+static inline T* VmaAllocate(VmaAllocator hAllocator)
|
||||||
|
{
|
||||||
|
return (T*)VmaMalloc(hAllocator, sizeof(T), VMA_ALIGN_OF(T));
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
-static T* VmaAllocateArray(VmaAllocator hAllocator, size_t count)
|
||||||
|
+static inline T* VmaAllocateArray(VmaAllocator hAllocator, size_t count)
|
||||||
|
{
|
||||||
|
return (T*)VmaMalloc(hAllocator, sizeof(T) * count, VMA_ALIGN_OF(T));
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
-static void vma_delete(VmaAllocator hAllocator, T* ptr)
|
||||||
|
+static inline void vma_delete(VmaAllocator hAllocator, T* ptr)
|
||||||
|
{
|
||||||
|
if(ptr != VMA_NULL)
|
||||||
|
{
|
||||||
|
@@ -10642,7 +10642,7 @@ static void vma_delete(VmaAllocator hAllocator, T* ptr)
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
-static void vma_delete_array(VmaAllocator hAllocator, T* ptr, size_t count)
|
||||||
|
+static inline void vma_delete_array(VmaAllocator hAllocator, T* ptr, size_t count)
|
||||||
|
{
|
||||||
|
if(ptr != VMA_NULL)
|
||||||
|
{
|
||||||
@@ -112,11 +112,6 @@ Files: src/yuzu/*.ui
|
|||||||
Copyright: 2018-2022 yuzu Emulator Project
|
Copyright: 2018-2022 yuzu Emulator Project
|
||||||
License: GPL-2.0-or-later
|
License: GPL-2.0-or-later
|
||||||
|
|
||||||
Files: src/yuzu/compatdb.ui
|
|
||||||
src/yuzu/main.ui
|
|
||||||
Copyright: 2014-2017 Citra Emulator Project
|
|
||||||
License: GPL-2.0-or-later
|
|
||||||
|
|
||||||
Files: src/yuzu/loading_screen.ui
|
Files: src/yuzu/loading_screen.ui
|
||||||
Copyright: 2019 James Rowe <jroweboy@gmail.com>
|
Copyright: 2019 James Rowe <jroweboy@gmail.com>
|
||||||
License: GPL-2.0-or-later
|
License: GPL-2.0-or-later
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
AI and LLM use is *strictly* prohibited within our codebase and surrounding community, including issues and comments. This includes using AI or LLMs to write docs/commit messages, debug issues, brainstorm ideas, research concepts, or search the codebase.
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
AI and LLM use is *strictly* prohibited within our codebase and surrounding community, including issues and comments. This includes using AI or LLMs to write docs/commit messages, debug issues, brainstorm ideas, research concepts, or search the codebase.
|
||||||
+44
-48
@@ -3,9 +3,11 @@
|
|||||||
|
|
||||||
cmake_minimum_required(VERSION 3.31)
|
cmake_minimum_required(VERSION 3.31)
|
||||||
|
|
||||||
|
set(CMAKE_OSX_DEPLOYMENT_TARGET "15.0" CACHE STRING "macOS deployment target")
|
||||||
project(yuzu)
|
project(yuzu)
|
||||||
|
|
||||||
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/CMakeModules")
|
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/CMakeModules")
|
||||||
|
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/CMakeModules/find")
|
||||||
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/externals/cmake-modules")
|
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/externals/cmake-modules")
|
||||||
|
|
||||||
set(CPM_SOURCE_CACHE ${CMAKE_SOURCE_DIR}/.cache/cpm)
|
set(CPM_SOURCE_CACHE ${CMAKE_SOURCE_DIR}/.cache/cpm)
|
||||||
@@ -27,23 +29,23 @@ if (NOT DEFINED ARCHITECTURE)
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
# Needed for FFmpeg w/ VAAPI and DRM
|
# Needed for FFmpeg w/ VAAPI and DRM
|
||||||
if (PLATFORM_OPENBSD)
|
if (OPENBSD)
|
||||||
# OpenBSD 7.8 broke libcxx when upgrading, so we must define the PSTL backend manually
|
# OpenBSD 7.8 broke libcxx when upgrading, so we must define the PSTL backend manually
|
||||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -I${CMAKE_SYSROOT}/usr/X11R6/include -D_LIBCPP_PSTL_BACKEND_SERIAL=1")
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -I${CMAKE_SYSROOT}/usr/X11R6/include -D_LIBCPP_PSTL_BACKEND_SERIAL=1")
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -I${CMAKE_SYSROOT}/usr/X11R6/include -D_LIBCPP_PSTL_BACKEND_SERIAL=1")
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -I${CMAKE_SYSROOT}/usr/X11R6/include -D_LIBCPP_PSTL_BACKEND_SERIAL=1")
|
||||||
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -L${CMAKE_SYSROOT}/usr/X11R6/lib")
|
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -L${CMAKE_SYSROOT}/usr/X11R6/lib")
|
||||||
elseif (PLATFORM_NETBSD)
|
elseif (NETBSD)
|
||||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -I${CMAKE_SYSROOT}/usr/X11R7/include -I${CMAKE_SYSROOT}/usr/pkg/include/c++/v1")
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -I${CMAKE_SYSROOT}/usr/X11R7/include -I${CMAKE_SYSROOT}/usr/pkg/include/c++/v1")
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -I${CMAKE_SYSROOT}/usr/X11R7/include -I${CMAKE_SYSROOT}/usr/pkg/include/c++/v1")
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -I${CMAKE_SYSROOT}/usr/X11R7/include -I${CMAKE_SYSROOT}/usr/pkg/include/c++/v1")
|
||||||
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -L${CMAKE_SYSROOT}/usr/X11R7/lib")
|
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -L${CMAKE_SYSROOT}/usr/X11R7/lib")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# NetBSD: Fun for the whole family!
|
# NetBSD: Fun for the whole family!
|
||||||
if (PLATFORM_NETBSD)
|
if (NETBSD)
|
||||||
set(ENV{PKG_CONFIG_PATH} "${PKG_CONFIG_PATH}:${CMAKE_SYSROOT}/usr/pkg/lib/ffmpeg7/pkgconfig")
|
set(ENV{PKG_CONFIG_PATH} "${PKG_CONFIG_PATH}:${CMAKE_SYSROOT}/usr/pkg/lib/ffmpeg7/pkgconfig")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
cmake_dependent_option(YUZU_STATIC_ROOM "Build a static room executable only (CI only)" OFF "PLATFORM_LINUX" OFF)
|
cmake_dependent_option(YUZU_STATIC_ROOM "Build a static room executable only (CI only)" OFF "LINUX" OFF)
|
||||||
if (YUZU_STATIC_ROOM)
|
if (YUZU_STATIC_ROOM)
|
||||||
set(YUZU_ROOM ON)
|
set(YUZU_ROOM ON)
|
||||||
set(YUZU_ROOM_STANDALONE ON)
|
set(YUZU_ROOM_STANDALONE ON)
|
||||||
@@ -62,6 +64,7 @@ if (YUZU_STATIC_ROOM)
|
|||||||
set(Boost_USE_STATIC_LIBS ON)
|
set(Boost_USE_STATIC_LIBS ON)
|
||||||
set(CMAKE_FIND_LIBRARY_SUFFIXES ".a")
|
set(CMAKE_FIND_LIBRARY_SUFFIXES ".a")
|
||||||
set(OPENSSL_USE_STATIC_LIBS ON)
|
set(OPENSSL_USE_STATIC_LIBS ON)
|
||||||
|
set(OpenSSL_FORCE_SYSTEM ON)
|
||||||
|
|
||||||
set(zstd_FORCE_BUNDLED ON)
|
set(zstd_FORCE_BUNDLED ON)
|
||||||
set(fmt_FORCE_BUNDLED ON)
|
set(fmt_FORCE_BUNDLED ON)
|
||||||
@@ -77,6 +80,12 @@ set(YUZU_QT_MIRROR "" CACHE STRING "What mirror to use for downloading the bundl
|
|||||||
cmake_dependent_option(YUZU_USE_BUNDLED_QT "Download bundled Qt binaries" "${MSVC}" "ENABLE_QT" OFF)
|
cmake_dependent_option(YUZU_USE_BUNDLED_QT "Download bundled Qt binaries" "${MSVC}" "ENABLE_QT" OFF)
|
||||||
|
|
||||||
option(ENABLE_DEBUG_TOOLS "Enable debugging tools (maxwell disassembler, SPIRV translator, etc)" OFF)
|
option(ENABLE_DEBUG_TOOLS "Enable debugging tools (maxwell disassembler, SPIRV translator, etc)" OFF)
|
||||||
|
option(ENABLE_WERROR "Enable -Werror diagnostics" ON)
|
||||||
|
|
||||||
|
# Lossless Scaling frame generation. Only Android.
|
||||||
|
cmake_dependent_option(ENABLE_LSFG "Enable Lossless Scaling frame generation" ON "ANDROID" OFF)
|
||||||
|
|
||||||
|
option(ENABLE_RESHADE "Enable ReShade FX post-processing effects" ON)
|
||||||
|
|
||||||
# non-linux bundled qt are static
|
# non-linux bundled qt are static
|
||||||
if (YUZU_USE_BUNDLED_QT AND (APPLE OR NOT UNIX))
|
if (YUZU_USE_BUNDLED_QT AND (APPLE OR NOT UNIX))
|
||||||
@@ -155,6 +164,17 @@ if (CXX_CLANG_CL)
|
|||||||
$<$<COMPILE_LANGUAGE:C,CXX>:-Wno-reserved-identifier>
|
$<$<COMPILE_LANGUAGE:C,CXX>:-Wno-reserved-identifier>
|
||||||
$<$<COMPILE_LANGUAGE:C,CXX>:-Wno-deprecated-declarations>
|
$<$<COMPILE_LANGUAGE:C,CXX>:-Wno-deprecated-declarations>
|
||||||
$<$<COMPILE_LANGUAGE:C,CXX>:-Wno-cast-function-type-mismatch>
|
$<$<COMPILE_LANGUAGE:C,CXX>:-Wno-cast-function-type-mismatch>
|
||||||
|
$<$<COMPILE_LANGUAGE:C,CXX>:-Wno-c99-extensions>
|
||||||
|
$<$<COMPILE_LANGUAGE:C,CXX>:-Wno-c++17-compat>
|
||||||
|
$<$<COMPILE_LANGUAGE:C,CXX>:-Wno-c++11-compat-reserved-user-defined-literal>
|
||||||
|
$<$<COMPILE_LANGUAGE:C,CXX>:-Wno-c++11-compat-deprecated-writable-strings>
|
||||||
|
$<$<COMPILE_LANGUAGE:C,CXX>:-Wno-c++11-compat-pedantic>
|
||||||
|
$<$<COMPILE_LANGUAGE:C,CXX>:-Wno-c++11-compat>
|
||||||
|
$<$<COMPILE_LANGUAGE:C,CXX>:-Wno-c++0x-compat>
|
||||||
|
$<$<COMPILE_LANGUAGE:C,CXX>:-Wno-c++98-c++11-compat-binary-literal>
|
||||||
|
$<$<COMPILE_LANGUAGE:C,CXX>:-Wno-c++98-compat-pedantic>
|
||||||
|
$<$<COMPILE_LANGUAGE:C,CXX>:-Wno-c++98-compat>
|
||||||
|
$<$<COMPILE_LANGUAGE:C,CXX>:-Wno-c99-compat>
|
||||||
$<$<COMPILE_LANGUAGE:C,CXX>:/EHsc>)
|
$<$<COMPILE_LANGUAGE:C,CXX>:/EHsc>)
|
||||||
# REQUIRED CPU features IN Windows-amd64
|
# REQUIRED CPU features IN Windows-amd64
|
||||||
if (ARCHITECTURE_x86_64)
|
if (ARCHITECTURE_x86_64)
|
||||||
@@ -197,8 +217,6 @@ if(MSVC)
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
# TODO(crueter): Cleanup, each dep that has a bundled option should allow to choose between bundled, external, system
|
# TODO(crueter): Cleanup, each dep that has a bundled option should allow to choose between bundled, external, system
|
||||||
cmake_dependent_option(YUZU_USE_BUNDLED_SDL3 "Download bundled SDL3 build" "${MSVC}" "NOT ANDROID" OFF)
|
|
||||||
|
|
||||||
option(ENABLE_CUBEB "Enables the cubeb audio backend" ON)
|
option(ENABLE_CUBEB "Enables the cubeb audio backend" ON)
|
||||||
|
|
||||||
set(EXT_DEFAULT OFF)
|
set(EXT_DEFAULT OFF)
|
||||||
@@ -206,9 +224,11 @@ if (MSVC OR ANDROID)
|
|||||||
set(EXT_DEFAULT ON)
|
set(EXT_DEFAULT ON)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
option(YUZU_USE_BUNDLED_SDL3 "Download bundled SDL3 build" ${EXT_DEFAULT})
|
||||||
|
|
||||||
# ffmpeg
|
# ffmpeg
|
||||||
option(YUZU_USE_BUNDLED_FFMPEG "Download bundled FFmpeg" ${EXT_DEFAULT})
|
option(YUZU_USE_BUNDLED_FFMPEG "Download bundled FFmpeg" ${EXT_DEFAULT})
|
||||||
cmake_dependent_option(YUZU_USE_EXTERNAL_FFMPEG "Build FFmpeg from external source" "${PLATFORM_SUN}" "NOT WIN32 AND NOT ANDROID" OFF)
|
cmake_dependent_option(YUZU_USE_EXTERNAL_FFMPEG "Build FFmpeg from external source" "${SOLARIS}" "NOT WIN32 AND NOT ANDROID" OFF)
|
||||||
|
|
||||||
# sirit
|
# sirit
|
||||||
set(BUNDLED_SIRIT_DEFAULT OFF)
|
set(BUNDLED_SIRIT_DEFAULT OFF)
|
||||||
@@ -219,9 +239,9 @@ endif()
|
|||||||
option(YUZU_USE_BUNDLED_SIRIT "Download bundled sirit" ${BUNDLED_SIRIT_DEFAULT})
|
option(YUZU_USE_BUNDLED_SIRIT "Download bundled sirit" ${BUNDLED_SIRIT_DEFAULT})
|
||||||
|
|
||||||
# FreeBSD 15+ has libusb, versions below should disable it
|
# FreeBSD 15+ has libusb, versions below should disable it
|
||||||
cmake_dependent_option(ENABLE_LIBUSB "Enable the use of LibUSB" ON "WIN32 OR PLATFORM_LINUX OR PLATFORM_FREEBSD OR APPLE" OFF)
|
cmake_dependent_option(ENABLE_LIBUSB "Enable the use of LibUSB" ON "WIN32 OR LINUX OR FREEBSD OR APPLE" OFF)
|
||||||
|
|
||||||
cmake_dependent_option(ENABLE_OPENGL "Enable OpenGL" ON "NOT (WIN32 AND ARCHITECTURE_arm64) AND NOT APPLE" OFF)
|
cmake_dependent_option(ENABLE_OPENGL "Enable OpenGL" ON "NOT (WIN32 AND ARCHITECTURE_arm64) AND NOT APPLE AND NOT ANDROID" OFF)
|
||||||
mark_as_advanced(FORCE ENABLE_OPENGL)
|
mark_as_advanced(FORCE ENABLE_OPENGL)
|
||||||
|
|
||||||
option(ENABLE_WEB_SERVICE "Enable web services (telemetry, etc.)" ON)
|
option(ENABLE_WEB_SERVICE "Enable web services (telemetry, etc.)" ON)
|
||||||
@@ -233,7 +253,7 @@ option(YUZU_TESTS "Compile tests" "${BUILD_TESTING}")
|
|||||||
|
|
||||||
# Install udev rules on Linux (mainly for gyros)
|
# Install udev rules on Linux (mainly for gyros)
|
||||||
# Only acts on joysticks and nothing else.
|
# Only acts on joysticks and nothing else.
|
||||||
cmake_dependent_option(YUZU_INSTALL_UDEV_RULES "Install udev rules for gyro access" OFF "PLATFORM_LINUX" OFF)
|
cmake_dependent_option(YUZU_INSTALL_UDEV_RULES "Install udev rules for gyro access" OFF "LINUX" OFF)
|
||||||
|
|
||||||
option(YUZU_DOWNLOAD_ANDROID_VVL "Download validation layer binary for android" ON)
|
option(YUZU_DOWNLOAD_ANDROID_VVL "Download validation layer binary for android" ON)
|
||||||
|
|
||||||
@@ -246,7 +266,7 @@ cmake_dependent_option(YUZU_ROOM_STANDALONE "Enable standalone room executable"
|
|||||||
|
|
||||||
cmake_dependent_option(YUZU_CMD "Compile the eden-cli executable" ON "NOT ANDROID" OFF)
|
cmake_dependent_option(YUZU_CMD "Compile the eden-cli executable" ON "NOT ANDROID" OFF)
|
||||||
|
|
||||||
cmake_dependent_option(YUZU_CRASH_DUMPS "Compile crash dump (Minidump) support" OFF "WIN32 OR PLATFORM_LINUX" OFF)
|
cmake_dependent_option(YUZU_CRASH_DUMPS "Compile crash dump (Minidump) support" OFF "WIN32 OR LINUX" OFF)
|
||||||
|
|
||||||
option(YUZU_DOWNLOAD_TIME_ZONE_DATA "Always download time zone binaries" ON)
|
option(YUZU_DOWNLOAD_TIME_ZONE_DATA "Always download time zone binaries" ON)
|
||||||
set(YUZU_TZDB_PATH "" CACHE STRING "Path to a pre-downloaded timezone database")
|
set(YUZU_TZDB_PATH "" CACHE STRING "Path to a pre-downloaded timezone database")
|
||||||
@@ -256,7 +276,7 @@ cmake_dependent_option(YUZU_USE_BUNDLED_MOLTENVK "Download bundled MoltenVK lib"
|
|||||||
option(YUZU_DISABLE_LLVM "Disable LLVM (useful for CI)" OFF)
|
option(YUZU_DISABLE_LLVM "Disable LLVM (useful for CI)" OFF)
|
||||||
|
|
||||||
set(DEFAULT_YUZU_USE_BUNDLED_OPENSSL OFF)
|
set(DEFAULT_YUZU_USE_BUNDLED_OPENSSL OFF)
|
||||||
if (EXT_DEFAULT OR PLATFORM_SUN OR PLATFORM_OPENBSD)
|
if (EXT_DEFAULT OR SOLARIS OR OPENBSD)
|
||||||
set(DEFAULT_YUZU_USE_BUNDLED_OPENSSL ON)
|
set(DEFAULT_YUZU_USE_BUNDLED_OPENSSL ON)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
@@ -268,7 +288,7 @@ if (ANDROID AND YUZU_DOWNLOAD_ANDROID_VVL)
|
|||||||
set(abi ${CMAKE_ANDROID_ARCH_ABI})
|
set(abi ${CMAKE_ANDROID_ARCH_ABI})
|
||||||
|
|
||||||
set(vvl_lib_path "${CMAKE_CURRENT_SOURCE_DIR}/src/android/app/src/main/jniLibs/${abi}/")
|
set(vvl_lib_path "${CMAKE_CURRENT_SOURCE_DIR}/src/android/app/src/main/jniLibs/${abi}/")
|
||||||
file(COPY "${VVL_SOURCE_DIR}/${abi}/libVkLayer_khronos_validation.so"
|
file(COPY "${vulkan-validation-layers_SOURCE_DIR}/${abi}/libVkLayer_khronos_validation.so"
|
||||||
DESTINATION "${vvl_lib_path}")
|
DESTINATION "${vvl_lib_path}")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
@@ -279,26 +299,7 @@ if(EXISTS ${PROJECT_SOURCE_DIR}/hooks/pre-commit AND NOT EXISTS ${PROJECT_SOURCE
|
|||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
set(compat_base dist/compatibility_list/compatibility_list)
|
if (ARCHITECTURE_arm64 AND (ANDROID OR LINUX))
|
||||||
set(compat_qrc ${compat_base}.qrc)
|
|
||||||
set(compat_json ${compat_base}.json)
|
|
||||||
|
|
||||||
configure_file(${PROJECT_SOURCE_DIR}/${compat_qrc}
|
|
||||||
${PROJECT_BINARY_DIR}/${compat_qrc}
|
|
||||||
COPYONLY)
|
|
||||||
|
|
||||||
if (EXISTS ${PROJECT_SOURCE_DIR}/${compat_json})
|
|
||||||
configure_file("${PROJECT_SOURCE_DIR}/${compat_json}"
|
|
||||||
"${PROJECT_BINARY_DIR}/${compat_json}"
|
|
||||||
COPYONLY)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# TODO: Compat list download
|
|
||||||
if (NOT EXISTS ${PROJECT_BINARY_DIR}/${compat_json})
|
|
||||||
file(WRITE ${PROJECT_BINARY_DIR}/${compat_json} "")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if (ARCHITECTURE_arm64 AND (ANDROID OR PLATFORM_LINUX))
|
|
||||||
set(HAS_NCE 1)
|
set(HAS_NCE 1)
|
||||||
add_compile_definitions(HAS_NCE=1)
|
add_compile_definitions(HAS_NCE=1)
|
||||||
endif()
|
endif()
|
||||||
@@ -307,7 +308,7 @@ if (YUZU_ROOM)
|
|||||||
add_compile_definitions(YUZU_ROOM)
|
add_compile_definitions(YUZU_ROOM)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (UNIX AND NOT (PLATFORM_LINUX OR WIN32))
|
if (UNIX AND NOT (LINUX OR WIN32))
|
||||||
if(CXX_APPLE OR CXX_CLANG)
|
if(CXX_APPLE OR CXX_CLANG)
|
||||||
# libc++ has stop_token and jthread as experimental
|
# libc++ has stop_token and jthread as experimental
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fexperimental-library")
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fexperimental-library")
|
||||||
@@ -342,11 +343,12 @@ if (CXX_GCC OR CXX_CLANG)
|
|||||||
endif()
|
endif()
|
||||||
elseif(ARCHITECTURE_arm64)
|
elseif(ARCHITECTURE_arm64)
|
||||||
# See https://gcc.gnu.org/onlinedocs/gcc/AArch64-Options.html
|
# See https://gcc.gnu.org/onlinedocs/gcc/AArch64-Options.html
|
||||||
set(YUZU_BUILD_PRESET "custom" CACHE STRING "Build preset to use. One of: custom, generic, armv9, native")
|
set(YUZU_BUILD_PRESET "custom" CACHE STRING "Build preset to use. One of: custom, generic, optimized, armv9, native")
|
||||||
set(mtune generic)
|
set(mtune generic)
|
||||||
|
|
||||||
if (${YUZU_BUILD_PRESET} STREQUAL "generic")
|
if (${YUZU_BUILD_PRESET} STREQUAL "generic")
|
||||||
set(march armv8-a)
|
set(march armv8-a)
|
||||||
|
elseif (${YUZU_BUILD_PRESET} STREQUAL "optimized")
|
||||||
|
set(march armv8.2-a+lse+rcpc)
|
||||||
elseif (${YUZU_BUILD_PRESET} STREQUAL "armv9")
|
elseif (${YUZU_BUILD_PRESET} STREQUAL "armv9")
|
||||||
set(march armv9-a)
|
set(march armv9-a)
|
||||||
endif()
|
endif()
|
||||||
@@ -421,7 +423,7 @@ if (Boost_ADDED)
|
|||||||
|
|
||||||
if (NOT MSVC OR CXX_CLANG)
|
if (NOT MSVC OR CXX_CLANG)
|
||||||
# boost sucks
|
# boost sucks
|
||||||
if (PLATFORM_SUN)
|
if (SOLARIS)
|
||||||
add_compile_options($<$<COMPILE_LANGUAGE:C,CXX>:-pthreads>)
|
add_compile_options($<$<COMPILE_LANGUAGE:C,CXX>:-pthreads>)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
@@ -513,7 +515,7 @@ endfunction()
|
|||||||
# =============================================
|
# =============================================
|
||||||
|
|
||||||
if (APPLE)
|
if (APPLE)
|
||||||
foreach(fw Carbon Metal Cocoa IOKit CoreVideo CoreMedia Security UniformTypeIdentifiers)
|
foreach(fw Carbon Metal Cocoa IOKit CoreVideo CoreMedia Security UniformTypeIdentifiers Foundation)
|
||||||
find_library(${fw}_LIBRARY ${fw} REQUIRED)
|
find_library(${fw}_LIBRARY ${fw} REQUIRED)
|
||||||
list(APPEND PLATFORM_LIBRARIES ${${fw}_LIBRARY})
|
list(APPEND PLATFORM_LIBRARIES ${${fw}_LIBRARY})
|
||||||
endforeach()
|
endforeach()
|
||||||
@@ -525,9 +527,9 @@ elseif (WIN32)
|
|||||||
# PSAPI is the Process Status API
|
# PSAPI is the Process Status API
|
||||||
set(PLATFORM_LIBRARIES ${PLATFORM_LIBRARIES} psapi imm32 version crypt32 rpcrt4 gdi32 wldap32 mswsock)
|
set(PLATFORM_LIBRARIES ${PLATFORM_LIBRARIES} psapi imm32 version crypt32 rpcrt4 gdi32 wldap32 mswsock)
|
||||||
endif()
|
endif()
|
||||||
elseif (PLATFORM_MANAGARM)
|
elseif (MANAGARM)
|
||||||
set(PLATFORM_LIBRARIES iconv intl)
|
set(PLATFORM_LIBRARIES iconv intl)
|
||||||
elseif (PLATFORM_HAIKU)
|
elseif (HAIKUOS)
|
||||||
# Haiku is so special :)
|
# Haiku is so special :)
|
||||||
set(PLATFORM_LIBRARIES bsd /boot/system/lib/libnetwork.so)
|
set(PLATFORM_LIBRARIES bsd /boot/system/lib/libnetwork.so)
|
||||||
elseif (CMAKE_SYSTEM_NAME MATCHES "^(Linux|kFreeBSD|GNU|SunOS)$")
|
elseif (CMAKE_SYSTEM_NAME MATCHES "^(Linux|kFreeBSD|GNU|SunOS)$")
|
||||||
@@ -541,7 +543,6 @@ add_subdirectory(externals)
|
|||||||
# pass targets from externals
|
# pass targets from externals
|
||||||
# TODO(crueter): CPMUtil Propagate func?
|
# TODO(crueter): CPMUtil Propagate func?
|
||||||
find_package(enet)
|
find_package(enet)
|
||||||
find_package(unordered_dense REQUIRED)
|
|
||||||
|
|
||||||
if (ARCHITECTURE_x86 OR ARCHITECTURE_x86_64)
|
if (ARCHITECTURE_x86 OR ARCHITECTURE_x86_64)
|
||||||
find_package(xbyak)
|
find_package(xbyak)
|
||||||
@@ -588,12 +589,7 @@ endif()
|
|||||||
# Qt stuff
|
# Qt stuff
|
||||||
if (ENABLE_QT)
|
if (ENABLE_QT)
|
||||||
if (YUZU_USE_BUNDLED_QT)
|
if (YUZU_USE_BUNDLED_QT)
|
||||||
# Qt 6.8+ is broken on macOS (??)
|
AddQt(Eden-CI/Qt 6.11.1)
|
||||||
if (APPLE)
|
|
||||||
AddQt(Eden-CI/Qt 6.7.3)
|
|
||||||
else()
|
|
||||||
AddQt(Eden-CI/Qt 6.11.1)
|
|
||||||
endif()
|
|
||||||
else()
|
else()
|
||||||
message(STATUS "Using system Qt")
|
message(STATUS "Using system Qt")
|
||||||
if (NOT Qt6_DIR)
|
if (NOT Qt6_DIR)
|
||||||
@@ -626,7 +622,7 @@ if (ENABLE_QT)
|
|||||||
|
|
||||||
# Best practice is to ask for all components at once, so they are from the same version
|
# Best practice is to ask for all components at once, so they are from the same version
|
||||||
set(YUZU_QT_COMPONENTS Core Widgets Charts Concurrent Gui)
|
set(YUZU_QT_COMPONENTS Core Widgets Charts Concurrent Gui)
|
||||||
if (PLATFORM_LINUX OR PLATFORM_FREEBSD)
|
if (LINUX OR FREEBSD)
|
||||||
list(APPEND YUZU_QT_COMPONENTS DBus)
|
list(APPEND YUZU_QT_COMPONENTS DBus)
|
||||||
# yes Qt, we get it
|
# yes Qt, we get it
|
||||||
set(QT_NO_PRIVATE_MODULE_WARNING ON)
|
set(QT_NO_PRIVATE_MODULE_WARNING ON)
|
||||||
|
|||||||
+143
-1181
File diff suppressed because it is too large
Load Diff
+774
-387
File diff suppressed because it is too large
Load Diff
@@ -1,39 +0,0 @@
|
|||||||
# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
|
||||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
|
||||||
|
|
||||||
# SPDX-FileCopyrightText: 2018 yuzu Emulator Project
|
|
||||||
# SPDX-License-Identifier: GPL-2.0-or-later
|
|
||||||
|
|
||||||
# This file provides the function windows_copy_files.
|
|
||||||
# This is only valid on Windows.
|
|
||||||
|
|
||||||
# Include guard
|
|
||||||
if(__windows_copy_files)
|
|
||||||
return()
|
|
||||||
endif()
|
|
||||||
set(__windows_copy_files YES)
|
|
||||||
|
|
||||||
# Any number of files to copy from SOURCE_DIR to DEST_DIR can be specified after DEST_DIR.
|
|
||||||
# This copying happens post-build.
|
|
||||||
if (CMAKE_HOST_SYSTEM_NAME STREQUAL "Windows")
|
|
||||||
function(windows_copy_files TARGET SOURCE_DIR DEST_DIR)
|
|
||||||
# windows commandline expects the / to be \ so switch them
|
|
||||||
string(REPLACE "/" "\\\\" SOURCE_DIR ${SOURCE_DIR})
|
|
||||||
string(REPLACE "/" "\\\\" DEST_DIR ${DEST_DIR})
|
|
||||||
|
|
||||||
# /NJH /NJS /NDL /NFL /NC /NS /NP - Silence any output
|
|
||||||
# cmake adds an extra check for command success which doesn't work too well with robocopy
|
|
||||||
# so trick it into thinking the command was successful with the || cmd /c "exit /b 0"
|
|
||||||
add_custom_command(TARGET ${TARGET} POST_BUILD
|
|
||||||
COMMAND ${CMAKE_COMMAND} -E make_directory ${DEST_DIR}
|
|
||||||
COMMAND robocopy ${SOURCE_DIR} ${DEST_DIR} ${ARGN} /NJH /NJS /NDL /NFL /NC /NS /NP || cmd /c "exit /b 0"
|
|
||||||
)
|
|
||||||
endfunction()
|
|
||||||
else()
|
|
||||||
function(windows_copy_files TARGET SOURCE_DIR DEST_DIR)
|
|
||||||
add_custom_command(TARGET ${TARGET} POST_BUILD
|
|
||||||
COMMAND ${CMAKE_COMMAND} -E make_directory ${DEST_DIR}
|
|
||||||
COMMAND cp -ra ${SOURCE_DIR}/. ${DEST_DIR}
|
|
||||||
)
|
|
||||||
endfunction()
|
|
||||||
endif()
|
|
||||||
@@ -1,30 +0,0 @@
|
|||||||
# SPDX-FileCopyrightText: 2024 kleidis
|
|
||||||
|
|
||||||
[aqt]
|
|
||||||
concurrency: 2
|
|
||||||
|
|
||||||
[mirrors]
|
|
||||||
trusted_mirrors:
|
|
||||||
https://download.qt.io
|
|
||||||
blacklist:
|
|
||||||
https://qt.mirror.constant.com
|
|
||||||
https://mirrors.ocf.berkeley.edu
|
|
||||||
https://mirrors.ustc.edu.cn
|
|
||||||
https://mirrors.tuna.tsinghua.edu.cn
|
|
||||||
https://mirrors.geekpie.club
|
|
||||||
https://mirrors-wan.geekpie.club
|
|
||||||
https://mirrors.sjtug.sjtu.edu.cn
|
|
||||||
fallbacks:
|
|
||||||
https://qtproject.mirror.liquidtelecom.com/
|
|
||||||
https://mirrors.aliyun.com/qt/
|
|
||||||
https://ftp.jaist.ac.jp/pub/qtproject/
|
|
||||||
https://ftp.yz.yamagata-u.ac.jp/pub/qtproject/
|
|
||||||
https://qt-mirror.dannhauer.de/
|
|
||||||
https://ftp.fau.de/qtproject/
|
|
||||||
https://mirror.netcologne.de/qtproject/
|
|
||||||
https://mirrors.dotsrc.org/qtproject/
|
|
||||||
https://www.nic.funet.fi/pub/mirrors/download.qt-project.org/
|
|
||||||
https://master.qt.io/
|
|
||||||
https://mirrors.ukfast.co.uk/sites/qt.io/
|
|
||||||
https://ftp2.nluug.nl/languages/qt/
|
|
||||||
https://ftp1.nluug.nl/languages/qt/
|
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
# SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
# SPDX-FileCopyrightText: 2022 Alexandre Bouvier <contact@amb.tf>
|
# SPDX-FileCopyrightText: 2022 Alexandre Bouvier <contact@amb.tf>
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
# SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
# SPDX-FileCopyrightText: 2019 Citra Emulator Project
|
# SPDX-FileCopyrightText: 2019 Citra Emulator Project
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
# SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
# SPDX-FileCopyrightText: 2022 yuzu Emulator Project
|
# SPDX-FileCopyrightText: 2022 yuzu Emulator Project
|
||||||
@@ -13,7 +13,7 @@ find_package_handle_standard_args(Opus
|
|||||||
VERSION_VAR OPUS_VERSION
|
VERSION_VAR OPUS_VERSION
|
||||||
)
|
)
|
||||||
|
|
||||||
if (PLATFORM_MSYS)
|
if (MSYS2)
|
||||||
FixMsysPath(PkgConfig::OPUS)
|
FixMsysPath(PkgConfig::OPUS)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
@@ -1,3 +1,6 @@
|
|||||||
|
# SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||||
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
# SPDX-FileCopyrightText: 2023 Alexandre Bouvier <contact@amb.tf>
|
# SPDX-FileCopyrightText: 2023 Alexandre Bouvier <contact@amb.tf>
|
||||||
#
|
#
|
||||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
@@ -1,3 +1,6 @@
|
|||||||
|
# SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||||
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
# SPDX-FileCopyrightText: 2023 Alexandre Bouvier <contact@amb.tf>
|
# SPDX-FileCopyrightText: 2023 Alexandre Bouvier <contact@amb.tf>
|
||||||
#
|
#
|
||||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
# SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
# SPDX-FileCopyrightText: 2022 Alexandre Bouvier <contact@amb.tf>
|
# SPDX-FileCopyrightText: 2022 Alexandre Bouvier <contact@amb.tf>
|
||||||
@@ -14,7 +14,7 @@ find_package_handle_standard_args(enet
|
|||||||
VERSION_VAR ENET_VERSION
|
VERSION_VAR ENET_VERSION
|
||||||
)
|
)
|
||||||
|
|
||||||
if (PLATFORM_MSYS)
|
if (MSYS2)
|
||||||
FixMsysPath(PkgConfig::ENET)
|
FixMsysPath(PkgConfig::ENET)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
@@ -1,3 +1,6 @@
|
|||||||
|
# SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||||
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
# SPDX-FileCopyrightText: 2023 yuzu Emulator Project
|
# SPDX-FileCopyrightText: 2023 yuzu Emulator Project
|
||||||
# SPDX-License-Identifier: GPL-2.0-or-later
|
# SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
@@ -1,3 +1,6 @@
|
|||||||
|
# SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||||
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
# SPDX-FileCopyrightText: 2022 Andrea Pappacoda <andrea@pappacoda.it>
|
# SPDX-FileCopyrightText: 2022 Andrea Pappacoda <andrea@pappacoda.it>
|
||||||
#
|
#
|
||||||
# SPDX-License-Identifier: GPL-2.0-or-later
|
# SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
# SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
find_package(PkgConfig QUIET)
|
find_package(PkgConfig QUIET)
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
# SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
# SPDX-FileCopyrightText: 2022 Alexandre Bouvier <contact@amb.tf>
|
# SPDX-FileCopyrightText: 2022 Alexandre Bouvier <contact@amb.tf>
|
||||||
@@ -14,7 +14,7 @@ find_package_handle_standard_args(libusb
|
|||||||
VERSION_VAR LIBUSB_VERSION
|
VERSION_VAR LIBUSB_VERSION
|
||||||
)
|
)
|
||||||
|
|
||||||
if (PLATFORM_MSYS)
|
if (MSYS2)
|
||||||
FixMsysPath(PkgConfig::LIBUSB)
|
FixMsysPath(PkgConfig::LIBUSB)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
# SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
# SPDX-FileCopyrightText: 2022 yuzu Emulator Project
|
# SPDX-FileCopyrightText: 2022 yuzu Emulator Project
|
||||||
@@ -13,7 +13,7 @@ else()
|
|||||||
find_package(PkgConfig QUIET)
|
find_package(PkgConfig QUIET)
|
||||||
pkg_search_module(LZ4 QUIET IMPORTED_TARGET liblz4)
|
pkg_search_module(LZ4 QUIET IMPORTED_TARGET liblz4)
|
||||||
|
|
||||||
if (PLATFORM_MSYS)
|
if (MSYS2)
|
||||||
FixMsysPath(PkgConfig::LZ4)
|
FixMsysPath(PkgConfig::LZ4)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
@@ -1,3 +1,6 @@
|
|||||||
|
# SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||||
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
# SPDX-FileCopyrightText: 2023 Alexandre Bouvier <contact@amb.tf>
|
# SPDX-FileCopyrightText: 2023 Alexandre Bouvier <contact@amb.tf>
|
||||||
#
|
#
|
||||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
# SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
# SPDX-FileCopyrightText: 2022 yuzu Emulator Project
|
# SPDX-FileCopyrightText: 2022 yuzu Emulator Project
|
||||||
@@ -0,0 +1,39 @@
|
|||||||
|
# SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||||
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
|
set(CROSS_TARGET "" CACHE STRING "Cross-compilation target (aarch64, etc)")
|
||||||
|
set(CROSS_PLATFORM "unknown-linux-gnu" CACHE STRING "Cross-compilation platform (e.g. unknown-linux-gnu)")
|
||||||
|
set(CROSS_COMPILER "gcc" CACHE STRING "Cross compiler type (gcc or clang)")
|
||||||
|
|
||||||
|
if (NOT CROSS_TARGET)
|
||||||
|
message(FATAL_ERROR "GentooCross used without a valid CROSS_TARGET")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set(prefix ${CROSS_TARGET}-${CROSS_PLATFORM})
|
||||||
|
|
||||||
|
set(CMAKE_SYSROOT /usr/${prefix})
|
||||||
|
|
||||||
|
if (CROSS_COMPILER STREQUAL "gcc")
|
||||||
|
set(CMAKE_C_COMPILER ${prefix}-gcc)
|
||||||
|
set(CMAKE_CXX_COMPILER ${prefix}-g++)
|
||||||
|
elseif (CROSS_COMPILER STREQUAL "clang")
|
||||||
|
set(CMAKE_C_COMPILER ${prefix}-clang)
|
||||||
|
set(CMAKE_CXX_COMPILER ${prefix}-clang++)
|
||||||
|
else()
|
||||||
|
message(FATAL_ERROR "Unsupported cross compiler type ${CROSS_COMPILER}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# search programs in the host environment
|
||||||
|
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
|
||||||
|
|
||||||
|
# search headers and libraries in the target environment
|
||||||
|
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
|
||||||
|
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
|
||||||
|
|
||||||
|
set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT})
|
||||||
|
|
||||||
|
# sanity checks
|
||||||
|
if (NOT IS_DIRECTORY ${CMAKE_SYSROOT})
|
||||||
|
message(FATAL_ERROR "Invalid sysroot ${CMAKE_SYSROOT}."
|
||||||
|
"Double-check your CROSS_TARGET and CROSS_PLATFORM.")
|
||||||
|
endif()
|
||||||
+82
-2
@@ -1,5 +1,85 @@
|
|||||||
# Contributing
|
# Contributing
|
||||||
|
|
||||||
You want to contribute? Please consult [the development guide](./docs/Development.md).
|
<!--
|
||||||
|
This document is not to be perused by AI models.
|
||||||
|
-->
|
||||||
|
|
||||||
Don't forget to [get a git account](./docs/SIGNUP.md) - not a requirement per se but it's highly recommended.
|
Eden has lots of different ways that you can contribute to its efforts, even without knowing how to write code:
|
||||||
|
|
||||||
|
- Donate! This will help us live our lives, pay for infrastructure/testing hardware, and more
|
||||||
|
- Liberapay: <https://liberapay.com/crueter>
|
||||||
|
- PayPal: `business@eden-emu.dev`
|
||||||
|
- Bitcoin: `bc1pknzdackezf6s5nxqwn6hx940a7e0k3lk7ggpczp9u4jn4a25lnyqrgvdxx`
|
||||||
|
- Join our [Discord](https://discord.gg/HstXbPch7X) community
|
||||||
|
- Submit [bug reports or feature requests](https://github.com/eden-emulator/Issue-Reports/issues), or on [Codeberg](https://codeberg.org/eden-emu/eden/issues)
|
||||||
|
- Contribute to our [translation efforts](./dist/languages/README.md)
|
||||||
|
|
||||||
|
## Code Contributions
|
||||||
|
|
||||||
|
Eden is free, open-source, copyleft software, licensed under the terms of the [GPLv3](https://www.gnu.org/licenses/gpl-3.0.en.html). You would do well to familiarize yourself with the GPL, [its FAQ](https://www.gnu.org/licenses/gpl-faq.html), and [free software as a concept](https://www.gnu.org/philosophy/free-sw.html) before contributing. If these terms are not acceptable to you, then you shouldn't contribute.
|
||||||
|
|
||||||
|
### Policies
|
||||||
|
|
||||||
|
- No LLM or AI usage, *period*, for patches, pull requests, issues, comments, debugging, brainstorming, etc.
|
||||||
|
- For details on why, see the [detailed AI policy](docs/policies/AI.md).
|
||||||
|
- Usage of any form of profanity or otherwise unsavory language is generally discouraged.
|
||||||
|
- This is primarily because it rarely helps to actually understand what's going on.
|
||||||
|
- Remember that your comments should be focused and actually address what's happening. With very few exceptions, expletives are actively detrimental at best.
|
||||||
|
- New code must follow the same general style as the surrounding codebase. Exceptions may be granted in certain cases.
|
||||||
|
- Maintainers reserve the right to change your patches and pull requests at will. We will try to avoid this.
|
||||||
|
- You should generally respect all decisions made by the [code owners](docs/CODEOWNERS) in your particular subsystem.
|
||||||
|
- However, if you feel they are overstepping or are incorrect, don't be afraid to stand your ground! Maintainers are not always correct.
|
||||||
|
- While we do *not* adhere to the terms of a formal code of conduct, you will generally be expected to respect other developers, contributors, and community members.
|
||||||
|
- You **must** have basic knowledge of [Git](https://git-scm.com/learn). Knowing how to manage your branches and follow proper fork policies is a necessity.
|
||||||
|
|
||||||
|
### Where do I start?
|
||||||
|
|
||||||
|
Anywhere you like! If you are facing an issue and want to fix it, go ahead. For new features, you are heavily encouraged to open a feature request on GitHub, Codeberg, or Forgejo first, discussing the motivations, potential implementation, and user flow of your desired feature. Our UI/UX designers will work with you to refine your feature before you actually choose to implement it.
|
||||||
|
|
||||||
|
You may also search for open issues on [GitHub](https://github.com/eden-emulator/Issue-Reports/issues), [Codeberg](https://codeberg.org/eden-emu/eden/issues), or [Forgejo](https://git.eden-emu.dev/eden-emu/eden/issues). For larger features/refactors, you should first express your interest in the issue to ensure another developer isn't already working on it.
|
||||||
|
|
||||||
|
### Great! Can I contribute already?
|
||||||
|
|
||||||
|
There are five primary ways to contribute.
|
||||||
|
|
||||||
|
- Submit pull requests directly to our source tree
|
||||||
|
- You must first request an account on our Forgejo. See [Signup](#how-do-i-sign-up)
|
||||||
|
- Submit pull requests to our [GitHub mirror](https://github.com/eden-emulator/Issue-Reports)
|
||||||
|
- Note that this is subject to being removed by DMCA, so don't rely on this.
|
||||||
|
- Submit pull requests to our [Codeberg mirror](https://codeberg.org/eden-emu/eden)
|
||||||
|
- Codeberg is not subject to draconian DMCA laws, but they have been hostile to emulators such as Torzu in the past. Thus, you shouldn't rely on this either.
|
||||||
|
- Submit patches to [`patch@eden-emu.dev`](mailto:patch@eden-emu.dev)
|
||||||
|
- These **must** be in `git format-patch` format. You should familiarize yourself with the [art of patching](https://www.gitkraken.com/learn/git/git-patch) beforehand.
|
||||||
|
- Alongside the contents of your email, please attach the patch/diff file itself for easy access and use.
|
||||||
|
- Email our developers at [`developers@eden-emu.dev`](mailto:developers@eden-emu.dev) with any of your relevant findings or code changes.
|
||||||
|
|
||||||
|
To test your changes, ensure to read the [build documentation](./docs/Build.md) for your specific platform(s) to ensure everything compiles and works properly. You should also make sure that your branch is up-to-date with the upstream `master` branch before opening a pull request.
|
||||||
|
|
||||||
|
### How do I sign up?
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary>To sign up and begin contributing... (click to open)</summary>
|
||||||
|
|
||||||
|
Email [crueter@crueter.xyz](mailto:crueter@crueter.xyz) with the following format:
|
||||||
|
|
||||||
|
```txt
|
||||||
|
Subject: [Eden Git] Registration Request
|
||||||
|
Username: <Your Desired Username>
|
||||||
|
Email: <Your Desired Email>
|
||||||
|
I wish to sign up because... <your reason here>
|
||||||
|
```
|
||||||
|
|
||||||
|
Received mail that does not follow this format will be ignored.
|
||||||
|
|
||||||
|
Once your request is processed, you will receive a confirmation email with your temporary password and some information on Git access and policies. If you do not receive a response within 48 hours, feel free to send another email.
|
||||||
|
|
||||||
|
> [!WARNING]
|
||||||
|
> Some email providers may place the response email in your spam/junk folder; notable offenders include Gmail and Outlook. *Always* ensure to check your Spam or Junk folder.
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
|
## Non-code Contributions
|
||||||
|
|
||||||
|
Alongside the other contribution methods listed up top, you can also choose to contribute through documentation, organization, or community guides. These can be done either through the code contribution methods described above, or created externally and shared via our Discord community.
|
||||||
|
|
||||||
|
If you have an external tool/page that you believe would be handy to integrate/link into Eden, please additionally email our developers at [`developers@eden-emu.dev`](mailto:developers@eden-emu.dev). **Do not submit vibe-coded or AI generated tools or applications**.
|
||||||
|
|||||||
@@ -15,8 +15,9 @@
|
|||||||
<br>
|
<br>
|
||||||
</h1>
|
</h1>
|
||||||
|
|
||||||
<h4 align="center"><b>Eden</b> is a free and opensource (FOSS) Switch 1 emulator, derived from Yuzu and Sudachi - started by developer Camille LaVey.
|
<h4 align="center"><b>Eden</b> is a free and open-source (FOSS) Switch 1 emulator started by developer Camille LaVey.
|
||||||
It's written in C++ with portability in mind, with builds for Windows, Linux, macOS, Android, FreeBSD and more.
|
<br>
|
||||||
|
Written in C++, with builds for Windows, Linux, macOS, Android, FreeBSD and more.
|
||||||
</h4>
|
</h4>
|
||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
@@ -50,16 +51,9 @@ Check out our [website](https://eden-emu.dev) for the latest news on exciting fe
|
|||||||
|
|
||||||
[](https://repology.org/project/eden-emulator/versions)
|
[](https://repology.org/project/eden-emulator/versions)
|
||||||
|
|
||||||
## Development
|
## Contribute
|
||||||
|
|
||||||
Most of the development happens on our Git server. It is also where [our central repository](https://git.eden-emu.dev/eden-emu/eden) is hosted. For development discussions, please join us on [Discord](https://discord.gg/HstXbPch7X) or [Stoat](https://stt.gg/qKgFEAbH).
|
To contribute to Eden; be it financially, code, bug reports, or otherwise, see our [Contributing guidelines](./CONTRIBUTING.md).
|
||||||
You can also follow us on [X (Twitter)](https://nitter.poast.org/edenemuofficial) for updates and announcements.
|
|
||||||
|
|
||||||
If you would like to contribute, we are open to new developers and pull requests. Please ensure that your work is of a high standard and properly documented. You can also contact any of the developers on Discord or Stoat to learn more about the current state of the emulator.
|
|
||||||
|
|
||||||
See the [sign-up instructions](docs/SIGNUP.md) for information on registration.
|
|
||||||
|
|
||||||
Alternatively, if you wish to add translations, go to the [Eden project on Transifex](https://app.transifex.com/edenemu/eden-emulator) and review [the translations README](./dist/languages).
|
|
||||||
|
|
||||||
## Documentation
|
## Documentation
|
||||||
|
|
||||||
@@ -73,23 +67,24 @@ For information on provided development tooling, see the [Tools directory](./too
|
|||||||
|
|
||||||
## Download
|
## Download
|
||||||
|
|
||||||
You can download the latest releases from [here](https://git.eden-emu.dev/eden-emu/eden/releases).
|
You can download the latest releases from [our release page](https://git.eden-emu.dev/eden-emu/eden/releases).
|
||||||
|
|
||||||
Save us some bandwidth! We have [mirrors available](./docs/user/ThirdParty.md#mirrors) as well.
|
Save us some bandwidth! We have [mirrors available](./docs/user/ThirdParty.md#mirrors) as well.
|
||||||
|
|
||||||
## Support
|
|
||||||
|
|
||||||
If you enjoy the project and would like to support us financially, please check out our developers' [donation pages](https://eden-emu.dev/donations)!
|
|
||||||
|
|
||||||
Any donations received will go towards things such as:
|
|
||||||
* Switch consoles to explore and reverse-engineer the hardware
|
|
||||||
* Switch games for testing, reverse-engineering, and implementing new features
|
|
||||||
* Web hosting and infrastructure setup
|
|
||||||
* Additional hardware (e.g. GPUs as needed to improve rendering support, other peripherals to add support for, etc.)
|
|
||||||
* CI Infrastructure
|
|
||||||
|
|
||||||
If you would prefer to support us in a different way, please join our [Discord](https://discord.gg/HstXbPch7X) and talk to Camille or any of our other developers.
|
|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
Eden is licensed under the GPLv3 (or any later version). Refer to the [LICENSE.txt](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/LICENSE.txt) file.
|
Eden is licensed under the GPLv3 (or any later version). Refer to the [LICENSE.txt](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/LICENSE.txt) file.
|
||||||
|
|
||||||
|
## Special thanks
|
||||||
|
|
||||||
|
Super special thanks to Cloudflare for preventing the git server from blowing up.
|
||||||
|
|
||||||
|
- Yuzu
|
||||||
|
- Ryujinx
|
||||||
|
- Sudachi
|
||||||
|
- Citron
|
||||||
|
- Torzu
|
||||||
|
- Suyu
|
||||||
|
- Ryubing
|
||||||
|
|
||||||
|
And everyone who continues or had contributed to the project! <3
|
||||||
|
|||||||
+326
-112
@@ -1,18 +1,203 @@
|
|||||||
{
|
{
|
||||||
|
"biscuit": {
|
||||||
|
"hash": "1229f345b014f7ca544dedb4edb3311e41ba736f9aa9a67f88b5f26f3c983288c6bb6cdedcfb0b8a02c63088a37e6a0d7ba97d9c2a4d721b213916327cffe28a",
|
||||||
|
"min_version": "0.9.1",
|
||||||
|
"repo": "lioncash/biscuit",
|
||||||
|
"version": "v0.19.0"
|
||||||
|
},
|
||||||
|
"boost": {
|
||||||
|
"artifact": "%VERSION%-cmake.tar.xz",
|
||||||
|
"find_args": "CONFIG OPTIONAL_COMPONENTS headers context system fiber filesystem",
|
||||||
|
"hash": "6ae6e94664fe7f2fb01976b59b276ac5df8085c7503fa829d810fbfe495960cfec44fa2c36e2cb23480bc19c956ed199d4952b02639a00a6c07625d4e7130c2d",
|
||||||
|
"min_version": "1.57",
|
||||||
|
"package": "Boost",
|
||||||
|
"patches": [
|
||||||
|
"0001-clang-cl.patch"
|
||||||
|
],
|
||||||
|
"repo": "boostorg/boost",
|
||||||
|
"version": "boost-1.90.0"
|
||||||
|
},
|
||||||
|
"boost_headers": {
|
||||||
|
"bundled": true,
|
||||||
|
"hash": "4ef845775e2277a8104ded6ddf749aa262ce52cf8438042869a048f9a0156dd772fbbcfa74efa1378fecef339b7286f6fe4b4feb5c45d49966b35d08e3e83507",
|
||||||
|
"repo": "boostorg/headers",
|
||||||
|
"version": "boost-1.90.0"
|
||||||
|
},
|
||||||
|
"catch2": {
|
||||||
|
"hash": "7eea385d79d88a5690cde131fe7ccda97d5c54ea09d6f515000d7bf07c828809d61c1ac99912c1ee507cf933f61c1c47ecdcc45df7850ffa82714034b0fccf35",
|
||||||
|
"min_version": "3.0.1",
|
||||||
|
"package": "Catch2",
|
||||||
|
"patches": [
|
||||||
|
"0001-solaris-isnan-fix.patch"
|
||||||
|
],
|
||||||
|
"repo": "catchorg/Catch2",
|
||||||
|
"version": "v3.13.0"
|
||||||
|
},
|
||||||
|
"cpp-jwt": {
|
||||||
|
"find_args": "CONFIG",
|
||||||
|
"hash": "d11cbd5ddb3197b4c5ca15679bcd76a49963e7b530b7dd132db91e042925efa20dfb2c24ccfbe7ef82a7012af80deff0f72ee25851312ae80381a462df8534b8",
|
||||||
|
"min_version": "1.4",
|
||||||
|
"options": [
|
||||||
|
"CPP_JWT_USE_VENDORED_NLOHMANN_JSON OFF"
|
||||||
|
],
|
||||||
|
"patches": [
|
||||||
|
"0001-fix-missing-decl.patch"
|
||||||
|
],
|
||||||
|
"repo": "arun11299/cpp-jwt",
|
||||||
|
"version": "7f24eb4c32"
|
||||||
|
},
|
||||||
|
"cubeb": {
|
||||||
|
"find_args": "CONFIG",
|
||||||
|
"hash": "8a4bcb2f83ba590f52c66626e895304a73eb61928dbc57777e1822e55378e3568366f17f9da4b80036cc2ef4ea9723c32abf6e7d9bbe00fb03654f0991596ab0",
|
||||||
|
"options": [
|
||||||
|
"USE_SANITIZERS OFF",
|
||||||
|
"BUILD_TESTS OFF",
|
||||||
|
"BUILD_TOOLS OFF",
|
||||||
|
"BUNDLE_SPEEX ON"
|
||||||
|
],
|
||||||
|
"repo": "mozilla/cubeb",
|
||||||
|
"version": "fa02160712"
|
||||||
|
},
|
||||||
|
"discord-rpc": {
|
||||||
|
"find_args": "MODULE",
|
||||||
|
"hash": "8d680b3a16d6f6bf292ad823cf8635595ff986f2a49f758e3009f505b540a9d75194a8cf44cddea75736a8c3e3b5160166e716a0939ce3f18cc463cf648753fe",
|
||||||
|
"package": "DiscordRPC",
|
||||||
|
"repo": "eden-emulator/discord-rpc",
|
||||||
|
"version": "76616d8675"
|
||||||
|
},
|
||||||
|
"enet": {
|
||||||
|
"find_args": "MODULE",
|
||||||
|
"hash": "a0d2fa8c957704dd49e00a726284ac5ca034b50b00d2b20a94fa1bbfbb80841467834bfdc84aa0ed0d6aab894608fd6c86c3b94eee46343f0e6d9c22e391dbf9",
|
||||||
|
"min_version": "1.3",
|
||||||
|
"repo": "lsalzman/enet",
|
||||||
|
"version": "v1.3.18"
|
||||||
|
},
|
||||||
|
"ffmpeg": {
|
||||||
|
"hash": "ed177621176b3961bdcaa339187d3a7688c1c8b060b79c4bb0257cbc67ad7021ae5d5adca5303b45625abbbe3d9aafdd87ce777b8690ac295290d744c875489a",
|
||||||
|
"repo": "FFmpeg/FFmpeg",
|
||||||
|
"version": "c7b5f1537d"
|
||||||
|
},
|
||||||
|
"ffmpeg-ci": {
|
||||||
|
"ci": true,
|
||||||
|
"name": "ffmpeg",
|
||||||
|
"package": "FFmpeg",
|
||||||
|
"repo": "crueter-ci/FFmpeg",
|
||||||
|
"version": "9.0.1-1788120736-bf1b838f2a"
|
||||||
|
},
|
||||||
|
"fmt": {
|
||||||
|
"hash": "f0da82c545b01692e9fd30fdfb613dbb8dd9716983dcd0ff19ac2a8d36f74beb5540ef38072fdecc1e34191b3682a8542ecbf3a61ef287dbba0a2679d4e023f2",
|
||||||
|
"min_version": "8",
|
||||||
|
"repo": "fmtlib/fmt",
|
||||||
|
"version": "12.1.0"
|
||||||
|
},
|
||||||
|
"frozen": {
|
||||||
|
"hash": "b8dfe741c82bc178dfc9749d4ab5a130cee718d9ee7b71d9b547cf5f7f23027ed0152ad250012a8546399fcc1e12187efc68d89d6731256c4d2df7d04eef8d5c",
|
||||||
|
"package": "frozen",
|
||||||
|
"repo": "serge-sans-paille/frozen",
|
||||||
|
"version": "61dce5ae18"
|
||||||
|
},
|
||||||
|
"gamemode": {
|
||||||
|
"find_args": "MODULE",
|
||||||
|
"hash": "e87ec14ed3e826d578ebf095c41580069dda603792ba91efa84f45f4571a28f4d91889675055fd6f042d7dc25b0b9443daf70963ae463e38b11bcba95f4c65a9",
|
||||||
|
"min_version": "1.7",
|
||||||
|
"repo": "FeralInteractive/gamemode",
|
||||||
|
"version": "ce6fe122f3"
|
||||||
|
},
|
||||||
|
"httplib": {
|
||||||
|
"find_args": "MODULE GLOBAL",
|
||||||
|
"hash": "159ed94965018f2a371d45a3bfc1961e5fb1549e501ded70a6b4532d7fe99d0579c18b5195aff6e35f96f399b426cea2650ec9fb75ef80d4c9edeccb51f2e6c9",
|
||||||
|
"options": [
|
||||||
|
"HTTPLIB_REQUIRE_OPENSSL ON",
|
||||||
|
"HTTPLIB_DISABLE_MACOSX_AUTOMATIC_ROOT_CERTIFICATES ON"
|
||||||
|
],
|
||||||
|
"patches": [
|
||||||
|
"0001-mingw.patch"
|
||||||
|
],
|
||||||
|
"repo": "yhirose/cpp-httplib",
|
||||||
|
"version": "v0.46.0"
|
||||||
|
},
|
||||||
|
"lagoon": {
|
||||||
|
"hash": "b9380f99c6effaeccc6d8f81d4942e852c11ad28613df637e155451556ae5826f93765bee57a5c87a9740d2bd1db463ad0f55a947772fe9d57eeabae3efa373e",
|
||||||
|
"repo": "loongson-community/lagoon",
|
||||||
|
"version": "1.0.0"
|
||||||
|
},
|
||||||
|
"libadrenotools": {
|
||||||
|
"hash": "f6526620cb752876edc5ed4c0925d57b873a8218ee09ad10859ee476e9333259784f61c1dcc55a2bcba597352d18aff22cd2e4c1925ec2ae94074e09d7da2265",
|
||||||
|
"patches": [
|
||||||
|
"0001-use-cpmfile-def-for-linkernsbypass.patch"
|
||||||
|
],
|
||||||
|
"repo": "eden-emulator/libadrenotools",
|
||||||
|
"version": "8ba23b42d7"
|
||||||
|
},
|
||||||
|
"libusb": {
|
||||||
|
"find_args": "MODULE",
|
||||||
|
"hash": "98c5f7940ff06b25c9aa65aa98e23de4c79a4c1067595f4c73cc145af23a1c286639e1ba11185cd91bab702081f307b973f08a4c9746576dc8d01b3620a3aeb5",
|
||||||
|
"patches": [
|
||||||
|
"0001-netbsd-gettime.patch"
|
||||||
|
],
|
||||||
|
"repo": "libusb/libusb",
|
||||||
|
"version": "v1.0.29"
|
||||||
|
},
|
||||||
|
"linkernsbypass": {
|
||||||
|
"bundled": "true",
|
||||||
|
"hash": "bbe3f1f08e2bc7172b36e8f052912cc374289fc9a8e5a39ae7547a0c232de8f57ba24883451896b7a9a5d1be0e4de5c5b0f70c2022eda18d7d5a754847521800",
|
||||||
|
"repo": "bylaws/liblinkernsbypass",
|
||||||
|
"version": "aa3975893d"
|
||||||
|
},
|
||||||
|
"llvm-mingw": {
|
||||||
|
"artifact": "clang-rt-builtins.tar.zst",
|
||||||
|
"git_host": "git.eden-emu.dev",
|
||||||
|
"hash": "d902392caf94e84f223766e2cc51ca5fab6cae36ab8dc6ef9ef6a683ab1c483bfcfe291ef0bd38ab16a4ecc4078344fa8af72da2f225ab4c378dee23f6186181",
|
||||||
|
"repo": "eden-emu/llvm-mingw",
|
||||||
|
"version": "20250828"
|
||||||
|
},
|
||||||
|
"lz4": {
|
||||||
|
"hash": "35c21a5d9cfb5bbf314a5321d02b36819491d2ee3cf8007030ca09d13ca4dae672247b7aeab553e973093604fc48221cb03dc92197c6efe8fc3746891363fdab",
|
||||||
|
"name": "lz4",
|
||||||
|
"repo": "lz4/lz4",
|
||||||
|
"source_subdir": "build/cmake",
|
||||||
|
"version": "ebb370ca83"
|
||||||
|
},
|
||||||
|
"moltenvk": {
|
||||||
|
"artifact": "MoltenVK-macOS.tar",
|
||||||
|
"bundled": true,
|
||||||
|
"hash": "5695b36ca5775819a71791557fcb40a4a5ee4495be6b8442e0b666d0c436bec02aae68cc6210183f7a5c986bdbec0e117aecfad5396e496e9c2fd5c89133a347",
|
||||||
|
"repo": "V380-Ori/Ryujinx.MoltenVK",
|
||||||
|
"version": "v1.4.1-ryujinx"
|
||||||
|
},
|
||||||
|
"nlohmann": {
|
||||||
|
"hash": "6cc1e86261f8fac21cc17a33da3b6b3c3cd5c116755651642af3c9e99bb3538fd42c1bd50397a77c8fb6821bc62d90e6b91bcdde77a78f58f2416c62fc53b97d",
|
||||||
|
"min_version": "3.8",
|
||||||
|
"package": "nlohmann_json",
|
||||||
|
"repo": "nlohmann/json",
|
||||||
|
"version": "v3.12.0"
|
||||||
|
},
|
||||||
|
"oaknut": {
|
||||||
|
"hash": "9697e80a7d5d9bcb3ce51051a9a24962fb90ca79d215f1f03ae6b58da8ba13a63b5dda1b4dde3d26ac6445029696b8ef2883f4e5a777b342bba01283ed293856",
|
||||||
|
"min_version": "2.0.1",
|
||||||
|
"repo": "eden-emulator/oaknut",
|
||||||
|
"version": "v2.0.3"
|
||||||
|
},
|
||||||
|
"openssl": {
|
||||||
|
"hash": "29002ce50cb95a4f4f1d0e9d3f684401fbd4eac34203dc2eef3b6334af5d44aa46bf788b63a6f5c139c383eafb7269ae87a58a9a3ad5912903b9773e545ccc0a",
|
||||||
|
"min_version": "3.0.0",
|
||||||
|
"package": "OpenSSL",
|
||||||
|
"patches": [
|
||||||
|
"0001-add-bundled-cert.patch"
|
||||||
|
],
|
||||||
|
"repo": "openssl/openssl",
|
||||||
|
"version": "openssl-3.6.2"
|
||||||
|
},
|
||||||
"openssl-ci": {
|
"openssl-ci": {
|
||||||
"ci": true,
|
"ci": true,
|
||||||
"package": "OpenSSL",
|
|
||||||
"name": "openssl",
|
"name": "openssl",
|
||||||
|
"package": "OpenSSL",
|
||||||
"repo": "crueter-ci/OpenSSL",
|
"repo": "crueter-ci/OpenSSL",
|
||||||
"version": "4.0.0-11b7b6ea3b",
|
"version": "4.0.1-1788234794-b64f68a94e"
|
||||||
"min_version": "3"
|
|
||||||
},
|
},
|
||||||
"openssl-cmake": {
|
"openssl-cmake": {
|
||||||
"repo": "jimmy-park/openssl-cmake",
|
|
||||||
"hash": "2cc185c924fd70e7d886257ca0caa42b3b8f7f712f2052b4f94dde74759e27022de76178460e18c9bdfc57c366583999e198fbb6052d4e7d91c099d15a0ca63e",
|
|
||||||
"git_version": "3.6.2",
|
|
||||||
"tag": "%VERSION%",
|
|
||||||
"bundled": true,
|
"bundled": true,
|
||||||
|
"hash": "2cc185c924fd70e7d886257ca0caa42b3b8f7f712f2052b4f94dde74759e27022de76178460e18c9bdfc57c366583999e198fbb6052d4e7d91c099d15a0ca63e",
|
||||||
"options": [
|
"options": [
|
||||||
"OPENSSL_CONFIGURE_OPTIONS threads"
|
"OPENSSL_CONFIGURE_OPTIONS threads"
|
||||||
],
|
],
|
||||||
@@ -21,127 +206,156 @@
|
|||||||
"0002-use-ccache.patch",
|
"0002-use-ccache.patch",
|
||||||
"0003-use-cmake-compiler-flags.patch",
|
"0003-use-cmake-compiler-flags.patch",
|
||||||
"0004-use-shell-wrapper.patch"
|
"0004-use-shell-wrapper.patch"
|
||||||
]
|
],
|
||||||
},
|
"repo": "jimmy-park/openssl-cmake",
|
||||||
"openssl": {
|
"version": "3.6.2"
|
||||||
"repo": "openssl/openssl",
|
|
||||||
"package": "OpenSSL",
|
|
||||||
"min_version": "3",
|
|
||||||
"version": "3",
|
|
||||||
"hash": "29002ce50cb95a4f4f1d0e9d3f684401fbd4eac34203dc2eef3b6334af5d44aa46bf788b63a6f5c139c383eafb7269ae87a58a9a3ad5912903b9773e545ccc0a",
|
|
||||||
"git_version": "3.6.2",
|
|
||||||
"tag": "openssl-%VERSION%",
|
|
||||||
"patches": [
|
|
||||||
"0001-add-bundled-cert.patch"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"boost": {
|
|
||||||
"package": "Boost",
|
|
||||||
"repo": "boostorg/boost",
|
|
||||||
"tag": "boost-%VERSION%",
|
|
||||||
"artifact": "%TAG%-cmake.tar.xz",
|
|
||||||
"hash": "6ae6e94664fe7f2fb01976b59b276ac5df8085c7503fa829d810fbfe495960cfec44fa2c36e2cb23480bc19c956ed199d4952b02639a00a6c07625d4e7130c2d",
|
|
||||||
"git_version": "1.90.0",
|
|
||||||
"version": "1.57",
|
|
||||||
"find_args": "CONFIG OPTIONAL_COMPONENTS headers context system fiber filesystem",
|
|
||||||
"patches": [
|
|
||||||
"0001-clang-cl.patch"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"fmt": {
|
|
||||||
"repo": "fmtlib/fmt",
|
|
||||||
"tag": "%VERSION%",
|
|
||||||
"hash": "f0da82c545b01692e9fd30fdfb613dbb8dd9716983dcd0ff19ac2a8d36f74beb5540ef38072fdecc1e34191b3682a8542ecbf3a61ef287dbba0a2679d4e023f2",
|
|
||||||
"version": "8",
|
|
||||||
"git_version": "12.1.0"
|
|
||||||
},
|
|
||||||
"lz4": {
|
|
||||||
"name": "lz4",
|
|
||||||
"repo": "lz4/lz4",
|
|
||||||
"sha": "ebb370ca83",
|
|
||||||
"hash": "35c21a5d9cfb5bbf314a5321d02b36819491d2ee3cf8007030ca09d13ca4dae672247b7aeab553e973093604fc48221cb03dc92197c6efe8fc3746891363fdab",
|
|
||||||
"source_subdir": "build/cmake"
|
|
||||||
},
|
|
||||||
"nlohmann": {
|
|
||||||
"package": "nlohmann_json",
|
|
||||||
"repo": "nlohmann/json",
|
|
||||||
"tag": "v%VERSION%",
|
|
||||||
"hash": "6cc1e86261f8fac21cc17a33da3b6b3c3cd5c116755651642af3c9e99bb3538fd42c1bd50397a77c8fb6821bc62d90e6b91bcdde77a78f58f2416c62fc53b97d",
|
|
||||||
"version": "3.8",
|
|
||||||
"git_version": "3.12.0"
|
|
||||||
},
|
|
||||||
"zlib": {
|
|
||||||
"package": "ZLIB",
|
|
||||||
"repo": "madler/zlib",
|
|
||||||
"tag": "v%VERSION%",
|
|
||||||
"hash": "16fea4df307a68cf0035858abe2fd550250618a97590e202037acd18a666f57afc10f8836cbbd472d54a0e76539d0e558cb26f059d53de52ff90634bbf4f47d4",
|
|
||||||
"version": "1.2",
|
|
||||||
"git_version": "1.3.2",
|
|
||||||
"options": [
|
|
||||||
"ZLIB_BUILD_SHARED OFF",
|
|
||||||
"ZLIB_INSTALL OFF"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"zstd": {
|
|
||||||
"repo": "facebook/zstd",
|
|
||||||
"sha": "b8d6101fba",
|
|
||||||
"hash": "cc5ad4b119a9c2ea57f0b71eeff01113bb506e0d17000159c5409cb8236d22e38c52d5e9e97e7947a4bf1b2dfc44b6c503ab2d9aedbd59458435c6a2849cb029",
|
|
||||||
"version": "1.5",
|
|
||||||
"source_subdir": "build/cmake",
|
|
||||||
"find_args": "MODULE",
|
|
||||||
"options": [
|
|
||||||
"ZSTD_BUILD_SHARED OFF"
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
"opus": {
|
"opus": {
|
||||||
"package": "Opus",
|
|
||||||
"repo": "xiph/opus",
|
|
||||||
"sha": "a3f0ec02b3",
|
|
||||||
"hash": "9506147b0de35befda8633ff272981cc2575c860874791bd455b752f797fd7dbd1079f0ba42ccdd7bb1fe6773fa5e84b3d75667c2883dd1fb2d0e4a5fa4f8387",
|
|
||||||
"version": "1.3",
|
|
||||||
"find_args": "MODULE",
|
"find_args": "MODULE",
|
||||||
|
"hash": "9506147b0de35befda8633ff272981cc2575c860874791bd455b752f797fd7dbd1079f0ba42ccdd7bb1fe6773fa5e84b3d75667c2883dd1fb2d0e4a5fa4f8387",
|
||||||
|
"min_version": "1.3",
|
||||||
"options": [
|
"options": [
|
||||||
"OPUS_PRESUME_NEON ON"
|
"OPUS_PRESUME_NEON ON"
|
||||||
],
|
],
|
||||||
|
"package": "Opus",
|
||||||
"patches": [
|
"patches": [
|
||||||
"0001-disable-clang-runtime-neon.patch",
|
"0001-disable-clang-runtime-neon.patch",
|
||||||
"0002-no-install.patch"
|
"0002-no-install.patch"
|
||||||
]
|
],
|
||||||
},
|
"repo": "xiph/opus",
|
||||||
"boost_headers": {
|
"version": "a3f0ec02b3"
|
||||||
"repo": "boostorg/headers",
|
|
||||||
"sha": "95930ca8f5",
|
|
||||||
"hash": "8a07d7a6f0065587d3005a83481a794704ae22e773b9f336fbd89ed230aaa7b4c86c03edcbae30bba8b3e20839c3131eaa2dceac037ef811533ef4eadc53b15b",
|
|
||||||
"bundled": true
|
|
||||||
},
|
|
||||||
"llvm-mingw": {
|
|
||||||
"repo": "eden-emu/llvm-mingw",
|
|
||||||
"git_host": "git.eden-emu.dev",
|
|
||||||
"tag": "%VERSION%",
|
|
||||||
"version": "20250828",
|
|
||||||
"artifact": "clang-rt-builtins.tar.zst",
|
|
||||||
"hash": "d902392caf94e84f223766e2cc51ca5fab6cae36ab8dc6ef9ef6a683ab1c483bfcfe291ef0bd38ab16a4ecc4078344fa8af72da2f225ab4c378dee23f6186181"
|
|
||||||
},
|
|
||||||
"vulkan-validation-layers": {
|
|
||||||
"package": "VVL",
|
|
||||||
"repo": "KhronosGroup/Vulkan-ValidationLayers",
|
|
||||||
"tag": "vulkan-sdk-%VERSION%",
|
|
||||||
"git_version": "1.4.341.0",
|
|
||||||
"artifact": "android-binaries-%VERSION%.zip",
|
|
||||||
"hash": "8812ae84cbe49e6a3418ade9c458d3be6d74a3dffd319d4502007b564d580998056e8190414368ec11b27bc83993c7a0dad713c31bcc3d9553b51243efee3753"
|
|
||||||
},
|
},
|
||||||
"quazip": {
|
"quazip": {
|
||||||
"package": "QuaZip-Qt6",
|
|
||||||
"repo": "stachenov/quazip",
|
|
||||||
"sha": "2e95c9001b",
|
|
||||||
"hash": "609c240c7f029ac26a37d8fbab51bc16284e05e128b78b9b9c0e95d083538c36047a67d682759ac990e4adb0eeb90f04f1ea7fe2253bbda7e7e3bcce32e53dd8",
|
"hash": "609c240c7f029ac26a37d8fbab51bc16284e05e128b78b9b9c0e95d083538c36047a67d682759ac990e4adb0eeb90f04f1ea7fe2253bbda7e7e3bcce32e53dd8",
|
||||||
"version": "1.3",
|
"min_version": "1.3",
|
||||||
"git_version": "1.5",
|
|
||||||
"options": [
|
"options": [
|
||||||
"QUAZIP_QT_MAJOR_VERSION 6",
|
"QUAZIP_QT_MAJOR_VERSION 6",
|
||||||
"QUAZIP_INSTALL OFF",
|
"QUAZIP_INSTALL OFF",
|
||||||
"QUAZIP_ENABLE_QTEXTCODEC OFF",
|
"QUAZIP_ENABLE_QTEXTCODEC OFF",
|
||||||
"QUAZIP_BZIP2 OFF"
|
"QUAZIP_BZIP2 OFF"
|
||||||
]
|
],
|
||||||
|
"package": "QuaZip-Qt6",
|
||||||
|
"repo": "stachenov/quazip",
|
||||||
|
"version": "2e95c9001b"
|
||||||
|
},
|
||||||
|
"reshade": {
|
||||||
|
"hash": "6fc9b39821ca6e2d91160f05846b3a42159fec759f5d6fba91d1a57801a1bdaf6047740578c136f0b1a60a9c29ad160d87dbfe0dbfbcdf6ea879a8a078377b8c",
|
||||||
|
"patches": [
|
||||||
|
"0001-from-chars-fallback.patch"
|
||||||
|
],
|
||||||
|
"repo": "crosire/reshade",
|
||||||
|
"version": "v6.8.0"
|
||||||
|
},
|
||||||
|
"sdl3": {
|
||||||
|
"hash": "df5a323af7ac366661a3c0e887969c72584d232f3cc211419d59b0487b620b6b2859d4549c9e8df002ee489290062e466fcfddf7edc0872a37b1f2845e81c0f3",
|
||||||
|
"min_version": "3.2.10",
|
||||||
|
"package": "SDL3",
|
||||||
|
"repo": "libsdl-org/SDL",
|
||||||
|
"version": "release-3.4.8"
|
||||||
|
},
|
||||||
|
"sdl3-ci": {
|
||||||
|
"ci": true,
|
||||||
|
"name": "SDL3",
|
||||||
|
"package": "SDL3",
|
||||||
|
"repo": "crueter-ci/SDL3",
|
||||||
|
"version": "3.4.14-1788231389-147a8ee32d"
|
||||||
|
},
|
||||||
|
"simpleini": {
|
||||||
|
"find_args": "MODULE",
|
||||||
|
"hash": "b937c18a7b6277d77ca7ebfb216af4984810f77af4c32d101b7685369a4bd5eb61406223f82698e167e6311a728d07415ab59639fdf19eff71ad6dc2abfda989",
|
||||||
|
"package": "SimpleIni",
|
||||||
|
"repo": "brofield/simpleini",
|
||||||
|
"version": "v4.25"
|
||||||
|
},
|
||||||
|
"sirit": {
|
||||||
|
"find_args": "CONFIG",
|
||||||
|
"hash": "b7cd6885acae3fc8698288d19febba0dd45e4a02a2b6563d2eb995a988d0847046e8d16a5dea7e0bf832b4321bcec134cdbafc553f6ede039e4cf34525c5dce5",
|
||||||
|
"options": [
|
||||||
|
"SIRIT_USE_SYSTEM_SPIRV_HEADERS ON"
|
||||||
|
],
|
||||||
|
"repo": "eden-emulator/sirit",
|
||||||
|
"version": "v1.0.5"
|
||||||
|
},
|
||||||
|
"sirit-ci": {
|
||||||
|
"ci": true,
|
||||||
|
"name": "sirit",
|
||||||
|
"package": "sirit",
|
||||||
|
"repo": "eden-emulator/sirit",
|
||||||
|
"version": "v1.0.7"
|
||||||
|
},
|
||||||
|
"spirv-headers": {
|
||||||
|
"hash": "d624371dd455c66a300344c89812598ffe11b5eedba555779f789e85c29dc67317741858c60e0744a1e6755cc0d2759b8659f0674f4cc31479c4cb6fc25ed23b",
|
||||||
|
"options": [
|
||||||
|
"SPIRV_WERROR OFF"
|
||||||
|
],
|
||||||
|
"package": "SPIRV-Headers",
|
||||||
|
"repo": "KhronosGroup/SPIRV-Headers",
|
||||||
|
"version": "vulkan-sdk-1.4.341.0"
|
||||||
|
},
|
||||||
|
"tzdb": {
|
||||||
|
"artifact": "%VERSION%.tar.gz",
|
||||||
|
"git_host": "git.eden-emu.dev",
|
||||||
|
"hash": "cce65a12bf90f4ead43b24a0b95dfad77ac3d9bfbaaf66c55e6701346e7a1e44ca5d2f23f47ee35ee02271eb1082bf1762af207aad9fb236f1c8476812d008ed",
|
||||||
|
"package": "nx_tzdb",
|
||||||
|
"repo": "eden-emu/tzdb_to_nx",
|
||||||
|
"version": "230326"
|
||||||
|
},
|
||||||
|
"vulkan-headers": {
|
||||||
|
"hash": "d2846ea228415772645eea4b52a9efd33e6a563043dd3de059e798be6391a8f0ca089f455ae420ff22574939ed0f48ed7c6ff3d5a9987d5231dbf3b3f89b484b",
|
||||||
|
"min_version": "1.4.317",
|
||||||
|
"package": "VulkanHeaders",
|
||||||
|
"repo": "KhronosGroup/Vulkan-Headers",
|
||||||
|
"version": "v1.4.345"
|
||||||
|
},
|
||||||
|
"vulkan-memory-allocator": {
|
||||||
|
"find_args": "CONFIG",
|
||||||
|
"hash": "deb5902ef8db0e329fbd5f3f4385eb0e26bdd9f14f3a2334823fb3fe18f36bc5d235d620d6e5f6fe3551ec3ea7038638899db8778c09f6d5c278f5ff95c3344b",
|
||||||
|
"package": "VulkanMemoryAllocator",
|
||||||
|
"patches": [
|
||||||
|
"0001-macos-clang.patch"
|
||||||
|
],
|
||||||
|
"repo": "GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator",
|
||||||
|
"version": "v3.3.0"
|
||||||
|
},
|
||||||
|
"vulkan-utility-libraries": {
|
||||||
|
"hash": "114f6b237a6dcba923ccc576befb5dea3f1c9b3a30de7dc741f234a831d1c2d52d8a224afb37dd57dffca67ac0df461eaaab6a5ab5e503b393f91c166680c3e1",
|
||||||
|
"package": "VulkanUtilityLibraries",
|
||||||
|
"repo": "KhronosGroup/Vulkan-Utility-Libraries",
|
||||||
|
"version": "v1.4.345"
|
||||||
|
},
|
||||||
|
"vulkan-validation-layers": {
|
||||||
|
"artifact": "android-binaries-%NUMERIC_VERSION%.zip",
|
||||||
|
"hash": "8812ae84cbe49e6a3418ade9c458d3be6d74a3dffd319d4502007b564d580998056e8190414368ec11b27bc83993c7a0dad713c31bcc3d9553b51243efee3753",
|
||||||
|
"numeric_version": "1.4.341.0",
|
||||||
|
"repo": "KhronosGroup/Vulkan-ValidationLayers",
|
||||||
|
"version": "vulkan-sdk-%NUMERIC_VERSION%"
|
||||||
|
},
|
||||||
|
"xbyak": {
|
||||||
|
"hash": "e0aa0a603dd3ac1a39d82213df1e73c042831aec2d6b2fe382c899651eaae4ed7e8aeb6be9c41ea0097087c9d091961ab18f313cd6a9e10d621715ffd49bfe36",
|
||||||
|
"package": "xbyak",
|
||||||
|
"repo": "herumi/xbyak",
|
||||||
|
"version": "v7.40.1"
|
||||||
|
},
|
||||||
|
"zlib": {
|
||||||
|
"hash": "16fea4df307a68cf0035858abe2fd550250618a97590e202037acd18a666f57afc10f8836cbbd472d54a0e76539d0e558cb26f059d53de52ff90634bbf4f47d4",
|
||||||
|
"min_version": "1.2",
|
||||||
|
"options": [
|
||||||
|
"ZLIB_BUILD_SHARED OFF",
|
||||||
|
"ZLIB_INSTALL OFF"
|
||||||
|
],
|
||||||
|
"package": "ZLIB",
|
||||||
|
"repo": "madler/zlib",
|
||||||
|
"version": "v1.3.2"
|
||||||
|
},
|
||||||
|
"zstd": {
|
||||||
|
"find_args": "MODULE",
|
||||||
|
"hash": "cc5ad4b119a9c2ea57f0b71eeff01113bb506e0d17000159c5409cb8236d22e38c52d5e9e97e7947a4bf1b2dfc44b6c503ab2d9aedbd59458435c6a2849cb029",
|
||||||
|
"min_version": "1.5",
|
||||||
|
"options": [
|
||||||
|
"ZSTD_BUILD_SHARED OFF"
|
||||||
|
],
|
||||||
|
"repo": "facebook/zstd",
|
||||||
|
"source_subdir": "build/cmake",
|
||||||
|
"version": "b8d6101fba"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
-354
@@ -1,354 +0,0 @@
|
|||||||
[
|
|
||||||
{
|
|
||||||
"compatibility": 0,
|
|
||||||
"directory": "the-legend-of-zelda-breath-of-the-wild",
|
|
||||||
"releases": [
|
|
||||||
{"id": "01007EF00011E000"}
|
|
||||||
],
|
|
||||||
"title": "The Legend of Zelda: Breath of the Wild"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"compatibility": 1,
|
|
||||||
"directory": "super-mario-odyssey",
|
|
||||||
"releases": [
|
|
||||||
{"id": "0100000000010000"}
|
|
||||||
],
|
|
||||||
"title": "Super Mario Odyssey"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"compatibility": 0,
|
|
||||||
"directory": "animal-crossing-new-horizons",
|
|
||||||
"releases": [
|
|
||||||
{"id": "01006F8002326000"}
|
|
||||||
],
|
|
||||||
"title": "Animal Crossing: New Horizons"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"compatibility": 1,
|
|
||||||
"directory": "pokemon-legends-z-a",
|
|
||||||
"releases": [
|
|
||||||
{"id": "0100F43008C44000"}
|
|
||||||
],
|
|
||||||
"title": "Pokémon Legends: Z-A"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"compatibility": 1,
|
|
||||||
"directory": "the-legend-of-zelda-tears-of-the-kingdom",
|
|
||||||
"releases": [
|
|
||||||
{"id": "0100F2C0115B6000"}
|
|
||||||
],
|
|
||||||
"title": "The Legend of Zelda: Tears of the Kingdom"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"compatibility": 0,
|
|
||||||
"directory": "super-mario-galaxy",
|
|
||||||
"releases": [
|
|
||||||
{"id": "010099C022B96000"}
|
|
||||||
],
|
|
||||||
"title": "Super Mario Galaxy"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"compatibility": 3,
|
|
||||||
"directory": "star-wars-republic-commando",
|
|
||||||
"releases": [
|
|
||||||
{"id": "0100FA10115F8000"}
|
|
||||||
],
|
|
||||||
"title": "Star Wars: Republic Commando"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"compatibility": 0,
|
|
||||||
"directory": "doki-doki-literature-club-plus",
|
|
||||||
"releases": [
|
|
||||||
{"id": "010086901543E000"}
|
|
||||||
],
|
|
||||||
"title": "Doki Doki Literature Club Plus"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"compatibility": 1,
|
|
||||||
"directory": "pokemon-scarlet",
|
|
||||||
"releases": [
|
|
||||||
{"id": "0100A3D008C5C000"}
|
|
||||||
],
|
|
||||||
"title": "Pokémon Scarlet"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"compatibility": 1,
|
|
||||||
"directory": "pokemon-violet",
|
|
||||||
"releases": [
|
|
||||||
{"id": "01008F6008C5E000"}
|
|
||||||
],
|
|
||||||
"title": "Pokémon Violet"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"compatibility": 2,
|
|
||||||
"directory": "pokemon-legends-arceus",
|
|
||||||
"releases": [
|
|
||||||
{"id": "01001E300D162000"}
|
|
||||||
],
|
|
||||||
"title": "Pokémon Legends: Arceus"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"compatibility": 0,
|
|
||||||
"directory": "splatoon-2",
|
|
||||||
"releases": [
|
|
||||||
{"id": "01003BC0000A0000"}
|
|
||||||
],
|
|
||||||
"title": "Splatoon 2"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"compatibility": 1,
|
|
||||||
"directory": "super-smash-bros-ultimate",
|
|
||||||
"releases": [
|
|
||||||
{"id": "01006A800016E000"}
|
|
||||||
],
|
|
||||||
"title": "Super Smash Bros. Ultimate"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"compatibility": 0,
|
|
||||||
"directory": "mario-kart-8-deluxe",
|
|
||||||
"releases": [
|
|
||||||
{"id": "0100152000022000"}
|
|
||||||
],
|
|
||||||
"title": "Mario Kart 8 Deluxe"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"compatibility": 0,
|
|
||||||
"directory": "splatoon-3",
|
|
||||||
"releases": [
|
|
||||||
{"id": "0100C2500FC20000"}
|
|
||||||
],
|
|
||||||
"title": "Splatoon 3"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"compatibility": 0,
|
|
||||||
"directory": "new-super-mario-bros-u-deluxe",
|
|
||||||
"releases": [
|
|
||||||
{"id": "0100EA80032EA000"}
|
|
||||||
],
|
|
||||||
"title": "New Super Mario Bros. U Deluxe"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"compatibility": 0,
|
|
||||||
"directory": "hyrule-warriors-age-of-calamity",
|
|
||||||
"releases": [
|
|
||||||
{"id": "01002B00111A2000"}
|
|
||||||
],
|
|
||||||
"title": "Hyrule Warriors: Age of Calamity"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"compatibility": 2,
|
|
||||||
"directory": "luigis-mansion-3",
|
|
||||||
"releases": [
|
|
||||||
{"id": "0100DCA0064A6000"}
|
|
||||||
],
|
|
||||||
"title": "Luigi's Mansion 3"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"compatibility": 2,
|
|
||||||
"directory": "pokemon-brilliant-diamond",
|
|
||||||
"releases": [
|
|
||||||
{"id": "0100000011D90000"}
|
|
||||||
],
|
|
||||||
"title": "Pokémon Brilliant Diamond"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"compatibility": 2,
|
|
||||||
"directory": "pokemon-shining-pearl",
|
|
||||||
"releases": [
|
|
||||||
{"id": "010018E011D92000"}
|
|
||||||
],
|
|
||||||
"title": "Pokémon Shining Pearl"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"compatibility": 1,
|
|
||||||
"directory": "super-mario-3d-world-bowsers-fury",
|
|
||||||
"releases": [
|
|
||||||
{"id": "010028600EBDA000"}
|
|
||||||
],
|
|
||||||
"title": "Super Mario 3D World + Bowser's Fury"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"compatibility": 0,
|
|
||||||
"directory": "the-legend-of-zelda-links-awakening",
|
|
||||||
"releases": [
|
|
||||||
{"id": "01006BB00C6F0000"}
|
|
||||||
],
|
|
||||||
"title": "The Legend of Zelda: Link's Awakening"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"compatibility": 1,
|
|
||||||
"directory": "fire-emblem-three-houses",
|
|
||||||
"releases": [
|
|
||||||
{"id": "010055D009F78000"}
|
|
||||||
],
|
|
||||||
"title": "Fire Emblem: Three Houses"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"compatibility": 2,
|
|
||||||
"directory": "metroid-dread",
|
|
||||||
"releases": [
|
|
||||||
{"id": "010093801237C000"}
|
|
||||||
],
|
|
||||||
"title": "Metroid Dread"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"compatibility": 0,
|
|
||||||
"directory": "paper-mario-the-origami-king",
|
|
||||||
"releases": [
|
|
||||||
{"id": "0100A3900C3E2000"}
|
|
||||||
],
|
|
||||||
"title": "Paper Mario: The Origami King"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"compatibility": 1,
|
|
||||||
"directory": "xenoblade-chronicles-definitive-edition",
|
|
||||||
"releases": [
|
|
||||||
{"id": "0100FF500E34A000"}
|
|
||||||
],
|
|
||||||
"title": "Xenoblade Chronicles: Definitive Edition"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"compatibility": 2,
|
|
||||||
"directory": "xenoblade-chronicles-3",
|
|
||||||
"releases": [
|
|
||||||
{"id": "010074F013262000"}
|
|
||||||
],
|
|
||||||
"title": "Xenoblade Chronicles 3"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"compatibility": 1,
|
|
||||||
"directory": "pikmin-3-deluxe",
|
|
||||||
"releases": [
|
|
||||||
{"id": "0100F8600D4B0000"}
|
|
||||||
],
|
|
||||||
"title": "Pikmin 3 Deluxe"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"compatibility": 0,
|
|
||||||
"directory": "donkey-kong-country-tropical-freeze",
|
|
||||||
"releases": [
|
|
||||||
{"id": "0100C1F0054B6000"}
|
|
||||||
],
|
|
||||||
"title": "Donkey Kong Country: Tropical Freeze"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"compatibility": 1,
|
|
||||||
"directory": "kirby-and-the-forgotten-land",
|
|
||||||
"releases": [
|
|
||||||
{"id": "01004D300C5AE000"}
|
|
||||||
],
|
|
||||||
"title": "Kirby and the Forgotten Land"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"compatibility": 2,
|
|
||||||
"directory": "mario-party-superstars",
|
|
||||||
"releases": [
|
|
||||||
{"id": "01006B400D8B2000"}
|
|
||||||
],
|
|
||||||
"title": "Mario Party Superstars"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"compatibility": 0,
|
|
||||||
"directory": "clubhouse-games-51-worldwide-classics",
|
|
||||||
"releases": [
|
|
||||||
{"id": "0100F8600D4B0000"}
|
|
||||||
],
|
|
||||||
"title": "Clubhouse Games: 51 Worldwide Classics"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"compatibility": 1,
|
|
||||||
"directory": "ring-fit-adventure",
|
|
||||||
"releases": [
|
|
||||||
{"id": "01006B300BAF8000"}
|
|
||||||
],
|
|
||||||
"title": "Ring Fit Adventure"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"compatibility": 2,
|
|
||||||
"directory": "arms",
|
|
||||||
"releases": [
|
|
||||||
{"id": "01009B500007C000"}
|
|
||||||
],
|
|
||||||
"title": "ARMS"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"compatibility": 0,
|
|
||||||
"directory": "super-mario-maker-2",
|
|
||||||
"releases": [
|
|
||||||
{"id": "01009B90006DC000"}
|
|
||||||
],
|
|
||||||
"title": "Super Mario Maker 2"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"compatibility": 0,
|
|
||||||
"directory": "pokemon-lets-go-pikachu",
|
|
||||||
"releases": [
|
|
||||||
{"id": "010003F003A34000"}
|
|
||||||
],
|
|
||||||
"title": "Pokémon: Let's Go, Pikachu!"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"compatibility": 1,
|
|
||||||
"directory": "pokemon-lets-go-eevee",
|
|
||||||
"releases": [
|
|
||||||
{"id": "0100187003A36000"}
|
|
||||||
],
|
|
||||||
"title": "Pokémon: Let's Go, Eevee!"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"compatibility": 2,
|
|
||||||
"directory": "pokemon-sword",
|
|
||||||
"releases": [
|
|
||||||
{"id": "0100ABF008968000"}
|
|
||||||
],
|
|
||||||
"title": "Pokémon Sword"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"compatibility": 2,
|
|
||||||
"directory": "pokemon-shield",
|
|
||||||
"releases": [
|
|
||||||
{"id": "01008DB008C2C000"}
|
|
||||||
],
|
|
||||||
"title": "Pokémon Shield"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"compatibility": 1,
|
|
||||||
"directory": "new-pokemon-snap",
|
|
||||||
"releases": [
|
|
||||||
{"id": "0100F4300C182000"}
|
|
||||||
],
|
|
||||||
"title": "New Pokémon Snap"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"compatibility": 0,
|
|
||||||
"directory": "mario-golf-super-rush",
|
|
||||||
"releases": [
|
|
||||||
{"id": "0100C9C00E25C000"}
|
|
||||||
],
|
|
||||||
"title": "Mario Golf: Super Rush"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"compatibility": 1,
|
|
||||||
"directory": "mario-tennis-aces",
|
|
||||||
"releases": [
|
|
||||||
{"id": "0100BDE00862A000"}
|
|
||||||
],
|
|
||||||
"title": "Mario Tennis Aces"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"compatibility": 2,
|
|
||||||
"directory": "wario-ware-get-it-together",
|
|
||||||
"releases": [
|
|
||||||
{"id": "0100563010F22000"}
|
|
||||||
],
|
|
||||||
"title": "WarioWare: Get It Together!"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"compatibility": 0,
|
|
||||||
"directory": "big-brain-academy-brain-vs-brain",
|
|
||||||
"releases": [
|
|
||||||
{"id": "0100190010F24000"}
|
|
||||||
],
|
|
||||||
"title": "Big Brain Academy: Brain vs. Brain"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
<RCC>
|
|
||||||
<qresource prefix="compatibility_list">
|
|
||||||
<file>compatibility_list.json</file>
|
|
||||||
</qresource>
|
|
||||||
</RCC>
|
|
||||||
Vendored
+8
-7
@@ -11,12 +11,12 @@ SPDX-License-Identifier: CC0-1.0
|
|||||||
-->
|
-->
|
||||||
|
|
||||||
<component type="desktop-application">
|
<component type="desktop-application">
|
||||||
<id>org.eden_emu.eden</id>
|
<id>dev.eden_emu.eden</id>
|
||||||
<metadata_license>CC0-1.0</metadata_license>
|
<metadata_license>CC0-1.0</metadata_license>
|
||||||
<name>eden</name>
|
<name>eden</name>
|
||||||
<summary>Nintendo Switch emulator</summary>
|
<summary>Nintendo Switch emulator</summary>
|
||||||
<description>
|
<description>
|
||||||
<p>Multiplatform FOSS Switch 1 emulator written in C++, derived from Yuzu and Sudachi</p>
|
<p>Eden is a free and open-source (FOSS) Switch 1 emulator started by developer Camille LaVey. Written in C++, with builds for Windows, Linux, macOS, Android, FreeBSD and more.</p>
|
||||||
</description>
|
</description>
|
||||||
<categories>
|
<categories>
|
||||||
<category>Game</category>
|
<category>Game</category>
|
||||||
@@ -28,14 +28,14 @@ SPDX-License-Identifier: CC0-1.0
|
|||||||
</keywords>
|
</keywords>
|
||||||
<url type="homepage">https://eden-emu.dev/</url>
|
<url type="homepage">https://eden-emu.dev/</url>
|
||||||
<url type="bugtracker">https://git.eden-emu.dev/eden-emu/eden/issues</url>
|
<url type="bugtracker">https://git.eden-emu.dev/eden-emu/eden/issues</url>
|
||||||
<url type="faq">https://eden-emu.dev/docs</url>
|
<url type="faq">https://eden-emu.dev/about</url>
|
||||||
<url type="help">https://eden-emu.dev/docs</url>
|
<url type="help">https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/README.md</url>
|
||||||
<url type="donation">https://eden-emu.dev/donations</url>
|
<url type="donation">https://liberapay.com/crueter</url>
|
||||||
<url type="translate">https://explore.transifex.com/edenemu/eden-emulator</url>
|
<url type="translate">https://explore.transifex.com/edenemu/eden-emulator</url>
|
||||||
<url type="contact">https://discord.gg/edenemu</url>
|
<url type="contact">https://discord.gg/HstXbPch7X</url>
|
||||||
<url type="vcs-browser">https://git.eden-emu.dev</url>
|
<url type="vcs-browser">https://git.eden-emu.dev</url>
|
||||||
<url type="contribute">https://git.eden-emu.dev/eden-emu/eden</url>
|
<url type="contribute">https://git.eden-emu.dev/eden-emu/eden</url>
|
||||||
<launchable type="desktop-id">org.eden_emu.eden.desktop</launchable>
|
<launchable type="desktop-id">dev.eden_emu.eden.desktop</launchable>
|
||||||
<provides>
|
<provides>
|
||||||
<binary>yuzu</binary>
|
<binary>yuzu</binary>
|
||||||
<binary>yuzu-cmd</binary>
|
<binary>yuzu-cmd</binary>
|
||||||
@@ -44,6 +44,7 @@ SPDX-License-Identifier: CC0-1.0
|
|||||||
<control>pointing</control>
|
<control>pointing</control>
|
||||||
<control>keyboard</control>
|
<control>keyboard</control>
|
||||||
<control>gamepad</control>
|
<control>gamepad</control>
|
||||||
|
<internet>offline-only</internet>
|
||||||
</supports>
|
</supports>
|
||||||
<requires>
|
<requires>
|
||||||
<memory>8192</memory>
|
<memory>8192</memory>
|
||||||
|
|||||||
Vendored
+4
-4
@@ -14,7 +14,7 @@ SPDX-License-Identifier: GPL-2.0-or-later
|
|||||||
<mime-type type="application/x-nx-nro">
|
<mime-type type="application/x-nx-nro">
|
||||||
<comment>Nintendo Switch homebrew executable</comment>
|
<comment>Nintendo Switch homebrew executable</comment>
|
||||||
<acronym>NRO</acronym>
|
<acronym>NRO</acronym>
|
||||||
<icon name="org.eden_emu.eden"/>
|
<icon name="dev.eden_emu.eden"/>
|
||||||
<glob pattern="*.nro"/>
|
<glob pattern="*.nro"/>
|
||||||
<magic><match value="NRO" type="string" offset="16"/></magic>
|
<magic><match value="NRO" type="string" offset="16"/></magic>
|
||||||
</mime-type>
|
</mime-type>
|
||||||
@@ -22,7 +22,7 @@ SPDX-License-Identifier: GPL-2.0-or-later
|
|||||||
<mime-type type="application/x-nx-nso">
|
<mime-type type="application/x-nx-nso">
|
||||||
<comment>Nintendo Switch homebrew executable</comment>
|
<comment>Nintendo Switch homebrew executable</comment>
|
||||||
<acronym>NSO</acronym>
|
<acronym>NSO</acronym>
|
||||||
<icon name="org.eden_emu.eden"/>
|
<icon name="dev.eden_emu.eden"/>
|
||||||
<glob pattern="*.nso"/>
|
<glob pattern="*.nso"/>
|
||||||
<magic><match value="NSO" type="string" offset="0"/></magic>
|
<magic><match value="NSO" type="string" offset="0"/></magic>
|
||||||
</mime-type>
|
</mime-type>
|
||||||
@@ -30,7 +30,7 @@ SPDX-License-Identifier: GPL-2.0-or-later
|
|||||||
<mime-type type="application/x-nx-nsp">
|
<mime-type type="application/x-nx-nsp">
|
||||||
<comment>Nintendo Switch Package</comment>
|
<comment>Nintendo Switch Package</comment>
|
||||||
<acronym>NSP</acronym>
|
<acronym>NSP</acronym>
|
||||||
<icon name="org.eden_emu.eden"/>
|
<icon name="dev.eden_emu.eden"/>
|
||||||
<glob pattern="*.nsp"/>
|
<glob pattern="*.nsp"/>
|
||||||
<magic><match value="PFS" type="string" offset="0"/></magic>
|
<magic><match value="PFS" type="string" offset="0"/></magic>
|
||||||
</mime-type>
|
</mime-type>
|
||||||
@@ -38,7 +38,7 @@ SPDX-License-Identifier: GPL-2.0-or-later
|
|||||||
<mime-type type="application/x-nx-xci">
|
<mime-type type="application/x-nx-xci">
|
||||||
<comment>Nintendo Switch Card Image</comment>
|
<comment>Nintendo Switch Card Image</comment>
|
||||||
<acronym>XCI</acronym>
|
<acronym>XCI</acronym>
|
||||||
<icon name="org.eden_emu.eden"/>
|
<icon name="dev.eden_emu.eden"/>
|
||||||
<glob pattern="*.xci"/>
|
<glob pattern="*.xci"/>
|
||||||
</mime-type>
|
</mime-type>
|
||||||
</mime-info>
|
</mime-info>
|
||||||
|
|||||||
Vendored
+3
-1
@@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
Qt has "Translation Rules for Plurals", small example
|
Qt has "Translation Rules for Plurals", small example
|
||||||
|
|
||||||
|
```cpp
|
||||||
// Take a source line like
|
// Take a source line like
|
||||||
tr("Building: %n shader(s)", "", i)
|
tr("Building: %n shader(s)", "", i)
|
||||||
|
|
||||||
@@ -9,8 +10,9 @@ Qt has "Translation Rules for Plurals", small example
|
|||||||
Building: 1 shader
|
Building: 1 shader
|
||||||
// i = 2:
|
// i = 2:
|
||||||
Building: 2 shaders
|
Building: 2 shaders
|
||||||
|
```
|
||||||
|
|
||||||
For yuzu the source language used is English, for all other languages handling of plurals is handled by Qt and the translation collaboration site. Handling plurals in the source language (English) requires special consideration.
|
For Yuzu the source language used is English, for all other languages handling of plurals is handled by Qt and the translation collaboration site. Handling plurals in the source language (English) requires special consideration.
|
||||||
|
|
||||||
With CMake flag GENERATE_QT_TRANSLATION a generated_en.ts file is created from the source. It ignored by git (`.gitignore` in the project root). It is placed in this directory so that the relative refrences with the source code is correct.
|
With CMake flag GENERATE_QT_TRANSLATION a generated_en.ts file is created from the source. It ignored by git (`.gitignore` in the project root). It is placed in this directory so that the relative refrences with the source code is correct.
|
||||||
|
|
||||||
|
|||||||
Vendored
-14
@@ -1,14 +0,0 @@
|
|||||||
[main]
|
|
||||||
host = https://www.transifex.com
|
|
||||||
|
|
||||||
[o:yuzu-emulator:p:yuzu:r:emulator]
|
|
||||||
file_filter = <lang>.ts
|
|
||||||
source_file = en.ts
|
|
||||||
source_lang = en
|
|
||||||
type = QT
|
|
||||||
|
|
||||||
[o:yuzu-emulator:p:yuzu:r:yuzu-android]
|
|
||||||
file_filter = ../../src/android/app/src/main/res/values-<lang>/strings.xml
|
|
||||||
source_file = ../../src/android/app/src/main/res/values/strings.xml
|
|
||||||
type = ANDROID
|
|
||||||
lang_map = ja_JP:ja, ko_KR:ko, pt_BR:pt-rBR, pt_PT:pt-rPT, ru_RU:ru, vi_VN:vi, zh_CN:zh-rCN, zh_TW:zh-rTW
|
|
||||||
Vendored
+5
-1
@@ -1,7 +1,11 @@
|
|||||||
This directory stores translation patches (TS files) for yuzu Qt frontend. This directory is linked with the [Eden project on transifex](https://app.transifex.com/edenemu/eden-emulator), so you can update the translation by executing `tx pull -t -a`. If you want to contribute to the translation, please go the transifex link and submit your translation there. This directory on the main repo will be synchronized with transifex periodically. Do not directly open PRs on github to modify the translation.
|
# Translating
|
||||||
|
|
||||||
|
This directory stores translation patches (TS files) for Yuzu Qt frontend. This directory is linked with the [Eden project on Transifex](https://app.transifex.com/edenemu/eden-emulator), so you can update the translation by executing `tx pull -t -a` in the root of this repository. If you want to contribute to the translation, please go the Transifex link and submit your translation there.
|
||||||
|
|
||||||
When creating/improving translations, please keep in mind:
|
When creating/improving translations, please keep in mind:
|
||||||
|
|
||||||
- You are responsible for providing accurate translations that do NOT contain illicit content or messages,
|
- You are responsible for providing accurate translations that do NOT contain illicit content or messages,
|
||||||
- Many of our developers do not speak the languages you may be translating, so will only be able to help with confusions about the source language,
|
- Many of our developers do not speak the languages you may be translating, so will only be able to help with confusions about the source language,
|
||||||
- And bad-faith translations or attempts to insert illicit content may result in an immediate removal of access.
|
- And bad-faith translations or attempts to insert illicit content may result in an immediate removal of access.
|
||||||
|
|
||||||
|
New language requests will not be honored for the time being.
|
||||||
|
|||||||
Vendored
+917
-986
File diff suppressed because it is too large
Load Diff
Vendored
+955
-1031
File diff suppressed because it is too large
Load Diff
Vendored
+939
-1015
File diff suppressed because it is too large
Load Diff
Vendored
+935
-1011
File diff suppressed because it is too large
Load Diff
Vendored
+906
-985
File diff suppressed because it is too large
Load Diff
Vendored
+935
-1011
File diff suppressed because it is too large
Load Diff
Vendored
+910
-989
File diff suppressed because it is too large
Load Diff
Vendored
+957
-1033
File diff suppressed because it is too large
Load Diff
Vendored
+906
-983
File diff suppressed because it is too large
Load Diff
Vendored
+935
-1011
File diff suppressed because it is too large
Load Diff
Vendored
+902
-979
File diff suppressed because it is too large
Load Diff
Vendored
+906
-986
File diff suppressed because it is too large
Load Diff
Vendored
+936
-1012
File diff suppressed because it is too large
Load Diff
Vendored
+1468
-1526
File diff suppressed because it is too large
Load Diff
Vendored
+941
-1017
File diff suppressed because it is too large
Load Diff
Vendored
+936
-1014
File diff suppressed because it is too large
Load Diff
Vendored
+906
-986
File diff suppressed because it is too large
Load Diff
Vendored
+906
-987
File diff suppressed because it is too large
Load Diff
Vendored
+898
-974
File diff suppressed because it is too large
Load Diff
Vendored
+931
-1002
File diff suppressed because it is too large
Load Diff
Vendored
+906
-986
File diff suppressed because it is too large
Load Diff
Vendored
+906
-983
File diff suppressed because it is too large
Load Diff
Vendored
+906
-985
File diff suppressed because it is too large
Load Diff
Vendored
+935
-1011
File diff suppressed because it is too large
Load Diff
Vendored
+935
-1011
File diff suppressed because it is too large
Load Diff
Vendored
+916
-987
File diff suppressed because it is too large
Load Diff
Vendored
+899
-976
File diff suppressed because it is too large
Load Diff
Vendored
+70
@@ -0,0 +1,70 @@
|
|||||||
|
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
|
// SPDX-FileCopyrightText: Copyright 2012 PPSSPP Project
|
||||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
// Ported from bloomnoblur.fsh in PPSSPP.
|
||||||
|
|
||||||
|
texture BackBufferTex : COLOR;
|
||||||
|
sampler BackBuffer { Texture = BackBufferTex; };
|
||||||
|
|
||||||
|
uniform float Radius <
|
||||||
|
ui_type = "slider";
|
||||||
|
ui_label = "Radius";
|
||||||
|
ui_tooltip = "How far the glow spreads from bright areas.";
|
||||||
|
ui_min = 0.0; ui_max = 4.0; ui_step = 0.05;
|
||||||
|
> = 1.0;
|
||||||
|
|
||||||
|
uniform float Amount <
|
||||||
|
ui_type = "slider";
|
||||||
|
ui_label = "Amount";
|
||||||
|
ui_tooltip = "Strength of the glow added on top of the image.";
|
||||||
|
ui_min = 0.0; ui_max = 2.0; ui_step = 0.05;
|
||||||
|
> = 0.6;
|
||||||
|
|
||||||
|
void VS_PostProcess(in uint id : SV_VertexID, out float4 pos : SV_Position, out float2 uv : TEXCOORD)
|
||||||
|
{
|
||||||
|
uv = float2(float(id & 2), float((id & 1) << 1));
|
||||||
|
pos = float4(uv * float2(2.0, -2.0) + float2(-1.0, 1.0), 0.0, 1.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
float Weight(float3 color)
|
||||||
|
{
|
||||||
|
float gray = (color.r + color.g + color.b) / 3.0;
|
||||||
|
float saturation = (abs(color.r - gray) + abs(color.g - gray) + abs(color.b - gray)) / 3.0;
|
||||||
|
return gray * gray / max(saturation, 0.25);
|
||||||
|
}
|
||||||
|
|
||||||
|
float4 PS_Bloom(float4 pos : SV_Position, float2 uv : TEXCOORD) : SV_Target
|
||||||
|
{
|
||||||
|
float3 color = tex2D(BackBuffer, uv).rgb;
|
||||||
|
|
||||||
|
float gray = (color.r + color.g + color.b) / 3.0;
|
||||||
|
float saturation = (abs(color.r - gray) + abs(color.g - gray) + abs(color.b - gray)) / 3.0;
|
||||||
|
float spread = 0.002 * gray / max(saturation, 0.25) * Radius;
|
||||||
|
|
||||||
|
float3 sum = float3(0.0, 0.0, 0.0);
|
||||||
|
for (int x = -3; x <= 3; x += 2)
|
||||||
|
{
|
||||||
|
for (int y = -3; y <= 3; y += 2)
|
||||||
|
{
|
||||||
|
float3 tap = tex2D(BackBuffer, uv + float2(x, y) * spread).rgb;
|
||||||
|
sum += tap * Weight(tap);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sum /= 16.0;
|
||||||
|
|
||||||
|
return float4(saturate(color + sum * Amount), 1.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
technique Bloom <
|
||||||
|
ui_label = "Bloom";
|
||||||
|
ui_tooltip = "Blooms bright areas into a soft glow.";
|
||||||
|
>
|
||||||
|
{
|
||||||
|
pass
|
||||||
|
{
|
||||||
|
VertexShader = VS_PostProcess;
|
||||||
|
PixelShader = PS_Bloom;
|
||||||
|
}
|
||||||
|
}
|
||||||
Vendored
+87
@@ -0,0 +1,87 @@
|
|||||||
|
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
|
texture BackBufferTex : COLOR;
|
||||||
|
sampler BackBuffer { Texture = BackBufferTex; };
|
||||||
|
|
||||||
|
uniform float Radius <
|
||||||
|
ui_type = "slider";
|
||||||
|
ui_label = "Radius";
|
||||||
|
ui_tooltip = "How far the blur reaches, in pixels.";
|
||||||
|
ui_min = 1.0; ui_max = 12.0; ui_step = 0.5;
|
||||||
|
> = 4.0;
|
||||||
|
|
||||||
|
uniform float Strength <
|
||||||
|
ui_type = "slider";
|
||||||
|
ui_label = "Strength";
|
||||||
|
ui_tooltip = "Blend between the original image and the blurred one.";
|
||||||
|
ui_min = 0.0; ui_max = 1.0; ui_step = 0.05;
|
||||||
|
> = 1.0;
|
||||||
|
|
||||||
|
uniform float FocusSize <
|
||||||
|
ui_type = "slider";
|
||||||
|
ui_label = "Sharp Centre";
|
||||||
|
ui_tooltip = "Size of the region left in focus at the centre of the screen. At zero the whole image is blurred evenly.";
|
||||||
|
ui_min = 0.0; ui_max = 1.0; ui_step = 0.05;
|
||||||
|
> = 0.0;
|
||||||
|
|
||||||
|
uniform float FocusSoftness <
|
||||||
|
ui_type = "slider";
|
||||||
|
ui_label = "Focus Falloff";
|
||||||
|
ui_tooltip = "How gradually the sharp centre gives way to the blur.";
|
||||||
|
ui_min = 0.05; ui_max = 1.0; ui_step = 0.05;
|
||||||
|
> = 0.4;
|
||||||
|
|
||||||
|
static const int TAPS = 17;
|
||||||
|
|
||||||
|
void VS_PostProcess(in uint id : SV_VertexID, out float4 pos : SV_Position, out float2 uv : TEXCOORD)
|
||||||
|
{
|
||||||
|
uv = float2(float(id & 2), float((id & 1) << 1));
|
||||||
|
pos = float4(uv * float2(2.0, -2.0) + float2(-1.0, 1.0), 0.0, 1.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
float4 PS_Blur(float4 pos : SV_Position, float2 uv : TEXCOORD) : SV_Target
|
||||||
|
{
|
||||||
|
float2 texel = float2(BUFFER_RCP_WIDTH, BUFFER_RCP_HEIGHT);
|
||||||
|
float3 original = tex2D(BackBuffer, uv).rgb;
|
||||||
|
|
||||||
|
float2 centred = (uv - 0.5) * float2(BUFFER_WIDTH * BUFFER_RCP_HEIGHT, 1.0) * 2.0;
|
||||||
|
float distance_from_centre = length(centred);
|
||||||
|
float no_focus = 1.0 - step(0.001, FocusSize);
|
||||||
|
float focus = max(smoothstep(FocusSize, FocusSize + FocusSoftness, distance_from_centre), no_focus);
|
||||||
|
float amount = Strength * focus;
|
||||||
|
|
||||||
|
float angle = frac(sin(dot(pos.xy, float2(12.9898, 78.233))) * 43758.5453) * 6.2831853;
|
||||||
|
float2 spoke = float2(cos(angle), sin(angle));
|
||||||
|
|
||||||
|
const float2 turn = float2(cos(2.39996323), sin(2.39996323));
|
||||||
|
const float decay = exp(-2.0 / float(TAPS));
|
||||||
|
float weight = exp(-1.0 / float(TAPS));
|
||||||
|
|
||||||
|
float3 sum = float3(0.0, 0.0, 0.0);
|
||||||
|
float total = 0.0;
|
||||||
|
for (int i = 0; i < TAPS; ++i)
|
||||||
|
{
|
||||||
|
float reach = sqrt((float(i) + 0.5) / float(TAPS));
|
||||||
|
sum += tex2D(BackBuffer, uv + spoke * reach * texel * Radius).rgb * weight;
|
||||||
|
total += weight;
|
||||||
|
weight *= decay;
|
||||||
|
spoke = float2(spoke.x * turn.x - spoke.y * turn.y,
|
||||||
|
spoke.x * turn.y + spoke.y * turn.x);
|
||||||
|
}
|
||||||
|
|
||||||
|
float3 blurred = sum / total;
|
||||||
|
return float4(lerp(original, blurred, amount), 1.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
technique Blur <
|
||||||
|
ui_label = "Blur";
|
||||||
|
ui_tooltip = "Gaussian blur with an optional sharp centre, for softening the picture or faking depth of field.";
|
||||||
|
>
|
||||||
|
{
|
||||||
|
pass
|
||||||
|
{
|
||||||
|
VertexShader = VS_PostProcess;
|
||||||
|
PixelShader = PS_Blur;
|
||||||
|
}
|
||||||
|
}
|
||||||
Vendored
+74
@@ -0,0 +1,74 @@
|
|||||||
|
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
|
// SPDX-FileCopyrightText: Copyright 2012 PPSSPP Project
|
||||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
// Ported from crt.fsh in PPSSPP, by KillaMaaki.
|
||||||
|
|
||||||
|
|
||||||
|
texture BackBufferTex : COLOR;
|
||||||
|
sampler BackBuffer { Texture = BackBufferTex; };
|
||||||
|
|
||||||
|
uniform float Timer < source = "timer"; > = 0.0;
|
||||||
|
|
||||||
|
uniform float Density <
|
||||||
|
ui_type = "slider";
|
||||||
|
ui_label = "Line Density";
|
||||||
|
ui_min = 60.0; ui_max = 720.0; ui_step = 10.0;
|
||||||
|
> = 272.0;
|
||||||
|
|
||||||
|
uniform float RollSpeed <
|
||||||
|
ui_type = "slider";
|
||||||
|
ui_label = "Roll Speed";
|
||||||
|
ui_tooltip = "Speed of the rolling bar. Zero disables it.";
|
||||||
|
ui_min = 0.0; ui_max = 2.0; ui_step = 0.05;
|
||||||
|
> = 1.0;
|
||||||
|
|
||||||
|
uniform float Bleed <
|
||||||
|
ui_type = "slider";
|
||||||
|
ui_label = "Colour Bleed";
|
||||||
|
ui_tooltip = "Horizontal separation of the red and green channels.";
|
||||||
|
ui_min = 0.0; ui_max = 4.0; ui_step = 0.1;
|
||||||
|
> = 1.0;
|
||||||
|
|
||||||
|
void VS_PostProcess(in uint id : SV_VertexID, out float4 pos : SV_Position, out float2 uv : TEXCOORD)
|
||||||
|
{
|
||||||
|
uv = float2(float(id & 2), float((id & 1) << 1));
|
||||||
|
pos = float4(uv * float2(2.0, -2.0) + float2(-1.0, 1.0), 0.0, 1.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
float4 PS_CRT(float4 pos : SV_Position, float2 uv : TEXCOORD) : SV_Target
|
||||||
|
{
|
||||||
|
float seconds = Timer * 0.001;
|
||||||
|
float scan = floor((uv.y + seconds * RollSpeed * 0.5) * Density);
|
||||||
|
float line_intensity = frac(scan * 0.5) * 2.0;
|
||||||
|
|
||||||
|
float2 shift = float2(line_intensity * 0.0005, 0.0);
|
||||||
|
float2 bleed = float2(BUFFER_RCP_WIDTH * Bleed, 0.0);
|
||||||
|
|
||||||
|
float r = tex2D(BackBuffer, uv + bleed + shift).r;
|
||||||
|
float g = tex2D(BackBuffer, uv - bleed + shift).g;
|
||||||
|
float b = tex2D(BackBuffer, uv).b;
|
||||||
|
|
||||||
|
float3 color = float3(r, g * 0.99, b) * clamp(line_intensity, 0.85, 1.0);
|
||||||
|
|
||||||
|
if (RollSpeed > 0.0)
|
||||||
|
{
|
||||||
|
float rollbar = sin((uv.y + seconds * RollSpeed) * 4.0);
|
||||||
|
color += rollbar * 0.02;
|
||||||
|
}
|
||||||
|
|
||||||
|
return float4(saturate(color), 1.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
technique CRT <
|
||||||
|
ui_label = "CRT";
|
||||||
|
ui_tooltip = "Curved scanlines and the phosphor mask of a CRT television.";
|
||||||
|
>
|
||||||
|
{
|
||||||
|
pass
|
||||||
|
{
|
||||||
|
VertexShader = VS_PostProcess;
|
||||||
|
PixelShader = PS_CRT;
|
||||||
|
}
|
||||||
|
}
|
||||||
Vendored
+79
@@ -0,0 +1,79 @@
|
|||||||
|
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
|
// SPDX-FileCopyrightText: Copyright 2012 PPSSPP Project
|
||||||
|
// SPDX-FileCopyrightText: guest(r)
|
||||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
// Ported from cartoon.fsh in PPSSPP, Advanced Cartoon shader I by guest(r).
|
||||||
|
|
||||||
|
texture BackBufferTex : COLOR;
|
||||||
|
sampler BackBuffer { Texture = BackBufferTex; };
|
||||||
|
|
||||||
|
uniform float EdgeStrength <
|
||||||
|
ui_type = "slider";
|
||||||
|
ui_label = "Edge Strength";
|
||||||
|
ui_tooltip = "Darkness of the ink outline drawn around detected edges.";
|
||||||
|
ui_min = 0.0; ui_max = 2.0; ui_step = 0.05;
|
||||||
|
> = 0.5;
|
||||||
|
|
||||||
|
uniform float Levels <
|
||||||
|
ui_type = "slider";
|
||||||
|
ui_label = "Colour Levels";
|
||||||
|
ui_tooltip = "How many bands the colours are quantised into.";
|
||||||
|
ui_min = 2.0; ui_max = 16.0; ui_step = 1.0;
|
||||||
|
> = 4.0;
|
||||||
|
|
||||||
|
void VS_PostProcess(in uint id : SV_VertexID, out float4 pos : SV_Position, out float2 uv : TEXCOORD)
|
||||||
|
{
|
||||||
|
uv = float2(float(id & 2), float((id & 1) << 1));
|
||||||
|
pos = float4(uv * float2(2.0, -2.0) + float2(-1.0, 1.0), 0.0, 1.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
float4 PS_Cartoon(float4 pos : SV_Position, float2 uv : TEXCOORD) : SV_Target
|
||||||
|
{
|
||||||
|
float2 texel = float2(BUFFER_RCP_WIDTH, BUFFER_RCP_HEIGHT);
|
||||||
|
|
||||||
|
float3 c00 = tex2D(BackBuffer, uv + texel * float2(-1.0, -1.0)).rgb;
|
||||||
|
float3 c10 = tex2D(BackBuffer, uv + texel * float2( 0.0, -1.0)).rgb;
|
||||||
|
float3 c20 = tex2D(BackBuffer, uv + texel * float2( 1.0, -1.0)).rgb;
|
||||||
|
float3 c01 = tex2D(BackBuffer, uv + texel * float2(-1.0, 0.0)).rgb;
|
||||||
|
float3 c11 = tex2D(BackBuffer, uv).rgb;
|
||||||
|
float3 c21 = tex2D(BackBuffer, uv + texel * float2( 1.0, 0.0)).rgb;
|
||||||
|
float3 c02 = tex2D(BackBuffer, uv + texel * float2(-1.0, 1.0)).rgb;
|
||||||
|
float3 c12 = tex2D(BackBuffer, uv + texel * float2( 0.0, 1.0)).rgb;
|
||||||
|
float3 c22 = tex2D(BackBuffer, uv + texel * float2( 1.0, 1.0)).rgb;
|
||||||
|
|
||||||
|
const float3 dt = float3(1.0, 1.0, 1.0);
|
||||||
|
|
||||||
|
float d1 = dot(abs(c00 - c22), dt);
|
||||||
|
float d2 = dot(abs(c20 - c02), dt);
|
||||||
|
float hl = dot(abs(c01 - c21), dt);
|
||||||
|
float vl = dot(abs(c10 - c12), dt);
|
||||||
|
float edge = EdgeStrength * (d1 + d2 + hl + vl) / (dot(c11, dt) + 0.15);
|
||||||
|
|
||||||
|
float lc = Levels * length(c11);
|
||||||
|
float f = frac(lc);
|
||||||
|
f *= f;
|
||||||
|
lc = (floor(lc) + f * f) / Levels + 0.05;
|
||||||
|
|
||||||
|
float3 unit = normalize(max(c11, 0.0001));
|
||||||
|
float3 quant = Levels * unit;
|
||||||
|
float3 frct = frac(quant);
|
||||||
|
frct *= frct;
|
||||||
|
quant = floor(quant) + 0.05 * dt + frct * frct;
|
||||||
|
|
||||||
|
float3 color = lc * (1.1 - edge * sqrt(edge)) * quant / Levels;
|
||||||
|
return float4(saturate(color), 1.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
technique Cartoon <
|
||||||
|
ui_label = "Cartoon";
|
||||||
|
ui_tooltip = "Ink outlines and flat colour bands. Faithful port of the PPSSPP shader; the outline gets heavy in dark scenes.";
|
||||||
|
>
|
||||||
|
{
|
||||||
|
pass
|
||||||
|
{
|
||||||
|
VertexShader = VS_PostProcess;
|
||||||
|
PixelShader = PS_Cartoon;
|
||||||
|
}
|
||||||
|
}
|
||||||
Vendored
+100
@@ -0,0 +1,100 @@
|
|||||||
|
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
|
// SPDX-FileCopyrightText: Copyright 2012 PPSSPP Project
|
||||||
|
// SPDX-FileCopyrightText: guest(r)
|
||||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
texture BackBufferTex : COLOR;
|
||||||
|
sampler BackBuffer { Texture = BackBufferTex; };
|
||||||
|
|
||||||
|
uniform float EdgeStrength <
|
||||||
|
ui_type = "slider";
|
||||||
|
ui_label = "Edge Strength";
|
||||||
|
ui_tooltip = "Darkness of the ink outline drawn around detected edges.";
|
||||||
|
ui_min = 0.0; ui_max = 2.0; ui_step = 0.05;
|
||||||
|
> = 0.45;
|
||||||
|
|
||||||
|
uniform float ShadowGuard <
|
||||||
|
ui_type = "slider";
|
||||||
|
ui_label = "Shadow Guard";
|
||||||
|
ui_tooltip = "Holds the outline back in dark areas. Raise it if shadows turn into black blobs.";
|
||||||
|
ui_min = 0.1; ui_max = 2.0; ui_step = 0.05;
|
||||||
|
> = 0.8;
|
||||||
|
|
||||||
|
uniform float Levels <
|
||||||
|
ui_type = "slider";
|
||||||
|
ui_label = "Colour Levels";
|
||||||
|
ui_tooltip = "How many bands the colours are quantised into.";
|
||||||
|
ui_min = 2.0; ui_max = 16.0; ui_step = 1.0;
|
||||||
|
> = 6.0;
|
||||||
|
|
||||||
|
uniform float Smoothing <
|
||||||
|
ui_type = "slider";
|
||||||
|
ui_label = "Banding";
|
||||||
|
ui_tooltip = "How far the picture is pushed towards flat bands.";
|
||||||
|
ui_min = 0.0; ui_max = 1.0; ui_step = 0.05;
|
||||||
|
> = 0.75;
|
||||||
|
|
||||||
|
uniform float Saturation <
|
||||||
|
ui_type = "slider";
|
||||||
|
ui_label = "Saturation";
|
||||||
|
ui_min = 0.0; ui_max = 2.0; ui_step = 0.05;
|
||||||
|
> = 1.15;
|
||||||
|
|
||||||
|
void VS_PostProcess(in uint id : SV_VertexID, out float4 pos : SV_Position, out float2 uv : TEXCOORD)
|
||||||
|
{
|
||||||
|
uv = float2(float(id & 2), float((id & 1) << 1));
|
||||||
|
pos = float4(uv * float2(2.0, -2.0) + float2(-1.0, 1.0), 0.0, 1.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
float4 PS_CartoonSoft(float4 pos : SV_Position, float2 uv : TEXCOORD) : SV_Target
|
||||||
|
{
|
||||||
|
float2 texel = float2(BUFFER_RCP_WIDTH, BUFFER_RCP_HEIGHT);
|
||||||
|
|
||||||
|
float3 c00 = tex2D(BackBuffer, uv + texel * float2(-1.0, -1.0)).rgb;
|
||||||
|
float3 c10 = tex2D(BackBuffer, uv + texel * float2( 0.0, -1.0)).rgb;
|
||||||
|
float3 c20 = tex2D(BackBuffer, uv + texel * float2( 1.0, -1.0)).rgb;
|
||||||
|
float3 c01 = tex2D(BackBuffer, uv + texel * float2(-1.0, 0.0)).rgb;
|
||||||
|
float3 c11 = tex2D(BackBuffer, uv).rgb;
|
||||||
|
float3 c21 = tex2D(BackBuffer, uv + texel * float2( 1.0, 0.0)).rgb;
|
||||||
|
float3 c02 = tex2D(BackBuffer, uv + texel * float2(-1.0, 1.0)).rgb;
|
||||||
|
float3 c12 = tex2D(BackBuffer, uv + texel * float2( 0.0, 1.0)).rgb;
|
||||||
|
float3 c22 = tex2D(BackBuffer, uv + texel * float2( 1.0, 1.0)).rgb;
|
||||||
|
|
||||||
|
const float3 dt = float3(1.0, 1.0, 1.0);
|
||||||
|
const float3 luma_weights = float3(0.299, 0.587, 0.114);
|
||||||
|
|
||||||
|
float d1 = dot(abs(c00 - c22), dt);
|
||||||
|
float d2 = dot(abs(c20 - c02), dt);
|
||||||
|
float hl = dot(abs(c01 - c21), dt);
|
||||||
|
float vl = dot(abs(c10 - c12), dt);
|
||||||
|
|
||||||
|
float luma = dot(c11, luma_weights);
|
||||||
|
float response = (d1 + d2 + hl + vl) / (luma * 2.0 + ShadowGuard);
|
||||||
|
float ink = 1.0 - saturate(response * EdgeStrength);
|
||||||
|
|
||||||
|
float scaled = luma * Levels;
|
||||||
|
float step_position = frac(scaled);
|
||||||
|
float eased = step_position * step_position * (3.0 - 2.0 * step_position);
|
||||||
|
float banded = (floor(scaled) + eased) / Levels;
|
||||||
|
float target = lerp(luma, banded, Smoothing);
|
||||||
|
|
||||||
|
float3 tinted = c11 * (target / max(luma, 0.001));
|
||||||
|
float3 grey = dot(tinted, luma_weights);
|
||||||
|
float3 color = lerp(grey, tinted, Saturation) * ink;
|
||||||
|
|
||||||
|
return float4(saturate(color), 1.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
technique CartoonSoft <
|
||||||
|
ui_label = "Cartoon Soft";
|
||||||
|
ui_tooltip = "Ink outlines and flat colour bands, with the outline held back in the shadows.";
|
||||||
|
>
|
||||||
|
{
|
||||||
|
pass
|
||||||
|
{
|
||||||
|
VertexShader = VS_PostProcess;
|
||||||
|
PixelShader = PS_CartoonSoft;
|
||||||
|
}
|
||||||
|
}
|
||||||
Vendored
+120
@@ -0,0 +1,120 @@
|
|||||||
|
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
|
texture BackBufferTex : COLOR;
|
||||||
|
sampler BackBuffer { Texture = BackBufferTex; };
|
||||||
|
|
||||||
|
uniform float Bands <
|
||||||
|
ui_type = "slider";
|
||||||
|
ui_label = "Shading Bands";
|
||||||
|
ui_tooltip = "How many flat steps the lighting is collapsed into. Three or four gives the classic look.";
|
||||||
|
ui_min = 2.0; ui_max = 8.0; ui_step = 1.0;
|
||||||
|
> = 4.0;
|
||||||
|
|
||||||
|
uniform float BandContrast <
|
||||||
|
ui_type = "slider";
|
||||||
|
ui_label = "Band Contrast";
|
||||||
|
ui_tooltip = "Spreads the bands towards pure black and white. Lower it if the shadows crush.";
|
||||||
|
ui_min = 0.0; ui_max = 1.0; ui_step = 0.05;
|
||||||
|
> = 0.5;
|
||||||
|
|
||||||
|
uniform float BandEdge <
|
||||||
|
ui_type = "slider";
|
||||||
|
ui_label = "Band Edge";
|
||||||
|
ui_tooltip = "Width of the transition between bands. Low values give hard cel steps.";
|
||||||
|
ui_min = 0.02; ui_max = 1.0; ui_step = 0.02;
|
||||||
|
> = 0.15;
|
||||||
|
|
||||||
|
uniform float Detail <
|
||||||
|
ui_type = "slider";
|
||||||
|
ui_label = "Texture Detail";
|
||||||
|
ui_tooltip = "How much surface texture survives the flattening. At zero the bands are completely flat.";
|
||||||
|
ui_min = 0.0; ui_max = 1.0; ui_step = 0.05;
|
||||||
|
> = 0.6;
|
||||||
|
|
||||||
|
uniform float OutlineStrength <
|
||||||
|
ui_type = "slider";
|
||||||
|
ui_label = "Outline Strength";
|
||||||
|
ui_tooltip = "Opacity of the ink line drawn along detected edges.";
|
||||||
|
ui_min = 0.0; ui_max = 1.0; ui_step = 0.05;
|
||||||
|
> = 0.8;
|
||||||
|
|
||||||
|
uniform float OutlineThreshold <
|
||||||
|
ui_type = "slider";
|
||||||
|
ui_label = "Outline Threshold";
|
||||||
|
ui_tooltip = "How strong an edge has to be before it is inked. Raise it to keep ink off textures and specular highlights.";
|
||||||
|
ui_min = 0.01; ui_max = 0.4; ui_step = 0.01;
|
||||||
|
> = 0.18;
|
||||||
|
|
||||||
|
uniform float Saturation <
|
||||||
|
ui_type = "slider";
|
||||||
|
ui_label = "Saturation";
|
||||||
|
ui_tooltip = "Colour intensity of the flat regions.";
|
||||||
|
ui_min = 0.0; ui_max = 2.0; ui_step = 0.05;
|
||||||
|
> = 1.25;
|
||||||
|
|
||||||
|
void VS_PostProcess(in uint id : SV_VertexID, out float4 pos : SV_Position, out float2 uv : TEXCOORD)
|
||||||
|
{
|
||||||
|
uv = float2(float(id & 2), float((id & 1) << 1));
|
||||||
|
pos = float4(uv * float2(2.0, -2.0) + float2(-1.0, 1.0), 0.0, 1.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
float4 PS_CelShading(float4 pos : SV_Position, float2 uv : TEXCOORD) : SV_Target
|
||||||
|
{
|
||||||
|
const float3 luma_weights = float3(0.2126, 0.7152, 0.0722);
|
||||||
|
float2 texel = float2(BUFFER_RCP_WIDTH, BUFFER_RCP_HEIGHT);
|
||||||
|
|
||||||
|
float3 centre = tex2D(BackBuffer, uv).rgb;
|
||||||
|
float luma = dot(centre, luma_weights);
|
||||||
|
|
||||||
|
float2 near = texel * 1.5;
|
||||||
|
float2 far = texel * 3.5;
|
||||||
|
|
||||||
|
float a00 = dot(tex2D(BackBuffer, uv + near * float2(-1.0, -1.0)).rgb, luma_weights);
|
||||||
|
float a20 = dot(tex2D(BackBuffer, uv + near * float2( 1.0, -1.0)).rgb, luma_weights);
|
||||||
|
float a02 = dot(tex2D(BackBuffer, uv + near * float2(-1.0, 1.0)).rgb, luma_weights);
|
||||||
|
float a22 = dot(tex2D(BackBuffer, uv + near * float2( 1.0, 1.0)).rgb, luma_weights);
|
||||||
|
|
||||||
|
float b00 = dot(tex2D(BackBuffer, uv + far * float2(-1.0, -1.0)).rgb, luma_weights);
|
||||||
|
float b20 = dot(tex2D(BackBuffer, uv + far * float2( 1.0, -1.0)).rgb, luma_weights);
|
||||||
|
float b02 = dot(tex2D(BackBuffer, uv + far * float2(-1.0, 1.0)).rgb, luma_weights);
|
||||||
|
float b22 = dot(tex2D(BackBuffer, uv + far * float2( 1.0, 1.0)).rgb, luma_weights);
|
||||||
|
|
||||||
|
float gx = (a00 + a02) - (a20 + a22);
|
||||||
|
float gy = (a00 + a20) - (a02 + a22);
|
||||||
|
float gradient = sqrt(gx * gx + gy * gy);
|
||||||
|
float ink = smoothstep(OutlineThreshold, OutlineThreshold + 0.04, gradient);
|
||||||
|
|
||||||
|
float lighting = (a00 + a20 + a02 + a22 + b00 + b20 + b02 + b22) * 0.125;
|
||||||
|
float detail = luma - lighting;
|
||||||
|
|
||||||
|
float softness = max(BandEdge, 0.001);
|
||||||
|
float coord = lighting * Bands - softness * 0.5;
|
||||||
|
float index = floor(coord) + smoothstep(1.0 - softness, 1.0, frac(coord));
|
||||||
|
|
||||||
|
float centred = (index + 0.5) / Bands;
|
||||||
|
float stretched = index / max(Bands - 1.0, 1.0);
|
||||||
|
float banded = saturate(lerp(centred, stretched, BandContrast));
|
||||||
|
|
||||||
|
float target = saturate(banded + detail * Detail);
|
||||||
|
|
||||||
|
float gain = min(target / max(luma, 0.001), 4.0);
|
||||||
|
float3 shaded = centre * gain;
|
||||||
|
float3 grey = dot(shaded, luma_weights);
|
||||||
|
float3 color = lerp(grey, shaded, Saturation);
|
||||||
|
color *= 1.0 - ink * OutlineStrength;
|
||||||
|
|
||||||
|
return float4(saturate(color), 1.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
technique CelShading <
|
||||||
|
ui_label = "Cel Shading";
|
||||||
|
ui_tooltip = "Collapses the lighting into a few hard steps and inks the edges, keeping texture detail and hue intact.";
|
||||||
|
>
|
||||||
|
{
|
||||||
|
pass
|
||||||
|
{
|
||||||
|
VertexShader = VS_PostProcess;
|
||||||
|
PixelShader = PS_CelShading;
|
||||||
|
}
|
||||||
|
}
|
||||||
+53
@@ -0,0 +1,53 @@
|
|||||||
|
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
|
texture BackBufferTex : COLOR;
|
||||||
|
sampler BackBuffer { Texture = BackBufferTex; };
|
||||||
|
|
||||||
|
uniform float Strength <
|
||||||
|
ui_type = "slider";
|
||||||
|
ui_label = "Strength";
|
||||||
|
ui_tooltip = "Channel separation in pixels, measured at the edge of the screen.";
|
||||||
|
ui_min = 0.0; ui_max = 8.0; ui_step = 0.1;
|
||||||
|
> = 1.5;
|
||||||
|
|
||||||
|
uniform float Falloff <
|
||||||
|
ui_type = "slider";
|
||||||
|
ui_label = "Falloff";
|
||||||
|
ui_tooltip = "How fast the separation grows away from the centre. Higher keeps the middle clean.";
|
||||||
|
ui_min = 1.0; ui_max = 4.0; ui_step = 0.1;
|
||||||
|
> = 2.0;
|
||||||
|
|
||||||
|
void VS_PostProcess(in uint id : SV_VertexID, out float4 pos : SV_Position, out float2 uv : TEXCOORD)
|
||||||
|
{
|
||||||
|
uv = float2(float(id & 2), float((id & 1) << 1));
|
||||||
|
pos = float4(uv * float2(2.0, -2.0) + float2(-1.0, 1.0), 0.0, 1.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
float4 PS_ChromaticAberration(float4 pos : SV_Position, float2 uv : TEXCOORD) : SV_Target
|
||||||
|
{
|
||||||
|
float2 texel = float2(BUFFER_RCP_WIDTH, BUFFER_RCP_HEIGHT);
|
||||||
|
|
||||||
|
float2 direction = uv - float2(0.5, 0.5);
|
||||||
|
float radius = length(direction);
|
||||||
|
float2 unit = direction / max(radius, 0.0001);
|
||||||
|
float2 offset = unit * Strength * pow(radius * 2.0, Falloff) * texel;
|
||||||
|
|
||||||
|
float red = tex2D(BackBuffer, uv + offset).r;
|
||||||
|
float green = tex2D(BackBuffer, uv).g;
|
||||||
|
float blue = tex2D(BackBuffer, uv - offset).b;
|
||||||
|
|
||||||
|
return float4(red, green, blue, 1.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
technique ChromaticAberration <
|
||||||
|
ui_label = "Chromatic Aberration";
|
||||||
|
ui_tooltip = "Splits the colour channels apart towards the edges of the screen, like a cheap lens.";
|
||||||
|
>
|
||||||
|
{
|
||||||
|
pass
|
||||||
|
{
|
||||||
|
VertexShader = VS_PostProcess;
|
||||||
|
PixelShader = PS_ChromaticAberration;
|
||||||
|
}
|
||||||
|
}
|
||||||
Vendored
+64
@@ -0,0 +1,64 @@
|
|||||||
|
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
|
// SPDX-FileCopyrightText: Copyright 2012 PPSSPP Project
|
||||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
// Based on colorcorrection.fsh in PPSSPP.
|
||||||
|
|
||||||
|
texture BackBufferTex : COLOR;
|
||||||
|
sampler BackBuffer { Texture = BackBufferTex; };
|
||||||
|
|
||||||
|
uniform float Saturation <
|
||||||
|
ui_type = "slider";
|
||||||
|
ui_label = "Saturation";
|
||||||
|
ui_min = 0.0; ui_max = 2.0; ui_step = 0.01;
|
||||||
|
> = 1.0;
|
||||||
|
|
||||||
|
uniform float Brightness <
|
||||||
|
ui_type = "slider";
|
||||||
|
ui_label = "Brightness";
|
||||||
|
ui_min = 0.0; ui_max = 2.0; ui_step = 0.01;
|
||||||
|
> = 1.0;
|
||||||
|
|
||||||
|
uniform float Contrast <
|
||||||
|
ui_type = "slider";
|
||||||
|
ui_label = "Contrast";
|
||||||
|
ui_min = 0.0; ui_max = 2.0; ui_step = 0.01;
|
||||||
|
> = 1.0;
|
||||||
|
|
||||||
|
uniform float Gamma <
|
||||||
|
ui_type = "slider";
|
||||||
|
ui_label = "Gamma";
|
||||||
|
ui_min = 0.5; ui_max = 2.0; ui_step = 0.01;
|
||||||
|
> = 1.0;
|
||||||
|
|
||||||
|
void VS_PostProcess(in uint id : SV_VertexID, out float4 pos : SV_Position, out float2 uv : TEXCOORD)
|
||||||
|
{
|
||||||
|
uv = float2(float(id & 2), float((id & 1) << 1));
|
||||||
|
pos = float4(uv * float2(2.0, -2.0) + float2(-1.0, 1.0), 0.0, 1.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
float4 PS_ColorGrade(float4 pos : SV_Position, float2 uv : TEXCOORD) : SV_Target
|
||||||
|
{
|
||||||
|
float3 rgb = tex2D(BackBuffer, uv).rgb;
|
||||||
|
|
||||||
|
float luma = dot(rgb, float3(0.2126, 0.7152, 0.0722));
|
||||||
|
rgb = lerp(float3(luma, luma, luma), rgb, Saturation);
|
||||||
|
rgb *= Brightness;
|
||||||
|
rgb = (rgb - 0.5) * Contrast + 0.5;
|
||||||
|
rgb = pow(max(rgb, 0.0), 1.0 / max(Gamma, 0.0001));
|
||||||
|
|
||||||
|
return float4(saturate(rgb), 1.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
technique ColorGrade <
|
||||||
|
ui_label = "Colour Grade";
|
||||||
|
ui_tooltip = "Global saturation, brightness, contrast and gamma.";
|
||||||
|
>
|
||||||
|
{
|
||||||
|
pass
|
||||||
|
{
|
||||||
|
VertexShader = VS_PostProcess;
|
||||||
|
PixelShader = PS_ColorGrade;
|
||||||
|
}
|
||||||
|
}
|
||||||
Vendored
+91
@@ -0,0 +1,91 @@
|
|||||||
|
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
|
// SPDX-FileCopyrightText: Copyright 2015 Niklas Haas
|
||||||
|
// SPDX-License-Identifier: MIT
|
||||||
|
|
||||||
|
texture BackBufferTex : COLOR;
|
||||||
|
sampler BackBuffer { Texture = BackBufferTex; };
|
||||||
|
|
||||||
|
uniform float Threshold <
|
||||||
|
ui_type = "slider";
|
||||||
|
ui_label = "Threshold";
|
||||||
|
ui_tooltip = "How flat a neighbourhood must be before it gets smoothed. Raise it to catch wider bands, lower it to keep more detail.";
|
||||||
|
ui_min = 0.002; ui_max = 0.05; ui_step = 0.001;
|
||||||
|
> = 0.012;
|
||||||
|
|
||||||
|
uniform float Radius <
|
||||||
|
ui_type = "slider";
|
||||||
|
ui_label = "Radius";
|
||||||
|
ui_tooltip = "How far the sampling reaches, in pixels. Wider gradients need a larger radius.";
|
||||||
|
ui_min = 1.0; ui_max = 32.0; ui_step = 1.0;
|
||||||
|
> = 8.0;
|
||||||
|
|
||||||
|
uniform float Grain <
|
||||||
|
ui_type = "slider";
|
||||||
|
ui_label = "Dither";
|
||||||
|
ui_tooltip = "Noise added to break up whatever banding survives the smoothing.";
|
||||||
|
ui_min = 0.0; ui_max = 0.02; ui_step = 0.001;
|
||||||
|
> = 0.004;
|
||||||
|
|
||||||
|
void VS_PostProcess(in uint id : SV_VertexID, out float4 pos : SV_Position, out float2 uv : TEXCOORD)
|
||||||
|
{
|
||||||
|
uv = float2(float(id & 2), float((id & 1) << 1));
|
||||||
|
pos = float4(uv * float2(2.0, -2.0) + float2(-1.0, 1.0), 0.0, 1.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
float Hash(float2 p)
|
||||||
|
{
|
||||||
|
float3 scattered = frac(float3(p.x, p.y, p.x) * 0.1031);
|
||||||
|
scattered += dot(scattered, scattered.yzx + 33.33);
|
||||||
|
return frac((scattered.x + scattered.y) * scattered.z);
|
||||||
|
}
|
||||||
|
|
||||||
|
float4 PS_Deband(float4 pos : SV_Position, float2 uv : TEXCOORD) : SV_Target
|
||||||
|
{
|
||||||
|
float2 texel = float2(BUFFER_RCP_WIDTH, BUFFER_RCP_HEIGHT);
|
||||||
|
|
||||||
|
float3 centre = tex2D(BackBuffer, uv).rgb;
|
||||||
|
float base = Hash(pos.xy) * 6.2831853;
|
||||||
|
|
||||||
|
float3 total = float3(0.0, 0.0, 0.0);
|
||||||
|
float3 deviation = float3(0.0, 0.0, 0.0);
|
||||||
|
|
||||||
|
for (int ring = 1; ring <= 2; ++ring)
|
||||||
|
{
|
||||||
|
float angle = base + float(ring) * 2.3999632;
|
||||||
|
float reach = Radius * float(ring) * 0.5;
|
||||||
|
float2 along = float2(cos(angle), sin(angle)) * reach;
|
||||||
|
float2 across = float2(-along.y, along.x);
|
||||||
|
|
||||||
|
float3 s0 = tex2D(BackBuffer, uv + along * texel).rgb;
|
||||||
|
float3 s1 = tex2D(BackBuffer, uv - along * texel).rgb;
|
||||||
|
float3 s2 = tex2D(BackBuffer, uv + across * texel).rgb;
|
||||||
|
float3 s3 = tex2D(BackBuffer, uv - across * texel).rgb;
|
||||||
|
|
||||||
|
total += s0 + s1 + s2 + s3;
|
||||||
|
deviation = max(deviation, max(max(abs(s0 - centre), abs(s1 - centre)),
|
||||||
|
max(abs(s2 - centre), abs(s3 - centre))));
|
||||||
|
}
|
||||||
|
|
||||||
|
float3 average = total * 0.125;
|
||||||
|
float3 flatness = float3(1.0, 1.0, 1.0) -
|
||||||
|
smoothstep(Threshold * 0.5, Threshold, deviation);
|
||||||
|
float3 result = lerp(centre, average, flatness);
|
||||||
|
|
||||||
|
float dither = (Hash(pos.xy + float2(71.3, 41.7)) - 0.5) * Grain;
|
||||||
|
|
||||||
|
return float4(saturate(result + dither), 1.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
technique Deband <
|
||||||
|
ui_label = "Deband";
|
||||||
|
ui_tooltip = "Smooths the visible steps in gradients such as skies, then dithers whatever survives.";
|
||||||
|
>
|
||||||
|
{
|
||||||
|
pass
|
||||||
|
{
|
||||||
|
VertexShader = VS_PostProcess;
|
||||||
|
PixelShader = PS_Deband;
|
||||||
|
}
|
||||||
|
}
|
||||||
Vendored
+83
@@ -0,0 +1,83 @@
|
|||||||
|
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
|
// SPDX-FileCopyrightText: Copyright 2019-2021 bloc97
|
||||||
|
// SPDX-License-Identifier: MIT
|
||||||
|
|
||||||
|
texture BackBufferTex : COLOR;
|
||||||
|
sampler BackBuffer { Texture = BackBufferTex; };
|
||||||
|
|
||||||
|
uniform float Strength <
|
||||||
|
ui_type = "slider";
|
||||||
|
ui_label = "Strength";
|
||||||
|
ui_min = 0.01; ui_max = 0.5; ui_step = 0.01;
|
||||||
|
> = 0.1;
|
||||||
|
|
||||||
|
uniform float Radius <
|
||||||
|
ui_type = "slider";
|
||||||
|
ui_label = "Radius";
|
||||||
|
ui_min = 0.3; ui_max = 2.0; ui_step = 0.05;
|
||||||
|
> = 1.0;
|
||||||
|
|
||||||
|
uniform float Curve <
|
||||||
|
ui_type = "slider";
|
||||||
|
ui_label = "Shadow Bias";
|
||||||
|
ui_min = 0.0; ui_max = 2.0; ui_step = 0.05;
|
||||||
|
> = 1.0;
|
||||||
|
|
||||||
|
void VS_PostProcess(in uint id : SV_VertexID, out float4 pos : SV_Position, out float2 uv : TEXCOORD)
|
||||||
|
{
|
||||||
|
uv = float2(float(id & 2), float((id & 1) << 1));
|
||||||
|
pos = float4(uv * float2(2.0, -2.0) + float2(-1.0, 1.0), 0.0, 1.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
float3 IntensityWeight(float3 value, float3 sigma, float3 centre)
|
||||||
|
{
|
||||||
|
float3 scaled = (value - centre) / sigma;
|
||||||
|
return exp(-0.5 * scaled * scaled);
|
||||||
|
}
|
||||||
|
|
||||||
|
float SpatialWeight(float distance, float sigma)
|
||||||
|
{
|
||||||
|
float scaled = distance / sigma;
|
||||||
|
return exp(-0.5 * scaled * scaled);
|
||||||
|
}
|
||||||
|
|
||||||
|
float4 PS_Denoise(float4 pos : SV_Position, float2 uv : TEXCOORD) : SV_Target
|
||||||
|
{
|
||||||
|
float2 texel = float2(BUFFER_RCP_WIDTH, BUFFER_RCP_HEIGHT);
|
||||||
|
|
||||||
|
float3 centre = tex2D(BackBuffer, uv).rgb;
|
||||||
|
float3 intensity_sigma = max(pow(centre + 0.0001, Curve) * Strength, 0.0001);
|
||||||
|
float spatial_sigma = max(Radius, 0.05);
|
||||||
|
|
||||||
|
float3 sum = float3(0.0, 0.0, 0.0);
|
||||||
|
float3 total = float3(0.0, 0.0, 0.0);
|
||||||
|
|
||||||
|
for (int y = -2; y <= 2; ++y)
|
||||||
|
{
|
||||||
|
for (int x = -2; x <= 2; ++x)
|
||||||
|
{
|
||||||
|
float2 offset = float2(x, y);
|
||||||
|
float3 tap = tex2D(BackBuffer, uv + offset * texel).rgb;
|
||||||
|
float3 weight = IntensityWeight(tap, intensity_sigma, centre) *
|
||||||
|
SpatialWeight(length(offset), spatial_sigma);
|
||||||
|
sum += weight * tap;
|
||||||
|
total += weight;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return float4(sum / total, 1.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
technique Denoise <
|
||||||
|
ui_label = "Denoise";
|
||||||
|
ui_tooltip = "Edge preserving blur that clears dithering and compression noise. Ported from Anime4K.";
|
||||||
|
>
|
||||||
|
{
|
||||||
|
pass
|
||||||
|
{
|
||||||
|
VertexShader = VS_PostProcess;
|
||||||
|
PixelShader = PS_Denoise;
|
||||||
|
}
|
||||||
|
}
|
||||||
Vendored
+65
@@ -0,0 +1,65 @@
|
|||||||
|
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
|
texture BackBufferTex : COLOR;
|
||||||
|
sampler BackBuffer { Texture = BackBufferTex; };
|
||||||
|
|
||||||
|
uniform float Intensity <
|
||||||
|
ui_type = "slider";
|
||||||
|
ui_label = "Intensity";
|
||||||
|
ui_min = 0.0; ui_max = 0.2; ui_step = 0.005;
|
||||||
|
> = 0.03;
|
||||||
|
|
||||||
|
uniform float Size <
|
||||||
|
ui_type = "slider";
|
||||||
|
ui_label = "Size";
|
||||||
|
ui_tooltip = "Grain cell size in pixels.";
|
||||||
|
ui_min = 1.0; ui_max = 4.0; ui_step = 1.0;
|
||||||
|
> = 1.0;
|
||||||
|
|
||||||
|
uniform float Colored <
|
||||||
|
ui_type = "slider";
|
||||||
|
ui_label = "Colour";
|
||||||
|
ui_tooltip = "Zero gives monochrome grain, one gives independent noise per channel.";
|
||||||
|
ui_min = 0.0; ui_max = 1.0; ui_step = 0.01;
|
||||||
|
> = 0.0;
|
||||||
|
|
||||||
|
void VS_PostProcess(in uint id : SV_VertexID, out float4 pos : SV_Position, out float2 uv : TEXCOORD)
|
||||||
|
{
|
||||||
|
uv = float2(float(id & 2), float((id & 1) << 1));
|
||||||
|
pos = float4(uv * float2(2.0, -2.0) + float2(-1.0, 1.0), 0.0, 1.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
float Hash(float2 p)
|
||||||
|
{
|
||||||
|
float3 scattered = frac(float3(p.x, p.y, p.x) * 0.1031);
|
||||||
|
scattered += dot(scattered, scattered.yzx + 33.33);
|
||||||
|
return frac((scattered.x + scattered.y) * scattered.z);
|
||||||
|
}
|
||||||
|
|
||||||
|
float4 PS_FilmGrain(float4 pos : SV_Position, float2 uv : TEXCOORD) : SV_Target
|
||||||
|
{
|
||||||
|
float3 rgb = tex2D(BackBuffer, uv).rgb;
|
||||||
|
|
||||||
|
float2 cell = floor(pos.xy / max(Size, 1.0));
|
||||||
|
float mono = Hash(cell) - 0.5;
|
||||||
|
float3 chroma = float3(Hash(cell + 11.7), Hash(cell + 23.1), Hash(cell + 37.5)) - 0.5;
|
||||||
|
float3 noise = lerp(float3(mono, mono, mono), chroma, Colored);
|
||||||
|
|
||||||
|
float luma = dot(rgb, float3(0.2126, 0.7152, 0.0722));
|
||||||
|
float response = 1.0 - abs(luma * 2.0 - 1.0);
|
||||||
|
|
||||||
|
return float4(saturate(rgb + noise * Intensity * response), 1.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
technique FilmGrain <
|
||||||
|
ui_label = "Film Grain";
|
||||||
|
ui_tooltip = "Adds photographic grain, strongest in the midtones and fading out in blacks and whites.";
|
||||||
|
>
|
||||||
|
{
|
||||||
|
pass
|
||||||
|
{
|
||||||
|
VertexShader = VS_PostProcess;
|
||||||
|
PixelShader = PS_FilmGrain;
|
||||||
|
}
|
||||||
|
}
|
||||||
Vendored
+60
@@ -0,0 +1,60 @@
|
|||||||
|
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
|
texture BackBufferTex : COLOR;
|
||||||
|
sampler BackBuffer { Texture = BackBufferTex; };
|
||||||
|
|
||||||
|
uniform float Exposure <
|
||||||
|
ui_type = "slider";
|
||||||
|
ui_label = "Exposure";
|
||||||
|
ui_min = 0.5; ui_max = 2.0; ui_step = 0.01;
|
||||||
|
> = 1.0;
|
||||||
|
|
||||||
|
uniform float Toe <
|
||||||
|
ui_type = "slider";
|
||||||
|
ui_label = "Toe";
|
||||||
|
ui_tooltip = "Above 1.0 deepens the shadows, below 1.0 lifts them.";
|
||||||
|
ui_min = 0.5; ui_max = 2.0; ui_step = 0.01;
|
||||||
|
> = 1.2;
|
||||||
|
|
||||||
|
uniform float Shoulder <
|
||||||
|
ui_type = "slider";
|
||||||
|
ui_label = "Shoulder";
|
||||||
|
ui_tooltip = "Above 1.0 opens up the highlights, below 1.0 compresses them.";
|
||||||
|
ui_min = 0.5; ui_max = 2.0; ui_step = 0.01;
|
||||||
|
> = 1.2;
|
||||||
|
|
||||||
|
uniform float Amount <
|
||||||
|
ui_type = "slider";
|
||||||
|
ui_label = "Amount";
|
||||||
|
ui_min = 0.0; ui_max = 1.0; ui_step = 0.01;
|
||||||
|
> = 0.7;
|
||||||
|
|
||||||
|
void VS_PostProcess(in uint id : SV_VertexID, out float4 pos : SV_Position, out float2 uv : TEXCOORD)
|
||||||
|
{
|
||||||
|
uv = float2(float(id & 2), float((id & 1) << 1));
|
||||||
|
pos = float4(uv * float2(2.0, -2.0) + float2(-1.0, 1.0), 0.0, 1.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
float4 PS_FilmicCurve(float4 pos : SV_Position, float2 uv : TEXCOORD) : SV_Target
|
||||||
|
{
|
||||||
|
float3 rgb = tex2D(BackBuffer, uv).rgb;
|
||||||
|
|
||||||
|
float3 curved = saturate(rgb * Exposure);
|
||||||
|
curved = pow(max(curved, 0.0), Toe);
|
||||||
|
curved = 1.0 - pow(max(1.0 - curved, 0.0), Shoulder);
|
||||||
|
|
||||||
|
return float4(saturate(lerp(rgb, curved, Amount)), 1.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
technique FilmicCurve <
|
||||||
|
ui_label = "Filmic Curve";
|
||||||
|
ui_tooltip = "Filmic contrast curve. Deepens the shadows and opens the highlights without clipping either end.";
|
||||||
|
>
|
||||||
|
{
|
||||||
|
pass
|
||||||
|
{
|
||||||
|
VertexShader = VS_PostProcess;
|
||||||
|
PixelShader = PS_FilmicCurve;
|
||||||
|
}
|
||||||
|
}
|
||||||
Vendored
+53
@@ -0,0 +1,53 @@
|
|||||||
|
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
|
texture BackBufferTex : COLOR;
|
||||||
|
sampler BackBuffer { Texture = BackBufferTex; };
|
||||||
|
|
||||||
|
uniform float Distortion <
|
||||||
|
ui_type = "slider";
|
||||||
|
ui_label = "Distortion";
|
||||||
|
ui_tooltip = "Positive bulges the picture outwards, negative pinches it inwards.";
|
||||||
|
ui_min = -0.5; ui_max = 0.5; ui_step = 0.01;
|
||||||
|
> = 0.1;
|
||||||
|
|
||||||
|
uniform float Zoom <
|
||||||
|
ui_type = "slider";
|
||||||
|
ui_label = "Zoom";
|
||||||
|
ui_tooltip = "Scales the picture to hide the edges the warp pulls in.";
|
||||||
|
ui_min = 0.5; ui_max = 1.5; ui_step = 0.01;
|
||||||
|
> = 1.0;
|
||||||
|
|
||||||
|
void VS_PostProcess(in uint id : SV_VertexID, out float4 pos : SV_Position, out float2 uv : TEXCOORD)
|
||||||
|
{
|
||||||
|
uv = float2(float(id & 2), float((id & 1) << 1));
|
||||||
|
pos = float4(uv * float2(2.0, -2.0) + float2(-1.0, 1.0), 0.0, 1.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
float4 PS_LensDistortion(float4 pos : SV_Position, float2 uv : TEXCOORD) : SV_Target
|
||||||
|
{
|
||||||
|
float aspect = BUFFER_WIDTH * BUFFER_RCP_HEIGHT;
|
||||||
|
float2 half_size = float2(aspect, 1.0);
|
||||||
|
float2 unit = half_size / length(half_size);
|
||||||
|
|
||||||
|
float2 centred = (uv - 0.5) * 2.0 * unit;
|
||||||
|
float r2 = dot(centred, centred);
|
||||||
|
centred *= 1.0 + Distortion * r2;
|
||||||
|
centred /= max(Zoom, 0.001);
|
||||||
|
|
||||||
|
float2 source = centred / (2.0 * unit) + 0.5;
|
||||||
|
|
||||||
|
return float4(tex2D(BackBuffer, source).rgb, 1.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
technique LensDistortion <
|
||||||
|
ui_label = "Lens Distortion";
|
||||||
|
ui_tooltip = "Barrel or pincushion warp, like looking through a wide angle lens.";
|
||||||
|
>
|
||||||
|
{
|
||||||
|
pass
|
||||||
|
{
|
||||||
|
VertexShader = VS_PostProcess;
|
||||||
|
PixelShader = PS_LensDistortion;
|
||||||
|
}
|
||||||
|
}
|
||||||
Vendored
+66
@@ -0,0 +1,66 @@
|
|||||||
|
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
|
texture BackBufferTex : COLOR;
|
||||||
|
sampler BackBuffer { Texture = BackBufferTex; };
|
||||||
|
|
||||||
|
uniform float InputBlack <
|
||||||
|
ui_type = "slider";
|
||||||
|
ui_label = "Input Black";
|
||||||
|
ui_tooltip = "Input level mapped to black. Raise it to deepen washed out shadows.";
|
||||||
|
ui_min = 0.0; ui_max = 0.5; ui_step = 0.005;
|
||||||
|
> = 0.0;
|
||||||
|
|
||||||
|
uniform float InputWhite <
|
||||||
|
ui_type = "slider";
|
||||||
|
ui_label = "Input White";
|
||||||
|
ui_min = 0.5; ui_max = 1.0; ui_step = 0.005;
|
||||||
|
> = 1.0;
|
||||||
|
|
||||||
|
uniform float Gamma <
|
||||||
|
ui_type = "slider";
|
||||||
|
ui_label = "Gamma";
|
||||||
|
ui_min = 0.2; ui_max = 3.0; ui_step = 0.01;
|
||||||
|
> = 1.0;
|
||||||
|
|
||||||
|
uniform float OutputBlack <
|
||||||
|
ui_type = "slider";
|
||||||
|
ui_label = "Output Black";
|
||||||
|
ui_tooltip = "Lifts crushed shadows so detail stops collapsing into one flat black.";
|
||||||
|
ui_min = 0.0; ui_max = 0.5; ui_step = 0.005;
|
||||||
|
> = 0.0;
|
||||||
|
|
||||||
|
uniform float OutputWhite <
|
||||||
|
ui_type = "slider";
|
||||||
|
ui_label = "Output White";
|
||||||
|
ui_min = 0.5; ui_max = 1.0; ui_step = 0.005;
|
||||||
|
> = 1.0;
|
||||||
|
|
||||||
|
void VS_PostProcess(in uint id : SV_VertexID, out float4 pos : SV_Position, out float2 uv : TEXCOORD)
|
||||||
|
{
|
||||||
|
uv = float2(float(id & 2), float((id & 1) << 1));
|
||||||
|
pos = float4(uv * float2(2.0, -2.0) + float2(-1.0, 1.0), 0.0, 1.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
float4 PS_Levels(float4 pos : SV_Position, float2 uv : TEXCOORD) : SV_Target
|
||||||
|
{
|
||||||
|
float3 rgb = tex2D(BackBuffer, uv).rgb;
|
||||||
|
|
||||||
|
rgb = saturate((rgb - InputBlack) / max(InputWhite - InputBlack, 0.001));
|
||||||
|
rgb = pow(max(rgb, 0.0), 1.0 / max(Gamma, 0.001));
|
||||||
|
rgb = lerp(OutputBlack, OutputWhite, rgb);
|
||||||
|
|
||||||
|
return float4(saturate(rgb), 1.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
technique Levels <
|
||||||
|
ui_label = "Levels";
|
||||||
|
ui_tooltip = "Black point, white point, gamma and output range. Use it to fix crushed or washed out shadows.";
|
||||||
|
>
|
||||||
|
{
|
||||||
|
pass
|
||||||
|
{
|
||||||
|
VertexShader = VS_PostProcess;
|
||||||
|
PixelShader = PS_Levels;
|
||||||
|
}
|
||||||
|
}
|
||||||
Vendored
+88
@@ -0,0 +1,88 @@
|
|||||||
|
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
|
texture BackBufferTex : COLOR;
|
||||||
|
sampler BackBuffer { Texture = BackBufferTex; };
|
||||||
|
|
||||||
|
uniform float Length <
|
||||||
|
ui_type = "slider";
|
||||||
|
ui_label = "Length";
|
||||||
|
ui_tooltip = "How far the streaks reach, as a percentage of screen height.";
|
||||||
|
ui_min = 0.0; ui_max = 20.0; ui_step = 0.5;
|
||||||
|
> = 5.0;
|
||||||
|
|
||||||
|
uniform float Zoom <
|
||||||
|
ui_type = "slider";
|
||||||
|
ui_label = "Zoom";
|
||||||
|
ui_tooltip = "Streaks running out from the centre of the screen, as if rushing forward. The centre stays sharp.";
|
||||||
|
ui_min = 0.0; ui_max = 1.0; ui_step = 0.05;
|
||||||
|
> = 1.0;
|
||||||
|
|
||||||
|
uniform float Pan <
|
||||||
|
ui_type = "slider";
|
||||||
|
ui_label = "Pan";
|
||||||
|
ui_tooltip = "Streaks running in one fixed direction, as if the camera were sweeping across.";
|
||||||
|
ui_min = 0.0; ui_max = 1.0; ui_step = 0.05;
|
||||||
|
> = 0.0;
|
||||||
|
|
||||||
|
uniform float Angle <
|
||||||
|
ui_type = "slider";
|
||||||
|
ui_label = "Pan Angle";
|
||||||
|
ui_tooltip = "Direction of the sweep, in degrees.";
|
||||||
|
ui_min = 0.0; ui_max = 360.0; ui_step = 5.0;
|
||||||
|
> = 0.0;
|
||||||
|
|
||||||
|
uniform float Spin <
|
||||||
|
ui_type = "slider";
|
||||||
|
ui_label = "Spin";
|
||||||
|
ui_tooltip = "Streaks curling around the centre, as if the camera were rolling. Negative turns the other way.";
|
||||||
|
ui_min = -1.0; ui_max = 1.0; ui_step = 0.05;
|
||||||
|
> = 0.0;
|
||||||
|
|
||||||
|
static const int TAPS = 24;
|
||||||
|
|
||||||
|
void VS_PostProcess(in uint id : SV_VertexID, out float4 pos : SV_Position, out float2 uv : TEXCOORD)
|
||||||
|
{
|
||||||
|
uv = float2(float(id & 2), float((id & 1) << 1));
|
||||||
|
pos = float4(uv * float2(2.0, -2.0) + float2(-1.0, 1.0), 0.0, 1.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
float4 PS_MotionBlur(float4 pos : SV_Position, float2 uv : TEXCOORD) : SV_Target
|
||||||
|
{
|
||||||
|
float aspect = BUFFER_WIDTH * BUFFER_RCP_HEIGHT;
|
||||||
|
float2 to_screen = float2(aspect, 1.0);
|
||||||
|
|
||||||
|
float2 centred = (uv - 0.5) * to_screen * 2.0;
|
||||||
|
float2 outward = centred;
|
||||||
|
float2 around = float2(-centred.y, centred.x);
|
||||||
|
|
||||||
|
float radians_angle = Angle * 0.01745329;
|
||||||
|
float2 sweep = float2(cos(radians_angle), sin(radians_angle));
|
||||||
|
|
||||||
|
float2 velocity = sweep * Pan + outward * Zoom + around * Spin;
|
||||||
|
velocity *= Length * 0.01;
|
||||||
|
velocity /= to_screen;
|
||||||
|
|
||||||
|
float jitter = frac(sin(dot(pos.xy, float2(12.9898, 78.233))) * 43758.5453);
|
||||||
|
|
||||||
|
float3 sum = float3(0.0, 0.0, 0.0);
|
||||||
|
for (int i = 0; i < TAPS; ++i)
|
||||||
|
{
|
||||||
|
float t = (float(i) + jitter) / float(TAPS) - 0.5;
|
||||||
|
sum += tex2D(BackBuffer, uv + velocity * t).rgb;
|
||||||
|
}
|
||||||
|
|
||||||
|
return float4(sum / float(TAPS), 1.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
technique MotionBlur <
|
||||||
|
ui_label = "Motion Blur";
|
||||||
|
ui_tooltip = "Camera style motion blur: streaks the picture outwards, sideways or around, without touching still detail at the centre.";
|
||||||
|
>
|
||||||
|
{
|
||||||
|
pass
|
||||||
|
{
|
||||||
|
VertexShader = VS_PostProcess;
|
||||||
|
PixelShader = PS_MotionBlur;
|
||||||
|
}
|
||||||
|
}
|
||||||
Vendored
+60
@@ -0,0 +1,60 @@
|
|||||||
|
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
|
// SPDX-FileCopyrightText: Copyright 2012 PPSSPP Project
|
||||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
// Ported from naturalA.fsh in PPSSPP, by ShadX, modified by SimoneT.
|
||||||
|
|
||||||
|
texture BackBufferTex : COLOR;
|
||||||
|
sampler BackBuffer { Texture = BackBufferTex; };
|
||||||
|
|
||||||
|
uniform float Luma <
|
||||||
|
ui_type = "slider";
|
||||||
|
ui_label = "Luma Curve";
|
||||||
|
ui_tooltip = "Gamma applied to the luminance channel in YIQ space.";
|
||||||
|
ui_min = 0.5; ui_max = 2.0; ui_step = 0.01;
|
||||||
|
> = 1.2;
|
||||||
|
|
||||||
|
uniform float Chroma <
|
||||||
|
ui_type = "slider";
|
||||||
|
ui_label = "Chroma Gain";
|
||||||
|
ui_tooltip = "Boost applied to the two colour difference channels.";
|
||||||
|
ui_min = 0.0; ui_max = 2.0; ui_step = 0.01;
|
||||||
|
> = 1.2;
|
||||||
|
|
||||||
|
void VS_PostProcess(in uint id : SV_VertexID, out float4 pos : SV_Position, out float2 uv : TEXCOORD)
|
||||||
|
{
|
||||||
|
uv = float2(float(id & 2), float((id & 1) << 1));
|
||||||
|
pos = float4(uv * float2(2.0, -2.0) + float2(-1.0, 1.0), 0.0, 1.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
float4 PS_Natural(float4 pos : SV_Position, float2 uv : TEXCOORD) : SV_Target
|
||||||
|
{
|
||||||
|
const float3x3 RGBtoYIQ = float3x3(0.299, 0.587, 0.114,
|
||||||
|
0.596, -0.275, -0.321,
|
||||||
|
0.212, -0.523, 0.311);
|
||||||
|
|
||||||
|
const float3x3 YIQtoRGB = float3x3(1.0, 0.95568806, 0.61985809,
|
||||||
|
1.0, -0.27158180, -0.64687382,
|
||||||
|
1.0, -1.10817733, 1.70506456);
|
||||||
|
|
||||||
|
float3 rgb = tex2D(BackBuffer, uv).rgb;
|
||||||
|
float3 yiq = mul(RGBtoYIQ, rgb);
|
||||||
|
|
||||||
|
yiq.x = pow(max(yiq.x, 0.0), Luma);
|
||||||
|
yiq.yz *= Chroma;
|
||||||
|
|
||||||
|
return float4(saturate(mul(YIQtoRGB, yiq)), 1.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
technique NaturalColors <
|
||||||
|
ui_label = "Natural Colours";
|
||||||
|
ui_tooltip = "Warmer and more saturated look. Ported from the PPSSPP shader.";
|
||||||
|
>
|
||||||
|
{
|
||||||
|
pass
|
||||||
|
{
|
||||||
|
VertexShader = VS_PostProcess;
|
||||||
|
PixelShader = PS_Natural;
|
||||||
|
}
|
||||||
|
}
|
||||||
Vendored
+90
@@ -0,0 +1,90 @@
|
|||||||
|
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
|
texture BackBufferTex : COLOR;
|
||||||
|
sampler BackBuffer { Texture = BackBufferTex; };
|
||||||
|
|
||||||
|
uniform float Timer < source = "timer"; > = 0.0;
|
||||||
|
|
||||||
|
uniform float Horizon <
|
||||||
|
ui_type = "slider";
|
||||||
|
ui_label = "Reflection Line";
|
||||||
|
ui_tooltip = "Height on screen where the reflective floor begins. Everything above it is left untouched.";
|
||||||
|
ui_min = 0.0; ui_max = 1.0; ui_step = 0.01;
|
||||||
|
> = 0.55;
|
||||||
|
|
||||||
|
uniform float Amount <
|
||||||
|
ui_type = "slider";
|
||||||
|
ui_label = "Amount";
|
||||||
|
ui_tooltip = "How strongly the reflection shows through the floor.";
|
||||||
|
ui_min = 0.0; ui_max = 1.0; ui_step = 0.05;
|
||||||
|
> = 0.35;
|
||||||
|
|
||||||
|
uniform float Falloff <
|
||||||
|
ui_type = "slider";
|
||||||
|
ui_label = "Falloff";
|
||||||
|
ui_tooltip = "How quickly the reflection fades as the floor comes towards the viewer. At zero it stays even.";
|
||||||
|
ui_min = 0.0; ui_max = 4.0; ui_step = 0.1;
|
||||||
|
> = 1.2;
|
||||||
|
|
||||||
|
uniform float Perspective <
|
||||||
|
ui_type = "slider";
|
||||||
|
ui_label = "Perspective";
|
||||||
|
ui_tooltip = "Stretches or squashes the mirrored image. One is a true mirror, higher values pull it towards the line.";
|
||||||
|
ui_min = 0.2; ui_max = 2.0; ui_step = 0.05;
|
||||||
|
> = 1.0;
|
||||||
|
|
||||||
|
uniform float Ripple <
|
||||||
|
ui_type = "slider";
|
||||||
|
ui_label = "Ripple";
|
||||||
|
ui_tooltip = "Amplitude of the waves disturbing the reflection. At zero the mirror is perfectly still.";
|
||||||
|
ui_min = 0.0; ui_max = 1.0; ui_step = 0.05;
|
||||||
|
> = 0.0;
|
||||||
|
|
||||||
|
uniform float RippleSpeed <
|
||||||
|
ui_type = "slider";
|
||||||
|
ui_label = "Ripple Speed";
|
||||||
|
ui_tooltip = "How fast the waves travel.";
|
||||||
|
ui_min = 0.0; ui_max = 4.0; ui_step = 0.1;
|
||||||
|
> = 1.0;
|
||||||
|
|
||||||
|
void VS_PostProcess(in uint id : SV_VertexID, out float4 pos : SV_Position, out float2 uv : TEXCOORD)
|
||||||
|
{
|
||||||
|
uv = float2(float(id & 2), float((id & 1) << 1));
|
||||||
|
pos = float4(uv * float2(2.0, -2.0) + float2(-1.0, 1.0), 0.0, 1.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
float4 PS_Reflections(float4 pos : SV_Position, float2 uv : TEXCOORD) : SV_Target
|
||||||
|
{
|
||||||
|
float3 color = tex2D(BackBuffer, uv).rgb;
|
||||||
|
|
||||||
|
float depth = uv.y - Horizon;
|
||||||
|
float on_floor = step(0.0, depth);
|
||||||
|
float span = max(1.0 - Horizon, 0.001);
|
||||||
|
float distance_down = saturate(depth / span);
|
||||||
|
|
||||||
|
float seconds = Timer * 0.001;
|
||||||
|
float wave = sin(uv.x * 38.0 + seconds * RippleSpeed * 2.0) *
|
||||||
|
sin(uv.y * 21.0 - seconds * RippleSpeed * 1.3);
|
||||||
|
float2 disturbance = float2(wave * 0.004, wave * 0.002) * Ripple * distance_down;
|
||||||
|
|
||||||
|
float2 mirrored = float2(uv.x, Horizon - depth * Perspective) + disturbance;
|
||||||
|
float3 reflection = tex2D(BackBuffer, saturate(mirrored)).rgb;
|
||||||
|
|
||||||
|
float fade = pow(max(1.0 - distance_down, 0.0001), Falloff);
|
||||||
|
float strength = Amount * fade * on_floor;
|
||||||
|
|
||||||
|
return float4(lerp(color, reflection, strength), 1.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
technique Reflections <
|
||||||
|
ui_label = "Reflections";
|
||||||
|
ui_tooltip = "Mirrors the picture into a reflective floor below a line you choose, with optional water ripples.";
|
||||||
|
>
|
||||||
|
{
|
||||||
|
pass
|
||||||
|
{
|
||||||
|
VertexShader = VS_PostProcess;
|
||||||
|
PixelShader = PS_Reflections;
|
||||||
|
}
|
||||||
|
}
|
||||||
Vendored
+66
@@ -0,0 +1,66 @@
|
|||||||
|
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
|
// SPDX-FileCopyrightText: Copyright 2012 PPSSPP Project
|
||||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
// Ported from scanlines.fsh in PPSSPP.
|
||||||
|
|
||||||
|
|
||||||
|
texture BackBufferTex : COLOR;
|
||||||
|
sampler BackBuffer { Texture = BackBufferTex; };
|
||||||
|
|
||||||
|
uniform float Density <
|
||||||
|
ui_type = "slider";
|
||||||
|
ui_label = "Line Density";
|
||||||
|
ui_tooltip = "Number of scanline pairs across the screen.";
|
||||||
|
ui_min = 60.0; ui_max = 720.0; ui_step = 10.0;
|
||||||
|
> = 340.0;
|
||||||
|
|
||||||
|
uniform float Intensity <
|
||||||
|
ui_type = "slider";
|
||||||
|
ui_label = "Intensity";
|
||||||
|
ui_tooltip = "How dark the gaps between lines become.";
|
||||||
|
ui_min = 0.0; ui_max = 1.0; ui_step = 0.05;
|
||||||
|
> = 0.5;
|
||||||
|
|
||||||
|
uniform float Tint <
|
||||||
|
ui_type = "slider";
|
||||||
|
ui_label = "Phosphor Tint";
|
||||||
|
ui_tooltip = "Strength of the green-warm phosphor cast.";
|
||||||
|
ui_min = 0.0; ui_max = 1.0; ui_step = 0.05;
|
||||||
|
> = 1.0;
|
||||||
|
|
||||||
|
void VS_PostProcess(in uint id : SV_VertexID, out float4 pos : SV_Position, out float2 uv : TEXCOORD)
|
||||||
|
{
|
||||||
|
uv = float2(float(id & 2), float((id & 1) << 1));
|
||||||
|
pos = float4(uv * float2(2.0, -2.0) + float2(-1.0, 1.0), 0.0, 1.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
float4 PS_Scanlines(float4 pos : SV_Position, float2 uv : TEXCOORD) : SV_Target
|
||||||
|
{
|
||||||
|
float line_pos = uv.y * Density * 0.5;
|
||||||
|
float gate = cos((frac(line_pos) - 0.5) * 3.1415926 * Intensity) * 1.5;
|
||||||
|
|
||||||
|
float3 rgb = tex2D(BackBuffer, uv).rgb;
|
||||||
|
float3 color = rgb * 0.5 + 0.5 * rgb * rgb * 1.2;
|
||||||
|
|
||||||
|
float3 phosphor = lerp(float3(1.0, 1.0, 1.0), float3(0.9, 1.0, 0.7), Tint);
|
||||||
|
color *= phosphor;
|
||||||
|
|
||||||
|
float2 diff = uv - 0.5;
|
||||||
|
color *= 1.1 - 0.6 * (dot(diff, diff) * 2.0);
|
||||||
|
|
||||||
|
return float4(saturate(color * saturate(gate)), 1.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
technique Scanlines <
|
||||||
|
ui_label = "Scanlines";
|
||||||
|
ui_tooltip = "Horizontal scanlines of a CRT display.";
|
||||||
|
>
|
||||||
|
{
|
||||||
|
pass
|
||||||
|
{
|
||||||
|
VertexShader = VS_PostProcess;
|
||||||
|
PixelShader = PS_Scanlines;
|
||||||
|
}
|
||||||
|
}
|
||||||
Vendored
+43
@@ -0,0 +1,43 @@
|
|||||||
|
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
|
texture BackBufferTex : COLOR;
|
||||||
|
sampler BackBuffer { Texture = BackBufferTex; };
|
||||||
|
|
||||||
|
uniform float Amount <
|
||||||
|
ui_type = "slider";
|
||||||
|
ui_label = "Amount";
|
||||||
|
ui_min = 0.0; ui_max = 3.0; ui_step = 0.01;
|
||||||
|
> = 0.6;
|
||||||
|
|
||||||
|
void VS_PostProcess(in uint id : SV_VertexID, out float4 pos : SV_Position, out float2 uv : TEXCOORD)
|
||||||
|
{
|
||||||
|
uv = float2(float(id & 2), float((id & 1) << 1));
|
||||||
|
pos = float4(uv * float2(2.0, -2.0) + float2(-1.0, 1.0), 0.0, 1.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
float4 PS_Sharpen(float4 pos : SV_Position, float2 uv : TEXCOORD) : SV_Target
|
||||||
|
{
|
||||||
|
float2 texel = float2(BUFFER_RCP_WIDTH, BUFFER_RCP_HEIGHT);
|
||||||
|
|
||||||
|
float3 centre = tex2D(BackBuffer, uv).rgb;
|
||||||
|
float3 blur = tex2D(BackBuffer, uv + float2(-texel.x, 0.0)).rgb;
|
||||||
|
blur += tex2D(BackBuffer, uv + float2(texel.x, 0.0)).rgb;
|
||||||
|
blur += tex2D(BackBuffer, uv + float2(0.0, -texel.y)).rgb;
|
||||||
|
blur += tex2D(BackBuffer, uv + float2(0.0, texel.y)).rgb;
|
||||||
|
blur *= 0.25;
|
||||||
|
|
||||||
|
return float4(centre + (centre - blur) * Amount, 1.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
technique Sharpen <
|
||||||
|
ui_label = "Sharpen";
|
||||||
|
ui_tooltip = "Unsharp mask that brings back edge detail lost to scaling.";
|
||||||
|
>
|
||||||
|
{
|
||||||
|
pass
|
||||||
|
{
|
||||||
|
VertexShader = VS_PostProcess;
|
||||||
|
PixelShader = PS_Sharpen;
|
||||||
|
}
|
||||||
|
}
|
||||||
Vendored
+75
@@ -0,0 +1,75 @@
|
|||||||
|
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
|
texture BackBufferTex : COLOR;
|
||||||
|
sampler BackBuffer { Texture = BackBufferTex; };
|
||||||
|
|
||||||
|
uniform float ShadowHue <
|
||||||
|
ui_type = "slider";
|
||||||
|
ui_label = "Shadow Hue";
|
||||||
|
ui_min = 0.0; ui_max = 360.0; ui_step = 1.0;
|
||||||
|
> = 210.0;
|
||||||
|
|
||||||
|
uniform float ShadowStrength <
|
||||||
|
ui_type = "slider";
|
||||||
|
ui_label = "Shadow Strength";
|
||||||
|
ui_min = 0.0; ui_max = 1.0; ui_step = 0.01;
|
||||||
|
> = 0.0;
|
||||||
|
|
||||||
|
uniform float HighlightHue <
|
||||||
|
ui_type = "slider";
|
||||||
|
ui_label = "Highlight Hue";
|
||||||
|
ui_min = 0.0; ui_max = 360.0; ui_step = 1.0;
|
||||||
|
> = 45.0;
|
||||||
|
|
||||||
|
uniform float HighlightStrength <
|
||||||
|
ui_type = "slider";
|
||||||
|
ui_label = "Highlight Strength";
|
||||||
|
ui_min = 0.0; ui_max = 1.0; ui_step = 0.01;
|
||||||
|
> = 0.0;
|
||||||
|
|
||||||
|
uniform float Balance <
|
||||||
|
ui_type = "slider";
|
||||||
|
ui_label = "Balance";
|
||||||
|
ui_tooltip = "Moves the split between what counts as shadow and what counts as highlight.";
|
||||||
|
ui_min = -0.5; ui_max = 0.5; ui_step = 0.01;
|
||||||
|
> = 0.0;
|
||||||
|
|
||||||
|
void VS_PostProcess(in uint id : SV_VertexID, out float4 pos : SV_Position, out float2 uv : TEXCOORD)
|
||||||
|
{
|
||||||
|
uv = float2(float(id & 2), float((id & 1) << 1));
|
||||||
|
pos = float4(uv * float2(2.0, -2.0) + float2(-1.0, 1.0), 0.0, 1.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
float3 HueToRGB(float hue)
|
||||||
|
{
|
||||||
|
float h = frac(hue / 360.0) * 6.0;
|
||||||
|
return saturate(float3(abs(h - 3.0) - 1.0, 2.0 - abs(h - 2.0), 2.0 - abs(h - 4.0)));
|
||||||
|
}
|
||||||
|
|
||||||
|
float4 PS_SplitToning(float4 pos : SV_Position, float2 uv : TEXCOORD) : SV_Target
|
||||||
|
{
|
||||||
|
float3 rgb = tex2D(BackBuffer, uv).rgb;
|
||||||
|
|
||||||
|
float luma = saturate(dot(rgb, float3(0.2126, 0.7152, 0.0722)) + Balance);
|
||||||
|
|
||||||
|
float3 shadow_tint = HueToRGB(ShadowHue) - 0.5;
|
||||||
|
float3 highlight_tint = HueToRGB(HighlightHue) - 0.5;
|
||||||
|
|
||||||
|
rgb += shadow_tint * ShadowStrength * 0.25 * (1.0 - luma);
|
||||||
|
rgb += highlight_tint * HighlightStrength * 0.25 * luma;
|
||||||
|
|
||||||
|
return float4(saturate(rgb), 1.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
technique SplitToning <
|
||||||
|
ui_label = "Split Toning";
|
||||||
|
ui_tooltip = "Tints the shadows and the highlights towards two different hues.";
|
||||||
|
>
|
||||||
|
{
|
||||||
|
pass
|
||||||
|
{
|
||||||
|
VertexShader = VS_PostProcess;
|
||||||
|
PixelShader = PS_SplitToning;
|
||||||
|
}
|
||||||
|
}
|
||||||
Vendored
+52
@@ -0,0 +1,52 @@
|
|||||||
|
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
|
// SPDX-FileCopyrightText: Copyright 2012 PPSSPP Project
|
||||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
// Ported from vignette.fsh in PPSSPP, by Henrik Rydgard.
|
||||||
|
|
||||||
|
texture BackBufferTex : COLOR;
|
||||||
|
sampler BackBuffer { Texture = BackBufferTex; };
|
||||||
|
|
||||||
|
uniform float Strength <
|
||||||
|
ui_type = "slider";
|
||||||
|
ui_label = "Strength";
|
||||||
|
ui_tooltip = "How dark the corners become.";
|
||||||
|
ui_min = 0.0; ui_max = 2.0; ui_step = 0.01;
|
||||||
|
> = 0.6;
|
||||||
|
|
||||||
|
uniform float Aspect <
|
||||||
|
ui_type = "slider";
|
||||||
|
ui_label = "Aspect";
|
||||||
|
ui_min = 0.5; ui_max = 2.0; ui_step = 0.01;
|
||||||
|
> = 1.0;
|
||||||
|
|
||||||
|
void VS_PostProcess(in uint id : SV_VertexID, out float4 pos : SV_Position, out float2 uv : TEXCOORD)
|
||||||
|
{
|
||||||
|
uv = float2(float(id & 2), float((id & 1) << 1));
|
||||||
|
pos = float4(uv * float2(2.0, -2.0) + float2(-1.0, 1.0), 0.0, 1.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
float4 PS_Vignette(float4 pos : SV_Position, float2 uv : TEXCOORD) : SV_Target
|
||||||
|
{
|
||||||
|
float2 diff = uv - 0.5;
|
||||||
|
diff.x *= Aspect;
|
||||||
|
diff.y /= max(Aspect, 0.0001);
|
||||||
|
|
||||||
|
float falloff = 1.0 - min(1.0, Strength * dot(diff, diff) * 2.0);
|
||||||
|
float3 rgb = tex2D(BackBuffer, uv).rgb;
|
||||||
|
|
||||||
|
return float4(rgb * falloff, 1.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
technique Vignette <
|
||||||
|
ui_label = "Vignette";
|
||||||
|
ui_tooltip = "Darkens the corners of the screen.";
|
||||||
|
>
|
||||||
|
{
|
||||||
|
pass
|
||||||
|
{
|
||||||
|
VertexShader = VS_PostProcess;
|
||||||
|
PixelShader = PS_Vignette;
|
||||||
|
}
|
||||||
|
}
|
||||||
Vendored
+76
@@ -0,0 +1,76 @@
|
|||||||
|
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
|
texture BackBufferTex : COLOR;
|
||||||
|
sampler BackBuffer { Texture = BackBufferTex; };
|
||||||
|
|
||||||
|
uniform float Temperature <
|
||||||
|
ui_type = "slider";
|
||||||
|
ui_label = "Temperature";
|
||||||
|
ui_tooltip = "Negative cools the picture towards blue, positive warms it towards orange.";
|
||||||
|
ui_min = -100.0; ui_max = 100.0; ui_step = 1.0;
|
||||||
|
> = 0.0;
|
||||||
|
|
||||||
|
uniform float Tint <
|
||||||
|
ui_type = "slider";
|
||||||
|
ui_label = "Tint";
|
||||||
|
ui_tooltip = "Negative shifts towards green, positive towards magenta.";
|
||||||
|
ui_min = -100.0; ui_max = 100.0; ui_step = 1.0;
|
||||||
|
> = 0.0;
|
||||||
|
|
||||||
|
void VS_PostProcess(in uint id : SV_VertexID, out float4 pos : SV_Position, out float2 uv : TEXCOORD)
|
||||||
|
{
|
||||||
|
uv = float2(float(id & 2), float((id & 1) << 1));
|
||||||
|
pos = float4(uv * float2(2.0, -2.0) + float2(-1.0, 1.0), 0.0, 1.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
float3 WhitePointLMS(float t1, float t2)
|
||||||
|
{
|
||||||
|
float shift = 0.05;
|
||||||
|
if (t1 < 0.0)
|
||||||
|
{
|
||||||
|
shift = 0.10;
|
||||||
|
}
|
||||||
|
float x = 0.31271 - t1 * shift;
|
||||||
|
float y = 2.87 * x - 3.0 * x * x - 0.27509507 + t2 * 0.05;
|
||||||
|
|
||||||
|
float big_y = 1.0;
|
||||||
|
float big_x = big_y * x / y;
|
||||||
|
float big_z = big_y * (1.0 - x - y) / y;
|
||||||
|
|
||||||
|
return float3( 0.7328 * big_x + 0.4296 * big_y - 0.1624 * big_z,
|
||||||
|
-0.7036 * big_x + 1.6975 * big_y + 0.0061 * big_z,
|
||||||
|
0.0030 * big_x + 0.0136 * big_y + 0.9834 * big_z);
|
||||||
|
}
|
||||||
|
|
||||||
|
float4 PS_WhiteBalance(float4 pos : SV_Position, float2 uv : TEXCOORD) : SV_Target
|
||||||
|
{
|
||||||
|
float3 rgb = pow(max(tex2D(BackBuffer, uv).rgb, 0.0), 2.2);
|
||||||
|
|
||||||
|
float3 balance = float3(0.949237, 1.03542, 1.08728) /
|
||||||
|
WhitePointLMS(Temperature / 65.0, Tint / 65.0);
|
||||||
|
|
||||||
|
const float3x3 rgb_to_lms = float3x3(0.390405, 0.549941, 0.008926,
|
||||||
|
0.070841, 0.963172, 0.001358,
|
||||||
|
0.023108, 0.128021, 0.936245);
|
||||||
|
const float3x3 lms_to_rgb = float3x3( 2.858470, -1.628790, -0.024891,
|
||||||
|
-0.210182, 1.158200, 0.000324,
|
||||||
|
-0.041812, -0.118169, 1.068670);
|
||||||
|
|
||||||
|
float3 lms = mul(rgb_to_lms, rgb) * balance;
|
||||||
|
rgb = mul(lms_to_rgb, lms);
|
||||||
|
|
||||||
|
return float4(saturate(pow(max(rgb, 0.0), 1.0 / 2.2)), 1.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
technique WhiteBalance <
|
||||||
|
ui_label = "White Balance";
|
||||||
|
ui_tooltip = "Corrects a picture that looks too cool, too warm or tinted.";
|
||||||
|
>
|
||||||
|
{
|
||||||
|
pass
|
||||||
|
{
|
||||||
|
VertexShader = VS_PostProcess;
|
||||||
|
PixelShader = PS_WhiteBalance;
|
||||||
|
}
|
||||||
|
}
|
||||||
Vendored
+2
@@ -509,6 +509,8 @@ QWidget#contentRichDialog QLabel#label_title_rich {
|
|||||||
}
|
}
|
||||||
|
|
||||||
QWidget#contentDialog QLabel#label_dialog {
|
QWidget#contentDialog QLabel#label_dialog {
|
||||||
|
background: #2E2E2E;
|
||||||
|
|
||||||
padding: 20px 65px;
|
padding: 20px 65px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+14
-5
@@ -5,6 +5,15 @@
|
|||||||
|
|
||||||
This is a full-fledged guide to build Eden on all supported platforms.
|
This is a full-fledged guide to build Eden on all supported platforms.
|
||||||
|
|
||||||
|
If you already have a development environment set up:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cmake -S . -B build -DCMAKE_BUILD_TYPE=Release -G Ninja
|
||||||
|
cmake --build build
|
||||||
|
```
|
||||||
|
|
||||||
|
On Linux, macOS, and MinGW/MSYS2, make sure to read the [dependencies guide](Deps.md). On Android, read its [dedicated page](build/Android.md).
|
||||||
|
|
||||||
## Dependencies
|
## Dependencies
|
||||||
|
|
||||||
First, you must [install some dependencies](Deps.md).
|
First, you must [install some dependencies](Deps.md).
|
||||||
@@ -125,13 +134,13 @@ cmake -S . -B build -G "<GENERATOR>" -DCMAKE_C_COMPILER=clang-cl -DCMAKE_CXX_COM
|
|||||||
|
|
||||||
<img src="https://user-images.githubusercontent.com/42481638/216899164-6cee8482-3d59-428f-b1bc-e6dc793c9b20.png" width="500">
|
<img src="https://user-images.githubusercontent.com/42481638/216899164-6cee8482-3d59-428f-b1bc-e6dc793c9b20.png" width="500">
|
||||||
|
|
||||||
- Click OK; now Clion will build a directory and index your code to allow for IntelliSense. Please be patient.
|
- Click OK; now CLion will build a directory and index your code to allow for IntelliSense. Please be patient.
|
||||||
- Once this process has been completed (No loading bar bottom right), you can now build eden
|
- Once this process has been completed (No loading bar bottom right), you can now build Eden
|
||||||
- In the top right, click on the drop-down menu, select all configurations, then select eden
|
- In the top right, click on the drop-down menu, select all configurations, then select Eden
|
||||||
|
|
||||||
<img src="https://user-images.githubusercontent.com/42481638/216899226-975048e9-bc6d-4ec1-bc2d-bd8a1e15ed04.png" height="500" >
|
<img src="https://user-images.githubusercontent.com/42481638/216899226-975048e9-bc6d-4ec1-bc2d-bd8a1e15ed04.png" height="500" >
|
||||||
|
|
||||||
- Now run by clicking the play button or pressing Shift+F10, and eden will auto-launch once built.
|
- Now run by clicking the play button or pressing Shift+F10, and Eden will auto-launch once built.
|
||||||
|
|
||||||
<img src="https://user-images.githubusercontent.com/42481638/216899275-d514ec6a-e563-470e-81e2-3e04f0429b68.png" width="500">
|
<img src="https://user-images.githubusercontent.com/42481638/216899275-d514ec6a-e563-470e-81e2-3e04f0429b68.png" width="500">
|
||||||
</details>
|
</details>
|
||||||
@@ -153,7 +162,7 @@ If your initial configure failed:
|
|||||||
- *Carefully* re-read the [dependencies guide](Deps.md)
|
- *Carefully* re-read the [dependencies guide](Deps.md)
|
||||||
- Clear the CPM cache (`.cache/cpm`) and CMake cache (`<build directory>/CMakeCache.txt`)
|
- Clear the CPM cache (`.cache/cpm`) and CMake cache (`<build directory>/CMakeCache.txt`)
|
||||||
- Evaluate the error and find any related settings
|
- Evaluate the error and find any related settings
|
||||||
- See the [CPM docs](CPM.md) to see if you may need to forcefully bundle any packages
|
- See the [CPM docs](CPMUtil.md) to see if you may need to forcefully bundle any packages
|
||||||
|
|
||||||
Otherwise, feel free to ask for help in Stoat or Discord.
|
Otherwise, feel free to ask for help in Stoat or Discord.
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -1,5 +1,5 @@
|
|||||||
# ui stuff
|
# ui stuff
|
||||||
/src/android @AleksandrPopovich @kleidis @Producdevity
|
/src/android @AleksandrPopovich @Producdevity
|
||||||
/src/yuzu @crueter
|
/src/yuzu @crueter
|
||||||
/src/eden @crueter
|
/src/eden @crueter
|
||||||
/src/frontend_common @crueter
|
/src/frontend_common @crueter
|
||||||
|
|||||||
+372
@@ -0,0 +1,372 @@
|
|||||||
|
# CPMUtil
|
||||||
|
|
||||||
|
CPMUtil is a wrapper around CPM that aims to reduce boilerplate and add useful utility functions to make dependency management a piece of cake.
|
||||||
|
|
||||||
|
- [CPMUtil](#cpmutil)
|
||||||
|
- [Global Options](#global-options)
|
||||||
|
- [About](#about)
|
||||||
|
- [Common Properties](#common-properties)
|
||||||
|
- [Standard Packages](#standard-packages)
|
||||||
|
- [Versioning](#versioning)
|
||||||
|
- [Artifact Naming Errata](#artifact-naming-errata)
|
||||||
|
- [Patches](#patches)
|
||||||
|
- [Pre-built CI Packages](#pre-built-ci-packages)
|
||||||
|
- [Usage](#usage)
|
||||||
|
- [Addendum: Cache Storage](#addendum-cache-storage)
|
||||||
|
- [Addendum: Making Patches](#addendum-making-patches)
|
||||||
|
- [Addendum: Package Identification Lists](#addendum-package-identification-lists)
|
||||||
|
- [Addendum: Notes for Packagers](#addendum-notes-for-packagers)
|
||||||
|
- [Network Sandbox](#network-sandbox)
|
||||||
|
- [Unsandboxed](#unsandboxed)
|
||||||
|
- [Addendum: Dependent Packages](#addendum-dependent-packages)
|
||||||
|
- [Example: Vulkan](#example-vulkan)
|
||||||
|
- [Addendum: Module Path Packages](#addendum-module-path-packages)
|
||||||
|
- [Example: OpenSSL](#example-openssl)
|
||||||
|
- [Addendum: Adding Qt](#addendum-adding-qt)
|
||||||
|
- [Addendum: Package-Specific Overrides](#addendum-package-specific-overrides)
|
||||||
|
- [Addendum: Supply-Chain Security](#addendum-supply-chain-security)
|
||||||
|
- [Checksumming](#checksumming)
|
||||||
|
- [Caching](#caching)
|
||||||
|
- [Immutable Commit Hashes](#immutable-commit-hashes)
|
||||||
|
|
||||||
|
## Global Options
|
||||||
|
|
||||||
|
- `CPMUTIL_FORCE_SYSTEM` (default `OFF`): Require all CPM dependencies to use system packages.
|
||||||
|
- You may optionally override this for each package: [Package-Specific Overrides](#addendum-package-specific-overrides)
|
||||||
|
- `CPMUTIL_FORCE_BUNDLED` (default `ON` on MSVC and Android, `OFF` elsewhere): Require all CPM dependencies to use bundled packages.
|
||||||
|
- You may optionally override this for each package: [Package-Specific Overrides](#addendum-package-specific-overrides)
|
||||||
|
- `CPMUTIL_PATCH_DIR` (default `${PROJECT_SOURCE_DIR}/.patch`): Path to patches used in packages. Stored as `<PATCH DIR>/json-package-name/0001-patch-name.patch`, etc.
|
||||||
|
- `CPM_SOURCE_CACHE` (default `${PROJECT_SOURCE_DIR}/.cache/cpm`): Where downloaded dependencies get stored.
|
||||||
|
|
||||||
|
## About
|
||||||
|
|
||||||
|
CPMUtil works by defining dependencies in a JSON file, `cpmfile.json`, and calling `AddJsonPackage`. These dependencies generally must define, at minimum:
|
||||||
|
|
||||||
|
- The repository and Git host
|
||||||
|
- A release artifact, commit, or tag archive to download
|
||||||
|
- A SHA512 sum for the downloaded artifact
|
||||||
|
|
||||||
|
And may optionally define other properties like:
|
||||||
|
|
||||||
|
- The minimum version for system packages
|
||||||
|
- The package name used for system packages (this defaults to the json key if undefined)
|
||||||
|
- In-tree source patches
|
||||||
|
- Options passed to CMake
|
||||||
|
- Options passed to find_package
|
||||||
|
|
||||||
|
For instance:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"fmt": {
|
||||||
|
"repo": "fmtlib/fmt",
|
||||||
|
"version": "12.1.0",
|
||||||
|
"hash": "f0da8...23f2",
|
||||||
|
"min_version": "8",
|
||||||
|
"options": [
|
||||||
|
"FMT_TEST ON"
|
||||||
|
],
|
||||||
|
"patches": [
|
||||||
|
"0001-disable-reference-copy.patch"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Calling `AddJsonPackage(fmt)`:
|
||||||
|
|
||||||
|
- Searches for a system package named `fmt` of version 8 or higher (`find_package(fmt 8)`)
|
||||||
|
- If found, uses the system package and caches it for future use
|
||||||
|
- If not found:
|
||||||
|
- Downloads fmt 12.1.0 from the GitHub Archive into `.cache/cpm/fmt/12.1.0`
|
||||||
|
- Verifies the hash
|
||||||
|
- Applies the `0001-disable-reference-copy.patch` patch to the source tree
|
||||||
|
- Sets `FMT_TEST` to `ON`
|
||||||
|
- Adds the downloaded directory to CMake
|
||||||
|
- Now, future `find_package(fmt)` calls will use the downloaded package
|
||||||
|
|
||||||
|
There are two types of packages CPMUtil can define: standard and prebuilt CI packages. Some properties are common to both types, however.
|
||||||
|
|
||||||
|
## Common Properties
|
||||||
|
|
||||||
|
These JSON properties are used by standard and CI packages alike.
|
||||||
|
|
||||||
|
- `package`: The package name used by `find_package` to check for the existence of a system package.
|
||||||
|
- If unset, defaults to the JSON key
|
||||||
|
- `repo`: The Git repository the package is stored in, if applicable.
|
||||||
|
- `version`: The version of the package. This is required.
|
||||||
|
- Generally, this should be a 10-wide Git commit hash or Git tag.
|
||||||
|
- Tags must be fully qualified and include prefixes and suffixes, e.g. `boost-1.88.0`
|
||||||
|
- `git_host`: The Git host the package is stored in, if applicable. Defaults to `github.com`.
|
||||||
|
|
||||||
|
## Standard Packages
|
||||||
|
|
||||||
|
Normal packages, like the prior `fmt` example, *must* also define:
|
||||||
|
|
||||||
|
- `hash`: The SHA512 hash of the downloaded artifact. CPMUtil generally computes this for you--if not, use `tools/cpmutil.sh package hash <JSON key>`
|
||||||
|
- `min_version`: The minimum required version of the package, if a system package is desired.
|
||||||
|
|
||||||
|
And may optionally define:
|
||||||
|
|
||||||
|
- `url`: Download from a raw URL.
|
||||||
|
- `artifact`: A GitHub/Forgejo/Gitea release artifact. Requires `repo` to be set and valid.
|
||||||
|
- `numeric_version`: Replaces `%NUMERIC_VERSION%` in artifact and version definitions; see [Artifact Naming Errata](#artifact-naming-errata).
|
||||||
|
|
||||||
|
See [Versioning](#versioning) for version/artifact information.
|
||||||
|
|
||||||
|
The following are optional to define:
|
||||||
|
|
||||||
|
- `source_subdir`: A subdirectory containing the `CMakeLists.txt` to configure a project. Useful for projects like `zstd`.
|
||||||
|
- `bundled`: Force the usage of a bundled package. Useful for packages where the system package is broken or nonexistent; e.g. external fragment shaders or data archives.
|
||||||
|
- Note that this will conflict with `CPMUTIL_FORCE_SYSTEM`; for this reason, when using non-library archives, it may be best to allow the user to download and extract the archive manually and specify a local directory to it.
|
||||||
|
- `find_args`: Additional arguments passed to `find_package`, e.g. `MODULE`
|
||||||
|
- `patches`: Array of in-tree patches to apply to the downloaded source code. See [#Patches](TODO).
|
||||||
|
- `options`: Array of CMake options to apply before configuring the package, e.g. `"FMT_TEST ON"`.
|
||||||
|
|
||||||
|
### Versioning
|
||||||
|
|
||||||
|
When fetching from a Git repository, there are generally three methods of versioning:
|
||||||
|
|
||||||
|
- Commit hashes
|
||||||
|
- Git tags
|
||||||
|
- Release artifacts
|
||||||
|
|
||||||
|
When `repo` is set, `version` field can be set to any commitish value, including commit hashes or Git tags. In the case of artifacts, `version` must be a Git tag, and `artifact` must be set to a release artifact attached to that tag. Many repositories intentionally version the filenames of their release artifacts; for this purpose, CPMUtil allows you to implant the version number into the artifact name. To do so, add `%VERSION%` to the artifact name; CPMUtil will then automatically replace `%VERSION%` with the `version` field. This means that when changing versions, you only need to update the version, not the artifact!
|
||||||
|
|
||||||
|
Take Boost as an example. The artifact for Boost 1.90.0 is `boost-1.90.0-cmake.tar.xz`, and the tag is `boost-1.90.0`. Thus, we can set the artifact to `%VERSION%-cmake.tar.xz`:
|
||||||
|
|
||||||
|
```json
|
||||||
|
"boost": {
|
||||||
|
"repo": "boostorg/boost",
|
||||||
|
"version": "boost-1.90.0",
|
||||||
|
"artifact": "%VERSION%-cmake.tar.xz"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
The artifact will then evaluate as `boost-1.90.0-cmake.tar.xz`.
|
||||||
|
|
||||||
|
### Artifact Naming Errata
|
||||||
|
|
||||||
|
While `%VERSION%` replacement is generally good enough for well-packaged projects, occasionally there may be some problematic packages. Take, for instance, Vulkan Validation Layers:
|
||||||
|
|
||||||
|
- Tag (`version`): `vulkan-sdk-1.4.341.0`
|
||||||
|
- Artifact: `android-binaries-1.4.341.0.zip`
|
||||||
|
|
||||||
|
Attempting to add version replacement to the artifact definition **would not work here!** In this case, you must utilize the `numeric_version` field described earlier; we would set `numeric_version` to `1.4.341.0` and add `%NUMERIC_VERSION%` replacements into our artifact and version fields:
|
||||||
|
|
||||||
|
```json
|
||||||
|
"vulkan-validation-layers": {
|
||||||
|
"artifact": "android-binaries-%NUMERIC_VERSION%.zip",
|
||||||
|
"repo": "KhronosGroup/Vulkan-ValidationLayers",
|
||||||
|
"version": "vulkan-sdk-%NUMERIC_VERSION%",
|
||||||
|
"numeric_version": "1.4.341.0"
|
||||||
|
},
|
||||||
|
```
|
||||||
|
|
||||||
|
`artifact` will thus evaluate to `android-binaries-1.4.341.0.zip`, and `version` to `vulkan-sdk-1.4.341.0`. CPMUtil's auto-updater will also account for this and only update `numeric_version`!
|
||||||
|
|
||||||
|
### Patches
|
||||||
|
|
||||||
|
CPMUtil is able to apply in-place source tree patches to downloaded packages. These are defined in JSON as an array of names, preferably using `git-format-patch`'s scheme of `<4 digit number>-patch-name.patch`.
|
||||||
|
|
||||||
|
They are stored in `<CPMUTIL_PATCH_DIR>/<json-key>` (remember that `CPMUTIL_PATCH_DIR` defaults to `$ROOT/.patch`); e.g. `boost` patches would be in `.patch/boost`. Let's say we've made three patches and want to add them; in the Boost JSON definition, we would add:
|
||||||
|
|
||||||
|
```json
|
||||||
|
"patches": [
|
||||||
|
"0001-fix-clang-cl-compilation.patch",
|
||||||
|
"0002-fix-msvc-arm64-compilation.patch",
|
||||||
|
"0003-fix-bsd-linking.patch"
|
||||||
|
]
|
||||||
|
```
|
||||||
|
|
||||||
|
Then, when Boost is downloaded, it will apply these patches to the source tree in the order they are defined (compound/dependent patches are okay!). Note that when you add, remove, or modify patches, CPMUtil will invalidate your downloaded cache and re-fetch the source.
|
||||||
|
|
||||||
|
To learn how to make patches, see [Addendum: Making Patches](#addendum-making-patches).
|
||||||
|
|
||||||
|
## Pre-built CI Packages
|
||||||
|
|
||||||
|
The definition and usage of CI packages is subject to change in the very near future.
|
||||||
|
|
||||||
|
CI packages are, in essence, prebuilt binary distributions for libraries. They exist for a few reasons:
|
||||||
|
|
||||||
|
- Creating static libraries for system packages that normally lack them, e.g. Qt/SDL
|
||||||
|
- Reducing duplicated compilation effort on rarely-changing externals, e.g. SDL
|
||||||
|
- Creating debloated prebuilt packages specifically for your project to reduce binary size, e.g. FFmpeg
|
||||||
|
|
||||||
|
CPMUtil is specifically designed to work with a small subset of prebuilt CI packages; namely, those that follow the format of the [crueter-ci spec](https://github.com/crueter-ci/spec/blob/master/README.md).
|
||||||
|
|
||||||
|
To use them, you must add `ci: true` to your package definition. Alongside the common properties, CI packages define the following:
|
||||||
|
|
||||||
|
- `name`: The artifacts' name prefix (required), e.g. `openssl`
|
||||||
|
- `extension`: The artifacts' extension (default `tar.zst`)
|
||||||
|
- `disabled_platforms`: CPMUtil-supported platforms that are not built into this repository.
|
||||||
|
- This is subject to change.
|
||||||
|
|
||||||
|
**Note that `package` is subject to removal here.**
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
```json
|
||||||
|
"sdl2": {
|
||||||
|
"repo": "crueter-ci/SDL2",
|
||||||
|
"package": "SDL2",
|
||||||
|
"min_version": "2.26.4",
|
||||||
|
"ci": true,
|
||||||
|
"version": "2.32.10-a65111bd2d",
|
||||||
|
"artifact": "SDL2"
|
||||||
|
},
|
||||||
|
```
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
Once you've defined your package in `cpmfile.json`, simply call `AddJsonPackage(<JSON key>)` and go from there! Specific instructions differ between individual packages, so you're on your own from here.
|
||||||
|
|
||||||
|
If you're only concerned with basic usage, you can stop reading. For more advanced use cases and package management, read these addenda.
|
||||||
|
|
||||||
|
## Addendum: Cache Storage
|
||||||
|
|
||||||
|
CPMUtil stores downloaded packages within `.cache/cpm` by default (see `CPM_SOURCE_CACHE`). Subdirectories stored within are lowercase representations of the `find_package` name for the package; for instance, a `vulkan-headers` definition with `package: "VulkanHeaders"` would be stored in `.cache/cpm/vulkanheaders`.
|
||||||
|
|
||||||
|
Within these subdirectories, additional directories are created for each individual version, corresponding directly to their `version` field. CI packages use `<platform>-<architecture>-<version>` unconditionally.
|
||||||
|
|
||||||
|
To see the cache directory for a given package, use `tools/cpmutil.sh package dir <JSON key>`.
|
||||||
|
|
||||||
|
## Addendum: Making Patches
|
||||||
|
|
||||||
|
CPMUtil has a dedicated command for making patches. You're recommended to have Git and a command line editor installed, but CPMUtil is able to work without either. To do so, follow these steps, noting your package's JSON key:
|
||||||
|
|
||||||
|
- Clean-fetch your package: `tools/cpmutil.sh package reset <package>`
|
||||||
|
- Make any necessary modifications to the package source.
|
||||||
|
- You can access the package source directory via `tools/cpmutil.sh package dir <package>`.
|
||||||
|
- Create the patch: `tools/cpmutil.sh package patch <package>`
|
||||||
|
- Follow the on-screen prompts. If you have Git installed, an editor will be opened so you can type your commit message. If not, just type a one-line description.
|
||||||
|
|
||||||
|
And you're done! CPMUtil will automatically create and name the patch, and add it to the list of patches in the JSON definition.
|
||||||
|
|
||||||
|
## Addendum: Package Identification Lists
|
||||||
|
|
||||||
|
CPMUtil will create three lists of dependencies where `AddPackage` or similar was used. Each is in order of addition.
|
||||||
|
|
||||||
|
- `CPM_PACKAGE_NAMES`: The names of packages included by CPMUtil
|
||||||
|
- `CPM_PACKAGE_URLS`: The URLs to project/repo pages of packages
|
||||||
|
- `CPM_PACKAGE_SHAS`: Short version identifiers for each package
|
||||||
|
- If the package was included as a system package, `(system)` is appended thereafter
|
||||||
|
- Packages whose versions can't be deduced will be left as `unknown`.
|
||||||
|
|
||||||
|
For an example of how this might be implemented in an application, see Eden's implementation:
|
||||||
|
|
||||||
|
- [`dep_hashes.h.in`](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/src/dep_hashes.h.in)
|
||||||
|
- [`GenerateDepHashes.cmake`](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CMakeModules/GenerateDepHashes.cmake)
|
||||||
|
- [`deps_dialog.cpp`](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/src/yuzu/deps_dialog.cpp)
|
||||||
|
|
||||||
|
## Addendum: Notes for Packagers
|
||||||
|
|
||||||
|
If you are packaging a project that uses CPMUtil, read this!
|
||||||
|
|
||||||
|
### Network Sandbox
|
||||||
|
|
||||||
|
For sandboxed environments (e.g. Gentoo, nixOS) you must install all dependencies to the system beforehand and set `-DCPMUTIL_FORCE_SYSTEM=ON`. If a dependency is missing, get creating!
|
||||||
|
|
||||||
|
Alternatively, if CPMUtil pulls in a package that has no suitable way to install or use a system version, download it separately and pass `-D<PackageName>_CUSTOM_DIR=/path/to/downloaded/dir`.
|
||||||
|
|
||||||
|
### Unsandboxed
|
||||||
|
|
||||||
|
For others (AUR, MPR, etc). CPMUtil will handle everything for you, including if some of the project's dependencies are missing from your distribution's repositories. See [`eden-git`](https://aur.archlinux.org/cgit/aur.git/tree/PKGBUILD?h=eden-git) for an example.
|
||||||
|
|
||||||
|
## Addendum: Dependent Packages
|
||||||
|
|
||||||
|
Consider the following scenario: the Vulkan Headers and Vulkan Utility libraries are both pulled in by my project. In order for both to compile cleanly, their versions *must* match. However, a user may have the Vulkan Headers installed, but *not* the Vulkan Utility Libraries! This can cause a version mismatch where the Utility Libraries expect a much newer version of the Vulkan Headers than the user has installed.
|
||||||
|
|
||||||
|
To solve this, CPMUtil has an `AddDependentPackages` command. This takes a list of JSON package keys that *must* either ALL be installed to the system, or ALL be bundled.
|
||||||
|
|
||||||
|
### Example: Vulkan
|
||||||
|
|
||||||
|
Using the prior Vulkan example:
|
||||||
|
|
||||||
|
```json
|
||||||
|
"vulkan-headers": {
|
||||||
|
"repo": "KhronosGroup/Vulkan-Headers",
|
||||||
|
"package": "VulkanHeaders",
|
||||||
|
"min_version": "1.4.317",
|
||||||
|
"version": "v1.4.342"
|
||||||
|
},
|
||||||
|
"vulkan-utility-libraries": {
|
||||||
|
"repo": "KhronosGroup/Vulkan-Utility-Libraries",
|
||||||
|
"package": "VulkanUtilityLibraries",
|
||||||
|
"version": "v1.4.342"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
In CMake:
|
||||||
|
|
||||||
|
```cmake
|
||||||
|
AddDependentPackages(vulkan-headers vulkan-utility-libraries)
|
||||||
|
```
|
||||||
|
|
||||||
|
Possible scenarios:
|
||||||
|
|
||||||
|
- The user has both Vulkan Headers and Vulkan Utility Libraries installed to the system, and both are new enough.
|
||||||
|
- Configuration proceeds without issue.
|
||||||
|
- The user has neither installed, or has a too-old version of Vulkan Headers installed
|
||||||
|
- Configuration proceeds without issue.
|
||||||
|
- The user has a valid Vulkan Headers installed, but not Vulkan Utility Libraries.
|
||||||
|
- CPMUtil instructs the user to either force bundled Vulkan Headers, or install Vulkan Utility Libraries.
|
||||||
|
- The user has both installed, but Vulkan Headers are too old.
|
||||||
|
- CPMUtil instructs the user to install a valid version of Vulkan Headers, or force bundled Vulkan Utility Libraries.
|
||||||
|
|
||||||
|
## Addendum: Module Path Packages
|
||||||
|
|
||||||
|
Sometimes, a prebuilt CI package may be packed in such a way that it's meant to be used in the context of a system install (e.g. pkgconfig or CMakeConfig files). In this case, CPMUtil normally will be unable to configure the downloaded subdirectory. To solve this, you can use `AddJsonPackage`'s `MODULE_PATH` mode, which adds the downloaded source directory to the `CMAKE_MODULE_PATH`.
|
||||||
|
|
||||||
|
### Example: OpenSSL
|
||||||
|
|
||||||
|
Say an OpenSSL CI package is packed to contain its CMake config files rather than a root `CMakeLists.txt`; in this case, you would call:
|
||||||
|
|
||||||
|
```cmake
|
||||||
|
AddJsonPackage(NAME openssl MODULE_PATH)
|
||||||
|
```
|
||||||
|
|
||||||
|
The `NAME` argument is also required, as the parsing is different from the standard single-argument function signature.
|
||||||
|
|
||||||
|
From here, calling `find_package(OpenSSL)` will use the bundled OpenSSL.
|
||||||
|
|
||||||
|
## Addendum: Adding Qt
|
||||||
|
|
||||||
|
If you'd like to use customized Qt builds, CPMUtil provides a convenience function that allows you to add Qt builds. This usage and setup is subject to change.
|
||||||
|
|
||||||
|
See [crueter-ci/Qt](https://github.com/crueter-ci/Qt) for an example of how one might build customized Qt. To add a Qt build to your project, use `AddQt(<repository> <version>)`, e.g.:
|
||||||
|
|
||||||
|
```cmake
|
||||||
|
AddQt(QDash-CI/Qt 6.11.1)
|
||||||
|
```
|
||||||
|
|
||||||
|
Then, call `find_package(Qt6 ...)` and it will pull Qt from your downloaded source.
|
||||||
|
|
||||||
|
## Addendum: Package-Specific Overrides
|
||||||
|
|
||||||
|
There are three variables that CPMUtil defines for each package; these can be overriden by the user or in your CMake. `package` refers either to the `package` value in the JSON, or the package's JSON key if unset (see `package` in [Common Properties](#common-properties)):
|
||||||
|
|
||||||
|
- `<package>_FORCE_BUNDLED`: Forcefully bundle the package. This has the same effect as `CPMUTIL_FORCE_BUNDLED`, but only for this package.
|
||||||
|
- `<package>_FORCE_BUNDLED`: Forcefully use the system package, failing if it can't be found. This has the same effect as `SYSTEM`, but only for this package.
|
||||||
|
- `<package>_CUSTOM_DIR`: Path to an extracted copy of the package. CPMUtil will not attempt to download the package and will instead use the custom directory.
|
||||||
|
- For an example, see [CPMUtil's test case](https://git.crueter.xyz/CMake/CPMUtil/src/branch/master/tests/dir/CMakeLists.txt)
|
||||||
|
|
||||||
|
Additionally, in CMake, you can add `FORCE_BUNDLED_PACKAGE ON` to your `AddJsonPackage` command--note that you will have to use the `NAME <key>` syntax as described in [Module Path Packages](#addendum-module-path-packages). This will overrule *all* other overrides, including `CPMUTIL_FORCE_SYSTEM` and `<package>_FORCE_SYSTEM`--use with caution!
|
||||||
|
|
||||||
|
## Addendum: Supply-Chain Security
|
||||||
|
|
||||||
|
Many package managers suffer from the issue of supply chain security, specifically in regards to silent overwrites of existing packages or archives, e.g. tag sliding and artifact overwriting. CPMUtil has three methods to protect against this.
|
||||||
|
|
||||||
|
### Checksumming
|
||||||
|
|
||||||
|
CPMUtil *requires* SHA512 checksums for standard packages, and soon will for CI packages as well. If an attacker or compromised account slides a tag, overwrites a release artifact, or otherwise attempts to compromise anything that CPMUtil may fetch, **CPMUtil will not allow the download to continue!** This means that consumers of your build system can **only** download an artifact if the contents of the artifact are *exactly* indentical to what it was when it was configured--any changes at all will be rejected by CPMUtil.
|
||||||
|
|
||||||
|
### Caching
|
||||||
|
|
||||||
|
CPMUtil uses a mutable cache system, stored by default in `.cache/cpm`. Dependencies are downloaded and extracted here, and can be reused infinitely. This means that, for instance, if a package is compromised but you already have a cached local copy, you won't have to worry at all!
|
||||||
|
|
||||||
|
### Immutable Commit Hashes
|
||||||
|
|
||||||
|
CPMUtil is capable of using immutable Git commit hashes for its artifacts. These are (barring SHA1 collisions) completely immune to supply chain attacks--that is, unless the entire root server gets compromised to serve infected artifacts/source code; at which point there are much larger issues to worry about. This means that once you set a package to use a Git commit hash for its version, **it will stay the same forever**. This is useful if you want to ensure that consumers are never faced with download failures stemming from hash mismatches in case of compromised artifacts.
|
||||||
|
|
||||||
|
Do note, however, that this will render the package incompatible with CPMUtil's built-in auto-updater, so you will have to manually update the package.
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
# AddPackage
|
|
||||||
|
|
||||||
- `VERSION` (required): The version to get (the tag will be `v${VERSION}`)
|
|
||||||
- `NAME` (required): Name used within the artifacts
|
|
||||||
- `REPO` (required): CI repository, e.g. `crueter-ci/OpenSSL`
|
|
||||||
- `PACKAGE` (required): `find_package` package name
|
|
||||||
- `EXTENSION`: Artifact extension (default `tar.zst`)
|
|
||||||
- `MIN_VERSION`: Minimum version for `find_package`. Only used if platform does not support this package as a bundled artifact
|
|
||||||
- `DISABLED_PLATFORMS`: List of platforms that lack artifacts for this package. Options:
|
|
||||||
- `windows-amd64`
|
|
||||||
- `windows-arm64`
|
|
||||||
- `mingw-amd64`
|
|
||||||
- `mingw-arm64`
|
|
||||||
- `android-x86_64`
|
|
||||||
- `android-aarch64`
|
|
||||||
- `solaris-amd64`
|
|
||||||
- `freebsd-amd64`
|
|
||||||
- `linux-amd64`
|
|
||||||
- `linux-aarch64`
|
|
||||||
- `macos-universal`
|
|
||||||
- `ios-aarch64`
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user