diff --git a/src/citra_qt/configuration/configure_debug.cpp b/src/citra_qt/configuration/configure_debug.cpp index 48a829afb..825bf608f 100644 --- a/src/citra_qt/configuration/configure_debug.cpp +++ b/src/citra_qt/configuration/configure_debug.cpp @@ -4,6 +4,7 @@ #include #include +#include #include "citra_qt/configuration/configure_debug.h" #include "citra_qt/debugger/console.h" #include "citra_qt/uisettings.h" @@ -11,7 +12,9 @@ #include "common/logging/log.h" #include "common/settings.h" #include "core/core.h" +#include "qcheckbox.h" #include "ui_configure_debug.h" +#include "video_core/renderer_vulkan/vk_instance.h" ConfigureDebug::ConfigureDebug(QWidget* parent) : QWidget(parent), ui(std::make_unique()) { @@ -23,6 +26,36 @@ ConfigureDebug::ConfigureDebug(QWidget* parent) QDesktopServices::openUrl(QUrl::fromLocalFile(path)); }); + connect(ui->toggle_renderer_debug, &QCheckBox::clicked, this, [this](bool checked) { + if (checked && Settings::values.graphics_api == Settings::GraphicsAPI::Vulkan) { + try { + Vulkan::Instance debug_inst{true}; + } catch (vk::LayerNotPresentError& err) { + ui->toggle_renderer_debug->toggle(); + QMessageBox::warning( + this, tr("Validation layer not available"), + tr("Unable to enable debug renderer because the layer " + "VK_LAYER_KHRONOS_validation is missing. " + "Please install the Vulkan SDK or the appropriate package of your distribution")); + } + } + }); + + connect(ui->toggle_dump_command_buffers, &QCheckBox::clicked, this, [this](bool checked) { + if (checked && Settings::values.graphics_api == Settings::GraphicsAPI::Vulkan) { + try { + Vulkan::Instance debug_inst{false, true}; + } catch (vk::LayerNotPresentError& err) { + ui->toggle_dump_command_buffers->toggle(); + QMessageBox::warning( + this, tr("Command buffer dumping not available"), + tr("Unable to enable command buffer dumping because the layer " + "VK_LAYER_LUNARG_api_dump is missing. " + "Please install the Vulkan SDK or the appropriate package of your distribution")); + } + } + }); + const bool is_powered_on = Core::System::GetInstance().IsPoweredOn(); ui->toggle_cpu_jit->setEnabled(!is_powered_on); ui->toggle_renderer_debug->setEnabled(!is_powered_on); diff --git a/src/citra_qt/configuration/configure_debug.h b/src/citra_qt/configuration/configure_debug.h index c0bae4c3e..898f81544 100644 --- a/src/citra_qt/configuration/configure_debug.h +++ b/src/citra_qt/configuration/configure_debug.h @@ -22,5 +22,6 @@ public: void RetranslateUI(); void SetConfiguration(); +private: std::unique_ptr ui; }; diff --git a/src/video_core/renderer_vulkan/vk_instance.cpp b/src/video_core/renderer_vulkan/vk_instance.cpp index b9abce254..f9d51487b 100644 --- a/src/video_core/renderer_vulkan/vk_instance.cpp +++ b/src/video_core/renderer_vulkan/vk_instance.cpp @@ -40,7 +40,7 @@ vk::Format ToVkFormat(VideoCore::PixelFormat format) { } } -Instance::Instance() { +Instance::Instance(bool validation, bool dump_command_buffers) { // Fetch instance independant function pointers auto vkGetInstanceProcAddr = dl.getProcAddress("vkGetInstanceProcAddr"); @@ -52,7 +52,19 @@ Instance::Instance() { .engineVersion = VK_MAKE_VERSION(1, 0, 0), .apiVersion = VK_API_VERSION_1_0}; - const vk::InstanceCreateInfo instance_info = {.pApplicationInfo = &application_info}; + u32 layer_count = 0; + std::array layers; + + if (validation) { + layers[layer_count++] = "VK_LAYER_KHRONOS_validation"; + } + if (dump_command_buffers) { + layers[layer_count++] = "VK_LAYER_LUNARG_api_dump"; + } + + const vk::InstanceCreateInfo instance_info = {.pApplicationInfo = &application_info, + .enabledLayerCount = layer_count, + .ppEnabledLayerNames = layers.data()}; instance = vk::createInstance(instance_info); diff --git a/src/video_core/renderer_vulkan/vk_instance.h b/src/video_core/renderer_vulkan/vk_instance.h index f01a2ff0a..4480d2b9b 100644 --- a/src/video_core/renderer_vulkan/vk_instance.h +++ b/src/video_core/renderer_vulkan/vk_instance.h @@ -31,7 +31,7 @@ struct FormatTraits { /// The global Vulkan instance class Instance { public: - Instance(); ///< Portable constructor used to query physical devices + Instance(bool validation = false, bool dump_command_buffers = false); Instance(Frontend::EmuWindow& window, u32 physical_device_index); ~Instance();