diff options
Diffstat (limited to 'drivers/gpu/drm/i915/i915_gem_tiling.c')
| -rw-r--r-- | drivers/gpu/drm/i915/i915_gem_tiling.c | 21 | 
1 files changed, 17 insertions, 4 deletions
diff --git a/drivers/gpu/drm/i915/i915_gem_tiling.c b/drivers/gpu/drm/i915/i915_gem_tiling.c index 22a32b9932c5..d64843e18df2 100644 --- a/drivers/gpu/drm/i915/i915_gem_tiling.c +++ b/drivers/gpu/drm/i915/i915_gem_tiling.c @@ -349,14 +349,27 @@ i915_gem_set_tiling(struct drm_device *dev, void *data,  			(obj->gtt_offset + obj->base.size <= dev_priv->mm.gtt_mappable_end &&  			 i915_gem_object_fence_ok(obj, args->tiling_mode)); -		obj->tiling_changed = true; -		obj->tiling_mode = args->tiling_mode; -		obj->stride = args->stride; +		/* Rebind if we need a change of alignment */ +		if (!obj->map_and_fenceable) { +			u32 unfenced_alignment = +				i915_gem_get_unfenced_gtt_alignment(obj); +			if (obj->gtt_offset & (unfenced_alignment - 1)) +				ret = i915_gem_object_unbind(obj); +		} + +		if (ret == 0) { +			obj->tiling_changed = true; +			obj->tiling_mode = args->tiling_mode; +			obj->stride = args->stride; +		}  	} +	/* we have to maintain this existing ABI... */ +	args->stride = obj->stride; +	args->tiling_mode = obj->tiling_mode;  	drm_gem_object_unreference(&obj->base);  	mutex_unlock(&dev->struct_mutex); -	return 0; +	return ret;  }  /**  | 
