diff --git a/shell/platform/fuchsia/dart_runner/BUILD.gn b/shell/platform/fuchsia/dart_runner/BUILD.gn index 041ad0a8b48d3a26ac8602867e1e97d52ff85608..735a5dbfab716c783fdb3752c4b8e1b5a8a148e7 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 4b3855bba99557a69503ea6d34da0d74a608890c..0549a1f75352cdb8fc822ada1550da012064d146 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 3d0f0707fc9e57fca7b0ac1b1c0154de38426d3d..3b1da4397894c556570dfe4edbea6fb1b8b0de4a 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 a210961e37a0eedfc29c361e1f80f32b763e0bbf..76d2e80a6c072f3fd8aed968bdfb3c4c31302944 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 5975392a8a0251b5c26c1f6360c6b6cb4233cf4c..a6ee5445842424eb8de4cdba573d0df0a5a5dbb7 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 0000000000000000000000000000000000000000..08ccbab7206471bf3f739ccc1e83d745a9b87e5a --- /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 6d952777a6cfdcf06557577138ea219b7e396541..d02602104e328be6fb2fef0f3e2e642e2037b385 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; }