mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-03 00:40:09 +01:00
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:
parent
a4ff4b058d
commit
7bfcb8d0e0
4 changed files with 62 additions and 6 deletions
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue