summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2011-07-04 16:31:20 +0100
committerChris Wilson <chris@chris-wilson.co.uk>2011-07-04 17:13:57 +0100
commitfd3bc2af471a3f9a73064cb28818fdd3485cffc7 (patch)
tree0038549bc91d1ddc91d4c0368b32ff4315b9baa1
parentd294e41a6a49ddaa6f8d7d5cda266168095fe1f5 (diff)
sna: Clamp object size to the min of 1/4 of the whole GTT or 1/2 the mappableHEADmaster
... for those pesky early devices whose GTT was no larger than the AGP aperture. Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
-rw-r--r--src/sna/kgem.c14
-rw-r--r--src/sna/kgem.h1
2 files changed, 11 insertions, 4 deletions
diff --git a/src/sna/kgem.c b/src/sna/kgem.c
index b2468981..9509dbe3 100644
--- a/src/sna/kgem.c
+++ b/src/sna/kgem.c
@@ -365,11 +365,17 @@ void kgem_init(struct kgem *kgem, int fd, struct pci_device *dev, int gen)
kgem->aperture_high, kgem->aperture_high / (1024*1024)));
kgem->aperture_mappable = agp_aperture_size(dev, gen);
- if (kgem->aperture_mappable == 0)
+ if (kgem->aperture_mappable == 0 ||
+ kgem->aperture_mappable > aperture.aper_size)
kgem->aperture_mappable = aperture.aper_size;
DBG(("%s: aperture mappable=%d [%d]\n", __FUNCTION__,
kgem->aperture_mappable, kgem->aperture_mappable / (1024*1024)));
+ kgem->max_object_size = kgem->aperture_mappable / 2;
+ if (kgem->max_object_size > kgem->aperture_low)
+ kgem->max_object_size = kgem->aperture_low;
+ DBG(("%s: max object size %d\n", __FUNCTION__, kgem->max_object_size));
+
i = 8;
gp.param = I915_PARAM_NUM_FENCES_AVAIL;
gp.value = &i;
@@ -1207,9 +1213,9 @@ static bool _kgem_can_create_2d(struct kgem *kgem,
tiling = -tiling;
size = kgem_surface_size(kgem, width, height, bpp, tiling, &pitch);
- if (size == 0 || size > kgem->aperture_mappable/2)
+ if (size == 0 || size > kgem->max_object_size)
size = kgem_surface_size(kgem, width, height, bpp, I915_TILING_NONE, &pitch);
- return size > 0 && size <= kgem->aperture_mappable/2;
+ return size > 0 && size <= kgem->max_object_size;
}
#if DEBUG_KGEM
@@ -1269,7 +1275,7 @@ struct kgem_bo *kgem_create_2d(struct kgem *kgem,
assert(_kgem_can_create_2d(kgem, width, height, bpp, tiling));
size = kgem_surface_size(kgem, width, height, bpp, tiling, &pitch);
- assert(size && size <= kgem->aperture_mappable/2);
+ assert(size && size <= kgem->max_object_size);
if (flags & CREATE_INACTIVE)
goto skip_active_search;
diff --git a/src/sna/kgem.h b/src/sna/kgem.h
index 013809c8..0ee63bd7 100644
--- a/src/sna/kgem.h
+++ b/src/sna/kgem.h
@@ -107,6 +107,7 @@ struct kgem {
uint16_t fence_max;
uint32_t aperture_high, aperture_low, aperture;
uint32_t aperture_fenced, aperture_mappable;
+ uint32_t max_object_size;
void (*context_switch)(struct kgem *kgem, int new_mode);
uint32_t batch[4*1024];