diff options
author | Kenneth Graunke <[email protected]> | 2014-05-18 22:16:01 -0700 |
---|---|---|
committer | Kenneth Graunke <[email protected]> | 2014-05-19 17:18:55 -0700 |
commit | 54540ea691e926b36a81a9b1e27b8f035995d07d (patch) | |
tree | e47e4e36d08484d82377ecf0ac306582ec0d03b5 /src/mesa/drivers/common/meta_blit.c | |
parent | d89ce333ccc585ef88fe10e61de17b885e03eab4 (diff) |
meta: Split _swrast_BlitFramebuffer out of the meta blit path.
Separating the software fallbacks from the rest of the meta path (which
is usually hardware accelerated) gives callers better control over their
blitting options.
For example, i965 might want to try meta blit, hardware blits, then
swrast as a last resort. Splitting it makes that possible.
This updates all callers to maintain the existing behavior (even in the
few cases where it isn't desirable behavior - later patches can change
that).
Signed-off-by: Kenneth Graunke <[email protected]>
Reviewed-by: Ian Romanick <[email protected]>
Reviewed-by: Chris Forbes <[email protected]>
Cc: "10.2" <[email protected]>
Diffstat (limited to 'src/mesa/drivers/common/meta_blit.c')
-rw-r--r-- | src/mesa/drivers/common/meta_blit.c | 33 |
1 files changed, 25 insertions, 8 deletions
diff --git a/src/mesa/drivers/common/meta_blit.c b/src/mesa/drivers/common/meta_blit.c index bd6118b9455..e10a181d68b 100644 --- a/src/mesa/drivers/common/meta_blit.c +++ b/src/mesa/drivers/common/meta_blit.c @@ -644,7 +644,7 @@ _mesa_meta_setup_sampler(struct gl_context *ctx, * Meta implementation of ctx->Driver.BlitFramebuffer() in terms * of texture mapping and polygon rendering. */ -void +GLbitfield _mesa_meta_BlitFramebuffer(struct gl_context *ctx, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, @@ -669,7 +669,7 @@ _mesa_meta_BlitFramebuffer(struct gl_context *ctx, /* Multisample texture blit support requires texture multisample. */ if (ctx->ReadBuffer->Visual.samples > 0 && !ctx->Extensions.ARB_texture_multisample) { - goto fallback; + return mask; } /* Clip a copy of the blit coordinates. If these differ from the input @@ -678,7 +678,7 @@ _mesa_meta_BlitFramebuffer(struct gl_context *ctx, if (!_mesa_clip_blit(ctx, &clip.srcX0, &clip.srcY0, &clip.srcX1, &clip.srcY1, &clip.dstX0, &clip.dstY0, &clip.dstX1, &clip.dstY1)) { /* clipped/scissored everything away */ - return; + return 0; } /* Only scissor affects blit, but we're doing to set a custom scissor if @@ -723,11 +723,7 @@ _mesa_meta_BlitFramebuffer(struct gl_context *ctx, _mesa_meta_end(ctx); -fallback: - if (mask) { - _swrast_BlitFramebuffer(ctx, srcX0, srcY0, srcX1, srcY1, - dstX0, dstY0, dstX1, dstY1, mask, filter); - } + return mask; } void @@ -745,3 +741,24 @@ _mesa_meta_glsl_blit_cleanup(struct blit_state *blit) _mesa_DeleteTextures(1, &blit->depthTex.TexObj); blit->depthTex.TexObj = 0; } + +void +_mesa_meta_and_swrast_BlitFramebuffer(struct gl_context *ctx, + 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, + srcX0, srcY0, srcX1, srcY1, + dstX0, dstY0, dstX1, dstY1, + mask, filter); + if (mask == 0x0) + return; + + _swrast_BlitFramebuffer(ctx, + srcX0, srcY0, srcX1, srcY1, + dstX0, dstY0, dstX1, dstY1, + mask, filter); +} |