[Mesa-dev] [PATCH] st/dri: do not create a new context for msaa copy

Marek Olšák maraeo at gmail.com
Mon Sep 9 05:13:51 PDT 2013


Reviewed-by: Marek Olšák <marek.olsak at amd.com>

Marek

On Mon, Sep 9, 2013 at 1:02 PM, Maarten Lankhorst
<maarten.lankhorst at canonical.com> wrote:
> Commit b77316ad7594f
>     st/dri: always copy new DRI front and back buffers to corresponding MSAA buffers
>
> introduced creating a pipe_context for every call to validate, which is not required
> because the callers have a context anyway.
>
> Only exception is egl_g3d_create_pbuffer_from_client_buffer, can someone test if it
> still works with NULL passed as context for validate? From examining the code I
> believe it does, but I didn't thoroughly test it.
>
> Signed-off-by: Maarten Lankhorst <maarten.lankhorst at canonical.com>
> Cc: 9.2 <mesa-stable at lists.freedesktop.org>
> ---
> diff --git a/src/gallium/include/state_tracker/st_api.h b/src/gallium/include/state_tracker/st_api.h
> index 3ecd12e..9dcb76f 100644
> --- a/src/gallium/include/state_tracker/st_api.h
> +++ b/src/gallium/include/state_tracker/st_api.h
> @@ -342,7 +342,8 @@ struct st_framebuffer_iface
>      * the last call might be destroyed.  This behavior might change in the
>      * future.
>      */
> -   boolean (*validate)(struct st_framebuffer_iface *stfbi,
> +   boolean (*validate)(struct st_context_iface *stctx,
> +                       struct st_framebuffer_iface *stfbi,
>                         const enum st_attachment_type *statts,
>                         unsigned count,
>                         struct pipe_resource **out);
> diff --git a/src/gallium/state_trackers/dri/common/dri_drawable.c b/src/gallium/state_trackers/dri/common/dri_drawable.c
> index 18d8d89..ddf9400 100644
> --- a/src/gallium/state_trackers/dri/common/dri_drawable.c
> +++ b/src/gallium/state_trackers/dri/common/dri_drawable.c
> @@ -42,11 +42,13 @@ static void
>  swap_fences_unref(struct dri_drawable *draw);
>
>  static boolean
> -dri_st_framebuffer_validate(struct st_framebuffer_iface *stfbi,
> +dri_st_framebuffer_validate(struct st_context_iface *stctx,
> +                            struct st_framebuffer_iface *stfbi,
>                              const enum st_attachment_type *statts,
>                              unsigned count,
>                              struct pipe_resource **out)
>  {
> +   struct dri_context *ctx = (struct dri_context *)stctx->st_manager_private;
>     struct dri_drawable *drawable =
>        (struct dri_drawable *) stfbi->st_manager_private;
>     struct dri_screen *screen = dri_screen(drawable->sPriv);
> @@ -78,7 +80,7 @@ dri_st_framebuffer_validate(struct st_framebuffer_iface *stfbi,
>           if (new_stamp && drawable->update_drawable_info)
>              drawable->update_drawable_info(drawable);
>
> -         drawable->allocate_textures(drawable, statts, count);
> +         drawable->allocate_textures(ctx, drawable, statts, count);
>
>           /* add existing textures */
>           for (i = 0; i < ST_ATTACHMENT_COUNT; i++) {
> @@ -183,7 +185,8 @@ dri_destroy_buffer(__DRIdrawable * dPriv)
>   * exist.  Used by the TFP extension.
>   */
>  static void
> -dri_drawable_validate_att(struct dri_drawable *drawable,
> +dri_drawable_validate_att(struct dri_context *ctx,
> +                          struct dri_drawable *drawable,
>                            enum st_attachment_type statt)
>  {
>     enum st_attachment_type statts[ST_ATTACHMENT_COUNT];
> @@ -203,7 +206,7 @@ dri_drawable_validate_att(struct dri_drawable *drawable,
>
>     drawable->texture_stamp = drawable->dPriv->lastStamp - 1;
>
> -   drawable->base.validate(&drawable->base, statts, count, NULL);
> +   drawable->base.validate(ctx->st, &drawable->base, statts, count, NULL);
>  }
>
>  /**
> @@ -217,7 +220,7 @@ dri_set_tex_buffer2(__DRIcontext *pDRICtx, GLint target,
>     struct dri_drawable *drawable = dri_drawable(dPriv);
>     struct pipe_resource *pt;
>
> -   dri_drawable_validate_att(drawable, ST_ATTACHMENT_FRONT_LEFT);
> +   dri_drawable_validate_att(ctx, drawable, ST_ATTACHMENT_FRONT_LEFT);
>
>     /* Use the pipe resource associated with the X drawable */
>     pt = drawable->textures[ST_ATTACHMENT_FRONT_LEFT];
> diff --git a/src/gallium/state_trackers/dri/common/dri_drawable.h b/src/gallium/state_trackers/dri/common/dri_drawable.h
> index 50e5cc4..c514218 100644
> --- a/src/gallium/state_trackers/dri/common/dri_drawable.h
> +++ b/src/gallium/state_trackers/dri/common/dri_drawable.h
> @@ -71,7 +71,8 @@ struct dri_drawable
>     struct pipe_surface *drisw_surface;
>
>     /* hooks filled in by dri2 & drisw */
> -   void (*allocate_textures)(struct dri_drawable *drawable,
> +   void (*allocate_textures)(struct dri_context *ctx,
> +                             struct dri_drawable *drawable,
>                               const enum st_attachment_type *statts,
>                               unsigned count);
>
> diff --git a/src/gallium/state_trackers/dri/drm/dri2.c b/src/gallium/state_trackers/dri/drm/dri2.c
> index 1dcc1f7..036fe32 100644
> --- a/src/gallium/state_trackers/dri/drm/dri2.c
> +++ b/src/gallium/state_trackers/dri/drm/dri2.c
> @@ -169,7 +169,8 @@ dri2_drawable_get_buffers(struct dri_drawable *drawable,
>   * Process __DRIbuffer and convert them into pipe_resources.
>   */
>  static void
> -dri2_drawable_process_buffers(struct dri_drawable *drawable,
> +dri2_drawable_process_buffers(struct dri_context *ctx,
> +                              struct dri_drawable *drawable,
>                                __DRIbuffer *buffers, unsigned buffer_count,
>                                const enum st_attachment_type *atts,
>                                unsigned att_count)
> @@ -180,8 +181,6 @@ dri2_drawable_process_buffers(struct dri_drawable *drawable,
>     struct winsys_handle whandle;
>     boolean alloc_depthstencil = FALSE;
>     unsigned i, j, bind;
> -   struct pipe_screen *pscreen = screen->base.screen;
> -   struct pipe_context *pipe = NULL;
>
>     if (drawable->old_num == buffer_count &&
>         drawable->old_w == dri_drawable->w &&
> @@ -308,14 +307,8 @@ dri2_drawable_process_buffers(struct dri_drawable *drawable,
>                  * The single-sample resources are not exposed
>                  * to the state tracker.
>                  *
> -                * We don't have a context here, so create one temporarily.
> -                * We may need to create a persistent context if creation and
> -                * destruction of the context becomes a bottleneck.
>                  */
> -               if (!pipe)
> -                  pipe = pscreen->context_create(pscreen, NULL);
> -
> -               dri_pipe_blit(pipe,
> +               dri_pipe_blit(ctx->st->pipe,
>                               drawable->msaa_textures[att],
>                               drawable->textures[att]);
>              }
> @@ -371,11 +364,6 @@ dri2_drawable_process_buffers(struct dri_drawable *drawable,
>     drawable->old_w = dri_drawable->w;
>     drawable->old_h = dri_drawable->h;
>     memcpy(drawable->old, buffers, sizeof(__DRIbuffer) * buffer_count);
> -
> -   if (pipe) {
> -      pipe->flush(pipe, NULL, 0);
> -      pipe->destroy(pipe);
> -   }
>  }
>
>  static __DRIbuffer *
> @@ -470,7 +458,8 @@ dri2_release_buffer(__DRIscreen *sPriv, __DRIbuffer *bPriv)
>   */
>
>  static void
> -dri2_allocate_textures(struct dri_drawable *drawable,
> +dri2_allocate_textures(struct dri_context *ctx,
> +                       struct dri_drawable *drawable,
>                         const enum st_attachment_type *statts,
>                         unsigned statts_count)
>  {
> @@ -479,7 +468,7 @@ dri2_allocate_textures(struct dri_drawable *drawable,
>
>     buffers = dri2_drawable_get_buffers(drawable, statts, &num_buffers);
>     if (buffers)
> -      dri2_drawable_process_buffers(drawable, buffers, num_buffers,
> +      dri2_drawable_process_buffers(ctx, drawable, buffers, num_buffers,
>                                      statts, statts_count);
>  }
>
> diff --git a/src/gallium/state_trackers/dri/sw/drisw.c b/src/gallium/state_trackers/dri/sw/drisw.c
> index 41f66d5..121a205 100644
> --- a/src/gallium/state_trackers/dri/sw/drisw.c
> +++ b/src/gallium/state_trackers/dri/sw/drisw.c
> @@ -182,7 +182,8 @@ drisw_flush_frontbuffer(struct dri_context *ctx,
>   * framebuffer is resized or destroyed.
>   */
>  static void
> -drisw_allocate_textures(struct dri_drawable *drawable,
> +drisw_allocate_textures(struct dri_context *stctx,
> +                        struct dri_drawable *drawable,
>                          const enum st_attachment_type *statts,
>                          unsigned count)
>  {
> diff --git a/src/gallium/state_trackers/egl/common/egl_g3d_api.c b/src/gallium/state_trackers/egl/common/egl_g3d_api.c
> index 2e5424e..59187a9 100644
> --- a/src/gallium/state_trackers/egl/common/egl_g3d_api.c
> +++ b/src/gallium/state_trackers/egl/common/egl_g3d_api.c
> @@ -443,7 +443,7 @@ egl_g3d_create_pbuffer_from_client_buffer(_EGLDriver *drv, _EGLDisplay *dpy,
>     gsurf->client_buffer = buffer;
>
>     /* validate now so that it fails if the client buffer is invalid */
> -   if (!gsurf->stfbi->validate(gsurf->stfbi,
> +   if (!gsurf->stfbi->validate(NULL, gsurf->stfbi,
>              &gsurf->stvis.render_buffer, 1, &ptex)) {
>        egl_g3d_destroy_st_framebuffer(gsurf->stfbi);
>        FREE(gsurf);
> diff --git a/src/gallium/state_trackers/egl/common/egl_g3d_st.c b/src/gallium/state_trackers/egl/common/egl_g3d_st.c
> index f2ee11c..cf1846c 100644
> --- a/src/gallium/state_trackers/egl/common/egl_g3d_st.c
> +++ b/src/gallium/state_trackers/egl/common/egl_g3d_st.c
> @@ -149,7 +149,8 @@ pbuffer_allocate_pbuffer_texture(struct egl_g3d_surface *gsurf)
>  }
>
>  static boolean
> -egl_g3d_st_framebuffer_validate_pbuffer(struct st_framebuffer_iface *stfbi,
> +egl_g3d_st_framebuffer_validate_pbuffer(struct st_context_iface *stctx,
> +                                        struct st_framebuffer_iface *stfbi,
>                                          const enum st_attachment_type *statts,
>                                          unsigned count,
>                                          struct pipe_resource **out)
> @@ -202,7 +203,8 @@ egl_g3d_st_framebuffer_flush_front(struct st_context_iface *stctx,
>  }
>
>  static boolean
> -egl_g3d_st_framebuffer_validate(struct st_framebuffer_iface *stfbi,
> +egl_g3d_st_framebuffer_validate(struct st_context_iface *stctx,
> +                                struct st_framebuffer_iface *stfbi,
>                                  const enum st_attachment_type *statts,
>                                  unsigned count,
>                                  struct pipe_resource **out)
> diff --git a/src/gallium/state_trackers/glx/xlib/xm_st.c b/src/gallium/state_trackers/glx/xlib/xm_st.c
> index 30e69ea..fb69998 100644
> --- a/src/gallium/state_trackers/glx/xlib/xm_st.c
> +++ b/src/gallium/state_trackers/glx/xlib/xm_st.c
> @@ -194,7 +194,8 @@ xmesa_st_framebuffer_validate_textures(struct st_framebuffer_iface *stfbi,
>   * \param out  returns resources for each of the attachments
>   */
>  static boolean
> -xmesa_st_framebuffer_validate(struct st_framebuffer_iface *stfbi,
> +xmesa_st_framebuffer_validate(struct st_context_iface *stctx,
> +                              struct st_framebuffer_iface *stfbi,
>                                const enum st_attachment_type *statts,
>                                unsigned count,
>                                struct pipe_resource **out)
> diff --git a/src/gallium/state_trackers/osmesa/osmesa.c b/src/gallium/state_trackers/osmesa/osmesa.c
> index bb85e5c..3546183 100644
> --- a/src/gallium/state_trackers/osmesa/osmesa.c
> +++ b/src/gallium/state_trackers/osmesa/osmesa.c
> @@ -342,7 +342,8 @@ osmesa_st_framebuffer_flush_front(struct st_context_iface *stctx,
>   * its resources).
>   */
>  static boolean
> -osmesa_st_framebuffer_validate(struct st_framebuffer_iface *stfbi,
> +osmesa_st_framebuffer_validate(struct st_context_iface *stctx,
> +                               struct st_framebuffer_iface *stfbi,
>                                 const enum st_attachment_type *statts,
>                                 unsigned count,
>                                 struct pipe_resource **out)
> diff --git a/src/gallium/state_trackers/vega/vg_manager.c b/src/gallium/state_trackers/vega/vg_manager.c
> index c079d90..2c43d76 100644
> --- a/src/gallium/state_trackers/vega/vg_manager.c
> +++ b/src/gallium/state_trackers/vega/vg_manager.c
> @@ -113,7 +113,8 @@ vg_manager_validate_framebuffer(struct vg_context *ctx)
>     if (stfb->iface_stamp != new_stamp) {
>        do {
>          /* validate the fb */
> -        if (!stfb->iface->validate(stfb->iface, &stfb->strb_att,
> +        if (!stfb->iface->validate((struct st_context_iface *)ctx,
> +                                   stfb->iface, &stfb->strb_att,
>                                     1, &pt) || !pt)
>             return;
>
> diff --git a/src/gallium/state_trackers/wgl/stw_st.c b/src/gallium/state_trackers/wgl/stw_st.c
> index 9427398..e95c37f 100644
> --- a/src/gallium/state_trackers/wgl/stw_st.c
> +++ b/src/gallium/state_trackers/wgl/stw_st.c
> @@ -121,7 +121,8 @@ stw_st_framebuffer_validate_locked(struct st_framebuffer_iface *stfb,
>  }
>
>  static boolean
> -stw_st_framebuffer_validate(struct st_framebuffer_iface *stfb,
> +stw_st_framebuffer_validate(struct st_context_iface *stctx,
> +                            struct st_framebuffer_iface *stfb,
>                              const enum st_attachment_type *statts,
>                              unsigned count,
>                              struct pipe_resource **out)
> diff --git a/src/mesa/state_tracker/st_manager.c b/src/mesa/state_tracker/st_manager.c
> index 9c2b4d2..91883a2 100644
> --- a/src/mesa/state_tracker/st_manager.c
> +++ b/src/mesa/state_tracker/st_manager.c
> @@ -189,7 +189,7 @@ st_framebuffer_validate(struct st_framebuffer *stfb,
>
>     /* validate the fb */
>     do {
> -      if (!stfb->iface->validate(stfb->iface, stfb->statts,
> +      if (!stfb->iface->validate(&st->iface, stfb->iface, stfb->statts,
>                                  stfb->num_statts, textures))
>          return;
>
>


More information about the mesa-dev mailing list