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 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev