1
$\begingroup$

So I have a framebuffer image which later acts as input to a compute shader, and some frames there is geometry drawn to the framebuffer, but some frames this is not necessary.

The thing is, in my current process, when I don't draw anything to that framebuffer, the image contents are undefined which leads to incorrect output of my compute shader. So on frames where there is no geometry drawn, I would like to simply clear the framebuffer.

In OpenGL this would be easy: glClearColor(...) but so far I have not been able to get it working on Vulkan.

I have tried just doing an empty renderpass: i.e: vkCmdBeginRenderPass/vkCmdEndRenderpass with the correct clear values defined in the VkRenderPassBeginInfo struct.

I have also tried doing a renderpass with only vkCmdClearAttachments between the bein/end commands.

So far I haven't had any luck. What's the best way to accomplish this?

$\endgroup$
4
$\begingroup$

You are looking for vkCmdClearColorImage,

It does exactly what it says on the tin, it clears an image to a specified color. This command uses the Transfer stage as far as barriers are concerned. You will need to add one between the clear and the vkCmdDispatch.

There is also a vkCmdClearDepthStencilImage if you need it.

$\endgroup$
  • $\begingroup$ Also, the image must be created with VK_IMAGE_USAGE_TRANSFER_DST_BIT, since clearing is a transfer operation. $\endgroup$ – Nicol Bolas Sep 5 '18 at 18:35
  • $\begingroup$ @NicolBolas but that's not the case for implicit clears via the renderpass? That seems like an odd distinction. $\endgroup$ – Jherico Sep 5 '18 at 20:03
  • 1
    $\begingroup$ @Jherico: Renderpass clears are often just changes to the render target caching system, so that cache-miss reads simply return the clear color, and writes of a partial cache-line fill in the other values with the clear color. So "clearing" is just a trick that never directly touches memory (and it's even moreso for TBR-based systems). When you clear an image directly, you're doing actual writes to the memory, rather than caching tricks or clearing tile storage. $\endgroup$ – Nicol Bolas Sep 5 '18 at 21:23

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.