From 56bdcec5ae6bfdd6bfc5dfafdc2e84b1164299ba Mon Sep 17 00:00:00 2001 From: George Wright Date: Fri, 17 Apr 2020 13:00:02 -0700 Subject: [PATCH] Enable Vulkan validation layers for shell_test (flutter/engine#17684) --- engine/src/flutter/shell/common/BUILD.gn | 6 +++++ .../common/shell_test_platform_view_vulkan.cc | 4 ++- .../shell/platform/fuchsia/flutter/BUILD.gn | 16 ----------- .../flutter/tools/fuchsia/fuchsia_archive.gni | 4 +++ .../src/flutter/vulkan/vulkan_application.cc | 16 +++++++---- .../src/flutter/vulkan/vulkan_application.h | 4 ++- .../src/flutter/vulkan/vulkan_debug_report.cc | 3 +-- engine/src/flutter/vulkan/vulkan_device.cc | 9 ++++--- engine/src/flutter/vulkan/vulkan_device.h | 4 ++- engine/src/flutter/vulkan/vulkan_utilities.cc | 27 ++++++++----------- engine/src/flutter/vulkan/vulkan_utilities.h | 7 ++--- 11 files changed, 52 insertions(+), 48 deletions(-) diff --git a/engine/src/flutter/shell/common/BUILD.gn b/engine/src/flutter/shell/common/BUILD.gn index 3fab3317b09..0cb5ba2b70f 100644 --- a/engine/src/flutter/shell/common/BUILD.gn +++ b/engine/src/flutter/shell/common/BUILD.gn @@ -5,6 +5,7 @@ import("//flutter/common/config.gni") import("//flutter/shell/gpu/gpu.gni") import("//flutter/testing/testing.gni") +import("//flutter/vulkan/config.gni") if (is_fuchsia) { import("//build/fuchsia/sdk.gni") @@ -267,6 +268,11 @@ if (enable_unittests) { dest = "assets/shelltest_screenshot.png" }, ] + + if (test_enable_vulkan) { + libraries = vulkan_validation_libs + resources += vulkan_icds + } } } diff --git a/engine/src/flutter/shell/common/shell_test_platform_view_vulkan.cc b/engine/src/flutter/shell/common/shell_test_platform_view_vulkan.cc index 3ed4193aa25..7c916567897 100644 --- a/engine/src/flutter/shell/common/shell_test_platform_view_vulkan.cc +++ b/engine/src/flutter/shell/common/shell_test_platform_view_vulkan.cc @@ -3,6 +3,7 @@ // found in the LICENSE file. #include "flutter/shell/common/shell_test_platform_view_vulkan.h" +#include "flutter/vulkan/vulkan_utilities.h" namespace flutter { namespace testing { @@ -65,7 +66,8 @@ ShellTestPlatformViewVulkan::OffScreenSurface::OffScreenSurface( }; application_ = std::make_unique( - *vk_, "FlutterTest", std::move(extensions)); + *vk_, "FlutterTest", std::move(extensions), VK_MAKE_VERSION(1, 0, 0), + VK_MAKE_VERSION(1, 1, 0), true); if (!application_->IsValid() || !vk_->AreInstanceProcsSetup()) { // Make certain the application instance was created and it setup the diff --git a/engine/src/flutter/shell/platform/fuchsia/flutter/BUILD.gn b/engine/src/flutter/shell/platform/fuchsia/flutter/BUILD.gn index bd4da2779d5..4952d6f81b6 100644 --- a/engine/src/flutter/shell/platform/fuchsia/flutter/BUILD.gn +++ b/engine/src/flutter/shell/platform/fuchsia/flutter/BUILD.gn @@ -34,10 +34,6 @@ flutter_runner("jit") { extra_defines += [ "FLUTTER_PROFILE" ] } - if (enable_vulkan_validation_layers) { - extra_defines += [ "VULKAN_VALIDATION_LAYERS_ENABLED" ] - } - extra_deps = [ "//third_party/dart/runtime:libdart_jit", "//third_party/dart/runtime/platform:libdart_platform_jit", @@ -50,10 +46,6 @@ flutter_runner("jit_product") { extra_defines = [ "DART_PRODUCT" ] - if (enable_vulkan_validation_layers) { - extra_defines += [ "VULKAN_VALIDATION_LAYERS_ENABLED" ] - } - extra_deps = [ "//third_party/dart/runtime:libdart_jit_product", "//third_party/dart/runtime/platform:libdart_platform_jit_product", @@ -69,10 +61,6 @@ flutter_runner("aot") { extra_defines += [ "FLUTTER_PROFILE" ] } - if (enable_vulkan_validation_layers) { - extra_defines += [ "VULKAN_VALIDATION_LAYERS_ENABLED" ] - } - extra_deps = [ "//third_party/dart/runtime:libdart_precompiled_runtime", "//third_party/dart/runtime/platform:libdart_platform_precompiled_runtime", @@ -85,10 +73,6 @@ flutter_runner("aot_product") { extra_defines = [ "DART_PRODUCT" ] - if (enable_vulkan_validation_layers) { - extra_defines += [ "VULKAN_VALIDATION_LAYERS_ENABLED" ] - } - extra_deps = [ "//third_party/dart/runtime:libdart_precompiled_runtime_product", "//third_party/dart/runtime/platform:libdart_platform_precompiled_runtime_product", diff --git a/engine/src/flutter/tools/fuchsia/fuchsia_archive.gni b/engine/src/flutter/tools/fuchsia/fuchsia_archive.gni index 02d5fe3012d..32d8f1215f2 100644 --- a/engine/src/flutter/tools/fuchsia/fuchsia_archive.gni +++ b/engine/src/flutter/tools/fuchsia/fuchsia_archive.gni @@ -143,6 +143,10 @@ template("fuchsia_test_archive") { resources = invoker.resources } + if (defined(invoker.libraries)) { + libraries += invoker.libraries + } + meta_dir = "//flutter/testing/fuchsia/meta" cmx_file = "$meta_dir/fuchsia_test.cmx" } diff --git a/engine/src/flutter/vulkan/vulkan_application.cc b/engine/src/flutter/vulkan/vulkan_application.cc index 87c194ad7ee..755255408d9 100644 --- a/engine/src/flutter/vulkan/vulkan_application.cc +++ b/engine/src/flutter/vulkan/vulkan_application.cc @@ -18,13 +18,17 @@ VulkanApplication::VulkanApplication( const std::string& application_name, std::vector enabled_extensions, uint32_t application_version, - uint32_t api_version) - : vk(p_vk), api_version_(api_version), valid_(false) { + uint32_t api_version, + bool enable_validation_layers) + : vk(p_vk), + api_version_(api_version), + valid_(false), + enable_validation_layers_(enable_validation_layers) { // Check if we want to enable debugging. std::vector supported_extensions = GetSupportedInstanceExtensions(vk); bool enable_instance_debugging = - IsDebuggingEnabled() && + enable_validation_layers_ && ExtensionSupported(supported_extensions, VulkanDebugReport::DebugExtensionName()); @@ -54,7 +58,8 @@ VulkanApplication::VulkanApplication( // Configure layers. - const std::vector enabled_layers = InstanceLayersToEnable(vk); + const std::vector enabled_layers = + InstanceLayersToEnable(vk, enable_validation_layers_); const char* layers[enabled_layers.size()]; @@ -172,7 +177,8 @@ std::vector VulkanApplication::GetPhysicalDevices() const { std::unique_ptr VulkanApplication::AcquireFirstCompatibleLogicalDevice() const { for (auto device_handle : GetPhysicalDevices()) { - auto logical_device = std::make_unique(vk, device_handle); + auto logical_device = std::make_unique( + vk, device_handle, enable_validation_layers_); if (logical_device->IsValid()) { return logical_device; } diff --git a/engine/src/flutter/vulkan/vulkan_application.h b/engine/src/flutter/vulkan/vulkan_application.h index fd2e7994efd..b610a100119 100644 --- a/engine/src/flutter/vulkan/vulkan_application.h +++ b/engine/src/flutter/vulkan/vulkan_application.h @@ -28,7 +28,8 @@ class VulkanApplication { const std::string& application_name, std::vector enabled_extensions, uint32_t application_version = VK_MAKE_VERSION(1, 0, 0), - uint32_t api_version = VK_MAKE_VERSION(1, 0, 0)); + uint32_t api_version = VK_MAKE_VERSION(1, 0, 0), + bool enable_validation_layers = false); ~VulkanApplication(); @@ -48,6 +49,7 @@ class VulkanApplication { uint32_t api_version_; std::unique_ptr debug_report_; bool valid_; + bool enable_validation_layers_; std::vector GetPhysicalDevices() const; std::vector GetSupportedInstanceExtensions( diff --git a/engine/src/flutter/vulkan/vulkan_debug_report.cc b/engine/src/flutter/vulkan/vulkan_debug_report.cc index bd8f36ff46f..3dd88ea4b8e 100644 --- a/engine/src/flutter/vulkan/vulkan_debug_report.cc +++ b/engine/src/flutter/vulkan/vulkan_debug_report.cc @@ -182,8 +182,7 @@ VulkanDebugReport::VulkanDebugReport( const VulkanProcTable& p_vk, const VulkanHandle& application) : vk(p_vk), application_(application), valid_(false) { - if (!IsDebuggingEnabled() || !vk.CreateDebugReportCallbackEXT || - !vk.DestroyDebugReportCallbackEXT) { + if (!vk.CreateDebugReportCallbackEXT || !vk.DestroyDebugReportCallbackEXT) { return; } diff --git a/engine/src/flutter/vulkan/vulkan_device.cc b/engine/src/flutter/vulkan/vulkan_device.cc index 7527dae5f17..e57e4adcefc 100644 --- a/engine/src/flutter/vulkan/vulkan_device.cc +++ b/engine/src/flutter/vulkan/vulkan_device.cc @@ -30,11 +30,13 @@ static uint32_t FindGraphicsQueueIndex( } VulkanDevice::VulkanDevice(VulkanProcTable& p_vk, - VulkanHandle physical_device) + VulkanHandle physical_device, + bool enable_validation_layers) : vk(p_vk), physical_device_(std::move(physical_device)), graphics_queue_index_(std::numeric_limits::max()), - valid_(false) { + valid_(false), + enable_validation_layers_(enable_validation_layers) { if (!physical_device_ || !vk.AreInstanceProcsSetup()) { return; } @@ -69,7 +71,8 @@ VulkanDevice::VulkanDevice(VulkanProcTable& p_vk, #endif }; - auto enabled_layers = DeviceLayersToEnable(vk, physical_device_); + auto enabled_layers = + DeviceLayersToEnable(vk, physical_device_, enable_validation_layers_); const char* layers[enabled_layers.size()]; diff --git a/engine/src/flutter/vulkan/vulkan_device.h b/engine/src/flutter/vulkan/vulkan_device.h index 211e5801f4e..4869d94386e 100644 --- a/engine/src/flutter/vulkan/vulkan_device.h +++ b/engine/src/flutter/vulkan/vulkan_device.h @@ -19,7 +19,8 @@ class VulkanSurface; class VulkanDevice { public: VulkanDevice(VulkanProcTable& vk, - VulkanHandle physical_device); + VulkanHandle physical_device, + bool enable_validation_layers); ~VulkanDevice(); @@ -71,6 +72,7 @@ class VulkanDevice { VulkanHandle command_pool_; uint32_t graphics_queue_index_; bool valid_; + bool enable_validation_layers_; std::vector GetQueueFamilyProperties() const; diff --git a/engine/src/flutter/vulkan/vulkan_utilities.cc b/engine/src/flutter/vulkan/vulkan_utilities.cc index 61de451afa2..80da602eb6a 100644 --- a/engine/src/flutter/vulkan/vulkan_utilities.cc +++ b/engine/src/flutter/vulkan/vulkan_utilities.cc @@ -10,16 +10,6 @@ namespace vulkan { -bool IsDebuggingEnabled() { -#ifndef NDEBUG - return true; -#elif defined(VULKAN_VALIDATION_LAYERS_ENABLED) - return true; -#else - return false; -#endif -} - // Whether to show Vulkan validation layer info messages in addition // to the error messages. bool ValidationLayerInfoMessagesEnabled() { @@ -35,8 +25,9 @@ bool ValidationErrorsFatal() { static std::vector InstanceOrDeviceLayersToEnable( const VulkanProcTable& vk, - VkPhysicalDevice physical_device) { - if (!IsDebuggingEnabled()) { + VkPhysicalDevice physical_device, + bool enable_validation_layers) { + if (!enable_validation_layers) { return {}; } @@ -102,18 +93,22 @@ static std::vector InstanceOrDeviceLayersToEnable( return available_candidates; } -std::vector InstanceLayersToEnable(const VulkanProcTable& vk) { - return InstanceOrDeviceLayersToEnable(vk, VK_NULL_HANDLE); +std::vector InstanceLayersToEnable(const VulkanProcTable& vk, + bool enable_validation_layers) { + return InstanceOrDeviceLayersToEnable(vk, VK_NULL_HANDLE, + enable_validation_layers); } std::vector DeviceLayersToEnable( const VulkanProcTable& vk, - const VulkanHandle& physical_device) { + const VulkanHandle& physical_device, + bool enable_validation_layers) { if (!physical_device) { return {}; } - return InstanceOrDeviceLayersToEnable(vk, physical_device); + return InstanceOrDeviceLayersToEnable(vk, physical_device, + enable_validation_layers); } } // namespace vulkan diff --git a/engine/src/flutter/vulkan/vulkan_utilities.h b/engine/src/flutter/vulkan/vulkan_utilities.h index 2e071075a26..a12acd60a93 100644 --- a/engine/src/flutter/vulkan/vulkan_utilities.h +++ b/engine/src/flutter/vulkan/vulkan_utilities.h @@ -14,15 +14,16 @@ namespace vulkan { -bool IsDebuggingEnabled(); bool ValidationLayerInfoMessagesEnabled(); bool ValidationErrorsFatal(); -std::vector InstanceLayersToEnable(const VulkanProcTable& vk); +std::vector InstanceLayersToEnable(const VulkanProcTable& vk, + bool enable_validation_layers); std::vector DeviceLayersToEnable( const VulkanProcTable& vk, - const VulkanHandle& physical_device); + const VulkanHandle& physical_device, + bool enable_validation_layers); } // namespace vulkan