diff options
| author | Eric Anholt <eric@anholt.net> | 2010-06-07 14:22:36 -0700 | 
|---|---|---|
| committer | Eric Anholt <eric@anholt.net> | 2010-06-07 17:29:57 -0700 | 
| commit | f179137f8f5bf272b79266575121c7a04038290c (patch) | |
| tree | 2dea2064df34133aa0e1b19185061bb30b555794 /intel | |
| parent | 66375fd6e8d3e95df5d124883a1426460c1b8ed8 (diff) | |
Allow a buffer to point at itself and still get relocs.
I'm using this in experiments with the i965 Mesa driver.
Diffstat (limited to 'intel')
| -rw-r--r-- | intel/intel_bufmgr_gem.c | 12 | 
1 files changed, 10 insertions, 2 deletions
| diff --git a/intel/intel_bufmgr_gem.c b/intel/intel_bufmgr_gem.c index 398c7d07..b125c129 100644 --- a/intel/intel_bufmgr_gem.c +++ b/intel/intel_bufmgr_gem.c @@ -1316,7 +1316,10 @@ do_bo_emit_reloc(drm_intel_bo *bo, uint32_t offset,  	 * already been accounted for.  	 */  	assert(!bo_gem->used_as_reloc_target); -	bo_gem->reloc_tree_size += target_bo_gem->reloc_tree_size; +	if (target_bo_gem != bo_gem) { +		target_bo_gem->used_as_reloc_target = 1; +		bo_gem->reloc_tree_size += target_bo_gem->reloc_tree_size; +	}  	/* An object needing a fence is a tiled buffer, so it won't have  	 * relocs to other buffers.  	 */ @@ -1325,7 +1328,6 @@ do_bo_emit_reloc(drm_intel_bo *bo, uint32_t offset,  	bo_gem->reloc_tree_fences += target_bo_gem->reloc_tree_fences;  	/* Flag the target to disallow further relocations in it. */ -	target_bo_gem->used_as_reloc_target = 1;  	bo_gem->relocs[bo_gem->reloc_count].offset = offset;  	bo_gem->relocs[bo_gem->reloc_count].delta = target_offset; @@ -1387,6 +1389,9 @@ drm_intel_gem_bo_process_reloc(drm_intel_bo *bo)  	for (i = 0; i < bo_gem->reloc_count; i++) {  		drm_intel_bo *target_bo = bo_gem->reloc_target_info[i].bo; +		if (target_bo == bo) +			continue; +  		/* Continue walking the tree depth-first. */  		drm_intel_gem_bo_process_reloc(target_bo); @@ -1408,6 +1413,9 @@ drm_intel_gem_bo_process_reloc2(drm_intel_bo *bo)  		drm_intel_bo *target_bo = bo_gem->reloc_target_info[i].bo;  		int need_fence; +		if (target_bo == bo) +			continue; +  		/* Continue walking the tree depth-first. */  		drm_intel_gem_bo_process_reloc2(target_bo); | 
