[Mesa-dev] [PATCH 09/13] meta: Refactor binding of renderbuffer as texture image
Ian Romanick
idr at freedesktop.org
Mon May 12 10:13:31 PDT 2014
Reviewed-by: Ian Romanick <ian.d.romanick at intel.com>
On 05/09/2014 01:28 AM, Topi Pohjolainen wrote:
> Signed-off-by: Topi Pohjolainen <topi.pohjolainen at intel.com>
> ---
> src/mesa/drivers/common/meta.h | 7 ++++
> src/mesa/drivers/common/meta_blit.c | 70 +++++++++++++++++++++----------------
> 2 files changed, 47 insertions(+), 30 deletions(-)
>
> diff --git a/src/mesa/drivers/common/meta.h b/src/mesa/drivers/common/meta.h
> index fdd8714..70b87a1 100644
> --- a/src/mesa/drivers/common/meta.h
> +++ b/src/mesa/drivers/common/meta.h
> @@ -395,6 +395,13 @@ _mesa_meta_end(struct gl_context *ctx);
> extern GLboolean
> _mesa_meta_in_progress(struct gl_context *ctx);
>
> +extern GLboolean
> +_mesa_meta_bind_rb_as_tex_image(struct gl_context *ctx,
> + struct gl_renderbuffer *rb,
> + GLuint *tex,
> + struct gl_texture_object **texObj,
> + GLenum *target);
> +
> extern void
> _mesa_meta_BlitFramebuffer(struct gl_context *ctx,
> GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
> diff --git a/src/mesa/drivers/common/meta_blit.c b/src/mesa/drivers/common/meta_blit.c
> index 14ecf8f..9c8231b 100644
> --- a/src/mesa/drivers/common/meta_blit.c
> +++ b/src/mesa/drivers/common/meta_blit.c
> @@ -392,38 +392,16 @@ blitframebuffer_texture(struct gl_context *ctx,
> texObj = readAtt->Texture;
> target = texObj->Target;
> } else if (!readAtt->Texture && ctx->Driver.BindRenderbufferTexImage) {
> - /* Otherwise, we need the driver to be able to bind a renderbuffer as
> - * a texture image.
> - */
> - struct gl_texture_image *texImage;
> -
> - if (rb->NumSamples > 1)
> - target = GL_TEXTURE_2D_MULTISAMPLE;
> - else
> - target = GL_TEXTURE_2D;
> -
> - _mesa_GenTextures(1, &tempTex);
> - _mesa_BindTexture(target, tempTex);
> - srcLevel = 0;
> - texObj = _mesa_lookup_texture(ctx, tempTex);
> - texImage = _mesa_get_tex_image(ctx, texObj, target, srcLevel);
> -
> - if (!ctx->Driver.BindRenderbufferTexImage(ctx, rb, texImage)) {
> - _mesa_DeleteTextures(1, &tempTex);
> + if (!_mesa_meta_bind_rb_as_tex_image(ctx, rb,
> + &tempTex, &texObj, &target))
> return false;
> - } else {
> - if (ctx->Driver.FinishRenderTexture &&
> - !rb->NeedsFinishRenderTexture) {
> - rb->NeedsFinishRenderTexture = true;
> - ctx->Driver.FinishRenderTexture(ctx, rb);
> - }
>
> - if (_mesa_is_winsys_fbo(readFb)) {
> - GLint temp = srcY0;
> - srcY0 = rb->Height - srcY1;
> - srcY1 = rb->Height - temp;
> - flipY = -flipY;
> - }
> + srcLevel = 0;
> + if (_mesa_is_winsys_fbo(readFb)) {
> + GLint temp = srcY0;
> + srcY0 = rb->Height - srcY1;
> + srcY1 = rb->Height - temp;
> + flipY = -flipY;
> }
> } else {
> GLenum tex_base_format;
> @@ -603,6 +581,38 @@ blitframebuffer_texture(struct gl_context *ctx,
> return true;
> }
>
> +GLboolean
> +_mesa_meta_bind_rb_as_tex_image(struct gl_context *ctx,
> + struct gl_renderbuffer *rb,
> + GLuint *tex,
> + struct gl_texture_object **texObj,
> + GLenum *target)
> +{
> + struct gl_texture_image *texImage;
> +
> + if (rb->NumSamples > 1)
> + *target = GL_TEXTURE_2D_MULTISAMPLE;
> + else
> + *target = GL_TEXTURE_2D;
> +
> + _mesa_GenTextures(1, tex);
> + _mesa_BindTexture(*target, *tex);
> + *texObj = _mesa_lookup_texture(ctx, *tex);
> + texImage = _mesa_get_tex_image(ctx, *texObj, *target, 0);
> +
> + if (!ctx->Driver.BindRenderbufferTexImage(ctx, rb, texImage)) {
> + _mesa_DeleteTextures(1, tex);
> + return false;
> + }
> +
> + if (ctx->Driver.FinishRenderTexture && !rb->NeedsFinishRenderTexture) {
> + rb->NeedsFinishRenderTexture = true;
> + ctx->Driver.FinishRenderTexture(ctx, rb);
> + }
> +
> + return true;
> +}
> +
> /**
> * Meta implementation of ctx->Driver.BlitFramebuffer() in terms
> * of texture mapping and polygon rendering.
>
More information about the mesa-dev
mailing list