feat: Add frame generation and enhance UE4 game compatibility

- Add frame generation settings (enabled/disabled, interpolation/extrapolation modes)
- Add frame skipping settings (enabled/disabled, adaptive/fixed modes)
- Implement frame skipping logic with adaptive and fixed modes
- Enhance UE4 crash handling with recovery mechanisms
- Add support for signed and float 32-bit image formats across shader backends
- Update Vulkan Validation Layers to v1.4.321.0
- Fix duplicate frame skipping options in Qt UI
- Improve memory handling for UE4 games (Hogwarts Legacy compatibility)
- Add enhanced bindless texture handling with fallback approach
- Update Android build configuration and dependencies

Signed-off-by: Zephyron <zephyron@citron-emu.org>
This commit is contained in:
Zephyron
2025-08-05 19:32:28 +10:00
parent 011a546229
commit 117c467ff3
40 changed files with 1004 additions and 76 deletions

View File

@@ -1,5 +1,4 @@
// SPDX-FileCopyrightText: 2023 yuzu Emulator Project
// SPDX-FileCopyrightText: 2025 citron Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
import android.annotation.SuppressLint
@@ -36,12 +35,12 @@ android {
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_21
targetCompatibility = JavaVersion.VERSION_21
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
kotlinOptions {
jvmTarget = "21"
jvmTarget = "17"
}
packaging {
@@ -57,7 +56,6 @@ android {
// TODO If this is ever modified, change application_id in strings.xml
applicationId = "org.citron.citron_emu"
minSdk = 30
//noinspection EditedTargetSdkVersion
targetSdk = 35
versionName = getGitVersion()
@@ -109,8 +107,8 @@ android {
isDefault = true
isShrinkResources = true
isMinifyEnabled = true
isDebuggable = false
isJniDebuggable = false
isDebuggable = false
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
@@ -162,7 +160,7 @@ android {
externalNativeBuild {
cmake {
version = "3.31.7"
version = "3.31.8"
path = file("../../../CMakeLists.txt")
}
}
@@ -182,7 +180,7 @@ android {
"-DCMAKE_EXPORT_COMPILE_COMMANDS=ON",
"-DCMAKE_POLICY_VERSION_MINIMUM=3.5",
"-DANDROID_SUPPORT_FLEXIBLE_PAGE_SIZES=ON",
)
)
abiFilters("arm64-v8a") // , "x86_64")
}
@@ -197,7 +195,7 @@ tasks.create<Delete>("ktlintReset") {
val showFormatHelp = {
logger.lifecycle(
"If this check fails, please try running \"gradlew ktlintFormat\" for automatic " +
"codestyle fixes"
"codestyle fixes"
)
}
tasks.getByPath("ktlintKotlinScriptCheck").doFirst { showFormatHelp.invoke() }

View File

@@ -29,6 +29,10 @@ enum class IntSetting(override val key: String) : AbstractIntSetting {
VERTICAL_ALIGNMENT("vertical_alignment"),
FSR_SHARPENING_SLIDER("fsr_sharpening_slider"),
FSR2_QUALITY_MODE("fsr2_quality_mode"),
FRAME_GENERATION("frame_generation"),
FRAME_GENERATION_MODE("frame_generation_mode"),
FRAME_SKIPPING("frame_skipping"),
FRAME_SKIPPING_MODE("frame_skipping_mode"),
// Zep Zone settings
MEMORY_LAYOUT_MODE("memory_layout_mode"),

View File

@@ -443,6 +443,42 @@ abstract class SettingsItem(
valuesId = R.array.vramUsageModeValues
)
)
put(
SingleChoiceSetting(
IntSetting.FRAME_GENERATION,
titleId = R.string.frame_generation,
descriptionId = R.string.frame_generation_description,
choicesId = R.array.frameGenerationNames,
valuesId = R.array.frameGenerationValues
)
)
put(
SingleChoiceSetting(
IntSetting.FRAME_GENERATION_MODE,
titleId = R.string.frame_generation_mode,
descriptionId = R.string.frame_generation_mode_description,
choicesId = R.array.frameGenerationModeNames,
valuesId = R.array.frameGenerationModeValues
)
)
put(
SingleChoiceSetting(
IntSetting.FRAME_SKIPPING,
titleId = R.string.frame_skipping,
descriptionId = R.string.frame_skipping_description,
choicesId = R.array.frameSkippingNames,
valuesId = R.array.frameSkippingValues
)
)
put(
SingleChoiceSetting(
IntSetting.FRAME_SKIPPING_MODE,
titleId = R.string.frame_skipping_mode,
descriptionId = R.string.frame_skipping_mode_description,
choicesId = R.array.frameSkippingModeNames,
valuesId = R.array.frameSkippingModeValues
)
)
// Applet Mode Settings
put(

View File

@@ -997,6 +997,14 @@ class SettingsFragmentPresenter(
add(IntSetting.SHADER_BACKEND.key)
add(IntSetting.VRAM_USAGE_MODE.key)
add(HeaderSetting(R.string.frame_generation_header))
add(IntSetting.FRAME_GENERATION.key)
add(IntSetting.FRAME_GENERATION_MODE.key)
add(HeaderSetting(R.string.frame_skipping_header))
add(IntSetting.FRAME_SKIPPING.key)
add(IntSetting.FRAME_SKIPPING_MODE.key)
add(HeaderSetting(R.string.applet_settings_header))
add(IntSetting.CABINET_APPLET_MODE.key)
add(IntSetting.CONTROLLER_APPLET_MODE.key)

View File

@@ -187,6 +187,46 @@
<item>3</item>
</integer-array>
<string-array name="frameGenerationNames">
<item>@string/frame_generation_disabled</item>
<item>@string/frame_generation_enabled</item>
</string-array>
<integer-array name="frameGenerationValues">
<item>0</item>
<item>1</item>
</integer-array>
<string-array name="frameGenerationModeNames">
<item>@string/frame_generation_mode_interpolation</item>
<item>@string/frame_generation_mode_extrapolation</item>
</string-array>
<integer-array name="frameGenerationModeValues">
<item>0</item>
<item>1</item>
</integer-array>
<string-array name="frameSkippingNames">
<item>@string/frame_skipping_disabled</item>
<item>@string/frame_skipping_enabled</item>
</string-array>
<integer-array name="frameSkippingValues">
<item>0</item>
<item>1</item>
</integer-array>
<string-array name="frameSkippingModeNames">
<item>@string/frame_skipping_mode_adaptive</item>
<item>@string/frame_skipping_mode_fixed</item>
</string-array>
<integer-array name="frameSkippingModeValues">
<item>0</item>
<item>1</item>
</integer-array>
<string-array name="rendererAntiAliasingNames">
<item>@string/anti_aliasing_none</item>
<item>@string/anti_aliasing_fxaa</item>

View File

@@ -424,6 +424,7 @@
<string name="astc_settings_header">ASTC Settings</string>
<string name="advanced_graphics_header">Advanced Graphics</string>
<string name="applet_settings_header">Applet Settings</string>
<string name="frame_generation_header">Frame Generation</string>
<!-- Applet Mode Settings -->
<string name="cabinet_applet_mode">Cabinet Applet Mode</string>
@@ -1226,5 +1227,22 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
<string name="shader_backend_description">Controls which shader backend to use for rendering.</string>
<string name="vram_usage_mode">VRAM Usage Mode</string>
<string name="vram_usage_mode_description">Controls how aggressively VRAM is used. Conservative mode limits VRAM usage for better stability.</string>
<string name="frame_generation">Frame Generation</string>
<string name="frame_generation_description">Enables frame generation to create intermediate frames, potentially doubling the perceived frame rate.</string>
<string name="frame_generation_mode">Frame Generation Mode</string>
<string name="frame_generation_mode_description">Interpolation creates frames between existing ones, while Extrapolation predicts future frames.</string>
<string name="frame_generation_disabled">Disabled</string>
<string name="frame_generation_enabled">Enabled</string>
<string name="frame_generation_mode_interpolation">Interpolation</string>
<string name="frame_generation_mode_extrapolation">Extrapolation</string>
<string name="frame_skipping">Frame Skipping</string>
<string name="frame_skipping_description">Skips frames to maintain performance when the system cannot keep up with the target frame rate.</string>
<string name="frame_skipping_mode">Frame Skipping Mode</string>
<string name="frame_skipping_mode_description">Adaptive mode skips frames based on performance, while Fixed mode skips a specific number of frames.</string>
<string name="frame_skipping_disabled">Disabled</string>
<string name="frame_skipping_enabled">Enabled</string>
<string name="frame_skipping_mode_adaptive">Adaptive</string>
<string name="frame_skipping_mode_fixed">Fixed</string>
<string name="frame_skipping_header">Frame Skipping</string>
</resources>

View File

@@ -3,8 +3,8 @@
// Top-level build file where you can add configuration options common to all sub-projects/modules.
plugins {
id("com.android.application") version "8.10.0" apply false
id("com.android.library") version "8.10.0" apply false
id("com.android.application") version "8.1.2" apply false
id("com.android.library") version "8.1.2" apply false
id("org.jetbrains.kotlin.android") version "1.9.20" apply false
}