aboutsummaryrefslogtreecommitdiff
path: root/src/android
diff options
context:
space:
mode:
authorForrest Keller <forrestmarkx@outlook.com>2026-01-13 19:18:08 +0100
committercrueter <crueter@eden-emu.dev>2026-01-13 19:18:08 +0100
commitecd01e13fd13b39bff0f2c7c7bc2387c3a2157f4 (patch)
tree4e015762b742b0183f526d6b38b7b54d3a9d7dcb /src/android
parentf544004b5de4ea0fe7277e4a6a9790051b6d0120 (diff)
[video_core] Implement GPU-accelerated texture unswizzling and optimize sparse texture handling (#3246)
- [Added] a new compute shader to handle block-linear unswizzling on the GPU, reducing CPU overhead during texture uploads - [Implemented] BlockLinearUnswizzle3DPass to take advantage of the new compute shader, unimplemented for OpenGL - [Implemented] texture streaming and queue system for large sparse textures to prevent hitches - [Implemented] aggressive garbage collection system to eject large sparse textures to save on memory (Unused) - [Added] user settings to adjust the streaming unswizzle system for low-end machines - [Improved] slightly the ASTC GPU decoding system Co-authored-by: Caio Oliveira <caiooliveirafarias0@gmail.com> Co-authored-by: CamilleLaVey <camillelavey99@gmail.com> Co-authored-by: DraVee <dravee@eden-emu.dev> Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3246 Reviewed-by: Maufeat <sahyno1996@gmail.com> Reviewed-by: MaranBr <maranbr@eden-emu.dev> Reviewed-by: DraVee <dravee@eden-emu.dev> Reviewed-by: CamilleLaVey <camillelavey99@gmail.com> Co-authored-by: Forrest Keller <forrestmarkx@outlook.com> Co-committed-by: Forrest Keller <forrestmarkx@outlook.com>
Diffstat (limited to 'src/android')
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/IntSetting.kt3
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SettingsItem.kt27
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentPresenter.kt3
-rw-r--r--src/android/app/src/main/res/values/arrays.xml48
-rw-r--r--src/android/app/src/main/res/values/strings.xml28
5 files changed, 109 insertions, 0 deletions
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/IntSetting.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/IntSetting.kt
index 8ec498ad22..35bcf430da 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/IntSetting.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/IntSetting.kt
@@ -47,6 +47,9 @@ enum class IntSetting(override val key: String) : AbstractIntSetting {
FAST_CPU_TIME("fast_cpu_time"),
CPU_TICKS("cpu_ticks"),
FAST_GPU_TIME("fast_gpu_time"),
+ GPU_UNZWIZZLE_MAXTEXTURE_SIZE("gpu_unzwizzle_maxtexture_size"),
+ GPU_UNZWIZZLE_STREAM_SIZE("gpu_unzwizzle_stream_size"),
+ GPU_UNZWIZZLE_CHUNK_SIZE("gpu_unzwizzle_chunk_size"),
BAT_TEMPERATURE_UNIT("bat_temperature_unit"),
CABINET_APPLET("cabinet_applet_mode"),
CONTROLLER_APPLET("controller_applet_mode"),
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SettingsItem.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SettingsItem.kt
index 50143a449e..df475271fb 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SettingsItem.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SettingsItem.kt
@@ -657,6 +657,33 @@ abstract class SettingsItem(
)
put(
SingleChoiceSetting(
+ IntSetting.GPU_UNZWIZZLE_MAXTEXTURE_SIZE,
+ titleId = R.string.gpu_unzwizzle_maxtexture_size,
+ descriptionId = R.string.gpu_unzwizzle_maxtexture_size_description,
+ choicesId = R.array.gpuTextureSizeSwizzleEntries,
+ valuesId = R.array.gpuTextureSizeSwizzleValues
+ )
+ )
+ put(
+ SingleChoiceSetting(
+ IntSetting.GPU_UNZWIZZLE_STREAM_SIZE,
+ titleId = R.string.gpu_unzwizzle_stream_size,
+ descriptionId = R.string.gpu_unzwizzle_stream_size_description,
+ choicesId = R.array.gpuSwizzleEntries,
+ valuesId = R.array.gpuSwizzleValues
+ )
+ )
+ put(
+ SingleChoiceSetting(
+ IntSetting.GPU_UNZWIZZLE_CHUNK_SIZE,
+ titleId = R.string.gpu_unzwizzle_chunk_size,
+ descriptionId = R.string.gpu_unzwizzle_chunk_size_description,
+ choicesId = R.array.gpuSwizzleChunkEntries,
+ valuesId = R.array.gpuSwizzleChunkValues
+ )
+ )
+ put(
+ SingleChoiceSetting(
IntSetting.FAST_CPU_TIME,
titleId = R.string.fast_cpu_time,
descriptionId = R.string.fast_cpu_time_description,
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentPresenter.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentPresenter.kt
index dc58e7d23b..68c8a0b309 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentPresenter.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentPresenter.kt
@@ -280,6 +280,9 @@ class SettingsFragmentPresenter(
add(IntSetting.FAST_GPU_TIME.key)
add(BooleanSetting.SKIP_CPU_INNER_INVALIDATION.key)
add(BooleanSetting.RENDERER_ASYNCHRONOUS_SHADERS.key)
+ add(IntSetting.GPU_UNZWIZZLE_MAXTEXTURE_SIZE.key)
+ add(IntSetting.GPU_UNZWIZZLE_STREAM_SIZE.key)
+ add(IntSetting.GPU_UNZWIZZLE_CHUNK_SIZE.key)
add(HeaderSetting(R.string.extensions))
diff --git a/src/android/app/src/main/res/values/arrays.xml b/src/android/app/src/main/res/values/arrays.xml
index 0f3cf9bb11..bf553725d5 100644
--- a/src/android/app/src/main/res/values/arrays.xml
+++ b/src/android/app/src/main/res/values/arrays.xml
@@ -564,6 +564,54 @@
<item>2</item>
</integer-array>
+ <string-array name="gpuTextureSizeSwizzleEntries">
+ <item>@string/gpu_texturesizeswizzle_verysmall</item>
+ <item>@string/gpu_texturesizeswizzle_small</item>
+ <item>@string/gpu_texturesizeswizzle_normal</item>
+ <item>@string/gpu_texturesizeswizzle_large</item>
+ <item>@string/gpu_texturesizeswizzle_verylarge</item>
+ </string-array>
+
+ <integer-array name="gpuTextureSizeSwizzleValues">
+ <item>0</item>
+ <item>1</item>
+ <item>2</item>
+ <item>3</item>
+ <item>4</item>
+ </integer-array>
+
+ <string-array name="gpuSwizzleEntries">
+ <item>@string/gpu_swizzle_verylow</item>
+ <item>@string/gpu_swizzle_low</item>
+ <item>@string/gpu_swizzle_normal</item>
+ <item>@string/gpu_swizzle_medium</item>
+ <item>@string/gpu_swizzle_high</item>
+ </string-array>
+
+ <integer-array name="gpuSwizzleValues">
+ <item>0</item>
+ <item>1</item>
+ <item>2</item>
+ <item>3</item>
+ <item>4</item>
+ </integer-array>
+
+ <string-array name="gpuSwizzleChunkEntries">
+ <item>@string/gpu_swizzlechunk_verylow</item>
+ <item>@string/gpu_swizzlechunk_low</item>
+ <item>@string/gpu_swizzlechunk_normal</item>
+ <item>@string/gpu_swizzlechunk_medium</item>
+ <item>@string/gpu_swizzlechunk_high</item>
+ </string-array>
+
+ <integer-array name="gpuSwizzleChunkValues">
+ <item>0</item>
+ <item>1</item>
+ <item>2</item>
+ <item>3</item>
+ <item>4</item>
+ </integer-array>
+
<string-array name="temperatureUnitEntries">
<item>@string/temperature_celsius</item>
<item>@string/temperature_fahrenheit</item>
diff --git a/src/android/app/src/main/res/values/strings.xml b/src/android/app/src/main/res/values/strings.xml
index 4bfa5afd01..09888ecc92 100644
--- a/src/android/app/src/main/res/values/strings.xml
+++ b/src/android/app/src/main/res/values/strings.xml
@@ -504,6 +504,13 @@
<string name="skip_cpu_inner_invalidation_description">Skips certain CPU-side cache invalidations during memory updates, reducing CPU usage and improving it\'s performance. This may cause glitches or crashes on some games.</string>
<string name="renderer_asynchronous_shaders">Use asynchronous shaders</string>
<string name="renderer_asynchronous_shaders_description">Compiles shaders asynchronously. This may reduce stutters but may also introduce glitches.</string>
+ <string name="gpu_unzwizzle_maxtexture_size">GPU Unswizzle Max Texture Size</string>
+ <string name="gpu_unzwizzle_maxtexture_size_description">Sets the maximum size (MB) for GPU-based texture unswizzling. While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones. Adjust this to find the balance between GPU acceleration and CPU overhead.</string>
+ <string name="gpu_unzwizzle_stream_size">GPU Unswizzle Stream Size</string>
+ <string name="gpu_unzwizzle_stream_size_description">Sets the data limit per frame for unswizzling large textures. Higher values speed up texture loading at the cost of higher frame latency; lower values reduce GPU overhead but may cause visible texture pop-in.</string>
+ <string name="gpu_unzwizzle_chunk_size">GPU Unswizzle Chunk Size</string>
+ <string name="gpu_unzwizzle_chunk_size_description">Defines the number of depth slices processed per batch for 3D textures. Increasing this improves throughput efficiency on powerful GPUs but may cause stuttering or driver timeouts on weaker hardware.</string>
+
<string name="extensions">Extensions</string>
@@ -926,6 +933,27 @@
<string name="fast_gpu_medium">Medium (256)</string>
<string name="fast_gpu_high">High (512)</string>
+ <!-- GPU swizzle texture size -->
+ <string name="gpu_texturesizeswizzle_verysmall">Very Small (16 MB)</string>
+ <string name="gpu_texturesizeswizzle_small">Small (32 MB)</string>
+ <string name="gpu_texturesizeswizzle_normal">Normal (128 MB)</string>
+ <string name="gpu_texturesizeswizzle_large">Large (256 MB)</string>
+ <string name="gpu_texturesizeswizzle_verylarge">Very Large (512 MB)</string>
+
+ <!-- GPU swizzle streams -->
+ <string name="gpu_swizzle_verylow">Very Low (4 MB)</string>
+ <string name="gpu_swizzle_low">Low (8 MB)</string>
+ <string name="gpu_swizzle_normal">Normal (16 MB)</string>
+ <string name="gpu_swizzle_medium">Medium (32 MB)</string>
+ <string name="gpu_swizzle_high">High (64 MB)</string>
+
+ <!-- GPU swizzle chunks -->
+ <string name="gpu_swizzlechunk_verylow">Very Low (32)</string>
+ <string name="gpu_swizzlechunk_low">Low (64)</string>
+ <string name="gpu_swizzlechunk_normal">Normal (128)</string>
+ <string name="gpu_swizzlechunk_medium">Medium (256)</string>
+ <string name="gpu_swizzlechunk_high">High (512)</string>
+
<!-- Temperature Units -->
<string name="temperature_celsius">Celsius</string>
<string name="temperature_fahrenheit">Fahrenheit</string>