summaryrefslogtreecommitdiffhomepage
path: root/packages/kernel/src/rmlui_renderer_gl3.cpp
diff options
context:
space:
mode:
authorAdam Malczewski <[email protected]>2026-06-13 17:09:24 +0900
committerAdam Malczewski <[email protected]>2026-06-13 17:09:24 +0900
commit64c21337e7ccd3e158462771cd2e2886554256f0 (patch)
tree244d950d3adfcdbd2871f813154e1635a31bd177 /packages/kernel/src/rmlui_renderer_gl3.cpp
parent2b99158e5f1be1a51c9e6bf351e058efa98e63c4 (diff)
downloadunbox-64c21337e7ccd3e158462771cd2e2886554256f0.tar.gz
unbox-64c21337e7ccd3e158462771cd2e2886554256f0.zip
Slice 10 a1: preview pipeline spike — wlr pixels -> RMLUi texture (Fork-B GO)
The keystone for the stage dock. Proves Fork B on the real target (Mesa crocus, HD 4400): a toplevel's pixels, rendered by the wlr GLES2 renderer into a LINEAR ARGB8888 dmabuf, import as an EGLImage -> sampled GL texture in the sibling RMLUi GLES 3.2 context (the slice-3 bridge run in reverse) and composite into an <img src="unbox-preview://N"> inside a ui surface — upright, color-correct. Public surface (ui.hpp): class Preview (source_uri/source_width/source_height/ refresh) + UiSubstrate::create_preview(wlr_scene_tree*) -> unique_ptr<Preview> (nullptr if no GL path; never throws). Kernel-suite probes: ui_preview_import_is_dmabuf, ui_pixel(x,y). Clean four-resource teardown (URI reg, GL texture, EGLImage, dmabuf); refresh-after-source-destruction is UB (consumer drops Preview on unmap). kernel 42 cases/150 assertions green on build + build-asan (asan clean, no new suppressions). Edits confined to packages/kernel/.
Diffstat (limited to 'packages/kernel/src/rmlui_renderer_gl3.cpp')
-rw-r--r--packages/kernel/src/rmlui_renderer_gl3.cpp33
1 files changed, 33 insertions, 0 deletions
diff --git a/packages/kernel/src/rmlui_renderer_gl3.cpp b/packages/kernel/src/rmlui_renderer_gl3.cpp
index 7e192e3..dfb455f 100644
--- a/packages/kernel/src/rmlui_renderer_gl3.cpp
+++ b/packages/kernel/src/rmlui_renderer_gl3.cpp
@@ -1210,8 +1210,37 @@ struct TGAHeader {
// Restore packing
#pragma pack()
+// unbox (slice-10 preview spike): map an externally-owned GL texture to a
+// source URI so LoadTexture() resolves it. See header.
+void RenderInterface_GL3::register_preview_texture(const Rml::String& source, unsigned int texture_id, Rml::Vector2i dimensions)
+{
+ preview_textures[source] = PreviewTexture{texture_id, dimensions};
+ preview_texture_ids.insert(texture_id);
+}
+
+void RenderInterface_GL3::unregister_preview_texture(const Rml::String& source)
+{
+ auto it = preview_textures.find(source);
+ if (it == preview_textures.end())
+ return;
+ preview_texture_ids.erase(it->second.texture_id);
+ preview_textures.erase(it);
+}
+
Rml::TextureHandle RenderInterface_GL3::LoadTexture(Rml::Vector2i& texture_dimensions, const Rml::String& source)
{
+ // unbox: a preview URI resolves to its registered, externally-owned texture
+ // (the substrate's imported dmabuf->EGLImage->texture). Returns the GL id as
+ // the handle; ReleaseTexture() will skip deleting it (caller owns it).
+ {
+ auto it = preview_textures.find(source);
+ if (it != preview_textures.end())
+ {
+ texture_dimensions = it->second.dimensions;
+ return (Rml::TextureHandle)it->second.texture_id;
+ }
+ }
+
Rml::FileInterface* file_interface = Rml::GetFileInterface();
Rml::FileHandle file_handle = file_interface->Open(source);
if (!file_handle)
@@ -1486,6 +1515,10 @@ void RenderInterface_GL3::RenderBlur(float sigma, const Gfx::FramebufferData& so
void RenderInterface_GL3::ReleaseTexture(Rml::TextureHandle texture_handle)
{
+ // unbox: never delete an externally-owned preview texture — its GL lifetime
+ // belongs to the substrate's Preview, which deletes it on its own teardown.
+ if (preview_texture_ids.count((unsigned int)texture_handle) != 0)
+ return;
glDeleteTextures(1, (GLuint*)&texture_handle);
}