Flutter Engine
The Flutter Engine
vulkan_utilities.cc
Go to the documentation of this file.
1// Copyright 2013 The Flutter Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "vulkan_utilities.h"
6
7#include <algorithm>
8#include <unordered_set>
9
10#include "flutter/fml/build_config.h"
11
12namespace vulkan {
13
14// Whether to show Vulkan validation layer info messages in addition
15// to the error messages.
17 return false;
18}
19
21#if OS_FUCHSIA
22 return false;
23#endif
24 return true;
25}
26
27static std::vector<std::string> InstanceOrDeviceLayersToEnable(
28 const VulkanProcTable& vk,
29 VkPhysicalDevice physical_device,
30 bool enable_validation_layers) {
31 if (!enable_validation_layers) {
32 return {};
33 }
34
35 // NOTE: The loader is sensitive to the ordering here. Please do not rearrange
36 // this list.
37#if OS_FUCHSIA
38 // The other layers in the Fuchsia SDK seem to have a bug right now causing
39 // crashes, so it is only recommended that we use VK_LAYER_KHRONOS_validation
40 // until we have a confirmation that they are fixed.
41 const std::vector<std::string> candidates = {"VK_LAYER_KHRONOS_validation"};
42#else
43 const std::vector<std::string> candidates = {
44 "VK_LAYER_GOOGLE_threading", "VK_LAYER_LUNARG_parameter_validation",
45 "VK_LAYER_LUNARG_object_tracker", "VK_LAYER_LUNARG_core_validation",
46 "VK_LAYER_LUNARG_device_limits", "VK_LAYER_LUNARG_image",
47 "VK_LAYER_LUNARG_swapchain", "VK_LAYER_GOOGLE_unique_objects"};
48#endif
49
50 uint32_t count = 0;
51
53 if (VK_CALL_LOG_ERROR(vk.EnumerateInstanceLayerProperties(
54 &count, nullptr)) != VK_SUCCESS) {
55 return {};
56 }
57 } else {
58 if (VK_CALL_LOG_ERROR(vk.EnumerateDeviceLayerProperties(
59 physical_device, &count, nullptr)) != VK_SUCCESS) {
60 return {};
61 }
62 }
63
64 std::vector<VkLayerProperties> properties;
65 properties.resize(count);
66
68 if (VK_CALL_LOG_ERROR(vk.EnumerateInstanceLayerProperties(
69 &count, properties.data())) != VK_SUCCESS) {
70 return {};
71 }
72 } else {
73 if (VK_CALL_LOG_ERROR(vk.EnumerateDeviceLayerProperties(
74 physical_device, &count, properties.data())) != VK_SUCCESS) {
75 return {};
76 }
77 }
78
79 std::unordered_set<std::string> available_extensions;
80
81 for (size_t i = 0; i < count; i++) {
82 available_extensions.emplace(properties[i].layerName);
83 }
84
85 std::vector<std::string> available_candidates;
86
87 for (const auto& candidate : candidates) {
88 auto found = available_extensions.find(candidate);
89 if (found != available_extensions.end()) {
90 available_candidates.emplace_back(candidate);
91 }
92 }
93
94 return available_candidates;
95}
96
97std::vector<std::string> InstanceLayersToEnable(const VulkanProcTable& vk,
98 bool enable_validation_layers) {
100 enable_validation_layers);
101}
102
103std::vector<std::string> DeviceLayersToEnable(
104 const VulkanProcTable& vk,
106 bool enable_validation_layers) {
107 if (!physical_device) {
108 return {};
109 }
110
112 enable_validation_layers);
113}
114
115} // namespace vulkan
int count
Definition: FontMgrTest.cpp:50
VkPhysicalDevice physical_device
Definition: main.cc:51
vk
Definition: malisc.py:42
bool ValidationErrorsFatal()
std::vector< std::string > DeviceLayersToEnable(const VulkanProcTable &vk, const VulkanHandle< VkPhysicalDevice > &physical_device, bool enable_validation_layers)
static std::vector< std::string > InstanceOrDeviceLayersToEnable(const VulkanProcTable &vk, VkPhysicalDevice physical_device, bool enable_validation_layers)
std::vector< std::string > InstanceLayersToEnable(const VulkanProcTable &vk, bool enable_validation_layers)
bool ValidationLayerInfoMessagesEnabled()
@ VK_SUCCESS
Definition: vulkan_core.h:141
#define VK_NULL_HANDLE
Definition: vulkan_core.h:46
#define VK_CALL_LOG_ERROR(expression)