blob: 930bfc62f3e05b627dcc777259a5eba981ae5a83 [file]
/*
* Copyright 2022 Google
* SPDX-License-Identifier: MIT
*/
#include "VirtGpu.h"
#include <cstdlib>
#include "Sync.h"
#include "util/log.h"
namespace {
static VirtGpuDevice* sDevice = nullptr;
} // namespace
VirtGpuDevice* createPlatformVirtGpuDevice(enum VirtGpuCapset capset, int32_t descriptor) {
if (getenv("VIRTGPU_KUMQUAT")) {
return kumquatCreateVirtGpuDevice(capset, descriptor);
} else {
return osCreateVirtGpuDevice(capset, descriptor);
}
}
VirtGpuDevice* VirtGpuDevice::getInstance(enum VirtGpuCapset capset, int32_t descriptor) {
// If kCapsetNone is passed, we return a device that was created with any capset.
// Otherwise, the created device's capset must match the requested capset.
// We could support multiple capsets with a map of devices but that case isn't needed
// currently, and with multiple devices it's unclear how to handle kCapsetNone.
if (capset != kCapsetNone && sDevice && sDevice->capset() != capset) {
mesa_loge("Requested VirtGpuDevice capset %u, already created capset %u", capset,
sDevice->capset());
return nullptr;
}
if (!sDevice) {
sDevice = createPlatformVirtGpuDevice(capset, descriptor);
}
return sDevice;
}
void VirtGpuDevice::resetInstance() {
if (sDevice) {
delete sDevice;
sDevice = nullptr;
}
}
namespace gfxstream {
SyncHelper* createPlatformSyncHelper() {
if (getenv("VIRTGPU_KUMQUAT")) {
return kumquatCreateSyncHelper();
} else {
return osCreateSyncHelper();
}
}
} // namespace gfxstream