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

Brian Paul brianp at vmware.com
Mon Feb 2 07:52:46 PST 2015


I'd have put the swrast whitespace changes in a separate commit, but 
it's not a big deal.

Reviewed-by: Brian Paul <brianp at vmware.com>


On 01/30/2015 05:25 PM, Laura Ekstrand 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);
>
>   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);
>



More information about the mesa-dev mailing list