anv/cmd_buffer: Handle running out of binding tables in compute shaders
If we try to allocate a binding table and fail, we have to get a new binding table block, re-emit STATE_BASE_ADDRESS, and then try again. We already handle this correctly for 3D and blorp but it never got handled for CS. This fixes the new stress.lots-of-surface-state.cs.static crucible test. Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com> Reviewed-by: Jordan Justen <jordan.l.justen@intel.com> Cc: "13.0" <mesa-stable@lists.freedesktop.org>
This commit is contained in:
@@ -1512,12 +1512,22 @@ flush_compute_descriptor_set(struct anv_cmd_buffer *cmd_buffer)
|
|||||||
struct anv_state surfaces = { 0, }, samplers = { 0, };
|
struct anv_state surfaces = { 0, }, samplers = { 0, };
|
||||||
VkResult result;
|
VkResult result;
|
||||||
|
|
||||||
result = emit_samplers(cmd_buffer, MESA_SHADER_COMPUTE, &samplers);
|
|
||||||
if (result != VK_SUCCESS)
|
|
||||||
return result;
|
|
||||||
result = emit_binding_table(cmd_buffer, MESA_SHADER_COMPUTE, &surfaces);
|
result = emit_binding_table(cmd_buffer, MESA_SHADER_COMPUTE, &surfaces);
|
||||||
if (result != VK_SUCCESS)
|
if (result != VK_SUCCESS) {
|
||||||
return result;
|
result = anv_cmd_buffer_new_binding_table_block(cmd_buffer);
|
||||||
|
assert(result == VK_SUCCESS);
|
||||||
|
|
||||||
|
/* Re-emit state base addresses so we get the new surface state base
|
||||||
|
* address before we start emitting binding tables etc.
|
||||||
|
*/
|
||||||
|
genX(cmd_buffer_emit_state_base_address)(cmd_buffer);
|
||||||
|
|
||||||
|
result = emit_binding_table(cmd_buffer, MESA_SHADER_COMPUTE, &surfaces);
|
||||||
|
assert(result == VK_SUCCESS);
|
||||||
|
}
|
||||||
|
result = emit_samplers(cmd_buffer, MESA_SHADER_COMPUTE, &samplers);
|
||||||
|
assert(result == VK_SUCCESS);
|
||||||
|
|
||||||
|
|
||||||
struct anv_state push_state = anv_cmd_buffer_cs_push_constants(cmd_buffer);
|
struct anv_state push_state = anv_cmd_buffer_cs_push_constants(cmd_buffer);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user