From 19ef1ed3c02552e7fed30da37486aca6b967a667 Mon Sep 17 00:00:00 2001 From: Victor Brekenfeld Date: Fri, 22 May 2020 23:12:49 +0200 Subject: [PATCH] egl: move eglSwapBuffers call into NativeSurface --- src/backend/drm/gbm/egl.rs | 14 +++++++++++--- src/backend/egl/native.rs | 15 ++++++++++++--- src/backend/egl/surface.rs | 6 ++---- 3 files changed, 25 insertions(+), 10 deletions(-) diff --git a/src/backend/drm/gbm/egl.rs b/src/backend/drm/gbm/egl.rs index 62d557a..1d07539 100644 --- a/src/backend/drm/gbm/egl.rs +++ b/src/backend/drm/gbm/egl.rs @@ -7,7 +7,9 @@ use crate::backend::drm::{Device, RawDevice, Surface}; use crate::backend::egl::native::{Backend, NativeDisplay, NativeSurface}; use crate::backend::egl::{display::EGLDisplayHandle, ffi}; -use crate::backend::egl::{wrap_egl_call, EGLError, Error as EglBackendError, SurfaceCreationError}; +use crate::backend::egl::{ + wrap_egl_call, EGLError, Error as EglBackendError, SurfaceCreationError, SwapBuffersError, +}; use super::{Error, GbmDevice, GbmSurface}; @@ -109,9 +111,15 @@ unsafe impl NativeSurface for GbmSurface { self.needs_recreation() } - fn swap_buffers(&self) -> Result<(), Self::Error> { + fn swap_buffers( + &self, + display: &Arc, + surface: ffi::egl::types::EGLSurface, + ) -> Result<(), SwapBuffersError> { + wrap_egl_call(|| unsafe { ffi::egl::SwapBuffers(***display, surface as *const _) }) + .map_err(SwapBuffersError::EGLSwapBuffers)?; // this is safe since `eglSwapBuffers` will have been called exactly once // if this is used by our egl module, which is why this trait is unsafe. - unsafe { self.page_flip() } + unsafe { self.page_flip() }.map_err(SwapBuffersError::Underlying) } } diff --git a/src/backend/egl/native.rs b/src/backend/egl/native.rs index 6e084fb..b2db1b3 100644 --- a/src/backend/egl/native.rs +++ b/src/backend/egl/native.rs @@ -1,6 +1,8 @@ //! Type safe native types for safe context/surface creation -use super::{display::EGLDisplayHandle, ffi, wrap_egl_call, EGLError, Error, SurfaceCreationError}; +use super::{ + display::EGLDisplayHandle, ffi, wrap_egl_call, EGLError, Error, SurfaceCreationError, SwapBuffersError, +}; use nix::libc::{c_int, c_void}; #[cfg(feature = "backend_winit")] @@ -228,8 +230,15 @@ pub unsafe trait NativeSurface { /// [EGLSurface::swap_buffers](::backend::egl::surface::EGLSurface::swap_buffers) /// /// Only implement if required by the backend. - fn swap_buffers(&self) -> Result<(), Self::Error> { - Ok(()) + fn swap_buffers( + &self, + display: &Arc, + surface: ffi::egl::types::EGLSurface, + ) -> Result<(), SwapBuffersError> { + wrap_egl_call(|| unsafe { + ffi::egl::SwapBuffers(***display, surface as *const _); + }) + .map_err(SwapBuffersError::EGLSwapBuffers) } } diff --git a/src/backend/egl/surface.rs b/src/backend/egl/surface.rs index 02ea2de..8556556 100644 --- a/src/backend/egl/surface.rs +++ b/src/backend/egl/surface.rs @@ -1,6 +1,6 @@ //! EGL surface related structs -use super::{ffi, native, wrap_egl_call, EGLError, SurfaceCreationError, SwapBuffersError}; +use super::{ffi, native, EGLError, SurfaceCreationError, SwapBuffersError}; use crate::backend::egl::display::EGLDisplayHandle; use crate::backend::graphics::PixelFormat; use nix::libc::c_int; @@ -93,9 +93,7 @@ impl EGLSurface { let surface = self.surface.get(); let result = if !surface.is_null() { - wrap_egl_call(|| unsafe { ffi::egl::SwapBuffers(**self.display, surface as *const _) }) - .map_err(SwapBuffersError::EGLSwapBuffers) - .and_then(|_| self.native.swap_buffers().map_err(SwapBuffersError::Underlying)) + self.native.swap_buffers(&self.display, surface) } else { Err(SwapBuffersError::EGLSwapBuffers(EGLError::BadSurface)) };