Add asynchronous streaming to the GUI and auto-enable it

- Hopefully not many users are on very weak GPUs
This commit is contained in:
kd-11 2021-03-11 22:40:33 +03:00 committed by kd-11
parent a5f0faefc3
commit 140c5bfc3e
5 changed files with 55 additions and 8 deletions

View File

@ -168,7 +168,7 @@ struct cfg_root : cfg::node
cfg::_bool force_fifo{ this, "Force FIFO present mode" };
cfg::_bool force_primitive_restart{ this, "Force primitive restart flag" };
cfg::_bool force_disable_exclusive_fullscreen_mode{this, "Force Disable Exclusive Fullscreen Mode"};
cfg::_bool asynchronous_texture_streaming{ this, "Asynchronous Texture Streaming Placeholder", false, true }; // Placeholder text because it'll have to be updated later
cfg::_bool asynchronous_texture_streaming{ this, "Asynchronous Texture Streaming", true, true };
cfg::_enum<vk_gpu_scheduler_mode> asynchronous_scheduler{ this, "Asynchronous Queue Scheduler", vk_gpu_scheduler_mode::device };
} vk{ this };

View File

@ -76,6 +76,8 @@ enum class emu_settings_type
VBlankRate,
RelaxedZCULL,
DriverWakeUpDelay,
VulkanAsyncTextureUploads,
VulkanAsyncSchedulerDriver,
// Performance Overlay
PerfOverlayEnabled,
@ -225,6 +227,10 @@ static const QMap<emu_settings_type, cfg_location> settings_location =
{ emu_settings_type::VBlankRate, { "Video", "Vblank Rate"}},
{ emu_settings_type::DriverWakeUpDelay, { "Video", "Driver Wake-Up Delay"}},
// Vulkan
{ emu_settings_type::VulkanAsyncTextureUploads, { "Video", "Vulkan", "Asynchronous Texture Streaming"}},
{ emu_settings_type::VulkanAsyncSchedulerDriver, { "Video", "Vulkan", "Asynchronous Queue Scheduler"}},
// Performance Overlay
{ emu_settings_type::PerfOverlayEnabled, { "Video", "Performance Overlay", "Enabled" } },
{ emu_settings_type::PerfOverlayFramerateGraphEnabled, { "Video", "Performance Overlay", "Enable Framerate Graph" } },

View File

