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