I broke out some of the whitespace: http://cgit.freedesktop.org/~ldeks/mesa/commit/?h=adsa-framebuffers&id=ebe159fa9a6b1d98d63862bf89044028e67a4377 .
Here is the (hopefully cleaner) BlitFramebuffers refactor: http://cgit.freedesktop.org/~ldeks/mesa/commit/?h=adsa-framebuffers&id=fc85665eaa9aff824051333848540958dd07cbd0 Laura On Mon, Feb 2, 2015 at 7:52 AM, Brian Paul <bri...@vmware.com> wrote: > I'd have put the swrast whitespace changes in a separate commit, but it's > not a big deal. > > Reviewed-by: Brian Paul <bri...@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); >> >> >
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev