mirror of
https://github.com/stenzek/duckstation.git
synced 2025-06-06 03:25:36 +00:00
Settings: Add option for enabling GPU-based validation
This commit is contained in:
parent
049ec4af90
commit
b798d8f1aa
@ -6434,6 +6434,11 @@ void FullscreenUI::DrawAdvancedSettingsPage()
|
||||
FSUI_CSTR("Enable debugging when supported by the host's renderer API. Only for developer use."),
|
||||
"GPU", "UseDebugDevice", false);
|
||||
|
||||
DrawToggleSetting(
|
||||
bsi, FSUI_CSTR("Enable GPU-Based Validation"),
|
||||
FSUI_CSTR("Enable GPU-based validation when supported by the host's renderer API. Only for developer use."), "GPU",
|
||||
"UseGPUBasedValidation", false);
|
||||
|
||||
DrawToggleSetting(
|
||||
bsi, FSUI_CSTR("Load Devices From Save States"),
|
||||
FSUI_CSTR("When enabled, memory cards and controllers will be overwritten when save states are loaded."), "Main",
|
||||
@ -9202,6 +9207,8 @@ TRANSLATE_NOOP("FullscreenUI", "Enable Achievements");
|
||||
TRANSLATE_NOOP("FullscreenUI", "Enable Cheats");
|
||||
TRANSLATE_NOOP("FullscreenUI", "Enable Discord Presence");
|
||||
TRANSLATE_NOOP("FullscreenUI", "Enable Fast Boot");
|
||||
TRANSLATE_NOOP("FullscreenUI", "Enable GPU-Based Validation");
|
||||
TRANSLATE_NOOP("FullscreenUI", "Enable GPU-based validation when supported by the host's renderer API. Only for developer use.");
|
||||
TRANSLATE_NOOP("FullscreenUI", "Enable In-Game Overlays");
|
||||
TRANSLATE_NOOP("FullscreenUI", "Enable Overclocking");
|
||||
TRANSLATE_NOOP("FullscreenUI", "Enable Post Processing");
|
||||
|
@ -621,7 +621,7 @@ bool GPUThread::CreateDeviceOnThread(RenderAPI api, bool fullscreen, bool clear_
|
||||
if (g_gpu_settings.gpu_disable_compressed_textures)
|
||||
disabled_features |= GPUDevice::FEATURE_MASK_COMPRESSED_TEXTURES;
|
||||
|
||||
// Don't dump shaders on debug builds for Android, users will complain about storage...
|
||||
// Don't dump shaders on debug builds for Android, users will complain about storage...
|
||||
#if !defined(__ANDROID__) || defined(_DEBUG)
|
||||
const std::string_view shader_dump_directory(EmuFolders::DataRoot);
|
||||
#else
|
||||
@ -636,9 +636,9 @@ bool GPUThread::CreateDeviceOnThread(RenderAPI api, bool fullscreen, bool clear_
|
||||
Host::GetStringSettingValue("GPU", "Adapter"), static_cast<GPUDevice::FeatureMask>(disabled_features),
|
||||
shader_dump_directory,
|
||||
g_gpu_settings.gpu_disable_shader_cache ? std::string_view() : std::string_view(EmuFolders::Cache),
|
||||
SHADER_CACHE_VERSION, g_gpu_settings.gpu_use_debug_device, wi.value(), s_state.requested_vsync,
|
||||
s_state.requested_allow_present_throttle, fullscreen_mode.has_value() ? &fullscreen_mode.value() : nullptr,
|
||||
exclusive_fullscreen_control, &create_error))
|
||||
SHADER_CACHE_VERSION, g_gpu_settings.gpu_use_debug_device, g_gpu_settings.gpu_use_debug_device_gpu_validation,
|
||||
wi.value(), s_state.requested_vsync, s_state.requested_allow_present_throttle,
|
||||
fullscreen_mode.has_value() ? &fullscreen_mode.value() : nullptr, exclusive_fullscreen_control, &create_error))
|
||||
{
|
||||
ERROR_LOG("Failed to create GPU device: {}", create_error.GetDescription());
|
||||
if (g_gpu_device)
|
||||
|
@ -216,6 +216,7 @@ void Settings::Load(const SettingsInterface& si, const SettingsInterface& contro
|
||||
gpu_automatic_resolution_scale = (gpu_resolution_scale == 0);
|
||||
gpu_multisamples = static_cast<u8>(si.GetUIntValue("GPU", "Multisamples", 1u));
|
||||
gpu_use_debug_device = si.GetBoolValue("GPU", "UseDebugDevice", false);
|
||||
gpu_use_debug_device_gpu_validation = si.GetBoolValue("GPU", "UseGPUBasedValidation", false);
|
||||
gpu_disable_shader_cache = si.GetBoolValue("GPU", "DisableShaderCache", false);
|
||||
gpu_disable_dual_source_blend = si.GetBoolValue("GPU", "DisableDualSourceBlend", false);
|
||||
gpu_disable_framebuffer_fetch = si.GetBoolValue("GPU", "DisableFramebufferFetch", false);
|
||||
@ -576,6 +577,7 @@ void Settings::Save(SettingsInterface& si, bool ignore_base) const
|
||||
if (!ignore_base)
|
||||
{
|
||||
si.SetBoolValue("GPU", "UseDebugDevice", gpu_use_debug_device);
|
||||
si.SetBoolValue("GPU", "UseGPUBasedValidation", gpu_use_debug_device_gpu_validation);
|
||||
si.SetBoolValue("GPU", "DisableShaderCache", gpu_disable_shader_cache);
|
||||
si.SetBoolValue("GPU", "DisableDualSourceBlend", gpu_disable_dual_source_blend);
|
||||
si.SetBoolValue("GPU", "DisableFramebufferFetch", gpu_disable_framebuffer_fetch);
|
||||
@ -1127,6 +1129,7 @@ bool Settings::AreGPUDeviceSettingsChanged(const Settings& old_settings) const
|
||||
{
|
||||
return (gpu_adapter != old_settings.gpu_adapter || gpu_use_thread != old_settings.gpu_use_thread ||
|
||||
gpu_use_debug_device != old_settings.gpu_use_debug_device ||
|
||||
gpu_use_debug_device_gpu_validation != old_settings.gpu_use_debug_device_gpu_validation ||
|
||||
gpu_disable_shader_cache != old_settings.gpu_disable_shader_cache ||
|
||||
gpu_disable_dual_source_blend != old_settings.gpu_disable_dual_source_blend ||
|
||||
gpu_disable_framebuffer_fetch != old_settings.gpu_disable_framebuffer_fetch ||
|
||||
|
@ -94,6 +94,7 @@ struct GPUSettings
|
||||
bool gpu_use_thread : 1 = true;
|
||||
bool gpu_use_software_renderer_for_readbacks : 1 = false;
|
||||
bool gpu_use_debug_device : 1 = false;
|
||||
bool gpu_use_debug_device_gpu_validation : 1 = false;
|
||||
bool gpu_disable_shader_cache : 1 = false;
|
||||
bool gpu_disable_dual_source_blend : 1 = false;
|
||||
bool gpu_disable_framebuffer_fetch : 1 = false;
|
||||
|
@ -310,6 +310,7 @@ GraphicsSettingsWidget::GraphicsSettingsWidget(SettingsWindow* dialog, QWidget*
|
||||
SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.gpuDumpFastReplayMode, "GPU", "DumpFastReplayMode", false);
|
||||
|
||||
SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.useDebugDevice, "GPU", "UseDebugDevice", false);
|
||||
SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.useGPUBasedValidation, "GPU", "UseGPUBasedValidation", false);
|
||||
SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.disableShaderCache, "GPU", "DisableShaderCache", false);
|
||||
SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.disableDualSource, "GPU", "DisableDualSourceBlend", false);
|
||||
SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.disableFramebufferFetch, "GPU", "DisableFramebufferFetch",
|
||||
@ -631,6 +632,9 @@ GraphicsSettingsWidget::GraphicsSettingsWidget(SettingsWindow* dialog, QWidget*
|
||||
dialog->registerWidgetHelp(
|
||||
m_ui.useDebugDevice, tr("Use Debug Device"), tr("Unchecked"),
|
||||
tr("Enable debugging when supported by the host's renderer API. <strong>Only for developer use.</strong>"));
|
||||
dialog->registerWidgetHelp(
|
||||
m_ui.useGPUBasedValidation, tr("Use GPU-Based Validation"), tr("Unchecked"),
|
||||
tr("Enable GPU-based validation when supported by the renderer API. <strong>Only for developer use.</strong>"));
|
||||
dialog->registerWidgetHelp(
|
||||
m_ui.disableShaderCache, tr("Disable Shader Cache"), tr("Unchecked"),
|
||||
tr("Forces shaders to be compiled for every run of the program. <strong>Only for developer use.</strong>"));
|
||||
|
@ -1350,6 +1350,20 @@
|
||||
<layout class="QFormLayout" name="formLayout_10">
|
||||
<item row="0" column="0" colspan="2">
|
||||
<layout class="QGridLayout" name="gridLayout_8">
|
||||
<item row="5" column="0">
|
||||
<widget class="QCheckBox" name="disableComputeShaders">
|
||||
<property name="text">
|
||||
<string>Disable Compute Shaders</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="0">
|
||||
<widget class="QCheckBox" name="disableDualSource">
|
||||
<property name="text">
|
||||
<string>Disable Dual-Source Blending</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="0">
|
||||
<widget class="QCheckBox" name="useDebugDevice">
|
||||
<property name="text">
|
||||
@ -1357,35 +1371,21 @@
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="0">
|
||||
<widget class="QCheckBox" name="disableTextureBuffers">
|
||||
<item row="4" column="0">
|
||||
<widget class="QCheckBox" name="disableMemoryImport">
|
||||
<property name="text">
|
||||
<string>Disable Texture Buffers</string>
|
||||
<string>Disable Memory Import</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<widget class="QCheckBox" name="disableDualSource">
|
||||
<item row="4" column="1">
|
||||
<widget class="QCheckBox" name="disableRasterOrderViews">
|
||||
<property name="text">
|
||||
<string>Disable Dual-Source Blending</string>
|
||||
<string>Disable Rasterizer Order Views</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
<widget class="QCheckBox" name="disableShaderCache">
|
||||
<property name="text">
|
||||
<string>Disable Shader Cache</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1">
|
||||
<widget class="QCheckBox" name="disableFramebufferFetch">
|
||||
<property name="text">
|
||||
<string>Disable Framebuffer Fetch</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="1">
|
||||
<item row="3" column="1">
|
||||
<widget class="QCheckBox" name="disableTextureCopyToSelf">
|
||||
<property name="text">
|
||||
<string>Disable Texture Copy To Self</string>
|
||||
@ -1393,33 +1393,40 @@
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="0">
|
||||
<widget class="QCheckBox" name="disableMemoryImport">
|
||||
<widget class="QCheckBox" name="disableTextureBuffers">
|
||||
<property name="text">
|
||||
<string>Disable Memory Import</string>
|
||||
<string>Disable Texture Buffers</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="1">
|
||||
<widget class="QCheckBox" name="disableRasterOrderViews">
|
||||
<item row="2" column="1">
|
||||
<widget class="QCheckBox" name="disableFramebufferFetch">
|
||||
<property name="text">
|
||||
<string>Disable Rasterizer Order Views</string>
|
||||
<string>Disable Framebuffer Fetch</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="0">
|
||||
<widget class="QCheckBox" name="disableComputeShaders">
|
||||
<property name="text">
|
||||
<string>Disable Compute Shaders</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="1">
|
||||
<item row="1" column="1">
|
||||
<widget class="QCheckBox" name="disableCompressedTextures">
|
||||
<property name="text">
|
||||
<string>Disable Compressed Textures</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<widget class="QCheckBox" name="disableShaderCache">
|
||||
<property name="text">
|
||||
<string>Disable Shader Cache</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
<widget class="QCheckBox" name="useGPUBasedValidation">
|
||||
<property name="text">
|
||||
<string>Use GPU-Based Validation</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
</layout>
|
||||
|
@ -186,10 +186,22 @@ bool D3D12Device::CreateDeviceAndMainSwapChain(std::string_view adapter, Feature
|
||||
if (m_debug_device)
|
||||
{
|
||||
ComPtr<ID3D12Debug> debug12;
|
||||
hr = D3D12GetDebugInterface(IID_PPV_ARGS(debug12.GetAddressOf()));
|
||||
if (SUCCEEDED(hr))
|
||||
if (SUCCEEDED(D3D12GetDebugInterface(IID_PPV_ARGS(debug12.GetAddressOf()))))
|
||||
{
|
||||
INFO_LOG("Enabling debug layer.");
|
||||
debug12->EnableDebugLayer();
|
||||
|
||||
ComPtr<ID3D12Debug1> debug12_1;
|
||||
if (SUCCEEDED(debug12.As(&debug12_1)))
|
||||
{
|
||||
INFO_LOG("Enabling GPU-based validation.");
|
||||
debug12_1->SetEnableGPUBasedValidation(true);
|
||||
}
|
||||
else
|
||||
{
|
||||
ERROR_LOG("GPU-based validation requested but not available.");
|
||||
m_debug_device_gpu_validation = false;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -449,11 +449,12 @@ GPUDevice::AdapterInfoList GPUDevice::GetAdapterListForAPI(RenderAPI api)
|
||||
|
||||
bool GPUDevice::Create(std::string_view adapter, FeatureMask disabled_features, std::string_view shader_dump_path,
|
||||
std::string_view shader_cache_path, u32 shader_cache_version, bool debug_device,
|
||||
const WindowInfo& wi, GPUVSyncMode vsync, bool allow_present_throttle,
|
||||
bool gpu_validation, const WindowInfo& wi, GPUVSyncMode vsync, bool allow_present_throttle,
|
||||
const ExclusiveFullscreenMode* exclusive_fullscreen_mode,
|
||||
std::optional<bool> exclusive_fullscreen_control, Error* error)
|
||||
{
|
||||
m_debug_device = debug_device;
|
||||
m_debug_device_gpu_validation = debug_device && gpu_validation;
|
||||
s_shader_dump_path = shader_dump_path;
|
||||
|
||||
INFO_LOG("Main render window is {}x{}.", wi.surface_width, wi.surface_height);
|
||||
|
@ -727,8 +727,9 @@ public:
|
||||
ALWAYS_INLINE bool IsGPUTimingEnabled() const { return m_gpu_timing_enabled; }
|
||||
|
||||
bool Create(std::string_view adapter, FeatureMask disabled_features, std::string_view shader_dump_path,
|
||||
std::string_view shader_cache_path, u32 shader_cache_version, bool debug_device, const WindowInfo& wi,
|
||||
GPUVSyncMode vsync, bool allow_present_throttle, const ExclusiveFullscreenMode* exclusive_fullscreen_mode,
|
||||
std::string_view shader_cache_path, u32 shader_cache_version, bool debug_device, bool gpu_validation,
|
||||
const WindowInfo& wi, GPUVSyncMode vsync, bool allow_present_throttle,
|
||||
const ExclusiveFullscreenMode* exclusive_fullscreen_mode,
|
||||
std::optional<bool> exclusive_fullscreen_control, Error* error);
|
||||
void Destroy();
|
||||
|
||||
@ -995,6 +996,7 @@ protected:
|
||||
|
||||
bool m_gpu_timing_enabled = false;
|
||||
bool m_debug_device = false;
|
||||
bool m_debug_device_gpu_validation = false;
|
||||
};
|
||||
|
||||
extern std::unique_ptr<GPUDevice> g_gpu_device;
|
||||
|
Loading…
x
Reference in New Issue
Block a user