Skip to content

Commit b8fc6b7

Browse files
authored
Vulkan: Enable Fuchsia memory extensions on initialization. (flutter#4301)
Refactor querying of supported Vulkan extensions.
1 parent afd4229 commit b8fc6b7

File tree

5 files changed

+60
-42
lines changed

5 files changed

+60
-42
lines changed

vulkan/vulkan_application.cc

Lines changed: 53 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,15 +21,25 @@ VulkanApplication::VulkanApplication(
2121
uint32_t api_version)
2222
: vk(p_vk), api_version_(api_version), valid_(false) {
2323
// Check if we want to enable debugging.
24-
24+
std::vector<VkExtensionProperties> supported_extensions =
25+
GetSupportedInstanceExtensions(vk);
2526
bool enable_instance_debugging =
26-
IsDebuggingEnabled() && VulkanDebugReport::DebugExtensionSupported(vk);
27+
IsDebuggingEnabled() &&
28+
ExtensionSupported(supported_extensions,
29+
VulkanDebugReport::DebugExtensionName());
2730

2831
// Configure extensions.
2932

3033
if (enable_instance_debugging) {
3134
enabled_extensions.emplace_back(VulkanDebugReport::DebugExtensionName());
3235
}
36+
#if OS_FUCHSIA
37+
if (ExtensionSupported(supported_extensions,
38+
VK_KHR_EXTERNAL_MEMORY_CAPABILITIES_EXTENSION_NAME)) {
39+
enabled_extensions.emplace_back(
40+
VK_KHR_EXTERNAL_MEMORY_CAPABILITIES_EXTENSION_NAME);
41+
}
42+
#endif
3343

3444
const char* extensions[enabled_extensions.size()];
3545

@@ -166,4 +176,45 @@ VulkanApplication::AcquireFirstCompatibleLogicalDevice() const {
166176
return nullptr;
167177
}
168178

179+
std::vector<VkExtensionProperties>
180+
VulkanApplication::GetSupportedInstanceExtensions(
181+
const VulkanProcTable& vk) const {
182+
if (!vk.EnumerateInstanceExtensionProperties) {
183+
return std::vector<VkExtensionProperties>();
184+
}
185+
186+
uint32_t count = 0;
187+
if (VK_CALL_LOG_ERROR(vk.EnumerateInstanceExtensionProperties(
188+
nullptr, &count, nullptr)) != VK_SUCCESS) {
189+
return std::vector<VkExtensionProperties>();
190+
}
191+
192+
if (count == 0) {
193+
return std::vector<VkExtensionProperties>();
194+
}
195+
196+
std::vector<VkExtensionProperties> properties;
197+
properties.resize(count);
198+
if (VK_CALL_LOG_ERROR(vk.EnumerateInstanceExtensionProperties(
199+
nullptr, &count, properties.data())) != VK_SUCCESS) {
200+
return std::vector<VkExtensionProperties>();
201+
}
202+
203+
return properties;
204+
}
205+
206+
bool VulkanApplication::ExtensionSupported(
207+
const std::vector<VkExtensionProperties>& supported_instance_extensions,
208+
std::string extension_name) {
209+
uint32_t count = supported_instance_extensions.size();
210+
for (size_t i = 0; i < count; i++) {
211+
if (strncmp(supported_instance_extensions[i].extensionName,
212+
extension_name.c_str(), extension_name.size()) == 0) {
213+
return true;
214+
}
215+
}
216+
217+
return false;
218+
}
219+
169220
} // namespace vulkan

vulkan/vulkan_application.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,11 @@ class VulkanApplication {
5050
bool valid_;
5151

5252
std::vector<VkPhysicalDevice> GetPhysicalDevices() const;
53+
std::vector<VkExtensionProperties> GetSupportedInstanceExtensions(
54+
const VulkanProcTable& vk) const;
55+
bool ExtensionSupported(
56+
const std::vector<VkExtensionProperties>& supported_extensions,
57+
std::string extension_name);
5358

5459
FXL_DISALLOW_COPY_AND_ASSIGN(VulkanApplication);
5560
};

vulkan/vulkan_debug_report.cc

Lines changed: 0 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -22,44 +22,6 @@ std::string VulkanDebugReport::DebugExtensionName() {
2222
return VK_EXT_DEBUG_REPORT_EXTENSION_NAME;
2323
}
2424

25-
bool VulkanDebugReport::DebugExtensionSupported(const VulkanProcTable& vk) {
26-
if (!IsDebuggingEnabled()) {
27-
return false;
28-
}
29-
30-
if (!vk.EnumerateInstanceExtensionProperties) {
31-
return false;
32-
}
33-
34-
uint32_t count = 0;
35-
if (VK_CALL_LOG_ERROR(vk.EnumerateInstanceExtensionProperties(
36-
nullptr, &count, nullptr)) != VK_SUCCESS) {
37-
return false;
38-
}
39-
40-
if (count == 0) {
41-
return false;
42-
}
43-
44-
std::vector<VkExtensionProperties> properties;
45-
properties.resize(count);
46-
if (VK_CALL_LOG_ERROR(vk.EnumerateInstanceExtensionProperties(
47-
nullptr, &count, properties.data())) != VK_SUCCESS) {
48-
return false;
49-
}
50-
51-
auto debug_extension_name = DebugExtensionName();
52-
53-
for (size_t i = 0; i < count; i++) {
54-
if (strncmp(properties[i].extensionName, debug_extension_name.c_str(),
55-
debug_extension_name.size()) == 0) {
56-
return true;
57-
}
58-
}
59-
60-
return false;
61-
}
62-
6325
static const char* VkDebugReportFlagsEXTToString(VkDebugReportFlagsEXT flags) {
6426
if (flags & VK_DEBUG_REPORT_INFORMATION_BIT_EXT) {
6527
return "Information";

vulkan/vulkan_debug_report.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,6 @@ namespace vulkan {
1414

1515
class VulkanDebugReport {
1616
public:
17-
static bool DebugExtensionSupported(const VulkanProcTable& vk);
18-
1917
static std::string DebugExtensionName();
2018

2119
VulkanDebugReport(const VulkanProcTable& vk,

vulkan/vulkan_device.cc

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,8 @@ VulkanDevice::VulkanDevice(VulkanProcTable& p_vk,
6161
const char* extensions[] = {
6262
VK_KHR_SWAPCHAIN_EXTENSION_NAME,
6363
#if OS_FUCHSIA
64+
VK_KHR_EXTERNAL_MEMORY_EXTENSION_NAME,
65+
VK_KHR_EXTERNAL_MEMORY_FUCHSIA_EXTENSION_NAME,
6466
VK_KHR_EXTERNAL_SEMAPHORE_EXTENSION_NAME,
6567
VK_KHR_EXTERNAL_SEMAPHORE_FUCHSIA_EXTENSION_NAME,
6668
#endif

0 commit comments

Comments
 (0)