st/dri: do not create a new context for msaa copy

Commit b77316ad75
    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@canonical.com>
Cc: 9.2 <mesa-stable@lists.freedesktop.org>
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
This commit is contained in:
Maarten Lankhorst
2013-09-09 13:02:08 +02:00
parent 169f9c030c
commit b217d48364
12 changed files with 34 additions and 33 deletions

View File

@@ -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);

View File

@@ -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];

View File

@@ -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);

View File

@@ -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);
}

View File

@@ -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)
{

View File

@@ -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);

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

View File

@@ -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;

View File

@@ -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)

View File

@@ -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;