xref: /aosp_15_r20/external/mesa3d/src/gfxstream/guest/platform/VirtGpu.cpp (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1 /*
2  * Copyright 2022 Google
3  * SPDX-License-Identifier: MIT
4  */
5 
6 #include "VirtGpu.h"
7 
8 #include <cstdlib>
9 
10 #include "Sync.h"
11 #include "util/log.h"
12 
13 namespace {
14 
15 static VirtGpuDevice* sDevice = nullptr;
16 
17 }  // namespace
18 
createPlatformVirtGpuDevice(enum VirtGpuCapset capset,int32_t descriptor)19 VirtGpuDevice* createPlatformVirtGpuDevice(enum VirtGpuCapset capset, int32_t descriptor) {
20     if (getenv("VIRTGPU_KUMQUAT")) {
21         return kumquatCreateVirtGpuDevice(capset, descriptor);
22     } else {
23         return osCreateVirtGpuDevice(capset, descriptor);
24     }
25 }
26 
getInstance(enum VirtGpuCapset capset,int32_t descriptor)27 VirtGpuDevice* VirtGpuDevice::getInstance(enum VirtGpuCapset capset, int32_t descriptor) {
28     // If kCapsetNone is passed, we return a device that was created with any capset.
29     // Otherwise, the created device's capset must match the requested capset.
30     // We could support multiple capsets with a map of devices but that case isn't needed
31     // currently, and with multiple devices it's unclear how to handle kCapsetNone.
32     if (capset != kCapsetNone && sDevice && sDevice->capset() != capset) {
33         mesa_loge("Requested VirtGpuDevice capset %u, already created capset %u", capset,
34                   sDevice->capset());
35         return nullptr;
36     }
37     if (!sDevice) {
38         sDevice = createPlatformVirtGpuDevice(capset, descriptor);
39     }
40     return sDevice;
41 }
42 
resetInstance()43 void VirtGpuDevice::resetInstance() {
44     if (sDevice) {
45         delete sDevice;
46         sDevice = nullptr;
47     }
48 }
49 
50 namespace gfxstream {
51 
createPlatformSyncHelper()52 SyncHelper* createPlatformSyncHelper() {
53     if (getenv("VIRTGPU_KUMQUAT")) {
54         return kumquatCreateSyncHelper();
55     } else {
56         return osCreateSyncHelper();
57     }
58 }
59 
60 }  // namespace gfxstream
61