egl: Optionally support buffer age and damage
This commit is contained in:
parent
3530ac7335
commit
f423244864
2
build.rs
2
build.rs
|
@ -35,6 +35,8 @@ fn gl_generate() {
|
||||||
"EGL_KHR_image_base",
|
"EGL_KHR_image_base",
|
||||||
"EGL_EXT_image_dma_buf_import",
|
"EGL_EXT_image_dma_buf_import",
|
||||||
"EGL_EXT_image_dma_buf_import_modifiers",
|
"EGL_EXT_image_dma_buf_import_modifiers",
|
||||||
|
"EGL_EXT_buffer_age",
|
||||||
|
"EGL_EXT_swap_buffers_with_damage",
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
.write_bindings(gl_generator::GlobalGenerator, &mut file)
|
.write_bindings(gl_generator::GlobalGenerator, &mut file)
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
//! Type safe native types for safe context/surface creation
|
//! Type safe native types for safe context/surface creation
|
||||||
|
|
||||||
use super::{display::EGLDisplayHandle, ffi, wrap_egl_call, EGLDevice, SwapBuffersError};
|
use super::{display::EGLDisplayHandle, ffi, wrap_egl_call, EGLDevice, SwapBuffersError};
|
||||||
|
use crate::utils::{Physical, Rectangle};
|
||||||
#[cfg(feature = "backend_winit")]
|
#[cfg(feature = "backend_winit")]
|
||||||
use std::os::raw::c_int;
|
use std::os::raw::c_int;
|
||||||
use std::os::raw::c_void;
|
use std::os::raw::c_void;
|
||||||
|
@ -246,9 +247,19 @@ pub unsafe trait EGLNativeSurface: Send + Sync {
|
||||||
&self,
|
&self,
|
||||||
display: &Arc<EGLDisplayHandle>,
|
display: &Arc<EGLDisplayHandle>,
|
||||||
surface: ffi::egl::types::EGLSurface,
|
surface: ffi::egl::types::EGLSurface,
|
||||||
|
damage: Option<&mut [Rectangle<i32, Physical>]>,
|
||||||
) -> Result<(), SwapBuffersError> {
|
) -> Result<(), SwapBuffersError> {
|
||||||
wrap_egl_call(|| unsafe {
|
wrap_egl_call(|| unsafe {
|
||||||
ffi::egl::SwapBuffers(***display, surface as *const _);
|
if let Some(damage) = damage {
|
||||||
|
ffi::egl::SwapBuffersWithDamageEXT(
|
||||||
|
***display,
|
||||||
|
surface as *const _,
|
||||||
|
damage.as_mut_ptr() as *mut _,
|
||||||
|
damage.len() as i32,
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
ffi::egl::SwapBuffers(***display, surface as *const _);
|
||||||
|
}
|
||||||
})
|
})
|
||||||
.map_err(SwapBuffersError::EGLSwapBuffers)
|
.map_err(SwapBuffersError::EGLSwapBuffers)
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,6 +12,7 @@ use crate::backend::egl::{
|
||||||
native::EGLNativeSurface,
|
native::EGLNativeSurface,
|
||||||
EGLError, SwapBuffersError,
|
EGLError, SwapBuffersError,
|
||||||
};
|
};
|
||||||
|
use crate::utils::{Physical, Rectangle};
|
||||||
|
|
||||||
use slog::{debug, o};
|
use slog::{debug, o};
|
||||||
|
|
||||||
|
@ -79,12 +80,30 @@ impl EGLSurface {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Returns the buffer age of the underlying back buffer
|
||||||
|
pub fn buffer_age(&self) -> i32 {
|
||||||
|
let surface = self.surface.load(Ordering::SeqCst);
|
||||||
|
let mut age = 0;
|
||||||
|
unsafe {
|
||||||
|
ffi::egl::QuerySurface(
|
||||||
|
**self.display,
|
||||||
|
surface as *const _,
|
||||||
|
ffi::egl::BUFFER_AGE_EXT as i32,
|
||||||
|
&mut age as *mut _,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
age
|
||||||
|
}
|
||||||
|
|
||||||
/// Swaps buffers at the end of a frame.
|
/// Swaps buffers at the end of a frame.
|
||||||
pub fn swap_buffers(&self) -> ::std::result::Result<(), SwapBuffersError> {
|
pub fn swap_buffers(
|
||||||
|
&self,
|
||||||
|
damage: Option<&mut [Rectangle<i32, Physical>]>,
|
||||||
|
) -> ::std::result::Result<(), SwapBuffersError> {
|
||||||
let surface = self.surface.load(Ordering::SeqCst);
|
let surface = self.surface.load(Ordering::SeqCst);
|
||||||
|
|
||||||
let result = if !surface.is_null() {
|
let result = if !surface.is_null() {
|
||||||
self.native.swap_buffers(&self.display, surface)
|
self.native.swap_buffers(&self.display, surface, damage)
|
||||||
} else {
|
} else {
|
||||||
Err(SwapBuffersError::EGLSwapBuffers(EGLError::BadSurface))
|
Err(SwapBuffersError::EGLSwapBuffers(EGLError::BadSurface))
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue