From: Brian Paul Date: Mon, 10 Aug 2009 21:05:53 +0000 (-0600) Subject: mesa: for meta blit, check max texture size, use glCopyTexSubImage2D() when possible X-Git-Tag: 062012170305~17108 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=2ad10c966c87b2efc956bcc58aaedc60f0a5c6a4;p=profile%2Fivi%2Fmesa.git mesa: for meta blit, check max texture size, use glCopyTexSubImage2D() when possible --- diff --git a/src/mesa/drivers/common/meta.c b/src/mesa/drivers/common/meta.c index 7a3969d..a7eba2e 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; }