diff --git a/src/intel/vulkan/anv_allocator.c b/src/intel/vulkan/anv_allocator.c index 92eb678a46d..a35eefc370d 100644 --- a/src/intel/vulkan/anv_allocator.c +++ b/src/intel/vulkan/anv_allocator.c @@ -377,14 +377,14 @@ anv_block_pool_init(struct anv_block_pool *pool, pool->name = name; pool->device = device; - pool->use_softpin = device->physical->use_softpin; + pool->use_relocations = anv_use_relocations(device->physical); pool->nbos = 0; pool->size = 0; pool->center_bo_offset = 0; pool->start_address = intel_canonical_address(start_address); pool->map = NULL; - if (pool->use_softpin) { + if (!pool->use_relocations) { pool->bo = NULL; pool->fd = -1; } else { @@ -462,7 +462,7 @@ anv_block_pool_expand_range(struct anv_block_pool *pool, /* Assert that we don't go outside the bounds of the memfd */ assert(center_bo_offset <= BLOCK_POOL_MEMFD_CENTER); - assert(pool->use_softpin || + assert(!pool->use_relocations || size - center_bo_offset <= BLOCK_POOL_MEMFD_SIZE - BLOCK_POOL_MEMFD_CENTER); @@ -493,10 +493,10 @@ anv_block_pool_expand_range(struct anv_block_pool *pool, * addresses we choose are fine for base addresses. */ enum anv_bo_alloc_flags bo_alloc_flags = ANV_BO_ALLOC_CAPTURE; - if (!pool->use_softpin) + if (pool->use_relocations) bo_alloc_flags |= ANV_BO_ALLOC_32BIT_ADDRESS; - if (pool->use_softpin) { + if (!pool->use_relocations) { uint32_t new_bo_size = size - pool->size; struct anv_bo *new_bo; assert(center_bo_offset == 0); @@ -575,7 +575,7 @@ anv_block_pool_expand_range(struct anv_block_pool *pool, void* anv_block_pool_map(struct anv_block_pool *pool, int32_t offset, uint32_t size) { - if (pool->use_softpin) { + if (!pool->use_relocations) { struct anv_bo *bo = NULL; int32_t bo_offset = 0; anv_block_pool_foreach_bo(iter_bo, pool) { @@ -662,7 +662,7 @@ anv_block_pool_grow(struct anv_block_pool *pool, struct anv_block_state *state, uint32_t back_required = MAX2(back_used, old_back); uint32_t front_required = MAX2(front_used, old_front); - if (pool->use_softpin) { + if (!pool->use_relocations) { /* With softpin, the pool is made up of a bunch of buffers with separate * maps. Make sure we have enough contiguous space that we can get a * properly contiguous map for the next chunk. @@ -755,7 +755,7 @@ anv_block_pool_alloc_new(struct anv_block_pool *pool, if (state.next + block_size <= state.end) { return state.next; } else if (state.next <= state.end) { - if (pool->use_softpin && state.next < state.end) { + if (!pool->use_relocations && state.next < state.end) { /* We need to grow the block pool, but still have some leftover * space that can't be used by that particular allocation. So we * add that as a "padding", and return it. diff --git a/src/intel/vulkan/anv_batch_chain.c b/src/intel/vulkan/anv_batch_chain.c index 4b01c149abf..08377b4601a 100644 --- a/src/intel/vulkan/anv_batch_chain.c +++ b/src/intel/vulkan/anv_batch_chain.c @@ -482,14 +482,7 @@ anv_batch_bo_link(struct anv_cmd_buffer *cmd_buffer, assert(((*bb_start >> 29) & 0x07) == 0); assert(((*bb_start >> 23) & 0x3f) == 49); - if (cmd_buffer->device->physical->use_softpin) { - assert(prev_bbo->bo->flags & EXEC_OBJECT_PINNED); - assert(next_bbo->bo->flags & EXEC_OBJECT_PINNED); - - write_reloc(cmd_buffer->device, - prev_bbo->bo->map + bb_start_offset + 4, - next_bbo->bo->offset + next_bbo_offset, true); - } else { + if (anv_use_relocations(cmd_buffer->device->physical)) { uint32_t reloc_idx = prev_bbo->relocs.num_relocs - 1; assert(prev_bbo->relocs.relocs[reloc_idx].offset == bb_start_offset + 4); @@ -498,6 +491,13 @@ anv_batch_bo_link(struct anv_cmd_buffer *cmd_buffer, /* Use a bogus presumed offset to force a relocation */ prev_bbo->relocs.relocs[reloc_idx].presumed_offset = -1; + } else { + assert(prev_bbo->bo->flags & EXEC_OBJECT_PINNED); + assert(next_bbo->bo->flags & EXEC_OBJECT_PINNED); + + write_reloc(cmd_buffer->device, + prev_bbo->bo->map + bb_start_offset + 4, + next_bbo->bo->offset + next_bbo_offset, true); } } @@ -617,7 +617,7 @@ static void anv_cmd_buffer_record_chain_submit(struct anv_cmd_buffer *cmd_buffer_from, struct anv_cmd_buffer *cmd_buffer_to) { - assert(cmd_buffer_from->device->physical->use_softpin); + assert(!anv_use_relocations(cmd_buffer_from->device->physical)); uint32_t *bb_start = cmd_buffer_from->batch_end; @@ -647,7 +647,7 @@ anv_cmd_buffer_record_chain_submit(struct anv_cmd_buffer *cmd_buffer_from, static void anv_cmd_buffer_record_end_submit(struct anv_cmd_buffer *cmd_buffer) { - assert(cmd_buffer->device->physical->use_softpin); + assert(!anv_use_relocations(cmd_buffer->device->physical)); struct anv_batch_bo *last_bbo = list_last_entry(&cmd_buffer->batch_bos, struct anv_batch_bo, link); @@ -1569,12 +1569,7 @@ setup_execbuf_for_cmd_buffer(struct anv_execbuf *execbuf, adjust_relocations_from_state_pool(ss_pool, &cmd_buffer->surface_relocs, cmd_buffer->last_ss_pool_center); VkResult result; - if (cmd_buffer->device->physical->use_softpin) { - /* Add surface dependencies (BOs) to the execbuf */ - anv_execbuf_add_bo_bitset(cmd_buffer->device, execbuf, - cmd_buffer->surface_relocs.dep_words, - cmd_buffer->surface_relocs.deps, 0); - } else { + if (anv_use_relocations(cmd_buffer->device->physical)) { /* Since we aren't in the softpin case, all of our STATE_BASE_ADDRESS BOs * will get added automatically by processing relocations on the batch * buffer. We have to add the surface state BO manually because it has @@ -1585,6 +1580,11 @@ setup_execbuf_for_cmd_buffer(struct anv_execbuf *execbuf, &cmd_buffer->surface_relocs, 0); if (result != VK_SUCCESS) return result; + } else { + /* Add surface dependencies (BOs) to the execbuf */ + anv_execbuf_add_bo_bitset(cmd_buffer->device, execbuf, + cmd_buffer->surface_relocs.dep_words, + cmd_buffer->surface_relocs.deps, 0); } /* First, we walk over all of the bos we've seen and add them and their @@ -1649,7 +1649,7 @@ setup_execbuf_for_cmd_buffers(struct anv_execbuf *execbuf, } /* Add all the global BOs to the object list for softpin case. */ - if (device->physical->use_softpin) { + if (!anv_use_relocations(device->physical)) { anv_block_pool_foreach_bo(bo, &ss_pool->block_pool) { result = anv_execbuf_add_bo(device, execbuf, bo, NULL, 0); if (result != VK_SUCCESS) @@ -1777,7 +1777,7 @@ setup_execbuf_for_cmd_buffers(struct anv_execbuf *execbuf, } /* If we are pinning our BOs, we shouldn't have to relocate anything */ - if (device->physical->use_softpin) + if (!anv_use_relocations(device->physical)) assert(!execbuf->has_relocs); /* Now we go through and fixup all of the relocation lists to point to the diff --git a/src/intel/vulkan/anv_device.c b/src/intel/vulkan/anv_device.c index bdb36d0bec1..8c10788d27d 100644 --- a/src/intel/vulkan/anv_device.c +++ b/src/intel/vulkan/anv_device.c @@ -205,7 +205,7 @@ get_device_extensions(const struct anv_physical_device *device, .KHR_maintenance4 = true, .KHR_multiview = true, .KHR_performance_query = - device->use_softpin && device->perf && + !anv_use_relocations(device) && device->perf && (device->perf->i915_perf_version >= 3 || INTEL_DEBUG(DEBUG_NO_OACONFIG)) && device->use_call_secondary, @@ -3094,7 +3094,7 @@ VkResult anv_CreateDevice( } } - if (physical_device->use_softpin) { + if (!anv_use_relocations(physical_device)) { if (pthread_mutex_init(&device->vma_mutex, NULL) != 0) { result = vk_error(device, VK_ERROR_INITIALIZATION_FAILED); goto fail_queues; @@ -3214,7 +3214,7 @@ VkResult anv_CreateDevice( if (result != VK_SUCCESS) goto fail_instruction_state_pool; - if (physical_device->use_softpin) { + if (!anv_use_relocations(physical_device)) { int64_t bt_pool_offset = (int64_t)BINDING_TABLE_POOL_MIN_ADDRESS - (int64_t)SURFACE_STATE_POOL_MIN_ADDRESS; assert(INT32_MIN < bt_pool_offset && bt_pool_offset < 0); @@ -3310,7 +3310,7 @@ VkResult anv_CreateDevice( device->aux_map_ctx = NULL; } fail_binding_table_pool: - if (physical_device->use_softpin) + if (!anv_use_relocations(physical_device)) anv_state_pool_finish(&device->binding_table_pool); fail_surface_state_pool: anv_state_pool_finish(&device->surface_state_pool); @@ -3330,7 +3330,7 @@ VkResult anv_CreateDevice( fail_mutex: pthread_mutex_destroy(&device->mutex); fail_vmas: - if (physical_device->use_softpin) { + if (!anv_use_relocations(physical_device)) { util_vma_heap_finish(&device->vma_hi); util_vma_heap_finish(&device->vma_cva); util_vma_heap_finish(&device->vma_lo); @@ -3391,7 +3391,7 @@ void anv_DestroyDevice( device->aux_map_ctx = NULL; } - if (device->physical->use_softpin) + if (!anv_use_relocations(device->physical)) anv_state_pool_finish(&device->binding_table_pool); anv_state_pool_finish(&device->surface_state_pool); anv_state_pool_finish(&device->instruction_state_pool); @@ -3402,7 +3402,7 @@ void anv_DestroyDevice( anv_bo_cache_finish(&device->bo_cache); - if (device->physical->use_softpin) { + if (!anv_use_relocations(device->physical)) { util_vma_heap_finish(&device->vma_hi); util_vma_heap_finish(&device->vma_cva); util_vma_heap_finish(&device->vma_lo); diff --git a/src/intel/vulkan/anv_nir_apply_pipeline_layout.c b/src/intel/vulkan/anv_nir_apply_pipeline_layout.c index 3d9a062075b..ed7f83ce64e 100644 --- a/src/intel/vulkan/anv_nir_apply_pipeline_layout.c +++ b/src/intel/vulkan/anv_nir_apply_pipeline_layout.c @@ -1079,7 +1079,7 @@ lower_load_constant(nir_builder *b, nir_intrinsic_instr *intrin, nir_intrinsic_base(intrin)); nir_ssa_def *data; - if (state->pdevice->use_softpin) { + if (!anv_use_relocations(state->pdevice)) { unsigned load_size = intrin->dest.ssa.num_components * intrin->dest.ssa.bit_size / 8; unsigned load_align = intrin->dest.ssa.bit_size / 8; @@ -1445,7 +1445,7 @@ anv_nir_apply_pipeline_layout(const struct anv_physical_device *pdevice, } } - if (state.uses_constants && !pdevice->use_softpin) { + if (state.uses_constants && anv_use_relocations(pdevice)) { state.constants_offset = map->surface_count; map->surface_to_descriptor[map->surface_count].set = ANV_DESCRIPTOR_SET_SHADER_CONSTANTS; diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h index 0be979a836d..e473844b96a 100644 --- a/src/intel/vulkan/anv_private.h +++ b/src/intel/vulkan/anv_private.h @@ -573,7 +573,7 @@ struct anv_block_pool { const char *name; struct anv_device *device; - bool use_softpin; + bool use_relocations; /* Wrapper BO for use in relocation lists. This BO is simply a wrapper * around the actual BO so that we grow the pool after the wrapper BO has @@ -1250,42 +1250,42 @@ struct anv_device { #endif static inline bool -anv_use_softpin(const struct anv_physical_device *pdevice) +anv_use_relocations(const struct anv_physical_device *pdevice) { #if defined(GFX_VERx10) && GFX_VERx10 >= 90 /* Sky Lake and later always uses softpin */ assert(pdevice->use_softpin); - return true; + return false; #elif defined(GFX_VERx10) && GFX_VERx10 < 80 /* Haswell and earlier never use softpin */ assert(!pdevice->use_softpin); - return false; + return true; #else /* If we don't have a GFX_VERx10 #define, we need to look at the physical * device. Also, for GFX version 8, we need to look at the physical * device because Broadwell softpins but Cherryview doesn't. */ - return pdevice->use_softpin; + return !pdevice->use_softpin; #endif } static inline struct anv_state_pool * anv_binding_table_pool(struct anv_device *device) { - if (anv_use_softpin(device->physical)) - return &device->binding_table_pool; - else + if (anv_use_relocations(device->physical)) return &device->surface_state_pool; + else + return &device->binding_table_pool; } static inline struct anv_state anv_binding_table_pool_alloc(struct anv_device *device) { - if (anv_use_softpin(device->physical)) + if (anv_use_relocations(device->physical)) + return anv_state_pool_alloc_back(&device->surface_state_pool); + else return anv_state_pool_alloc(&device->binding_table_pool, device->binding_table_pool.block_size, 0); - else - return anv_state_pool_alloc_back(&device->surface_state_pool); } static inline void @@ -3190,7 +3190,7 @@ struct anv_cmd_buffer { static inline bool anv_cmd_buffer_is_chainable(struct anv_cmd_buffer *cmd_buffer) { - return anv_use_softpin(cmd_buffer->device->physical) && + return !anv_use_relocations(cmd_buffer->device->physical) && !(cmd_buffer->usage_flags & VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT); } diff --git a/src/intel/vulkan/genX_cmd_buffer.c b/src/intel/vulkan/genX_cmd_buffer.c index 7ce68fb20cb..42e9951fb4a 100644 --- a/src/intel/vulkan/genX_cmd_buffer.c +++ b/src/intel/vulkan/genX_cmd_buffer.c @@ -157,15 +157,15 @@ genX(cmd_buffer_emit_state_base_address)(struct anv_cmd_buffer *cmd_buffer) */ sba.GeneralStateBufferSize = 0xfffff; sba.IndirectObjectBufferSize = 0xfffff; - if (anv_use_softpin(device->physical)) { + if (anv_use_relocations(device->physical)) { + sba.DynamicStateBufferSize = 0xfffff; + sba.InstructionBufferSize = 0xfffff; + } else { /* With softpin, we use fixed addresses so we actually know how big * our base addresses are. */ sba.DynamicStateBufferSize = DYNAMIC_STATE_POOL_SIZE / 4096; sba.InstructionBufferSize = INSTRUCTION_STATE_POOL_SIZE / 4096; - } else { - sba.DynamicStateBufferSize = 0xfffff; - sba.InstructionBufferSize = 0xfffff; } sba.GeneralStateBufferSizeModifyEnable = true; sba.IndirectObjectBufferSizeModifyEnable = true; @@ -264,16 +264,16 @@ add_surface_reloc(struct anv_cmd_buffer *cmd_buffer, { VkResult result; - if (anv_use_softpin(cmd_buffer->device->physical)) { - result = anv_reloc_list_add_bo(&cmd_buffer->surface_relocs, - &cmd_buffer->pool->alloc, - addr.bo); - } else { + if (anv_use_relocations(cmd_buffer->device->physical)) { const struct isl_device *isl_dev = &cmd_buffer->device->isl_dev; result = anv_reloc_list_add(&cmd_buffer->surface_relocs, &cmd_buffer->pool->alloc, state.offset + isl_dev->ss.addr_offset, addr.bo, addr.offset, NULL); + } else { + result = anv_reloc_list_add_bo(&cmd_buffer->surface_relocs, + &cmd_buffer->pool->alloc, + addr.bo); } if (unlikely(result != VK_SUCCESS)) @@ -552,7 +552,7 @@ anv_image_init_aux_tt(struct anv_cmd_buffer *cmd_buffer, aux_entry_map = intel_aux_map_get_entry(cmd_buffer->device->aux_map_ctx, address, &aux_entry_addr64); - assert(anv_use_softpin(cmd_buffer->device->physical)); + assert(!anv_use_relocations(cmd_buffer->device->physical)); struct anv_address aux_entry_address = { .bo = NULL, .offset = aux_entry_addr64, @@ -2556,7 +2556,7 @@ emit_binding_table(struct anv_cmd_buffer *cmd_buffer, * softpin then we always keep all user-allocated memory objects resident. */ const bool need_client_mem_relocs = - !anv_use_softpin(cmd_buffer->device->physical); + anv_use_relocations(cmd_buffer->device->physical); struct anv_push_constants *push = &pipe_state->push_constants; for (uint32_t s = 0; s < map->surface_count; s++) { @@ -5610,7 +5610,7 @@ genX(cmd_buffer_set_binding_for_gfx8_vb_flush)(struct anv_cmd_buffer *cmd_buffer uint32_t vb_size) { if (GFX_VER < 8 || GFX_VER > 9 || - !anv_use_softpin(cmd_buffer->device->physical)) + anv_use_relocations(cmd_buffer->device->physical)) return; struct anv_vb_cache_range *bound, *dirty; @@ -5660,7 +5660,7 @@ genX(cmd_buffer_update_dirty_vbs_for_gfx8_vb_flush)(struct anv_cmd_buffer *cmd_b uint64_t vb_used) { if (GFX_VER < 8 || GFX_VER > 9 || - !anv_use_softpin(cmd_buffer->device->physical)) + anv_use_relocations(cmd_buffer->device->physical)) return; if (access_type == RANDOM) {