RAII toggle

This commit is contained in:
Pavel Barabanov
2025-06-26 00:16:11 +03:00
parent cadcc3c790
commit 6729406741
8 changed files with 49 additions and 27 deletions

View File

@@ -40,6 +40,7 @@ enum class BooleanSetting(override val key: String) : AbstractBooleanSetting {
SOC_OVERLAY_BACKGROUND("soc_overlay_background"),
ENABLE_RAII("enable_raii"),
FRAME_INTERPOLATION("frame_interpolation"),
// FRAME_SKIPPING("frame_skipping"),
@@ -54,7 +55,9 @@ enum class BooleanSetting(override val key: String) : AbstractBooleanSetting {
SHOW_SHADERS_BUILDING("show_shaders_building"),
DEBUG_FLUSH_BY_LINE("flush_lines"),
USE_LRU_CACHE("use_lru_cache"),;
// external fun isFrameSkippingEnabled(): Boolean
external fun isRaiiEnabled(): Boolean
// external fun isFrameSkippingEnabled(): Boolean
external fun isFrameInterpolationEnabled(): Boolean

View File

@@ -210,7 +210,13 @@ abstract class SettingsItem(
override fun reset() = BooleanSetting.USE_DOCKED_MODE.reset()
}
put(
SwitchSetting(
BooleanSetting.ENABLE_RAII,
titleId = R.string.enable_raii,
descriptionId = R.string.enable_raii_description
)
)
put(
SwitchSetting(
BooleanSetting.FRAME_INTERPOLATION,

View File

@@ -434,6 +434,7 @@ class SettingsFragmentPresenter(
add(BooleanSetting.RENDERER_DESCRIPTOR_INDEXING.key)
add(HeaderSetting(R.string.veil_renderer))
add(BooleanSetting.ENABLE_RAII.key)
add(BooleanSetting.FRAME_INTERPOLATION.key)
add(BooleanSetting.RENDERER_FAST_GPU.key)
add(IntSetting.FAST_GPU_TIME.key)

View File

@@ -66,6 +66,8 @@
<string name="eden_veil_warning_description">Настройки в Eden\'s Veil являются экспериментальными и могут вызывать проблемы. Если ваша игра не запускается, отключите все расширения и установите расширенное динамическое состояние на 0.</string>
<string name="frame_skipping">В разработке: Пропуск кадров</string>
<string name="frame_skipping_description">Включите или отключите пропуск кадров для повышения производительности за счет уменьшения количества отображаемых кадров. Эта функция находится в разработке и будет включена в будущих версиях.</string>
<string name="enable_raii">RAII</string>
<string name="enable_raii_description">Метод автоматического управления ресурсами в Vulkan, который обеспечивает правильное освобождение ресурсов при их ненадобности, но может вызывать сбои в бандл-играх.</string>
<string name="frame_interpolation">Улучшенная синхронизация кадров</string>
<string name="frame_interpolation_description">Обеспечивает плавную и стабильную подачу кадров за счет синхронизации их времени, уменьшая подтормаживания и неравномерную анимацию. Идеально для игр с нестабильным временем кадров или микро-подтормаживаниями во время игры.</string>
<string name="use_lru_cache">Включить LRU-кеш</string>

View File

@@ -74,6 +74,8 @@
<string name="descriptor_indexing_description">Improves texture and buffer handling, as well as the Maxwell translation layer. Supported by some Vulkan 1.1 GPUs and all Vulkan 1.2+ GPUs.</string>
<string name="veil_renderer">Renderer</string>
<string name="enable_raii">RAII</string>
<string name="enable_raii_description">A method of automatic resource management in Vulkan that ensures proper release of resources when they are no longer needed, but may cause crashes in bundled games.</string>
<string name="frame_interpolation">Enhanced Frame Pacing</string>
<string name="frame_interpolation_description">Ensures smooth and consistent frame delivery by synchronizing the timing between frames, reducing stuttering and uneven animation. Ideal for games that experience frame timing instability or micro-stutters during gameplay.</string>
<string name="use_auto_stub">Use Auto Stub</string>

View File

@@ -302,6 +302,8 @@ struct Values {
"shader_backend", Category::Renderer, Specialization::RuntimeList};
SwitchableSetting<int> vulkan_device{linkage, 0, "vulkan_device", Category::Renderer,
Specialization::RuntimeList};
SwitchableSetting<bool> enable_raii{linkage, false, "enable_raii", Category::Renderer,
Specialization::RuntimeList};
#ifdef __ANDROID__
SwitchableSetting<bool> frame_interpolation{linkage, true, "frame_interpolation", Category::Renderer,
Specialization::RuntimeList};
@@ -450,7 +452,7 @@ struct Values {
SwitchableSetting<bool> use_asynchronous_shaders{linkage, false, "use_asynchronous_shaders",
Category::RendererAdvanced};
SwitchableSetting<bool> use_fast_gpu_time{linkage,
false,
true,
"use_fast_gpu_time",
Category::RendererAdvanced,
Specialization::Paired,

View File

@@ -110,27 +110,18 @@ try
, device_memory(device_memory_)
, gpu(gpu_)
, library(OpenLibrary(context.get()))
,
, dld()
// Create raw Vulkan instance first
instance(CreateInstance(*library,
, instance(CreateInstance(*library,
dld,
VK_API_VERSION_1_1,
render_window.GetWindowInfo().type,
Settings::values.renderer_debug.GetValue()))
,
// Now create RAII wrappers for the resources in the correct order
managed_instance(MakeManagedInstance(instance, dld))
,
// Create debug messenger if debug is enabled
debug_messenger(Settings::values.renderer_debug ? CreateDebugUtilsCallback(instance)
, debug_messenger(Settings::values.renderer_debug ? CreateDebugUtilsCallback(instance)
: vk::DebugUtilsMessenger{})
, managed_debug_messenger(Settings::values.renderer_debug
? MakeManagedDebugUtilsMessenger(debug_messenger, instance, dld)
: ManagedDebugUtilsMessenger{})
,
// Create surface
surface(CreateSurface(instance, render_window.GetWindowInfo()))
, managed_surface(MakeManagedSurface(surface, instance, dld))
, surface(CreateSurface(instance, render_window.GetWindowInfo()))
, device(CreateDevice(instance, dld, *surface))
, memory_allocator(device)
, state_tracker()
@@ -138,8 +129,8 @@ try
, swapchain(*surface,
device,
scheduler,
render_window.GetFramebufferLayout().width,
render_window.GetFramebufferLayout().height)
render_window.GetFramebufferLayout().width,
render_window.GetFramebufferLayout().height)
, present_manager(instance,
render_window,
device,
@@ -171,8 +162,15 @@ try
present_manager,
scheduler,
PresentFiltersForAppletCapture)
, rasterizer(render_window, gpu, device_memory, device, memory_allocator, state_tracker, scheduler)
, applet_frame() {
, rasterizer(render_window, gpu, device_memory, device, memory_allocator, state_tracker, scheduler) {
// Initialize RAII wrappers after creating the main objects
if (Settings::values.enable_raii.GetValue()) {
managed_instance = MakeManagedInstance(instance, dld);
if (Settings::values.renderer_debug) {
managed_debug_messenger = MakeManagedDebugUtilsMessenger(debug_messenger, instance, dld);
}
managed_surface = MakeManagedSurface(surface, instance, dld);
}
if (Settings::values.renderer_force_max_clock.GetValue() && device.ShouldBoostClocks()) {
turbo_mode.emplace(instance, dld);
@@ -180,11 +178,13 @@ try
}
#ifndef ANDROID
// Release ownership from the old instance and surface
instance.release();
surface.release();
if (Settings::values.renderer_debug) {
debug_messenger.release();
if (Settings::values.enable_raii.GetValue()) {
// Release ownership of the original resources if using RAII
instance.release();
surface.release();
if (Settings::values.renderer_debug) {
debug_messenger.release();
}
}
#endif
@@ -223,12 +223,12 @@ class BooleanSetting {
BooleanSetting BooleanSetting::FRAME_INTERPOLATION(false);
// extern "C" JNIEXPORT jboolean JNICALL
// Java_org_uzuy_uzuy_1emu_features_settings_model_BooleanSetting_isFrameSkippingEnabled(JNIEnv* env, jobject /* this */) {
// Java_org_yuzu_yuzu_1emu_features_settings_model_BooleanSetting_isFrameSkippingEnabled(JNIEnv* env, jobject /* this */) {
// return static_cast<jboolean>(BooleanSetting::FRAME_SKIPPING.getBoolean());
// }
extern "C" JNIEXPORT jboolean JNICALL
Java_org_uzuy_uzuy_1emu_features_settings_model_BooleanSetting_isFrameInterpolationEnabled(JNIEnv* env, jobject /* this */) {
Java_org_yuzu_yuzu_1emu_features_settings_model_BooleanSetting_isFrameInterpolationEnabled(JNIEnv* env, jobject /* this */) {
return static_cast<jboolean>(BooleanSetting::FRAME_INTERPOLATION.getBoolean());
}

View File

@@ -317,6 +317,12 @@ std::unique_ptr<TranslationMap> InitializeTranslations(QWidget* parent)
tr("Improves rendering of transparency effects in specific games."));
// Renderer (Extensions)
INSERT(Settings,
enable_raii,
tr("RAII"),
tr("A method of automatic resource management in Vulkan "
"that ensures proper release of resources "
"when they are no longer needed, but may cause crashes in bundled games."));
INSERT(Settings,
dyna_state,
tr("Extended Dynamic State"),