From ade1fcea636afa34b6e80299557372d15c319252 Mon Sep 17 00:00:00 2001 From: C Stout Date: Tue, 7 Nov 2023 14:38:46 -0800 Subject: [PATCH] [guest] Check that the singleton VirtGpuDevice matches desired capset Reviewed-by: Aaron Ruby Acked-by: Yonggang Luo Acked-by: Adam Jackson Part-of: --- src/gfxstream/guest/platform/VirtGpu.cpp | 5 +++++ src/gfxstream/guest/platform/include/VirtGpu.h | 6 ++++++ src/gfxstream/guest/platform/linux/LinuxVirtGpu.h | 1 - src/gfxstream/guest/platform/linux/LinuxVirtGpuDevice.cpp | 4 +--- 4 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/gfxstream/guest/platform/VirtGpu.cpp b/src/gfxstream/guest/platform/VirtGpu.cpp index 2fe9319d8ff..9fbe57e6568 100644 --- a/src/gfxstream/guest/platform/VirtGpu.cpp +++ b/src/gfxstream/guest/platform/VirtGpu.cpp @@ -15,6 +15,7 @@ */ #include "VirtGpu.h" + #include 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); } diff --git a/src/gfxstream/guest/platform/include/VirtGpu.h b/src/gfxstream/guest/platform/include/VirtGpu.h index 6fa4224660f..6e6c0cfc9d2 100644 --- a/src/gfxstream/guest/platform/include/VirtGpu.h +++ b/src/gfxstream/guest/platform/include/VirtGpu.h @@ -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); diff --git a/src/gfxstream/guest/platform/linux/LinuxVirtGpu.h b/src/gfxstream/guest/platform/linux/LinuxVirtGpu.h index b39306317ca..5a89f58c1d7 100644 --- a/src/gfxstream/guest/platform/linux/LinuxVirtGpu.h +++ b/src/gfxstream/guest/platform/linux/LinuxVirtGpu.h @@ -74,5 +74,4 @@ class LinuxVirtGpuDevice : public VirtGpuDevice { private: 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 0821b7978e6..cc3b6d1e04f 100644 --- a/src/gfxstream/guest/platform/linux/LinuxVirtGpuDevice.cpp +++ b/src/gfxstream/guest/platform/linux/LinuxVirtGpuDevice.cpp @@ -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