diff options
author | Kenneth Graunke <[email protected]> | 2018-01-25 01:19:58 -0800 |
---|---|---|
committer | Kenneth Graunke <[email protected]> | 2019-02-21 10:26:05 -0800 |
commit | 876417f9e81ff7214017fa0896c29d845c8f9966 (patch) | |
tree | 653105f37c44847c73409cd5c6608efedfcaead3 | |
parent | c493fee73fe691b6f61b2613e7f0c764af86968f (diff) |
iris: softpin some things
-rw-r--r-- | src/gallium/drivers/iris/iris_batch.c | 11 | ||||
-rw-r--r-- | src/gallium/drivers/iris/iris_program_cache.c | 8 |
2 files changed, 15 insertions, 4 deletions
diff --git a/src/gallium/drivers/iris/iris_batch.c b/src/gallium/drivers/iris/iris_batch.c index 41a95a9e37e..23cff418960 100644 --- a/src/gallium/drivers/iris/iris_batch.c +++ b/src/gallium/drivers/iris/iris_batch.c @@ -626,6 +626,14 @@ emit_reloc(struct iris_batch *batch, { assert(target != NULL); + unsigned int index = add_exec_bo(batch, target); + struct drm_i915_gem_exec_object2 *entry = &batch->validation_list[index]; + + if (target->kflags & EXEC_OBJECT_PINNED) { + assert(entry->offset == target->gtt_offset); + return entry->offset + target_offset; + } + if (rlist->reloc_count == rlist->reloc_array_size) { rlist->reloc_array_size *= 2; rlist->relocs = realloc(rlist->relocs, @@ -633,9 +641,6 @@ emit_reloc(struct iris_batch *batch, sizeof(struct drm_i915_gem_relocation_entry)); } - unsigned int index = add_exec_bo(batch, target); - struct drm_i915_gem_exec_object2 *entry = &batch->validation_list[index]; - rlist->relocs[rlist->reloc_count++] = (struct drm_i915_gem_relocation_entry) { .offset = offset, diff --git a/src/gallium/drivers/iris/iris_program_cache.c b/src/gallium/drivers/iris/iris_program_cache.c index 58e3b3c25e9..acbfba0681a 100644 --- a/src/gallium/drivers/iris/iris_program_cache.c +++ b/src/gallium/drivers/iris/iris_program_cache.c @@ -150,7 +150,7 @@ recreate_cache_bo(struct iris_context *ice, uint32_t size) void *old_map = cache->map; cache->bo = iris_bo_alloc(screen->bufmgr, "program cache", size, 64); - cache->bo->kflags = EXEC_OBJECT_CAPTURE; + cache->bo->kflags = EXEC_OBJECT_CAPTURE | EXEC_OBJECT_PINNED; cache->map = iris_bo_map(&ice->dbg, cache->bo, MAP_READ | MAP_WRITE | MAP_ASYNC | MAP_PERSISTENT); @@ -161,10 +161,16 @@ recreate_cache_bo(struct iris_context *ice, uint32_t size) (unsigned) old_bo->size / 1024, (unsigned) cache->bo->size / 1024); + /* Put the new BO just past the old one */ + cache->bo->gtt_offset = ALIGN(old_bo->gtt_offset + old_bo->size, 4096); + memcpy(cache->map, old_map, cache->next_offset); iris_bo_unreference(old_bo); iris_bo_unmap(old_bo); + } else { + /* Put the initial cache BO...somewhere. */ + cache->bo->gtt_offset = 4096 * 10; } ice->state.dirty |= IRIS_DIRTY_STATE_BASE_ADDRESS; |