#RenderPass
Ever wanted to render text to screen, but quickly & dirtily, and without bothering for a font atlas? Read my latest post: poniesandlight.co.uk/reflect/debu...
Texture-less Text Rendering
How to draw text to a Vulkan renderpass without binding a single texture
poniesandlight.co.uk
October 25, 2024 at 11:42 AM
Just make it exist first: From #SceneGraph to #Snapshot to #RenderPass to an animated cube - Rendering pipeline for #helios is taking shape! 🕹️ Ready for the next subsystem. Details in my latest #devlog: garagecraft.games/devlog/2025/...

#indiedev #gamedev #indiegames #programming #coding #games
October 19, 2025 at 8:47 PM
#Justlearned: I created a renderthread in c++ for OpenGL. At the end the renderthread-interface doubled most of the interfaces for adding stuff like meshes or materials in a new renderpass. Are there better ways? #gamedev
June 20, 2025 at 1:23 PM
Renderpass timings are coming next!

#threejs #webdev #webgpu #webgl
August 14, 2026 at 5:56 PM
" [VulkanPipeline] About to call vkCreateGraphicsPipelines with:
Device: 0000017731BC5488
Layout: 00000177380AF018
RenderPass: 0000017737A883E8
VertexShader: 0000017737E07F38
DescriptorSetLayout: 0000000000000000 "
March 28, 2026 at 11:01 PM
One descriptor set to rule them all, and in the renderpass bind them : D #Gamedev #Vulkan #GameEngine
August 8, 2024 at 3:44 PM
Starting to nest events in the #WebGPU driver for #RenderDoc, how do you think I should handle these "WriteBuffer" that occur while encoding a "RenderPass"?

Because chronologically they are submitted before the render pass even though the API call occurs after.
May 2, 2025 at 10:53 AM
ran into an issue where if I resize my window; my camera resolution will desync from swapchain resolution for a frame, causing it to need to blit, which will use the blit buffer unexpectedly and the renderpass will change its image layout.
September 27, 2026 at 8:00 PM
J'essaie de faire une synthèse de tout ce que j'ai appris avec Vulkan.

