blob: bf7ca1e820222bd5358a5abdcd3837aa60fa545c [file] [log] [blame]
/*
* Copyright 2024 Google LLC
* SPDX-License-Identifier: Apache-2.0
*/
#include "GfxStreamRenderControl.h"
#include <mutex>
#include "GfxStreamRenderControlConnection.h"
#if defined(__ANDROID__)
#include "android-base/properties.h"
#endif
constexpr const auto kEglProp = "ro.hardware.egl";
static uint64_t sProcUID = 0;
static std::mutex sNeedInitMutex;
static bool sNeedInit = true;
static gfxstream::guest::IOStream* sProcessStream = nullptr;
GfxStreamTransportType renderControlGetTransport() {
#if defined(__Fuchsia__) || defined(LINUX_GUEST_BUILD)
return GFXSTREAM_TRANSPORT_VIRTIO_GPU_ADDRESS_SPACE;
#else
std::string transport;
#if defined(__ANDROID__)
transport = android::base::GetProperty("ro.boot.hardware.gltransport", "");
#else
const char* transport_envvar = getenv("GFXSTREAM_TRANSPORT");
if (transport_envvar != nullptr) {
transport = std::string(transport_envvar);
}
#endif
if (transport.empty()) {
#if defined(__ANDROID__)
return GFXSTREAM_TRANSPORT_QEMU_PIPE;
#else
return GFXSTREAM_TRANSPORT_VIRTIO_GPU_ADDRESS_SPACE;
#endif
}
if (transport == "asg") {
return GFXSTREAM_TRANSPORT_ADDRESS_SPACE;
}
if (transport == "pipe") {
return GFXSTREAM_TRANSPORT_QEMU_PIPE;
}
if (transport == "virtio-gpu-asg" || transport == "virtio-gpu-pipe") {
std::string egl;
#if defined(__ANDROID__)
egl = android::base::GetProperty(kEglProp, "");
#endif
return GFXSTREAM_TRANSPORT_VIRTIO_GPU_ADDRESS_SPACE;
}
return GFXSTREAM_TRANSPORT_QEMU_PIPE;
#endif
}
static uint64_t getPuid(GfxStreamConnectionManager* mgr) {
std::lock_guard<std::mutex> lock(sNeedInitMutex);
if (sNeedInit) {
GfxStreamTransportType transport = renderControlGetTransport();
sProcessStream = mgr->processPipeStream(transport);
sProcUID = sProcessStream->processPipeInit();
sNeedInit = false;
}
return sProcUID;
}
int32_t renderControlInit(GfxStreamConnectionManager* mgr, void* vkInfo) {
ExtendedRCEncoderContext* rcEnc =
(ExtendedRCEncoderContext*)mgr->getEncoder(GFXSTREAM_CONNECTION_RENDER_CONTROL);
if (!rcEnc) {
uint64_t puid = getPuid(mgr);
auto stream = mgr->getStream();
auto rcConnection = std::make_unique<GfxStreamRenderControlConnection>(stream);
rcEnc = (ExtendedRCEncoderContext*)rcConnection->getEncoder();
gfxstream::guest::ChecksumCalculator* calc = rcConnection->getCheckSumHelper();
rcEnc->setChecksumHelper(calc);
rcEnc->queryAndSetSyncImpl();
rcEnc->queryAndSetDmaImpl();
rcEnc->queryAndSetGLESMaxVersion();
rcEnc->queryAndSetHostCompositionImpl();
rcEnc->queryAndSetDirectMemSupport();
rcEnc->queryAndSetVulkanSupport();
rcEnc->queryAndSetDeferredVulkanCommandsSupport();
rcEnc->queryAndSetVulkanNullOptionalStringsSupport();
rcEnc->queryAndSetVulkanCreateResourcesWithRequirementsSupport();
rcEnc->queryAndSetVulkanIgnoredHandles();
rcEnc->queryAndSetYUVCache();
rcEnc->queryAndSetAsyncUnmapBuffer();
rcEnc->queryAndSetVirtioGpuNext();
rcEnc->queryHasSharedSlotsHostMemoryAllocator();
rcEnc->queryAndSetVulkanFreeMemorySync();
rcEnc->queryAndSetVirtioGpuNativeSync();
rcEnc->queryAndSetVulkanShaderFloat16Int8Support();
rcEnc->queryAndSetVulkanAsyncQueueSubmitSupport();
rcEnc->queryAndSetHostSideTracingSupport();
rcEnc->queryAndSetAsyncFrameCommands();
rcEnc->queryAndSetVulkanQueueSubmitWithCommandsSupport();
rcEnc->queryAndSetVulkanBatchedDescriptorSetUpdateSupport();
rcEnc->queryAndSetSyncBufferData();
rcEnc->queryAndSetVulkanAsyncQsri();
rcEnc->queryAndSetReadColorBufferDma();
rcEnc->queryAndSetHWCMultiConfigs();
rcEnc->queryAndSetVulkanAuxCommandBufferMemory();
rcEnc->queryVersion();
rcEnc->rcSetPuid(rcEnc, puid);
if (vkInfo) {
rcEnc->setVulkanFeatureInfo(vkInfo);
}
int32_t ret =
mgr->addConnection(GFXSTREAM_CONNECTION_RENDER_CONTROL, std::move(rcConnection));
if (ret) {
return ret;
}
}
return 0;
}