mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-07 04:58:05 +02: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 {
|
struct VirtGpuCaps {
|
||||||
uint64_t params[kParamMax];
|
uint64_t params[kParamMax];
|
||||||
struct vulkanCapset vulkanCapset;
|
struct vulkanCapset vulkanCapset;
|
||||||
|
struct magmaCapset magmaCapset;
|
||||||
|
struct glesCapset glesCapset;
|
||||||
|
struct composerCapset composerCapset;
|
||||||
};
|
};
|
||||||
|
|
||||||
class VirtGpuBlobMapping;
|
class VirtGpuBlobMapping;
|
||||||
|
|
|
||||||
|
|
@ -17,6 +17,17 @@
|
||||||
|
|
||||||
#include <stdint.h>
|
#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
|
// Address Space Graphics contexts
|
||||||
#define GFXSTREAM_CONTEXT_CREATE 0x1001
|
#define GFXSTREAM_CONTEXT_CREATE 0x1001
|
||||||
#define GFXSTREAM_CONTEXT_PING 0x1002
|
#define GFXSTREAM_CONTEXT_PING 0x1002
|
||||||
|
|
@ -89,4 +100,28 @@ struct vulkanCapset {
|
||||||
uint32_t padding[15];
|
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
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -72,7 +72,7 @@ class LinuxVirtGpuDevice : public VirtGpuDevice {
|
||||||
virtual int execBuffer(struct VirtGpuExecBuffer& execbuffer, VirtGpuBlobPtr blob);
|
virtual int execBuffer(struct VirtGpuExecBuffer& execbuffer, VirtGpuBlobPtr blob);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
int64_t mDeviceHandle;
|
int64_t mDeviceHandle;
|
||||||
|
struct VirtGpuCaps mCaps;
|
||||||
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);
|
get_caps.cap_set_id = static_cast<uint32_t>(capset);
|
||||||
if (capset == kCapsetGfxStreamVulkan) {
|
switch (capset) {
|
||||||
get_caps.size = sizeof(struct vulkanCapset);
|
case kCapsetGfxStreamVulkan:
|
||||||
get_caps.addr = (unsigned long long)&mCaps.vulkanCapset;
|
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);
|
ret = drmIoctl(mDeviceHandle, DRM_IOCTL_VIRTGPU_GET_CAPS, &get_caps);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
// Don't fail get capabilities just yet, AEMU doesn't use this API
|
// Don't fail get capabilities just yet, AEMU doesn't use this API
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue