[Mesa-dev] [PATCH 5/7] intel: Directly implement blit glBlitFramebuffer instead of awkward reuse.

Paul Berry stereotype441 at gmail.com
Fri Jun 7 11:22:23 PDT 2013


On 5 June 2013 10:14, Eric Anholt <eric at anholt.net> wrote:

> This gets us support for blitting to attachment types other than
> textures.
>

I don't follow everything in this patch, but I trust Ken's review, so
consider it

Acked-by: Paul Berry <stereotype441 at gmail.com>

I already made comments on patches 1 and 2.  Patches 3, 4, 6, and 7 are:

Reviewed-by: Paul Berry <stereotype441 at gmail.com>


> ---
>  src/mesa/drivers/dri/intel/intel_fbo.c      | 129
> +++++++++++++++-------------
>  src/mesa/drivers/dri/intel/intel_tex.h      |   7 --
>  src/mesa/drivers/dri/intel/intel_tex_copy.c |   2 +-
>  3 files changed, 69 insertions(+), 69 deletions(-)
>
> diff --git a/src/mesa/drivers/dri/intel/intel_fbo.c
> b/src/mesa/drivers/dri/intel/intel_fbo.c
> index 9f892a9..9a24a55 100644
> --- a/src/mesa/drivers/dri/intel/intel_fbo.c
> +++ b/src/mesa/drivers/dri/intel/intel_fbo.c
> @@ -737,76 +737,83 @@ intel_validate_framebuffer(struct gl_context *ctx,
> struct gl_framebuffer *fb)
>   *         normal path.
>   */
>  static GLbitfield
> -intel_blit_framebuffer_copy_tex_sub_image(struct gl_context *ctx,
> -                                          GLint srcX0, GLint srcY0,
> -                                          GLint srcX1, GLint srcY1,
> -                                          GLint dstX0, GLint dstY0,
> -                                          GLint dstX1, GLint dstY1,
> -                                          GLbitfield mask, GLenum filter)
> +intel_blit_framebuffer_with_blitter(struct gl_context *ctx,
> +                                    GLint srcX0, GLint srcY0,
> +                                    GLint srcX1, GLint srcY1,
> +                                    GLint dstX0, GLint dstY0,
> +                                    GLint dstX1, GLint dstY1,
> +                                    GLbitfield mask, GLenum filter)
>  {
> +   struct intel_context *intel = intel_context(ctx);
> +
>     if (mask & GL_COLOR_BUFFER_BIT) {
>        GLint i;
>        const struct gl_framebuffer *drawFb = ctx->DrawBuffer;
>        const struct gl_framebuffer *readFb = ctx->ReadBuffer;
> -      const struct gl_renderbuffer_attachment *drawAtt;
> -      struct intel_renderbuffer *srcRb =
> -         intel_renderbuffer(readFb->_ColorReadBuffer);
> +      struct gl_renderbuffer *src_rb = readFb->_ColorReadBuffer;
> +      struct intel_renderbuffer *src_irb = intel_renderbuffer(src_rb);
> +
> +      if (!src_irb) {
> +         perf_debug("glBlitFramebuffer(): missing src renderbuffer.  "
> +                    "Falling back to software rendering.\n");
> +         return mask;
> +      }
>
>        /* If the source and destination are the same size with no
> mirroring,
>         * the rectangles are within the size of the texture and there is no
> -       * scissor then we can use glCopyTexSubimage2D to implement the
> blit.
> -       * This will end up as a fast hardware blit on some drivers.
> +       * scissor, then we can probably use the blit engine.
>         */
> -      const GLboolean use_intel_copy_texsubimage =
> -         srcX0 - srcX1 == dstX0 - dstX1 &&
> -         srcY0 - srcY1 == dstY0 - dstY1 &&
> -         srcX1 >= srcX0 &&
> -         srcY1 >= srcY0 &&
> -         srcX0 >= 0 && srcX1 <= readFb->Width &&
> -         srcY0 >= 0 && srcY1 <= readFb->Height &&
> -         dstX0 >= 0 && dstX1 <= drawFb->Width &&
> -         dstY0 >= 0 && dstY1 <= drawFb->Height &&
> -         !ctx->Scissor.Enabled;
> -
> -      /* Verify that all the draw buffers can be blitted using
> -       * intel_copy_texsubimage().
> +      if (!(srcX0 - srcX1 == dstX0 - dstX1 &&
> +            srcY0 - srcY1 == dstY0 - dstY1 &&
> +            srcX1 >= srcX0 &&
> +            srcY1 >= srcY0 &&
> +            srcX0 >= 0 && srcX1 <= readFb->Width &&
> +            srcY0 >= 0 && srcY1 <= readFb->Height &&
> +            dstX0 >= 0 && dstX1 <= drawFb->Width &&
> +            dstY0 >= 0 && dstY1 <= drawFb->Height &&
> +            !ctx->Scissor.Enabled)) {
> +         perf_debug("glBlitFramebuffer(): non-1:1 blit.  "
> +                    "Falling back to software rendering.\n");
> +         return mask;
> +      }
> +
> +      /* Blit to all active draw buffers.  We don't do any pre-checking,
> +       * because we assume that copying to MRTs is rare, and failure
> midway
> +       * through copying is even more rare.  Given that feedback loops in
> +       * glFramebufferBlit() are undefined, we can safely fail out after
> +       * having partially completed our copies.
>         */
>        for (i = 0; i < ctx->DrawBuffer->_NumColorDrawBuffers; i++) {
> -         int idx = ctx->DrawBuffer->_ColorDrawBufferIndexes[i];
> -         if (idx == -1)
> -            continue;
> -         drawAtt = &drawFb->Attachment[idx];
> -
> -         if (srcRb && drawAtt && drawAtt->Texture &&
> -             use_intel_copy_texsubimage)
> -            continue;
> -         else
> +         struct gl_renderbuffer *dst_rb =
> ctx->DrawBuffer->_ColorDrawBuffers[i];
> +         struct intel_renderbuffer *dst_irb = intel_renderbuffer(dst_rb);
> +
> +         if (!dst_irb) {
> +            perf_debug("glBlitFramebuffer(): missing dst renderbuffer.  "
> +                       "Falling back to software rendering.\n");
>              return mask;
> -      }
> +         }
>
> -      /* Blit to all active draw buffers */
> -      for (i = 0; i < ctx->DrawBuffer->_NumColorDrawBuffers; i++) {
> -         int idx = ctx->DrawBuffer->_ColorDrawBufferIndexes[i];
> -         if (idx == -1)
> -            continue;
> -         drawAtt = &drawFb->Attachment[idx];
> -
> -         {
> -            const struct gl_texture_object *texObj = drawAtt->Texture;
> -            const GLuint dstLevel = drawAtt->TextureLevel;
> -            const GLenum target = texObj->Target;
> -
> -            struct gl_texture_image *texImage =
> -               _mesa_select_tex_image(ctx, texObj, target, dstLevel);
> -
> -            if (!intel_copy_texsubimage(intel_context(ctx),
> -                                        intel_texture_image(texImage),
> -                                        dstX0, dstY0,
> -                                        srcRb,
> -                                        srcX0, srcY0,
> -                                        srcX1 - srcX0, /* width */
> -                                        srcY1 - srcY0))
> -               return mask;
> +         gl_format src_format =
> _mesa_get_srgb_format_linear(src_rb->Format);
> +         gl_format dst_format =
> _mesa_get_srgb_format_linear(dst_rb->Format);
> +         if (src_format != dst_format) {
> +            perf_debug("glBlitFramebuffer(): unsupported blit from %s to
> %s.  "
> +                       "Falling back to software rendering.\n",
> +                       _mesa_get_format_name(src_format),
> +                       _mesa_get_format_name(dst_format));
> +            return mask;
> +         }
> +
> +         if (!intel_miptree_blit(intel,
> +                                 src_irb->mt,
> +                                 src_irb->mt_level, src_irb->mt_layer,
> +                                 srcX0, srcY0, src_rb->Name == 0,
> +                                 dst_irb->mt,
> +                                 dst_irb->mt_level, dst_irb->mt_layer,
> +                                 dstX0, dstY0, dst_rb->Name == 0,
> +                                 dstX1 - dstX0, dstY1 - dstY0, GL_COPY)) {
> +            perf_debug("glBlitFramebuffer(): unknown blit failure.  "
> +                       "Falling back to software rendering.\n");
> +            return mask;
>           }
>        }
>
> @@ -832,10 +839,10 @@ intel_blit_framebuffer(struct gl_context *ctx,
>  #endif
>
>     /* Try glCopyTexSubImage2D approach which uses the BLT. */
> -   mask = intel_blit_framebuffer_copy_tex_sub_image(ctx,
> -                                                    srcX0, srcY0, srcX1,
> srcY1,
> -                                                    dstX0, dstY0, dstX1,
> dstY1,
> -                                                    mask, filter);
> +   mask = intel_blit_framebuffer_with_blitter(ctx,
> +                                              srcX0, srcY0, srcX1, srcY1,
> +                                              dstX0, dstY0, dstX1, dstY1,
> +                                              mask, filter);
>     if (mask == 0x0)
>        return;
>
> diff --git a/src/mesa/drivers/dri/intel/intel_tex.h
> b/src/mesa/drivers/dri/intel/intel_tex.h
> index e038115..a08fdf4 100644
> --- a/src/mesa/drivers/dri/intel/intel_tex.h
> +++ b/src/mesa/drivers/dri/intel/intel_tex.h
> @@ -68,13 +68,6 @@ bool
>  intel_tex_image_s8z24_create_renderbuffers(struct intel_context *intel,
>                                            struct intel_texture_image
> *image);
>
> -bool intel_copy_texsubimage(struct intel_context *intel,
> -                            struct intel_texture_image *intelImage,
> -                            GLint dstx, GLint dsty,
> -                            struct intel_renderbuffer *irb,
> -                            GLint x, GLint y,
> -                            GLsizei width, GLsizei height);
> -
>  bool
>  intel_texsubimage_tiled_memcpy(struct gl_context *ctx,
>                                 GLuint dims,
> diff --git a/src/mesa/drivers/dri/intel/intel_tex_copy.c
> b/src/mesa/drivers/dri/intel/intel_tex_copy.c
> index 4f01c58..f9e03fa 100644
> --- a/src/mesa/drivers/dri/intel/intel_tex_copy.c
> +++ b/src/mesa/drivers/dri/intel/intel_tex_copy.c
> @@ -48,7 +48,7 @@
>  #define FILE_DEBUG_FLAG DEBUG_TEXTURE
>
>
> -bool
> +static bool
>  intel_copy_texsubimage(struct intel_context *intel,
>                         struct intel_texture_image *intelImage,
>                         GLint dstx, GLint dsty,
> --
> 1.8.3.rc0
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20130607/89275de4/attachment-0001.html>


More information about the mesa-dev mailing list