[guest] Check that the singleton VirtGpuDevice matches desired capset
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:
@@ -15,6 +15,7 @@
|
||||
*/
|
||||
|
||||
#include "VirtGpu.h"
|
||||
#include <cutils/log.h>
|
||||
|
||||
namespace {
|
||||
|
||||
@@ -23,6 +24,10 @@ static VirtGpuDevice* sDevice = nullptr;
|
||||
} // namespace
|
||||
|
||||
VirtGpuDevice* VirtGpuDevice::getInstance(enum VirtGpuCapset capset) {
|
||||
if (sDevice && sDevice->capset() != capset) {
|
||||
ALOGE("Requested VirtGpuDevice capset %u, already created capset %u", capset, sDevice->capset());
|
||||
return nullptr;
|
||||
}
|
||||
if (!sDevice) {
|
||||
sDevice = createPlatformVirtGpuDevice(capset);
|
||||
}
|
||||
|
||||
@@ -145,8 +145,11 @@ class VirtGpuDevice {
|
||||
static VirtGpuDevice* getInstance(enum VirtGpuCapset capset = kCapsetNone);
|
||||
static void setInstanceForTesting(VirtGpuDevice* device);
|
||||
|
||||
VirtGpuDevice(enum VirtGpuCapset capset) : mCapset(capset) {}
|
||||
virtual ~VirtGpuDevice() {}
|
||||
|
||||
enum VirtGpuCapset capset() { return mCapset; }
|
||||
|
||||
virtual int64_t getDeviceHandle(void) = 0;
|
||||
|
||||
virtual struct VirtGpuCaps getCaps(void) = 0;
|
||||
@@ -156,6 +159,9 @@ class VirtGpuDevice {
|
||||
virtual VirtGpuBlobPtr importBlob(const struct VirtGpuExternalHandle& handle) = 0;
|
||||
|
||||
virtual int execBuffer(struct VirtGpuExecBuffer& execbuffer, VirtGpuBlobPtr blob) = 0;
|
||||
|
||||
private:
|
||||
enum VirtGpuCapset mCapset;
|
||||
};
|
||||
|
||||
VirtGpuDevice* createPlatformVirtGpuDevice(enum VirtGpuCapset capset = kCapsetNone, int fd = -1);
|
||||
|
||||
@@ -74,5 +74,4 @@ class LinuxVirtGpuDevice : public VirtGpuDevice {
|
||||
private:
|
||||
int64_t mDeviceHandle;
|
||||
struct VirtGpuCaps mCaps;
|
||||
enum VirtGpuCapset mCapset;
|
||||
};
|
||||
|
||||
@@ -39,7 +39,7 @@
|
||||
#define VIRGL_BIND_CUSTOM (1 << 17)
|
||||
#define PIPE_BUFFER 0
|
||||
|
||||
LinuxVirtGpuDevice::LinuxVirtGpuDevice(enum VirtGpuCapset capset, int fd) {
|
||||
LinuxVirtGpuDevice::LinuxVirtGpuDevice(enum VirtGpuCapset capset, int fd) : VirtGpuDevice(capset) {
|
||||
struct VirtGpuParam params[] = {
|
||||
PARAM(VIRTGPU_PARAM_3D_FEATURES), PARAM(VIRTGPU_PARAM_CAPSET_QUERY_FIX),
|
||||
PARAM(VIRTGPU_PARAM_RESOURCE_BLOB), PARAM(VIRTGPU_PARAM_HOST_VISIBLE),
|
||||
@@ -110,8 +110,6 @@ LinuxVirtGpuDevice::LinuxVirtGpuDevice(enum VirtGpuCapset capset, int fd) {
|
||||
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
|
||||
|
||||
Reference in New Issue
Block a user