From 7bfcb8d0e05aaaab5e0905df622e9bd9a3ef2d3e Mon Sep 17 00:00:00 2001 From: Gurchetan Singh Date: Wed, 13 Sep 2023 13:41:26 -0700 Subject: [PATCH] gfxstream: query non-Vulkan caps from the guest In case the guest starts asking for them. Will likely be added in the future. Reviewed-by: Aaron Ruby Acked-by: Yonggang Luo Acked-by: Adam Jackson Part-of: --- .../guest/platform/include/VirtGpu.h | 3 ++ .../include/virtgpu_gfxstream_protocol.h | 35 +++++++++++++++++++ .../guest/platform/linux/LinuxVirtGpu.h | 6 ++-- .../platform/linux/LinuxVirtGpuDevice.cpp | 24 +++++++++++-- 4 files changed, 62 insertions(+), 6 deletions(-) diff --git a/src/gfxstream/guest/platform/include/VirtGpu.h b/src/gfxstream/guest/platform/include/VirtGpu.h index 453407a7f42..62b1fc6f9b0 100644 --- a/src/gfxstream/guest/platform/include/VirtGpu.h +++ b/src/gfxstream/guest/platform/include/VirtGpu.h @@ -107,6 +107,9 @@ struct VirtGpuCreateBlob { struct VirtGpuCaps { uint64_t params[kParamMax]; struct vulkanCapset vulkanCapset; + struct magmaCapset magmaCapset; + struct glesCapset glesCapset; + struct composerCapset composerCapset; }; class VirtGpuBlobMapping; diff --git a/src/gfxstream/guest/platform/include/virtgpu_gfxstream_protocol.h b/src/gfxstream/guest/platform/include/virtgpu_gfxstream_protocol.h index c40ada28d19..683c7d13468 100644 --- a/src/gfxstream/guest/platform/include/virtgpu_gfxstream_protocol.h +++ b/src/gfxstream/guest/platform/include/virtgpu_gfxstream_protocol.h @@ -17,6 +17,17 @@ #include +// See definitions in rutabaga_gfx_ffi.h +#define VIRTGPU_CAPSET_VIRGL 1 +#define VIRTGPU_CAPSET_VIRGL2 2 +#define VIRTGPU_CAPSET_GFXSTREAM_VULKAN 3 +#define VIRTGPU_CAPSET_VENUS 4 +#define VIRTGPU_CAPSET_CROSS_DOMAIN 5 +#define VIRTGPU_CAPSET_DRM 6 +#define VIRTGPU_CAPSET_GFXSTREAM_MAGMA 7 +#define VIRTGPU_CAPSET_GFXSTREAM_GLES 8 +#define VIRTGPU_CAPSET_GFXSTREAM_COMPOSER 9 + // Address Space Graphics contexts #define GFXSTREAM_CONTEXT_CREATE 0x1001 #define GFXSTREAM_CONTEXT_PING 0x1002 @@ -89,4 +100,28 @@ struct vulkanCapset { uint32_t padding[15]; }; +struct magmaCapset { + uint32_t protocolVersion; + // ASG Ring Parameters + uint32_t ringSize; + uint32_t bufferSize; + uint32_t blobAlignment; +}; + +struct glesCapset { + uint32_t protocolVersion; + // ASG Ring Parameters + uint32_t ringSize; + uint32_t bufferSize; + uint32_t blobAlignment; +}; + +struct composerCapset { + uint32_t protocolVersion; + // ASG Ring Parameters + uint32_t ringSize; + uint32_t bufferSize; + uint32_t blobAlignment; +}; + #endif diff --git a/src/gfxstream/guest/platform/linux/LinuxVirtGpu.h b/src/gfxstream/guest/platform/linux/LinuxVirtGpu.h index d9760576d77..b39306317ca 100644 --- a/src/gfxstream/guest/platform/linux/LinuxVirtGpu.h +++ b/src/gfxstream/guest/platform/linux/LinuxVirtGpu.h @@ -72,7 +72,7 @@ class LinuxVirtGpuDevice : public VirtGpuDevice { virtual int execBuffer(struct VirtGpuExecBuffer& execbuffer, VirtGpuBlobPtr blob); private: - int64_t mDeviceHandle; - - struct VirtGpuCaps mCaps; + int64_t mDeviceHandle; + struct VirtGpuCaps mCaps; + enum VirtGpuCapset mCapset; }; diff --git a/src/gfxstream/guest/platform/linux/LinuxVirtGpuDevice.cpp b/src/gfxstream/guest/platform/linux/LinuxVirtGpuDevice.cpp index 26637b31acb..6a973cb6551 100644 --- a/src/gfxstream/guest/platform/linux/LinuxVirtGpuDevice.cpp +++ b/src/gfxstream/guest/platform/linux/LinuxVirtGpuDevice.cpp @@ -79,11 +79,29 @@ LinuxVirtGpuDevice::LinuxVirtGpuDevice(enum VirtGpuCapset capset, int fd) { } get_caps.cap_set_id = static_cast(capset); - if (capset == kCapsetGfxStreamVulkan) { - get_caps.size = sizeof(struct vulkanCapset); - get_caps.addr = (unsigned long long)&mCaps.vulkanCapset; + switch (capset) { + case kCapsetGfxStreamVulkan: + get_caps.size = sizeof(struct vulkanCapset); + get_caps.addr = (unsigned long long)&mCaps.vulkanCapset; + break; + case kCapsetGfxStreamMagma: + get_caps.size = sizeof(struct magmaCapset); + get_caps.addr = (unsigned long long)&mCaps.magmaCapset; + break; + case kCapsetGfxStreamGles: + get_caps.size = sizeof(struct vulkanCapset); + get_caps.addr = (unsigned long long)&mCaps.glesCapset; + break; + case kCapsetGfxStreamComposer: + get_caps.size = sizeof(struct vulkanCapset); + get_caps.addr = (unsigned long long)&mCaps.composerCapset; + break; + default: + get_caps.size = 0; } + mCapset = capset; + ret = drmIoctl(mDeviceHandle, DRM_IOCTL_VIRTGPU_GET_CAPS, &get_caps); if (ret) { // Don't fail get capabilities just yet, AEMU doesn't use this API