浏览代码

anv: Split code to add BO dependencies to execbuf.

This part of the anv_execbuf_add_bo() code is totally independent of the
BO being added. Let's split it out, so we can reuse it later.

v3: rename to anv_execbuf_add_bo_set (Jason).

Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
tags/19.0-branchpoint
Rafael Antognolli 6 年前
父节点
当前提交
11a5d4620b
共有 1 个文件被更改,包括 39 次插入23 次删除
  1. 39
    23
      src/intel/vulkan/anv_batch_chain.c

+ 39
- 23
src/intel/vulkan/anv_batch_chain.c 查看文件

@@ -1035,6 +1035,12 @@ _compare_bo_handles(const void *_bo1, const void *_bo2)
return (*bo1)->gem_handle - (*bo2)->gem_handle;
}

static VkResult
anv_execbuf_add_bo_set(struct anv_execbuf *exec,
struct set *deps,
uint32_t extra_flags,
const VkAllocationCallbacks *alloc);

static VkResult
anv_execbuf_add_bo(struct anv_execbuf *exec,
struct anv_bo *bo,
@@ -1124,36 +1130,46 @@ anv_execbuf_add_bo(struct anv_execbuf *exec,
}
}

if (relocs->deps && relocs->deps->entries > 0) {
const uint32_t entries = relocs->deps->entries;
struct anv_bo **bos =
vk_alloc(alloc, entries * sizeof(*bos),
8, VK_SYSTEM_ALLOCATION_SCOPE_COMMAND);
if (bos == NULL)
return vk_error(VK_ERROR_OUT_OF_HOST_MEMORY);
return anv_execbuf_add_bo_set(exec, relocs->deps, extra_flags, alloc);
}

struct anv_bo **bo = bos;
set_foreach(relocs->deps, entry) {
*bo++ = (void *)entry->key;
}
return VK_SUCCESS;
}

qsort(bos, entries, sizeof(struct anv_bo*), _compare_bo_handles);
/* Add BO dependencies to execbuf */
static VkResult
anv_execbuf_add_bo_set(struct anv_execbuf *exec,
struct set *deps,
uint32_t extra_flags,
const VkAllocationCallbacks *alloc)
{
if (!deps || deps->entries <= 0)
return VK_SUCCESS;

VkResult result = VK_SUCCESS;
for (bo = bos; bo < bos + entries; bo++) {
result = anv_execbuf_add_bo(exec, *bo, NULL, extra_flags, alloc);
if (result != VK_SUCCESS)
break;
}
const uint32_t entries = deps->entries;
struct anv_bo **bos =
vk_alloc(alloc, entries * sizeof(*bos),
8, VK_SYSTEM_ALLOCATION_SCOPE_COMMAND);
if (bos == NULL)
return vk_error(VK_ERROR_OUT_OF_HOST_MEMORY);

vk_free(alloc, bos);
struct anv_bo **bo = bos;
set_foreach(deps, entry) {
*bo++ = (void *)entry->key;
}

if (result != VK_SUCCESS)
return result;
}
qsort(bos, entries, sizeof(struct anv_bo*), _compare_bo_handles);

VkResult result = VK_SUCCESS;
for (bo = bos; bo < bos + entries; bo++) {
result = anv_execbuf_add_bo(exec, *bo, NULL, extra_flags, alloc);
if (result != VK_SUCCESS)
break;
}

return VK_SUCCESS;
vk_free(alloc, bos);

return result;
}

static VkResult

正在加载...
取消
保存