<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Tue, Mar 21, 2017 at 2:09 PM, Ben Widawsky <span dir="ltr"><<a href="mailto:ben@bwidawsk.net" target="_blank">ben@bwidawsk.net</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="">At image creation create a path for dealing with the linear modifier.<br>
This works exactly like the old usage flags where __DRI_IMAGE_USE_LINEAR<br>
was specified.<br>
<br>
During development of this patch series, it was decided that a lack of<br>
modifier was an insufficient way to express the required modifiers. As a<br>
result, 0 was repurposed to mean a modifier for a LINEAR layout.<br>
<br>
NOTE: This patch was added for v3 of the patch series.<br>
<br>
v2: Rework the algorithm for modifier selection to go from a bitmask<br>
based selection to this priority value.<br>
<br>
</span>v3: Make DRM_FORMAT_MOD_INVALID allowed at selection as a way of<br>
identifying no modifiers found (because 0 is LINEAR) (Jason)<br>
<span class=""><br>
Requested-by: Jason Ekstrand <<a href="mailto:jason@jlekstrand.net">jason@jlekstrand.net</a>><br>
Signed-off-by: Ben Widawsky <<a href="mailto:ben@bwidawsk.net">ben@bwidawsk.net</a>><br>
Reviewed-by: Jason Ekstrand <<a href="mailto:jason@jlekstrand.net">jason@jlekstrand.net</a>><br>
---<br>
</span> src/mesa/drivers/dri/i965/<wbr>intel_screen.c | 56 +++++++++++++++++++++++++-----<wbr>--<br>
 1 file changed, 45 insertions(+), 11 deletions(-)<br>
<br>
diff --git a/src/mesa/drivers/dri/i965/<wbr>intel_screen.c b/src/mesa/drivers/dri/i965/<wbr>intel_screen.c<br>
index 26ab5a8e19..6c1fee586b 100644<br>
<span class="">--- a/src/mesa/drivers/dri/i965/<wbr>intel_screen.c<br>
+++ b/src/mesa/drivers/dri/i965/<wbr>intel_screen.c<br>
@@ -45,6 +45,10 @@<br>
 #define DRM_FORMAT_MOD_INVALID ((1ULL<<56) - 1)<br>
 #endif<br>
<br>
+#ifndef DRM_FORMAT_MOD_LINEAR<br>
+#define DRM_FORMAT_MOD_LINEAR 0<br>
+#endif<br>
+<br>
 static const __DRIconfigOptionsExtension brw_config_options = {<br>
    .base = { __DRI_CONFIG_OPTIONS, 1 },<br>
    .xml =<br>
</span>@@ -511,13 +515,37 @@ intel_destroy_image(__DRIimage *image)<br>
<div><div class="h5">    free(image);<br>
 }<br>
<br>
+enum modifier_priority {<br>
+   MODIFIER_PRIORITY_INVALID = 0,<br>
+   MODIFIER_PRIORITY_LINEAR,<br>
+};<br>
+<br>
+const uint64_t priority_to_modifier[] = {<br>
+   [MODIFIER_PRIORITY_INVALID] = DRM_FORMAT_MOD_INVALID,<br>
+   [MODIFIER_PRIORITY_LINEAR] = DRM_FORMAT_MOD_LINEAR,<br>
+};<br>
+<br>
 static uint64_t<br>
 select_best_modifier(struct gen_device_info *devinfo,<br>
                      const uint64_t *modifiers,<br>
                      const unsigned count)<br>
 {<br>
-   /* Modifiers are not supported by this DRI driver */<br>
-   return DRM_FORMAT_MOD_INVALID;<br>
+<br>
+   enum modifier_priority prio = MODIFIER_PRIORITY_INVALID;<br>
+<br>
+   for (int i = 0; i < count; i++) {<br>
+      switch (modifiers[i]) {<br>
+      case DRM_FORMAT_MOD_LINEAR:<br>
+         prio = MAX2(prio, MODIFIER_PRIORITY_LINEAR);<br>
+         break;<br>
+      case DRM_FORMAT_MOD_INVALID:<br>
</div></div>+         break;<br>
<span class="">+      default:<br>
+         unreachable("Invalid modifiers specified\n");<br></span></blockquote><div><br></div><div>I think we want them to both break don't we?<br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="">
</span><span class="">+      }<br>
+   }<br>
+<br>
+   return priority_to_modifier[prio];<br>
 }<br>
<br>
 static __DRIimage *<br>
</span>@@ -530,7 +558,10 @@ intel_create_image_common(__<wbr>DRIscreen *dri_screen,<br>
<span class=""> {<br>
    __DRIimage *image;<br>
    struct intel_screen *screen = dri_screen->driverPrivate;<br>
-   uint32_t tiling;<br>
+   /* Historically, X-tiled was the default, and so lack of modifier means<br>
+    * X-tiled.<br>
+    */<br>
+   uint32_t tiling = I915_TILING_X;<br>
    int cpp;<br>
    unsigned long pitch;<br>
<br>
</span>@@ -541,15 +572,17 @@ intel_create_image_common(__<wbr>DRIscreen *dri_screen,<br>
<span class="">    assert(!(use && count));<br>
<br>
    uint64_t modifier = select_best_modifier(&screen-><wbr>devinfo, modifiers, count);<br>
-   assert(modifier == DRM_FORMAT_MOD_INVALID);<br>
-<br>
-   if (modifier == DRM_FORMAT_MOD_INVALID && modifiers)<br>
-      return NULL;<br>
+   switch (modifier) {<br>
+   case DRM_FORMAT_MOD_LINEAR:<br>
+      tiling = I915_TILING_NONE;<br>
+      break;<br>
+   case DRM_FORMAT_MOD_INVALID:<br>
+      if (modifiers)<br>
+         return NULL;<br>
+   default:<br>
+         break;<br>
+   }<br>
<br>
-   /* Historically, X-tiled was the default, and so lack of modifier means<br>
-    * X-tiled.<br>
-    */<br>
-   tiling = I915_TILING_X;<br>
    if (use & __DRI_IMAGE_USE_CURSOR) {<br>
       if (width != 64 || height != 64)<br>
         return NULL;<br>
</span>@@ -574,6 +607,7 @@ intel_create_image_common(__<wbr>DRIscreen *dri_screen,<br>
<div class="HOEnZb"><div class="h5">    image->width = width;<br>
    image->height = height;<br>
    image->pitch = pitch;<br>
+   image->modifier = modifier;<br>
<br>
    return image;<br>
 }<br>
--<br>
2.12.0<br>
<br>
</div></div></blockquote></div><br></div></div>