From b217d48364f368f541e53006af5dd56f664be24d Mon Sep 17 00:00:00 2001 From: Maarten Lankhorst Date: Mon, 9 Sep 2013 13:02:08 +0200 Subject: [PATCH] st/dri: do not create a new context for msaa copy MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 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 Cc: 9.2 Reviewed-by: Marek Olšák --- src/gallium/include/state_tracker/st_api.h | 3 ++- .../state_trackers/dri/common/dri_drawable.c | 13 +++++++---- .../state_trackers/dri/common/dri_drawable.h | 3 ++- src/gallium/state_trackers/dri/drm/dri2.c | 23 +++++-------------- src/gallium/state_trackers/dri/sw/drisw.c | 3 ++- .../state_trackers/egl/common/egl_g3d_api.c | 2 +- .../state_trackers/egl/common/egl_g3d_st.c | 6 +++-- src/gallium/state_trackers/glx/xlib/xm_st.c | 3 ++- src/gallium/state_trackers/osmesa/osmesa.c | 3 ++- src/gallium/state_trackers/vega/vg_manager.c | 3 ++- src/gallium/state_trackers/wgl/stw_st.c | 3 ++- src/mesa/state_tracker/st_manager.c | 2 +- 12 files changed, 34 insertions(+), 33 deletions(-) diff --git a/src/gallium/include/state_tracker/st_api.h b/src/gallium/include/state_tracker/st_api.h index 3ecd12e91af..9dcb76fadec 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 18d8d8988a9..ddf940048cf 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 50e5cc4cd67..c5142181e89 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 e4477d6de77..fea1c8dfe52 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 41f66d5e4d4..121a2057a32 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 3ee0d677017..46a3245246f 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 f2ee11c8e01..cf1846c74b7 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 30e69eafc17..fb6999826a9 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 bb85e5c2f0c..3546183a81b 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 c079d90359c..2c43d763dea 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 9427398d89d..e95c37fcecd 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 098e6c02c76..b1fd91a0ebf 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; -- 2.30.2