From eb6124d6bf3ad925e7ca95a05f7a76d368becfed Mon Sep 17 00:00:00 2001 From: Gurchetan Singh Date: Mon, 29 Jul 2024 16:18:51 -0700 Subject: [PATCH] gfxstream: guest: kumquat: fixes in preparation for AOSP Kumquat testing - API for virtgpu_kumquat_init will change with crrev.com/c/5747430 - Better error reporting - Use paths prefered by AOSP - Handle emulated sync files via eventfd Reviewed-by: Aaron Ruby Acked-by: Yonggang Luo Acked-by: Adam Jackson Part-of: --- .../guest/platform/kumquat/VirtGpuKumquat.h | 6 ++++++ .../platform/kumquat/VirtGpuKumquatBlob.cpp | 4 ++-- .../platform/kumquat/VirtGpuKumquatDevice.cpp | 6 ++---- .../platform/kumquat/VirtGpuKumquatSync.cpp | 19 +++++++++++++++++-- 4 files changed, 27 insertions(+), 8 deletions(-) diff --git a/src/gfxstream/guest/platform/kumquat/VirtGpuKumquat.h b/src/gfxstream/guest/platform/kumquat/VirtGpuKumquat.h index d940ffd4059..d22f210fc4c 100644 --- a/src/gfxstream/guest/platform/kumquat/VirtGpuKumquat.h +++ b/src/gfxstream/guest/platform/kumquat/VirtGpuKumquat.h @@ -17,7 +17,13 @@ #pragma once #include "VirtGpu.h" + +// Blueprint and Meson builds place things differently +#if defined(ANDROID) +#include "virtgpu_kumquat_ffi.h" +#else #include "virtgpu_kumquat/virtgpu_kumquat_ffi.h" +#endif class VirtGpuKumquatResource : public std::enable_shared_from_this, public VirtGpuResource { diff --git a/src/gfxstream/guest/platform/kumquat/VirtGpuKumquatBlob.cpp b/src/gfxstream/guest/platform/kumquat/VirtGpuKumquatBlob.cpp index cd0e3e007a4..991d53d7dea 100644 --- a/src/gfxstream/guest/platform/kumquat/VirtGpuKumquatBlob.cpp +++ b/src/gfxstream/guest/platform/kumquat/VirtGpuKumquatBlob.cpp @@ -23,7 +23,6 @@ #include #include "VirtGpuKumquat.h" -#include "virtgpu_kumquat/virtgpu_kumquat_ffi.h" VirtGpuKumquatResource::VirtGpuKumquatResource(struct virtgpu_kumquat* virtGpu, uint32_t blobHandle, uint32_t resourceHandle, uint64_t size) @@ -53,7 +52,8 @@ VirtGpuResourceMappingPtr VirtGpuKumquatResource::createMapping() { ret = virtgpu_kumquat_resource_map(mVirtGpu, &map); if (ret < 0) { - ALOGE("Mapping failed with %s", strerror(errno)); + ALOGE("Mapping failed with %s for resource %u blob %u", strerror(errno), mResourceHandle, + mBlobHandle); return nullptr; } diff --git a/src/gfxstream/guest/platform/kumquat/VirtGpuKumquatDevice.cpp b/src/gfxstream/guest/platform/kumquat/VirtGpuKumquatDevice.cpp index 6101cc139b9..774c9dc8008 100644 --- a/src/gfxstream/guest/platform/kumquat/VirtGpuKumquatDevice.cpp +++ b/src/gfxstream/guest/platform/kumquat/VirtGpuKumquatDevice.cpp @@ -26,15 +26,13 @@ #include "VirtGpuKumquat.h" #include "virtgpu_gfxstream_protocol.h" -#include "virtgpu_kumquat/virtgpu_kumquat_ffi.h" #define PARAM(x) \ (struct VirtGpuParam) { x, #x, 0 } static inline uint32_t align_up(uint32_t n, uint32_t a) { return ((n + a - 1) / a) * a; } -VirtGpuKumquatDevice::VirtGpuKumquatDevice(enum VirtGpuCapset capset, int fd) - : VirtGpuDevice(capset) { +VirtGpuKumquatDevice::VirtGpuKumquatDevice(enum VirtGpuCapset capset, int) : VirtGpuDevice(capset) { struct VirtGpuParam params[] = { PARAM(VIRTGPU_KUMQUAT_PARAM_3D_FEATURES), PARAM(VIRTGPU_KUMQUAT_PARAM_CAPSET_QUERY_FIX), @@ -60,7 +58,7 @@ VirtGpuKumquatDevice::VirtGpuKumquatDevice(enum VirtGpuCapset capset, int fd) processName = getprogname(); #endif - ret = virtgpu_kumquat_init(&mVirtGpu); + ret = virtgpu_kumquat_init(&mVirtGpu, nullptr); if (ret) { ALOGV("Failed to init virtgpu kumquat"); return; diff --git a/src/gfxstream/guest/platform/kumquat/VirtGpuKumquatSync.cpp b/src/gfxstream/guest/platform/kumquat/VirtGpuKumquatSync.cpp index d152bff5eea..47884fce15f 100644 --- a/src/gfxstream/guest/platform/kumquat/VirtGpuKumquatSync.cpp +++ b/src/gfxstream/guest/platform/kumquat/VirtGpuKumquatSync.cpp @@ -23,9 +23,24 @@ namespace gfxstream { VirtGpuKumquatSyncHelper::VirtGpuKumquatSyncHelper() {} int VirtGpuKumquatSyncHelper::wait(int syncFd, int timeoutMilliseconds) { - (void)syncFd; (void)timeoutMilliseconds; - return -1; + // So far, syncfds are EventFd in the Kumquat layer. This may change + uint64_t count = 1; + ssize_t bytes_read = read(syncFd, &count, sizeof(count)); + + if (bytes_read < 0) { + return bytes_read; + } + + // A successful read decrements the eventfd's counter to zero. In + // case the eventfd is waited on again, or a dup is waited on, we + // have to write to the eventfd for the next read. + ssize_t bytes_written = write(syncFd, &count, sizeof(count)); + if (bytes_written < 0) { + return bytes_written; + } + + return 0; } int VirtGpuKumquatSyncHelper::dup(int syncFd) { return ::dup(syncFd); }