aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCraig Stout <cstout@google.com>2024-04-22 19:18:37 +0000
committerGerrit Code Review <noreply-gerritcodereview@google.com>2024-04-22 19:18:37 +0000
commita2d88f83cb0569613dcd69d74e035c31f9396b05 (patch)
tree53c4ed748c1fc7a5a8463e0280d8b370126b1631
parent9fe83d7a4a8d7d36986a4e972b34d8f711b563e1 (diff)
parent1871367b6a45268c221ec5e5ba697d151f79b5ac (diff)
downloadgfxstream-a2d88f83cb0569613dcd69d74e035c31f9396b05.tar.gz
Merge "[guest] Fuchsia: initialize queries" into main
-rw-r--r--guest/fuchsia/include/msd-virtio-gpu/magma-virtio-gpu-defs.h18
-rw-r--r--guest/platform/fuchsia/FuchsiaVirtGpu.h1
-rw-r--r--guest/platform/fuchsia/FuchsiaVirtGpuDevice.cpp41
3 files changed, 58 insertions, 2 deletions
diff --git a/guest/fuchsia/include/msd-virtio-gpu/magma-virtio-gpu-defs.h b/guest/fuchsia/include/msd-virtio-gpu/magma-virtio-gpu-defs.h
new file mode 100644
index 00000000..d0e63e4f
--- /dev/null
+++ b/guest/fuchsia/include/msd-virtio-gpu/magma-virtio-gpu-defs.h
@@ -0,0 +1,18 @@
+// Copyright 2024 The Fuchsia Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef MAGMA_VIRTIO_GPU_DEFS_H
+#define MAGMA_VIRTIO_GPU_DEFS_H
+
+#include <lib/magma/magma_common_defs.h>
+
+#define MAGMA_VENDOR_VERSION_VIRTIO 1
+
+enum MagmaVirtioGpuQuery {
+ // Bits 32..47 indicate the capset id (from virtio spec), bits 48..63 indicate the version.
+ // Returns buffer result.
+ kMagmaVirtioGpuQueryCapset = MAGMA_QUERY_VENDOR_PARAM_0 + 10000,
+};
+
+#endif // MAGMA_VIRTIO_GPU_DEFS_H
diff --git a/guest/platform/fuchsia/FuchsiaVirtGpu.h b/guest/platform/fuchsia/FuchsiaVirtGpu.h
index c3339809..e8f2dfdd 100644
--- a/guest/platform/fuchsia/FuchsiaVirtGpu.h
+++ b/guest/platform/fuchsia/FuchsiaVirtGpu.h
@@ -64,4 +64,5 @@ class FuchsiaVirtGpuDevice : public VirtGpuDevice {
private:
magma_device_t device_;
+ struct VirtGpuCaps mCaps;
};
diff --git a/guest/platform/fuchsia/FuchsiaVirtGpuDevice.cpp b/guest/platform/fuchsia/FuchsiaVirtGpuDevice.cpp
index f9d7ec3b..cd18f029 100644
--- a/guest/platform/fuchsia/FuchsiaVirtGpuDevice.cpp
+++ b/guest/platform/fuchsia/FuchsiaVirtGpuDevice.cpp
@@ -15,9 +15,10 @@
*/
#include <cutils/log.h>
+#include <lib/zx/vmo.h>
+#include <msd-virtio-gpu/magma-virtio-gpu-defs.h>
#include <os_dirent.h>
#include <services/service_connector.h>
-#include <unistd.h>
#include <climits>
#include <cstdio>
@@ -26,7 +27,43 @@
#include "FuchsiaVirtGpu.h"
FuchsiaVirtGpuDevice::FuchsiaVirtGpuDevice(enum VirtGpuCapset capset, magma_device_t device)
- : VirtGpuDevice(capset), device_(device) {}
+ : VirtGpuDevice(capset), device_(device) {
+ memset(&mCaps, 0, sizeof(struct VirtGpuCaps));
+
+ // Hard-coded values that may be assumed on Fuchsia.
+ mCaps.params[kParam3D] = 1;
+ mCaps.params[kParamCapsetFix] = 1;
+ mCaps.params[kParamResourceBlob] = 1;
+ mCaps.params[kParamHostVisible] = 1;
+ mCaps.params[kParamCrossDevice] = 0;
+ mCaps.params[kParamContextInit] = 1;
+ mCaps.params[kParamSupportedCapsetIds] = 0;
+ mCaps.params[kParamExplicitDebugName] = 0;
+ mCaps.params[kParamCreateGuestHandle] = 0;
+
+ if (capset == kCapsetGfxStreamVulkan) {
+ uint64_t query_id = kMagmaVirtioGpuQueryCapset;
+ query_id |= static_cast<uint64_t>(kCapsetGfxStreamVulkan) << 32;
+ constexpr uint16_t kVersion = 0;
+ query_id |= static_cast<uint64_t>(kVersion) << 16;
+
+ magma_handle_t buffer;
+ magma_status_t status = magma_device_query(device_, query_id, &buffer, nullptr);
+ if (status == MAGMA_STATUS_OK) {
+ zx::vmo capset_info(buffer);
+ zx_status_t status =
+ capset_info.read(&mCaps.vulkanCapset, /*offset=*/0, sizeof(struct vulkanCapset));
+ ALOGD("Got capset result, read status %d", status);
+ } else {
+ ALOGE("Query(%lu) failed: status %d, expected buffer result", query_id, status);
+ }
+
+ // We always need an ASG blob in some cases, so always define blobAlignment
+ if (!mCaps.vulkanCapset.blobAlignment) {
+ mCaps.vulkanCapset.blobAlignment = 4096;
+ }
+ }
+}
FuchsiaVirtGpuDevice::~FuchsiaVirtGpuDevice() { magma_device_release(device_); }