<div dir="ltr">I have a new texturing/getteximage-targets test on the Piglit ML that cleans up the test considerably and causes it to hit these Meta PBO paths.  It just hasn't been given R-B's yet.<br><br><a href="http://patchwork.freedesktop.org/patch/42864/">http://patchwork.freedesktop.org/patch/42864/</a><br></div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Mar 4, 2015 at 9:22 AM, Neil Roberts <span dir="ltr"><<a href="mailto:neil@linux.intel.com" target="_blank">neil@linux.intel.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Now that a layered source PBO is interpreted as a single tall 2D image<br>
it's quite easy to accept the image height packing option by just<br>
creating an image that is tall enough to include the image padding.<br>
<br>
I'm not sure whether the image height property should affect 1D_ARRAY<br>
textures. My intuition and interpretation of the GL spec (which is a<br>
bit vague) would be that it shouldn't. However the software fallback<br>
path in Mesa uses the property for packing but not for unpacking. The<br>
binary NVidia driver uses it for both. This patch doesn't use it for<br>
either case so it is different from the software fallback. There is<br>
some discussion about this here:<br>
<br>
<a href="http://lists.freedesktop.org/archives/mesa-dev/2015-February/077925.html" target="_blank">http://lists.freedesktop.org/archives/mesa-dev/2015-February/077925.html</a><br>
<br>
This is tested by the texsubimage Piglit test with the array and pbo<br>
arguments. Previously this test was skipping this code path because it<br>
always sets the image height.<br>
<br>
I've also tested it by modifying the getteximage-targets test. It<br>
wasn't using this code path before because it was using the default<br>
texture object so this code couldn't successfully create a frame<br>
buffer. I also modified it to add some image padding with the image<br>
height in the PBO.<br>
---<br>
 src/mesa/drivers/common/meta_tex_subimage.c | 32 ++++++++++++++++++-----------<br>
 1 file changed, 20 insertions(+), 12 deletions(-)<br>
<br>
diff --git a/src/mesa/drivers/common/meta_tex_subimage.c b/src/mesa/drivers/common/meta_tex_subimage.c<br>
index 1fef79d..f360d64 100644<br>
--- a/src/mesa/drivers/common/meta_tex_subimage.c<br>
+++ b/src/mesa/drivers/common/meta_tex_subimage.c<br>
@@ -144,6 +144,7 @@ _mesa_meta_pbo_TexSubImage(struct gl_context *ctx, GLuint dims,<br>
                            const struct gl_pixelstore_attrib *packing)<br>
 {<br>
    GLuint pbo = 0, pbo_tex = 0, fbos[2] = { 0, 0 };<br>
+   int full_height, image_height;<br>
    struct gl_texture_image *pbo_tex_image;<br>
    GLenum status;<br>
    bool success = false;<br>
@@ -177,14 +178,16 @@ _mesa_meta_pbo_TexSubImage(struct gl_context *ctx, GLuint dims,<br>
       return true;<br>
    }<br>
<br>
-   /* Only accept tightly packed pixels from the user. */<br>
-   if (packing->ImageHeight != 0 && packing->ImageHeight != height)<br>
-      return false;<br>
+   /* For arrays, use a tall (height * depth) 2D texture but taking into<br>
+    * account the inter-image padding specified with the image height packing<br>
+    * property.<br>
+    */<br>
+   image_height = packing->ImageHeight == 0 ? height : packing->ImageHeight;<br>
+   full_height = image_height * (depth - 1) + height;<br>
<br>
-   /* For arrays, use a tall (height * depth) 2D texture. */<br>
    pbo_tex_image = create_texture_for_pbo(ctx, create_pbo,<br>
                                           GL_PIXEL_UNPACK_BUFFER,<br>
-                                          width, height * depth,<br>
+                                          width, full_height,<br>
                                           format, type, pixels, packing,<br>
                                           &pbo, &pbo_tex);<br>
    if (!pbo_tex_image)<br>
@@ -236,7 +239,8 @@ _mesa_meta_pbo_TexSubImage(struct gl_context *ctx, GLuint dims,<br>
       _mesa_update_state(ctx);<br>
<br>
       _mesa_meta_BlitFramebuffer(ctx, ctx->ReadBuffer, ctx->DrawBuffer,<br>
-                                 0, z * height, width, (z + 1) * height,<br>
+                                 0, z * image_height,<br>
+                                 width, z * image_height + height,<br>
                                  xoffset, yoffset,<br>
                                  xoffset + width, yoffset + height,<br>
                                  GL_COLOR_BUFFER_BIT, GL_NEAREST);<br>
@@ -263,6 +267,7 @@ _mesa_meta_pbo_GetTexSubImage(struct gl_context *ctx, GLuint dims,<br>
                               const struct gl_pixelstore_attrib *packing)<br>
 {<br>
    GLuint pbo = 0, pbo_tex = 0, fbos[2] = { 0, 0 };<br>
+   int full_height, image_height;<br>
    struct gl_texture_image *pbo_tex_image;<br>
    GLenum status;<br>
    bool success = false;<br>
@@ -296,13 +301,15 @@ _mesa_meta_pbo_GetTexSubImage(struct gl_context *ctx, GLuint dims,<br>
       return true;<br>
    }<br>
<br>
-   /* Only accept tightly packed pixels from the user. */<br>
-   if (packing->ImageHeight != 0 && packing->ImageHeight != height)<br>
-      return false;<br>
+   /* For arrays, use a tall (height * depth) 2D texture but taking into<br>
+    * account the inter-image padding specified with the image height packing<br>
+    * property.<br>
+    */<br>
+   image_height = packing->ImageHeight == 0 ? height : packing->ImageHeight;<br>
+   full_height = image_height * (depth - 1) + height;<br>
<br>
-   /* For arrays, use a tall (height * depth) 2D texture. */<br>
    pbo_tex_image = create_texture_for_pbo(ctx, false, GL_PIXEL_PACK_BUFFER,<br>
-                                          width, height * depth,<br>
+                                          width, full_height * depth,<br>
                                           format, type, pixels, packing,<br>
                                           &pbo, &pbo_tex);<br>
    if (!pbo_tex_image)<br>
@@ -361,7 +368,8 @@ _mesa_meta_pbo_GetTexSubImage(struct gl_context *ctx, GLuint dims,<br>
       _mesa_meta_BlitFramebuffer(ctx, ctx->ReadBuffer, ctx->DrawBuffer,<br>
                                  xoffset, yoffset,<br>
                                  xoffset + width, yoffset + height,<br>
-                                 0, z * height, width, (z + 1) * height,<br>
+                                 0, z * image_height,<br>
+                                 width, z * image_height + height,<br>
                                  GL_COLOR_BUFFER_BIT, GL_NEAREST);<br>
    }<br>
<span class="HOEnZb"><font color="#888888"><br>
--<br>
1.9.3<br>
<br>
</font></span></blockquote></div><br></div>