iris: a one-layer glyph atlas is a GL_TEXTURE_2D, so every glyph drew as a box
The emulator was blamed for two days for what is iris's own defect on any GL adapter. `GpuTextures::new` created the atlas `texture_2d_array` with one layer; wgpu-hal picks the GL target from the descriptor alone (`gles::Texture::get_info_from_desc`, `(false, 1) => TEXTURE_2D`), so the shader's `sampler2DArray` was handed a `GL_TEXTURE_2D`, the unit was incomplete, every `textureSample` returned (0,0,0,1), and `draw_glyph`'s `color.a *= texel.a` painted the whole glyph quad. `MIN_ARRAY_LAYERS = 2`, with the account at `create_array_texture` and a `debug_assert!` there. Vulkan -- the phone's build and the desktop's default backend -- was never affected. `force-gles` now switches the desktop backend too, so the GLES path is reproducible on a machine with a real GPU in seconds rather than only through an APK: that is how this was found, with two shader probes showing the sample was exactly (0,0,0,1).
This commit is contained in:
1 parent
69525bd131
commit
3cb18ac5c2
5 files changed
+108
-14
No files matched your search
+14
-11
@@ -609,17 +609,20 @@ agent ticks it here with the evidence.
|
||||
format rather than the palette -- but it makes the desktop build
|
||||
useless as a colour reference, which is exactly what P1a needed it for
|
||||
when the emulator could not draw glyphs.
|
||||
- [ ] **The emulator cannot draw iris's glyphs.** Under `-gpu host` with
|
||||
Vulkan disabled (Mesa 26.2.2 / virgl -- what `emu` does on this
|
||||
machine) every character renders as a solid filled box: the atlas
|
||||
sample's alpha reads 1, which is what an incomplete GL texture returns
|
||||
(0,0,0,1). Not new (`20303e0` does it too) and not the platform's
|
||||
(Compose draws text perfectly on the same AVD in the same minute).
|
||||
Enabling host Vulkan still dies at boot in gfxstream, and
|
||||
`EMU_GPU=software` gives SwiftShader Vulkan on which iris **SIGSEGVs
|
||||
in `surface_changed`**. Either of the last two would restore
|
||||
appearance testing on Android; today it has to be done on the desktop
|
||||
backend or on Iris's phone.
|
||||
- [x] **Every glyph was a solid box on the GLES backend -- iris's bug,
|
||||
not the emulator's.** Fixed 2026-09-06. The atlas is one
|
||||
`texture_2d_array` and `GpuTextures::new` created it with **one
|
||||
layer**; wgpu-hal picks the GL target from the descriptor
|
||||
(`(false, 1) => TEXTURE_2D`), so under GLES that array was a
|
||||
`GL_TEXTURE_2D` bound to the shader's `sampler2DArray`, the unit was
|
||||
incomplete, every `textureSample` returned (0,0,0,1), and
|
||||
`draw_glyph`'s `color.a *= texel.a` filled the quad. `MIN_ARRAY_LAYERS
|
||||
= 2` in `iris/core/src/render/texture.rs`, with a `debug_assert!` at
|
||||
`create_array_texture`. Vulkan (the phone, the desktop's default
|
||||
backend) was never affected. Reproduce the class in seconds without an
|
||||
emulator: `iris`'s `force-gles` feature now switches the **desktop**
|
||||
backend too -- `./run-headless.sh transcript --shot /tmp/x.png -- -p
|
||||
transcript-ui --features iris/force-gles`.
|
||||
|
||||
## Build (for the port)
|
||||
|
||||
|
||||
Reference in new issue
Block a user