On Fri, Apr 05, 2013 at 01:17:43PM -0700, Eric Anholt wrote: > This still fails, since 8192*4bpp == 32768, which is too big to use the > blitter on. > > v2: Be more conservative about the size of the GTT -- I'd forgotten some > of the horror of older hardware.
Agreed on your other comments, we need to have a proper interface for userspace to figure this out. And snoopable bos obviously need a separate cache, otherwise we'll drown in clflush. On the patch: Reviewed-by: Daniel Vetter <daniel.vet...@ffwll.ch> > --- > src/mesa/drivers/dri/intel/intel_mipmap_tree.c | 23 +++++++++++++++++++++++ > 1 file changed, 23 insertions(+) > > diff --git a/src/mesa/drivers/dri/intel/intel_mipmap_tree.c > b/src/mesa/drivers/dri/intel/intel_mipmap_tree.c > index ffdaec5..152d4631 100644 > --- a/src/mesa/drivers/dri/intel/intel_mipmap_tree.c > +++ b/src/mesa/drivers/dri/intel/intel_mipmap_tree.c > @@ -1703,6 +1703,25 @@ intel_miptree_map_singlesample(struct intel_context > *intel, > { > struct intel_miptree_map *map; > > + /* Estimate the size of the mappable aperture into the GTT. There's an > + * ioctl to get the whole GTT size, but not one to get the mappable > subset. > + * Generally it's 256MB, but some gen4+ (particularly things like G41) > + * occasionally has only 128, and 830-class hardware could be either 64 or > + * 128. Since the kernel doesn't expose information to let us actually > + * determine the size, just be pessimistic. > + */ > + uint32_t gtt_size = 128 * 1024 * 1024; > + if (intel->gen == 2) > + gtt_size = 64 * 1024 * 1024; > + > + /* We don't want to map two objects such that a memcpy between them would > + * just fault one mapping in and then the other over and over forever. So > + * we would need to divide the GTT size by 2. Additionally, some GTT is > + * taken up by things like the framebuffer and the ringbuffer and such, so > + * be more conservative. > + */ > + uint32_t max_gtt_map_object_size = gtt_size / 4; > + > assert(mt->num_samples <= 1); > > map = intel_miptree_attach_map(mt, level, slice, x, y, w, h, mode); > @@ -1749,6 +1768,10 @@ intel_miptree_map_singlesample(struct intel_context > *intel, > mt->region->tiling == I915_TILING_X && > mt->region->pitch < 32768) { > intel_miptree_map_blit(intel, mt, map, level, slice); > + } else if (mt->region->bo->size >= max_gtt_map_object_size) { > + assert(mt->region->pitch < 32768 || > + mt->region->tiling == I915_TILING_NONE); > + intel_miptree_map_blit(intel, mt, map, level, slice); > } else { > intel_miptree_map_gtt(intel, mt, map, level, slice); > } > -- > 1.7.10.4 > > _______________________________________________ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/mesa-dev -- Daniel Vetter Software Engineer, Intel Corporation +41 (0) 79 365 57 48 - http://blog.ffwll.ch _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev