summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIgor Gnatenko <i.gnatenko.brain@gmail.com>2013-09-11 12:17:35 +0400
committerIgor Gnatenko <i.gnatenko.brain@gmail.com>2013-09-19 11:17:21 +0400
commit205d5627e8b5259990da7ab2975ab479e5a61963 (patch)
treeb8b34a18f6de7c3badeb9db2e0ed609e561c99f9
parent1bef4ecf95a611a041d4eb4f474d050d47eab8ec (diff)
downloadmesa-205d5627e8b5259990da7ab2975ab479e5a61963.tar.gz
mesa-205d5627e8b5259990da7ab2975ab479e5a61963.tar.xz
mesa-205d5627e8b5259990da7ab2975ab479e5a61963.zip
Today's git snap 9.2, fix crashing games when set AA to x2 on GTX760
Today's git snapshot from 9.2 branch Added as downstream until push to 9.2 branch and make snapshot Reference: https://bugs.freedesktop.org/show_bug.cgi?id=68665 https://bugzilla.redhat.com/show_bug.cgi?id=1001698 https://bugzilla.redhat.com/show_bug.cgi?id=1001714 https://bugzilla.redhat.com/show_bug.cgi?id=1004674 https://bugzilla.redhat.com/show_bug.cgi?id=1001740 Signed-off-by: Igor Gnatenko <i.gnatenko.brain@gmail.com>
-rw-r--r--.gitignore1
-rw-r--r--0001-st-dri-do-not-create-a-new-context-for-msaa-copy.patch313
-rw-r--r--mesa.spec11
-rw-r--r--sources2
4 files changed, 325 insertions, 2 deletions
diff --git a/.gitignore b/.gitignore
index 093975b..992a92d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -55,3 +55,4 @@ mesa-20100720.tar.bz2
/mesa-20130610.tar.xz
/mesa-20130723.tar.xz
/mesa-20130902.tar.xz
+/mesa-20130919.tar.xz
diff --git a/0001-st-dri-do-not-create-a-new-context-for-msaa-copy.patch b/0001-st-dri-do-not-create-a-new-context-for-msaa-copy.patch
new file mode 100644
index 0000000..8a722db
--- /dev/null
+++ b/0001-st-dri-do-not-create-a-new-context-for-msaa-copy.patch
@@ -0,0 +1,313 @@
+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
+
diff --git a/mesa.spec b/mesa.spec
index 68458dc..40c45f5 100644
--- a/mesa.spec
+++ b/mesa.spec
@@ -48,7 +48,7 @@
%define _default_patch_fuzz 2
-%define gitdate 20130902
+%define gitdate 20130919
#% define snapshot
Summary: Mesa graphics libraries
@@ -76,6 +76,9 @@ Patch12: mesa-8.0.1-fix-16bpp.patch
Patch15: mesa-9.2-hardware-float.patch
Patch16: mesa-9.2-no-useless-vdpau.patch
Patch20: mesa-9.2-evergreen-big-endian.patch
+# https://bugs.freedesktop.org/show_bug.cgi?id=68665
+# http://cgit.freedesktop.org/mesa/mesa/commit/?id=b217d48364f368f541e53006af5dd56f664be24d
+Patch21: 0001-st-dri-do-not-create-a-new-context-for-msaa-copy.patch
BuildRequires: pkgconfig autoconf automake libtool
%if %{with_hardware}
@@ -301,6 +304,7 @@ grep -q ^/ src/gallium/auxiliary/vl/vl_decoder.c && exit 1
%patch15 -p1 -b .hwfloat
%patch16 -p1 -b .vdpau
%patch20 -p1 -b .egbe
+%patch21 -p1 -b .msaa
%if 0%{with_private_llvm}
sed -i 's/llvm-config/mesa-private-llvm-config-%{__isa_bits}/g' configure.ac
@@ -600,6 +604,11 @@ rm -rf $RPM_BUILD_ROOT
%endif
%changelog
+* Thu Sep 19 2013 Igor Gnatenko <i.gnatenko.brain@gmail.com> - 9.2-1.20130919
+- Today's git snap of 9.2 branch
+- [NVE4] Fix crashing games when set AA to x2 on GTX760
+- (freedesktop 68665 rhbz 1001714 1001698 1001740 1004674)
+
* Mon Sep 02 2013 Dave Airlie <airlied@redhat.com> 9.2-1.20130902
- 9.2 upstream release + fixes from git branch
diff --git a/sources b/sources
index 201d693..82c8d86 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-a87aedfb1bbd4522b576e99906131008 mesa-20130902.tar.xz
+99e1cbf18a76c540d5026a6db6e94199 mesa-20130919.tar.xz