From 201cfae8c7684a88b6c0b52622d520efd14c1597 Mon Sep 17 00:00:00 2001 From: Kaushik Iska Date: Mon, 25 Nov 2019 16:09:56 -0800 Subject: [PATCH] [vulkan] Bundle vulkan validation layer so files (#13930) Enable vulkan validation for Fuchsia in debug mode as well. --- shell/platform/fuchsia/dart_runner/BUILD.gn | 2 +- shell/platform/fuchsia/flutter/BUILD.gn | 53 ++++++++++++++-- tools/fuchsia/fuchsia_archive.gni | 2 +- .../{common_libs.gni => fuchsia_libs.gni} | 63 +++++++++++++++++++ tools/gn | 7 +++ vulkan/config.gni | 12 ++++ vulkan/vulkan_utilities.cc | 4 +- 7 files changed, 135 insertions(+), 8 deletions(-) rename tools/fuchsia/{common_libs.gni => fuchsia_libs.gni} (50%) create mode 100644 vulkan/config.gni diff --git a/shell/platform/fuchsia/dart_runner/BUILD.gn b/shell/platform/fuchsia/dart_runner/BUILD.gn index 041ad0a8b4..735a5dbfab 100644 --- a/shell/platform/fuchsia/dart_runner/BUILD.gn +++ b/shell/platform/fuchsia/dart_runner/BUILD.gn @@ -6,9 +6,9 @@ assert(is_fuchsia) import("//build/fuchsia/sdk.gni") import("$flutter_root/common/fuchsia_config.gni") -import("$flutter_root/tools/fuchsia/common_libs.gni") import("$flutter_root/tools/fuchsia/dart.gni") import("$flutter_root/tools/fuchsia/fuchsia_archive.gni") +import("$flutter_root/tools/fuchsia/fuchsia_libs.gni") template("runner") { assert(defined(invoker.product), "The parameter 'product' must be defined") diff --git a/shell/platform/fuchsia/flutter/BUILD.gn b/shell/platform/fuchsia/flutter/BUILD.gn index 4b3855bba9..0549a1f753 100644 --- a/shell/platform/fuchsia/flutter/BUILD.gn +++ b/shell/platform/fuchsia/flutter/BUILD.gn @@ -8,9 +8,10 @@ import("//build/fuchsia/sdk.gni") import("$flutter_root/common/config.gni") import("$flutter_root/shell/gpu/gpu.gni") import("$flutter_root/testing/testing.gni") -import("$flutter_root/tools/fuchsia/common_libs.gni") import("$flutter_root/tools/fuchsia/dart.gni") import("$flutter_root/tools/fuchsia/fuchsia_archive.gni") +import("$flutter_root/tools/fuchsia/fuchsia_libs.gni") +import("$flutter_root/vulkan/config.gni") import("engine_flutter_runner.gni") shell_gpu_configuration("fuchsia_gpu_configuration") { @@ -38,8 +39,14 @@ if (!using_fuchsia_sdk) { flutter_runner("jit") { output_name = "flutter_jit_runner" product = false + + extra_defines = [] if (flutter_runtime_mode == "profile") { - extra_defines = [ "FLUTTER_PROFILE" ] + extra_defines += [ "FLUTTER_PROFILE" ] + } + + if (enable_vulkan_validation_layers) { + extra_defines += [ "VULKAN_VALIDATION_LAYERS_ENABLED" ] } extra_deps = [ @@ -51,8 +58,13 @@ flutter_runner("jit") { flutter_runner("jit_product") { output_name = "flutter_jit_product_runner" product = true + 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", @@ -62,9 +74,16 @@ flutter_runner("jit_product") { flutter_runner("aot") { output_name = "flutter_aot_runner" product = false + + extra_defines = [] if (flutter_runtime_mode == "profile") { - extra_defines = [ "FLUTTER_PROFILE" ] + 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", @@ -74,7 +93,13 @@ flutter_runner("aot") { flutter_runner("aot_product") { output_name = "flutter_aot_product_runner" product = true + 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", @@ -157,7 +182,16 @@ template("jit_runner") { }, ] - libraries = common_libs + _vulkan_icds = [] + _libs = common_libs + if (enable_vulkan_validation_layers) { + _libs += vulkan_validation_libs + _vulkan_icds += vulkan_icds + } + + resources += _vulkan_icds + + libraries = _libs meta = [ { @@ -215,7 +249,16 @@ template("aot_runner") { ] } - libraries = common_libs + _vulkan_icds = [] + _libs = common_libs + if (enable_vulkan_validation_layers) { + _libs += vulkan_validation_libs + _vulkan_icds += vulkan_icds + } + + resources += _vulkan_icds + + libraries = _libs meta = [ { diff --git a/tools/fuchsia/fuchsia_archive.gni b/tools/fuchsia/fuchsia_archive.gni index 3d0f0707fc..3b1da43978 100644 --- a/tools/fuchsia/fuchsia_archive.gni +++ b/tools/fuchsia/fuchsia_archive.gni @@ -2,8 +2,8 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. -import("$flutter_root/tools/fuchsia/common_libs.gni") import("$flutter_root/tools/fuchsia/fuchsia_debug_symbols.gni") +import("$flutter_root/tools/fuchsia/fuchsia_libs.gni") # Creates a Fuchsia archive (.far) file using PM from the Fuchsia SDK. template("fuchsia_archive") { diff --git a/tools/fuchsia/common_libs.gni b/tools/fuchsia/fuchsia_libs.gni similarity index 50% rename from tools/fuchsia/common_libs.gni rename to tools/fuchsia/fuchsia_libs.gni index a210961e37..76d2e80a6c 100644 --- a/tools/fuchsia/common_libs.gni +++ b/tools/fuchsia/fuchsia_libs.gni @@ -69,3 +69,66 @@ common_libs = [ "$clang_base/${clang_manifest_json.md5_beb70f40d525448b39ea87d9f5811e56}") }, ] + +vulkan_dist = "$fuchsia_sdk_base/dist" + +vulkan_validation_libs = [ + { + name = "VkLayer_core_validation.so" + path = rebase_path("$vulkan_dist") + }, + { + name = "VkLayer_khronos_validation.so" + path = rebase_path("$vulkan_dist") + }, + { + name = "VkLayer_object_lifetimes.so" + path = rebase_path("$vulkan_dist") + }, + { + name = "VkLayer_stateless_validation.so" + path = rebase_path("$vulkan_dist") + }, + { + name = "VkLayer_thread_safety.so" + path = rebase_path("$vulkan_dist") + }, + { + name = "VkLayer_unique_objects.so" + path = rebase_path("$vulkan_dist") + }, +] + +vulkan_data_dir = + "//fuchsia/sdk/linux/pkg/vulkan_layers/data/vulkan/explicit_layer.d" + +vulkan_icds = [ + { + path = rebase_path("$vulkan_data_dir/VkLayer_core_validation.json") + dest = "vulkan/explicit_layer.d/VkLayer_core_validation.json" + }, + { + path = rebase_path("$vulkan_data_dir/VkLayer_object_lifetimes.json") + dest = "vulkan/explicit_layer.d/VkLayer_object_lifetimes.json" + }, + { + path = rebase_path("$vulkan_data_dir/VkLayer_thread_safety.json") + dest = "vulkan/explicit_layer.d/VkLayer_thread_safety.json" + }, + { + path = rebase_path("$vulkan_data_dir/VkLayer_stateless_validation.json") + dest = "vulkan/explicit_layer.d/VkLayer_stateless_validation.json" + }, + { + path = rebase_path("$vulkan_data_dir/VkLayer_unique_objects.json") + dest = "vulkan/explicit_layer.d/VkLayer_unique_objects.json" + }, + { + path = rebase_path("$vulkan_data_dir/VkLayer_khronos_validation.json") + dest = "vulkan/explicit_layer.d/VkLayer_khronos_validation.json" + }, + { + path = rebase_path("$vulkan_data_dir/VkLayer_standard_validation.json") + dest = "vulkan/explicit_layer.d/VkLayer_standard_validation.json" + }, +] diff --git a/tools/gn b/tools/gn index 5975392a8a..a6ee544584 100755 --- a/tools/gn +++ b/tools/gn @@ -268,6 +268,12 @@ def to_gn_args(args): if args.ubsan: gn_args['is_ubsan'] = True + if args.enable_vulkan_validation_layers: + if args.target_os is not 'fuchsia': + print('Vulkan validation layers are currently only supported on Fuchsia targets.') + sys.exit(1) + gn_args['enable_vulkan_validation_layers'] = True + return gn_args def parse_args(args): @@ -316,6 +322,7 @@ def parse_args(args): parser.add_argument('--enable-fontconfig', action='store_true', default=False) parser.add_argument('--enable-skshaper', action='store_true', default=False) + parser.add_argument('--enable-vulkan-validation-layers', action='store_true', default=False) parser.add_argument('--embedder-for-target', dest='embedder_for_target', action='store_true', default=False) diff --git a/vulkan/config.gni b/vulkan/config.gni new file mode 100644 index 0000000000..08ccbab720 --- /dev/null +++ b/vulkan/config.gni @@ -0,0 +1,12 @@ +# Copyright 2013 The Flutter Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +declare_args() { + # Whether to include vulkan validation layers, if available. + # + # Currently these are only supported on Fuchsia, where by default they are + # disabled, to enable them pass `--enable-vulkan-validation-layers` to your + # gn args. + enable_vulkan_validation_layers = false +} diff --git a/vulkan/vulkan_utilities.cc b/vulkan/vulkan_utilities.cc index 6d952777a6..d02602104e 100644 --- a/vulkan/vulkan_utilities.cc +++ b/vulkan/vulkan_utilities.cc @@ -3,6 +3,7 @@ // found in the LICENSE file. #include "flutter/vulkan/vulkan_utilities.h" +#include "flutter/fml/build_config.h" #include #include @@ -12,6 +13,8 @@ namespace vulkan { bool IsDebuggingEnabled() { #ifndef NDEBUG return true; +#elif defined(VULKAN_VALIDATION_LAYERS_ENABLED) + return true; #else return false; #endif @@ -27,7 +30,6 @@ bool ValidationErrorsFatal() { #if OS_FUCHSIA return false; #endif - return true; } -- GitLab