diff --git a/surfman/Cargo.toml b/surfman/Cargo.toml index 2f61017..34f2f9b 100644 --- a/surfman/Cargo.toml +++ b/surfman/Cargo.toml @@ -2,7 +2,7 @@ name = "surfman" license = "MIT / Apache-2.0" edition = "2018" -version = "0.1.3" +version = "0.1.4" authors = [ "Patrick Walton ", "Emilio Cobos Álvarez ", @@ -20,6 +20,7 @@ default = ["sm-winit"] sm-angle = [] sm-angle-builtin = ["mozangle"] sm-angle-default = ["sm-angle"] +sm-angle-flush = [] sm-osmesa = ["osmesa-sys"] sm-osmesa-default = ["sm-osmesa"] sm-no-wgl = ["sm-angle-default"] diff --git a/surfman/src/platform/windows/angle/context.rs b/surfman/src/platform/windows/angle/context.rs index b1ec974..21d8b52 100644 --- a/surfman/src/platform/windows/angle/context.rs +++ b/surfman/src/platform/windows/angle/context.rs @@ -37,6 +37,20 @@ thread_local! { pub static GL_FUNCTIONS: Gl = Gl::load_with(context::get_proc_address); } +#[cfg(feature = "sm-angle-flush")] +fn flush_surface_contents() { + unsafe { + GL_FUNCTIONS.with(|gl| gl.Flush()); + } +} + +#[cfg(not(feature = "sm-angle-flush"))] +fn flush_surface_contents() { + unsafe { + GL_FUNCTIONS.with(|gl| gl.Finish()); + } +} + pub struct Context { pub(crate) native_context: Box, pub(crate) id: ContextID, @@ -260,9 +274,7 @@ impl Device { // FIXME(pcwalton): Is this necessary and sufficient? if !surface.uses_keyed_mutex() { let _guard = self.temporarily_make_context_current(context)?; - unsafe { - GL_FUNCTIONS.with(|gl| gl.Finish()); - } + flush_surface_contents(); } let is_current = self.context_is_current(context); diff --git a/surfman/src/platform/windows/angle/surface.rs b/surfman/src/platform/windows/angle/surface.rs index 227c36d..f30298d 100644 --- a/surfman/src/platform/windows/angle/surface.rs +++ b/surfman/src/platform/windows/angle/surface.rs @@ -128,7 +128,16 @@ impl Device { ]; EGL_FUNCTIONS.with(|egl| { - let egl_surface = if share_handle.is_some() { + let egl_surface = if let Some(HandleOrTexture::Texture(texture)) = share_handle { + let surface = + egl.CreatePbufferFromClientBuffer(self.native_display.egl_display(), + EGL_D3D_TEXTURE_ANGLE, + texture as *const _, + egl_config, + attributes.as_ptr()); + assert_ne!(surface, egl::NO_SURFACE); + surface + } else if share_handle.is_some() { egl::NO_SURFACE } else { let surface = egl.CreatePbufferSurface(self.native_display.egl_display(),