Ce n'est pas simple (et ce n'est que le début)
June 1, 2026 at 11:55 PM
Texture-Less Text Rendering Discussion
Texture-less Text Rendering
How to draw text to a Vulkan renderpass without binding a single texture
poniesandlight.co.uk
November 9, 2024 at 8:40 AM
How to share a texture across compute and render pipeline in wgpu?
Hi, I am trying to get this working but I ran into this error: wgpu error: Validation Error Caused by: In ComputePass::end In a dispatch command, indirect:false Attempted to use Texture with 'Output texture' label (mips 0..1 layers 0..1) with conflicting usages. Current usage TextureUses(STORAGE_READ_WRITE) and new usage TextureUses(RESOURCE). TextureUses(STORAGE_READ_WRITE) is an exclusive usage and cannot be used with any other usages within the usage scope (renderpass or compute dispatch). The thing I defined the usage in shared bind group, so it is either write or read. This is the texture: let output_texture = device.create_texture(&TextureDescriptor { label: Some("Output texture"), size: Extent3d { width: surface_config.width, height: surface_config.height, depth_or_array_layers: 1}, mip_level_count: 1, sample_count: 1, dimension: wgpu::TextureDimension::D2, format: TextureFormat::Rgba8Unorm, usage: TextureUsages::STORAGE_BINDING | TextureUsages::TEXTURE_BINDING, view_formats: &[], }); let output_view = output_texture.create_view(&TextureViewDescriptor::default()); The bind group: let bind_group_layout = device.create_bind_group_layout(&BindGroupLayoutDescriptor { label: Some("Shared bindgroup layout"), entries: &[ BindGroupLayoutEntry { binding: 0, visibility: ShaderStages::COMPUTE, ty: wgpu::BindingType::StorageTexture { access: StorageTextureAccess::WriteOnly, format: TextureFormat::Rgba8Unorm, view_dimension: wgpu::TextureViewDimension::D2 }, count: None, }, BindGroupLayoutEntry { binding: 1, visibility: ShaderStages::FRAGMENT, ty: wgpu::BindingType::Texture { sample_type: wgpu::TextureSampleType::Float { filterable: false }, view_dimension: wgpu::TextureViewDimension::D2, multisampled: false }, count: None, }, ], }); let bind_group = device.create_bind_group(&BindGroupDescriptor { label: Some("Shared bindgroup"), layout: &bind_group_layout, entries: &[ BindGroupEntry { binding: 0, resource: BindingResource::TextureView(&output_view), }, BindGroupEntry { binding: 1, resource: BindingResource::TextureView(&output_view), } ] }); And the render function: let mut encoder = self.device.create_command_encoder(&CommandEncoderDescriptor { label: Some("Compute encoder"), }); { let mut compute_pass = encoder.begin_compute_pass(&ComputePassDescriptor { label: Some("Compute pass"), timestamp_writes: None, }); compute_pass.set_pipeline(&self.compute_pipeline); compute_pass.set_bind_group(0, &self.bind_group, &[]); compute_pass.dispatch_workgroups( (self.surface_config.width + 7) / 8, (self.surface_config.height + 7) / 8, 1, ); } { let frame = self.surface.get_current_texture().unwrap(); let view = frame.texture.create_view(&TextureViewDescriptor::default()); let mut render_pass = encoder.begin_render_pass(&RenderPassDescriptor { label: Some("Render pass"), color_attachments: &[Some(RenderPassColorAttachment { view: &view, resolve_target: None, ops: Operations { load: wgpu::LoadOp::Clear(wgpu::Color::BLACK), store: wgpu::StoreOp::Discard, } })], depth_stencil_attachment: None, timestamp_writes: None, occlusion_query_set: None, }); render_pass.set_pipeline(&self.render_pipeline); render_pass.set_bind_group(0, &self.bind_group, &[]); render_pass.draw(0..6, 0..1); } self.queue.submit(Some(encoder.finish())); I do not really know how to tackle this issue as I am learning the API, help appreciated.
users.rust-lang.org
February 10, 2025 at 12:01 PM
VK_KHR_dynamic_rendering_local_readを使うとタイルベースGPU向けのコードとそうでないGPU向けのコードの違いがより小さくなり、両対応のコードが書きやすくなる。Vulkanでは従来のRenderPassは既に非推奨になっている
docs.vulkan.org/guide/latest...
VK_EXT_custom_resolveはこのRenderPassからVK_KHR_dynamic_rendering_local_readへの移行の動きに合わせて、Dynamic Renderingでも同様の指定を行えるようになっている
Deprecated :: Vulkan Documentation Project
docs.vulkan.org
December 13, 2025 at 8:49 AM
Vulkan 1.4では従来のRenderPassを置き換える仕組みとしてVK_KHR_dynamic_rendering_local_read拡張が登場した。これはDynamic Renderingで実行されるRenderPass間の依存関係をVK_DEPENDENCY_BY_REGION_BIT相当にする手段を提供する
docs.vulkan.org/refpages/lat...
VK_KHR_dynamic_rendering_local_read(3) :: Vulkan Documentation Project
docs.vulkan.org
December 13, 2025 at 8:49 AM
これでタイルメモリ上の値でresolveを行えるようになる。次にVK_SUBPASS_DESCRIPTION_CUSTOM_RESOLVE_BIT_EXTを付ける事で、subpassがresolveを目的とした物である事をドライバに伝えられるようになる。
VK_SUBPASS_DESCRIPTION_CUSTOM_RESOLVE_BIT_EXTが付いたsubpassでは頂点シェーダはスクリーン全体を覆う四角以外のものを描いてはいけない、このsubpassはrenderpassの最後のsubpassでなければならないという制約が課せられる
December 13, 2025 at 8:49 AM
この描き方では前のシェーダの実行結果のうち別のタイルに対する計算結果を使うことが出来ないが、VulkanではRenderPassのVkSubpassDependency::dependencyFlagsにVK_DEPENDENCY_BY_REGION_BITをつけるとこの制約を受け入れられるという意味になり、タイルメモリを活用したレンダリングが行われる
December 13, 2025 at 8:49 AM
多くの場合GPUはresolveの為の専用のハードウェアを備えていて、VulkanではRenderPassにResolveAttachmentを付けたりvkCmdResolveImageをコマンドバッファに積むことで、resolveを要求する事ができる。ただ、resolveの過程で凝った計算をしたい場合、resolve相当の処理をシェーダで書くことになる。
モバイルGPUは細いメインメモリのバスが主要なボトルネックとなるため、多くの場合タイルベースレンダリングを行う。複数のsubpass間のデータの受け渡しを高速なタイルメモリ上で行う事で細いバスにデータが流れるのを回避する
December 13, 2025 at 8:49 AM
I'm drawing the rendergraph using Island's new 2d GPU rasterizer context, which is based on #vello shaders (github.com/linebender/v...)

