feat(wayland-egl): 补上客户端做 GPU 渲染的唯一入口 - #304
Merged
Merged
Conversation
一个 Wayland 客户端要用 EGL 画东西,需要把 wl_surface 变成
EGLNativeWindowType,而唯一的办法是 wl_egl_window_create——它只在
libwayland-egl 里。之前索引里没有这个库,所以
wl_surface -> wl_egl_window -> eglCreateWindowSurface -> draw
第二步不存在,「Wayland 客户端 + EGL」整类程序不可表达。
漏掉的原因:fork 建了**合成器**需要的四个成员就停了(合成器渲染进 GBM 缓冲,
不走这条路),所以索引从服务端看是完整的、从客户端看是不能用的。上游把源码放
在同一个 tarball 里(upstream/egl/,118 行)。
## tarball 换了指向,tag 没动
加第五个成员改变了归档内容,而一份归档支撑五个索引条目。原来 GLOBAL 指的是
**tag archive**(archive/refs/tags/v1.26.0.tar.gz),重切 tag 会当场打断已发布
的四个描述符的 sha256——正是「同版本重切 tag」那条教训。
所以不动 tag,把新内容作为 **release 资产**发布:
wayland-1.26.0-mcpp2.tar.gz。旧 tag 归档原样还在,没有任何时间窗口里 main 是
坏的。附带两个好处:GLOBAL 与 CN 现在形态对称(都是 release 资产),以及重打包
时解引用了 upstream/git-blame-ignore-revs 这个符号链接——按「符号链接归档咬
windows」那条,顺手消掉。
两个镜像逐字节一致(sha256 比对,非可达性):
GLOBAL bcf388cc1dd6617f... 1030428 bytes
CN bcf388cc1dd6617f... 1030428 bytes
## 测试成员
只名 freedesktop.wayland-egl 一个包,client 走传递依赖——因为 wayland-egl 成员
内部对 client 是 **path** 依赖,而测试再声明一次 version 依赖会被直接拒绝:
error: dependency 'freedesktop.wayland' is requested as both a version dep
and a path dep. Pick one.
这个诊断是对的:两种拼法可能解析到两棵不同的树。
测试包含 wayland-egl-backend.h——那是这个库与 EGL 实现之间的契约(Mesa 就包含
它),否则透过公共头只能观测到「create 返回非空」。
**第一版我断言错了一处**:以为 get_attached_size 会返回创建尺寸,实际返回
0 x 0。读源码才发现 attached_width/height 是 **EGL 实现附加缓冲时才写**的字段,
create 用 calloc 归零、resize 也不碰。现在断言的是真契约:没有东西渲染进去的
窗口报告「什么都没附加」。
16 项断言全过,原有四个包在新 tarball 上照常绿。
Sunrisepeak
added a commit
that referenced
this pull request
Aug 30, 2026
本设计通篇从**合成器**视角写,而这带来一个直到最后才浮出来的偏差:整条栈从 服务端看是完整的,从客户端看是不能用的。 §12.1 libwayland-egl(#304 已合)。wl_egl_window_create 是 Wayland 上拿到 EGLNativeWindowType 的唯一办法,而 fork 建了 client/server/util/scanner 四个 成员就停了——合成器渲染进 GBM 缓冲,永远不会问这个。 判据修正:「这个包的功能齐了吗」不够,得问「齐了给谁用」。同一条栈,服务端 消费者和客户端消费者要的东西不重叠,而本轮之前只有前者有测试成员。 §12.2 换 tarball 而不重切 tag。这一条比 §19.6 更该被记住:重切的正确顺序是个 精细活,而**不重切**把问题整个消掉——tag 指向历史,资产承载分发,不必是同一个 东西。顺带消掉了符号链接咬 windows 的隐患。 §12.3 一处我断言错了、被测试抓住:以为 get_attached_size 返回创建尺寸,实际 是 0x0,因为 attached_* 是 EGL 实现附加缓冲时才写的字段。 §12.4 客户端侧仍缺的四项,标出哪两个是普通工作量、哪两个需要决策。 头部版本 v1.0 -> v1.1。
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
一个 Wayland 客户端要用 EGL 画东西,需要把
wl_surface变成EGLNativeWindowType,而唯一的办法是wl_egl_window_create—— 它只在 libwayland-egl 里。之前索引里没有这个库:「Wayland 客户端 + EGL」整类程序不可表达。
漏掉的原因:fork 建了合成器需要的四个成员就停了(合成器渲染进 GBM 缓冲,不走这条路),所以索引从服务端看是完整的、从客户端看是不能用的。上游把源码放在同一个 tarball 里(
upstream/egl/,118 行)。配套 fork PR:mcpplibs/wayland#1(已合)。
tarball 换了指向,tag 没动
加第五个成员改变了归档内容,而一份归档支撑五个索引条目。原来 GLOBAL 指的是 tag archive(
archive/refs/tags/v1.26.0.tar.gz),重切 tag 会当场打断已发布的四个描述符的 sha256 —— 正是「同版本重切 tag」那条教训。所以不动 tag,把新内容作为 release 资产发布:
wayland-1.26.0-mcpp2.tar.gz。旧 tag 归档原样还在,没有任何时间窗口里 main 是坏的。附带两个好处:GLOBAL 与 CN 现在形态对称(都是 release 资产);重打包时解引用了
upstream/git-blame-ignore-revs这个符号链接 —— 按「符号链接归档咬 Windows」那条,顺手消掉。两个镜像逐字节一致(sha256 比对,非可达性):
测试成员
只名一个包,client 走传递依赖 —— 因为
wayland-egl成员内部对 client 是 path 依赖,测试再声明一次 version 依赖会被直接拒绝:这个诊断是对的:两种拼法可能解析到两棵不同的树。
测试包含
wayland-egl-backend.h—— 那是这个库与 EGL 实现之间的契约(Mesa 就包含它),否则透过公共头只能观测到「create 返回非空」。第一版我断言错了一处。 以为
get_attached_size会返回创建尺寸,实际返回0 x 0。读源码才发现attached_width/height是 EGL 实现附加缓冲时才写的字段,create用calloc归零、resize也不碰。现在断言的是真契约:没有东西渲染进去的窗口报告「什么都没附加」。原有四个包在新 tarball 上照常绿(
tests/examples/wayland:2 passed)。