Skip to content

anv: fix push descriptor deferred surface state packing

Yuzu is running into a segfault because it writes the push descriptor twice with 2 different layouts, but without a draw/dispatch in between.

First vkCmdPushDescriptorSetKHR() writes descriptor 0 & 1 with a uniform buffer. We toggle the 2 first bits of anv_descriptor_set::generate_surface_states.

Second vkCmdPushDescriptorSetKHR() writes descriptor 0 with uniform buffer and descriptor 1 with an image view. The first bit of anv_descriptor_set::generate_surface_states stays, but the second bit was already set before and it should now be off.

When we finally flush the push descriptor, we try to generate a surface state for descriptor 1, but there is no valid buffer view for it, we access an invalid pointer and segfault.

This fix resets the anv_descriptor_set::generate_surface_states when the descriptor layout changes.

Signed-off-by: Lionel Landwerlin lionel.g.landwerlin@intel.com Fixes: b49b18f0 ("anv: reduce BT emissions & surface state writes with push descriptors")

Merge request reports