<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Sat, Dec 13, 2014 at 6:42 AM, Brian Paul <span dir="ltr"><<a href="mailto:brianp@vmware.com" target="_blank">brianp@vmware.com</a>></span> wrote:<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Needed for GL_ARB_get_texture_sub_image.  But at this point, the<br>
offsets are always zero and the sizes match the whole texture image.<br>
---<br>
 src/mesa/main/texgetimage.c | 105 ++++++++++++++++++++++++--------------------<br>
 1 file changed, 58 insertions(+), 47 deletions(-)<br>
<br>
diff --git a/src/mesa/main/texgetimage.c b/src/mesa/main/texgetimage.c<br>
index 03ad5f4..71c25bb 100644<br>
--- a/src/mesa/main/texgetimage.c<br>
+++ b/src/mesa/main/texgetimage.c<br>
@@ -74,12 +74,11 @@ type_needs_clamping(GLenum type)<br>
  */<br>
 static void<br>
 get_tex_depth(struct gl_context *ctx, GLuint dimensions,<br>
+              GLint xoffset, GLint yoffset, GLint zoffset,<br>
+              GLsizei width, GLsizei height, GLint depth,<br>
               GLenum format, GLenum type, GLvoid *pixels,<br>
               struct gl_texture_image *texImage)<br>
 {<br>
-   const GLint width = texImage->Width;<br>
-   GLint height = texImage->Height;<br>
-   GLint depth = texImage->Depth;<br>
    GLint img, row;<br>
    GLfloat *depthRow = malloc(width * sizeof(GLfloat));<br>
<br>
@@ -98,9 +97,9 @@ get_tex_depth(struct gl_context *ctx, GLuint dimensions,<br>
       GLint srcRowStride;</blockquote><div>You are not checking here to make sure that zoffset + img < depth.  I looked in the next patch (implement _mesa_GetTextureSubImage) and found that the dimensions_error_check does this.  It might be good to make a note of that here.<br></div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
       /* map src texture buffer */<br>
-      ctx->Driver.MapTextureImage(ctx, texImage, img,<br>
-                                  0, 0, width, height, GL_MAP_READ_BIT,<br>
-                                &srcMap, &srcRowStride);<br>
+      ctx->Driver.MapTextureImage(ctx, texImage, zoffset + img,<br>
+                                  xoffset, yoffset, width, height,<br>
+                                  GL_MAP_READ_BIT, &srcMap, &srcRowStride);<br>
<br>
       if (srcMap) {<br>
          for (row = 0; row < height; row++) {<br></blockquote><div>Why didn't you update ctx->Driver.UnmapTextureImage(ctx, texImage, img) to take zoffset + img here?  You did that for get_tex_rgba_uncompressed.  Is there some reason that it has to be UnmapTextureImage(.. img only) for all of the other functions?<br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
@@ -129,12 +128,11 @@ get_tex_depth(struct gl_context *ctx, GLuint dimensions,<br>
  */<br>
 static void<br>
 get_tex_depth_stencil(struct gl_context *ctx, GLuint dimensions,<br>
+                      GLint xoffset, GLint yoffset, GLint zoffset,<br>
+                      GLsizei width, GLsizei height, GLint depth,<br>
                       GLenum format, GLenum type, GLvoid *pixels,<br>
                       struct gl_texture_image *texImage)<br>
 {<br>
-   const GLint width = texImage->Width;<br>
-   const GLint height = texImage->Height;<br>
-   const GLint depth = texImage->Depth;<br>
    GLint img, row;<br>
<br>
    assert(format == GL_DEPTH_STENCIL);<br>
@@ -146,9 +144,9 @@ get_tex_depth_stencil(struct gl_context *ctx, GLuint dimensions,<br>
       GLint rowstride;<br>
<br>
       /* map src texture buffer */<br>
-      ctx->Driver.MapTextureImage(ctx, texImage, img,<br>
-                                  0, 0, width, height, GL_MAP_READ_BIT,<br>
-                                  &srcMap, &rowstride);<br>
+      ctx->Driver.MapTextureImage(ctx, texImage, zoffset + img,<br>
+                                  xoffset, yoffset, width, height,<br>
+                                  GL_MAP_READ_BIT, &srcMap, &rowstride);<br>
<br>
       if (srcMap) {<br>
          for (row = 0; row < height; row++) {<br>
@@ -180,12 +178,11 @@ get_tex_depth_stencil(struct gl_context *ctx, GLuint dimensions,<br>
  */<br>
 static void<br>
 get_tex_ycbcr(struct gl_context *ctx, GLuint dimensions,<br>
+              GLint xoffset, GLint yoffset, GLint zoffset,<br>
+              GLsizei width, GLsizei height, GLint depth,<br>
               GLenum format, GLenum type, GLvoid *pixels,<br>
               struct gl_texture_image *texImage)<br>
 {<br>
-   const GLint width = texImage->Width;<br>
-   const GLint height = texImage->Height;<br>
-   const GLint depth = texImage->Depth;<br>
    GLint img, row;<br>
<br>
    for (img = 0; img < depth; img++) {<br>
@@ -193,9 +190,9 @@ get_tex_ycbcr(struct gl_context *ctx, GLuint dimensions,<br>
       GLint rowstride;<br>
<br>
       /* map src texture buffer */<br>
-      ctx->Driver.MapTextureImage(ctx, texImage, img,<br>
-                                  0, 0, width, height, GL_MAP_READ_BIT,<br>
-                                  &srcMap, &rowstride);<br>
+      ctx->Driver.MapTextureImage(ctx, texImage, zoffset + img,<br>
+                                  xoffset, yoffset, width, height,<br>
+                                  GL_MAP_READ_BIT, &srcMap, &rowstride);<br>
<br>
       if (srcMap) {<br>
          for (row = 0; row < height; row++) {<br>
@@ -233,6 +230,8 @@ get_tex_ycbcr(struct gl_context *ctx, GLuint dimensions,<br>
  */<br>
 static void<br>
 get_tex_rgba_compressed(struct gl_context *ctx, GLuint dimensions,<br>
+                        GLint xoffset, GLint yoffset, GLint zoffset,<br>
+                        GLsizei width, GLsizei height, GLint depth,<br>
                         GLenum format, GLenum type, GLvoid *pixels,<br>
                         struct gl_texture_image *texImage,<br>
                         GLbitfield transferOps)<br>
@@ -243,9 +242,6 @@ get_tex_rgba_compressed(struct gl_context *ctx, GLuint dimensions,<br>
    const GLenum baseFormat = _mesa_get_format_base_format(texFormat);<br>
    const GLenum destBaseFormat = _mesa_base_tex_format(ctx, format);<br>
    GLenum rebaseFormat = GL_NONE;<br>
-   const GLuint width = texImage->Width;<br>
-   const GLuint height = texImage->Height;<br>
-   const GLuint depth = texImage->Depth;<br>
    GLfloat *tempImage, *tempSlice, *srcRow;<br>
    GLuint row, slice;<br>
<br>
@@ -264,8 +260,8 @@ get_tex_rgba_compressed(struct gl_context *ctx, GLuint dimensions,<br>
<br>
       tempSlice = tempImage + slice * 4 * width * height;<br>
<br>
-      ctx->Driver.MapTextureImage(ctx, texImage, slice,<br>
-                                  0, 0, width, height,<br>
+      ctx->Driver.MapTextureImage(ctx, texImage, zoffset + slice,<br>
+                                  xoffset, yoffset, width, height,<br>
                                   GL_MAP_READ_BIT,<br>
                                   &srcMap, &srcRowStride);<br>
       if (srcMap) {<br>
@@ -368,6 +364,8 @@ _mesa_base_pack_format(GLenum format)<br>
  */<br>
 static void<br>
 get_tex_rgba_uncompressed(struct gl_context *ctx, GLuint dimensions,<br>
+                          GLint xoffset, GLint yoffset, GLint zoffset,<br>
+                          GLsizei width, GLsizei height, GLint depth,<br>
                           GLenum format, GLenum type, GLvoid *pixels,<br>
                           struct gl_texture_image *texImage,<br>
                           GLbitfield transferOps)<br>
@@ -375,11 +373,8 @@ get_tex_rgba_uncompressed(struct gl_context *ctx, GLuint dimensions,<br>
    /* don't want to apply sRGB -> RGB conversion here so override the format */<br>
    const mesa_format texFormat =<br>
       _mesa_get_srgb_format_linear(texImage->TexFormat);<br>
-   const GLuint width = texImage->Width;<br>
    GLenum destBaseFormat = _mesa_base_pack_format(format);<br>
    GLenum rebaseFormat = GL_NONE;<br>
-   GLuint height = texImage->Height;<br>
-   GLuint depth = texImage->Depth;<br>
    GLuint img, row;<br>
    GLfloat (*rgba)[4];<br>
    GLuint (*rgba_uint)[4];<br>
@@ -472,9 +467,9 @@ get_tex_rgba_uncompressed(struct gl_context *ctx, GLuint dimensions,<br>
       GLint rowstride;<br>
<br>
       /* map src texture buffer */<br>
-      ctx->Driver.MapTextureImage(ctx, texImage, img,<br>
-                                  0, 0, width, height, GL_MAP_READ_BIT,<br>
-                                  &srcMap, &rowstride);<br>
+      ctx->Driver.MapTextureImage(ctx, texImage, zoffset + img,<br>
+                                  xoffset, yoffset, width, height,<br>
+                                  GL_MAP_READ_BIT, &srcMap, &rowstride);<br>
       if (srcMap) {<br>
          for (row = 0; row < height; row++) {<br>
             const GLubyte *src = srcMap + row * rowstride;<br>
@@ -506,7 +501,7 @@ get_tex_rgba_uncompressed(struct gl_context *ctx, GLuint dimensions,<br>
         }<br>
<br>
          /* Unmap the src texture buffer */<br>
-         ctx->Driver.UnmapTextureImage(ctx, texImage, img);<br>
+         ctx->Driver.UnmapTextureImage(ctx, texImage, zoffset + img);<br>
       }<br>
       else {<br>
          _mesa_error(ctx, GL_OUT_OF_MEMORY, "glGetTexImage");<br>
@@ -524,6 +519,8 @@ get_tex_rgba_uncompressed(struct gl_context *ctx, GLuint dimensions,<br>
  */<br>
 static void<br>
 get_tex_rgba(struct gl_context *ctx, GLuint dimensions,<br>
+             GLint xoffset, GLint yoffset, GLint zoffset,<br>
+             GLsizei width, GLsizei height, GLint depth,<br>
              GLenum format, GLenum type, GLvoid *pixels,<br>
              struct gl_texture_image *texImage)<br>
 {<br>
@@ -545,11 +542,17 @@ get_tex_rgba(struct gl_context *ctx, GLuint dimensions,<br>
    }<br>
<br>
    if (_mesa_is_format_compressed(texImage->TexFormat)) {<br>
-      get_tex_rgba_compressed(ctx, dimensions, format, type,<br>
+      get_tex_rgba_compressed(ctx, dimensions,<br>
+                              xoffset, yoffset, zoffset,<br>
+                              width, height, depth,<br>
+                              format, type,<br>
                               pixels, texImage, transferOps);<br>
    }<br>
    else {<br>
-      get_tex_rgba_uncompressed(ctx, dimensions, format, type,<br>
+      get_tex_rgba_uncompressed(ctx, dimensions,<br>
+                                xoffset, yoffset, zoffset,<br>
+                                width, height, depth,<br>
+                                format, type,<br>
                                 pixels, texImage, transferOps);<br>
    }<br>
 }<br>
@@ -560,8 +563,10 @@ get_tex_rgba(struct gl_context *ctx, GLuint dimensions,<br>
  * \return GL_TRUE if done, GL_FALSE otherwise<br>
  */<br>
 static GLboolean<br>
-get_tex_memcpy(struct gl_context *ctx, GLenum format, GLenum type,<br>
-               GLvoid *pixels,<br>
+get_tex_memcpy(struct gl_context *ctx,<br>
+               GLint xoffset, GLint yoffset, GLint zoffset,<br>
+               GLsizei width, GLsizei height, GLint depth,<br>
+               GLenum format, GLenum type, GLvoid *pixels,<br>
                struct gl_texture_image *texImage)<br>
 {<br>
    const GLenum target = texImage->TexObject->Target;<br>
@@ -585,27 +590,27 @@ get_tex_memcpy(struct gl_context *ctx, GLenum format, GLenum type,<br>
<br>
    if (memCopy) {<br>
       const GLuint bpp = _mesa_get_format_bytes(texImage->TexFormat);<br>
-      const GLuint bytesPerRow = texImage->Width * bpp;<br>
+      const GLuint bytesPerRow = width * bpp;<br>
       GLubyte *dst =<br>
-         _mesa_image_address2d(&ctx->Pack, pixels, texImage->Width,<br>
-                               texImage->Height, format, type, 0, 0);<br>
+         _mesa_image_address2d(&ctx->Pack, pixels, width, height,<br>
+                               format, type, 0, 0);<br>
       const GLint dstRowStride =<br>
-         _mesa_image_row_stride(&ctx->Pack, texImage->Width, format, type);<br>
+         _mesa_image_row_stride(&ctx->Pack, width, format, type);<br>
       GLubyte *src;<br>
       GLint srcRowStride;<br>
<br>
       /* map src texture buffer */<br>
-      ctx->Driver.MapTextureImage(ctx, texImage, 0,<br>
-                                  0, 0, texImage->Width, texImage->Height,<br>
+      ctx->Driver.MapTextureImage(ctx, texImage, zoffset,<br>
+                                  xoffset, yoffset, width, height,<br>
                                   GL_MAP_READ_BIT, &src, &srcRowStride);<br>
<br>
       if (src) {<br>
          if (bytesPerRow == dstRowStride && bytesPerRow == srcRowStride) {<br>
-            memcpy(dst, src, bytesPerRow * texImage->Height);<br>
+            memcpy(dst, src, bytesPerRow * height);<br>
          }<br>
          else {<br>
             GLuint row;<br>
-            for (row = 0; row < texImage->Height; row++) {<br>
+            for (row = 0; row < height; row++) {<br>
                memcpy(dst, src, bytesPerRow);<br>
                dst += dstRowStride;<br>
                src += srcRowStride;<br>
@@ -663,20 +668,26 @@ _mesa_get_texsubimage(struct gl_context *ctx,<br>
       pixels = ADD_POINTERS(buf, pixels);<br>
    }<br>
<br>
-   if (get_tex_memcpy(ctx, format, type, pixels, texImage)) {<br>
+   if (get_tex_memcpy(ctx, xoffset, yoffset, zoffset, width, height, depth,<br>
+                      format, type, pixels, texImage)) {<br>
       /* all done */<br>
    }<br>
    else if (format == GL_DEPTH_COMPONENT) {<br>
-      get_tex_depth(ctx, dimensions, format, type, pixels, texImage);<br>
+      get_tex_depth(ctx, dimensions, xoffset, yoffset, zoffset,<br>
+                    width, height, depth, format, type, pixels, texImage);<br>
    }<br>
    else if (format == GL_DEPTH_STENCIL_EXT) {<br>
-      get_tex_depth_stencil(ctx, dimensions, format, type, pixels, texImage);<br>
+      get_tex_depth_stencil(ctx, dimensions, xoffset, yoffset, zoffset,<br>
+                            width, height, depth,<br>
+                            format, type, pixels, texImage);<br>
    }<br>
    else if (format == GL_YCBCR_MESA) {<br>
-      get_tex_ycbcr(ctx, dimensions, format, type, pixels, texImage);<br>
+      get_tex_ycbcr(ctx, dimensions, xoffset, yoffset, zoffset,<br>
+                    width, height, depth, format, type, pixels, texImage);<br>
    }<br>
    else {<br>
-      get_tex_rgba(ctx, dimensions, format, type, pixels, texImage);<br>
+      get_tex_rgba(ctx, dimensions, xoffset, yoffset, zoffset,<br>
+                   width, height, depth, format, type, pixels, texImage);<br>
    }<br>
<br>
    if (_mesa_is_bufferobj(ctx->Pack.BufferObj)) {<br>
<span class=""><font color="#888888">--<br>
1.9.1<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></div></div>