<div dir="ltr"><br><div class="gmail_extra"><br><br><div class="gmail_quote">On Wed, Jun 25, 2014 at 12:05 PM, Jon Ashburn <span dir="ltr"><<a href="mailto:jon@lunarg.com" target="_blank">jon@lunarg.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Existing texture read into PBO was using GPU Blit engine in which src and<br>
dest formats must match.  With commit 61e264f4fcdba, internally stored texture<br>
formats were no longer swizzled (BGRA instead of RGBA). This caused existing<br>
accelerated paths to fallback to the SW slow path since the internal texture<br>
format and the PBO format no longer matched.<br>
<br>
Switch glGetTexImage to PBO case to use blorp instead of GPU BLIT engine and<br>
handle formats that match but are swizzled using blorp.<br>
---<br>
 src/mesa/drivers/dri/i965/intel_tex_image.c | 52 ++++++++++++++++++++++++-----<br>
 1 file changed, 43 insertions(+), 9 deletions(-)<br>
<br>
diff --git a/src/mesa/drivers/dri/i965/intel_tex_image.c b/src/mesa/drivers/dri/i965/intel_tex_image.c<br>
index de0546a..0e86396 100644<br>
--- a/src/mesa/drivers/dri/i965/intel_tex_image.c<br>
+++ b/src/mesa/drivers/dri/i965/intel_tex_image.c<br>
@@ -24,6 +24,7 @@<br>
 #include "intel_blit.h"<br>
 #include "intel_fbo.h"<br>
 #include "intel_image.h"<br>
+#include "brw_blorp.h"<br>
<br>
 #include "brw_context.h"<br>
<br>
@@ -84,6 +85,32 @@ intel_miptree_create_for_teximage(struct brw_context *brw,<br>
                                INTEL_MIPTREE_TILING_ANY);<br>
 }<br>
<br>
+static mesa_format<br>
+format_swizzled_rgb(mesa_format format)<br>
+{<br>
+   switch (format) {<br>
+   case MESA_FORMAT_B8G8R8X8_UNORM:<br>
+      return MESA_FORMAT_R8G8B8X8_UNORM;<br>
+   case MESA_FORMAT_B8G8R8A8_UNORM:<br>
+      return MESA_FORMAT_R8G8B8A8_UNORM;<br>
+   case MESA_FORMAT_R8G8B8X8_UNORM:<br>
+      return MESA_FORMAT_B8G8R8X8_UNORM;<br>
+   case MESA_FORMAT_R8G8B8A8_UNORM:<br>
+      return  MESA_FORMAT_B8G8R8A8_UNORM;<br>
+   case MESA_FORMAT_B8G8R8A8_SRGB:<br>
+      return MESA_FORMAT_R8G8B8A8_SRGB;<br>
+   case MESA_FORMAT_B8G8R8X8_SRGB:<br>
+      return MESA_FORMAT_R8G8B8X8_SRGB;<br>
+   case MESA_FORMAT_R8G8B8A8_SRGB:<br>
+      return MESA_FORMAT_B8G8R8A8_SRGB;<br>
+   case MESA_FORMAT_R8G8B8X8_SRGB:<br>
+      return MESA_FORMAT_B8G8R8X8_SRGB;<br>
+   default:<br>
+      /* All other formats that aren't byte swizzable */<br>
+      return MESA_FORMAT_NONE;<br>
+   }<br>
+}<br>
+<br>
 /* XXX: Do this for TexSubImage also:<br>
  */<br>
 static bool<br>
