Reviewed-by: Marek Olšák <marek.ol...@amd.com> Marek
On Mon, Sep 9, 2013 at 1:02 PM, Maarten Lankhorst <maarten.lankho...@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.lankho...@canonical.com> > Cc: 9.2 <mesa-sta...@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; > > _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev