From 29a139b308d51560e0f1d5862fa228023c9a5a04 Mon Sep 17 00:00:00 2001 From: Scott D Phillips Date: Wed, 30 May 2018 20:24:15 -0700 Subject: [PATCH] anv/blorp: Write relocated values into surface states v2 (Jason Ekstrand): - Split the blorp bit into it's own patch and re-order a bit - Use anv_address helpers Reviewed-by: Jason Ekstrand --- src/intel/vulkan/anv_batch_chain.c | 16 ---------------- src/intel/vulkan/anv_private.h | 16 ++++++++++++++++ src/intel/vulkan/genX_blorp_exec.c | 6 ++++++ 3 files changed, 22 insertions(+), 16 deletions(-) diff --git a/src/intel/vulkan/anv_batch_chain.c b/src/intel/vulkan/anv_batch_chain.c index a1fb8bf731a..ec8815a3c44 100644 --- a/src/intel/vulkan/anv_batch_chain.c +++ b/src/intel/vulkan/anv_batch_chain.c @@ -1105,22 +1105,6 @@ anv_cmd_buffer_process_relocs(struct anv_cmd_buffer *cmd_buffer, list->relocs[i].target_handle = list->reloc_bos[i]->index; } -static void -write_reloc(const struct anv_device *device, void *p, uint64_t v, bool flush) -{ - unsigned reloc_size = 0; - if (device->info.gen >= 8) { - reloc_size = sizeof(uint64_t); - *(uint64_t *)p = gen_canonical_address(v); - } else { - reloc_size = sizeof(uint32_t); - *(uint32_t *)p = v; - } - - if (flush && !device->info.has_llc) - gen_flush_range(p, reloc_size); -} - static void adjust_relocations_from_state_pool(struct anv_state_pool *pool, struct anv_reloc_list *relocs, diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h index 5e07617054c..67a12c7206e 100644 --- a/src/intel/vulkan/anv_private.h +++ b/src/intel/vulkan/anv_private.h @@ -1144,6 +1144,22 @@ anv_address_add(struct anv_address addr, uint64_t offset) return addr; } +static inline void +write_reloc(const struct anv_device *device, void *p, uint64_t v, bool flush) +{ + unsigned reloc_size = 0; + if (device->info.gen >= 8) { + reloc_size = sizeof(uint64_t); + *(uint64_t *)p = gen_canonical_address(v); + } else { + reloc_size = sizeof(uint32_t); + *(uint32_t *)p = v; + } + + if (flush && !device->info.has_llc) + gen_flush_range(p, reloc_size); +} + static inline uint64_t _anv_combine_address(struct anv_batch *batch, void *location, const struct anv_address address, uint32_t delta) diff --git a/src/intel/vulkan/genX_blorp_exec.c b/src/intel/vulkan/genX_blorp_exec.c index 9023269d61b..ecca3928de5 100644 --- a/src/intel/vulkan/genX_blorp_exec.c +++ b/src/intel/vulkan/genX_blorp_exec.c @@ -62,6 +62,12 @@ blorp_surface_reloc(struct blorp_batch *batch, uint32_t ss_offset, ss_offset, address.buffer, address.offset + delta); if (result != VK_SUCCESS) anv_batch_set_error(&cmd_buffer->batch, result); + + void *dest = cmd_buffer->device->surface_state_pool.block_pool.map + + ss_offset; + uint64_t val = ((struct anv_bo*)address.buffer)->offset + address.offset + + delta; + write_reloc(cmd_buffer->device, dest, val, false); } #if GEN_GEN >= 7 && GEN_GEN < 10