314 lines
14 KiB
Diff
314 lines
14 KiB
Diff
|
From b217d48364f368f541e53006af5dd56f664be24d Mon Sep 17 00:00:00 2001
|
||
|
From: Maarten Lankhorst <maarten.lankhorst@canonical.com>
|
||
|
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=UTF-8
|
||
|
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 <maarten.lankhorst@canonical.com>
|
||
|
Cc: 9.2 <mesa-stable@lists.freedesktop.org>
|
||
|
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
|
||
|
---
|
||
|
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 +-
|
||
|
src/gallium/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 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 e4477d6..fea1c8d 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 3ee0d67..46a3245 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 098e6c0..b1fd91a 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;
|
||
|
|
||
|
--
|
||
|
1.8.3.1
|
||
|
|