Currently it's only drawing cards for renderpasses that are part of the current frame (more to come).

The faded out renderpass was optimized out.
GitHub - linebender/vello: A GPU compute-centric 2D renderer.
A GPU compute-centric 2D renderer. Contribute to linebender/vello development by creating an account on GitHub.
github.com
September 19, 2025 at 2:15 PM
to clear the screen in sdl gpu you create a renderpass that clears the swapchain,

to draw a texture in sdl gpu you must create the entire universe first
February 14, 2026 at 12:54 PM
あとはDynamic Renderingもやってみたのですが、RenderPassやframebufferの面倒さから開放された代わりにimage取得したときとpresentするときに明示的にメモリバリアが必要っぽいのでどうなのか。勝手にレイアウトが変わらないというのは一貫性はあるが。。。
March 28, 2025 at 12:49 PM
Tiler Improvements
# Super Late Code Meant to blog about this last quarter, but somehow another two months went by and here we are. A while back, I did some work to improve zink performance on tiling GPUs. Namely this entailed adding renderpass tracking into threaded-context, and also implementing command stream reordering, and inlining swapchain resolves, and framebuffer discards, and actually maybe it’s more than just “some” work. All of this amounted to improved performance by reducing memory bandwidth. How much improved performance? All of it. And then, around two months ago, a colleague told me he was no longer going to use zink on his tiling GPU. # Devastated Some of you noticed that the blog has gone quiet in recent times. I’m going to take this opportunity to foist all the blame onto that colleague: to preserve his identity, let’s just call him Gabe. Gabe came to me a few months ago and told me zink was too slow. Vulkan was better. Faster. More “reliable”. I said there’s no way that could be true; I’ve put way more bugs into Vulkan than I have into zink. Unblinking, he stared at me across the digital divide. I task-switched to important whitespace cleanups. Time passed, and I pulled myself together. I compiled some app traces. Analyzed them. Did some deep thinking. There was one place where zink indeed could be less performant than this “Vulkan” thing. The final frontier of driver performance. Some call it graphics heaven. I call it hell. # Web Browsers Chrome is the web browser, and, statistically, everyone uses it. It ships on desktops and phones, embeds in apps, and even allows you to read this blog. Haters will say _No I uSe FiReFoX_ , but they may as well be Netscape users in the year 2000. In the past, Chrome defaulted to using GL, which made testing easy. Now, however, `--disable-features=Vulkan` is needed to return to the comfort of an API so reliable it no longer receives versioned updates. Looking at an apitrace of Chrome, I saw a disturbing rendering pattern that went something like this: * draw some element on a page using multisampled FBO1 * resolve FBO1 to texture1 * composite texture1 onto larger FBO2/texture2 * composite texture2 onto even larger, multisampled FBO3 * resolve FBO3 to swapchain * present In this case, zink would correctly inline the FBO3/swapchain resolve at the end, but the intermediate multisampled rendering on `FBO1` would pay the full performance penalty of storing the multisampled image data and then loading it again for the separate resolve operation. I’d like to say it was simple to inline this intermediate resolve. That I just slapped a single MR into mesa and it magically worked. Unfortunately, nothing is ever that simple. There were minor fixups all over the place. And this brought me to the real insanity. Chrome has bugs too. # Literal Hell Let’s take a concrete example: launch Chrome with `--disable-features=Vulkan` and check out this tiny SVG: chromebug.html This is most likely what you see: The reason you see this is because you are on a big, strong desktop GPU which doesn’t give a shit about load/store ops or uninitialized GPU memory. You’re driving a giant industrial bulldozer on your morning commute: traffic no longer exists and stop signals are fully optional. On a wimpy tiling GPU, however, things are different. Using a recent version of zink, even on a desktop GPU, you can run the same Chrome browser using `ZINK_DEBUG=rp,rploads` to enable the same codepaths used by tilers and also clear all uninitialized memory to red. Now load the same SVG, and you’ll see this: It took nearly a week of pair debugging and a new zink debug mode to prune down test cases and figure out what was happening. All around the composited SVG texture, memory is uninitialized. But this only shows up on tiling GPUs. And only if the driver is doing near-lethal amounts of very legal renderpass optimizations. This fast is too fast.
www.supergoodcode.com
October 3, 2025 at 4:22 AM