diff options
| author | Adam Malczewski <[email protected]> | 2026-06-13 17:09:24 +0900 |
|---|---|---|
| committer | Adam Malczewski <[email protected]> | 2026-06-13 17:09:24 +0900 |
| commit | 64c21337e7ccd3e158462771cd2e2886554256f0 (patch) | |
| tree | 244d950d3adfcdbd2871f813154e1635a31bd177 /packages/kernel/src/rmlui_renderer_gl3.cpp | |
| parent | 2b99158e5f1be1a51c9e6bf351e058efa98e63c4 (diff) | |
| download | unbox-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.cpp | 33 |
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); } |
