diff --git a/.pick_status.json b/.pick_status.json index 104764f6be7..7118dd5f622 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -5634,7 +5634,7 @@ "description": "anv: fix nested command buffer relocations", "nominated": true, "nomination_type": 1, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": null, "notes": null diff --git a/src/intel/vulkan/anv_batch_chain.c b/src/intel/vulkan/anv_batch_chain.c index 890d354b4e4..83e51c2dcb3 100644 --- a/src/intel/vulkan/anv_batch_chain.c +++ b/src/intel/vulkan/anv_batch_chain.c @@ -1123,19 +1123,15 @@ anv_cmd_buffer_end_batch_buffer(struct anv_cmd_buffer *cmd_buffer) cmd_buffer->total_batch_size += batch_bo->length; } -static VkResult -anv_cmd_buffer_add_seen_bbos(struct anv_cmd_buffer *cmd_buffer, - struct list_head *list) +static void +anv_cmd_buffer_add_seen_bbos(struct anv_cmd_buffer *primary, + struct anv_cmd_buffer *secondary) { - list_for_each_entry(struct anv_batch_bo, bbo, list, link) { - struct anv_batch_bo **bbo_ptr = u_vector_add(&cmd_buffer->seen_bbos); - if (bbo_ptr == NULL) - return vk_error(cmd_buffer, VK_ERROR_OUT_OF_HOST_MEMORY); - - *bbo_ptr = bbo; + struct anv_batch_bo **bbo; + u_vector_foreach(bbo, &secondary->seen_bbos) { + struct anv_batch_bo **bbo_ptr = u_vector_add(&primary->seen_bbos); + *bbo_ptr = *bbo; } - - return VK_SUCCESS; } void @@ -1164,7 +1160,7 @@ anv_cmd_buffer_add_secondary(struct anv_cmd_buffer *primary, */ anv_batch_bo_link(primary, last_bbo, this_bbo, offset); - anv_cmd_buffer_add_seen_bbos(primary, &secondary->batch_bos); + anv_cmd_buffer_add_seen_bbos(primary, secondary); break; } case ANV_CMD_BUFFER_EXEC_MODE_COPY_AND_CHAIN: { @@ -1172,10 +1168,20 @@ anv_cmd_buffer_add_secondary(struct anv_cmd_buffer *primary, VkResult result = anv_batch_bo_list_clone(&secondary->batch_bos, secondary, ©_list); - if (result != VK_SUCCESS) + if (result != VK_SUCCESS) { + anv_batch_set_error(&primary->batch, result); return; /* FIXME */ + } - anv_cmd_buffer_add_seen_bbos(primary, ©_list); + list_for_each_entry(struct anv_batch_bo, bbo, ©_list, link) { + struct anv_batch_bo **bbo_ptr = u_vector_add(&primary->seen_bbos); + if (bbo_ptr == NULL) { + anv_batch_set_error(&primary->batch, + VK_ERROR_OUT_OF_HOST_MEMORY); + return; + } + *bbo_ptr = bbo; + } struct anv_batch_bo *first_bbo = list_first_entry(©_list, struct anv_batch_bo, link); @@ -1200,7 +1206,7 @@ anv_cmd_buffer_add_secondary(struct anv_cmd_buffer *primary, (struct anv_address) { .bo = first_bbo->bo }, secondary->return_addr); - anv_cmd_buffer_add_seen_bbos(primary, &secondary->batch_bos); + anv_cmd_buffer_add_seen_bbos(primary, secondary); break; } default: