diff options
author | Craig Stout <cstout@google.com> | 2024-04-22 19:18:37 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2024-04-22 19:18:37 +0000 |
commit | a2d88f83cb0569613dcd69d74e035c31f9396b05 (patch) | |
tree | 53c4ed748c1fc7a5a8463e0280d8b370126b1631 | |
parent | 9fe83d7a4a8d7d36986a4e972b34d8f711b563e1 (diff) | |
parent | 1871367b6a45268c221ec5e5ba697d151f79b5ac (diff) | |
download | gfxstream-a2d88f83cb0569613dcd69d74e035c31f9396b05.tar.gz |
Merge "[guest] Fuchsia: initialize queries" into main
-rw-r--r-- | guest/fuchsia/include/msd-virtio-gpu/magma-virtio-gpu-defs.h | 18 | ||||
-rw-r--r-- | guest/platform/fuchsia/FuchsiaVirtGpu.h | 1 | ||||
-rw-r--r-- | guest/platform/fuchsia/FuchsiaVirtGpuDevice.cpp | 41 |
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_); } |