[Mesa-dev] [PATCH 5/5] i965: Use _mesa_meta_TexSubImage for PBO's and cases where the texture is busy

Jason Ekstrand jason at jlekstrand.net
Thu Jan 8 16:47:17 PST 2015


This improves texture upload performance on the PBO upload test available
at http://www.songho.ca/opengl/gl_pbo.html by 80% for the non-PBO case (due
to avoiding a buffer stall) and 500% for the PBO case.
---
 src/mesa/drivers/dri/i965/intel_tex_image.c    | 12 ++++++++++--
 src/mesa/drivers/dri/i965/intel_tex_subimage.c | 10 ++++++++++
 2 files changed, 20 insertions(+), 2 deletions(-)

diff --git a/src/mesa/drivers/dri/i965/intel_tex_image.c b/src/mesa/drivers/dri/i965/intel_tex_image.c
index 1e56f84..215002f 100644
--- a/src/mesa/drivers/dri/i965/intel_tex_image.c
+++ b/src/mesa/drivers/dri/i965/intel_tex_image.c
@@ -120,8 +120,7 @@ try_pbo_upload(struct gl_context *ctx,
                                              format, type, false)) {
       DBG("%s: format mismatch (upload to %s with format 0x%x, type 0x%x)\n",
 	  __FUNCTION__, _mesa_get_format_name(intelImage->mt->format),
-	  format, type);
-      return false;
+	  format, type); return false;
    }
 
    if (image->TexObject->Target == GL_TEXTURE_1D_ARRAY ||
@@ -172,14 +171,23 @@ intelTexImage(struct gl_context * ctx,
               GLenum format, GLenum type, const void *pixels,
               const struct gl_pixelstore_attrib *unpack)
 {
+   struct intel_texture_image *intelImage = intel_texture_image(texImage);
    bool ok;
 
+   bool tex_busy = intelImage->mt && drm_intel_bo_busy(intelImage->mt->bo);
+
    DBG("%s mesa_format %s target %s format %s type %s level %d %dx%dx%d\n",
        __FUNCTION__, _mesa_get_format_name(texImage->TexFormat),
        _mesa_lookup_enum_by_nr(texImage->TexObject->Target),
        _mesa_lookup_enum_by_nr(format), _mesa_lookup_enum_by_nr(type),
        texImage->Level, texImage->Width, texImage->Height, texImage->Depth);
 
+   ok = _mesa_meta_TexSubImage(ctx, dims, texImage, 0, 0, 0,
+                               texImage->Width, texImage->Height, texImage->Depth,
+                               format, type, pixels, true, tex_busy, unpack);
+   if (ok)
+      return;
+
    ok = intel_texsubimage_tiled_memcpy(ctx, dims, texImage,
                                        0, 0, 0, /*x,y,z offsets*/
                                        texImage->Width,
diff --git a/src/mesa/drivers/dri/i965/intel_tex_subimage.c b/src/mesa/drivers/dri/i965/intel_tex_subimage.c
index b9f2153..4ecb2d2 100644
--- a/src/mesa/drivers/dri/i965/intel_tex_subimage.c
+++ b/src/mesa/drivers/dri/i965/intel_tex_subimage.c
@@ -35,6 +35,7 @@
 #include "main/texstore.h"
 #include "main/texcompress.h"
 #include "main/enums.h"
+#include "drivers/common/meta.h"
 
 #include "brw_context.h"
 #include "intel_batchbuffer.h"
@@ -677,14 +678,23 @@ intelTexSubImage(struct gl_context * ctx,
                  const GLvoid * pixels,
                  const struct gl_pixelstore_attrib *packing)
 {
+   struct intel_texture_image *intelImage = intel_texture_image(texImage);
    bool ok;
 
+   bool tex_busy = intelImage->mt && drm_intel_bo_busy(intelImage->mt->bo);
+
    DBG("%s mesa_format %s target %s format %s type %s level %d %dx%dx%d\n",
        __FUNCTION__, _mesa_get_format_name(texImage->TexFormat),
        _mesa_lookup_enum_by_nr(texImage->TexObject->Target),
        _mesa_lookup_enum_by_nr(format), _mesa_lookup_enum_by_nr(type),
        texImage->Level, texImage->Width, texImage->Height, texImage->Depth);
 
+   ok = _mesa_meta_TexSubImage(ctx, dims, texImage, xoffset, yoffset, zoffset,
+                               width, height, depth, format, type,
+                               pixels, false, tex_busy, packing);
+   if (ok)
+      return;
+
    ok = intel_texsubimage_tiled_memcpy(ctx, dims, texImage,
                                        xoffset, yoffset, zoffset,
                                        width, height, depth,
-- 
2.2.0



More information about the mesa-dev mailing list