[guest] Check that the singleton VirtGpuDevice matches desired capset
Bug:282968393
Change-Id: Ieb764e734499e59621a59d652c3357788f23a8d6
diff --git a/common/GfxstreamEnd2EndTests.cpp b/common/GfxstreamEnd2EndTests.cpp
index e111826..81767ef 100644
--- a/common/GfxstreamEnd2EndTests.cpp
+++ b/common/GfxstreamEnd2EndTests.cpp
@@ -257,7 +257,8 @@
}
TestingVirtGpuDevice::TestingVirtGpuDevice()
- : mVirtioGpuTaskProcessingThread([this]() { RunVirtioGpuTaskProcessingLoop(); }) {}
+ : VirtGpuDevice(kCapsetGfxStreamVulkan),
+ mVirtioGpuTaskProcessingThread([this]() { RunVirtioGpuTaskProcessingLoop(); }) {}
TestingVirtGpuDevice::~TestingVirtGpuDevice() {
mShuttingDown = true;
diff --git a/guest/platform/VirtGpu.cpp b/guest/platform/VirtGpu.cpp
index 2fe9319..9fbe57e 100644
--- a/guest/platform/VirtGpu.cpp
+++ b/guest/platform/VirtGpu.cpp
@@ -15,6 +15,7 @@
*/
#include "VirtGpu.h"
+ #include <cutils/log.h>
namespace {
@@ -23,6 +24,10 @@
} // 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/guest/platform/include/VirtGpu.h b/guest/platform/include/VirtGpu.h
index 6fa4224..6e6c0cf 100644
--- a/guest/platform/include/VirtGpu.h
+++ b/guest/platform/include/VirtGpu.h
@@ -145,8 +145,11 @@
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 @@
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/guest/platform/linux/LinuxVirtGpu.h b/guest/platform/linux/LinuxVirtGpu.h
index b393063..5a89f58 100644
--- a/guest/platform/linux/LinuxVirtGpu.h
+++ b/guest/platform/linux/LinuxVirtGpu.h
@@ -74,5 +74,4 @@
private:
int64_t mDeviceHandle;
struct VirtGpuCaps mCaps;
- enum VirtGpuCapset mCapset;
};
diff --git a/guest/platform/linux/LinuxVirtGpuDevice.cpp b/guest/platform/linux/LinuxVirtGpuDevice.cpp
index 0821b79..cc3b6d1 100644
--- a/guest/platform/linux/LinuxVirtGpuDevice.cpp
+++ b/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 @@
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
diff --git a/guest/platform/stub/StubVirtGpuDevice.cpp b/guest/platform/stub/StubVirtGpuDevice.cpp
index fef0805..1d84000 100644
--- a/guest/platform/stub/StubVirtGpuDevice.cpp
+++ b/guest/platform/stub/StubVirtGpuDevice.cpp
@@ -16,7 +16,7 @@
#include "StubVirtGpu.h"
-StubVirtGpuDevice::StubVirtGpuDevice(enum VirtGpuCapset) {
+StubVirtGpuDevice::StubVirtGpuDevice(enum VirtGpuCapset capset) : VirtGpuDevice(capset) {
// Unimplemented stub
}