From 8e708a6c45386e9888fa9fa6679442e921d1836d Mon Sep 17 00:00:00 2001 From: C Stout Date: Wed, 28 Feb 2024 10:13:00 -0800 Subject: [PATCH] [guest] Fuchsia: initialize queries Reviewed-by: Aaron Ruby Acked-by: Yonggang Luo Acked-by: Adam Jackson Part-of: --- .../guest/platform/fuchsia/FuchsiaVirtGpu.h | 1 + .../platform/fuchsia/FuchsiaVirtGpuDevice.cpp | 41 ++++++++++++++++++- 2 files changed, 40 insertions(+), 2 deletions(-) diff --git a/src/gfxstream/guest/platform/fuchsia/FuchsiaVirtGpu.h b/src/gfxstream/guest/platform/fuchsia/FuchsiaVirtGpu.h index c3339809ccf..e8f2dfdddf2 100644 --- a/src/gfxstream/guest/platform/fuchsia/FuchsiaVirtGpu.h +++ b/src/gfxstream/guest/platform/fuchsia/FuchsiaVirtGpu.h @@ -64,4 +64,5 @@ class FuchsiaVirtGpuDevice : public VirtGpuDevice { private: magma_device_t device_; + struct VirtGpuCaps mCaps; }; diff --git a/src/gfxstream/guest/platform/fuchsia/FuchsiaVirtGpuDevice.cpp b/src/gfxstream/guest/platform/fuchsia/FuchsiaVirtGpuDevice.cpp index f9d7ec3b10f..cd18f029972 100644 --- a/src/gfxstream/guest/platform/fuchsia/FuchsiaVirtGpuDevice.cpp +++ b/src/gfxstream/guest/platform/fuchsia/FuchsiaVirtGpuDevice.cpp @@ -15,9 +15,10 @@ */ #include +#include +#include #include #include -#include #include #include @@ -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(kCapsetGfxStreamVulkan) << 32; + constexpr uint16_t kVersion = 0; + query_id |= static_cast(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_); }