X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;ds=sidebyside;f=src%2Fintel%2Fvulkan%2Fanv_batch_chain.c;h=70c14d14f4984e8baf386e8f88997479e51a857b;hb=a3153162a9b9a96b2f3b03b5016370366de203f0;hp=ff713d529afac655c76373c9717459be98843de3;hpb=48ed2a7bb009618edfde28ee87ae391c1879c35b;p=mesa.git diff --git a/src/intel/vulkan/anv_batch_chain.c b/src/intel/vulkan/anv_batch_chain.c index ff713d529af..70c14d14f49 100644 --- a/src/intel/vulkan/anv_batch_chain.c +++ b/src/intel/vulkan/anv_batch_chain.c @@ -46,70 +46,68 @@ * Functions related to anv_reloc_list *-----------------------------------------------------------------------*/ +VkResult +anv_reloc_list_init(struct anv_reloc_list *list, + const VkAllocationCallbacks *alloc) +{ + memset(list, 0, sizeof(*list)); + return VK_SUCCESS; +} + static VkResult anv_reloc_list_init_clone(struct anv_reloc_list *list, const VkAllocationCallbacks *alloc, const struct anv_reloc_list *other_list) { - if (other_list) { - list->num_relocs = other_list->num_relocs; - list->array_length = other_list->array_length; - } else { - list->num_relocs = 0; - list->array_length = 256; - } - - list->relocs = - vk_alloc(alloc, list->array_length * sizeof(*list->relocs), 8, - VK_SYSTEM_ALLOCATION_SCOPE_OBJECT); - - if (list->relocs == NULL) - return vk_error(VK_ERROR_OUT_OF_HOST_MEMORY); - - list->reloc_bos = - vk_alloc(alloc, list->array_length * sizeof(*list->reloc_bos), 8, - VK_SYSTEM_ALLOCATION_SCOPE_OBJECT); - - if (list->reloc_bos == NULL) { - vk_free(alloc, list->relocs); - return vk_error(VK_ERROR_OUT_OF_HOST_MEMORY); - } - - list->deps = _mesa_pointer_set_create(NULL); + list->num_relocs = other_list->num_relocs; + list->array_length = other_list->array_length; + + if (list->num_relocs > 0) { + list->relocs = + vk_alloc(alloc, list->array_length * sizeof(*list->relocs), 8, + VK_SYSTEM_ALLOCATION_SCOPE_OBJECT); + if (list->relocs == NULL) + return vk_error(VK_ERROR_OUT_OF_HOST_MEMORY); - if (!list->deps) { - vk_free(alloc, list->relocs); - vk_free(alloc, list->reloc_bos); - return vk_error(VK_ERROR_OUT_OF_HOST_MEMORY); - } + list->reloc_bos = + vk_alloc(alloc, list->array_length * sizeof(*list->reloc_bos), 8, + VK_SYSTEM_ALLOCATION_SCOPE_OBJECT); + if (list->reloc_bos == NULL) { + vk_free(alloc, list->relocs); + return vk_error(VK_ERROR_OUT_OF_HOST_MEMORY); + } - if (other_list) { memcpy(list->relocs, other_list->relocs, list->array_length * sizeof(*list->relocs)); memcpy(list->reloc_bos, other_list->reloc_bos, list->array_length * sizeof(*list->reloc_bos)); - set_foreach(other_list->deps, entry) { - _mesa_set_add_pre_hashed(list->deps, entry->hash, entry->key); + } else { + list->relocs = NULL; + list->reloc_bos = NULL; + } + + if (other_list->deps) { + list->deps = _mesa_set_clone(other_list->deps, NULL); + if (!list->deps) { + vk_free(alloc, list->relocs); + vk_free(alloc, list->reloc_bos); + return vk_error(VK_ERROR_OUT_OF_HOST_MEMORY); } + } else { + list->deps = NULL; } return VK_SUCCESS; } -VkResult -anv_reloc_list_init(struct anv_reloc_list *list, - const VkAllocationCallbacks *alloc) -{ - return anv_reloc_list_init_clone(list, alloc, NULL); -} - void anv_reloc_list_finish(struct anv_reloc_list *list, const VkAllocationCallbacks *alloc) { vk_free(alloc, list->relocs); vk_free(alloc, list->reloc_bos); - _mesa_set_destroy(list->deps, NULL); + if (list->deps != NULL) + _mesa_set_destroy(list->deps, NULL); } static VkResult @@ -120,34 +118,27 @@ anv_reloc_list_grow(struct anv_reloc_list *list, if (list->num_relocs + num_additional_relocs <= list->array_length) return VK_SUCCESS; - size_t new_length = list->array_length * 2; + size_t new_length = MAX2(256, list->array_length * 2); while (new_length < list->num_relocs + num_additional_relocs) new_length *= 2; struct drm_i915_gem_relocation_entry *new_relocs = - vk_alloc(alloc, new_length * sizeof(*list->relocs), 8, - VK_SYSTEM_ALLOCATION_SCOPE_OBJECT); + vk_realloc(alloc, list->relocs, + new_length * sizeof(*list->relocs), 8, + VK_SYSTEM_ALLOCATION_SCOPE_OBJECT); if (new_relocs == NULL) return vk_error(VK_ERROR_OUT_OF_HOST_MEMORY); + list->relocs = new_relocs; struct anv_bo **new_reloc_bos = - vk_alloc(alloc, new_length * sizeof(*list->reloc_bos), 8, - VK_SYSTEM_ALLOCATION_SCOPE_OBJECT); - if (new_reloc_bos == NULL) { - vk_free(alloc, new_relocs); + vk_realloc(alloc, list->reloc_bos, + new_length * sizeof(*list->reloc_bos), 8, + VK_SYSTEM_ALLOCATION_SCOPE_OBJECT); + if (new_reloc_bos == NULL) return vk_error(VK_ERROR_OUT_OF_HOST_MEMORY); - } - - memcpy(new_relocs, list->relocs, list->num_relocs * sizeof(*list->relocs)); - memcpy(new_reloc_bos, list->reloc_bos, - list->num_relocs * sizeof(*list->reloc_bos)); - - vk_free(alloc, list->relocs); - vk_free(alloc, list->reloc_bos); + list->reloc_bos = new_reloc_bos; list->array_length = new_length; - list->relocs = new_relocs; - list->reloc_bos = new_reloc_bos; return VK_SUCCESS; } @@ -161,6 +152,11 @@ anv_reloc_list_add(struct anv_reloc_list *list, int index; if (target_bo->flags & EXEC_OBJECT_PINNED) { + if (list->deps == NULL) { + list->deps = _mesa_pointer_set_create(NULL); + if (unlikely(list->deps == NULL)) + return vk_error(VK_ERROR_OUT_OF_HOST_MEMORY); + } _mesa_set_add(list->deps, target_bo); return VK_SUCCESS; } @@ -193,18 +189,26 @@ anv_reloc_list_append(struct anv_reloc_list *list, if (result != VK_SUCCESS) return result; - memcpy(&list->relocs[list->num_relocs], &other->relocs[0], - other->num_relocs * sizeof(other->relocs[0])); - memcpy(&list->reloc_bos[list->num_relocs], &other->reloc_bos[0], - other->num_relocs * sizeof(other->reloc_bos[0])); + if (other->num_relocs > 0) { + memcpy(&list->relocs[list->num_relocs], &other->relocs[0], + other->num_relocs * sizeof(other->relocs[0])); + memcpy(&list->reloc_bos[list->num_relocs], &other->reloc_bos[0], + other->num_relocs * sizeof(other->reloc_bos[0])); - for (uint32_t i = 0; i < other->num_relocs; i++) - list->relocs[i + list->num_relocs].offset += offset; + for (uint32_t i = 0; i < other->num_relocs; i++) + list->relocs[i + list->num_relocs].offset += offset; - list->num_relocs += other->num_relocs; + list->num_relocs += other->num_relocs; + } - set_foreach(other->deps, entry) { - _mesa_set_add_pre_hashed(list->deps, entry->hash, entry->key); + if (other->deps) { + if (list->deps == NULL) { + list->deps = _mesa_pointer_set_create(NULL); + if (unlikely(list->deps == NULL)) + return vk_error(VK_ERROR_OUT_OF_HOST_MEMORY); + } + set_foreach(other->deps, entry) + _mesa_set_add_pre_hashed(list->deps, entry->hash, entry->key); } return VK_SUCCESS; @@ -418,9 +422,9 @@ anv_batch_bo_link(struct anv_cmd_buffer *cmd_buffer, struct anv_batch_bo *next_bbo, uint32_t next_bbo_offset) { - MAYBE_UNUSED const uint32_t bb_start_offset = + const uint32_t bb_start_offset = prev_bbo->length - GEN8_MI_BATCH_BUFFER_START_length * 4; - MAYBE_UNUSED const uint32_t *bb_start = prev_bbo->bo.map + bb_start_offset; + ASSERTED const uint32_t *bb_start = prev_bbo->bo.map + bb_start_offset; /* Make sure we're looking at a MI_BATCH_BUFFER_START */ assert(((*bb_start >> 29) & 0x07) == 0); @@ -812,13 +816,13 @@ void anv_cmd_buffer_reset_batch_bo_chain(struct anv_cmd_buffer *cmd_buffer) { /* Delete all but the first batch bo */ - assert(!list_empty(&cmd_buffer->batch_bos)); + assert(!list_is_empty(&cmd_buffer->batch_bos)); while (cmd_buffer->batch_bos.next != cmd_buffer->batch_bos.prev) { struct anv_batch_bo *bbo = anv_cmd_buffer_current_batch_bo(cmd_buffer); list_del(&bbo->link); anv_batch_bo_destroy(bbo, cmd_buffer); } - assert(!list_empty(&cmd_buffer->batch_bos)); + assert(!list_is_empty(&cmd_buffer->batch_bos)); anv_batch_bo_start(anv_cmd_buffer_current_batch_bo(cmd_buffer), &cmd_buffer->batch, @@ -1393,18 +1397,13 @@ setup_execbuf_for_cmd_buffer(struct anv_execbuf *execbuf, anv_execbuf_add_bo_set(execbuf, cmd_buffer->surface_relocs.deps, 0, &cmd_buffer->device->alloc); - /* Add the BOs for all the pinned buffers */ - if (cmd_buffer->device->pinned_buffers->entries) { - struct set *pinned_bos = _mesa_pointer_set_create(NULL); - if (pinned_bos == NULL) - return vk_error(VK_ERROR_OUT_OF_DEVICE_MEMORY); - set_foreach(cmd_buffer->device->pinned_buffers, entry) { - const struct anv_buffer *buffer = entry->key; - _mesa_set_add(pinned_bos, buffer->address.bo); - } - anv_execbuf_add_bo_set(execbuf, pinned_bos, 0, - &cmd_buffer->device->alloc); - _mesa_set_destroy(pinned_bos, NULL); + /* Add the BOs for all memory objects */ + list_for_each_entry(struct anv_device_memory, mem, + &cmd_buffer->device->memory_objects, link) { + result = anv_execbuf_add_bo(execbuf, mem->bo, NULL, 0, + &cmd_buffer->device->alloc); + if (result != VK_SUCCESS) + return result; } struct anv_block_pool *pool; @@ -1599,6 +1598,7 @@ anv_cmd_buffer_execbuf(struct anv_device *device, VkFence _fence) { ANV_FROM_HANDLE(anv_fence, fence, _fence); + UNUSED struct anv_physical_device *pdevice = &device->instance->physicalDevice; struct anv_execbuf execbuf; anv_execbuf_init(&execbuf); @@ -1613,6 +1613,7 @@ anv_cmd_buffer_execbuf(struct anv_device *device, switch (impl->type) { case ANV_SEMAPHORE_TYPE_BO: + assert(!pdevice->has_syncobj); result = anv_execbuf_add_bo(&execbuf, impl->bo, NULL, 0, &device->alloc); if (result != VK_SUCCESS) @@ -1620,6 +1621,7 @@ anv_cmd_buffer_execbuf(struct anv_device *device, break; case ANV_SEMAPHORE_TYPE_SYNC_FILE: + assert(!pdevice->has_syncobj); if (in_fence == -1) { in_fence = impl->fd; } else { @@ -1669,6 +1671,7 @@ anv_cmd_buffer_execbuf(struct anv_device *device, switch (impl->type) { case ANV_SEMAPHORE_TYPE_BO: + assert(!pdevice->has_syncobj); result = anv_execbuf_add_bo(&execbuf, impl->bo, NULL, EXEC_OBJECT_WRITE, &device->alloc); if (result != VK_SUCCESS) @@ -1676,6 +1679,7 @@ anv_cmd_buffer_execbuf(struct anv_device *device, break; case ANV_SEMAPHORE_TYPE_SYNC_FILE: + assert(!pdevice->has_syncobj); need_out_fence = true; break; @@ -1710,6 +1714,7 @@ anv_cmd_buffer_execbuf(struct anv_device *device, switch (impl->type) { case ANV_FENCE_TYPE_BO: + assert(!pdevice->has_syncobj_wait); result = anv_execbuf_add_bo(&execbuf, &impl->bo.bo, NULL, EXEC_OBJECT_WRITE, &device->alloc); if (result != VK_SUCCESS) @@ -1729,10 +1734,20 @@ anv_cmd_buffer_execbuf(struct anv_device *device, } } - if (cmd_buffer) + if (cmd_buffer) { + if (unlikely(INTEL_DEBUG & DEBUG_BATCH)) { + struct anv_batch_bo **bo = u_vector_tail(&cmd_buffer->seen_bbos); + + device->cmd_buffer_being_decoded = cmd_buffer; + gen_print_batch(&device->decoder_ctx, (*bo)->bo.map, + (*bo)->bo.size, (*bo)->bo.offset, false); + device->cmd_buffer_being_decoded = NULL; + } + result = setup_execbuf_for_cmd_buffer(&execbuf, cmd_buffer); - else + } else { result = setup_empty_execbuf(&execbuf, device); + } if (result != VK_SUCCESS) return result; @@ -1773,6 +1788,7 @@ anv_cmd_buffer_execbuf(struct anv_device *device, } if (fence && fence->permanent.type == ANV_FENCE_TYPE_BO) { + assert(!pdevice->has_syncobj_wait); /* BO fences can't be shared, so they can't be temporary. */ assert(fence->temporary.type == ANV_FENCE_TYPE_NONE); @@ -1790,6 +1806,7 @@ anv_cmd_buffer_execbuf(struct anv_device *device, } if (result == VK_SUCCESS && need_out_fence) { + assert(!pdevice->has_syncobj_wait); int out_fence = execbuf.execbuf.rsvd2 >> 32; for (uint32_t i = 0; i < num_out_semaphores; i++) { ANV_FROM_HANDLE(anv_semaphore, semaphore, out_semaphores[i]);