aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOwain Ainsworth <zerooa@googlemail.com>2010-02-18 10:33:00 -0500
committerEric Anholt <eric@anholt.net>2010-02-22 11:54:42 -0500
commitf590d279eb4978352af163a88b001f156c7147d2 (patch)
treefeee8fcf6dc7444c0ec9c5cc6647150c0abd90d9
parent10ae9bd25acf394c8fa2f9d795dfa9cec4d19ed6 (diff)
drm/i915: reduce some of the duplication of tiling checking
i915_gem_object_fenceable was mostly just a repeat of the i915_gem_object_fence_offset_ok, but also checking the size (which was checkecd when we allowed that BO to be tiled in the first place). So instead, export the latter function and use it in place. Signed-Off-By: Owain G. Ainsworth <oga@openbsd.org> Signed-off-by: Eric Anholt <eric@anholt.net>
-rw-r--r--drivers/gpu/drm/i915/i915_drv.h3
-rw-r--r--drivers/gpu/drm/i915/i915_gem.c3
-rw-r--r--drivers/gpu/drm/i915/i915_gem_tiling.c35
3 files changed, 5 insertions, 36 deletions
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 953ad64e0553..40b0da37b1f1 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -914,7 +914,8 @@ void i915_gem_object_do_bit_17_swizzle(struct drm_gem_object *obj);
914void i915_gem_object_save_bit_17_swizzle(struct drm_gem_object *obj); 914void i915_gem_object_save_bit_17_swizzle(struct drm_gem_object *obj);
915bool i915_tiling_ok(struct drm_device *dev, int stride, int size, 915bool i915_tiling_ok(struct drm_device *dev, int stride, int size,
916 int tiling_mode); 916 int tiling_mode);
917bool i915_obj_fenceable(struct drm_device *dev, struct drm_gem_object *obj); 917bool i915_gem_object_fence_offset_ok(struct drm_gem_object *obj,
918 int tiling_mode);
918 919
919/* i915_gem_debug.c */ 920/* i915_gem_debug.c */
920void i915_gem_dump_object(struct drm_gem_object *obj, int len, 921void i915_gem_dump_object(struct drm_gem_object *obj, int len,
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index 7b12604a9eb8..59dcce054d1e 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -3253,7 +3253,8 @@ i915_gem_object_pin_and_relocate(struct drm_gem_object *obj,
3253 obj_priv->tiling_mode != I915_TILING_NONE; 3253 obj_priv->tiling_mode != I915_TILING_NONE;
3254 3254
3255 /* Check fence reg constraints and rebind if necessary */ 3255 /* Check fence reg constraints and rebind if necessary */
3256 if (need_fence && !i915_obj_fenceable(dev, obj)) 3256 if (need_fence && !i915_gem_object_fence_offset_ok(obj,
3257 obj_priv->tiling_mode))
3257 i915_gem_object_unbind(obj); 3258 i915_gem_object_unbind(obj);
3258 3259
3259 /* Choose the GTT offset for our buffer and put it there. */ 3260 /* Choose the GTT offset for our buffer and put it there. */
diff --git a/drivers/gpu/drm/i915/i915_gem_tiling.c b/drivers/gpu/drm/i915/i915_gem_tiling.c
index b0cbe3a62f84..ba247d1f9bc7 100644
--- a/drivers/gpu/drm/i915/i915_gem_tiling.c
+++ b/drivers/gpu/drm/i915/i915_gem_tiling.c
@@ -180,39 +180,6 @@ i915_gem_detect_bit_6_swizzle(struct drm_device *dev)
180 dev_priv->mm.bit_6_swizzle_y = swizzle_y; 180 dev_priv->mm.bit_6_swizzle_y = swizzle_y;
181} 181}
182 182
183
184/**
185 * Returns whether an object is currently fenceable. If not, it may need
186 * to be unbound and have its pitch adjusted.
187 */
188bool
189i915_obj_fenceable(struct drm_device *dev, struct drm_gem_object *obj)
190{
191 struct drm_i915_gem_object *obj_priv = obj->driver_private;
192
193 if (IS_I965G(dev)) {
194 /* The 965 can have fences at any page boundary. */
195 if (obj->size & 4095)
196 return false;
197 return true;
198 } else if (IS_I9XX(dev)) {
199 if (obj_priv->gtt_offset & ~I915_FENCE_START_MASK)
200 return false;
201 } else {
202 if (obj_priv->gtt_offset & ~I830_FENCE_START_MASK)
203 return false;
204 }
205
206 /* Power of two sized... */
207 if (obj->size & (obj->size - 1))
208 return false;
209
210 /* Objects must be size aligned as well */
211 if (obj_priv->gtt_offset & (obj->size - 1))
212 return false;
213 return true;
214}
215
216/* Check pitch constriants for all chips & tiling formats */ 183/* Check pitch constriants for all chips & tiling formats */
217bool 184bool
218i915_tiling_ok(struct drm_device *dev, int stride, int size, int tiling_mode) 185i915_tiling_ok(struct drm_device *dev, int stride, int size, int tiling_mode)
@@ -269,7 +236,7 @@ i915_tiling_ok(struct drm_device *dev, int stride, int size, int tiling_mode)
269 return true; 236 return true;
270} 237}
271 238
272static bool 239bool
273i915_gem_object_fence_offset_ok(struct drm_gem_object *obj, int tiling_mode) 240i915_gem_object_fence_offset_ok(struct drm_gem_object *obj, int tiling_mode)
274{ 241{
275 struct drm_device *dev = obj->dev; 242 struct drm_device *dev = obj->dev;