[Mesa-dev] [PATCH] DD: Refactor BlitFramebuffer.

Jason Ekstrand jason at jlekstrand.net
Fri Jan 30 22:12:18 PST 2015


Quick question: Did you search for ReadBuffer and DrawBuffer as you went to
make sure you didn't miss any?

If the answer to the above is yes and the comment below is addressed,

Reviewed-by: Jason Ekstrand <jason.ekstrand at intel.com>

This is going to help the PBO upload path a lot!
--Jason

On Fri, Jan 30, 2015 at 4:25 PM, Laura Ekstrand <laura at jlekstrand.net>
wrote:

> In preparation for glBlitNamedFramebuffer, the DD table function
> BlitFramebuffer needs to accept two arbitrary framebuffer objects rather
> than assuming ctx->ReadBuffer and ctx->DrawBuffer.
> ---
>  src/mesa/drivers/common/meta.c                    |  3 +-
>  src/mesa/drivers/common/meta.h                    |  4 +++
>  src/mesa/drivers/common/meta_blit.c               | 32 +++++++++++------
>  src/mesa/drivers/common/meta_copy_image.c         |  3 +-
>  src/mesa/drivers/common/meta_tex_subimage.c       | 12 ++++---
>  src/mesa/drivers/dri/i915/intel_fbo.c             | 14 ++++----
>  src/mesa/drivers/dri/i965/brw_blorp_blit.cpp      | 15 ++++----
>  src/mesa/drivers/dri/i965/brw_context.h           |  4 +++
>  src/mesa/drivers/dri/i965/brw_meta_stencil_blit.c | 10 +++---
>  src/mesa/drivers/dri/i965/brw_meta_util.c         |  5 ++-
>  src/mesa/drivers/dri/i965/brw_meta_util.h         |  2 ++
>  src/mesa/drivers/dri/i965/intel_fbo.c             | 16 +++++----
>  src/mesa/main/blit.c                              |  2 +-
>  src/mesa/main/dd.h                                |  2 ++
>  src/mesa/main/image.c                             | 14 ++++----
>  src/mesa/main/image.h                             |  3 ++
>  src/mesa/state_tracker/st_cb_blit.c               |  6 ++--
>  src/mesa/swrast/s_blit.c                          | 43
> ++++++++++++-----------
>  src/mesa/swrast/s_copypix.c                       | 25 ++++++-------
>  src/mesa/swrast/swrast.h                          | 18 ++++++----
>  20 files changed, 140 insertions(+), 93 deletions(-)
>
> diff --git a/src/mesa/drivers/common/meta.c
> b/src/mesa/drivers/common/meta.c
> index 8b73cb9..bb00730 100644
> --- a/src/mesa/drivers/common/meta.c
> +++ b/src/mesa/drivers/common/meta.c
> @@ -2793,7 +2793,8 @@ copytexsubimage_using_blit_framebuffer(struct
> gl_context *ctx, GLuint dims,
>      * are too strict for CopyTexImage.  We know meta will be fine with
> format
>      * changes.
>      */
> -   mask = _mesa_meta_BlitFramebuffer(ctx, x, y,
> +   mask = _mesa_meta_BlitFramebuffer(ctx, ctx->ReadBuffer,
> ctx->DrawBuffer,
> +                                     x, y,
>                                       x + width, y + height,
>                                       xoffset, yoffset,
>                                       xoffset + width, yoffset + height,
> diff --git a/src/mesa/drivers/common/meta.h
> b/src/mesa/drivers/common/meta.h
> index 3b9e05e..e7d894d 100644
> --- a/src/mesa/drivers/common/meta.h
> +++ b/src/mesa/drivers/common/meta.h
> @@ -475,12 +475,16 @@ _mesa_meta_setup_sampler(struct gl_context *ctx,
>
>  extern GLbitfield
>  _mesa_meta_BlitFramebuffer(struct gl_context *ctx,
> +                           const struct gl_framebuffer *readFb,
> +                           const struct gl_framebuffer *drawFb,
>                             GLint srcX0, GLint srcY0, GLint srcX1, GLint
> srcY1,
>                             GLint dstX0, GLint dstY0, GLint dstX1, GLint
> dstY1,
>                             GLbitfield mask, GLenum filter);
>
>  extern void
>  _mesa_meta_and_swrast_BlitFramebuffer(struct gl_context *ctx,
> +                                      struct gl_framebuffer *readFb,
> +                                      struct gl_framebuffer *drawFb,
>                                        GLint srcX0, GLint srcY0,
>                                        GLint srcX1, GLint srcY1,
>                                        GLint dstX0, GLint dstY0,
> diff --git a/src/mesa/drivers/common/meta_blit.c
> b/src/mesa/drivers/common/meta_blit.c
> index 4212d94..3406be1 100644
> --- a/src/mesa/drivers/common/meta_blit.c
> +++ b/src/mesa/drivers/common/meta_blit.c
> @@ -232,6 +232,7 @@ setup_glsl_msaa_blit_scaled_shader(struct gl_context
> *ctx,
>  static void
>  setup_glsl_msaa_blit_shader(struct gl_context *ctx,
>                              struct blit_state *blit,
> +                            const struct gl_framebuffer *drawFb,
>                              struct gl_renderbuffer *src_rb,
>                              GLenum target)
>  {
> @@ -267,7 +268,7 @@ setup_glsl_msaa_blit_shader(struct gl_context *ctx,
>     /* Update the assert if we plan to support more than 16X MSAA. */
>     assert(shader_offset >= 0 && shader_offset <= 4);
>
> -   if (ctx->DrawBuffer->Visual.samples > 1) {
> +   if (drawFb->Visual.samples > 1) {
>        /* If you're calling meta_BlitFramebuffer with the destination
>         * multisampled, this is the only path that will work -- swrast and
>         * CopyTexImage won't work on it either.
> @@ -508,6 +509,7 @@ setup_glsl_msaa_blit_shader(struct gl_context *ctx,
>  static void
>  setup_glsl_blit_framebuffer(struct gl_context *ctx,
>                              struct blit_state *blit,
> +                            const struct gl_framebuffer *drawFb,
>                              struct gl_renderbuffer *src_rb,
>                              GLenum target, GLenum filter,
>                              bool is_scaled_blit,
> @@ -530,7 +532,7 @@ setup_glsl_blit_framebuffer(struct gl_context *ctx,
>     if (is_target_multisample && is_filter_scaled_resolve &&
> is_scaled_blit) {
>        setup_glsl_msaa_blit_scaled_shader(ctx, blit, src_rb, target,
> filter);
>     } else if (is_target_multisample) {
> -      setup_glsl_msaa_blit_shader(ctx, blit, src_rb, target);
> +      setup_glsl_msaa_blit_shader(ctx, blit, drawFb, src_rb, target);
>     } else {
>        _mesa_meta_setup_blit_shader(ctx, target, do_depth,
>                                     do_depth ? &blit->shaders_with_depth
> @@ -546,12 +548,13 @@ setup_glsl_blit_framebuffer(struct gl_context *ctx,
>   */
>  static bool
>  blitframebuffer_texture(struct gl_context *ctx,
> +                        const struct gl_framebuffer *readFb,
> +                        const struct gl_framebuffer *drawFb,
>                          GLint srcX0, GLint srcY0, GLint srcX1, GLint
> srcY1,
>                          GLint dstX0, GLint dstY0, GLint dstX1, GLint
> dstY1,
>                          GLenum filter, GLint flipX, GLint flipY,
>                          GLboolean glsl_version, GLboolean do_depth)
>  {
> -   const struct gl_framebuffer *readFb = ctx->ReadBuffer;
>     int att_index = do_depth ? BUFFER_DEPTH :
> readFb->_ColorReadBufferIndex;
>     const struct gl_renderbuffer_attachment *readAtt =
>        &readFb->Attachment[att_index];
> @@ -645,7 +648,7 @@ blitframebuffer_texture(struct gl_context *ctx,
>     scaled_blit = dstW != srcW || dstH != srcH;
>
>     if (glsl_version) {
> -      setup_glsl_blit_framebuffer(ctx, blit, rb, target, filter,
> scaled_blit,
> +      setup_glsl_blit_framebuffer(ctx, blit, drawFb, rb, target, filter,
> scaled_blit,
>                                    do_depth);
>     }
>     else {
> @@ -681,7 +684,7 @@ blitframebuffer_texture(struct gl_context *ctx,
>      */
>     if (ctx->Extensions.EXT_texture_sRGB_decode) {
>        if (_mesa_get_format_color_encoding(rb->Format) == GL_SRGB &&
> -          ctx->DrawBuffer->Visual.sRGBCapable) {
> +          drawFb->Visual.sRGBCapable) {
>           _mesa_SamplerParameteri(fb_tex_blit.sampler,
>                                   GL_TEXTURE_SRGB_DECODE_EXT,
> GL_DECODE_EXT);
>           _mesa_set_framebuffer_srgb(ctx, GL_TRUE);
> @@ -873,6 +876,8 @@ _mesa_meta_setup_sampler(struct gl_context *ctx,
>   */
>  GLbitfield
>  _mesa_meta_BlitFramebuffer(struct gl_context *ctx,
> +                           const struct gl_framebuffer *readFb,
> +                           const struct gl_framebuffer *drawFb,
>                             GLint srcX0, GLint srcY0, GLint srcX1, GLint
> srcY1,
>                             GLint dstX0, GLint dstY0, GLint dstX1, GLint
> dstY1,
>                             GLbitfield mask, GLenum filter)
> @@ -894,7 +899,7 @@ _mesa_meta_BlitFramebuffer(struct gl_context *ctx,
>                                        ctx->Extensions.ARB_fragment_shader;
>
>     /* Multisample texture blit support requires texture multisample. */
> -   if (ctx->ReadBuffer->Visual.samples > 0 &&
> +   if (readFb->Visual.samples > 0 &&
>         !ctx->Extensions.ARB_texture_multisample) {
>        return mask;
>     }
> @@ -902,7 +907,8 @@ _mesa_meta_BlitFramebuffer(struct gl_context *ctx,
>     /* Clip a copy of the blit coordinates. If these differ from the input
>      * coordinates, then we'll set the scissor.
>      */
> -   if (!_mesa_clip_blit(ctx, &clip.srcX0, &clip.srcY0, &clip.srcX1,
> &clip.srcY1,
> +   if (!_mesa_clip_blit(ctx, readFb, drawFb,
> +                        &clip.srcX0, &clip.srcY0, &clip.srcX1,
> &clip.srcY1,
>                          &clip.dstX0, &clip.dstY0, &clip.dstX1,
> &clip.dstY1)) {
>        /* clipped/scissored everything away */
>        return 0;
> @@ -930,7 +936,8 @@ _mesa_meta_BlitFramebuffer(struct gl_context *ctx,
>
>     /* Try faster, direct texture approach first */
>     if (mask & GL_COLOR_BUFFER_BIT) {
> -      if (blitframebuffer_texture(ctx, srcX0, srcY0, srcX1, srcY1,
> +      if (blitframebuffer_texture(ctx, readFb, drawFb,
> +                                  srcX0, srcY0, srcX1, srcY1,
>                                    dstX0, dstY0, dstX1, dstY1,
>                                    filter, dstFlipX, dstFlipY,
>                                    use_glsl_version, false)) {
> @@ -939,7 +946,8 @@ _mesa_meta_BlitFramebuffer(struct gl_context *ctx,
>     }
>
>     if (mask & GL_DEPTH_BUFFER_BIT && use_glsl_version) {
> -      if (blitframebuffer_texture(ctx, srcX0, srcY0, srcX1, srcY1,
> +      if (blitframebuffer_texture(ctx, readFb, drawFb,
> +                                  srcX0, srcY0, srcX1, srcY1,
>                                    dstX0, dstY0, dstX1, dstY1,
>                                    filter, dstFlipX, dstFlipY,
>                                    use_glsl_version, true)) {
> @@ -975,20 +983,22 @@ _mesa_meta_glsl_blit_cleanup(struct blit_state *blit)
>
>  void
>  _mesa_meta_and_swrast_BlitFramebuffer(struct gl_context *ctx,
> +                                      struct gl_framebuffer *readFb,
> +                                      struct gl_framebuffer *drawFb,
>                                        GLint srcX0, GLint srcY0,
>                                        GLint srcX1, GLint srcY1,
>                                        GLint dstX0, GLint dstY0,
>                                        GLint dstX1, GLint dstY1,
>                                        GLbitfield mask, GLenum filter)
>  {
> -   mask = _mesa_meta_BlitFramebuffer(ctx,
> +   mask = _mesa_meta_BlitFramebuffer(ctx, readFb, drawFb,
>                                       srcX0, srcY0, srcX1, srcY1,
>                                       dstX0, dstY0, dstX1, dstY1,
>                                       mask, filter);
>     if (mask == 0x0)
>        return;
>
> -   _swrast_BlitFramebuffer(ctx,
> +   _swrast_BlitFramebuffer(ctx, readFb, drawFb,
>                             srcX0, srcY0, srcX1, srcY1,
>                             dstX0, dstY0, dstX1, dstY1,
>                             mask, filter);
> diff --git a/src/mesa/drivers/common/meta_copy_image.c
> b/src/mesa/drivers/common/meta_copy_image.c
> index fc0cbaf..1729766 100644
> --- a/src/mesa/drivers/common/meta_copy_image.c
> +++ b/src/mesa/drivers/common/meta_copy_image.c
> @@ -189,7 +189,8 @@ _mesa_meta_CopyImageSubData_uncompressed(struct
> gl_context *ctx,
>      * We have already created views to ensure that the texture formats
>      * match.
>      */
> -   ctx->Driver.BlitFramebuffer(ctx, src_x, src_y,
> +   ctx->Driver.BlitFramebuffer(ctx, ctx->ReadBuffer, ctx->DrawBuffer,
> +                               src_x, src_y,
>                                 src_x + src_width, src_y + src_height,
>                                 dst_x, dst_y,
>                                 dst_x + src_width, dst_y + src_height,
> diff --git a/src/mesa/drivers/common/meta_tex_subimage.c
> b/src/mesa/drivers/common/meta_tex_subimage.c
> index 977ee5a..68c8273 100644
> --- a/src/mesa/drivers/common/meta_tex_subimage.c
> +++ b/src/mesa/drivers/common/meta_tex_subimage.c
> @@ -206,7 +206,8 @@ _mesa_meta_pbo_TexSubImage(struct gl_context *ctx,
> GLuint dims,
>
>     _mesa_update_state(ctx);
>
> -   if (_mesa_meta_BlitFramebuffer(ctx, 0, 0, width, height,
> +   if (_mesa_meta_BlitFramebuffer(ctx, ctx->ReadBuffer, ctx->DrawBuffer,
> +                                  0, 0, width, height,
>                                    xoffset, yoffset,
>                                    xoffset + width, yoffset + height,
>                                    GL_COLOR_BUFFER_BIT, GL_NEAREST))
> @@ -220,7 +221,8 @@ _mesa_meta_pbo_TexSubImage(struct gl_context *ctx,
> GLuint dims,
>
>        _mesa_update_state(ctx);
>
> -      _mesa_meta_BlitFramebuffer(ctx, 0, 0, width, height,
> +      _mesa_meta_BlitFramebuffer(ctx, ctx->ReadBuffer, ctx->DrawBuffer,
> +                                 0, 0, width, height,
>                                   xoffset, yoffset,
>                                   xoffset + width, yoffset + height,
>                                   GL_COLOR_BUFFER_BIT, GL_NEAREST);
> @@ -324,7 +326,8 @@ _mesa_meta_pbo_GetTexSubImage(struct gl_context *ctx,
> GLuint dims,
>
>     _mesa_update_state(ctx);
>
> -   if (_mesa_meta_BlitFramebuffer(ctx, xoffset, yoffset,
> +   if (_mesa_meta_BlitFramebuffer(ctx, ctx->ReadBuffer, ctx->DrawBuffer,
> +                                  xoffset, yoffset,
>                                    xoffset + width, yoffset + height,
>                                    0, 0, width, height,
>                                    GL_COLOR_BUFFER_BIT, GL_NEAREST))
> @@ -338,7 +341,8 @@ _mesa_meta_pbo_GetTexSubImage(struct gl_context *ctx,
> GLuint dims,
>
>        _mesa_update_state(ctx);
>
> -      _mesa_meta_BlitFramebuffer(ctx, xoffset, yoffset,
> +      _mesa_meta_BlitFramebuffer(ctx, ctx->ReadBuffer, ctx->DrawBuffer,
> +                                 xoffset, yoffset,
>                                   xoffset + width, yoffset + height,
>                                   0, 0, width, height,
>                                   GL_COLOR_BUFFER_BIT, GL_NEAREST);
> diff --git a/src/mesa/drivers/dri/i915/intel_fbo.c
> b/src/mesa/drivers/dri/i915/intel_fbo.c
> index eb88a60..d4abd27 100644
> --- a/src/mesa/drivers/dri/i915/intel_fbo.c
> +++ b/src/mesa/drivers/dri/i915/intel_fbo.c
> @@ -649,6 +649,8 @@ intel_validate_framebuffer(struct gl_context *ctx,
> struct gl_framebuffer *fb)
>   */
>  static GLbitfield
>  intel_blit_framebuffer_with_blitter(struct gl_context *ctx,
> +                                    const struct gl_framebuffer *readFb,
> +                                    const struct gl_framebuffer *drawFb,
>                                      GLint srcX0, GLint srcY0,
>                                      GLint srcX1, GLint srcY1,
>                                      GLint dstX0, GLint dstY0,
> @@ -659,8 +661,6 @@ intel_blit_framebuffer_with_blitter(struct gl_context
> *ctx,
>
>     if (mask & GL_COLOR_BUFFER_BIT) {
>        GLint i;
> -      const struct gl_framebuffer *drawFb = ctx->DrawBuffer;
> -      const struct gl_framebuffer *readFb = ctx->ReadBuffer;
>        struct gl_renderbuffer *src_rb = readFb->_ColorReadBuffer;
>        struct intel_renderbuffer *src_irb = intel_renderbuffer(src_rb);
>
> @@ -696,8 +696,8 @@ intel_blit_framebuffer_with_blitter(struct gl_context
> *ctx,
>         * results are undefined if any destination pixels have a
> dependency on
>         * source pixels.
>         */
> -      for (i = 0; i < ctx->DrawBuffer->_NumColorDrawBuffers; i++) {
> -         struct gl_renderbuffer *dst_rb =
> ctx->DrawBuffer->_ColorDrawBuffers[i];
> +      for (i = 0; i < drawFb->_NumColorDrawBuffers; i++) {
> +         struct gl_renderbuffer *dst_rb = drawFb->_ColorDrawBuffers[i];
>           struct intel_renderbuffer *dst_irb = intel_renderbuffer(dst_rb);
>
>           if (!dst_irb) {
> @@ -738,12 +738,14 @@ intel_blit_framebuffer_with_blitter(struct
> gl_context *ctx,
>
>  static void
>  intel_blit_framebuffer(struct gl_context *ctx,
> +                       struct gl_framebuffer *readFb,
> +                       struct gl_framebuffer *drawFb,
>                         GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
>                         GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
>                         GLbitfield mask, GLenum filter)
>  {
>     /* Try using the BLT engine. */
> -   mask = intel_blit_framebuffer_with_blitter(ctx,
> +   mask = intel_blit_framebuffer_with_blitter(ctx, readFb, drawFb,
>                                                srcX0, srcY0, srcX1, srcY1,
>                                                dstX0, dstY0, dstX1, dstY1,
>                                                mask, filter);
> @@ -751,7 +753,7 @@ intel_blit_framebuffer(struct gl_context *ctx,
>        return;
>
>
> -   _mesa_meta_and_swrast_BlitFramebuffer(ctx,
> +   _mesa_meta_and_swrast_BlitFramebuffer(ctx, readFb, drawFb,
>                                           srcX0, srcY0, srcX1, srcY1,
>                                           dstX0, dstY0, dstX1, dstY1,
>                                           mask, filter);
> diff --git a/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp
> b/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp
> index 936feaf..10a53dc 100644
> --- a/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp
> @@ -125,6 +125,8 @@ do_blorp_blit(struct brw_context *brw, GLbitfield
> buffer_bit,
>
>  static bool
>  try_blorp_blit(struct brw_context *brw,
> +               const struct gl_framebuffer *read_fb,
> +               const struct gl_framebuffer *draw_fb,
>                 GLfloat srcX0, GLfloat srcY0, GLfloat srcX1, GLfloat srcY1,
>                 GLfloat dstX0, GLfloat dstY0, GLfloat dstX1, GLfloat dstY1,
>                 GLenum filter, GLbitfield buffer_bit)
> @@ -136,11 +138,8 @@ try_blorp_blit(struct brw_context *brw,
>      */
>     intel_prepare_render(brw);
>
> -   const struct gl_framebuffer *read_fb = ctx->ReadBuffer;
> -   const struct gl_framebuffer *draw_fb = ctx->DrawBuffer;
> -
>     bool mirror_x, mirror_y;
> -   if (brw_meta_mirror_clip_and_scissor(ctx,
> +   if (brw_meta_mirror_clip_and_scissor(ctx, read_fb, draw_fb,
>                                          &srcX0, &srcY0, &srcX1, &srcY1,
>                                          &dstX0, &dstY0, &dstX1, &dstY1,
>                                          &mirror_x, &mirror_y))
> @@ -154,8 +153,8 @@ try_blorp_blit(struct brw_context *brw,
>     switch (buffer_bit) {
>     case GL_COLOR_BUFFER_BIT:
>        src_irb = intel_renderbuffer(read_fb->_ColorReadBuffer);
> -      for (unsigned i = 0; i < ctx->DrawBuffer->_NumColorDrawBuffers;
> ++i) {
> -         dst_irb =
> intel_renderbuffer(ctx->DrawBuffer->_ColorDrawBuffers[i]);
> +      for (unsigned i = 0; i < draw_fb->_NumColorDrawBuffers; ++i) {
> +         dst_irb = intel_renderbuffer(draw_fb->_ColorDrawBuffers[i]);
>          if (dst_irb)
>              do_blorp_blit(brw, buffer_bit,
>                            src_irb, src_irb->Base.Base.Format,
> @@ -317,6 +316,8 @@ brw_blorp_copytexsubimage(struct brw_context *brw,
>
>  GLbitfield
>  brw_blorp_framebuffer(struct brw_context *brw,
> +                      struct gl_framebuffer *readFb,
> +                      struct gl_framebuffer *drawFb,
>                        GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
>                        GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
>                        GLbitfield mask, GLenum filter)
> @@ -333,7 +334,7 @@ brw_blorp_framebuffer(struct brw_context *brw,
>
>     for (unsigned int i = 0; i < ARRAY_SIZE(buffer_bits); ++i) {
>        if ((mask & buffer_bits[i]) &&
> -       try_blorp_blit(brw,
> +       try_blorp_blit(brw, readFb, drawFb,
>                        srcX0, srcY0, srcX1, srcY1,
>                        dstX0, dstY0, dstX1, dstY1,
>                        filter, buffer_bits[i])) {
> diff --git a/src/mesa/drivers/dri/i965/brw_context.h
> b/src/mesa/drivers/dri/i965/brw_context.h
> index a4b29fa..c34a49d 100644
> --- a/src/mesa/drivers/dri/i965/brw_context.h
> +++ b/src/mesa/drivers/dri/i965/brw_context.h
> @@ -1490,6 +1490,8 @@ void brw_meta_updownsample(struct brw_context *brw,
>                             struct intel_mipmap_tree *dst);
>
>  void brw_meta_fbo_stencil_blit(struct brw_context *brw,
> +                               struct gl_framebuffer *read_fb,
> +                               struct gl_framebuffer *draw_fb,
>                                 GLfloat srcX0, GLfloat srcY0,
>                                 GLfloat srcX1, GLfloat srcY1,
>                                 GLfloat dstX0, GLfloat dstY0,
> @@ -1714,6 +1716,8 @@ gen7_resume_transform_feedback(struct gl_context
> *ctx,
>  /* brw_blorp_blit.cpp */
>  GLbitfield
>  brw_blorp_framebuffer(struct brw_context *brw,
> +                      struct gl_framebuffer *readFb,
> +                      struct gl_framebuffer *drawFb,
>                        GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
>                        GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
>                        GLbitfield mask, GLenum filter);
> diff --git a/src/mesa/drivers/dri/i965/brw_meta_stencil_blit.c
> b/src/mesa/drivers/dri/i965/brw_meta_stencil_blit.c
> index b9b481b..fc7018d 100644
> --- a/src/mesa/drivers/dri/i965/brw_meta_stencil_blit.c
> +++ b/src/mesa/drivers/dri/i965/brw_meta_stencil_blit.c
> @@ -460,15 +460,17 @@ error:
>
>  void
>  brw_meta_fbo_stencil_blit(struct brw_context *brw,
> +                          struct gl_framebuffer *read_fb,
> +                          struct gl_framebuffer *draw_fb,
>                            GLfloat src_x0, GLfloat src_y0,
>                            GLfloat src_x1, GLfloat src_y1,
>                            GLfloat dst_x0, GLfloat dst_y0,
>                            GLfloat dst_x1, GLfloat dst_y1)
>  {
>     struct gl_context *ctx = &brw->ctx;
> -   struct gl_renderbuffer *draw_fb =
> -      ctx->DrawBuffer->Attachment[BUFFER_STENCIL].Renderbuffer;
> -   const struct intel_renderbuffer *dst_irb = intel_renderbuffer(draw_fb);
> +   struct gl_renderbuffer *draw_rb =
> +      draw_fb->Attachment[BUFFER_STENCIL].Renderbuffer;
> +   const struct intel_renderbuffer *dst_irb = intel_renderbuffer(draw_rb);
>     struct intel_mipmap_tree *dst_mt = dst_irb->mt;
>
>     if (!dst_mt)
> @@ -478,7 +480,7 @@ brw_meta_fbo_stencil_blit(struct brw_context *brw,
>        dst_mt = dst_mt->stencil_mt;
>
>     bool mirror_x, mirror_y;
> -   if (brw_meta_mirror_clip_and_scissor(ctx,
> +   if (brw_meta_mirror_clip_and_scissor(ctx, read_fb, draw_fb,
>                                          &src_x0, &src_y0, &src_x1,
> &src_y1,
>                                          &dst_x0, &dst_y0, &dst_x1,
> &dst_y1,
>                                          &mirror_x, &mirror_y))
> diff --git a/src/mesa/drivers/dri/i965/brw_meta_util.c
> b/src/mesa/drivers/dri/i965/brw_meta_util.c
> index 72ed96c..a3b0604 100644
> --- a/src/mesa/drivers/dri/i965/brw_meta_util.c
> +++ b/src/mesa/drivers/dri/i965/brw_meta_util.c
> @@ -104,15 +104,14 @@ clip_or_scissor(bool mirror,
>
>  bool
>  brw_meta_mirror_clip_and_scissor(const struct gl_context *ctx,
> +                                 const struct gl_framebuffer *read_fb,
> +                                 const struct gl_framebuffer *draw_fb,
>                                   GLfloat *srcX0, GLfloat *srcY0,
>                                   GLfloat *srcX1, GLfloat *srcY1,
>                                   GLfloat *dstX0, GLfloat *dstY0,
>                                   GLfloat *dstX1, GLfloat *dstY1,
>                                   bool *mirror_x, bool *mirror_y)
>  {
> -   const struct gl_framebuffer *read_fb = ctx->ReadBuffer;
> -   const struct gl_framebuffer *draw_fb = ctx->DrawBuffer;
> -
>     *mirror_x = false;
>     *mirror_y = false;
>
> diff --git a/src/mesa/drivers/dri/i965/brw_meta_util.h
> b/src/mesa/drivers/dri/i965/brw_meta_util.h
> index ccd8642..dc9dff2 100644
> --- a/src/mesa/drivers/dri/i965/brw_meta_util.h
> +++ b/src/mesa/drivers/dri/i965/brw_meta_util.h
> @@ -33,6 +33,8 @@ extern "C" {
>
>  bool
>  brw_meta_mirror_clip_and_scissor(const struct gl_context *ctx,
> +                                 const struct gl_framebuffer *read_fb,
> +                                 const struct gl_framebuffer *draw_fb,
>                                   GLfloat *srcX0, GLfloat *srcY0,
>                                   GLfloat *srcX1, GLfloat *srcY1,
>                                   GLfloat *dstX0, GLfloat *dstY0,
> diff --git a/src/mesa/drivers/dri/i965/intel_fbo.c
> b/src/mesa/drivers/dri/i965/intel_fbo.c
> index 7bdf995..da31c6f 100644
> --- a/src/mesa/drivers/dri/i965/intel_fbo.c
> +++ b/src/mesa/drivers/dri/i965/intel_fbo.c
> @@ -779,6 +779,8 @@ intel_validate_framebuffer(struct gl_context *ctx,
> struct gl_framebuffer *fb)
>   */
>  static GLbitfield
>  intel_blit_framebuffer_with_blitter(struct gl_context *ctx,
> +                                    const struct gl_framebuffer *readFb,
> +                                    const struct gl_framebuffer *drawFb,
>                                      GLint srcX0, GLint srcY0,
>                                      GLint srcX1, GLint srcY1,
>                                      GLint dstX0, GLint dstY0,
> @@ -794,8 +796,6 @@ intel_blit_framebuffer_with_blitter(struct gl_context
> *ctx,
>
>     if (mask & GL_COLOR_BUFFER_BIT) {
>        GLint i;
> -      const struct gl_framebuffer *drawFb = ctx->DrawBuffer;
> -      const struct gl_framebuffer *readFb = ctx->ReadBuffer;
>        struct gl_renderbuffer *src_rb = readFb->_ColorReadBuffer;
>        struct intel_renderbuffer *src_irb = intel_renderbuffer(src_rb);
>
> @@ -863,6 +863,8 @@ intel_blit_framebuffer_with_blitter(struct gl_context
> *ctx,
>
>  static void
>  intel_blit_framebuffer(struct gl_context *ctx,
> +                       struct gl_framebuffer *readFb,
> +                       struct gl_framebuffer *drawFb,
>                         GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
>                         GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
>                         GLbitfield mask, GLenum filter)
> @@ -876,7 +878,7 @@ intel_blit_framebuffer(struct gl_context *ctx,
>     if (!_mesa_check_conditional_render(ctx))
>        return;
>
> -   mask = brw_blorp_framebuffer(brw,
> +   mask = brw_blorp_framebuffer(brw, readFb, drawFb,
>                                  srcX0, srcY0, srcX1, srcY1,
>                                  dstX0, dstY0, dstX1, dstY1,
>                                  mask, filter);
> @@ -884,7 +886,7 @@ intel_blit_framebuffer(struct gl_context *ctx,
>        return;
>
>     if (brw->gen >= 8 && (mask & GL_STENCIL_BUFFER_BIT)) {
> -      brw_meta_fbo_stencil_blit(brw_context(ctx),
> +      brw_meta_fbo_stencil_blit(brw_context(ctx), readFb, drawFb,
>                                  srcX0, srcY0, srcX1, srcY1,
>                                  dstX0, dstY0, dstX1, dstY1);
>        mask &= ~GL_STENCIL_BUFFER_BIT;
> @@ -893,21 +895,21 @@ intel_blit_framebuffer(struct gl_context *ctx,
>     }
>
>     /* Try using the BLT engine. */
> -   mask = intel_blit_framebuffer_with_blitter(ctx,
> +   mask = intel_blit_framebuffer_with_blitter(ctx, readFb, drawFb,
>                                                srcX0, srcY0, srcX1, srcY1,
>                                                dstX0, dstY0, dstX1, dstY1,
>                                                mask, filter);
>     if (mask == 0x0)
>        return;
>
> -   mask = _mesa_meta_BlitFramebuffer(ctx,
> +   mask = _mesa_meta_BlitFramebuffer(ctx, readFb, drawFb,
>                                       srcX0, srcY0, srcX1, srcY1,
>                                       dstX0, dstY0, dstX1, dstY1,
>                                       mask, filter);
>     if (mask == 0x0)
>        return;
>
> -   _swrast_BlitFramebuffer(ctx,
> +   _swrast_BlitFramebuffer(ctx, readFb, drawFb,
>                             srcX0, srcY0, srcX1, srcY1,
>                             dstX0, dstY0, dstX1, dstY1,
>                             mask, filter);
> diff --git a/src/mesa/main/blit.c b/src/mesa/main/blit.c
> index 0b70a3d..b97b564 100644
> --- a/src/mesa/main/blit.c
> +++ b/src/mesa/main/blit.c
> @@ -506,7 +506,7 @@ _mesa_BlitFramebuffer(GLint srcX0, GLint srcY0, GLint
> srcX1, GLint srcY1,
>     }
>
>     ASSERT(ctx->Driver.BlitFramebuffer);
> -   ctx->Driver.BlitFramebuffer(ctx,
> +   ctx->Driver.BlitFramebuffer(ctx, ctx->ReadBuffer, ctx->DrawBuffer,
>                                 srcX0, srcY0, srcX1, srcY1,
>                                 dstX0, dstY0, dstX1, dstY1,
>                                 mask, filter);
> diff --git a/src/mesa/main/dd.h b/src/mesa/main/dd.h
> index 6883e18..40f68b4 100644
> --- a/src/mesa/main/dd.h
> +++ b/src/mesa/main/dd.h
> @@ -713,6 +713,8 @@ struct dd_function_table {
>                                 struct gl_framebuffer *fb);
>     /*@}*/
>     void (*BlitFramebuffer)(struct gl_context *ctx,
> +                           struct gl_framebuffer *readFb,
> +                           struct gl_framebuffer *drawFb,
>                             GLint srcX0, GLint srcY0, GLint srcX1, GLint
> srcY1,
>                             GLint dstX0, GLint dstY0, GLint dstX1, GLint
> dstY1,
>                             GLbitfield mask, GLenum filter);
> diff --git a/src/mesa/main/image.c b/src/mesa/main/image.c
> index 9ad97c5..c37900c 100644
> --- a/src/mesa/main/image.c
> +++ b/src/mesa/main/image.c
> @@ -861,19 +861,21 @@ clip_left_or_bottom(GLint *srcX0, GLint *srcX1,
>   */
>  GLboolean
>  _mesa_clip_blit(struct gl_context *ctx,
> +                const struct gl_framebuffer *readFb,
> +                const struct gl_framebuffer *drawFb,
>                  GLint *srcX0, GLint *srcY0, GLint *srcX1, GLint *srcY1,
>                  GLint *dstX0, GLint *dstY0, GLint *dstX1, GLint *dstY1)
>  {
>     const GLint srcXmin = 0;
> -   const GLint srcXmax = ctx->ReadBuffer->Width;
> +   const GLint srcXmax = readFb->Width;
>     const GLint srcYmin = 0;
> -   const GLint srcYmax = ctx->ReadBuffer->Height;
> +   const GLint srcYmax = readFb->Height;
>
>     /* these include scissor bounds */
> -   const GLint dstXmin = ctx->DrawBuffer->_Xmin;
> -   const GLint dstXmax = ctx->DrawBuffer->_Xmax;
> -   const GLint dstYmin = ctx->DrawBuffer->_Ymin;
> -   const GLint dstYmax = ctx->DrawBuffer->_Ymax;
> +   const GLint dstXmin = drawFb->_Xmin;
> +   const GLint dstXmax = drawFb->_Xmax;
> +   const GLint dstYmin = drawFb->_Ymin;
> +   const GLint dstYmax = drawFb->_Ymax;
>
>     /*
>     printf("PreClipX:  src: %d .. %d  dst: %d .. %d\n",
> diff --git a/src/mesa/main/image.h b/src/mesa/main/image.h
> index 44863cc..501586b 100644
> --- a/src/mesa/main/image.h
> +++ b/src/mesa/main/image.h
> @@ -32,6 +32,7 @@
>
>  struct gl_context;
>  struct gl_pixelstore_attrib;
> +struct gl_framebuffer;
>
>  extern void
>  _mesa_swap2_copy(GLushort *dst, GLushort *src, GLuint n);
> @@ -140,6 +141,8 @@ _mesa_clip_to_region(GLint xmin, GLint ymin,
>
>  extern GLboolean
>  _mesa_clip_blit(struct gl_context *ctx,
> +                const struct gl_framebuffer *readFb,
> +                const struct gl_framebuffer *drawFb,
>                  GLint *srcX0, GLint *srcY0, GLint *srcX1, GLint *srcY1,
>                  GLint *dstX0, GLint *dstY0, GLint *dstX1, GLint *dstY1);
>
> diff --git a/src/mesa/state_tracker/st_cb_blit.c
> b/src/mesa/state_tracker/st_cb_blit.c
> index 9c33f4e..bbaedd1 100644
> --- a/src/mesa/state_tracker/st_cb_blit.c
> +++ b/src/mesa/state_tracker/st_cb_blit.c
> @@ -73,6 +73,8 @@ st_adjust_blit_for_msaa_resolve(struct pipe_blit_info
> *blit)
>
>  static void
>  st_BlitFramebuffer(struct gl_context *ctx,
> +                   struct gl_framebuffer *readFB,
> +                   struct gl_framebuffer *drawFB,
>                     GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
>                     GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
>                     GLbitfield mask, GLenum filter)
> @@ -83,8 +85,6 @@ st_BlitFramebuffer(struct gl_context *ctx,
>     const uint pFilter = ((filter == GL_NEAREST)
>                           ? PIPE_TEX_FILTER_NEAREST
>                           : PIPE_TEX_FILTER_LINEAR);
> -   struct gl_framebuffer *readFB = ctx->ReadBuffer;
> -   struct gl_framebuffer *drawFB = ctx->DrawBuffer;
>     struct {
>        GLint srcX0, srcY0, srcX1, srcY1;
>        GLint dstX0, dstY0, dstX1, dstY1;
> @@ -108,7 +108,7 @@ st_BlitFramebuffer(struct gl_context *ctx,
>      *
>      * XXX: This should depend on mask !
>      */
> -   if (!_mesa_clip_blit(ctx,
> +   if (!_mesa_clip_blit(ctx, readFB, drawFB,
>                          &clip.srcX0, &clip.srcY0, &clip.srcX1,
> &clip.srcY1,
>                          &clip.dstX0, &clip.dstY0, &clip.dstX1,
> &clip.dstY1)) {
>        return; /* nothing to draw/blit */
> diff --git a/src/mesa/swrast/s_blit.c b/src/mesa/swrast/s_blit.c
> index e3b45f1..16e5b8c 100644
> --- a/src/mesa/swrast/s_blit.c
> +++ b/src/mesa/swrast/s_blit.c
> @@ -107,14 +107,14 @@ RESAMPLE(resample_row_16, GLuint, 4)
>   */
>  static void
>  blit_nearest(struct gl_context *ctx,
> +             struct gl_framebuffer *readFb,
> +             struct gl_framebuffer *drawFb,
>               GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
>               GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
>               GLbitfield buffer)
>  {
>     struct gl_renderbuffer *readRb, *drawRb = NULL;
>     struct gl_renderbuffer_attachment *readAtt = NULL, *drawAtt = NULL;
> -   struct gl_framebuffer *readFb = ctx->ReadBuffer;
> -   struct gl_framebuffer *drawFb = ctx->DrawBuffer;
>     GLuint numDrawBuffers = 0;
>     GLuint i;
>
> @@ -508,11 +508,11 @@ resample_linear_row_float(GLint srcWidth, GLint
> dstWidth,
>   */
>  static void
>  blit_linear(struct gl_context *ctx,
> +            struct gl_framebuffer *readFb,
> +            struct gl_framebuffer *drawFb,
>              GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
>              GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1)
>  {
> -   struct gl_framebuffer *drawFb = ctx->DrawBuffer;
> -   struct gl_framebuffer *readFb = ctx->ReadBuffer;
>     struct gl_renderbuffer *readRb = readFb->_ColorReadBuffer;
>     struct gl_renderbuffer_attachment *readAtt =
>        &readFb->Attachment[readFb->_ColorReadBufferIndex];
> @@ -733,6 +733,8 @@ fail_no_memory:
>   */
>  void
>  _swrast_BlitFramebuffer(struct gl_context *ctx,
> +                        struct gl_framebuffer *readFb,
> +                        struct gl_framebuffer *drawFb,
>                          GLint srcX0, GLint srcY0, GLint srcX1, GLint
> srcY1,
>                          GLint dstX0, GLint dstY0, GLint dstX1, GLint
> dstY1,
>                          GLbitfield mask, GLenum filter)
> @@ -756,7 +758,7 @@ _swrast_BlitFramebuffer(struct gl_context *ctx,
>     if (!_mesa_check_conditional_render(ctx))
>        return; /* Do not blit */
>
> -   if (!_mesa_clip_blit(ctx, &srcX0, &srcY0, &srcX1, &srcY1,
> +   if (!_mesa_clip_blit(ctx, readFb, drawFb, &srcX0, &srcY0, &srcX1,
> &srcY1,
>                          &dstX0, &dstY0, &dstX1, &dstY1)) {
>        return;
>     }
> @@ -775,33 +777,34 @@ _swrast_BlitFramebuffer(struct gl_context *ctx,
>         dstY0 < dstY1) {
>        for (i = 0; i < 3; i++) {
>           if (mask & buffers[i]) {
> -           if (swrast_fast_copy_pixels(ctx,
> -                                       srcX0, srcY0,
> -                                       srcX1 - srcX0, srcY1 - srcY0,
> -                                       dstX0, dstY0,
> -                                       buffer_enums[i])) {
> -              mask &= ~buffers[i];
> -           }
> -        }
> +            if (swrast_fast_copy_pixels(ctx,
> +                                        readFb, drawFb,
> +                                        srcX0, srcY0,
> +                                        srcX1 - srcX0, srcY1 - srcY0,
> +                                        dstX0, dstY0,
> +                                        buffer_enums[i])) {
> +               mask &= ~buffers[i];
> +            }
> +         }
>        }
>
>        if (!mask)
> -        return;
> +         return;
>     }
>
>     if (filter == GL_NEAREST) {
>        for (i = 0; i < 3; i++) {
> -        if (mask & buffers[i]) {
> -           blit_nearest(ctx,  srcX0, srcY0, srcX1, srcY1,
> -                        dstX0, dstY0, dstX1, dstY1, buffers[i]);
> -        }
> +          if (mask & buffers[i]) {
> +             blit_nearest(ctx, readFb, drawFb, srcX0, srcY0, srcX1, srcY1,
> +                          dstX0, dstY0, dstX1, dstY1, buffers[i]);
> +          }
>        }
>     }
>     else {
>        ASSERT(filter == GL_LINEAR);
>        if (mask & GL_COLOR_BUFFER_BIT) {  /* depth/stencil not allowed */
> -        blit_linear(ctx,  srcX0, srcY0, srcX1, srcY1,
> -                    dstX0, dstY0, dstX1, dstY1);
> +         blit_linear(ctx, readFb, drawFb, srcX0, srcY0, srcX1, srcY1,
> +                     dstX0, dstY0, dstX1, dstY1);
>        }
>     }
>
> diff --git a/src/mesa/swrast/s_copypix.c b/src/mesa/swrast/s_copypix.c
> index d001734..e21c69d 100644
> --- a/src/mesa/swrast/s_copypix.c
> +++ b/src/mesa/swrast/s_copypix.c
> @@ -442,11 +442,11 @@ end:
>   */
>  GLboolean
>  swrast_fast_copy_pixels(struct gl_context *ctx,
> -                       GLint srcX, GLint srcY, GLsizei width, GLsizei
> height,
> -                       GLint dstX, GLint dstY, GLenum type)
> +                        struct gl_framebuffer *srcFb,
> +                        struct gl_framebuffer *dstFb,
> +                        GLint srcX, GLint srcY, GLsizei width, GLsizei
> height,
> +                        GLint dstX, GLint dstY, GLenum type)
>  {
> -   struct gl_framebuffer *srcFb = ctx->ReadBuffer;
> -   struct gl_framebuffer *dstFb = ctx->DrawBuffer;
>     struct gl_renderbuffer *srcRb, *dstRb;
>     GLint row;
>     GLuint pixelBytes, widthInBytes;
> @@ -620,9 +620,9 @@ map_readbuffer(struct gl_context *ctx, GLenum type)
>   * By time we get here, all parameters will have been error-checked.
>   */
>  void
> -_swrast_CopyPixels( struct gl_context *ctx,
> -                   GLint srcx, GLint srcy, GLsizei width, GLsizei height,
> -                   GLint destx, GLint desty, GLenum type )
> +_swrast_CopyPixels(struct gl_context *ctx,
> +                   GLint srcx, GLint srcy, GLsizei width, GLsizei height,
> +                   GLint destx, GLint desty, GLenum type)
>  {
>     SWcontext *swrast = SWRAST_CONTEXT(ctx);
>     struct gl_renderbuffer *rb;
> @@ -634,11 +634,12 @@ _swrast_CopyPixels( struct gl_context *ctx,
>        _swrast_validate_derived( ctx );
>
>     if (!(SWRAST_CONTEXT(ctx)->_RasterMask != 0x0 ||
> -        ctx->Pixel.ZoomX != 1.0F ||
> -        ctx->Pixel.ZoomY != 1.0F ||
> -        ctx->_ImageTransferState) &&
> -       swrast_fast_copy_pixels(ctx, srcx, srcy, width, height, destx,
> desty,
> -                              type)) {
> +       ctx->Pixel.ZoomX != 1.0F ||
> +       ctx->Pixel.ZoomY != 1.0F ||
> +       ctx->_ImageTransferState) &&
> +      swrast_fast_copy_pixels(ctx, ctx->ReadBuffer, ctx->DrawBuffer,
> +                              srcx, srcy, width, height, destx, desty,
> +                              type)) {
>        /* all done */
>        return;
>     }
> diff --git a/src/mesa/swrast/swrast.h b/src/mesa/swrast/swrast.h
> index ac3dbe3..a89dc6c 100644
> --- a/src/mesa/swrast/swrast.h
> +++ b/src/mesa/swrast/swrast.h
> @@ -132,16 +132,18 @@ _swrast_Bitmap( struct gl_context *ctx,
>                 const GLubyte *bitmap );
>
>  extern void
> -_swrast_CopyPixels( struct gl_context *ctx,
> -                   GLint srcx, GLint srcy,
> -                   GLint destx, GLint desty,
> -                   GLsizei width, GLsizei height,
> -                   GLenum type );
> +_swrast_CopyPixels(struct gl_context *ctx,
> +                   GLint srcx, GLint srcy,
> +                   GLint destx, GLint desty,
> +                   GLsizei width, GLsizei height,
> +                   GLenum type);
>

Most of the changes to CopyPixels seem to be whitespace only.  While I'd
like to see that cleaned up, it sould probably be seperate.  I thought for
a second there that CopyPixels had actually changed.


>
>  extern GLboolean
>  swrast_fast_copy_pixels(struct gl_context *ctx,
> -                       GLint srcX, GLint srcY, GLsizei width, GLsizei
> height,
> -                       GLint dstX, GLint dstY, GLenum type);
> +                        struct gl_framebuffer *srcFb,
> +                        struct gl_framebuffer *dstFb,
> +                        GLint srcX, GLint srcY, GLsizei width, GLsizei
> height,
> +                        GLint dstX, GLint dstY, GLenum type);
>
>  extern void
>  _swrast_DrawPixels( struct gl_context *ctx,
> @@ -153,6 +155,8 @@ _swrast_DrawPixels( struct gl_context *ctx,
>
>  extern void
>  _swrast_BlitFramebuffer(struct gl_context *ctx,
> +                        struct gl_framebuffer *readFb,
> +                        struct gl_framebuffer *drawFb,
>                          GLint srcX0, GLint srcY0, GLint srcX1, GLint
> srcY1,
>                          GLint dstX0, GLint dstY0, GLint dstX1, GLint
> dstY1,
>                          GLbitfield mask, GLenum filter);
> --
> 2.1.0
>
> _______________________________________________
> 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/20150130/d5d12d94/attachment-0001.html>


More information about the mesa-dev mailing list