[Mesa-dev] [PATCH 6/9] anv: Pull the guts of cmd_buffer_execbuf into a helper
Jason Ekstrand
jason at jlekstrand.net
Tue Feb 28 16:56:44 UTC 2017
---
src/intel/vulkan/anv_batch_chain.c | 55 +++++++++++++++++++++-----------------
1 file changed, 31 insertions(+), 24 deletions(-)
diff --git a/src/intel/vulkan/anv_batch_chain.c b/src/intel/vulkan/anv_batch_chain.c
index e5cc21d..c55938a 100644
--- a/src/intel/vulkan/anv_batch_chain.c
+++ b/src/intel/vulkan/anv_batch_chain.c
@@ -1223,21 +1223,18 @@ relocate_cmd_buffer(struct anv_cmd_buffer *cmd_buffer,
return true;
}
-VkResult
-anv_cmd_buffer_execbuf(struct anv_device *device,
- struct anv_cmd_buffer *cmd_buffer)
+static void
+setup_execbuf_for_cmd_buffer(struct anv_execbuf *execbuf,
+ struct anv_cmd_buffer *cmd_buffer)
{
struct anv_batch *batch = &cmd_buffer->batch;
struct anv_block_pool *ss_pool =
&cmd_buffer->device->surface_state_block_pool;
- struct anv_execbuf execbuf;
- anv_execbuf_init(&execbuf);
-
adjust_relocations_from_state_pool(ss_pool, &cmd_buffer->surface_relocs,
cmd_buffer->last_ss_pool_center);
- anv_execbuf_add_bo(&execbuf, &ss_pool->bo, &cmd_buffer->surface_relocs,
- &device->alloc);
+ anv_execbuf_add_bo(execbuf, &ss_pool->bo, &cmd_buffer->surface_relocs,
+ &cmd_buffer->device->alloc);
/* First, we walk over all of the bos we've seen and add them and their
* relocations to the validate list.
@@ -1247,8 +1244,8 @@ anv_cmd_buffer_execbuf(struct anv_device *device,
adjust_relocations_to_state_pool(ss_pool, &(*bbo)->bo, &(*bbo)->relocs,
cmd_buffer->last_ss_pool_center);
- anv_execbuf_add_bo(&execbuf, &(*bbo)->bo, &(*bbo)->relocs,
- &device->alloc);
+ anv_execbuf_add_bo(execbuf, &(*bbo)->bo, &(*bbo)->relocs,
+ &cmd_buffer->device->alloc);
}
/* Now that we've adjusted all of the surface state relocations, we need to
@@ -1265,19 +1262,19 @@ anv_cmd_buffer_execbuf(struct anv_device *device,
* corresponding to the first batch_bo in the chain with the last
* element in the list.
*/
- if (first_batch_bo->bo.index != execbuf.bo_count - 1) {
+ if (first_batch_bo->bo.index != execbuf->bo_count - 1) {
uint32_t idx = first_batch_bo->bo.index;
- uint32_t last_idx = execbuf.bo_count - 1;
+ uint32_t last_idx = execbuf->bo_count - 1;
- struct drm_i915_gem_exec_object2 tmp_obj = execbuf.objects[idx];
- assert(execbuf.bos[idx] == &first_batch_bo->bo);
+ struct drm_i915_gem_exec_object2 tmp_obj = execbuf->objects[idx];
+ assert(execbuf->bos[idx] == &first_batch_bo->bo);
- execbuf.objects[idx] = execbuf.objects[last_idx];
- execbuf.bos[idx] = execbuf.bos[last_idx];
- execbuf.bos[idx]->index = idx;
+ execbuf->objects[idx] = execbuf->objects[last_idx];
+ execbuf->bos[idx] = execbuf->bos[last_idx];
+ execbuf->bos[idx]->index = idx;
- execbuf.objects[last_idx] = tmp_obj;
- execbuf.bos[last_idx] = &first_batch_bo->bo;
+ execbuf->objects[last_idx] = tmp_obj;
+ execbuf->bos[last_idx] = &first_batch_bo->bo;
first_batch_bo->bo.index = last_idx;
}
@@ -1298,9 +1295,9 @@ anv_cmd_buffer_execbuf(struct anv_device *device,
}
}
- execbuf.execbuf = (struct drm_i915_gem_execbuffer2) {
- .buffers_ptr = (uintptr_t) execbuf.objects,
- .buffer_count = execbuf.bo_count,
+ execbuf->execbuf = (struct drm_i915_gem_execbuffer2) {
+ .buffers_ptr = (uintptr_t) execbuf->objects,
+ .buffer_count = execbuf->bo_count,
.batch_start_offset = 0,
.batch_len = batch->next - batch->start,
.cliprects_ptr = 0,
@@ -1313,7 +1310,7 @@ anv_cmd_buffer_execbuf(struct anv_device *device,
.rsvd2 = 0,
};
- if (relocate_cmd_buffer(cmd_buffer, &execbuf)) {
+ if (relocate_cmd_buffer(cmd_buffer, execbuf)) {
/* If we were able to successfully relocate everything, tell the kernel
* that it can skip doing relocations. The requirement for using
* NO_RELOC is:
@@ -1338,7 +1335,7 @@ anv_cmd_buffer_execbuf(struct anv_device *device,
* the RENDER_SURFACE_STATE matches presumed_offset, so it should be
* safe for the kernel to relocate them as needed.
*/
- execbuf.execbuf.flags |= I915_EXEC_NO_RELOC;
+ execbuf->execbuf.flags |= I915_EXEC_NO_RELOC;
} else {
/* In the case where we fall back to doing kernel relocations, we need
* to ensure that the relocation list is valid. All relocations on the
@@ -1352,6 +1349,16 @@ anv_cmd_buffer_execbuf(struct anv_device *device,
for (size_t i = 0; i < cmd_buffer->surface_relocs.num_relocs; i++)
cmd_buffer->surface_relocs.relocs[i].presumed_offset = -1;
}
+}
+
+VkResult
+anv_cmd_buffer_execbuf(struct anv_device *device,
+ struct anv_cmd_buffer *cmd_buffer)
+{
+ struct anv_execbuf execbuf;
+ anv_execbuf_init(&execbuf);
+
+ setup_execbuf_for_cmd_buffer(&execbuf, cmd_buffer);
VkResult result = anv_device_execbuf(device, &execbuf.execbuf, execbuf.bos);
--
2.5.0.400.gff86faf
More information about the mesa-dev
mailing list