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/server.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/server.cpp')
| -rw-r--r-- | packages/kernel/src/server.cpp | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/packages/kernel/src/server.cpp b/packages/kernel/src/server.cpp index a5f8365..b302c68 100644 --- a/packages/kernel/src/server.cpp +++ b/packages/kernel/src/server.cpp @@ -81,6 +81,14 @@ auto Server::ui_fence_sync_active() const -> bool { return impl_->substrate != nullptr && impl_->substrate->fence_sync_active(); } +auto Server::ui_preview_import_is_dmabuf() const -> bool { + return impl_->substrate != nullptr && impl_->substrate->preview_import_is_dmabuf(); +} + +auto Server::ui_pixel(int x, int y) const -> unsigned int { + return impl_->substrate != nullptr ? impl_->substrate->surface_pixel(x, y) : 0U; +} + void Server::ui_set_touch_override(UiTouchOverride ov) { if (impl_->substrate == nullptr) { return; @@ -104,6 +112,13 @@ auto PerExtensionUi::create_surface(const UiSurfaceSpec& spec) -> std::unique_pt return server_->substrate->create_surface(id_, parent, spec); } +auto PerExtensionUi::create_preview(wlr_scene_tree* source) -> std::unique_ptr<Preview> { + if (server_->substrate == nullptr) { + return nullptr; + } + return server_->substrate->create_preview(source); +} + auto PerExtensionUi::available() const -> bool { return server_->substrate != nullptr && server_->substrate->available(); } |
