summary refs log tree commit diff
path: root/gpu_renderer
diff options
context:
space:
mode:
authorDavid Riley <davidriley@chromium.org>2018-05-17 17:14:42 -0700
committerchrome-bot <chrome-bot@chromium.org>2018-07-30 23:08:04 -0700
commitf89e0b50e20c39cc2e9b22f83de1e8fee6b8803f (patch)
treedab148d1d924098bc33dab14a2e3cf4f6252a73a /gpu_renderer
parentba7c6035f8fb4b939b9c86f58c0f3009b04ebb68 (diff)
downloadcrosvm-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.rs45
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.