[Mesa-dev] [PATCH v2] i965: Add GPU BLIT of texture image to PBO in Intel driver

Kenneth Graunke kenneth at whitecape.org
Tue Jun 10 18:41:34 PDT 2014


On Tuesday, March 04, 2014 05:34:44 PM Jon Ashburn wrote:
> Add Intel driver hook for glGetTexImage to accelerate the case of reading
> texture image into a PBO.  This case gets huge performance gains by using
> GPU BLIT directly to PBO rather than GPU BLIT to temporary texture followed
> by memcpy.
> 
> No regressions on Piglit tests  with Intel driver.
> Performance gain (1280 x 800 FBO, Ivybridge):
> glGetTexImage + glMapBufferRange  with patch 1.45 msec
> glGetTexImage + glMapBufferRange without patch 4.68 msec
> ---
>  src/mesa/drivers/dri/i965/intel_tex_image.c | 105 
++++++++++++++++++++++++++++
>  1 file changed, 105 insertions(+)

I fixed up a bunch of small issues with this patch and pushed it.

> diff --git a/src/mesa/drivers/dri/i965/intel_tex_image.c 
b/src/mesa/drivers/dri/i965/intel_tex_image.c
> index ee02e68..13a34d5 100644
> --- a/src/mesa/drivers/dri/i965/intel_tex_image.c
> +++ b/src/mesa/drivers/dri/i965/intel_tex_image.c
> @@ -15,6 +15,8 @@
>  #include "main/teximage.h"
>  #include "main/texstore.h"
>  
> +#include "drivers/common/meta.h"
> +
>  #include "intel_mipmap_tree.h"
>  #include "intel_buffer_objects.h"
>  #include "intel_batchbuffer.h"
> @@ -415,10 +417,113 @@ intel_image_target_texture_2d(struct gl_context *ctx, 
GLenum target,
>                                    image->tile_x, image->tile_y);
>  }
>  
> +static bool
> +IntelBlitTexToPbo(struct gl_context * ctx,

We've been trying to move away from camelCase, and never used StudlyCaps.  
I've renamed this to "blit_texture_to_pbo" (we don't need the intel prefix on 
static functions).

> +                   GLenum format, GLenum type,
> +                   GLvoid * pixels, struct gl_texture_image *texImage)
> +{
> +   struct intel_texture_image *intelImage = intel_texture_image(texImage);
> +   struct brw_context *brw = brw_context(ctx);
> +   const struct gl_pixelstore_attrib *pack = &(ctx->Pack);
> +   struct intel_buffer_object *dst = intel_buffer_object(pack->BufferObj);
> +   GLuint dst_offset;
> +   drm_intel_bo *dst_buffer;
> +   GLenum target = texImage->TexObject->Target;
> +
> +   /*

Comments should start directly after /*.  Fixed.

> +    * Check if we can use GPU blit to copy from the hardware texture
> +    * format to the user's format/type.
> +    * Note that GL's pixel transfer ops don't apply to glGetTexImage()
> +    */
> +
> +   if (!_mesa_format_matches_format_and_type(
> +          intelImage->mt->format, format, type, false))

I reformatted this slightly.

> +   {
> +      perf_debug("%s: unsupported format, fallback to CPU mapping for 
PBO\n", __FUNCTION__);

Wrap at 80 columns.  Fixed.

> +
> +      return false;
> +   }
> +
> +   if (ctx->_ImageTransferState) {
> +      perf_debug("%s: bad transfer state, fallback to CPU mapping for 
PBO\n", __FUNCTION__);
> +      return false;
> +   }
> +
> +   if (pack->SwapBytes || pack->LsbFirst) {
> +      perf_debug("%s: unsupported pack swap params\n", __FUNCTION__);
> +      return false;
> +   }
> +
> +   if (target == GL_TEXTURE_1D_ARRAY || target == GL_TEXTURE_CUBE_MAP_ARRAY 
||
> +       target == GL_TEXTURE_2D_ARRAY) {

This path regresses Piglit's "getteximage-targets 3D" test, which would suffer 
from the same "multiple slices" problem.  (I see you worked on that test - 
perhaps the 3D case didn't exist when you tested this patch?)  I blacklisted
GL_TEXTURE_3D here to avoid that bug.

> +      perf_debug("%s: no support for array textures, fallback to CPU 
mapping for PBO\n", __FUNCTION__);
> +      return false;
> +   }
> +
> +   int dst_stride = _mesa_image_row_stride(pack, texImage->Width, format, 
type);
> +   bool dst_flip = false;
> +   /* Mesa flips the dst_stride for ctx->Pack.Invert, our mt must have a
> +    * normal dst_stride.
> +    */
> +   struct gl_pixelstore_attrib uninverted_pack = *pack;
> +   if (ctx->Pack.Invert) {
> +      dst_stride = -dst_stride;
> +      dst_flip = true;
> +      uninverted_pack.Invert = false;
> +   }
> +   dst_offset = (GLintptr) pixels;
> +   dst_offset += _mesa_image_offset(2, &uninverted_pack, texImage->Width,
> +                                    texImage->Height, format, type, 0, 0, 
0);
> +   dst_buffer = intel_bufferobj_buffer(brw, dst, dst_offset,
> +                                       texImage->Height * dst_stride);
> +
> +   struct intel_mipmap_tree *pbo_mt =
> +            intel_miptree_create_for_bo(brw,

Weird whitespace.  Fixed.

> +                                        dst_buffer,
> +                                        intelImage->mt->format,
> +                                        dst_offset,
> +                                        texImage->Width, texImage->Height,
> +                                        dst_stride, I915_TILING_NONE);

Eric removed the tiling parameter in April, so this didn't compile.  Fixed.

Thanks for the patch.  Sorry for not getting to review it earlier...
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 836 bytes
Desc: This is a digitally signed message part.
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20140610/04a7d551/attachment.sig>


More information about the mesa-dev mailing list