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>
This commit is contained in:
Igor Gnatenko 2013-09-11 12:17:35 +04:00
parent 1bef4ecf95
commit 205d5627e8
4 changed files with 325 additions and 2 deletions

1
.gitignore vendored
View File

@ -55,3 +55,4 @@ mesa-20100720.tar.bz2
/mesa-20130610.tar.xz /mesa-20130610.tar.xz
/mesa-20130723.tar.xz /mesa-20130723.tar.xz
/mesa-20130902.tar.xz /mesa-20130902.tar.xz
/mesa-20130919.tar.xz

View File

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

View File

@ -48,7 +48,7 @@
%define _default_patch_fuzz 2 %define _default_patch_fuzz 2
%define gitdate 20130902 %define gitdate 20130919
#% define snapshot #% define snapshot
Summary: Mesa graphics libraries Summary: Mesa graphics libraries
@ -76,6 +76,9 @@ Patch12: mesa-8.0.1-fix-16bpp.patch
Patch15: mesa-9.2-hardware-float.patch Patch15: mesa-9.2-hardware-float.patch
Patch16: mesa-9.2-no-useless-vdpau.patch Patch16: mesa-9.2-no-useless-vdpau.patch
Patch20: mesa-9.2-evergreen-big-endian.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 BuildRequires: pkgconfig autoconf automake libtool
%if %{with_hardware} %if %{with_hardware}
@ -301,6 +304,7 @@ grep -q ^/ src/gallium/auxiliary/vl/vl_decoder.c && exit 1
%patch15 -p1 -b .hwfloat %patch15 -p1 -b .hwfloat
%patch16 -p1 -b .vdpau %patch16 -p1 -b .vdpau
%patch20 -p1 -b .egbe %patch20 -p1 -b .egbe
%patch21 -p1 -b .msaa
%if 0%{with_private_llvm} %if 0%{with_private_llvm}
sed -i 's/llvm-config/mesa-private-llvm-config-%{__isa_bits}/g' configure.ac sed -i 's/llvm-config/mesa-private-llvm-config-%{__isa_bits}/g' configure.ac
@ -600,6 +604,11 @@ rm -rf $RPM_BUILD_ROOT
%endif %endif
%changelog %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 * Mon Sep 02 2013 Dave Airlie <airlied@redhat.com> 9.2-1.20130902
- 9.2 upstream release + fixes from git branch - 9.2 upstream release + fixes from git branch

View File

@ -1 +1 @@
a87aedfb1bbd4522b576e99906131008 mesa-20130902.tar.xz 99e1cbf18a76c540d5026a6db6e94199 mesa-20130919.tar.xz