[Mesa-dev] [PATCH] DD: Refactor BlitFramebuffer.
Laura Ekstrand
laura at jlekstrand.net
Mon Feb 2 10:25:01 PST 2015
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 <brianp at 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 <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);
>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20150202/6a3c26d7/attachment-0001.html>
More information about the mesa-dev
mailing list