[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;