Index: gpu/vulkan/vulkan_device_queue.cc |
diff --git a/gpu/vulkan/vulkan_device_queue.cc b/gpu/vulkan/vulkan_device_queue.cc |
index eaaa66c1bd2e3116ab2d5e43969f3d47b0e4ae9f..17fc1a39e2c48466cc84f24f4f67591e052f6c66 100644 |
--- a/gpu/vulkan/vulkan_device_queue.cc |
+++ b/gpu/vulkan/vulkan_device_queue.cc |
@@ -4,6 +4,7 @@ |
#include "gpu/vulkan/vulkan_device_queue.h" |
+#include <unordered_set> |
#include <vector> |
#include "gpu/vulkan/vulkan_command_pool.h" |
@@ -29,18 +30,18 @@ bool VulkanDeviceQueue::Initialize(uint32_t options) { |
if (VK_NULL_HANDLE == vk_instance) |
return false; |
- VkResult status = VK_SUCCESS; |
+ VkResult result = VK_SUCCESS; |
uint32_t device_count = 0; |
- status = vkEnumeratePhysicalDevices(vk_instance, &device_count, nullptr); |
- if (VK_SUCCESS != status || device_count == 0) |
+ result = vkEnumeratePhysicalDevices(vk_instance, &device_count, nullptr); |
+ if (VK_SUCCESS != result || device_count == 0) |
return false; |
std::vector<VkPhysicalDevice> devices(device_count); |
- status = |
+ result = |
vkEnumeratePhysicalDevices(vk_instance, &device_count, devices.data()); |
- if (VK_SUCCESS != status) { |
- DLOG(ERROR) << "vkEnumeratePhysicalDevices() failed: " << status; |
+ if (VK_SUCCESS != result) { |
+ DLOG(ERROR) << "vkEnumeratePhysicalDevices() failed: " << result; |
return false; |
} |
@@ -104,16 +105,48 @@ bool VulkanDeviceQueue::Initialize(uint32_t options) { |
const char* device_extensions[] = {VK_KHR_SWAPCHAIN_EXTENSION_NAME}; |
+ std::vector<const char*> enabled_layer_names; |
+#if DCHECK_IS_ON() |
+ uint32_t num_device_layers = 0; |
+ result = vkEnumerateDeviceLayerProperties(vk_physical_device_, |
+ &num_device_layers, nullptr); |
+ if (VK_SUCCESS != result) { |
+ DLOG(ERROR) << "vkEnumerateDeviceLayerProperties(NULL) failed: " |
+ << result; |
+ return false; |
+ } |
+ |
+ std::vector<VkLayerProperties> device_layers(num_device_layers); |
+ result = vkEnumerateDeviceLayerProperties(vk_physical_device_, |
+ &num_device_layers, |
+ device_layers.data()); |
+ if (VK_SUCCESS != result) { |
+ DLOG(ERROR) << "vkEnumerateDeviceLayerProperties() failed: " << result; |
+ return false; |
+ } |
+ |
+ std::unordered_set<std::string> desired_layers({ |
+ "VK_LAYER_LUNARG_standard_validation", |
+ }); |
+ |
+ for (const VkLayerProperties& layer_property : device_layers) { |
+ if (desired_layers.find(layer_property.layerName) != desired_layers.end()) |
+ enabled_layer_names.push_back(layer_property.layerName); |
+ } |
+#endif |
+ |
VkDeviceCreateInfo device_create_info = {}; |
device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO; |
device_create_info.queueCreateInfoCount = 1; |
device_create_info.pQueueCreateInfos = &queue_create_info; |
+ device_create_info.enabledLayerCount = enabled_layer_names.size(); |
+ device_create_info.ppEnabledLayerNames = enabled_layer_names.data(); |
device_create_info.enabledExtensionCount = arraysize(device_extensions); |
device_create_info.ppEnabledExtensionNames = device_extensions; |
- status = vkCreateDevice(vk_physical_device_, &device_create_info, nullptr, |
+ result = vkCreateDevice(vk_physical_device_, &device_create_info, nullptr, |
&vk_device_); |
- if (VK_SUCCESS != status) |
+ if (VK_SUCCESS != result) |
return false; |
vkGetDeviceQueue(vk_device_, queue_index, 0, &vk_queue_); |