[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
 }