diff options
author | Brian Paul <[email protected]> | 2009-08-10 15:05:53 -0600 |
---|---|---|
committer | Brian Paul <[email protected]> | 2009-08-10 15:09:38 -0600 |
commit | 2ad10c966c87b2efc956bcc58aaedc60f0a5c6a4 (patch) | |
tree | 5a67ae209264e331d978794374a045d491b5ef7b /src/mesa | |
parent | c16fa388d3f1b941fbee2909a92b6fea10ef4bfe (diff) |
mesa: for meta blit, check max texture size, use glCopyTexSubImage2D() when possible
Diffstat (limited to 'src/mesa')
-rw-r--r-- | src/mesa/drivers/common/meta.c | 29 |
1 files changed, 27 insertions, 2 deletions
diff --git a/src/mesa/drivers/common/meta.c b/src/mesa/drivers/common/meta.c index 7a3969d9aa8..a7eba2e75ca 100644 --- a/src/mesa/drivers/common/meta.c +++ b/src/mesa/drivers/common/meta.c @@ -137,6 +137,8 @@ struct save_state struct blit_state { GLuint TexObj; + GLsizei TexWidth, TexHeight; + GLenum TexType; GLuint ArrayObj; GLuint VBO; GLfloat verts[4][4]; /** four verts of X,Y,S,T */ @@ -630,6 +632,15 @@ _mesa_meta_blit_framebuffer(GLcontext *ctx, ASSERT(ctx->Extensions.NV_texture_rectangle); + if (srcW > ctx->Const.MaxTextureRectSize || + srcH > ctx->Const.MaxTextureRectSize) { + /* XXX avoid this fallback */ + _swrast_BlitFramebuffer(ctx, srcX0, srcY0, srcX1, srcY1, + dstX0, dstY0, dstX1, dstY1, mask, filter); + return; + } + + if (srcFlipX) { GLint tmp = dstX0; dstX0 = dstX1; @@ -712,8 +723,22 @@ _mesa_meta_blit_framebuffer(GLcontext *ctx, /* copy framebuffer image to texture */ if (mask & GL_COLOR_BUFFER_BIT) { - _mesa_CopyTexImage2D(GL_TEXTURE_RECTANGLE, 0, GL_RGBA, - srcX, srcY, srcW, srcH, 0); + if (blit->TexWidth == srcW && + blit->TexHeight == srcH && + blit->TexType == GL_RGBA) { + /* replace existing tex image */ + _mesa_CopyTexSubImage2D(GL_TEXTURE_RECTANGLE, 0, + 0, 0, srcX, srcY, srcW, srcH); + } + else { + /* create new tex image */ + _mesa_CopyTexImage2D(GL_TEXTURE_RECTANGLE, 0, GL_RGBA, + srcX, srcY, srcW, srcH, 0); + blit->TexWidth = srcW; + blit->TexHeight = srcH; + blit->TexType = GL_RGBA; + } + mask &= ~GL_COLOR_BUFFER_BIT; } |