diff --git a/crates/overlay/build.rs b/crates/overlay/build.rs index 2d603d94..87ae82a5 100644 --- a/crates/overlay/build.rs +++ b/crates/overlay/build.rs @@ -11,7 +11,7 @@ fn create_gl_bindings(out_dir: &str) -> anyhow::Result<()> { Registry::new( Api::Gl, - (3, 0), + (3, 3), Profile::Core, Fallbacks::None, [ diff --git a/crates/overlay/src/renderer/opengl.rs b/crates/overlay/src/renderer/opengl.rs index a946518a..663eac24 100644 --- a/crates/overlay/src/renderer/opengl.rs +++ b/crates/overlay/src/renderer/opengl.rs @@ -258,10 +258,12 @@ impl MemoryObjectTexture { gl::TexParameteri(gl::TEXTURE_2D, gl::TEXTURE_WRAP_S, gl::CLAMP_TO_EDGE as _); gl::TexParameteri(gl::TEXTURE_2D, gl::TEXTURE_WRAP_T, gl::CLAMP_TO_EDGE as _); let (width, height) = surface.size(); + let (internal_format, swizzling) = + map_dxgi_to_gl(surface.format()).context("Unsupported DXGI format")?; gl::TexStorageMem2DEXT( gl::TEXTURE_2D, 1, - map_dxgi_to_gl(surface.format()).context("Unsupported DXGI format")?, + internal_format, width as _, height as _, *memory_object, @@ -271,6 +273,10 @@ impl MemoryObjectTexture { bail!("TexStorageMem2DEXT failed"); } + if let Some(swizzling) = swizzling { + gl::TexParameterIuiv(gl::TEXTURE_2D, gl::TEXTURE_SWIZZLE_RGBA, swizzling.as_ptr()); + } + Ok(Self { memory_object: ScopeGuard::into_inner(memory_object), keyed_mutex: surface.mutex().is_some() @@ -389,13 +395,15 @@ impl Drop for NvInteropTexture { unsafe impl Send for NvInteropTexture {} -fn map_dxgi_to_gl(format: DXGI_FORMAT) -> Option { +fn map_dxgi_to_gl(format: DXGI_FORMAT) -> Option<(GLuint, Option<[GLuint; 4]>)> { match format { - DXGI_FORMAT_R8G8B8A8_UNORM => Some(gl::RGBA8), - DXGI_FORMAT_R8G8B8A8_UNORM_SRGB => Some(gl::SRGB8_ALPHA8), - DXGI_FORMAT_B8G8R8A8_UNORM => Some(gl::BGRA), - DXGI_FORMAT_R16G16B16A16_UNORM => Some(gl::RGBA16), - DXGI_FORMAT_R16G16B16A16_FLOAT => Some(gl::RGBA16F), + DXGI_FORMAT_R8G8B8A8_UNORM => Some((gl::RGBA8, None)), + DXGI_FORMAT_R8G8B8A8_UNORM_SRGB => Some((gl::SRGB8_ALPHA8, None)), + DXGI_FORMAT_B8G8R8A8_UNORM => { + Some((gl::RGBA8, Some([gl::BLUE, gl::GREEN, gl::RED, gl::ALPHA]))) + } + DXGI_FORMAT_R16G16B16A16_UNORM => Some((gl::RGBA16, None)), + DXGI_FORMAT_R16G16B16A16_FLOAT => Some((gl::RGBA16F, None)), _ => None, } }