vk/batch: Make relocs a pointer to a relocation list

Previously anv_batch.relocs was an actual relocation list.  However, this
is limiting if the implementation of the batch wants to change the
relocation list as the batch progresses.
This commit is contained in:
Jason Ekstrand 2015-07-29 09:23:11 -07:00
parent fcea3e2d23
commit 7d50734240
3 changed files with 22 additions and 17 deletions

View File

@ -175,7 +175,7 @@ uint64_t
anv_batch_emit_reloc(struct anv_batch *batch,
void *location, struct anv_bo *bo, uint32_t delta)
{
return anv_reloc_list_add(&batch->relocs, batch->device,
return anv_reloc_list_add(batch->relocs, batch->device,
location - batch->start, bo, delta);
}
@ -196,8 +196,8 @@ anv_batch_emit_batch(struct anv_batch *batch, struct anv_batch *other)
memcpy(batch->next, other->start, size);
offset = batch->next - batch->start;
anv_reloc_list_append(&batch->relocs, batch->device,
&other->relocs, offset);
anv_reloc_list_append(batch->relocs, batch->device,
other->relocs, offset);
batch->next += size;
}
@ -235,7 +235,7 @@ anv_batch_bo_start(struct anv_batch_bo *bbo, struct anv_batch *batch,
{
batch->next = batch->start = bbo->bo.map;
batch->end = bbo->bo.map + bbo->bo.size - batch_padding;
bbo->first_reloc = batch->relocs.num_relocs;
bbo->first_reloc = batch->relocs->num_relocs;
}
static void
@ -248,7 +248,7 @@ anv_batch_bo_finish(struct anv_batch_bo *bbo, struct anv_batch *batch)
assert(batch->start == bbo->bo.map);
bbo->length = batch->next - batch->start;
VG(VALGRIND_CHECK_MEM_IS_DEFINED(batch->start, bbo->length));
bbo->num_relocs = batch->relocs.num_relocs - bbo->first_reloc;
bbo->num_relocs = batch->relocs->num_relocs - bbo->first_reloc;
}
static void
@ -382,13 +382,14 @@ anv_cmd_buffer_init_batch_bo_chain(struct anv_cmd_buffer *cmd_buffer)
list_addtail(&batch_bo->link, &cmd_buffer->batch_bos);
result = anv_reloc_list_init(&cmd_buffer->batch.relocs, device);
result = anv_reloc_list_init(&cmd_buffer->batch_relocs, device);
if (result != VK_SUCCESS)
goto fail_batch_bo;
cmd_buffer->batch.device = device;
cmd_buffer->batch.extend_cb = anv_cmd_buffer_chain_batch;
cmd_buffer->batch.user_data = cmd_buffer;
cmd_buffer->batch.relocs = &cmd_buffer->batch_relocs;
anv_batch_bo_start(batch_bo, &cmd_buffer->batch,
GEN8_MI_BATCH_BUFFER_START_length * 4);
@ -416,7 +417,7 @@ anv_cmd_buffer_init_batch_bo_chain(struct anv_cmd_buffer *cmd_buffer)
fail_ss_batch_bo:
anv_batch_bo_destroy(surface_bbo, device);
fail_batch_relocs:
anv_reloc_list_finish(&cmd_buffer->batch.relocs, device);
anv_reloc_list_finish(&cmd_buffer->batch_relocs, device);
fail_batch_bo:
anv_batch_bo_destroy(batch_bo, device);
@ -433,7 +434,7 @@ anv_cmd_buffer_fini_batch_bo_chain(struct anv_cmd_buffer *cmd_buffer)
&cmd_buffer->batch_bos, link) {
anv_batch_bo_destroy(bbo, device);
}
anv_reloc_list_finish(&cmd_buffer->batch.relocs, device);
anv_reloc_list_finish(&cmd_buffer->batch_relocs, device);
/* Destroy all of the surface state buffers */
list_for_each_entry_safe(struct anv_batch_bo, bbo,
@ -460,7 +461,7 @@ anv_cmd_buffer_reset_batch_bo_chain(struct anv_cmd_buffer *cmd_buffer)
}
assert(!list_empty(&cmd_buffer->batch_bos));
cmd_buffer->batch.relocs.num_relocs = 0;
cmd_buffer->batch_relocs.num_relocs = 0;
anv_batch_bo_start(anv_cmd_buffer_current_batch_bo(cmd_buffer),
&cmd_buffer->batch,
GEN8_MI_BATCH_BUFFER_START_length * 4);
@ -618,21 +619,21 @@ anv_cmd_buffer_prepare_execbuf(struct anv_cmd_buffer *cmd_buffer)
continue;
anv_cmd_buffer_add_bo(cmd_buffer, &bbo->bo,
&batch->relocs.relocs[bbo->first_reloc],
&cmd_buffer->batch_relocs.relocs[bbo->first_reloc],
bbo->num_relocs);
}
/* Add everything referenced by the batches */
anv_cmd_buffer_add_validate_bos(cmd_buffer, &batch->relocs);
anv_cmd_buffer_add_validate_bos(cmd_buffer, &cmd_buffer->batch_relocs);
/* Add the first batch bo last */
anv_cmd_buffer_add_bo(cmd_buffer, &first_batch_bo->bo,
&batch->relocs.relocs[first_batch_bo->first_reloc],
&cmd_buffer->batch_relocs.relocs[first_batch_bo->first_reloc],
first_batch_bo->num_relocs);
assert(first_batch_bo->bo.index == cmd_buffer->execbuf2.bo_count - 1);
anv_cmd_buffer_process_relocs(cmd_buffer, &cmd_buffer->surface_relocs);
anv_cmd_buffer_process_relocs(cmd_buffer, &batch->relocs);
anv_cmd_buffer_process_relocs(cmd_buffer, &cmd_buffer->batch_relocs);
cmd_buffer->execbuf2.execbuf = (struct drm_i915_gem_execbuffer2) {
.buffers_ptr = (uintptr_t) cmd_buffer->execbuf2.objects,

View File

@ -488,13 +488,14 @@ anv_pipeline_create(
pipeline->layout = anv_pipeline_layout_from_handle(pCreateInfo->layout);
memset(pipeline->shaders, 0, sizeof(pipeline->shaders));
result = anv_reloc_list_init(&pipeline->batch.relocs, device);
result = anv_reloc_list_init(&pipeline->batch_relocs, device);
if (result != VK_SUCCESS) {
anv_device_free(device, pipeline);
return result;
}
pipeline->batch.next = pipeline->batch.start = pipeline->batch_data;
pipeline->batch.end = pipeline->batch.start + sizeof(pipeline->batch_data);
pipeline->batch.relocs = &pipeline->batch_relocs;
anv_state_stream_init(&pipeline->program_stream,
&device->instruction_block_pool);
@ -758,7 +759,7 @@ VkResult anv_DestroyPipeline(
ANV_FROM_HANDLE(anv_pipeline, pipeline, _pipeline);
anv_compiler_free(pipeline);
anv_reloc_list_finish(&pipeline->batch.relocs, pipeline->device);
anv_reloc_list_finish(&pipeline->batch_relocs, pipeline->device);
anv_state_stream_finish(&pipeline->program_stream);
anv_state_pool_free(&device->dynamic_state_pool, pipeline->blend_state);
anv_device_free(pipeline->device, pipeline);
@ -810,13 +811,14 @@ static VkResult anv_compute_pipeline_create(
pipeline->device = device;
pipeline->layout = anv_pipeline_layout_from_handle(pCreateInfo->layout);
result = anv_reloc_list_init(&pipeline->batch.relocs, device);
result = anv_reloc_list_init(&pipeline->batch_relocs, device);
if (result != VK_SUCCESS) {
anv_device_free(device, pipeline);
return result;
}
pipeline->batch.next = pipeline->batch.start = pipeline->batch_data;
pipeline->batch.end = pipeline->batch.start + sizeof(pipeline->batch_data);
pipeline->batch.relocs = &pipeline->batch_relocs;
anv_state_stream_init(&pipeline->program_stream,
&device->instruction_block_pool);

View File

@ -483,7 +483,7 @@ struct anv_batch {
void * end;
void * next;
struct anv_reloc_list relocs;
struct anv_reloc_list * relocs;
/* This callback is called (with the associated user data) in the event
* that the batch runs out of space.
@ -702,6 +702,7 @@ struct anv_cmd_buffer {
* These fields are initialized by anv_cmd_buffer_init_batch_bo_chain().
*/
struct list_head batch_bos;
struct anv_reloc_list batch_relocs;
struct list_head surface_bos;
uint32_t surface_next;
struct anv_reloc_list surface_relocs;
@ -783,6 +784,7 @@ struct anv_pipeline {
struct anv_device * device;
struct anv_batch batch;
uint32_t batch_data[256];
struct anv_reloc_list batch_relocs;
struct anv_shader * shaders[VK_SHADER_STAGE_NUM];
struct anv_pipeline_layout * layout;
bool use_repclear;