diff options
author | David Riley <davidriley@chromium.org> | 2018-05-17 17:14:42 -0700 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2018-07-30 23:08:04 -0700 |
commit | f89e0b50e20c39cc2e9b22f83de1e8fee6b8803f (patch) | |
tree | dab148d1d924098bc33dab14a2e3cf4f6252a73a /gpu_renderer | |
parent | ba7c6035f8fb4b939b9c86f58c0f3009b04ebb68 (diff) | |
download | crosvm-f89e0b50e20c39cc2e9b22f83de1e8fee6b8803f.tar crosvm-f89e0b50e20c39cc2e9b22f83de1e8fee6b8803f.tar.gz crosvm-f89e0b50e20c39cc2e9b22f83de1e8fee6b8803f.tar.bz2 crosvm-f89e0b50e20c39cc2e9b22f83de1e8fee6b8803f.tar.lz crosvm-f89e0b50e20c39cc2e9b22f83de1e8fee6b8803f.tar.xz crosvm-f89e0b50e20c39cc2e9b22f83de1e8fee6b8803f.tar.zst crosvm-f89e0b50e20c39cc2e9b22f83de1e8fee6b8803f.zip |
gpu: add support for fences
BUG=None TEST=build with --features=gpu; null_platform_test Change-Id: Ib863c8ef3e85aa0f345c1f20be414979808b6a17 Reviewed-on: https://chromium-review.googlesource.com/1073959 Commit-Ready: David Riley <davidriley@chromium.org> Tested-by: David Riley <davidriley@chromium.org> Reviewed-by: Zach Reizner <zachr@chromium.org>
Diffstat (limited to 'gpu_renderer')
-rw-r--r-- | gpu_renderer/src/lib.rs | 45 |
1 files changed, 43 insertions, 2 deletions
diff --git a/gpu_renderer/src/lib.rs b/gpu_renderer/src/lib.rs index ded15ea..9e687ed 100644 --- a/gpu_renderer/src/lib.rs +++ b/gpu_renderer/src/lib.rs @@ -12,6 +12,7 @@ mod generated; mod pipe_format_fourcc; mod command_buffer; +use std::cell::RefCell; use std::ffi::CStr; use std::fmt; use std::fs::File; @@ -144,10 +145,32 @@ impl Box3 { } } +struct FenceState { + latest_fence: u32, +} +impl FenceState { + pub fn write(&mut self, latest_fence: u32) { + if latest_fence > self.latest_fence { + self.latest_fence = latest_fence; + } + } +} + struct VirglCookie { display: EGLDisplay, egl_config: EGLConfig, egl_funcs: EGLFunctions, + fence_state: Rc<RefCell<FenceState>>, +} + +extern "C" fn write_fence(cookie: *mut c_void, + fence: u32) { + assert!(!cookie.is_null()); + let cookie = unsafe { &*(cookie as *mut VirglCookie) }; + + // Track the most recent fence. + let mut fence_state = cookie.fence_state.borrow_mut(); + fence_state.write(fence); } unsafe extern "C" fn create_gl_context(cookie: *mut c_void, @@ -187,7 +210,7 @@ unsafe extern "C" fn destroy_gl_context(cookie: *mut c_void, ctx: virgl_renderer const VIRGL_RENDERER_CALLBACKS: &virgl_renderer_callbacks = &virgl_renderer_callbacks { version: 1, - write_fence: None, + write_fence: Some(write_fence), create_gl_context: Some(create_gl_context), destroy_gl_context: Some(destroy_gl_context), make_current: Some(make_current), @@ -305,6 +328,7 @@ pub struct Renderer { no_sync_send: PhantomData<*mut ()>, egl_funcs: EGLFunctions, display: EGLDisplay, + fence_state: Rc<RefCell<FenceState>>, } impl Renderer { @@ -361,10 +385,14 @@ impl Renderer { // Otherwise, Resource and Context would become invalid because their lifetime is not tied // to the Renderer instance. Doing so greatly simplifies the ownership for users of this // library. + + let fence_state = Rc::new(RefCell::new(FenceState { latest_fence: 0 })); + let cookie: *mut VirglCookie = Box::into_raw(Box::new(VirglCookie { display, egl_config, egl_funcs: egl_funcs.clone(), + fence_state: Rc::clone(&fence_state), })); // Safe because EGL was properly initialized before here.. @@ -401,7 +429,8 @@ impl Renderer { Ok(Renderer { no_sync_send: PhantomData, egl_funcs, - display + display, + fence_state }) } @@ -553,6 +582,18 @@ impl Renderer { image }) } + + pub fn poll(&self) -> u32 { + unsafe { virgl_renderer_poll() }; + self.fence_state.borrow().latest_fence + } + + pub fn create_fence(&mut self, fence_id: u32, ctx_id: u32) -> Result<()> { + let ret = unsafe { + virgl_renderer_create_fence(fence_id as i32, ctx_id) + }; + ret_to_res(ret) + } } /// A context in which resources can be attached/detached and commands can be submitted. |