RADV: VRS attachment not working in specific scenario
Description
When implementing variable rate shading in a side project, I ran into an issue where the fragment shading rate attachment does not appear to get used properly. Code can be found here, but since it's probably not immediately obvious how this translates to Vulkan, quick TL;DR:
- App renders a depth pre-pass with no shading rate attachment, then transitions it to
READ_ONLY_OPTIMAL
. - Rendering is done with 4x MSAA.
Haven't tested this without MSAA though.The issue persists even without MSAA, just tested that. - Shading rate image gets filled with a constant value of
5
(i.e. shading rate of 2x2), then transitioned toFRAGMENT_SHADING_RATE_ATTACHMENT_OPTIMAL
. - App then renders a color pass with the fragment shading rate image bound, and depth-stencil attachment using
READ_ONLY_OPTIMAL
layout (depth writes disabled accordingly). Pipeline is created with a shading rate of 2x1. - For testing purposes, the fragment shader uses
gl_ShadingRateEXT
to compute the output color.
If working correctly, this should render a green cube, indicating a 2x2 shading rate. Currently, this renders a blue cube, indicating an effective shading rate of 2x1, which is the pipeline shading rate. Any other shading rate would result in a red cube.
If I change the depth attachment layout in the color pass to ATTACHMENT_OPTIMAL
, then it works as expected for some reason.
No validation errors and AMDVLK as well as Nvidia behave as expected, so there might be some sort of driver bug going on.
Steps to reproduce
Here's a build of the test app: radv-vrs.tar.gz
If this does not work for whatever reason and you need to build manually, run:
git clone --recursive -b vrs https://github.com/doitsujin/alseid.git
cd alseid; meson setup --prefix $PWD/install build
cd build; ninja install
cd ../install/demos; ./02-cube
Annoyingly, I was not able to reproduce this with a RenderDoc capture of this application, for some reason it works just fine both when capturing and when replaying the capture, and since the capture is also fairly large I did not include one in this report. If a capture is needed to work out API usage for this demo, it's probably best to create one locally.
System information
- OS: Arch Linux
- GPU: RX 6900 XT
- Mesa version: 69cbc2e7