On 03/04/2014 02:17 PM, Eric Anholt wrote:
> The meta patch supports all the same, except for the stencil case being
> unaccelerated.
> ---
>  src/mesa/drivers/dri/i965/brw_blorp_blit.cpp | 105 
> ---------------------------
>  src/mesa/drivers/dri/i965/brw_context.h      |   9 ---
>  src/mesa/drivers/dri/i965/intel_tex_copy.c   |   9 +--
>  3 files changed, 1 insertion(+), 122 deletions(-)
> 
> diff --git a/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp 
> b/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp
> index acdc9c7..fbed8ce 100644
> --- a/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp
> @@ -334,111 +334,6 @@ try_blorp_blit(struct brw_context *brw,
>     return true;
>  }
>  
> -bool
> -brw_blorp_copytexsubimage(struct brw_context *brw,
> -                          struct gl_renderbuffer *src_rb,
> -                          struct gl_texture_image *dst_image,
> -                          int slice,
> -                          int srcX0, int srcY0,
> -                          int dstX0, int dstY0,
> -                          int width, int height)
> -{
> -   struct gl_context *ctx = &brw->ctx;
> -   struct intel_renderbuffer *src_irb = intel_renderbuffer(src_rb);
> -   struct intel_texture_image *intel_image = intel_texture_image(dst_image);
> -
> -   /* Sync up the state of window system buffers.  We need to do this before
> -    * we go looking at the src renderbuffer's miptree.
> -    */
> -   intel_prepare_render(brw);
> -
> -   struct intel_mipmap_tree *src_mt = src_irb->mt;
> -   struct intel_mipmap_tree *dst_mt = intel_image->mt;
> -
> -   /* BLORP is not supported before Gen6. */
> -   if (brw->gen < 6 || brw->gen >= 8)
> -      return false;
> -
> -   if (_mesa_get_format_base_format(src_mt->format) !=
> -       _mesa_get_format_base_format(dst_mt->format)) {
> -      return false;
> -   }
> -
> -   /* We can't handle format conversions between Z24 and other formats since
> -    * we have to lie about the surface format.  See the comments in
> -    * brw_blorp_surface_info::set().
> -    */
> -   if ((src_mt->format == MESA_FORMAT_Z24_UNORM_X8_UINT) !=
> -       (dst_mt->format == MESA_FORMAT_Z24_UNORM_X8_UINT)) {
> -      return false;
> -   }
> -
> -   if (!brw->format_supported_as_render_target[dst_mt->format])
> -      return false;
> -
> -   /* Source clipping shouldn't be necessary, since copytexsubimage (in
> -    * src/mesa/main/teximage.c) calls _mesa_clip_copytexsubimage() which
> -    * takes care of it.
> -    *
> -    * Destination clipping shouldn't be necessary since the restrictions on
> -    * glCopyTexSubImage prevent the user from specifying a destination 
> rectangle
> -    * that falls outside the bounds of the destination texture.
> -    * See error_check_subtexture_dimensions().
> -    */
> -
> -   int srcY1 = srcY0 + height;
> -   int srcX1 = srcX0 + width;
> -   int dstX1 = dstX0 + width;
> -   int dstY1 = dstY0 + height;
> -
> -   /* Account for the fact that in the system framebuffer, the origin is at
> -    * the lower left.
> -    */
> -   bool mirror_y = false;
> -   if (_mesa_is_winsys_fbo(ctx->ReadBuffer)) {
> -      GLint tmp = src_rb->Height - srcY0;
> -      srcY0 = src_rb->Height - srcY1;
> -      srcY1 = tmp;
> -      mirror_y = true;
> -   }
> -
> -   brw_blorp_blit_miptrees(brw,
> -                           src_mt, src_irb->mt_level, src_irb->mt_layer,
> -                           dst_mt, dst_image->Level, dst_image->Face + slice,
> -                           srcX0, srcY0, srcX1, srcY1,
> -                           dstX0, dstY0, dstX1, dstY1,
> -                           GL_NEAREST, false, mirror_y);
> -
> -   /* If we're copying to a packed depth stencil texture and the source
> -    * framebuffer has separate stencil, we need to also copy the stencil data
> -    * over.
> -    */
> -   src_rb = ctx->ReadBuffer->Attachment[BUFFER_STENCIL].Renderbuffer;
> -   if (_mesa_get_format_bits(dst_image->TexFormat, GL_STENCIL_BITS) > 0 &&
> -       src_rb != NULL) {
> -      src_irb = intel_renderbuffer(src_rb);
> -      src_mt = src_irb->mt;
> -
> -      if (src_mt->stencil_mt)
> -         src_mt = src_mt->stencil_mt;
> -      if (dst_mt->stencil_mt)
> -         dst_mt = dst_mt->stencil_mt;
> -
> -      if (src_mt != dst_mt) {
> -         brw_blorp_blit_miptrees(brw,
> -                                 src_mt, src_irb->mt_level, 
> src_irb->mt_layer,
> -                                 dst_mt, dst_image->Level,
> -                                 dst_image->Face + slice,
> -                                 srcX0, srcY0, srcX1, srcY1,
> -                                 dstX0, dstY0, dstX1, dstY1,
> -                                 GL_NEAREST, false, mirror_y);
> -      }
> -   }
> -
> -   return true;
> -}
> -
> -
>  GLbitfield
>  brw_blorp_framebuffer(struct brw_context *brw,
>                        GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
> diff --git a/src/mesa/drivers/dri/i965/brw_context.h 
> b/src/mesa/drivers/dri/i965/brw_context.h
> index ccbe9ea..5568fcb 100644
> --- a/src/mesa/drivers/dri/i965/brw_context.h
> +++ b/src/mesa/drivers/dri/i965/brw_context.h
> @@ -1710,15 +1710,6 @@ brw_blorp_framebuffer(struct brw_context *brw,
>                        GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
>                        GLbitfield mask, GLenum filter);
>  
> -bool
> -brw_blorp_copytexsubimage(struct brw_context *brw,
> -                          struct gl_renderbuffer *src_rb,
> -                          struct gl_texture_image *dst_image,
> -                          int slice,
> -                          int srcX0, int srcY0,
> -                          int dstX0, int dstY0,
> -                          int width, int height);
> -
>  /* gen6_multisample_state.c */
>  unsigned
>  gen6_determine_sample_mask(struct brw_context *brw);
> diff --git a/src/mesa/drivers/dri/i965/intel_tex_copy.c 
> b/src/mesa/drivers/dri/i965/intel_tex_copy.c
> index ca0b5b9..082437a 100644
> --- a/src/mesa/drivers/dri/i965/intel_tex_copy.c
> +++ b/src/mesa/drivers/dri/i965/intel_tex_copy.c
> @@ -99,12 +99,7 @@ intelCopyTexSubImage(struct gl_context *ctx, GLuint dims,
>  {
>     struct brw_context *brw = brw_context(ctx);
>  
> -   /* Try BLORP first.  It can handle almost everything. */
> -   if (brw_blorp_copytexsubimage(brw, rb, texImage, slice, x, y,
> -                                 xoffset, yoffset, width, height))
> -      return;
> -
> -   /* Next, try the BLT engine. */
> +   /* Try the BLT engine. */
>     if (intel_copy_texsubimage(brw,
>                                intel_texture_image(texImage),
>                                xoffset, yoffset, slice,
> @@ -112,8 +107,6 @@ intelCopyTexSubImage(struct gl_context *ctx, GLuint dims,
>        return;
>     }
>  
> -   /* Finally, fall back to meta.  This will likely be slow. */
> -   perf_debug("%s - fallback to swrast\n", __FUNCTION__);
>     _mesa_meta_CopyTexSubImage(ctx, dims, texImage,
>                                xoffset, yoffset, slice,
>                                rb, x, y, width, height);
> 

Sadly, this looks like a slight performance regression in Xonotic:

+--------------------------------------------------------------------------+
|                            +           +        +   x                    |
|                     ++     +  x   x++x ++ * x x+*+  x  x   xx            |
|+                  + ++ x* ** +x+  *+*x+++ * * x*** x*xxx+x xxx  xx      +|
|                        |__________|_A_M_______A_M_|_______|              |
+--------------------------------------------------------------------------+
    N           Min           Max        Median           Avg        Stddev
x  37     156.87213     159.97879     158.69534     158.58011    0.88627101
+  37     155.08178     160.50746     157.95545     157.86242    0.99051368
Difference at 95.0% confidence
        -0.717688 +/- 0.435487
        -0.452571% +/- 0.274616%
        (Student's t, pooled s = 0.939839)

After 37 runs my GPU hung, so I wasn't able to benchmark further.

Attachment: signature.asc
Description: OpenPGP digital signature

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to