[Mesa-dev] [PATCH 3/4] mesa: Track the TexImage being rendered to in the gl_renderbuffer.

Stéphane Marchesin stephane.marchesin at gmail.com
Tue Jul 9 16:33:28 PDT 2013


On Fri, May 10, 2013 at 11:37 PM, Eric Anholt <eric at anholt.net> wrote:
> We keep having to pass the attachments around with our gl_renderbuffers
> because that's the only way to find what the gl_renderbuffer actually
> refers to.  This is a step toward removing that (though drivers still need
> the Zoffset as well).

Hi Eric,

This change regresses WebGL in Chrome.

Stéphane


> ---
>  src/mesa/drivers/dri/i965/brw_wm_surface_state.c |  2 +-
>  src/mesa/drivers/dri/intel/intel_fbo.c           | 26 ++++++++----------------
>  src/mesa/drivers/dri/intel/intel_fbo.h           |  3 ---
>  src/mesa/drivers/dri/nouveau/nouveau_fbo.c       |  3 +--
>  src/mesa/drivers/dri/radeon/radeon_fbo.c         | 17 +++++++---------
>  src/mesa/main/fbobject.c                         |  8 ++++----
>  src/mesa/main/fbobject.h                         | 19 -----------------
>  src/mesa/main/framebuffer.c                      |  3 +--
>  src/mesa/main/mtypes.h                           |  8 ++++++++
>  src/mesa/main/teximage.c                         |  2 +-
>  src/mesa/state_tracker/st_cb_fbo.c               |  6 +-----
>  src/mesa/swrast/s_texrender.c                    |  2 +-
>  12 files changed, 34 insertions(+), 65 deletions(-)
>
> diff --git a/src/mesa/drivers/dri/i965/brw_wm_surface_state.c b/src/mesa/drivers/dri/i965/brw_wm_surface_state.c
> index b067f6d..1e8c582 100644
> --- a/src/mesa/drivers/dri/i965/brw_wm_surface_state.c
> +++ b/src/mesa/drivers/dri/i965/brw_wm_surface_state.c
> @@ -1328,7 +1328,7 @@ brw_update_renderbuffer_surface(struct brw_context *brw,
>     /* _NEW_BUFFERS */
>     gl_format rb_format = _mesa_get_render_format(ctx, intel_rb_format(irb));
>
> -   if (irb->tex_image && !brw->has_surface_tile_offset) {
> +   if (rb->TexImage && !brw->has_surface_tile_offset) {
>        intel_renderbuffer_tile_offsets(irb, &tile_x, &tile_y);
>
>        if (tile_x != 0 || tile_y != 0) {
> diff --git a/src/mesa/drivers/dri/intel/intel_fbo.c b/src/mesa/drivers/dri/intel/intel_fbo.c
> index 6b30262..bf8e48d 100644
> --- a/src/mesa/drivers/dri/intel/intel_fbo.c
> +++ b/src/mesa/drivers/dri/intel/intel_fbo.c
> @@ -572,8 +572,9 @@ intel_render_texture(struct gl_context * ctx,
>                       struct gl_renderbuffer_attachment *att)
>  {
>     struct intel_context *intel = intel_context(ctx);
> -   struct gl_texture_image *image = _mesa_get_attachment_teximage(att);
> -   struct intel_renderbuffer *irb = intel_renderbuffer(att->Renderbuffer);
> +   struct gl_renderbuffer *rb = att->Renderbuffer;
> +   struct intel_renderbuffer *irb = intel_renderbuffer(rb);
> +   struct gl_texture_image *image = rb->TexImage;
>     struct intel_texture_image *intel_image = intel_texture_image(image);
>     struct intel_mipmap_tree *mt = intel_image->mt;
>     int layer;
> @@ -602,12 +603,10 @@ intel_render_texture(struct gl_context * ctx,
>         return;
>     }
>
> -   irb->tex_image = image;
> -
>     DBG("Begin render %s texture tex=%u w=%d h=%d refcount=%d\n",
>         _mesa_get_format_name(image->TexFormat),
>         att->Texture->Name, image->Width, image->Height,
> -       irb->Base.Base.RefCount);
> +       rb->RefCount);
>
>     /* update drawing region, etc */
>     intel_draw_buffer(ctx);
> @@ -623,13 +622,9 @@ intel_finish_render_texture(struct gl_context * ctx,
>  {
>     struct intel_context *intel = intel_context(ctx);
>     struct gl_renderbuffer *rb = att->Renderbuffer;
> -   struct intel_renderbuffer *irb = intel_renderbuffer(rb);
>
>     DBG("Finish render %s texture\n", _mesa_get_format_name(rb->Format));
>
> -   if (irb)
> -      irb->tex_image = NULL;
> -
>     /* Since we've (probably) rendered to the texture and will (likely) use
>      * it in the texture domain later on in this batchbuffer, flush the
>      * batch.  Once again, we wish for a domain tracker in libdrm to cover
> @@ -734,10 +729,7 @@ intel_validate_framebuffer(struct gl_context *ctx, struct gl_framebuffer *fb)
>        }
>
>        if (fb->Attachment[i].Type == GL_TEXTURE) {
> -        const struct gl_texture_image *img =
> -           _mesa_get_attachment_teximage_const(&fb->Attachment[i]);
> -
> -        if (img->Border) {
> +        if (rb->TexImage->Border) {
>             fbo_incomplete(fb, "FBO incomplete: texture with border\n");
>             continue;
>          }
> @@ -945,14 +937,14 @@ intel_renderbuffer_move_to_temp(struct intel_context *intel,
>                                  struct intel_renderbuffer *irb,
>                                  bool invalidate)
>  {
> -   struct intel_texture_image *intel_image =
> -      intel_texture_image(irb->tex_image);
> +   struct gl_renderbuffer *rb =&irb->Base.Base;
> +   struct intel_texture_image *intel_image = intel_texture_image(rb->TexImage);
>     struct intel_mipmap_tree *new_mt;
>     int width, height, depth;
>
> -   intel_miptree_get_dimensions_for_image(irb->tex_image, &width, &height, &depth);
> +   intel_miptree_get_dimensions_for_image(rb->TexImage, &width, &height, &depth);
>
> -   new_mt = intel_miptree_create(intel, irb->tex_image->TexObject->Target,
> +   new_mt = intel_miptree_create(intel, rb->TexImage->TexObject->Target,
>                                   intel_image->base.Base.TexFormat,
>                                   intel_image->base.Base.Level,
>                                   intel_image->base.Base.Level,
> diff --git a/src/mesa/drivers/dri/intel/intel_fbo.h b/src/mesa/drivers/dri/intel/intel_fbo.h
> index 0e0806b..aa52b97 100644
> --- a/src/mesa/drivers/dri/intel/intel_fbo.h
> +++ b/src/mesa/drivers/dri/intel/intel_fbo.h
> @@ -52,9 +52,6 @@ struct intel_renderbuffer
>     struct intel_mipmap_tree *mt; /**< The renderbuffer storage. */
>     drm_intel_bo *map_bo;
>
> -   /* Current texture image this renderbuffer is attached to. */
> -   struct gl_texture_image *tex_image;
> -
>     /**
>      * \name Miptree view
>      * \{
> diff --git a/src/mesa/drivers/dri/nouveau/nouveau_fbo.c b/src/mesa/drivers/dri/nouveau/nouveau_fbo.c
> index a692051..f997ac8 100644
> --- a/src/mesa/drivers/dri/nouveau/nouveau_fbo.c
> +++ b/src/mesa/drivers/dri/nouveau/nouveau_fbo.c
> @@ -252,8 +252,7 @@ nouveau_render_texture(struct gl_context *ctx, struct gl_framebuffer *fb,
>                        struct gl_renderbuffer_attachment *att)
>  {
>         struct gl_renderbuffer *rb = att->Renderbuffer;
> -       struct gl_texture_image *ti =
> -               att->Texture->Image[att->CubeMapFace][att->TextureLevel];
> +       struct gl_texture_image *ti = rb->TexImage;
>
>         /* Update the renderbuffer fields from the texture. */
>         nouveau_surface_ref(&to_nouveau_teximage(ti)->surface,
> diff --git a/src/mesa/drivers/dri/radeon/radeon_fbo.c b/src/mesa/drivers/dri/radeon/radeon_fbo.c
> index c43f527..1fdcf05 100644
> --- a/src/mesa/drivers/dri/radeon/radeon_fbo.c
> +++ b/src/mesa/drivers/dri/radeon/radeon_fbo.c
> @@ -787,9 +787,9 @@ radeon_render_texture(struct gl_context * ctx,
>                       struct gl_framebuffer *fb,
>                       struct gl_renderbuffer_attachment *att)
>  {
> -   struct gl_texture_image *newImage
> -      = att->Texture->Image[att->CubeMapFace][att->TextureLevel];
> -   struct radeon_renderbuffer *rrb = radeon_renderbuffer(att->Renderbuffer);
> +   struct gl_renderbuffer *rb = att->Renderbuffer;
> +   struct gl_texture_image *newImage = rb->TexImage;
> +   struct radeon_renderbuffer *rrb = radeon_renderbuffer(rb);
>     radeon_texture_image *radeon_image;
>     GLuint imageOffset;
>
> @@ -818,7 +818,7 @@ radeon_render_texture(struct gl_context * ctx,
>     DBG("Begin render texture tid %lx tex=%u w=%d h=%d refcount=%d\n",
>         _glthread_GetID(),
>         att->Texture->Name, newImage->Width, newImage->Height,
> -       rrb->base.Base.RefCount);
> +       rb->RefCount);
>
>     /* point the renderbufer's region to the texture image region */
>     if (rrb->bo != radeon_image->mt->bo) {
> @@ -853,11 +853,8 @@ static void
>  radeon_finish_render_texture(struct gl_context * ctx,
>                              struct gl_renderbuffer_attachment *att)
>  {
> -    struct gl_texture_object *tex_obj = att->Texture;
> -    radeon_texture_image *radeon_image = NULL;
> -
> -    if (tex_obj)
> -        radeon_image = (radeon_texture_image *)_mesa_get_attachment_teximage(att);
> +    struct gl_texture_image *image = att->Renderbuffer->TexImage;
> +    radeon_texture_image *radeon_image = (radeon_texture_image *)image;
>
>      if (radeon_image)
>         radeon_image->used_as_render_target = GL_FALSE;
> @@ -883,7 +880,7 @@ radeon_validate_framebuffer(struct gl_context *ctx, struct gl_framebuffer *fb)
>                 }
>
>                 if (att->Type == GL_TEXTURE) {
> -                       mesa_format = att->Texture->Image[att->CubeMapFace][att->TextureLevel]->TexFormat;
> +                       mesa_format = att->Renderbuffer->TexImage->TexFormat;
>                 } else {
>                         /* All renderbuffer formats are renderable, but not sampable */
>                         continue;
> diff --git a/src/mesa/main/fbobject.c b/src/mesa/main/fbobject.c
> index f00d11a..070fb8c 100644
> --- a/src/mesa/main/fbobject.c
> +++ b/src/mesa/main/fbobject.c
> @@ -363,7 +363,7 @@ _mesa_update_texture_renderbuffer(struct gl_context *ctx,
>     struct gl_texture_image *texImage;
>     struct gl_renderbuffer *rb;
>
> -   texImage = _mesa_get_attachment_teximage(att);
> +   texImage = att->Texture->Image[att->CubeMapFace][att->TextureLevel];
>     if (!texImage)
>        return;
>
> @@ -390,6 +390,7 @@ _mesa_update_texture_renderbuffer(struct gl_context *ctx,
>     rb->Width = texImage->Width2;
>     rb->Height = texImage->Height2;
>     rb->NumSamples = texImage->NumSamples;
> +   rb->TexImage = texImage;
>
>     ctx->Driver.RenderTexture(ctx, fb, att);
>  }
> @@ -889,8 +890,7 @@ _mesa_test_framebuffer_completeness(struct gl_context *ctx,
>        /* get width, height, format of the renderbuffer/texture
>         */
>        if (att->Type == GL_TEXTURE) {
> -         const struct gl_texture_image *texImg =
> -            _mesa_get_attachment_teximage(att);
> +         const struct gl_texture_image *texImg = att->Renderbuffer->TexImage;
>           minWidth = MIN2(minWidth, texImg->Width);
>           maxWidth = MAX2(maxWidth, texImg->Width);
>           minHeight = MIN2(minHeight, texImg->Height);
> @@ -1862,7 +1862,7 @@ check_begin_texture_render(struct gl_context *ctx, struct gl_framebuffer *fb)
>
>     for (i = 0; i < BUFFER_COUNT; i++) {
>        struct gl_renderbuffer_attachment *att = fb->Attachment + i;
> -      if (att->Texture && _mesa_get_attachment_teximage(att)) {
> +      if (att->Texture && att->Renderbuffer->TexImage) {
>           ctx->Driver.RenderTexture(ctx, fb, att);
>        }
>     }
> diff --git a/src/mesa/main/fbobject.h b/src/mesa/main/fbobject.h
> index bfab6e1..dfd795a 100644
> --- a/src/mesa/main/fbobject.h
> +++ b/src/mesa/main/fbobject.h
> @@ -71,25 +71,6 @@ extern struct gl_renderbuffer_attachment *
>  _mesa_get_attachment(struct gl_context *ctx, struct gl_framebuffer *fb,
>                       GLenum attachment);
>
> -
> -/** Return the texture image for a renderbuffer attachment */
> -static inline struct gl_texture_image *
> -_mesa_get_attachment_teximage(struct gl_renderbuffer_attachment *att)
> -{
> -   assert(att->Type == GL_TEXTURE);
> -   return att->Texture->Image[att->CubeMapFace][att->TextureLevel];
> -}
> -
> -
> -/** Return the (const) texture image for a renderbuffer attachment */
> -static inline const struct gl_texture_image *
> -_mesa_get_attachment_teximage_const(const struct gl_renderbuffer_attachment *att)
> -{
> -   assert(att->Type == GL_TEXTURE);
> -   return att->Texture->Image[att->CubeMapFace][att->TextureLevel];
> -}
> -
> -
>  extern void
>  _mesa_remove_attachment(struct gl_context *ctx,
>                          struct gl_renderbuffer_attachment *att);
> diff --git a/src/mesa/main/framebuffer.c b/src/mesa/main/framebuffer.c
> index 911bb92..af3c595 100644
> --- a/src/mesa/main/framebuffer.c
> +++ b/src/mesa/main/framebuffer.c
> @@ -962,8 +962,7 @@ _mesa_print_framebuffer(const struct gl_framebuffer *fb)
>     for (i = 0; i < BUFFER_COUNT; i++) {
>        const struct gl_renderbuffer_attachment *att = &fb->Attachment[i];
>        if (att->Type == GL_TEXTURE) {
> -         const struct gl_texture_image *texImage =
> -            _mesa_get_attachment_teximage_const(att);
> +         const struct gl_texture_image *texImage = att->Renderbuffer->TexImage;
>           fprintf(stderr,
>                   "  %2d: Texture %u, level %u, face %u, slice %u, complete %d\n",
>                   i, att->Texture->Name, att->TextureLevel, att->CubeMapFace,
> diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
> index cd29614..1319a5f 100644
> --- a/src/mesa/main/mtypes.h
> +++ b/src/mesa/main/mtypes.h
> @@ -2583,6 +2583,14 @@ struct gl_renderbuffer
>     GLenum _BaseFormat;    /**< Either GL_RGB, GL_RGBA, GL_DEPTH_COMPONENT or
>                                 GL_STENCIL_INDEX. */
>     gl_format Format;      /**< The actual renderbuffer memory format */
> +   /**
> +    * Pointer to the texture image if this renderbuffer wraps a texture,
> +    * otherwise NULL.
> +    *
> +    * Note that the reference on the gl_texture_object containing this
> +    * TexImage is held by the gl_renderbuffer_attachment.
> +    */
> +   struct gl_texture_image *TexImage;
>
>     /** Delete this renderbuffer */
>     void (*Delete)(struct gl_context *ctx, struct gl_renderbuffer *rb);
> diff --git a/src/mesa/main/teximage.c b/src/mesa/main/teximage.c
> index 26fa4c3..d07f6e9 100644
> --- a/src/mesa/main/teximage.c
> +++ b/src/mesa/main/teximage.c
> @@ -2759,8 +2759,8 @@ check_rtt_cb(GLuint key, void *data, void *userData)
>               att->Texture == texObj &&
>               att->TextureLevel == level &&
>               att->CubeMapFace == face) {
> -            ASSERT(_mesa_get_attachment_teximage(att));
>              _mesa_update_texture_renderbuffer(ctx, ctx->DrawBuffer, att);
> +            ASSERT(att->Renderbuffer->TexImage);
>              /* Mark fb status as indeterminate to force re-validation */
>              fb->_Status = 0;
>           }
> diff --git a/src/mesa/state_tracker/st_cb_fbo.c b/src/mesa/state_tracker/st_cb_fbo.c
> index aa245d3..db4728b 100644
> --- a/src/mesa/state_tracker/st_cb_fbo.c
> +++ b/src/mesa/state_tracker/st_cb_fbo.c
> @@ -394,7 +394,6 @@ st_render_texture(struct gl_context *ctx,
>     struct st_renderbuffer *strb = st_renderbuffer(rb);
>     struct pipe_resource *pt;
>     struct st_texture_object *stObj;
> -   const struct gl_texture_image *texImage;
>     struct pipe_surface surf_tmpl;
>
>     if (!st_finalize_texture(ctx, pipe, att->Texture))
> @@ -403,9 +402,6 @@ st_render_texture(struct gl_context *ctx,
>     pt = st_get_texobj_resource(att->Texture);
>     assert(pt);
>
> -   /* get pointer to texture image we're rendeing to */
> -   texImage = _mesa_get_attachment_teximage(att);
> -
>     /* get the texture for the texture object */
>     stObj = st_texture_object(att->Texture);
>
> @@ -503,7 +499,7 @@ st_validate_attachment(struct gl_context *ctx,
>        return GL_FALSE;
>
>     format = stObj->pt->format;
> -   texFormat = _mesa_get_attachment_teximage_const(att)->TexFormat;
> +   texFormat = att->Renderbuffer->TexImage->TexFormat;
>
>     /* If the encoding is sRGB and sRGB rendering cannot be enabled,
>      * check for linear format support instead.
> diff --git a/src/mesa/swrast/s_texrender.c b/src/mesa/swrast/s_texrender.c
> index 00b3ca5..643f2bc 100644
> --- a/src/mesa/swrast/s_texrender.c
> +++ b/src/mesa/swrast/s_texrender.c
> @@ -38,7 +38,7 @@ update_wrapper(struct gl_context *ctx, struct gl_renderbuffer_attachment *att)
>
>     (void) ctx;
>
> -   swImage = swrast_texture_image(_mesa_get_attachment_teximage(att));
> +   swImage = swrast_texture_image(rb->TexImage);
>     assert(swImage);
>
>     format = swImage->Base.TexFormat;
> --
> 1.8.3.rc0
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list