Merge pull request #9536 from liamwhite/debug-utils
vulkan_common: unify VK_EXT_debug_utils and selection of validation layer
This commit is contained in:
		@@ -98,7 +98,7 @@ RendererVulkan::RendererVulkan(Core::TelemetrySession& telemetry_session_,
 | 
			
		||||
    : RendererBase(emu_window, std::move(context_)), telemetry_session(telemetry_session_),
 | 
			
		||||
      cpu_memory(cpu_memory_), gpu(gpu_), library(OpenLibrary()),
 | 
			
		||||
      instance(CreateInstance(library, dld, VK_API_VERSION_1_1, render_window.GetWindowInfo().type,
 | 
			
		||||
                              true, Settings::values.renderer_debug.GetValue())),
 | 
			
		||||
                              Settings::values.renderer_debug.GetValue())),
 | 
			
		||||
      debug_callback(Settings::values.renderer_debug ? CreateDebugCallback(instance) : nullptr),
 | 
			
		||||
      surface(CreateSurface(instance, render_window)),
 | 
			
		||||
      device(CreateDevice(instance, dld, *surface)), memory_allocator(device, false),
 | 
			
		||||
 
 | 
			
		||||
@@ -32,7 +32,7 @@
 | 
			
		||||
namespace Vulkan {
 | 
			
		||||
namespace {
 | 
			
		||||
[[nodiscard]] std::vector<const char*> RequiredExtensions(
 | 
			
		||||
    Core::Frontend::WindowSystemType window_type, bool enable_debug_utils) {
 | 
			
		||||
    Core::Frontend::WindowSystemType window_type, bool enable_validation) {
 | 
			
		||||
    std::vector<const char*> extensions;
 | 
			
		||||
    extensions.reserve(6);
 | 
			
		||||
    switch (window_type) {
 | 
			
		||||
@@ -65,7 +65,7 @@ namespace {
 | 
			
		||||
    if (window_type != Core::Frontend::WindowSystemType::Headless) {
 | 
			
		||||
        extensions.push_back(VK_KHR_SURFACE_EXTENSION_NAME);
 | 
			
		||||
    }
 | 
			
		||||
    if (enable_debug_utils) {
 | 
			
		||||
    if (enable_validation) {
 | 
			
		||||
        extensions.push_back(VK_EXT_DEBUG_UTILS_EXTENSION_NAME);
 | 
			
		||||
    }
 | 
			
		||||
    extensions.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
 | 
			
		||||
@@ -95,9 +95,9 @@ namespace {
 | 
			
		||||
    return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
[[nodiscard]] std::vector<const char*> Layers(bool enable_layers) {
 | 
			
		||||
[[nodiscard]] std::vector<const char*> Layers(bool enable_validation) {
 | 
			
		||||
    std::vector<const char*> layers;
 | 
			
		||||
    if (enable_layers) {
 | 
			
		||||
    if (enable_validation) {
 | 
			
		||||
        layers.push_back("VK_LAYER_KHRONOS_validation");
 | 
			
		||||
    }
 | 
			
		||||
    return layers;
 | 
			
		||||
@@ -125,7 +125,7 @@ void RemoveUnavailableLayers(const vk::InstanceDispatch& dld, std::vector<const
 | 
			
		||||
 | 
			
		||||
vk::Instance CreateInstance(const Common::DynamicLibrary& library, vk::InstanceDispatch& dld,
 | 
			
		||||
                            u32 required_version, Core::Frontend::WindowSystemType window_type,
 | 
			
		||||
                            bool enable_debug_utils, bool enable_layers) {
 | 
			
		||||
                            bool enable_validation) {
 | 
			
		||||
    if (!library.IsOpen()) {
 | 
			
		||||
        LOG_ERROR(Render_Vulkan, "Vulkan library not available");
 | 
			
		||||
        throw vk::Exception(VK_ERROR_INITIALIZATION_FAILED);
 | 
			
		||||
@@ -138,11 +138,11 @@ vk::Instance CreateInstance(const Common::DynamicLibrary& library, vk::InstanceD
 | 
			
		||||
        LOG_ERROR(Render_Vulkan, "Failed to load Vulkan function pointers");
 | 
			
		||||
        throw vk::Exception(VK_ERROR_INITIALIZATION_FAILED);
 | 
			
		||||
    }
 | 
			
		||||
    const std::vector<const char*> extensions = RequiredExtensions(window_type, enable_debug_utils);
 | 
			
		||||
    const std::vector<const char*> extensions = RequiredExtensions(window_type, enable_validation);
 | 
			
		||||
    if (!AreExtensionsSupported(dld, extensions)) {
 | 
			
		||||
        throw vk::Exception(VK_ERROR_EXTENSION_NOT_PRESENT);
 | 
			
		||||
    }
 | 
			
		||||
    std::vector<const char*> layers = Layers(enable_layers);
 | 
			
		||||
    std::vector<const char*> layers = Layers(enable_validation);
 | 
			
		||||
    RemoveUnavailableLayers(dld, layers);
 | 
			
		||||
 | 
			
		||||
    const u32 available_version = vk::AvailableVersion(dld);
 | 
			
		||||
 
 | 
			
		||||
@@ -17,8 +17,7 @@ namespace Vulkan {
 | 
			
		||||
 * @param dld                Dispatch table to load function pointers into
 | 
			
		||||
 * @param required_version   Required Vulkan version (for example, VK_API_VERSION_1_1)
 | 
			
		||||
 * @param window_type        Window system type's enabled extension
 | 
			
		||||
 * @param enable_debug_utils Whether to enable VK_EXT_debug_utils_extension_name or not
 | 
			
		||||
 * @param enable_layers      Whether to enable Vulkan validation layers or not
 | 
			
		||||
 * @param enable_validation  Whether to enable Vulkan validation layers or not
 | 
			
		||||
 *
 | 
			
		||||
 * @return A new Vulkan instance
 | 
			
		||||
 * @throw vk::Exception on failure
 | 
			
		||||
@@ -26,6 +25,6 @@ namespace Vulkan {
 | 
			
		||||
[[nodiscard]] vk::Instance CreateInstance(
 | 
			
		||||
    const Common::DynamicLibrary& library, vk::InstanceDispatch& dld, u32 required_version,
 | 
			
		||||
    Core::Frontend::WindowSystemType window_type = Core::Frontend::WindowSystemType::Headless,
 | 
			
		||||
    bool enable_debug_utils = false, bool enable_layers = false);
 | 
			
		||||
    bool enable_validation = false);
 | 
			
		||||
 | 
			
		||||
} // namespace Vulkan
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user