From 90786613e98a4d9e5dbb733c18003c36992aba30 Mon Sep 17 00:00:00 2001 From: Chia-I Wu Date: Sat, 8 Mar 2014 15:57:51 +0800 Subject: [PATCH] ilo: rework winsys bo reloc functions Rename intel_bo_emit_reloc() to intel_bo_add_reloc(), intel_bo_clear_relocs() to intel_bo_truncate_relocs(), and intel_bo_references() to intel_bo_has_reloc(). Besides, we need intel_bo_get_offset() only to get the presumed offset afer adding a reloc entry. Remove the function and make intel_bo_add_reloc() return the presumed offset. While at it, switch to gem_bo->offset64 from gem_bo->offset. --- src/gallium/drivers/ilo/ilo_cp.c | 2 +- src/gallium/drivers/ilo/ilo_cp.h | 15 +++++++---- src/gallium/drivers/ilo/ilo_query.c | 2 +- src/gallium/drivers/ilo/ilo_transfer.c | 2 +- .../winsys/intel/drm/intel_drm_winsys.c | 27 ++++++++++--------- src/gallium/winsys/intel/intel_winsys.h | 21 ++++++--------- 6 files changed, 35 insertions(+), 34 deletions(-) diff --git a/src/gallium/drivers/ilo/ilo_cp.c b/src/gallium/drivers/ilo/ilo_cp.c index 85d40aa7a5f..55d90266cb5 100644 --- a/src/gallium/drivers/ilo/ilo_cp.c +++ b/src/gallium/drivers/ilo/ilo_cp.c @@ -77,7 +77,7 @@ ilo_cp_longjmp(struct ilo_cp *cp, const struct ilo_cp_jmp_buf *jmp) cp->size = jmp->size; cp->used = jmp->used; cp->stolen = jmp->stolen; - intel_bo_clear_relocs(cp->bo, jmp->reloc_count); + intel_bo_truncate_relocs(cp->bo, jmp->reloc_count); } /** diff --git a/src/gallium/drivers/ilo/ilo_cp.h b/src/gallium/drivers/ilo/ilo_cp.h index 6d6bb16716e..9a09ac9106a 100644 --- a/src/gallium/drivers/ilo/ilo_cp.h +++ b/src/gallium/drivers/ilo/ilo_cp.h @@ -330,15 +330,20 @@ static inline void ilo_cp_write_bo(struct ilo_cp *cp, uint32_t val, struct intel_bo *bo, uint32_t read_domains, uint32_t write_domain) { - if (bo) { - intel_bo_emit_reloc(cp->bo, cp->cmd_cur * 4, - bo, val, read_domains, write_domain); + uint64_t presumed_offset; - ilo_cp_write(cp, val + intel_bo_get_offset(bo)); + if (bo) { + intel_bo_add_reloc(cp->bo, cp->cmd_cur * 4, bo, val, + read_domains, write_domain, &presumed_offset); } else { - ilo_cp_write(cp, val); + presumed_offset = 0; } + + /* 32-bit addressing */ + assert(presumed_offset == (uint64_t) ((uint32_t) presumed_offset)); + + ilo_cp_write(cp, (uint32_t) presumed_offset); } /** diff --git a/src/gallium/drivers/ilo/ilo_query.c b/src/gallium/drivers/ilo/ilo_query.c index 5154ddbdefc..59a6b0686c3 100644 --- a/src/gallium/drivers/ilo/ilo_query.c +++ b/src/gallium/drivers/ilo/ilo_query.c @@ -168,7 +168,7 @@ ilo_get_query_result(struct pipe_context *pipe, struct pipe_query *query, return false; if (q->bo) { - if (intel_bo_references(ilo->cp->bo, q->bo)) + if (intel_bo_has_reloc(ilo->cp->bo, q->bo)) ilo_cp_flush(ilo->cp, "syncing for queries"); if (!wait && intel_bo_is_busy(q->bo)) diff --git a/src/gallium/drivers/ilo/ilo_transfer.c b/src/gallium/drivers/ilo/ilo_transfer.c index 5b8a6588e94..b6e52e1651c 100644 --- a/src/gallium/drivers/ilo/ilo_transfer.c +++ b/src/gallium/drivers/ilo/ilo_transfer.c @@ -39,7 +39,7 @@ static bool is_bo_busy(struct ilo_context *ilo, struct intel_bo *bo, bool *need_flush) { - const bool referenced = intel_bo_references(ilo->cp->bo, bo); + const bool referenced = intel_bo_has_reloc(ilo->cp->bo, bo); if (need_flush) *need_flush = referenced; diff --git a/src/gallium/winsys/intel/drm/intel_drm_winsys.c b/src/gallium/winsys/intel/drm/intel_drm_winsys.c index cfd1adde2e9..ad91281e62e 100644 --- a/src/gallium/winsys/intel/drm/intel_drm_winsys.c +++ b/src/gallium/winsys/intel/drm/intel_drm_winsys.c @@ -386,7 +386,7 @@ intel_winsys_decode_commands(struct intel_winsys *winsys, used /= 4; drm_intel_decode_set_batch_pointer(winsys->decode, - intel_bo_get_virtual(bo), intel_bo_get_offset(bo), used); + gem_bo(bo)->virtual, gem_bo(bo)->offset64, used); drm_intel_decode(winsys->decode); @@ -411,12 +411,6 @@ intel_bo_get_size(const struct intel_bo *bo) return gem_bo(bo)->size; } -unsigned long -intel_bo_get_offset(const struct intel_bo *bo) -{ - return gem_bo(bo)->offset; -} - void * intel_bo_get_virtual(const struct intel_bo *bo) { @@ -465,13 +459,20 @@ intel_bo_pread(struct intel_bo *bo, unsigned long offset, } int -intel_bo_emit_reloc(struct intel_bo *bo, uint32_t offset, - struct intel_bo *target_bo, uint32_t target_offset, - uint32_t read_domains, uint32_t write_domain) +intel_bo_add_reloc(struct intel_bo *bo, uint32_t offset, + struct intel_bo *target_bo, uint32_t target_offset, + uint32_t read_domains, uint32_t write_domain, + uint64_t *presumed_offset) { - return drm_intel_bo_emit_reloc(gem_bo(bo), offset, + int err; + + err = drm_intel_bo_emit_reloc(gem_bo(bo), offset, gem_bo(target_bo), target_offset, read_domains, write_domain); + + *presumed_offset = gem_bo(target_bo)->offset64 + target_offset; + + return err; } int @@ -481,13 +482,13 @@ intel_bo_get_reloc_count(struct intel_bo *bo) } void -intel_bo_clear_relocs(struct intel_bo *bo, int start) +intel_bo_truncate_relocs(struct intel_bo *bo, int start) { drm_intel_gem_bo_clear_relocs(gem_bo(bo), start); } bool -intel_bo_references(struct intel_bo *bo, struct intel_bo *target_bo) +intel_bo_has_reloc(struct intel_bo *bo, struct intel_bo *target_bo) { return drm_intel_bo_references(gem_bo(bo), gem_bo(target_bo)); } diff --git a/src/gallium/winsys/intel/intel_winsys.h b/src/gallium/winsys/intel/intel_winsys.h index 4a58d6c0bca..cdd47def651 100644 --- a/src/gallium/winsys/intel/intel_winsys.h +++ b/src/gallium/winsys/intel/intel_winsys.h @@ -204,12 +204,6 @@ intel_bo_unreference(struct intel_bo *bo); unsigned long intel_bo_get_size(const struct intel_bo *bo); -/** - * Return the last-seen-by-GPU offset of \p bo. - */ -unsigned long -intel_bo_get_offset(const struct intel_bo *bo); - /** * Return the pointer to the memory area of the mapped \p bo. */ @@ -270,9 +264,10 @@ intel_bo_pread(struct intel_bo *bo, unsigned long offset, * \p target_offset. */ int -intel_bo_emit_reloc(struct intel_bo *bo, uint32_t offset, - struct intel_bo *target_bo, uint32_t target_offset, - uint32_t read_domains, uint32_t write_domain); +intel_bo_add_reloc(struct intel_bo *bo, uint32_t offset, + struct intel_bo *target_bo, uint32_t target_offset, + uint32_t read_domains, uint32_t write_domain, + uint64_t *presumed_offset); /** * Return the current number of relocations. @@ -281,20 +276,20 @@ int intel_bo_get_reloc_count(struct intel_bo *bo); /** - * Discard all relocations except the first \p start ones. + * Truncate all relocations except the first \p start ones. * * Combined with \p intel_bo_get_reloc_count(), they can be used to undo the - * \p intel_bo_emit_reloc() calls that were just made. + * \p intel_bo_add_reloc() calls that were just made. */ void -intel_bo_clear_relocs(struct intel_bo *bo, int start); +intel_bo_truncate_relocs(struct intel_bo *bo, int start); /** * Return true if \p target_bo is on the relocation list of \p bo, or on * the relocation list of some bo that is referenced by \p bo. */ bool -intel_bo_references(struct intel_bo *bo, struct intel_bo *target_bo); +intel_bo_has_reloc(struct intel_bo *bo, struct intel_bo *target_bo); /** * Submit \p bo for execution. -- 2.30.2