[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