/* * Copyright 2024 Google LLC * SPDX-License-Identifier: Apache-2.0 */ #include "GfxStreamRenderControl.h" #include #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 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(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; }