[vulkan] Fix service access for Fuchsia
Filesystem access via libc is deprecated.
Change-Id: I0049ca3d2006528e0f1c149378606cf6aa460064
diff --git a/BUILD.gn b/BUILD.gn
index ff337fc..874f128 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -133,6 +133,7 @@
"//zircon/system/fidl/fuchsia-sysmem",
"//zircon/public/lib/trace-with-static-engine",
"//zircon/public/lib/zx",
+ "//zircon/public/lib/zxio",
]
defines += [
diff --git a/system/vulkan/goldfish_vulkan.cpp b/system/vulkan/goldfish_vulkan.cpp
index 414e1af..6d35ac2 100644
--- a/system/vulkan/goldfish_vulkan.cpp
+++ b/system/vulkan/goldfish_vulkan.cpp
@@ -19,6 +19,8 @@
#include <string.h>
#ifdef VK_USE_PLATFORM_FUCHSIA
#include <lib/zx/channel.h>
+#include <lib/zxio/zxio.h>
+#include <lib/zxio/inception.h>
#include <unistd.h>
#include "services/service_connector.h"
@@ -665,10 +667,29 @@
class VulkanDevice {
public:
- VulkanDevice() : mHostSupportsGoldfish(access(QEMU_PIPE_PATH, F_OK) != -1) {
+ VulkanDevice() : mHostSupportsGoldfish(IsAccessible(QEMU_PIPE_PATH)) {
goldfish_vk::ResourceTracker::get();
}
+ static bool IsAccessible(const char* name) {
+ zx_handle_t handle = GetConnectToServiceFunction()(name);
+ if (handle == ZX_HANDLE_INVALID)
+ return false;
+
+ zxio_storage_t io_storage;
+ zx_status_t status = zxio_remote_init(&io_storage, handle, ZX_HANDLE_INVALID);
+ if (status != ZX_OK)
+ return false;
+
+ zxio_node_attr_t attr;
+ status = zxio_attr_get(&io_storage.io, &attr);
+ zxio_close(&io_storage.io);
+ if (status != ZX_OK)
+ return false;
+
+ return true;
+ }
+
static VulkanDevice& GetInstance() {
static VulkanDevice g_instance;
return g_instance;