Wait until host resource is created when using virtio-gpu
Bug: b/213230001
Change-Id: Ie119145838dec6a58d1836293c260966cadda3af
diff --git a/system/OpenglSystemCommon/HostConnection.cpp b/system/OpenglSystemCommon/HostConnection.cpp
index c84382a..69896d2 100644
--- a/system/OpenglSystemCommon/HostConnection.cpp
+++ b/system/OpenglSystemCommon/HostConnection.cpp
@@ -290,19 +290,50 @@
__func__, strerror(errno), errno);
return false;
}
+ struct ManagedDrmGem {
+ ManagedDrmGem(const ManagedDrmGem&) = delete;
+ ~ManagedDrmGem() {
+ struct drm_gem_close gem_close {
+ .handle = m_prime_handle,
+ .pad = 0,
+ };
+ int ret = drmIoctl(m_fd, DRM_IOCTL_GEM_CLOSE, &gem_close);
+ if (ret) {
+ ALOGE("%s: DRM_IOCTL_GEM_CLOSE failed on handle %" PRIu32 ": %s(%d).",
+ __func__, m_prime_handle, strerror(errno), errno);
+ }
+ }
- info->bo_handle = prime_handle;
- gem_close.handle = prime_handle;
+ int m_fd;
+ uint32_t m_prime_handle;
+ } managed_prime_handle{
+ .m_fd = m_fd,
+ .m_prime_handle = prime_handle,
+ };
+
+ info->bo_handle = managed_prime_handle.m_prime_handle;
+
+ struct drm_virtgpu_3d_wait virtgpuWait{
+ .handle = managed_prime_handle.m_prime_handle,
+ .flags = 0,
+ };
+ // This only works for host resources by VIRTGPU_RESOURCE_CREATE ioctl.
+ // We need to use a different mechanism to synchonize with the host if
+ // the minigbm gralloc swiches to virtio-gpu blobs or cross-domain
+ // backend.
+ ret = drmIoctl(m_fd, DRM_IOCTL_VIRTGPU_WAIT, &virtgpuWait);
+ if (ret) {
+ ALOGE("%s: DRM_IOCTL_VIRTGPU_WAIT failed: %s(%d)", __func__, strerror(errno), errno);
+ return false;
+ }
ret = drmIoctl(m_fd, DRM_IOCTL_VIRTGPU_RESOURCE_INFO, info);
if (ret) {
ALOGE("%s: DRM_IOCTL_VIRTGPU_RESOURCE_INFO failed: %s (errno %d)\n",
__func__, strerror(errno), errno);
- drmIoctl(m_fd, DRM_IOCTL_GEM_CLOSE, &gem_close);
return false;
}
- drmIoctl(m_fd, DRM_IOCTL_GEM_CLOSE, &gem_close);
return true;
}