@ -441,9 +441,13 @@ settings_dialog::settings_dialog(std::shared_ptr<gui_settings> gui_settings, std
ui->gb_resolutionScale->setEnabled(!checked);
ui->gb_minimumScalableDimension->setEnabled(!checked);
ui->gb_anisotropicFilter->setEnabled(!checked);
ui->vulkansched->setEnabled(!checked);
};
connect(ui->strictModeRendering, &QCheckBox::clicked, this, onStrictRenderingMode);
m_emu_settings->EnhanceCheckBox(ui->asyncTextureStreaming, emu_settings_type::VulkanAsyncTextureUploads);
SubscribeTooltip(ui->asyncTextureStreaming, tooltips.settings.async_texture_streaming);
// Radio buttons
SubscribeTooltip(ui->rb_legacy_recompiler, tooltips.settings.legacy_shader_recompiler);
@ -638,15 +642,20 @@ settings_dialog::settings_dialog(std::shared_ptr<gui_settings> gui_settings, std
connect(ui->graphicsAdapterBox, &QComboBox::currentTextChanged, set_adapter);
connect(ui->renderBox, &QComboBox::currentTextChanged, set_renderer);
auto fix_gl_legacy = [=, this](const QString& text)
auto apply_renderer_specific_options = [=, this](const QString& text)
{
// OpenGL-only
ui->glLegacyBuffers->setEnabled(text == r_creator->OpenGL.name);
// Vulkan-only
ui->asyncTextureStreaming->setEnabled(text == r_creator->Vulkan.name);
ui->vulkansched->setEnabled(text == r_creator->Vulkan.name);
};
// Handle connects to disable specific checkboxes that depend on GUI state.
onStrictRenderingMode(ui->strictModeRendering->isChecked());
fix_gl_legacy(ui->renderBox->currentText()); // Init
connect(ui->renderBox, &QComboBox::currentTextChanged, fix_gl_legacy);
apply_renderer_specific_options(ui->renderBox->currentText()); // Init
connect(ui->renderBox, &QComboBox::currentTextChanged, apply_renderer_specific_options);
// _ _ _______ _
// /\ | (_) |__ __| | |
@ -983,6 +992,9 @@ settings_dialog::settings_dialog(std::shared_ptr<gui_settings> gui_settings, std
m_emu_settings->EnhanceComboBox(ui->sleepTimersAccuracy, emu_settings_type::SleepTimersAccuracy);
SubscribeTooltip(ui->gb_sleep_timers_accuracy, tooltips.settings.sleep_timers_accuracy);
m_emu_settings->EnhanceComboBox(ui->vulkansched, emu_settings_type::VulkanAsyncSchedulerDriver);
SubscribeTooltip(ui->gb_vulkansched, tooltips.settings.vulkan_async_scheduler);
// Sliders
EnhanceSlider(emu_settings_type::DriverWakeUpDelay, ui->wakeupDelay, ui->wakeupText, tr(reinterpret_cast<const char*>(u8"%0 µs"), "Driver wake up delay"));

View File

@ -10,7 +10,7 @@
<x>0</x>
<y>0</y>
<width>753</width>
<height>650</height>
<height>730</height>
</rect>
</property>
<property name="sizePolicy">
@ -39,7 +39,7 @@
</sizepolicy>
</property>
<property name="currentIndex">
<number>0</number>
<number>6</number>
</property>
<widget class="QWidget" name="coreTab">
<attribute name="title">
@ -761,6 +761,13 @@
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="asyncTextureStreaming">
<property name="text">
<string>Asynchronous Texture Streaming</string>
</property>
</widget>
</item>
<item>
<spacer name="additional_settings_spacer">
<property name="orientation">
@ -2061,6 +2068,25 @@
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="gb_vulkansched">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Minimum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="title">
<string>Vulkan Queue Scheduler</string>
</property>
<layout class="QVBoxLayout" name="gb_vksched_layout">
<item>
<widget class="QComboBox" name="vulkansched">
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="gb_wakeupDelay">
<property name="sizePolicy">
@ -2200,8 +2226,8 @@
</property>
<property name="sizeHint" stdset="0">
<size>
<width>0</width>
<height>0</height>
<width>13</width>
<height>13</height>
</size>
</property>
</spacer>

View File

@ -37,6 +37,7 @@ public:
const QString clocks_scale = tr("Changes the scale of emulated system time.\nAffects software which uses system time to calculate things such as dynamic timesteps.");
const QString wake_up_delay = tr("Try fiddling with this setting when encountering unstable games. The higher value, the better stability it may provide.\nIncrements/Decrements for each test should be around 100μs to 200μs until finding the best value for optimal stability.\nValues above 1000μs may cause noticeable performance penalties, use with caution.");
const QString disabled_from_global = tr("Do not change this setting globally.\nRight-click the game in game list and choose \"Configure\" instead.");
const QString vulkan_async_scheduler = tr("Determines how to schedule GPU async compute jobs when using asynchronous streaming.\nUse 'Host' mode for more spec compliant behavior at the cost of CPU overhead.\nUse 'Device' to let your driver handle this. Beware that 'device' mode technically violates official spec but is the superior option.");
// audio
@ -159,6 +160,8 @@ public:
const QString shader_interpreter_only = tr("All rendering is handled by the interpreter with no attempt to compile native shaders.\nThis mode is very slow and experimental.");
const QString shader_compiler_threads = tr("Number of threads to use for the shader compiler backend.\nOnly has an impact when shader mode is set to one of the asynchronous modes.");
const QString async_texture_streaming = tr("Stream textures to GPU in parallel with 3D rendering.\nCan improve performance on more powerful GPUs that have spare headroom.\nOnly works with Vulkan renderer.");
// gui
const QString log_limit = tr("Sets the maximum amount of blocks that the log can display.\nThis usually equals the number of lines.\nSet 0 in order to remove the limit.");