[Mesa-dev] [PATCH 1/3] i965: Use try_pbo_upload for glTexSubImage* as well

Neil Roberts neil at linux.intel.com
Mon Dec 22 15:08:48 PST 2014


There is an existing function to attempt to upload texture data from a PBO via
the blit pipeline called try_pbo_upload. However it was only used for the
glTexImage* functions. This patches renames it to intel_try_pbo_upload and
adds parameters to specify the x/y offsets and size and makes intelTexSubImage
use it as well.
---
 src/mesa/drivers/dri/i965/intel_tex.h          |  9 +++++++
 src/mesa/drivers/dri/i965/intel_tex_image.c    | 35 +++++++++++++++-----------
 src/mesa/drivers/dri/i965/intel_tex_subimage.c | 11 ++++++++
 3 files changed, 41 insertions(+), 14 deletions(-)

diff --git a/src/mesa/drivers/dri/i965/intel_tex.h b/src/mesa/drivers/dri/i965/intel_tex.h
index 27f7f11..dfe1b03 100644
--- a/src/mesa/drivers/dri/i965/intel_tex.h
+++ b/src/mesa/drivers/dri/i965/intel_tex.h
@@ -68,4 +68,13 @@ intel_texsubimage_tiled_memcpy(struct gl_context *ctx,
                                const struct gl_pixelstore_attrib *packing,
                                bool for_glTexImage);
 
+bool
+intel_try_pbo_upload(struct gl_context *ctx,
+                     struct gl_texture_image *image,
+                     GLint xoffset, GLint yoffset,
+                     GLsizei width, GLsizei height,
+                     const struct gl_pixelstore_attrib *unpack,
+                     GLenum format, GLenum type, const void *pixels,
+                     bool for_glTexImage);
+
 #endif
diff --git a/src/mesa/drivers/dri/i965/intel_tex_image.c b/src/mesa/drivers/dri/i965/intel_tex_image.c
index 3317779..52ee97e 100644
--- a/src/mesa/drivers/dri/i965/intel_tex_image.c
+++ b/src/mesa/drivers/dri/i965/intel_tex_image.c
@@ -85,13 +85,14 @@ intel_miptree_create_for_teximage(struct brw_context *brw,
                                false);
 }
 
-/* XXX: Do this for TexSubImage also:
- */
-static bool
-try_pbo_upload(struct gl_context *ctx,
-               struct gl_texture_image *image,
-               const struct gl_pixelstore_attrib *unpack,
-	       GLenum format, GLenum type, const void *pixels)
+bool
+intel_try_pbo_upload(struct gl_context *ctx,
+                     struct gl_texture_image *image,
+                     GLint xoffset, GLint yoffset,
+                     GLsizei width, GLsizei height,
+                     const struct gl_pixelstore_attrib *unpack,
+                     GLenum format, GLenum type, const void *pixels,
+                     bool for_glTexImage)
 {
    struct intel_texture_image *intelImage = intel_texture_image(image);
    struct brw_context *brw = brw_context(ctx);
@@ -109,7 +110,8 @@ try_pbo_upload(struct gl_context *ctx,
       return false;
    }
 
-   ctx->Driver.AllocTextureImageBuffer(ctx, image);
+   if (for_glTexImage)
+      ctx->Driver.AllocTextureImageBuffer(ctx, image);
 
    if (!intelImage->mt) {
       DBG("%s: no miptree\n", __FUNCTION__);
@@ -131,19 +133,19 @@ try_pbo_upload(struct gl_context *ctx,
    }
 
    int src_stride =
-      _mesa_image_row_stride(unpack, image->Width, format, type);
+      _mesa_image_row_stride(unpack, width, format, type);
 
    /* note: potential 64-bit ptr to 32-bit int cast */
    src_offset = (GLuint) (unsigned long) pixels;
    src_buffer = intel_bufferobj_buffer(brw, pbo,
-                                       src_offset, src_stride * image->Height);
+                                       src_offset, src_stride * height);
 
    struct intel_mipmap_tree *pbo_mt =
       intel_miptree_create_for_bo(brw,
                                   src_buffer,
                                   intelImage->mt->format,
                                   src_offset,
-                                  image->Width, image->Height,
+                                  width, height,
                                   src_stride);
    if (!pbo_mt)
       return false;
@@ -152,8 +154,8 @@ try_pbo_upload(struct gl_context *ctx,
                            pbo_mt, 0, 0,
                            0, 0, false,
                            intelImage->mt, image->Level, image->Face,
-                           0, 0, false,
-                           image->Width, image->Height, GL_COPY)) {
+                           xoffset, yoffset, false,
+                           width, height, GL_COPY)) {
       DBG("%s: blit failed\n", __FUNCTION__);
       intel_miptree_release(&pbo_mt);
       return false;
@@ -193,7 +195,12 @@ intelTexImage(struct gl_context * ctx,
    /* Attempt to use the blitter for PBO image uploads.
     */
    if (dims <= 2 &&
-       try_pbo_upload(ctx, texImage, unpack, format, type, pixels)) {
+       intel_try_pbo_upload(ctx, texImage,
+                            0, 0, /* x,y offsets */
+                            texImage->Width,
+                            texImage->Height,
+                            unpack, format, type, pixels,
+                            true /*for_glTexImage*/)) {
       return;
    }
 
diff --git a/src/mesa/drivers/dri/i965/intel_tex_subimage.c b/src/mesa/drivers/dri/i965/intel_tex_subimage.c
index cb5738a..dde1591 100644
--- a/src/mesa/drivers/dri/i965/intel_tex_subimage.c
+++ b/src/mesa/drivers/dri/i965/intel_tex_subimage.c
@@ -691,6 +691,17 @@ intelTexSubImage(struct gl_context * ctx,
    if (ok)
      return;
 
+   /* Attempt to use the blitter for PBO image uploads.
+    */
+   if (dims <= 2 &&
+       intel_try_pbo_upload(ctx, texImage,
+                            xoffset, yoffset,
+                            width, height,
+                            packing, format, type, pixels,
+                            false /*for_glTexImage*/)) {
+      return;
+   }
+
    /* The intel_blit_texsubimage() function only handles 2D images */
    if (dims != 2 || !intel_blit_texsubimage(ctx, texImage,
 			       xoffset, yoffset,
-- 
1.9.3



More information about the mesa-dev mailing list