mirror of
				https://git.suyu.dev/suyu/suyu
				synced 2025-11-03 16:39:01 -06:00 
			
		
		
		
	Merge pull request #4140 from ReinUsesLisp/validation-layers
renderer_vulkan: Update validation layer name and test before enabling
This commit is contained in:
		@@ -155,11 +155,31 @@ vk::Instance CreateInstance(Common::DynamicLibrary& library, vk::InstanceDispatc
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    static constexpr std::array layers_data{"VK_LAYER_LUNARG_standard_validation"};
 | 
			
		||||
    vk::Span<const char*> layers = layers_data;
 | 
			
		||||
    if (!enable_layers) {
 | 
			
		||||
        layers = {};
 | 
			
		||||
    std::vector<const char*> layers;
 | 
			
		||||
    layers.reserve(1);
 | 
			
		||||
    if (enable_layers) {
 | 
			
		||||
        layers.push_back("VK_LAYER_KHRONOS_validation");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    const std::optional layer_properties = vk::EnumerateInstanceLayerProperties(dld);
 | 
			
		||||
    if (!layer_properties) {
 | 
			
		||||
        LOG_ERROR(Render_Vulkan, "Failed to query layer properties, disabling layers");
 | 
			
		||||
        layers.clear();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    for (auto layer_it = layers.begin(); layer_it != layers.end();) {
 | 
			
		||||
        const char* const layer = *layer_it;
 | 
			
		||||
        const auto it = std::find_if(
 | 
			
		||||
            layer_properties->begin(), layer_properties->end(),
 | 
			
		||||
            [layer](const VkLayerProperties& prop) { return !std::strcmp(layer, prop.layerName); });
 | 
			
		||||
        if (it == layer_properties->end()) {
 | 
			
		||||
            LOG_ERROR(Render_Vulkan, "Layer {} not available, removing it", layer);
 | 
			
		||||
            layer_it = layers.erase(layer_it);
 | 
			
		||||
        } else {
 | 
			
		||||
            ++layer_it;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    vk::Instance instance = vk::Instance::Create(layers, extensions, dld);
 | 
			
		||||
    if (!instance) {
 | 
			
		||||
        LOG_ERROR(Render_Vulkan, "Failed to create Vulkan instance");
 | 
			
		||||
 
 | 
			
		||||
@@ -153,7 +153,8 @@ void Load(VkDevice device, DeviceDispatch& dld) noexcept {
 | 
			
		||||
 | 
			
		||||
bool Load(InstanceDispatch& dld) noexcept {
 | 
			
		||||
#define X(name) Proc(dld.name, dld, #name)
 | 
			
		||||
    return X(vkCreateInstance) && X(vkEnumerateInstanceExtensionProperties);
 | 
			
		||||
    return X(vkCreateInstance) && X(vkEnumerateInstanceExtensionProperties) &&
 | 
			
		||||
           X(vkEnumerateInstanceLayerProperties);
 | 
			
		||||
#undef X
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -770,4 +771,17 @@ std::optional<std::vector<VkExtensionProperties>> EnumerateInstanceExtensionProp
 | 
			
		||||
    return properties;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
std::optional<std::vector<VkLayerProperties>> EnumerateInstanceLayerProperties(
 | 
			
		||||
    const InstanceDispatch& dld) {
 | 
			
		||||
    u32 num;
 | 
			
		||||
    if (dld.vkEnumerateInstanceLayerProperties(&num, nullptr) != VK_SUCCESS) {
 | 
			
		||||
        return std::nullopt;
 | 
			
		||||
    }
 | 
			
		||||
    std::vector<VkLayerProperties> properties(num);
 | 
			
		||||
    if (dld.vkEnumerateInstanceLayerProperties(&num, properties.data()) != VK_SUCCESS) {
 | 
			
		||||
        return std::nullopt;
 | 
			
		||||
    }
 | 
			
		||||
    return properties;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // namespace Vulkan::vk
 | 
			
		||||
 
 | 
			
		||||
@@ -141,6 +141,7 @@ struct InstanceDispatch {
 | 
			
		||||
    PFN_vkCreateInstance vkCreateInstance;
 | 
			
		||||
    PFN_vkDestroyInstance vkDestroyInstance;
 | 
			
		||||
    PFN_vkEnumerateInstanceExtensionProperties vkEnumerateInstanceExtensionProperties;
 | 
			
		||||
    PFN_vkEnumerateInstanceLayerProperties vkEnumerateInstanceLayerProperties;
 | 
			
		||||
 | 
			
		||||
    PFN_vkCreateDebugUtilsMessengerEXT vkCreateDebugUtilsMessengerEXT;
 | 
			
		||||
    PFN_vkCreateDevice vkCreateDevice;
 | 
			
		||||
@@ -996,4 +997,7 @@ private:
 | 
			
		||||
std::optional<std::vector<VkExtensionProperties>> EnumerateInstanceExtensionProperties(
 | 
			
		||||
    const InstanceDispatch& dld);
 | 
			
		||||
 | 
			
		||||
std::optional<std::vector<VkLayerProperties>> EnumerateInstanceLayerProperties(
 | 
			
		||||
    const InstanceDispatch& dld);
 | 
			
		||||
 | 
			
		||||
} // namespace Vulkan::vk
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user