wlroots/render/vulkan
twilligon 5d150267e2 render/vulkan: clear blend image on first use
The two-pass blend image is created with VK_IMAGE_LAYOUT_UNDEFINED, so
on its first use loadOp=LOAD loads uninitialized memory. This oughtn't
be an issue, as we render onto it before we read it. These renders are
blends, so even opaque content is rendered with reference to an uninit
dst. This too ought to be fine: src*1 + dst*0 = src for all finite dst.

But the blend image pixfmt is VK_FORMAT_R16G16B16A16_SFLOAT, so uninit
pixels can be NaN, inf, or -inf, and now src*1 + dst*0 = NaN/inf/-inf.
This is bad enough assuming the uninitialized blend image holds random
bytes (2048/65536 values are not finite), even worse on any driver/GPU
with a framebuffer compression scheme that so happens to reliably read
NaNs from any uninitialized compressed image...

Most Mesa drivers happen not to do this perfectly valid thing, so this
is only reliably a problem (afaict) for honeykrisp i.e. AGX i.e. Asahi
Linux i.e. Apple Silicon, where after an upgrade to wlroots 0.20, sway
renders a black screen forever, unless you get quite lucky spamming VT
switches, in which case there's flickery garbage on exactly one of the
two swapchain buffers.

The blend image persists across frames, so it suffices to clear before
first real use. Rather than clear by hand, make a loadOp=CLEAR variant
of the render pass and use it for that first frame only. Adding a pass
sounds heavy, but render pass compatibility ignores loadOp and layouts
such that the new pass reuses the pipelines and framebuffer, and costs
one VkRenderPass object but not the usual pipeline/shader (re)compile.
2026-06-12 18:11:23 +00:00
..
shaders render/vulkan: Use instanced draws instead of scissors 2026-05-01 12:50:04 +00:00
meson.build render/vulkan: use renamed glslang binary by default 2023-07-27 16:06:49 +08:00
pass.c render/vulkan: clear blend image on first use 2026-06-12 18:11:23 +00:00
pixel_format.c vulkan: make use of new pixel_format_is_ycbcr function 2026-02-06 13:53:46 +00:00
renderer.c render/vulkan: clear blend image on first use 2026-06-12 18:11:23 +00:00
texture.c render/vulkan: New staging buffer implementation 2026-05-01 12:50:04 +00:00
util.c render/vulkan: compile against vulkan 1.2 header 2026-03-24 12:33:12 -04:00
vulkan.c vulkan: Add support for render timer using timestamp queries 2026-04-09 15:13:49 +02:00