mirror of
https://chromium.googlesource.com/crosvm/crosvm
synced 2025-02-11 12:35:26 +00:00
This reverts commit a999284da2
.
This also introduces two extra `use` statements to fix the corresponding
errors in the LUCI build, which did not occur in local builds.
Reason for revert: caused deadlock in virglrenderer
Original change's description:
> rutabaga_gfx: remove fence polling and enable async callback
>
> Now that rutabaga users can provide a callback for fence
> completion, fences no longer need to be polled on the main thread.
>
> Optional polling still occurs for Rutabaga Components that still
> rely on it for other purposes (e.g. virglrenderer for GL query
> checking).
>
> Also, use a BTreeMap rather a HashMap since we only expect a dozen
> or so entries at most. In such cases, a BTreeMap is faster.
>
> * v1 (lfrb@collabora.com): remove all polling + add async_cb
> * v2 (ryanneph@google.com): re-introduce optional polling to fix
> virglrenderer that relies on it for GL query checking.
> * v3 (ryanneph@google.com): replace timer-based polling with
> eventfd-based poll() signaling for components that want to
> use it.
>
> BUG=b:175527587
> TEST=glxgears and vkcube in a crosvm guest VM.
>
> Cq-Depend: chromium:3555854, chromium:3563893
> Change-Id: I8e0181317e954cd15e2b8dc04c9b1329b0a6e182
> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/2860746
> Reviewed-by: Daniel Verkamp <dverkamp@chromium.org>
> Tested-by: kokoro <noreply+kokoro@google.com>
> Commit-Queue: Ryan Neph <ryanneph@google.com>
BUG=b:175527587,b:228782431,b:228521246
TEST=arc.Notification.vm on kukui-arc-r
TEST=dEQP-VK.wsi.android.swapchain.create#image_usage on dedede/kukui-arc-r
Change-Id: I616e3f283a60fe6a260f796cddce67c548b5e304
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/3584076
Reviewed-by: Kazuhiro Inaba <kinaba@chromium.org>
Reviewed-by: Dennis Kempin <denniskempin@google.com>
Reviewed-by: Ryan Neph <ryanneph@google.com>
Tested-by: kokoro <noreply+kokoro@google.com>
Commit-Queue: Ryan Neph <ryanneph@google.com>
85 lines
2.2 KiB
Rust
85 lines
2.2 KiB
Rust
// Copyright 2020 The Chromium OS Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
//! renderer_utils: Utility functions and structs used by virgl_renderer and gfxstream.
|
|
|
|
use std::cell::RefCell;
|
|
use std::os::raw::{c_int, c_void};
|
|
use std::rc::Rc;
|
|
|
|
use base::{IntoRawDescriptor, SafeDescriptor};
|
|
|
|
use crate::rutabaga_utils::{
|
|
RutabagaError, RutabagaFence, RutabagaFenceHandler, RutabagaResult, RUTABAGA_FLAG_FENCE,
|
|
};
|
|
|
|
#[repr(C)]
|
|
#[derive(Debug, Copy, Clone)]
|
|
pub struct VirglBox {
|
|
pub x: u32,
|
|
pub y: u32,
|
|
pub z: u32,
|
|
pub w: u32,
|
|
pub h: u32,
|
|
pub d: u32,
|
|
}
|
|
|
|
pub fn ret_to_res(ret: i32) -> RutabagaResult<()> {
|
|
match ret {
|
|
0 => Ok(()),
|
|
_ => Err(RutabagaError::ComponentError(ret)),
|
|
}
|
|
}
|
|
|
|
pub struct FenceState {
|
|
pub latest_fence: u32,
|
|
pub handler: Option<RutabagaFenceHandler>,
|
|
}
|
|
|
|
impl FenceState {
|
|
pub fn write(&mut self, latest_fence: u32) {
|
|
if latest_fence > self.latest_fence {
|
|
self.latest_fence = latest_fence;
|
|
if let Some(handler) = &self.handler {
|
|
handler.call(RutabagaFence {
|
|
flags: RUTABAGA_FLAG_FENCE,
|
|
fence_id: latest_fence as u64,
|
|
ctx_id: 0,
|
|
ring_idx: 0,
|
|
});
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
pub struct VirglCookie {
|
|
pub fence_state: Rc<RefCell<FenceState>>,
|
|
pub render_server_fd: Option<SafeDescriptor>,
|
|
}
|
|
|
|
pub unsafe extern "C" fn write_fence(cookie: *mut c_void, fence: u32) {
|
|
assert!(!cookie.is_null());
|
|
let cookie = &*(cookie as *mut VirglCookie);
|
|
|
|
// Track the most recent fence.
|
|
let mut fence_state = cookie.fence_state.borrow_mut();
|
|
fence_state.write(fence);
|
|
}
|
|
|
|
#[allow(dead_code)]
|
|
pub unsafe extern "C" fn get_server_fd(cookie: *mut c_void, version: u32) -> c_int {
|
|
assert!(!cookie.is_null());
|
|
let cookie = &mut *(cookie as *mut VirglCookie);
|
|
|
|
if version != 0 {
|
|
return -1;
|
|
}
|
|
|
|
// Transfer the fd ownership to virglrenderer.
|
|
cookie
|
|
.render_server_fd
|
|
.take()
|
|
.map(SafeDescriptor::into_raw_descriptor)
|
|
.unwrap_or(-1)
|
|
}
|