i965/dri: Handle X-tiled modifier
authorBen Widawsky <ben@bwidawsk.net>
Mon, 2 Jan 2017 23:01:54 +0000 (15:01 -0800)
committerBen Widawsky <ben@bwidawsk.net>
Tue, 21 Mar 2017 21:48:12 +0000 (14:48 -0700)
This doesn't really "do" anything because the default tiling for the
winsys buffer is X tiled. We do however want the X tiled modifier to
work correctly from the API perspective, which would imply that if you
set this modifier, and later do a get_modifier, you get back at least X
tiled.

Running with a modified kmscube, here are the bandwidth measurements.

Linear:
Read bandwidth: 1039.31 MiB/s
Write bandwidth: 1453.56 MiB/s

Y-tiled:
Read bandwidth: 458.29 MiB/s
Write bandwidth: 542.12 MiB/s

X-tiled:
Read bandwidth: 575.01 MiB/s
Write bandwidth: 606.25 MiB/s

Cc: Kristian Høgsberg <krh@bitplanet.net>
Signed-off-by: Ben Widawsky <ben@bwidawsk.net>
Acked-by: Daniel Stone <daniels@collabora.com>
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
src/mesa/drivers/dri/i965/intel_screen.c

index 89fc4686ce5ef97c8d53d16a4402a79595e9a092..adcd1ad91cb40a55b100d2f37a9714e7f2732236 100644 (file)
@@ -519,12 +519,14 @@ intel_destroy_image(__DRIimage *image)
 enum modifier_priority {
    MODIFIER_PRIORITY_INVALID = 0,
    MODIFIER_PRIORITY_LINEAR,
+   MODIFIER_PRIORITY_X,
    MODIFIER_PRIORITY_Y,
 };
 
 const uint64_t priority_to_modifier[] = {
    [MODIFIER_PRIORITY_INVALID] = DRM_FORMAT_MOD_INVALID,
    [MODIFIER_PRIORITY_LINEAR] = DRM_FORMAT_MOD_LINEAR,
+   [MODIFIER_PRIORITY_X] = I915_FORMAT_MOD_X_TILED,
    [MODIFIER_PRIORITY_Y] = I915_FORMAT_MOD_Y_TILED,
 };
 
@@ -540,6 +542,9 @@ select_best_modifier(struct gen_device_info *devinfo,
       case I915_FORMAT_MOD_Y_TILED:
          prio = MAX2(prio, MODIFIER_PRIORITY_Y);
          break;
+      case I915_FORMAT_MOD_X_TILED:
+         prio = MAX2(prio, MODIFIER_PRIORITY_X);
+         break;
       case DRM_FORMAT_MOD_LINEAR:
          prio = MAX2(prio, MODIFIER_PRIORITY_LINEAR);
          break;
@@ -577,6 +582,9 @@ intel_create_image_common(__DRIscreen *dri_screen,
 
    uint64_t modifier = select_best_modifier(&screen->devinfo, modifiers, count);
    switch (modifier) {
+   case I915_FORMAT_MOD_X_TILED:
+      assert(tiling == I915_TILING_X);
+      break;
    case DRM_FORMAT_MOD_LINEAR:
       tiling = I915_TILING_NONE;
       break;