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 <aruby@blackberry.com>
Acked-by: Yonggang Luo <luoyonggang@gmail.com>
Acked-by: Adam Jackson <ajax@redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/27246>
This commit is contained in:
Gurchetan Singh 2023-09-13 13:41:26 -07:00 committed by Marge Bot
parent a4ff4b058d
commit 7bfcb8d0e0
4 changed files with 62 additions and 6 deletions

View file

@ -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;

View file

@ -17,6 +17,17 @@
#include <stdint.h>
// 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

View file

@ -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;
};

View file

@ -79,11 +79,29 @@ LinuxVirtGpuDevice::LinuxVirtGpuDevice(enum VirtGpuCapset capset, int fd) {
}
get_caps.cap_set_id = static_cast<uint32_t>(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