vk/batch: Make relocs a pointer to a relocation list
authorJason Ekstrand <jason.ekstrand@intel.com>
Wed, 29 Jul 2015 16:23:11 +0000 (09:23 -0700)
committerJason Ekstrand <jason.ekstrand@intel.com>
Wed, 29 Jul 2015 19:01:08 +0000 (12:01 -0700)
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.

src/vulkan/anv_cmd_buffer.c
src/vulkan/anv_pipeline.c
src/vulkan/anv_private.h

index a986df2860cd1ba7a0a8a32d6cce66e9686841fe..1c88ee5b6abfe5a5693f5109e5b3cb88f7aa305b 100644 (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,
index 5a36faa29b5f83e3918ea6b555cef7965624007c..3c9c14193de1791b8deda6cb6a192278fc9f5aac 100644 (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);
index 3258e8c2adc4a104dbe965128e6a3b69f8569145..cb302c961620b1b2c07ab7caa1842f0c695e296d 100644 (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;