summaryrefslogtreecommitdiff
path: root/crates
diff options
context:
space:
mode:
authorLLLL Colonq <llll@colonq>2026-10-18 01:01:13 -0400
committerLLLL Colonq <llll@colonq>2026-10-18 01:02:39 -0400
commitff604a53c2646252188a641771fb6e73e6538293 (patch)
treee5eceb26ea3f4f2d85894d9adf97da538800efa3 /crates
parent5790153a16cccae1faa8f3cc07defabefc018d3d (diff)
Convert X11 pixmaps to textures
Diffstat (limited to 'crates')
-rw-r--r--crates/teleia/src/net/texture.rs12
-rw-r--r--crates/teleia/src/net/texture/ffi/egl.rs2
-rw-r--r--crates/teleia/src/texture.rs1
3 files changed, 15 insertions, 0 deletions
diff --git a/crates/teleia/src/net/texture.rs b/crates/teleia/src/net/texture.rs
index 86d6988..9aaae00 100644
--- a/crates/teleia/src/net/texture.rs
+++ b/crates/teleia/src/net/texture.rs
@@ -16,6 +16,18 @@ use ffi::glfw;
use crate::{context, texture, utils};
+pub fn upload_xcb_pixmap(ctx: &context::Context, t: &mut texture::Texture, pixmap: u32) {
+ t.bind(ctx);
+ unsafe {
+ let d = glfw::glfwGetEGLDisplay();
+ let img = egl::eglCreateImage(d, std::ptr::null_mut(), egl::EGL_NATIVE_PIXMAP_KHR,
+ pixmap as libc::uintptr_t as egl::EGLClientBuffer,
+ std::ptr::null_mut()
+ );
+ egl::glEGLImageTargetTexStorageEXT(glow::TEXTURE_2D, img, std::ptr::null_mut())
+ }
+}
+
#[derive(Debug)]
struct ReceivedTexture {
fd: i32,
diff --git a/crates/teleia/src/net/texture/ffi/egl.rs b/crates/teleia/src/net/texture/ffi/egl.rs
index 32c5356..de7f40f 100644
--- a/crates/teleia/src/net/texture/ffi/egl.rs
+++ b/crates/teleia/src/net/texture/ffi/egl.rs
@@ -5,6 +5,7 @@ pub const EGL_HEIGHT: EGLenum = 0x3056;
pub const EGL_GL_TEXTURE_2D: EGLenum = 0x30B1;
// from <EGL/eglext.h>
+pub const EGL_NATIVE_PIXMAP_KHR: EGLenum = 0x30B0;
pub const EGL_LINUX_DMA_BUF_EXT: EGLenum = 0x3270;
pub const EGL_LINUX_DRM_FOURCC_EXT: EGLenum = 0x3271;
pub const EGL_DMA_BUF_PLANE0_FD_EXT: EGLenum = 0x3272;
@@ -51,4 +52,5 @@ unsafe extern "C" {
#[link(name = "GL")]
unsafe extern "C" {
pub fn glEGLImageTargetTexture2DOES(t: u32, img: EGLImage);
+ pub fn glEGLImageTargetTexStorageEXT(t: u32, img: EGLImage, attribs: *const core::ffi::c_int);
}
diff --git a/crates/teleia/src/texture.rs b/crates/teleia/src/texture.rs
index 95cb914..6eea03d 100644
--- a/crates/teleia/src/texture.rs
+++ b/crates/teleia/src/texture.rs
@@ -3,6 +3,7 @@ use image::EncodableLayout;
use crate::context;
+#[derive(Debug)]
pub struct Texture {
pub tex: glow::Texture,
pub width: i32,