@@ -427,15 +454,21 @@ blit_texture_to_pbo(struct gl_context *ctx,<br>
    GLuint dst_offset;<br>
    drm_intel_bo *dst_buffer;<br>
    GLenum target = texImage->TexObject->Target;<br>
+   bool rgb_swap;<br>
+   mesa_format swizzle_format = format_swizzled_rgb(intelImage->mt->format);<br>
<br>
    /* Check if we can use GPU blit to copy from the hardware texture<br>
     * format to the user's format/type.<br>
     * Note that GL's pixel transfer ops don't apply to glGetTexImage()<br>
     */<br>
<br>
-   if (!_mesa_format_matches_format_and_type(intelImage->mt->format, format,<br>
-                                             type, false))<br>
-   {<br>
+   if (_mesa_format_matches_format_and_type(intelImage->mt->format, format,<br>
+                                            type, false)) {<br>
+      rgb_swap = false;<br>
+   } else if (_mesa_format_matches_format_and_type(swizzle_format,<br>
+                                                   format, type, false)) {<br>
+      rgb_swap = true;<br>
+   } else {<br>
       perf_debug("%s: unsupported format, fallback to CPU mapping for PBO\n",<br>
                  __FUNCTION__);<br>
<br>
@@ -457,6 +490,7 @@ blit_texture_to_pbo(struct gl_context *ctx,<br>
    if (target == GL_TEXTURE_1D_ARRAY ||<br>
        target == GL_TEXTURE_2D_ARRAY ||<br>
        target == GL_TEXTURE_CUBE_MAP_ARRAY ||<br>
+       target == GL_TEXTURE_CUBE_MAP ||<br></blockquote><div><br></div><div>This change is not intuitive. Talking with Jon, he added the test for CUBE_MAP because of a piglit failure when using blorp vs. previous intel_miptree_blit.</div>
<div>Is there something different folks would recommend?</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
        target == GL_TEXTURE_3D) {<br>
       perf_debug("%s: no support for multiple slices, fallback to CPU mapping "<br>
                  "for PBO\n", __FUNCTION__);<br>
@@ -483,6 +517,7 @@ blit_texture_to_pbo(struct gl_context *ctx,<br>
    struct intel_mipmap_tree *pbo_mt =<br>
       intel_miptree_create_for_bo(brw,<br>
                                   dst_buffer,<br>
+                                  (rgb_swap) ? swizzle_format :<br>
                                   intelImage->mt->format,<br>
                                   dst_offset,<br>
                                   texImage->Width, texImage->Height,<br>
@@ -491,13 +526,12 @@ blit_texture_to_pbo(struct gl_context *ctx,<br>
    if (!pbo_mt)<br>
       return false;<br>
<br>
-   if (!intel_miptree_blit(brw,<br>
-                           intelImage->mt, texImage->Level, texImage->Face,<br>
-                           0, 0, false,<br>
+   brw_blorp_blit_miptrees(brw,<br>
+                           intelImage->mt,  texImage->Level, texImage->Face,<br>
                            pbo_mt, 0, 0,<br>
-                           0, 0, dst_flip,<br>
-                           texImage->Width, texImage->Height, GL_COPY))<br>
-      return false;<br>
+                           0, 0, texImage->Width, texImage->Height,<br>
+                           0, 0, texImage->Width, texImage->Height,<br>
+                           GL_NEAREST, dst_flip, false);<br>
<br>
    intel_miptree_release(&pbo_mt);<br>
<span class="HOEnZb"><font color="#888888"><br>
--<br>
1.8.1.2<br>
<br>
_______________________________________________<br>
mesa-dev mailing list<br>
<a href="mailto:mesa-dev@lists.freedesktop.org">mesa-dev@lists.freedesktop.org</a><br>
<a href="http://lists.freedesktop.org/mailman/listinfo/mesa-dev" target="_blank">http://lists.freedesktop.org/mailman/listinfo/mesa-dev</a><br>
</font></span></blockquote></div><br>Reviewed-by: Courtney Goeltzenleuchter <<a href="mailto:courtney@lunarg.com">courtney@lunarg.com</a>><br clear="all"><div><br></div>-- <br><div dir="ltr">Courtney Goeltzenleuchter<br>
<div>LunarG</div><div><img src="http://media.lunarg.com/wp-content/themes/LunarG/images/logo.png" width="96" height="65"><br></div></div>
</div></div>