[fuchsia] Prefer the trusted loader service. If unavailable, fall back to the bare protocol. Bug:b/419087951 Change-Id: If399b7f58ee25d2a65727cf3ca1d0b3417c650dd Reviewed-on: https://fuchsia-review.googlesource.com/c/third_party/Vulkan-Loader/+/1284319 Reviewed-by: David Gilhooley <dgilhooley@google.com> Commit-Queue: Craig Stout <cstout@google.com>
diff --git a/loader/loader_fuchsia_service.cc b/loader/loader_fuchsia_service.cc index 36fe516..4686d07 100644 --- a/loader/loader_fuchsia_service.cc +++ b/loader/loader_fuchsia_service.cc
@@ -23,6 +23,7 @@ #include <fidl/fuchsia.vulkan.loader/cpp/wire.h> #include <inttypes.h> #include <lib/component/incoming/cpp/protocol.h> +#include <lib/component/incoming/cpp/service.h> #include <lib/fdio/directory.h> #include <lib/fdio/fd.h> #include <lib/fdio/io.h> @@ -43,22 +44,46 @@ static int manifest_fs_fd = -1; void connect_to_vulkan_loader_svc() { - auto client_end = component::Connect<fuchsia_vulkan_loader::Loader>(); - if (!client_end.is_ok()) { - loader_log(nullptr, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0, - "connect_to_vulkan_loader_svc: Failed to connect to loader service: %s", client_end.status_string()); - return; - } - auto client = fidl::WireSyncClient(std::move(*client_end)); - auto feature_result = client->GetSupportedFeatures(); + fidl::WireSyncClient<fuchsia_vulkan_loader::Loader> client; fuchsia_vulkan_loader::wire::Features features; - if (!feature_result.ok()) { - loader_log(nullptr, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, 0, - "connect_to_vulkan_loader_svc: Failed to get supported features, error \"%s\".", - feature_result.error().lossy_description()); - return; + +#if FUCHSIA_API_LEVEL_AT_LEAST(NEXT) + // Default to the trusted service; if unavailable, fall back to the bare protocol. + if (auto open_result = component::OpenService<fuchsia_vulkan_loader::TrustedService>(); open_result.is_ok()) { + fuchsia_vulkan_loader::TrustedService::ServiceClient& service_client = open_result.value(); + + if (auto connect_result = service_client.connect_loader(); connect_result.is_ok()) { + client = fidl::WireSyncClient{std::move(connect_result.value())}; + + if (auto feature_result = client->GetSupportedFeatures(); feature_result.ok()) { + features = feature_result.value().features; + } else { + client = {}; + } + } } - features = feature_result.value().features; +#endif + + if (!client.is_valid()) { + auto client_end = component::Connect<fuchsia_vulkan_loader::Loader>(); + if (!client_end.is_ok()) { + loader_log(nullptr, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0, + "connect_to_vulkan_loader_svc: Failed to connect to loader service: %s", client_end.status_string()); + return; + } + + client = fidl::WireSyncClient(std::move(*client_end)); + + auto feature_result = client->GetSupportedFeatures(); + if (!feature_result.ok()) { + loader_log(nullptr, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, 0, + "connect_to_vulkan_loader_svc: Failed to get supported features, error \"%s\".", + feature_result.error().lossy_description()); + return; + } + features = feature_result.value().features; + } + constexpr fuchsia_vulkan_loader::wire::Features kMandatoryFeatures = fuchsia_vulkan_loader::wire::Features::kConnectToDeviceFs | fuchsia_vulkan_loader::wire::Features::kConnectToManifestFs | fuchsia_vulkan_loader::wire::Features::kGet;