mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-08 04:48:08 +02:00
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:b49b18f0b7("anv: reduce BT emissions & surface state writes with push descriptors") Reviewed-by: Tapani Pälli <tapani.palli@intel.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/23156> (cherry picked from commitcab7ba00e2)
This commit is contained in:
parent
ab570dd3fc
commit
7a6aef60b6
2 changed files with 2 additions and 1 deletions
|
|
@ -679,7 +679,7 @@
|
|||
"description": "anv: fix push descriptor deferred surface state packing",
|
||||
"nominated": true,
|
||||
"nomination_type": 1,
|
||||
"resolution": 0,
|
||||
"resolution": 1,
|
||||
"main_sha": null,
|
||||
"because_sha": "b49b18f0b7acb4c64a0a9fd2ee55aeea868e701d"
|
||||
},
|
||||
|
|
|
|||
|
|
@ -864,6 +864,7 @@ anv_cmd_buffer_push_descriptor_set(struct anv_cmd_buffer *cmd_buffer,
|
|||
anv_descriptor_set_layout_unref(cmd_buffer->device, set->layout);
|
||||
anv_descriptor_set_layout_ref(layout);
|
||||
set->layout = layout;
|
||||
set->generate_surface_states = 0;
|
||||
}
|
||||
set->is_push = true;
|
||||
set->size = anv_descriptor_set_layout_size(layout, false /* host_only */, 0);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue