-diff --git a/Makefile b/Makefile
-index b8069f9..b13ed33 100644
---- a/Makefile
-+++ b/Makefile
-@@ -347,23 +347,19 @@ GALLIUM_FILES = \
-
- DRI_FILES = \
- $(DIRECTORY)/include/GL/internal/dri_interface.h \
-- $(DIRECTORY)/include/GL/internal/glcore.h \
- $(DIRECTORY)/include/GL/internal/sarea.h \
- $(DIRECTORY)/src/glx/Makefile \
-- $(DIRECTORY)/src/glx/Makefile \
- $(DIRECTORY)/src/glx/*.[ch] \
- $(DIRECTORY)/src/mesa/drivers/dri/Makefile \
- $(DIRECTORY)/src/mesa/drivers/dri/Makefile.template \
- $(DIRECTORY)/src/mesa/drivers/dri/dri.pc.in \
-- $(DIRECTORY)/src/mesa/drivers/dri/common/xmlpool/*.[ch] \
- $(DIRECTORY)/src/mesa/drivers/dri/common/xmlpool/*.po \
- $(DIRECTORY)/src/mesa/drivers/dri/*/*.[chS] \
- $(DIRECTORY)/src/mesa/drivers/dri/*/*.cpp \
- $(DIRECTORY)/src/mesa/drivers/dri/*/*/*.[chS] \
- $(DIRECTORY)/src/mesa/drivers/dri/*/Makefile \
- $(DIRECTORY)/src/mesa/drivers/dri/*/*/Makefile \
-- $(DIRECTORY)/src/mesa/drivers/dri/*/Doxyfile \
-- $(DIRECTORY)/src/mesa/drivers/dri/*/server/*.[ch]
-+ $(DIRECTORY)/src/mesa/drivers/dri/*/Doxyfile
-
- SGI_GLU_FILES = \
- $(DIRECTORY)/src/glu/Makefile \
-diff --git a/docs/devinfo.html b/docs/devinfo.html
-index df0e726..2d1c125 100644
---- a/docs/devinfo.html
-+++ b/docs/devinfo.html
-@@ -145,7 +145,7 @@ Make sure the values in src/mesa/main/version.h are correct.
- </p>
-
- <p>
--Update the docs/news.html file and docs/download.html files.
-+Update docs/news.html.
- </p>
-
- <p>
-@@ -208,10 +208,11 @@ sftp USERNAME,mesa3d@web.sourceforge.net
-
- <p>
- Make an announcement on the mailing lists:
--<em>m</em><em>e</em><em>s</em><em>a</em><em>3</em><em>d</em><em>-</em><em>d</em><em>e</em><em>v</em><em>@</em><em>l</em><em>i</em><em>s</em><em>t</em><em>s</em><em>.</em><em>s</em><em>f</em><em>.</em><em>n</em><em>e</em><em>t</em>,
--<em>m</em><em>e</em><em>s</em><em>a</em><em>3</em><em>d</em><em>-</em><em>u</em><em>s</em><em>e</em><em>r</em><em>s</em><em>@</em><em>l</em><em>i</em><em>s</em><em>t</em><em>s</em><em>.</em><em>s</em><em>f</em><em>.</em><em>n</em><em>e</em><em>t</em>
-+
-+<em>m</em><em>e</em><em>s</em><em>a</em><em>-</em><em>d</em><em>e</em><em>v</em><em>@</em><em>l</em><em>i</em><em>s</em><em>t</em><em>s</em><em>.</em><em>f</em><em>r</em><em>e</em><em>e</em><em>d</em><em>e</em><em>s</em><em>k</em><em>t</em><em>o</em><em>p</em><em>.</em><em>o</em><em>r</em><em>g</em>,
-+<em>m</em><em>e</em><em>s</em><em>a</em><em>-</em><em>u</em><em>s</em><em>e</em><em>r</em><em>s</em><em>@</em><em>l</em><em>i</em><em>s</em><em>t</em><em>s</em><em>.</em><em>f</em><em>r</em><em>e</em><em>e</em><em>d</em><em>e</em><em>s</em><em>k</em><em>t</em><em>o</em><em>p</em><em>.</em><em>o</em><em>r</em><em>g</em>
- and
--<em>m</em><em>e</em><em>s</em><em>a</em><em>3</em><em>d</em><em>-</em><em>a</em><em>n</em><em>n</em><em>o</em><em>u</em><em>n</em><em>c</em><em>e</em><em>@</em><em>l</em><em>i</em><em>s</em><em>t</em><em>s</em><em>.</em><em>s</em><em>f</em><em>.</em><em>n</em><em>e</em><em>t</em>
-+<em>m</em><em>e</em><em>s</em><em>a</em><em>-</em><em>a</em><em>n</em><em>n</em><em>o</em><em>u</em><em>n</em><em>c</em><em>e</em><em>@</em><em>l</em><em>i</em><em>s</em><em>t</em><em>s</em><em>.</em><em>f</em><em>r</em><em>e</em><em>e</em><em>d</em><em>e</em><em>s</em><em>k</em><em>t</em><em>o</em><em>p</em><em>.</em><em>o</em><em>r</em><em>g</em>
- </p>
-
-
diff --git a/docs/news.html b/docs/news.html
-index b3fb8b5..72d38ee 100644
+index eea6cd6..70b38c6 100644
--- a/docs/news.html
+++ b/docs/news.html
-@@ -11,10 +11,18 @@
+@@ -11,6 +11,13 @@
<H1>News</H1>
-+<h2>October 4, 2010</h2>
++<h2>July 31, 2011</h2>
+
+<p>
-+<a href="relnotes-7.9.html">Mesa 7.9</a> (final) is released. This is a new
-+development release.
++<a href="relnotes-7.11.html">Mesa 7.11</a> is released. This is a new
++release with many new features.
+</p>
+
-+
- <h2>September 27, 2010</h2>
+ <h2>June 13, 2011</h2>
<p>
--<a href="relnotes-7.9.0.html">Mesa 7.9.0-rc1</a> is released. This is a
-+<a href="relnotes-7.9.html">Mesa 7.9.0-rc1</a> is released. This is a
- release candidate for the 7.9 development release.
- </p>
-
-diff --git a/docs/relnotes-7.8.2.html b/docs/relnotes-7.8.2.html
-index e1b0f2d..1393b2e 100644
---- a/docs/relnotes-7.8.2.html
-+++ b/docs/relnotes-7.8.2.html
-@@ -26,7 +26,15 @@ for DRI hardware acceleration.
+diff --git a/docs/relnotes-7.11.html b/docs/relnotes-7.11.html
+index 79776d3..52033cf 100644
+--- a/docs/relnotes-7.11.html
++++ b/docs/relnotes-7.11.html
+@@ -30,7 +30,12 @@ for DRI hardware acceleration.
<h2>MD5 checksums</h2>
<pre>
-tbd
-+c89b63d253605ed40e8ac370d25a833c MesaLib-7.8.2.tar.gz
-+6be2d343a0089bfd395ce02aaf8adb57 MesaLib-7.8.2.tar.bz2
-+a04ad3b06ac5ff3969a003fa7bbf7d5b MesaLib-7.8.2.zip
-+7c213f92efeb471f0331670d5079d4c0 MesaDemos-7.8.2.tar.gz
-+757d9e2e06f48b1a52848be9b0307ced MesaDemos-7.8.2.tar.bz2
-+8d0e5cfe68b8ebf90265d350ae2c48b1 MesaDemos-7.8.2.zip
-+b74482e3f44f35ed395c4aada4fd8240 MesaGLUT-7.8.2.tar.gz
-+a471807b65e49c325808ba4551be93ed MesaGLUT-7.8.2.tar.bz2
-+9f190268c42be582ef66e47365ee61e3 MesaGLUT-7.8.2.zip
- </pre>
-
-
-@@ -44,10 +52,95 @@ tbd
- <ul>
- <li>Fixed Gallium glDrawPixels(GL_DEPTH_COMPONENT).
- <li>Fixed Gallium Cell driver to buildable, runable state
-+<li>Fixed bad error checking for glFramebufferRenderbuffer(attachment=GL_DEPTH_STENCIL_ATTACHMENT).
-+<li>Fixed incorrect Z coordinate handling in "meta" glDraw/CopyPixels.
-+ <a href="https://bugs.freedesktop.org/show_bug.cgi?id=23670">Bug
-+ #23670</a>.</li>
-+
-+<li>Assorted i965 driver fixes.
-+ Including but not limited to:
-+ <ul>
-+ <li>Fix scissoring when width or height is
-+ 0. <a href="https://bugs.freedesktop.org/show_bug.cgi?id=27643">Bug
-+ #27643</a>.
-+ <li>Fix bit allocation for number of color regions for
-+ ARB_draw_buffers.</li>
-+ <li>Set the correct provoking vertex for clipped first-mode
-+ trifans. <a href="https://bugs.freedesktop.org/show_bug.cgi?id=24470">Bug
-+ #24470</a>.</li>
-+ <li>Use <code>R16G16B16A16_FLOAT</code> for 3-component half-float.</li>
-+ <li>Fix assertion for surface tile offset usage on Ironlake.</li>
-+ <li>Fix cube map layouts on Ironlake.</li>
-+ <li>When an RB gets a new region, clear the old from the state
-+ cache. <a href="https://bugs.freedesktop.org/show_bug.cgi?id=24119">Bug
-+ #24119</a>.</li>
-+ <li>Reject shaders with uninlined function calls instead of hanging.</li>
-+ </ul>
-+</li>
-+
-+<li>Assorted i915 driver fixes. Including but not limited to:
-+ <ul>
-+ <li>Fixed texture LOD clamping in i915 driver.
-+ <a href="https://bugs.freedesktop.org/show_bug.cgi?id=24846">Bug
-+ #24846</a>.</li>
-+ <li>Fix off-by-one for drawing rectangle.
-+ <a href="https://bugs.freedesktop.org/show_bug.cgi?id=27408">Bug
-+ #27408</a>.</li>
-+ </ul>
-+</li>
-+
-+<li>Fixed hangs in etracer on 830 and 845
-+ chipsets. <a href="https://bugs.freedesktop.org/show_bug.cgi?id=26557">Bug
-+ #26557</a>.</li>
-+<li>Fixed tiling of small textures on all Intel drivers.</li>
-+<li>Fixed crash in Savage driver when using <code>_mesa_CopyTexImage2D</code>.
-+ <a href="https://bugs.freedesktop.org/show_bug.cgi?id=27652">Bug
-+ #27652</a>.</li>
-+
-+<li>Assorted GLX fixes. Including but not limited to:
-+ <ul>
-+ <li>Fixed <code>__glXInitializeVisualConfigFromTags</code>'s handling of
-+ unrecognized fbconfig tags.</li>
-+ <li>Fixed regression with <code>GLX_USE_GL</code>.
-+ <li>Fixed config chooser logic for 'mask' matching.</li>
-+ <li>Report swap events correctly in direct rendered case (DRI2)</li>
-+ <li>Fixed build with dri2proto which doesn't define
-+ <code>X_DRI2SwapInterval</code>.</li>
-+ <li>Get <code>GLX_SCREEN</code> first in <code>__glXQueryContextInfo</code>.
-+ <a href="https://bugs.freedesktop.org/show_bug.cgi?id=14245">Bug
-+ #14245</a>.</li>
-+ </ul>
-+</li>
-+
-+<li>Assorted GLSL fixes. Including but not limited to:
-+ <ul>
-+ <li>Change variable declared assertion into conditional in GLSL
-+ compiler. <a href="https://bugs.freedesktop.org/show_bug.cgi?id=27921">Bug
-+ #27921</a>.</li>
-+ <li>Fix instruction indexing
-+ bugs. <a href="https://bugs.freedesktop.org/show_bug.cgi?id=27566">Bug
-+ #27566</a>.</li>
-+ <li>Updated uniform location / offset encoding to be more like
-+ other implementations.</li>
-+ <li>Don't overwrite a driver's shader infolog with generic failure
-+ message.</li>
-+ </ul>
-+</li>
-+
-+<li>Fixed OSMesa build for 16 and 32-bit color channel depth.
-+<li>Fixed OSMesa build with hidden symbol visibility. libOSMesa no longer links to libGL.
-+ <a href="https://bugs.freedesktop.org/show_bug.cgi?id=28305">Bug
-+ #28305</a>.
-+<li>Fixed handling of multiple render targets in fixed-function
-+ texture envrionmnent programs.</li>
-+<li>Fixed conversion errors in <code>signed_rgba8888[rev]</code> texel
-+ fetch.</li>
-+<li>Don't set srcLevel on <code>GL_TEXTURE_RECTANGLE_ARB</code> targets.</li>
-+<li>Various build fixes for OpenBSD.</li>
-+<li>Various build fixes for OS X.</li>
-+<li>Various build fixes for GCC 3.3.</li>
- </ul>
-
-
--<h2>Changes</h2>
--<p>None.</p>
- </body>
- </html>
-diff --git a/docs/relnotes-7.8.3.html b/docs/relnotes-7.8.3.html
-new file mode 100644
-index 0000000..1e9f433
---- /dev/null
-+++ b/docs/relnotes-7.8.3.html
-@@ -0,0 +1,89 @@
-+<HTML>
-+
-+<TITLE>Mesa Release Notes</TITLE>
-+
-+<head><link rel="stylesheet" type="text/css" href="mesa.css"></head>
-+
-+<BODY>
-+
-+<body bgcolor="#eeeeee">
-+
-+<H1>Mesa 7.8.3 Release Notes / (date tbd)</H1>
-+
-+<p>
-+Mesa 7.8.3 is a bug fix release which fixes bugs found since the 7.8.2 release.
-+</p>
-+<p>
-+Mesa 7.8.3 implements the OpenGL 2.1 API, but the version reported by
-+glGetString(GL_VERSION) depends on the particular driver being used.
-+Some drivers don't support all the features required in OpenGL 2.1.
-+</p>
-+<p>
-+See the <a href="install.html">Compiling/Installing page</a> for prerequisites
-+for DRI hardware acceleration.
-+</p>
-+
-+
-+<h2>MD5 checksums</h2>
-+<pre>
-+x MesaLib-7.8.3.tar.gz
-+x MesaLib-7.8.3.tar.bz2
-+x MesaLib-7.8.3.zip
-+x MesaDemos-7.8.3.tar.gz
-+x MesaDemos-7.8.3.tar.bz2
-+x MesaDemos-7.8.3.zip
-+x MesaGLUT-7.8.3.tar.gz
-+x MesaGLUT-7.8.3.tar.bz2
-+x MesaGLUT-7.8.3.zip
-+</pre>
-+
-+
-+<h2>New features</h2>
-+<p>None.</p>
-+
-+
-+<h2>Changes</h2>
-+<ul>
-+<li>The radeon driver should use less memory when searching for a valid mip
-+image.</li>
-+</ul>
-+
-+
-+<h2>Bug fixes</h2>
-+<ul>
-+<li>Fix unsupported FB with D24S8 (bug
-+ <a href="https://bugs.freedesktop.org/show_bug.cgi?id=23670">29116</a>)</li>
-+<li>Fix ReadPixels crash when reading depth/stencil from an FBO</li>
-+<li>Fixed a bug rendering to 16-bit buffers using swrast.</li>
-+<li>Fixed a state tracker/TGSI bug that caused crashes when using Windows'
-+ memory debugging features.</li>
-+<li>Fixed an issue rendering to 32-bit channels with swrast (bug
-+ <a href="https://bugs.freedesktop.org/show_bug.cgi?id=29487">29487</a>)</li>
-+<li>GLSL: fix indirect <TT>gl_TextureMatrix</TT> addressing (bug
-+ <a href="https://bugs.freedesktop.org/show_bug.cgi?id=28967">28967</a>)</li>
-+<li>GLSL: fix for bug
-+ <a href="https://bugs.freedesktop.org/show_bug.cgi?id=27216">27216</a></li>
-+<li>GLSL: fix zw fragcoord entries in some cases (bug
-+ <a href="https://bugs.freedesktop.org/show_bug.cgi?id=29183">29183</a>)</li>
-+<li>Fix texture env generation in some cases (bug
-+ <a href="https://bugs.freedesktop.org/show_bug.cgi?id=28169">28169</a>)</li>
-+<li>osmesa: a fix for calling <TT>OSMesaMakeCurrent</TT> twice was applied (bug
-+ <a href="https://bugs.freedesktop.org/show_bug.cgi?id=10966">10966</a></li>
-+<li>A bug was fixed which could cause Mesa to ignore the
-+ <TT>MESA_EXTENSION_OVERRIDE</TT> environment variable.</li>
-+<li>A bug related to specular highlights on backfaces was fixed.</li>
-+<li>A radeon-specific issue with <TT>glCopyTex(Sub)Image</TT> was
-+ corrected.</li>
-+<li>radeon/wine: flush command stream in more cases, fixing wine d3d9
-+ tests.</li>
-+<li>r600: fix sin+cos normalization.</li>
-+<li>r600: (properly) ignore <TT>GL_COORD_REPLACE</TT> when point sprites are
-+ disabled.</li>
-+<li>radeon: avoid flushing when the context is not current.</li>
-+<li>r300c: a bug affecting unaligned BOs was fixed.</li>
-+<li>r300c: a hardlock caused by ARB_half_float_vertex incorrectly advertised on some chipsets.</li>
-+</ul>
-+
-+
-+</body>
-+</html>
-diff --git a/docs/relnotes-7.9.html b/docs/relnotes-7.9.html
-index b09fb1d..fe1fd5e 100644
---- a/docs/relnotes-7.9.html
-+++ b/docs/relnotes-7.9.html
-@@ -28,12 +28,12 @@ for DRI hardware acceleration.
-
- <h2>MD5 checksums</h2>
- <pre>
--f1f01a7baec255f13e9468fb4b05922a MesaLib-7.9-rc1.tar.gz
--7ffbda3b7056c60b8f87e3082d853af1 MesaLib-7.9-rc1.tar.bz2
--9d4650df4e5b530178d6fde840f76664 MesaLib-7.9-rc1.zip
--a81c2e7a0c7832e67c768d6f209f2c8f MesaGLUT-7.9-rc1.tar.gz
--b4c1c2f0b47a07be10fa2dd42e6a63d7 MesaGLUT-7.9-rc1.tar.bz2
--c9dd7419a19bcb24a1fe556ec2e78451 MesaGLUT-7.9-rc1.zip
-+ed65ab425b25895c7f473d0a5e6e64f8 MesaLib-7.9.tar.gz
-+82c740c49d572baa6da2b1a1eee90bca MesaLib-7.9.tar.bz2
-+cd2b6ecec759b0457475e94bbb38fedb MesaLib-7.9.zip
-+7b54af9fb9b1f6a1a65db2520f50848f MesaGLUT-7.9.tar.gz
-+20d07419d1929f833fdb36bced290ad5 MesaGLUT-7.9.tar.bz2
-+62a7edecd7c92675cd6029b05217eb0a MesaGLUT-7.9.zip
++fa2c7068503133fb2453244cda11cb2a MesaLib-7.11.tar.gz
++ff03aca82d0560009a076a87c888cf13 MesaLib-7.11.tar.bz2
++ede1ac0976f6f05df586093fc17d63ed MesaLib-7.11.zip
++b4fb81a47c5caedaefad49af7702c23d MesaGLUT-7.11.tar.gz
++77a9a0bbd7f8bca882aa5709b88cb071 MesaGLUT-7.11.tar.bz2
++c19ef0c6eb61188c96ed4ccedd70717c MesaGLUT-7.11.zip
</pre>
-diff --git a/docs/relnotes.html b/docs/relnotes.html
-index 47e7f80..4487af9 100644
---- a/docs/relnotes.html
-+++ b/docs/relnotes.html
-@@ -14,6 +14,7 @@ The release notes summarize what's new or changed in each Mesa release.
-
- <UL>
- <LI><A HREF="relnotes-7.9.html">7.9 release notes</A>
-+<LI><A HREF="relnotes-7.8.3.html">7.8.3 release notes</A>
- <LI><A HREF="relnotes-7.8.2.html">7.8.2 release notes</A>
- <LI><A HREF="relnotes-7.8.1.html">7.8.1 release notes</A>
- <LI><A HREF="relnotes-7.8.html">7.8 release notes</A>
-diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c
-index 9c4ff56..4a6506c 100644
---- a/src/egl/drivers/dri2/egl_dri2.c
-+++ b/src/egl/drivers/dri2/egl_dri2.c
-@@ -741,7 +741,7 @@ dri2_create_screen(_EGLDisplay *disp)
- if (dri2_dpy->dri2->base.version >= 2)
- api_mask = dri2_dpy->dri2->getAPIMask(dri2_dpy->dri_screen);
- else
-- api_mask = __DRI_API_OPENGL;
-+ api_mask = 1 << __DRI_API_OPENGL;
-
- disp->ClientAPIsMask = 0;
- if (api_mask & (1 <<__DRI_API_OPENGL))
-diff --git a/src/egl/main/eglcontext.c b/src/egl/main/eglcontext.c
-index bc22913..763b1b3 100644
---- a/src/egl/main/eglcontext.c
-+++ b/src/egl/main/eglcontext.c
-@@ -272,10 +272,6 @@ _eglCheckMakeCurrent(_EGLContext *ctx, _EGLSurface *draw, _EGLSurface *read)
- if (!surfaceless && (draw == NULL || read == NULL))
- return _eglError(EGL_BAD_MATCH, "eglMakeCurrent");
-
-- /* context stealing from another thread is not allowed */
-- if (ctx->Binding && ctx->Binding != t)
-- return _eglError(EGL_BAD_ACCESS, "eglMakeCurrent");
--
- /*
- * The spec says
- *
-@@ -283,16 +279,23 @@ _eglCheckMakeCurrent(_EGLContext *ctx, _EGLSurface *draw, _EGLSurface *read)
- * bound to contexts in another thread, an EGL_BAD_ACCESS error is
- * generated."
- *
-- * But it also says
-+ * and
- *
- * "at most one context may be bound to a particular surface at a given
- * time"
-- *
-- * The latter is more restrictive so we can check only the latter case.
- */
-- if ((draw && draw->CurrentContext && draw->CurrentContext != ctx) ||
-- (read && read->CurrentContext && read->CurrentContext != ctx))
-+ if (ctx->Binding && ctx->Binding != t)
- return _eglError(EGL_BAD_ACCESS, "eglMakeCurrent");
-+ if (draw && draw->CurrentContext && draw->CurrentContext != ctx) {
-+ if (draw->CurrentContext->Binding != t ||
-+ draw->CurrentContext->ClientAPI != ctx->ClientAPI)
-+ return _eglError(EGL_BAD_ACCESS, "eglMakeCurrent");
-+ }
-+ if (read && read->CurrentContext && read->CurrentContext != ctx) {
-+ if (read->CurrentContext->Binding != t ||
-+ read->CurrentContext->ClientAPI != ctx->ClientAPI)
-+ return _eglError(EGL_BAD_ACCESS, "eglMakeCurrent");
-+ }
-
- /* simply require the configs to be equal */
- if ((draw && draw->Config != ctx->Config) ||
-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 c0164da..3bde397 100644
---- a/src/gallium/state_trackers/egl/common/egl_g3d_api.c
-+++ b/src/gallium/state_trackers/egl/common/egl_g3d_api.c
-@@ -609,8 +609,10 @@ egl_g3d_wait_client(_EGLDriver *drv, _EGLDisplay *dpy, _EGLContext *ctx)
-
- gctx->stctxi->flush(gctx->stctxi,
- PIPE_FLUSH_RENDER_CACHE | PIPE_FLUSH_FRAME, &fence);
-- screen->fence_finish(screen, fence, 0);
-- screen->fence_reference(screen, &fence, NULL);
-+ if (fence) {
-+ screen->fence_finish(screen, fence, 0);
-+ screen->fence_reference(screen, &fence, NULL);
-+ }
-
- return EGL_TRUE;
- }
-diff --git a/src/gallium/state_trackers/vega/api_context.c b/src/gallium/state_trackers/vega/api_context.c
-index 0d04d8e..d6bbda5 100644
---- a/src/gallium/state_trackers/vega/api_context.c
-+++ b/src/gallium/state_trackers/vega/api_context.c
-@@ -73,7 +73,8 @@ void vegaFinish(void)
- pipe = ctx->pipe;
-
- pipe->flush(pipe, PIPE_FLUSH_RENDER_CACHE | PIPE_FLUSH_FRAME, &fence);
--
-- pipe->screen->fence_finish(pipe->screen, fence, 0);
-- pipe->screen->fence_reference(pipe->screen, &fence, NULL);
-+ if (fence) {
-+ pipe->screen->fence_finish(pipe->screen, fence, 0);
-+ pipe->screen->fence_reference(pipe->screen, &fence, NULL);
-+ }
- }
-diff --git a/src/gallium/state_trackers/vega/vg_manager.c b/src/gallium/state_trackers/vega/vg_manager.c
-index e799674..232deef 100644
---- a/src/gallium/state_trackers/vega/vg_manager.c
-+++ b/src/gallium/state_trackers/vega/vg_manager.c
-@@ -352,7 +352,7 @@ vg_api_create_context(struct st_api *stapi, struct st_manager *smapi,
- return NULL;
-
- /* only 1.0 is supported */
-- if (attribs->major != 1 || attribs->minor > 0)
-+ if (attribs->major > 1 || (attribs->major == 1 && attribs->minor > 0))
- return NULL;
-
- pipe = smapi->screen->context_create(smapi->screen, NULL);
-diff --git a/src/gallium/state_trackers/xorg/Makefile b/src/gallium/state_trackers/xorg/Makefile
-index cb2c3ae..7a44d28 100644
---- a/src/gallium/state_trackers/xorg/Makefile
-+++ b/src/gallium/state_trackers/xorg/Makefile
-@@ -10,7 +10,7 @@ LIBRARY_INCLUDES = \
- $(shell pkg-config libkms --atleast-version=1.0 \
- && echo "-DHAVE_LIBKMS") \
- $(shell pkg-config libkms --silence-errors --cflags-only-I) \
-- $(shell pkg-config --cflags-only-I pixman-1 xorg-server libdrm xproto) \
-+ $(shell pkg-config --cflags-only-I pixman-1 xorg-server libdrm xproto dri2proto) \
- -I$(TOP)/src/gallium/include \
- -I$(TOP)/src/gallium/auxiliary \
- -I$(TOP)/include \
-diff --git a/src/gallium/state_trackers/xorg/xorg_crtc.c b/src/gallium/state_trackers/xorg/xorg_crtc.c
-index 26a907f..80af82d 100644
---- a/src/gallium/state_trackers/xorg/xorg_crtc.c
-+++ b/src/gallium/state_trackers/xorg/xorg_crtc.c
-@@ -234,6 +234,10 @@ crtc_load_cursor_argb_ga3d(xf86CrtcPtr crtc, CARD32 * image)
- 64, 64, (void*)image, 64 * 4, 0, 0);
- ms->ctx->transfer_unmap(ms->ctx, transfer);
- ms->ctx->transfer_destroy(ms->ctx, transfer);
-+
-+ if (crtc->cursor_shown)
-+ drmModeSetCursor(ms->fd, crtcp->drm_crtc->crtc_id,
-+ crtcp->cursor_handle, 64, 64);
- }
-
- #if HAVE_LIBKMS
-@@ -271,6 +275,10 @@ crtc_load_cursor_argb_kms(xf86CrtcPtr crtc, CARD32 * image)
- memcpy(ptr, image, 64*64*4);
- kms_bo_unmap(crtcp->cursor_bo);
-
-+ if (crtc->cursor_shown)
-+ drmModeSetCursor(ms->fd, crtcp->drm_crtc->crtc_id,
-+ crtcp->cursor_handle, 64, 64);
-+
- return;
-
- err_bo_destroy:
-@@ -353,7 +361,7 @@ crtc_destroy(xf86CrtcPtr crtc)
-
- drmModeFreeCrtc(crtcp->drm_crtc);
-
-- xfree(crtcp);
-+ free(crtcp);
- crtc->driver_private = NULL;
- }
-
-@@ -401,7 +409,7 @@ xorg_crtc_init(ScrnInfoPtr pScrn)
- if (crtc == NULL)
- goto out;
-
-- crtcp = xcalloc(1, sizeof(struct crtc_private));
-+ crtcp = calloc(1, sizeof(struct crtc_private));
- if (!crtcp) {
- xf86CrtcDestroy(crtc);
- goto out;
-diff --git a/src/gallium/state_trackers/xorg/xorg_dri2.c b/src/gallium/state_trackers/xorg/xorg_dri2.c
-index 704aed6..b723a8e 100644
---- a/src/gallium/state_trackers/xorg/xorg_dri2.c
-+++ b/src/gallium/state_trackers/xorg/xorg_dri2.c
-@@ -201,11 +201,11 @@ dri2_create_buffer(DrawablePtr pDraw, unsigned int attachment, unsigned int form
- DRI2Buffer2Ptr buffer;
- BufferPrivatePtr private;
-
-- buffer = xcalloc(1, sizeof *buffer);
-+ buffer = calloc(1, sizeof *buffer);
- if (!buffer)
- return NULL;
-
-- private = xcalloc(1, sizeof *private);
-+ private = calloc(1, sizeof *private);
- if (!private) {
- goto fail;
- }
-@@ -217,9 +217,9 @@ dri2_create_buffer(DrawablePtr pDraw, unsigned int attachment, unsigned int form
- if (dri2_do_create_buffer(pDraw, (DRI2BufferPtr)buffer, format))
- return buffer;
-
-- xfree(private);
-+ free(private);
- fail:
-- xfree(buffer);
-+ free(buffer);
- return NULL;
- }
-
-@@ -229,8 +229,8 @@ dri2_destroy_buffer(DrawablePtr pDraw, DRI2Buffer2Ptr buffer)
- /* So far it is safe to downcast a DRI2Buffer2Ptr to DRI2BufferPtr */
- dri2_do_destroy_buffer(pDraw, (DRI2BufferPtr)buffer);
-
-- xfree(buffer->driverPrivate);
-- xfree(buffer);
-+ free(buffer->driverPrivate);
-+ free(buffer);
- }
-
- #endif /* DRI2INFOREC_VERSION >= 2 */
-@@ -244,11 +244,11 @@ dri2_create_buffers(DrawablePtr pDraw, unsigned int *attachments, int count)
- DRI2BufferPtr buffers;
- int i;
-
-- buffers = xcalloc(count, sizeof *buffers);
-+ buffers = calloc(count, sizeof *buffers);
- if (!buffers)
- goto fail_buffers;
-
-- privates = xcalloc(count, sizeof *privates);
-+ privates = calloc(count, sizeof *privates);
- if (!privates)
- goto fail_privates;
-
-@@ -263,9 +263,9 @@ dri2_create_buffers(DrawablePtr pDraw, unsigned int *attachments, int count)
- return buffers;
-
- fail:
-- xfree(privates);
-+ free(privates);
- fail_privates:
-- xfree(buffers);
-+ free(buffers);
- fail_buffers:
- return NULL;
- }
-@@ -280,8 +280,8 @@ dri2_destroy_buffers(DrawablePtr pDraw, DRI2BufferPtr buffers, int count)
- }
-
- if (buffers) {
-- xfree(buffers[0].driverPrivate);
-- xfree(buffers);
-+ free(buffers[0].driverPrivate);
-+ free(buffers);
- }
- }
-
-diff --git a/src/gallium/state_trackers/xorg/xorg_driver.c b/src/gallium/state_trackers/xorg/xorg_driver.c
-index e10ff2f..1ec772d 100644
---- a/src/gallium/state_trackers/xorg/xorg_driver.c
-+++ b/src/gallium/state_trackers/xorg/xorg_driver.c
-@@ -45,6 +45,7 @@
- #include "miscstruct.h"
- #include "dixstruct.h"
- #include "xf86xv.h"
-+#include "xorgVersion.h"
- #ifndef XSERVER_LIBPCIACCESS
- #error "libpciaccess needed"
- #endif
-@@ -122,7 +123,7 @@ xorg_tracker_set_functions(ScrnInfoPtr scrn)
- Bool
- xorg_tracker_have_modesetting(ScrnInfoPtr pScrn, struct pci_device *device)
+diff --git a/src/gallium/drivers/i915/i915_state_dynamic.c b/src/gallium/drivers/i915/i915_state_dynamic.c
+index 204cee6..1a21433 100644
+--- a/src/gallium/drivers/i915/i915_state_dynamic.c
++++ b/src/gallium/drivers/i915/i915_state_dynamic.c
+@@ -268,8 +268,8 @@ static void upload_SCISSOR_RECT(struct i915_context *i915)
{
-- char *BusID = xalloc(64);
-+ char *BusID = malloc(64);
- sprintf(BusID, "pci:%04x:%02x:%02x.%d",
- device->domain, device->bus,
- device->dev, device->func);
-@@ -130,14 +131,14 @@ xorg_tracker_have_modesetting(ScrnInfoPtr pScrn, struct pci_device *device)
- if (drmCheckModesettingSupported(BusID)) {
- xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 0,
- "Drm modesetting not supported %s\n", BusID);
-- xfree(BusID);
-+ free(BusID);
- return FALSE;
- }
-
- xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 0,
- "Drm modesetting supported on %s\n", BusID);
-
-- xfree(BusID);
-+ free(BusID);
- return TRUE;
- }
-
-@@ -174,7 +175,7 @@ drv_free_rec(ScrnInfoPtr pScrn)
- if (!pScrn->driverPrivate)
- return;
-
-- xfree(pScrn->driverPrivate);
-+ free(pScrn->driverPrivate);
-
- pScrn->driverPrivate = NULL;
- }
-@@ -274,7 +275,7 @@ drv_init_drm(ScrnInfoPtr pScrn)
- if (ms->fd < 0) {
- char *BusID;
-
-- BusID = xalloc(64);
-+ BusID = malloc(64);
- sprintf(BusID, "PCI:%d:%d:%d",
- ((ms->PciInfo->domain << 8) | ms->PciInfo->bus),
- ms->PciInfo->dev, ms->PciInfo->func
-@@ -283,7 +284,7 @@ drv_init_drm(ScrnInfoPtr pScrn)
-
- ms->fd = drmOpen(driver_descriptor.driver_name, BusID);
- ms->isMaster = TRUE;
-- xfree(BusID);
-+ free(BusID);
-
- if (ms->fd >= 0)
- return TRUE;
-@@ -369,6 +370,7 @@ drv_pre_init(ScrnInfoPtr pScrn, int flags)
- ms = modesettingPTR(pScrn);
- ms->pEnt = pEnt;
- ms->cust = cust;
-+ ms->fb_id = -1;
-
- pScrn->displayWidth = 640; /* default it */
-
-@@ -402,19 +404,6 @@ drv_pre_init(ScrnInfoPtr pScrn, int flags)
- if (!drv_init_drm(pScrn))
- return FALSE;
-
-- use3D = cust ? !cust->no_3d : TRUE;
-- ms->from_3D = xf86GetOptValBool(ms->Options, OPTION_3D_ACCEL,
-- &use3D) ?
-- X_CONFIG : X_PROBED;
--
-- ms->no3D = !use3D;
--
-- if (!drv_init_resource_management(pScrn)) {
-- xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Could not init "
-- "Gallium3D or libKMS.");
-- return FALSE;
-- }
--
- pScrn->monitor = pScrn->confScreen->monitor;
- pScrn->progClock = TRUE;
- pScrn->rgbBits = 8;
-@@ -444,11 +433,24 @@ drv_pre_init(ScrnInfoPtr pScrn, int flags)
-
- /* Process the options */
- xf86CollectOptions(pScrn, NULL);
-- if (!(ms->Options = xalloc(sizeof(drv_options))))
-+ if (!(ms->Options = malloc(sizeof(drv_options))))
- return FALSE;
- memcpy(ms->Options, drv_options, sizeof(drv_options));
- xf86ProcessOptions(pScrn->scrnIndex, pScrn->options, ms->Options);
-
-+ use3D = cust ? !cust->no_3d : TRUE;
-+ ms->from_3D = xf86GetOptValBool(ms->Options, OPTION_3D_ACCEL,
-+ &use3D) ?
-+ X_CONFIG : X_PROBED;
-+
-+ ms->no3D = !use3D;
-+
-+ if (!drv_init_resource_management(pScrn)) {
-+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Could not init "
-+ "Gallium3D or libKMS.");
-+ return FALSE;
-+ }
-+
- /* Allocate an xf86CrtcConfig */
- xf86CrtcConfigInit(pScrn, &crtc_config_funcs);
- xf86_config = XF86_CRTC_CONFIG_PTR(pScrn);
-@@ -791,7 +793,9 @@ drv_screen_init(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
- if (!ms->SWCursor)
- xf86_cursors_init(pScreen, 64, 64,
- HARDWARE_CURSOR_SOURCE_MASK_INTERLEAVE_64 |
-- HARDWARE_CURSOR_ARGB);
-+ HARDWARE_CURSOR_ARGB |
-+ ((cust && cust->unhidden_hw_cursor_update) ?
-+ HARDWARE_CURSOR_UPDATE_UNHIDDEN : 0));
-
- /* Must force it before EnterVT, so we are in control of VT and
- * later memory should be bound when allocating, e.g rotate_mem */
-@@ -862,8 +866,10 @@ drv_leave_vt(int scrnIndex, int flags)
- }
+ unsigned x1 = i915->scissor.minx;
+ unsigned y1 = i915->scissor.miny;
+- unsigned x2 = i915->scissor.maxx;
+- unsigned y2 = i915->scissor.maxy;
++ unsigned x2 = i915->scissor.maxx - 1;
++ unsigned y2 = i915->scissor.maxy - 1;
+ unsigned sc[3];
+
+ sc[0] = _3DSTATE_SCISSOR_RECT_0_CMD;
+diff --git a/src/gallium/drivers/r300/r300_emit.c b/src/gallium/drivers/r300/r300_emit.c
+index d214af4..09ce470 100644
+--- a/src/gallium/drivers/r300/r300_emit.c
++++ b/src/gallium/drivers/r300/r300_emit.c
+@@ -1237,13 +1237,12 @@ validate:
+ r300->rws->cs_add_reloc(r300->cs, r300_resource(index_buffer)->cs_buf,
+ r300_resource(index_buffer)->domain, 0);
+
+- /* Now do the validation. */
++ /* Now do the validation (flush is called inside cs_validate on failure). */
+ if (!r300->rws->cs_validate(r300->cs)) {
+ /* Ooops, an infinite loop, give up. */
+ if (flushed)
+ return FALSE;
+
+- r300_flush(&r300->context, RADEON_FLUSH_ASYNC, NULL);
+ flushed = TRUE;
+ goto validate;
}
-
-- drmModeRmFB(ms->fd, ms->fb_id);
-- ms->fb_id = -1;
-+ if (ms->fb_id != -1) {
-+ drmModeRmFB(ms->fd, ms->fb_id);
-+ ms->fb_id = -1;
-+ }
-
- /* idle hardware */
- if (!ms->kms)
-@@ -944,7 +950,6 @@ drv_close_screen(int scrnIndex, ScreenPtr pScreen)
+diff --git a/src/gallium/winsys/radeon/drm/radeon_drm_cs.c b/src/gallium/winsys/radeon/drm/radeon_drm_cs.c
+index 0139de1..1dcc7e1 100644
+--- a/src/gallium/winsys/radeon/drm/radeon_drm_cs.c
++++ b/src/gallium/winsys/radeon/drm/radeon_drm_cs.c
+@@ -115,6 +115,7 @@ static void radeon_cs_context_cleanup(struct radeon_cs_context *csc)
}
- #endif
-
-- drmModeRmFB(ms->fd, ms->fb_id);
- ms->destroy_front_buffer(pScrn);
-
- if (ms->exa)
-@@ -1178,6 +1183,8 @@ drv_bind_front_buffer_kms(ScrnInfoPtr pScrn)
- stride,
- ptr);
-
-+#if (XORG_VERSION_CURRENT < XORG_VERSION_NUMERIC(1, 9, 99, 1, 0))
-+
- /* This a hack to work around EnableDisableFBAccess setting the pointer
- * the real fix would be to replace pScrn->EnableDisableFBAccess hook
- * and set the rootPixmap->devPrivate.ptr to something valid before that.
-@@ -1187,6 +1194,8 @@ drv_bind_front_buffer_kms(ScrnInfoPtr pScrn)
- */
- pScrn->pixmapPrivate.ptr = ptr;
-
-+#endif
-+
- return TRUE;
-
- err_destroy:
-diff --git a/src/gallium/state_trackers/xorg/xorg_exa.c b/src/gallium/state_trackers/xorg/xorg_exa.c
-index 6b2c80f..0e5693d 100644
---- a/src/gallium/state_trackers/xorg/xorg_exa.c
-+++ b/src/gallium/state_trackers/xorg/xorg_exa.c
-@@ -720,7 +720,7 @@ ExaCreatePixmap(ScreenPtr pScreen, int size, int align)
- {
- struct exa_pixmap_priv *priv;
-
-- priv = xcalloc(1, sizeof(struct exa_pixmap_priv));
-+ priv = calloc(1, sizeof(struct exa_pixmap_priv));
- if (!priv)
- return NULL;
-
-@@ -737,7 +737,7 @@ ExaDestroyPixmap(ScreenPtr pScreen, void *dPriv)
-
- pipe_resource_reference(&priv->tex, NULL);
-
-- xfree(priv);
-+ free(priv);
- }
-
- static Bool
-@@ -975,7 +975,7 @@ xorg_exa_close(ScrnInfoPtr pScrn)
- ms->ctx = NULL;
-
- exaDriverFini(pScrn->pScreen);
-- xfree(exa);
-+ free(exa);
- ms->exa = NULL;
- }
-
-@@ -987,7 +987,7 @@ xorg_exa_init(ScrnInfoPtr pScrn, Bool accel)
- ExaDriverPtr pExa;
- CustomizerPtr cust = ms->cust;
-- exa = xcalloc(1, sizeof(struct exa_context));
-+ exa = calloc(1, sizeof(struct exa_context));
- if (!exa)
- return NULL;
-
-diff --git a/src/gallium/state_trackers/xorg/xorg_output.c b/src/gallium/state_trackers/xorg/xorg_output.c
-index 61206ed..5555b51 100644
---- a/src/gallium/state_trackers/xorg/xorg_output.c
-+++ b/src/gallium/state_trackers/xorg/xorg_output.c
-@@ -128,7 +128,7 @@ output_get_modes(xf86OutputPtr output)
- for (i = 0; i < drm_connector->count_modes; i++) {
- drm_mode = &drm_connector->modes[i];
- if (drm_mode) {
-- mode = xcalloc(1, sizeof(DisplayModeRec));
-+ mode = calloc(1, sizeof(DisplayModeRec));
- if (!mode)
- continue;
- mode->Clock = drm_mode->clock;
-@@ -195,7 +195,7 @@ output_destroy(xf86OutputPtr output)
+ csc->crelocs = 0;
++ csc->validated_crelocs = 0;
+ csc->chunks[0].length_dw = 0;
+ csc->chunks[1].length_dw = 0;
+ csc->used_gart = 0;
+@@ -307,9 +308,37 @@ static void radeon_drm_cs_add_reloc(struct radeon_winsys_cs *rcs,
+ static boolean radeon_drm_cs_validate(struct radeon_winsys_cs *rcs)
{
- struct output_private *priv = output->driver_private;
- drmModeFreeConnector(priv->drm_connector);
-- xfree(priv);
-+ free(priv);
- output->driver_private = NULL;
- }
-
-@@ -262,14 +262,14 @@ xorg_output_init(ScrnInfoPtr pScrn)
- drm_connector->connector_type_id);
-
-
-- priv = xcalloc(sizeof(*priv), 1);
-+ priv = calloc(sizeof(*priv), 1);
- if (!priv) {
- continue;
- }
-
- output = xf86OutputCreate(pScrn, &output_funcs, name);
- if (!output) {
-- xfree(priv);
-+ free(priv);
- continue;
- }
-
-diff --git a/src/gallium/state_trackers/xorg/xorg_tracker.h b/src/gallium/state_trackers/xorg/xorg_tracker.h
-index be1a9fd..a3fb5e5 100644
---- a/src/gallium/state_trackers/xorg/xorg_tracker.h
-+++ b/src/gallium/state_trackers/xorg/xorg_tracker.h
-@@ -76,6 +76,7 @@ typedef struct _CustomizerRec
- Bool dirty_throttling;
- Bool swap_throttling;
- Bool no_3d;
-+ Bool unhidden_hw_cursor_update;
- Bool (*winsys_pre_init) (struct _CustomizerRec *cust, int fd);
- Bool (*winsys_screen_init)(struct _CustomizerRec *cust);
- Bool (*winsys_screen_close)(struct _CustomizerRec *cust);
-diff --git a/src/gallium/state_trackers/xorg/xorg_xv.c b/src/gallium/state_trackers/xorg/xorg_xv.c
-index f98bd93..f64959f 100644
---- a/src/gallium/state_trackers/xorg/xorg_xv.c
-+++ b/src/gallium/state_trackers/xorg/xorg_xv.c
-@@ -536,8 +536,10 @@ display_video(ScrnInfoPtr pScrn, struct xorg_xv_port_priv *pPriv, int id,
- dst_surf = xorg_gpu_surface(pPriv->r->pipe->screen, dst);
- hdtv = ((src_w >= RES_720P_X) && (src_h >= RES_720P_Y));
-
-+#ifdef COMPOSITE
- REGION_TRANSLATE(pScrn->pScreen, dstRegion, -pPixmap->screen_x,
- -pPixmap->screen_y);
-+#endif
-
- dxo = dstRegion->extents.x1;
- dyo = dstRegion->extents.y1;
-@@ -562,11 +564,16 @@ display_video(ScrnInfoPtr pScrn, struct xorg_xv_port_priv *pPriv, int id,
- int box_y2 = pbox->y2;
- float diff_x = (float)src_w / (float)dst_w;
- float diff_y = (float)src_h / (float)dst_h;
-- float offset_x = box_x1 - dstX + pPixmap->screen_x;
-- float offset_y = box_y1 - dstY + pPixmap->screen_y;
-+ float offset_x = box_x1 - dstX;
-+ float offset_y = box_y1 - dstY;
- float offset_w;
- float offset_h;
-
-+#ifdef COMPOSITE
-+ offset_x += pPixmap->screen_x;
-+ offset_y += pPixmap->screen_y;
-+#endif
-+
- x = box_x1;
- y = box_y1;
- w = box_x2 - box_x1;
-diff --git a/src/gallium/targets/Makefile.xorg b/src/gallium/targets/Makefile.xorg
-index 762c905..87eedd7 100644
---- a/src/gallium/targets/Makefile.xorg
-+++ b/src/gallium/targets/Makefile.xorg
-@@ -29,7 +29,7 @@ INCLUDES = \
- LIBNAME_STAGING = $(TOP)/$(LIB_DIR)/gallium/$(TARGET)
-
- ifeq ($(MESA_LLVM),1)
--LD = g++
-+LD = $(CXX)
- LDFLAGS += $(LLVM_LDFLAGS)
- USE_CXX=1
- DRIVER_PIPES += $(TOP)/src/gallium/drivers/llvmpipe/libllvmpipe.a
-@@ -42,7 +42,7 @@ endif
- default: depend $(TOP)/$(LIB_DIR)/gallium $(LIBNAME) $(LIBNAME_STAGING)
-
- $(LIBNAME): $(OBJECTS) Makefile ../Makefile.xorg $(LIBS) $(DRIVER_PIPES)
-- $(MKLIB) -noprefix -o $@ $(LDFLAGS) $(OBJECTS) $(DRIVER_PIPES) $(GALLIUM_AUXILIARIES) $(DRIVER_LINKS)
-+ $(MKLIB) -linker $(CC) -noprefix -o $@ $(LDFLAGS) $(OBJECTS) $(DRIVER_PIPES) $(GALLIUM_AUXILIARIES) $(DRIVER_LINKS)
-
- depend: $(C_SOURCES) $(CPP_SOURCES) $(ASM_SOURCES) $(SYMLINKS) $(GENERATED_SOURCES)
- rm -f depend
-diff --git a/src/gallium/targets/egl/Makefile b/src/gallium/targets/egl/Makefile
-index 47c24ce..38e60db 100644
---- a/src/gallium/targets/egl/Makefile
-+++ b/src/gallium/targets/egl/Makefile
-@@ -24,7 +24,9 @@ common_CPPFLAGS := \
- -I$(TOP)/src/gallium/auxiliary \
- -I$(TOP)/src/gallium/drivers \
- -I$(TOP)/src/gallium/include \
-- -I$(TOP)/src/gallium/winsys
-+ -I$(TOP)/src/gallium/winsys \
-+ $(LIBDRM_CFLAGS)
-+
- common_SYS :=
- common_LIBS := \
- $(TOP)/src/gallium/drivers/identity/libidentity.a \
-@@ -41,11 +43,11 @@ egl_SYS := -lm $(DLOPEN_LIBS) -L$(TOP)/$(LIB_DIR) -lEGL
- egl_LIBS := $(TOP)/src/gallium/state_trackers/egl/libegl.a
-
- ifneq ($(findstring x11, $(EGL_PLATFORMS)),)
--egl_SYS += -lX11 -lXext -lXfixes
-+egl_SYS += -lX11 -lXext -lXfixes $(LIBDRM_LIB)
- egl_LIBS += $(TOP)/src/gallium/winsys/sw/xlib/libws_xlib.a
- endif
--ifneq ($(findstring kms, $(EGL_PLATFORMS)),)
--egl_SYS += -ldrm
-+ifneq ($(findstring drm, $(EGL_PLATFORMS)),)
-+egl_SYS += $(LIBDRM_LIB)
- endif
- ifneq ($(findstring fbdev, $(EGL_PLATFORMS)),)
- egl_LIBS += $(TOP)/src/gallium/winsys/sw/fbdev/libfbdev.a
-diff --git a/src/gallium/targets/egl/pipe_i965.c b/src/gallium/targets/egl/pipe_i965.c
-index 43bf646..36b03b3 100644
---- a/src/gallium/targets/egl/pipe_i965.c
-+++ b/src/gallium/targets/egl/pipe_i965.c
-@@ -1,6 +1,7 @@
-
- #include "target-helpers/inline_wrapper_sw_helper.h"
- #include "target-helpers/inline_debug_helper.h"
-+#include "target-helpers/inline_wrapper_sw_helper.h"
- #include "state_tracker/drm_driver.h"
- #include "i965/drm/i965_drm_public.h"
- #include "i965/brw_public.h"
-diff --git a/src/gallium/targets/xorg-vmwgfx/vmw_ctrl.c b/src/gallium/targets/xorg-vmwgfx/vmw_ctrl.c
-index 237b308..9b422e6 100644
---- a/src/gallium/targets/xorg-vmwgfx/vmw_ctrl.c
-+++ b/src/gallium/targets/xorg-vmwgfx/vmw_ctrl.c
-@@ -32,6 +32,7 @@
- * allows X clients to communicate with the driver.
- */
-
-+#include <xorg-server.h>
- #include "dixstruct.h"
- #include "extnsionst.h"
- #include <X11/X.h>
-@@ -211,7 +212,7 @@ VMwareCtrlDoSetTopology(ScrnInfoPtr pScrn,
- struct vmw_customizer *vmw = vmw_customizer(xorg_customizer(pScrn));
- int i;
-
-- rects = xcalloc(number, sizeof(*rects));
-+ rects = calloc(number, sizeof(*rects));
- if (!rects)
- return FALSE;
-
-@@ -224,7 +225,7 @@ VMwareCtrlDoSetTopology(ScrnInfoPtr pScrn,
-
- vmw_ioctl_update_layout(vmw, number, rects);
-
-- xfree(rects);
-+ free(rects);
- return TRUE;
+ struct radeon_drm_cs *cs = radeon_drm_cs(rcs);
++ boolean status =
++ cs->csc->used_gart < cs->ws->gart_size * 0.8 &&
++ cs->csc->used_vram < cs->ws->vram_size * 0.8;
+
+- return cs->csc->used_gart < cs->ws->gart_size * 0.8 &&
+- cs->csc->used_vram < cs->ws->vram_size * 0.8;
++ if (status) {
++ cs->csc->validated_crelocs = cs->csc->crelocs;
++ } else {
++ /* Remove lately-added relocations. The validation failed with them
++ * and the CS is about to be flushed because of that. Keep only
++ * the already-validated relocations. */
++ unsigned i;
++
++ for (i = cs->csc->validated_crelocs; i < cs->csc->crelocs; i++) {
++ p_atomic_dec(&cs->csc->relocs_bo[i]->num_cs_references);
++ radeon_bo_reference(&cs->csc->relocs_bo[i], NULL);
++ }
++ cs->csc->crelocs = cs->csc->validated_crelocs;
++
++ /* Flush if there are any relocs. Clean up otherwise. */
++ if (cs->csc->crelocs) {
++ cs->flush_cs(cs->flush_data, RADEON_FLUSH_ASYNC);
++ } else {
++ radeon_cs_context_cleanup(cs->csc);
++
++ assert(cs->base.cdw == 0);
++ if (cs->base.cdw != 0) {
++ fprintf(stderr, "radeon: Unexpected error in %s.\n", __func__);
++ }
++ }
++ }
++ return status;
}
-diff --git a/src/gallium/targets/xorg-vmwgfx/vmw_ioctl.c b/src/gallium/targets/xorg-vmwgfx/vmw_ioctl.c
-index 7c799b5..7625d2f 100644
---- a/src/gallium/targets/xorg-vmwgfx/vmw_ioctl.c
-+++ b/src/gallium/targets/xorg-vmwgfx/vmw_ioctl.c
-@@ -165,7 +165,7 @@ vmw_ioctl_buffer_create(struct vmw_customizer *vmw, uint32_t size, unsigned *han
- struct drm_vmw_dmabuf_rep *rep = &arg.rep;
- int ret;
-
-- buf = xcalloc(1, sizeof(*buf));
-+ buf = calloc(1, sizeof(*buf));
- if (!buf)
- goto err;
-
-@@ -192,7 +192,7 @@ vmw_ioctl_buffer_create(struct vmw_customizer *vmw, uint32_t size, unsigned *han
- return buf;
-
- err_free:
-- xfree(buf);
-+ free(buf);
- err:
- return NULL;
+ static void radeon_drm_cs_write_reloc(struct radeon_winsys_cs *rcs,
+diff --git a/src/gallium/winsys/radeon/drm/radeon_drm_cs.h b/src/gallium/winsys/radeon/drm/radeon_drm_cs.h
+index 339beed..fc51f45 100644
+--- a/src/gallium/winsys/radeon/drm/radeon_drm_cs.h
++++ b/src/gallium/winsys/radeon/drm/radeon_drm_cs.h
+@@ -41,6 +41,7 @@ struct radeon_cs_context {
+ /* Relocs. */
+ unsigned nrelocs;
+ unsigned crelocs;
++ unsigned validated_crelocs;
+ struct radeon_bo **relocs_bo;
+ struct drm_radeon_cs_reloc *relocs;
+
+diff --git a/src/gallium/winsys/radeon/drm/radeon_winsys.h b/src/gallium/winsys/radeon/drm/radeon_winsys.h
+index 3a64e4a..41c26c6 100644
+--- a/src/gallium/winsys/radeon/drm/radeon_winsys.h
++++ b/src/gallium/winsys/radeon/drm/radeon_winsys.h
+@@ -271,7 +271,9 @@ struct radeon_winsys {
+
+ /**
+ * Return TRUE if there is enough memory in VRAM and GTT for the relocs
+- * added so far.
++ * added so far. If the validation fails, all the relocations which have
++ * been added since the last call of cs_validate will be removed and
++ * the CS will be flushed (provided there are still any relocations).
+ *
+ * \param cs A command stream to validate.
+ */
+diff --git a/src/glx/drisw_glx.c b/src/glx/drisw_glx.c
+index 07d4955..a57b327 100644
+--- a/src/glx/drisw_glx.c
++++ b/src/glx/drisw_glx.c
+@@ -100,6 +100,13 @@ XCreateDrawable(struct drisw_drawable * pdp,
+ 32, /* bitmap_pad */
+ 0); /* bytes_per_line */
+
++ /**
++ * swrast does not handle 24-bit depth with 24 bpp, so let X do the
++ * the conversion for us.
++ */
++ if (pdp->ximage->bits_per_pixel == 24)
++ pdp->ximage->bits_per_pixel = 32;
++
+ return True;
}
-@@ -211,7 +211,7 @@ vmw_ioctl_buffer_destroy(struct vmw_customizer *vmw, struct vmw_dma_buffer *buf)
- arg.handle = buf->handle;
- drmCommandWrite(vmw->fd, DRM_VMW_UNREF_DMABUF, &arg, sizeof(arg));
-
-- xfree(buf);
-+ free(buf);
- }
-
- void *
-diff --git a/src/gallium/targets/xorg-vmwgfx/vmw_screen.c b/src/gallium/targets/xorg-vmwgfx/vmw_screen.c
-index 8173908..7662203 100644
---- a/src/gallium/targets/xorg-vmwgfx/vmw_screen.c
-+++ b/src/gallium/targets/xorg-vmwgfx/vmw_screen.c
-@@ -245,6 +245,7 @@ vmw_screen_pre_init(ScrnInfoPtr pScrn, int flags)
- cust->winsys_enter_vt = vmw_screen_enter_vt;
- cust->winsys_leave_vt = vmw_screen_leave_vt;
- cust->no_3d = TRUE;
-+ cust->unhidden_hw_cursor_update = TRUE;
- vmw->pScrn = pScrn;
-
- pScrn->driverPrivate = cust;
-diff --git a/src/gallium/targets/xorg-vmwgfx/vmw_video.c b/src/gallium/targets/xorg-vmwgfx/vmw_video.c
-index eced60d..94465e5 100644
---- a/src/gallium/targets/xorg-vmwgfx/vmw_video.c
-+++ b/src/gallium/targets/xorg-vmwgfx/vmw_video.c
-@@ -300,7 +300,7 @@ vmw_video_init(struct vmw_customizer *vmw)
- numAdaptors = 1;
- overlayAdaptors = &newAdaptor;
- } else {
-- newAdaptors = xalloc((numAdaptors + 1) *
-+ newAdaptors = malloc((numAdaptors + 1) *
- sizeof(XF86VideoAdaptorPtr*));
- if (!newAdaptors) {
- xf86XVFreeVideoAdaptorRec(newAdaptor);
-@@ -320,7 +320,7 @@ vmw_video_init(struct vmw_customizer *vmw)
- }
-
- if (newAdaptors) {
-- xfree(newAdaptors);
-+ free(newAdaptors);
- }
-
- debug_printf("Initialized VMware Xv extension successfully\n");
-@@ -438,7 +438,7 @@ vmw_video_init_adaptor(ScrnInfoPtr pScrn, struct vmw_customizer *vmw)
- return NULL;
- }
-
-- video = xcalloc(1, sizeof(*video));
-+ video = calloc(1, sizeof(*video));
- if (!video) {
- debug_printf("Not enough memory.\n");
- xf86XVFreeVideoAdaptorRec(adaptor);
-@@ -742,7 +742,7 @@ vmw_video_buffer_alloc(struct vmw_customizer *vmw, int size,
- }
-
- out->size = size;
-- out->extra_data = xcalloc(1, size);
-+ out->extra_data = calloc(1, size);
-
- debug_printf("\t\t%s: allocated buffer %p of size %i\n", __func__, out, size);
-
-@@ -773,7 +773,7 @@ vmw_video_buffer_free(struct vmw_customizer *vmw,
- if (out->size == 0)
- return Success;
-
-- xfree(out->extra_data);
-+ free(out->extra_data);
- vmw_ioctl_buffer_unmap(vmw, out->buf);
- vmw_ioctl_buffer_destroy(vmw, out->buf);
-
-diff --git a/src/mesa/Makefile b/src/mesa/Makefile
-index c41c38c..7a6936e 100644
---- a/src/mesa/Makefile
-+++ b/src/mesa/Makefile
-@@ -34,7 +34,7 @@ ES1_CPPFLAGS := -DFEATURE_ES1=1 $(DEFINES)
- ES2_CPPFLAGS := -DFEATURE_ES2=1 $(DEFINES)
-
- # append include dirs
--MESA_CPPFLAGS += $(INCLUDE_DIRS)
-+MESA_CPPFLAGS += $(INCLUDE_DIRS) $(TALLOC_CFLAGS)
- ES1_CPPFLAGS += -I$(TOP)/src/mapi/es1api $(INCLUDE_DIRS)
- ES2_CPPFLAGS += -I$(TOP)/src/mapi/es2api $(INCLUDE_DIRS)
-
-diff --git a/src/mesa/drivers/dri/r200/r200_swtcl.c b/src/mesa/drivers/dri/r200/r200_swtcl.c
-index dbf4ad4..160e7e7 100644
---- a/src/mesa/drivers/dri/r200/r200_swtcl.c
-+++ b/src/mesa/drivers/dri/r200/r200_swtcl.c
-@@ -319,10 +319,9 @@ static INLINE GLuint reduced_hw_prim( GLcontext *ctx, GLuint prim)
- {
- switch (prim) {
- case GL_POINTS:
-- return (ctx->Point.PointSprite ||
-- ((ctx->_TriangleCaps & (DD_POINT_SIZE | DD_POINT_ATTEN)) &&
-- !(ctx->_TriangleCaps & (DD_POINT_SMOOTH)))) ?
-- R200_VF_PRIM_POINT_SPRITES : R200_VF_PRIM_POINTS;
-+ return (((R200_CONTEXT(ctx))->radeon.radeonScreen->drmSupportsPointSprites &&
-+ !(ctx->_TriangleCaps & DD_POINT_SMOOTH)) ?
-+ R200_VF_PRIM_POINT_SPRITES : R200_VF_PRIM_POINTS);
- case GL_LINES:
- /* fallthrough */
- case GL_LINE_LOOP:
-@@ -613,6 +612,9 @@ static void r200RasterPrimitive( GLcontext *ctx, GLuint hwprim )
- r200ContextPtr rmesa = R200_CONTEXT(ctx);
-
- radeon_prepare_render(&rmesa->radeon);
-+ if (rmesa->radeon.NewGLState)
-+ r200ValidateState( ctx );
-+
-
- if (rmesa->radeon.swtcl.hw_primitive != hwprim) {
- /* need to disable perspective-correct texturing for point sprites */
-diff --git a/src/mesa/drivers/dri/r200/r200_tcl.c b/src/mesa/drivers/dri/r200/r200_tcl.c
-index 4ae0f30..2743997 100644
---- a/src/mesa/drivers/dri/r200/r200_tcl.c
-+++ b/src/mesa/drivers/dri/r200/r200_tcl.c
-@@ -68,9 +68,8 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- #define HAVE_ELTS 1
-
-
--#define HW_POINTS ((ctx->Point.PointSprite || \
-- ((ctx->_TriangleCaps & (DD_POINT_SIZE | DD_POINT_ATTEN)) && \
-- !(ctx->_TriangleCaps & (DD_POINT_SMOOTH)))) ? \
-+#define HW_POINTS (((R200_CONTEXT(ctx))->radeon.radeonScreen->drmSupportsPointSprites && \
-+ !(ctx->_TriangleCaps & DD_POINT_SMOOTH)) ? \
- R200_VF_PRIM_POINT_SPRITES : R200_VF_PRIM_POINTS)
- #define HW_LINES R200_VF_PRIM_LINES
- #define HW_LINE_LOOP 0
-@@ -265,6 +264,8 @@ void r200TclPrimitive( GLcontext *ctx,
- GLuint newprim = hw_prim | R200_VF_TCL_OUTPUT_VTX_ENABLE;
-
- radeon_prepare_render(&rmesa->radeon);
-+ if (rmesa->radeon.NewGLState)
-+ r200ValidateState( ctx );
-
- if (newprim != rmesa->tcl.hw_primitive ||
- !discrete_prim[hw_prim&0xf]) {
-diff --git a/src/mesa/drivers/dri/r300/r300_draw.c b/src/mesa/drivers/dri/r300/r300_draw.c
-index 5ae9f49..767778b 100644
---- a/src/mesa/drivers/dri/r300/r300_draw.c
-+++ b/src/mesa/drivers/dri/r300/r300_draw.c
-@@ -717,6 +717,10 @@ static void r300DrawPrims(GLcontext *ctx,
- GLuint max_index)
- {
- GLboolean retval;
-+ struct r300_context *r300 = R300_CONTEXT(ctx);
-+ radeonContextPtr radeon = &r300->radeon;
-+
-+ radeon_prepare_render(radeon);
-
- /* This check should get folded into just the places that
- * min/max index are really needed.
-diff --git a/src/mesa/drivers/dri/r300/r300_render.c b/src/mesa/drivers/dri/r300/r300_render.c
-index cf89ab7..bb8f914 100644
---- a/src/mesa/drivers/dri/r300/r300_render.c
-+++ b/src/mesa/drivers/dri/r300/r300_render.c
-@@ -327,8 +327,6 @@ void r300RunRenderPrimitive(GLcontext * ctx, int start, int end, int prim)
- BATCH_LOCALS(&rmesa->radeon);
- int type, num_verts;
-
-- radeon_prepare_render(&rmesa->radeon);
--
- type = r300PrimitiveType(rmesa, prim);
- num_verts = r300NumVerts(rmesa, end - start, prim);
-
-diff --git a/src/mesa/drivers/dri/r600/evergreen_render.c b/src/mesa/drivers/dri/r600/evergreen_render.c
-index 27089bf..1fa53d7 100644
---- a/src/mesa/drivers/dri/r600/evergreen_render.c
-+++ b/src/mesa/drivers/dri/r600/evergreen_render.c
-@@ -909,6 +909,10 @@ static void evergreenDrawPrims(GLcontext *ctx,
- {
- GLboolean retval = GL_FALSE;
-
-+ context_t *context = EVERGREEN_CONTEXT(ctx);
-+ radeonContextPtr radeon = &context->radeon;
-+ radeon_prepare_render(radeon);
-+
- /* This check should get folded into just the places that
- * min/max index are really needed.
- */
-diff --git a/src/mesa/drivers/dri/radeon/radeon_common_context.c b/src/mesa/drivers/dri/radeon/radeon_common_context.c
-index 85e4988..d4c7864 100644
---- a/src/mesa/drivers/dri/radeon/radeon_common_context.c
-+++ b/src/mesa/drivers/dri/radeon/radeon_common_context.c
-@@ -251,9 +251,9 @@ GLboolean radeonInitContext(radeonContextPtr radeon,
- radeon->texture_rect_row_align = 512;
- radeon->texture_compressed_row_align = 512;
- } else {
-- radeon->texture_row_align = 256;
-- radeon->texture_rect_row_align = 256;
-- radeon->texture_compressed_row_align = 256;
-+ radeon->texture_row_align = radeon->radeonScreen->group_bytes;
-+ radeon->texture_rect_row_align = radeon->radeonScreen->group_bytes;
-+ radeon->texture_compressed_row_align = radeon->radeonScreen->group_bytes;
- }
- } else if (IS_R200_CLASS(radeon->radeonScreen) ||
- IS_R100_CLASS(radeon->radeonScreen)) {
-@@ -521,6 +521,7 @@ void radeon_prepare_render(radeonContextPtr radeon)
- __DRIcontext *driContext = radeon->dri.context;
- __DRIdrawable *drawable;
- __DRIscreen *screen;
-+ struct radeon_framebuffer *draw;
-
- screen = driContext->driScreenPriv;
- if (!screen->dri2.loader)
-@@ -531,9 +532,10 @@ void radeon_prepare_render(radeonContextPtr radeon)
- if (drawable->lastStamp != drawable->dri2.stamp)
- radeon_update_renderbuffers(driContext, drawable, GL_FALSE);
-
-- /* Intel driver does the equivalent of this, no clue if it is needed:
-- * radeon_draw_buffer(radeon->glCtx, &(drawable->driverPrivate)->base);
-- */
-+ /* Intel driver does the equivalent of this, no clue if it is needed:*/
-+ draw = drawable->driverPrivate;
-+ radeon_draw_buffer(radeon->glCtx, &draw->base);
-+
- driContext->dri2.draw_stamp = drawable->dri2.stamp;
- }
-
-@@ -738,10 +740,9 @@ radeon_update_renderbuffers(__DRIcontext *context, __DRIdrawable *drawable,
- buffers[i].flags);
-
- if (bo == NULL) {
--
- fprintf(stderr, "failed to attach %s %d\n",
- regname, buffers[i].name);
--
-+ continue;
- }
-
- ret = radeon_bo_get_tiling(bo, &tiling_flags, &pitch);
-diff --git a/src/mesa/drivers/dri/radeon/radeon_screen.c b/src/mesa/drivers/dri/radeon/radeon_screen.c
-index 2ea77e5..0ca052d 100644
---- a/src/mesa/drivers/dri/radeon/radeon_screen.c
-+++ b/src/mesa/drivers/dri/radeon/radeon_screen.c
-@@ -1138,6 +1138,8 @@ radeonCreateScreen( __DRIscreen *sPriv )
- else
- screen->chip_flags |= RADEON_CLASS_R600;
-
-+ /* set group bytes for r6xx+ */
-+ screen->group_bytes = 256;
- screen->cpp = dri_priv->bpp / 8;
- screen->AGPMode = dri_priv->AGPMode;
-
-@@ -1382,7 +1384,8 @@ radeonCreateScreen2(__DRIscreen *sPriv)
- else
- screen->chip_flags |= RADEON_CLASS_R600;
-
-- /* r6xx+ tiling */
-+ /* r6xx+ tiling, default to 256 group bytes */
-+ screen->group_bytes = 256;
- if (IS_R600_CLASS(screen) && (sPriv->drm_version.minor >= 6)) {
- ret = radeonGetParam(sPriv, RADEON_INFO_TILE_CONFIG, &temp);
- if (ret)
-diff --git a/src/mesa/drivers/dri/radeon/radeon_swtcl.c b/src/mesa/drivers/dri/radeon/radeon_swtcl.c
-index 29defe7..0a81843 100644
---- a/src/mesa/drivers/dri/radeon/radeon_swtcl.c
-+++ b/src/mesa/drivers/dri/radeon/radeon_swtcl.c
-@@ -412,6 +412,8 @@ static GLboolean radeon_run_render( GLcontext *ctx,
- return GL_TRUE;
-
- radeon_prepare_render(&rmesa->radeon);
-+ if (rmesa->radeon.NewGLState)
-+ radeonValidateState( ctx );
-
- tnl->Driver.Render.Start( ctx );
-
-diff --git a/src/mesa/drivers/dri/radeon/radeon_tcl.c b/src/mesa/drivers/dri/radeon/radeon_tcl.c
-index 5e1718f..ded3ebe 100644
---- a/src/mesa/drivers/dri/radeon/radeon_tcl.c
-+++ b/src/mesa/drivers/dri/radeon/radeon_tcl.c
-@@ -253,6 +253,8 @@ void radeonTclPrimitive( GLcontext *ctx,
- GLuint newprim = hw_prim | RADEON_CP_VC_CNTL_TCL_ENABLE;
-
- radeon_prepare_render(&rmesa->radeon);
-+ if (rmesa->radeon.NewGLState)
-+ radeonValidateState( ctx );
- if (newprim != rmesa->tcl.hw_primitive ||
- !discrete_prim[hw_prim&0xf]) {
-diff --git a/src/mesa/main/bufferobj.c b/src/mesa/main/bufferobj.c
-index 4797f29..d9eaada 100644
---- a/src/mesa/main/bufferobj.c
-+++ b/src/mesa/main/bufferobj.c
-@@ -55,6 +55,13 @@
-
-
- /**
-+ * Used as a placeholder for buffer objects between glGenBuffers() and
-+ * glBindBuffer() so that glIsBuffer() can work correctly.
-+ */
-+static struct gl_buffer_object DummyBufferObject;
-+
-+
-+/**
- * Return pointer to address of a buffer object target.
- * \param ctx the GL context
- * \param target the buffer object target to be retrieved.
-@@ -554,6 +561,9 @@ _mesa_copy_buffer_subdata(GLcontext *ctx,
- void
- _mesa_init_buffer_objects( GLcontext *ctx )
+diff --git a/src/mesa/drivers/dri/r300/compiler/radeon_dataflow.c b/src/mesa/drivers/dri/r300/compiler/radeon_dataflow.c
+index b0deb75..a8decac 100644
+--- a/src/mesa/drivers/dri/r300/compiler/radeon_dataflow.c
++++ b/src/mesa/drivers/dri/r300/compiler/radeon_dataflow.c
+@@ -687,7 +687,7 @@ static void get_readers_for_single_write(
+ struct rc_instruction * tmp;
+ unsigned int branch_depth = 0;
+ struct rc_instruction * endloop = NULL;
+- unsigned int abort_on_read_at_endloop;
++ unsigned int abort_on_read_at_endloop = 0;
+ struct get_readers_callback_data * d = userdata;
+
+ d->ReaderData->Writer = writer;
+diff --git a/src/mesa/drivers/dri/r300/compiler/radeon_optimize.c b/src/mesa/drivers/dri/r300/compiler/radeon_optimize.c
+index ac73608..39dcb21 100644
+--- a/src/mesa/drivers/dri/r300/compiler/radeon_optimize.c
++++ b/src/mesa/drivers/dri/r300/compiler/radeon_optimize.c
+@@ -560,32 +560,30 @@ static int peephole_add_presub_add(
+ struct radeon_compiler * c,
+ struct rc_instruction * inst_add)
{
-+ memset(&DummyBufferObject, 0, sizeof(DummyBufferObject));
-+ DummyBufferObject.RefCount = 1000*1000*1000; /* never delete */
-+
- _mesa_reference_buffer_object(ctx, &ctx->Array.ArrayBufferObj,
- ctx->Shared->NullBufferObj);
- _mesa_reference_buffer_object(ctx, &ctx->Array.ElementArrayBufferObj,
-@@ -611,8 +621,10 @@ bind_buffer_object(GLcontext *ctx, GLenum target, GLuint buffer)
- else {
- /* non-default buffer object */
- newBufObj = _mesa_lookup_bufferobj(ctx, buffer);
-- if (!newBufObj) {
-- /* if this is a new buffer object id, allocate a buffer object now */
-+ if (!newBufObj || newBufObj == &DummyBufferObject) {
-+ /* If this is a new buffer object id, or one which was generated but
-+ * never used before, allocate a buffer object now.
-+ */
- ASSERT(ctx->Driver.NewBufferObject);
- newBufObj = ctx->Driver.NewBufferObject(ctx, buffer, target);
- if (!newBufObj) {
-@@ -992,7 +1004,7 @@ _mesa_DeleteBuffersARB(GLsizei n, const GLuint *ids)
- struct gl_array_object *arrayObj = ctx->Array.ArrayObj;
- GLuint j;
-
-- ASSERT(bufObj->Name == ids[i]);
-+ ASSERT(bufObj->Name == ids[i] || bufObj == &DummyBufferObject);
-
- if (_mesa_bufferobj_mapped(bufObj)) {
- /* if mapped, unmap it now */
-@@ -1033,7 +1045,7 @@ _mesa_DeleteBuffersARB(GLsizei n, const GLuint *ids)
- }
-
- /* The ID is immediately freed for re-use */
-- _mesa_HashRemove(ctx->Shared->BufferObjects, bufObj->Name);
-+ _mesa_HashRemove(ctx->Shared->BufferObjects, ids[i]);
- _mesa_reference_buffer_object(ctx, &bufObj, NULL);
- }
- }
-@@ -1072,18 +1084,10 @@ _mesa_GenBuffersARB(GLsizei n, GLuint *buffer)
-
- first = _mesa_HashFindFreeKeyBlock(ctx->Shared->BufferObjects, n);
-
-- /* Allocate new, empty buffer objects and return identifiers */
-+ /* Insert the ID and pointer to dummy buffer object into hash table */
- for (i = 0; i < n; i++) {
-- struct gl_buffer_object *bufObj;
-- GLuint name = first + i;
-- GLenum target = 0;
-- bufObj = ctx->Driver.NewBufferObject( ctx, name, target );
-- if (!bufObj) {
-- _glthread_UNLOCK_MUTEX(ctx->Shared->Mutex);
-- _mesa_error(ctx, GL_OUT_OF_MEMORY, "glGenBuffersARB");
-- return;
-- }
-- _mesa_HashInsert(ctx->Shared->BufferObjects, first + i, bufObj);
-+ _mesa_HashInsert(ctx->Shared->BufferObjects, first + i,
-+ &DummyBufferObject);
- buffer[i] = first + i;
- }
-
-@@ -1109,7 +1113,7 @@ _mesa_IsBufferARB(GLuint id)
- bufObj = _mesa_lookup_bufferobj(ctx, id);
- _glthread_UNLOCK_MUTEX(ctx->Shared->Mutex);
-
-- return bufObj ? GL_TRUE : GL_FALSE;
-+ return bufObj && bufObj != &DummyBufferObject;
- }
-
-
-diff --git a/src/mesa/main/formats.c b/src/mesa/main/formats.c
-index 9db9f1c..c3fe8a3 100644
---- a/src/mesa/main/formats.c
-+++ b/src/mesa/main/formats.c
-@@ -1109,6 +1109,7 @@ _mesa_format_to_type_and_comps(gl_format format,
- case MESA_FORMAT_ARGB8888:
- case MESA_FORMAT_ARGB8888_REV:
- case MESA_FORMAT_XRGB8888:
-+ case MESA_FORMAT_XRGB8888_REV:
- *datatype = GL_UNSIGNED_BYTE;
- *comps = 4;
- return;
-@@ -1135,6 +1136,11 @@ _mesa_format_to_type_and_comps(gl_format format,
- *comps = 4;
- return;
-
-+ case MESA_FORMAT_RGBA5551:
-+ *datatype = GL_UNSIGNED_SHORT_5_5_5_1;
-+ *comps = 4;
-+ return;
-+
- case MESA_FORMAT_AL88:
- case MESA_FORMAT_AL88_REV:
- *datatype = GL_UNSIGNED_BYTE;
-@@ -1156,6 +1162,7 @@ _mesa_format_to_type_and_comps(gl_format format,
- case MESA_FORMAT_L8:
- case MESA_FORMAT_I8:
- case MESA_FORMAT_CI8:
-+ case MESA_FORMAT_S8:
- *datatype = GL_UNSIGNED_BYTE;
- *comps = 1;
- return;
-@@ -1201,12 +1208,26 @@ _mesa_format_to_type_and_comps(gl_format format,
- *comps = 2;
- return;
-
-+ case MESA_FORMAT_SIGNED_R8:
-+ *datatype = GL_BYTE;
-+ *comps = 1;
-+ return;
-+ case MESA_FORMAT_SIGNED_RG88:
-+ *datatype = GL_BYTE;
-+ *comps = 2;
-+ return;
- case MESA_FORMAT_SIGNED_RGBA8888:
- case MESA_FORMAT_SIGNED_RGBA8888_REV:
-+ case MESA_FORMAT_SIGNED_RGBX8888:
- *datatype = GL_BYTE;
- *comps = 4;
- return;
-
-+ case MESA_FORMAT_RGBA_16:
-+ *datatype = GL_UNSIGNED_SHORT;
-+ *comps = 4;
-+ return;
-+
- case MESA_FORMAT_SIGNED_R_16:
- *datatype = GL_SHORT;
- *comps = 1;
-@@ -1331,9 +1352,14 @@ _mesa_format_to_type_and_comps(gl_format format,
- *comps = 4;
- return;
-
+- struct rc_src_register * src0 = NULL;
+- struct rc_src_register * src1 = NULL;
+- unsigned int i;
-
-+ case MESA_FORMAT_NONE:
-+ case MESA_FORMAT_COUNT:
-+ /* For debug builds, warn if any formats are not handled */
-+#ifndef DEBUG
- default:
-- _mesa_problem(NULL, "bad format in _mesa_format_to_type_and_comps");
-+#endif
-+ _mesa_problem(NULL, "bad format %s in _mesa_format_to_type_and_comps",
-+ _mesa_get_format_name(format));
- *datatype = 0;
- *comps = 1;
- }
-diff --git a/src/mesa/main/mipmap.c b/src/mesa/main/mipmap.c
-index 3d1a4c4..71aa8c2 100644
---- a/src/mesa/main/mipmap.c
-+++ b/src/mesa/main/mipmap.c
-@@ -288,6 +288,54 @@ do_row(GLenum datatype, GLuint comps, GLint srcWidth,
- dst[i] = (rowA[j] + rowA[k] + rowB[j] + rowB[k]) / 4;
- }
- }
-+
-+ else if (datatype == GL_SHORT && comps == 4) {
-+ GLuint i, j, k;
-+ const GLshort(*rowA)[4] = (const GLshort(*)[4]) srcRowA;
-+ const GLshort(*rowB)[4] = (const GLshort(*)[4]) srcRowB;
-+ GLshort(*dst)[4] = (GLshort(*)[4]) dstRow;
-+ for (i = j = 0, k = k0; i < (GLuint) dstWidth;
-+ i++, j += colStride, k += colStride) {
-+ dst[i][0] = (rowA[j][0] + rowA[k][0] + rowB[j][0] + rowB[k][0]) / 4;
-+ dst[i][1] = (rowA[j][1] + rowA[k][1] + rowB[j][1] + rowB[k][1]) / 4;
-+ dst[i][2] = (rowA[j][2] + rowA[k][2] + rowB[j][2] + rowB[k][2]) / 4;
-+ dst[i][3] = (rowA[j][3] + rowA[k][3] + rowB[j][3] + rowB[k][3]) / 4;
-+ }
-+ }
-+ else if (datatype == GL_SHORT && comps == 3) {
-+ GLuint i, j, k;
-+ const GLshort(*rowA)[3] = (const GLshort(*)[3]) srcRowA;
-+ const GLshort(*rowB)[3] = (const GLshort(*)[3]) srcRowB;
-+ GLshort(*dst)[3] = (GLshort(*)[3]) dstRow;
-+ for (i = j = 0, k = k0; i < (GLuint) dstWidth;
-+ i++, j += colStride, k += colStride) {
-+ dst[i][0] = (rowA[j][0] + rowA[k][0] + rowB[j][0] + rowB[k][0]) / 4;
-+ dst[i][1] = (rowA[j][1] + rowA[k][1] + rowB[j][1] + rowB[k][1]) / 4;
-+ dst[i][2] = (rowA[j][2] + rowA[k][2] + rowB[j][2] + rowB[k][2]) / 4;
-+ }
-+ }
-+ else if (datatype == GL_SHORT && comps == 2) {
-+ GLuint i, j, k;
-+ const GLshort(*rowA)[2] = (const GLshort(*)[2]) srcRowA;
-+ const GLshort(*rowB)[2] = (const GLshort(*)[2]) srcRowB;
-+ GLshort(*dst)[2] = (GLshort(*)[2]) dstRow;
-+ for (i = j = 0, k = k0; i < (GLuint) dstWidth;
-+ i++, j += colStride, k += colStride) {
-+ dst[i][0] = (rowA[j][0] + rowA[k][0] + rowB[j][0] + rowB[k][0]) / 4;
-+ dst[i][1] = (rowA[j][1] + rowA[k][1] + rowB[j][1] + rowB[k][1]) / 4;
-+ }
-+ }
-+ else if (datatype == GL_SHORT && comps == 1) {
-+ GLuint i, j, k;
-+ const GLshort *rowA = (const GLshort *) srcRowA;
-+ const GLshort *rowB = (const GLshort *) srcRowB;
-+ GLshort *dst = (GLshort *) dstRow;
-+ for (i = j = 0, k = k0; i < (GLuint) dstWidth;
-+ i++, j += colStride, k += colStride) {
-+ dst[i] = (rowA[j] + rowA[k] + rowB[j] + rowB[k]) / 4;
-+ }
-+ }
-+
- else if (datatype == GL_FLOAT && comps == 4) {
- GLuint i, j, k;
- const GLfloat(*rowA)[4] = (const GLfloat(*)[4]) srcRowA;
-@@ -507,6 +555,37 @@ do_row(GLenum datatype, GLuint comps, GLint srcWidth,
- dst[i] = (alpha << 15) | (blue << 10) | (green << 5) | red;
- }
- }
-+ else if (datatype == GL_UNSIGNED_SHORT_5_5_5_1 && comps == 4) {
-+ GLuint i, j, k;
-+ const GLushort *rowA = (const GLushort *) srcRowA;
-+ const GLushort *rowB = (const GLushort *) srcRowB;
-+ GLushort *dst = (GLushort *) dstRow;
-+ for (i = j = 0, k = k0; i < (GLuint) dstWidth;
-+ i++, j += colStride, k += colStride) {
-+ const GLint rowAr0 = (rowA[j] >> 11) & 0x1f;
-+ const GLint rowAr1 = (rowA[k] >> 11) & 0x1f;
-+ const GLint rowBr0 = (rowB[j] >> 11) & 0x1f;
-+ const GLint rowBr1 = (rowB[k] >> 11) & 0x1f;
-+ const GLint rowAg0 = (rowA[j] >> 6) & 0x1f;
-+ const GLint rowAg1 = (rowA[k] >> 6) & 0x1f;
-+ const GLint rowBg0 = (rowB[j] >> 6) & 0x1f;
-+ const GLint rowBg1 = (rowB[k] >> 6) & 0x1f;
-+ const GLint rowAb0 = (rowA[j] >> 1) & 0x1f;
-+ const GLint rowAb1 = (rowA[k] >> 1) & 0x1f;
-+ const GLint rowBb0 = (rowB[j] >> 1) & 0x1f;
-+ const GLint rowBb1 = (rowB[k] >> 1) & 0x1f;
-+ const GLint rowAa0 = (rowA[j] & 0x1);
-+ const GLint rowAa1 = (rowA[k] & 0x1);
-+ const GLint rowBa0 = (rowB[j] & 0x1);
-+ const GLint rowBa1 = (rowB[k] & 0x1);
-+ const GLint red = (rowAr0 + rowAr1 + rowBr0 + rowBr1) >> 2;
-+ const GLint green = (rowAg0 + rowAg1 + rowBg0 + rowBg1) >> 2;
-+ const GLint blue = (rowAb0 + rowAb1 + rowBb0 + rowBb1) >> 2;
-+ const GLint alpha = (rowAa0 + rowAa1 + rowBa0 + rowBa1) >> 2;
-+ dst[i] = (red << 11) | (green << 6) | (blue << 1) | alpha;
-+ }
-+ }
-+
- else if (datatype == GL_UNSIGNED_BYTE_3_3_2 && comps == 3) {
- GLuint i, j, k;
- const GLubyte *rowA = (const GLubyte *) srcRowA;
-@@ -606,7 +685,7 @@ do_row_3D(GLenum datatype, GLuint comps, GLint srcWidth,
- FILTER_3D(0);
- }
- }
-- if ((datatype == GL_BYTE) && (comps == 4)) {
-+ else if ((datatype == GL_BYTE) && (comps == 4)) {
- DECLARE_ROW_POINTERS(GLbyte, 4);
-
- for (i = j = 0, k = k0; i < (GLuint) dstWidth;
-@@ -682,6 +761,44 @@ do_row_3D(GLenum datatype, GLuint comps, GLint srcWidth,
- FILTER_3D(0);
- }
- }
-+ else if ((datatype == GL_SHORT) && (comps == 4)) {
-+ DECLARE_ROW_POINTERS(GLshort, 4);
-+
-+ for (i = j = 0, k = k0; i < (GLuint) dstWidth;
-+ i++, j += colStride, k += colStride) {
-+ FILTER_3D(0);
-+ FILTER_3D(1);
-+ FILTER_3D(2);
-+ FILTER_3D(3);
-+ }
-+ }
-+ else if ((datatype == GL_SHORT) && (comps == 3)) {
-+ DECLARE_ROW_POINTERS(GLshort, 3);
-+
-+ for (i = j = 0, k = k0; i < (GLuint) dstWidth;
-+ i++, j += colStride, k += colStride) {
-+ FILTER_3D(0);
-+ FILTER_3D(1);
-+ FILTER_3D(2);
-+ }
-+ }
-+ else if ((datatype == GL_SHORT) && (comps == 2)) {
-+ DECLARE_ROW_POINTERS(GLshort, 2);
-+
-+ for (i = j = 0, k = k0; i < (GLuint) dstWidth;
-+ i++, j += colStride, k += colStride) {
-+ FILTER_3D(0);
-+ FILTER_3D(1);
-+ }
-+ }
-+ else if ((datatype == GL_SHORT) && (comps == 1)) {
-+ DECLARE_ROW_POINTERS(GLshort, 1);
-+
-+ for (i = j = 0, k = k0; i < (GLuint) dstWidth;
-+ i++, j += colStride, k += colStride) {
-+ FILTER_3D(0);
-+ }
-+ }
- else if ((datatype == GL_FLOAT) && (comps == 4)) {
- DECLARE_ROW_POINTERS(GLfloat, 4);
-
-@@ -910,6 +1027,55 @@ do_row_3D(GLenum datatype, GLuint comps, GLint srcWidth,
- dst[i] = (a << 15) | (b << 10) | (g << 5) | r;
+- if (!is_presub_candidate(c, inst_add))
+- return 0;
++ unsigned dstmask = inst_add->U.I.DstReg.WriteMask;
++ unsigned src0_neg = inst_add->U.I.SrcReg[0].Negate & dstmask;
++ unsigned src1_neg = inst_add->U.I.SrcReg[1].Negate & dstmask;
+
+ if (inst_add->U.I.SrcReg[0].Swizzle != inst_add->U.I.SrcReg[1].Swizzle)
+ return 0;
+
+- /* src0 and src1 can't have absolute values only one can be negative and they must be all negative or all positive. */
+- for (i = 0; i < 2; i++) {
+- if (inst_add->U.I.SrcReg[i].Abs)
+- return 0;
+- if ((inst_add->U.I.SrcReg[i].Negate
+- & inst_add->U.I.DstReg.WriteMask) ==
+- inst_add->U.I.DstReg.WriteMask) {
+- src0 = &inst_add->U.I.SrcReg[i];
+- } else if (!src1) {
+- src1 = &inst_add->U.I.SrcReg[i];
+- } else {
+- src0 = &inst_add->U.I.SrcReg[i];
+- }
+- }
++ /* src0 and src1 can't have absolute values */
++ if (inst_add->U.I.SrcReg[0].Abs || inst_add->U.I.SrcReg[1].Abs)
++ return 0;
++
++ /* presub_replace_add() assumes only one is negative */
++ if (inst_add->U.I.SrcReg[0].Negate && inst_add->U.I.SrcReg[1].Negate)
++ return 0;
++
++ /* if src0 is negative, at least all bits of dstmask have to be set */
++ if (inst_add->U.I.SrcReg[0].Negate && src0_neg != dstmask)
++ return 0;
+
+- if (!src1)
++ /* if src1 is negative, at least all bits of dstmask have to be set */
++ if (inst_add->U.I.SrcReg[1].Negate && src1_neg != dstmask)
++ return 0;
++
++ if (!is_presub_candidate(c, inst_add))
+ return 0;
+
+ if (presub_helper(c, inst_add, RC_PRESUB_ADD, presub_replace_add)) {
+@@ -618,7 +616,7 @@ static void presub_replace_inv(
+ * of the add instruction must have the constatnt 1 swizzle. This function
+ * does not check const registers to see if their value is 1.0, so it should
+ * be called after the constant_folding optimization.
+- * @return
++ * @return
+ * 0 if the ADD instruction is still part of the program.
+ * 1 if the ADD instruction is no longer part of the program.
+ */
+diff --git a/src/mesa/vbo/vbo_exec_array.c b/src/mesa/vbo/vbo_exec_array.c
+index 7959337..5903ae23 100644
+--- a/src/mesa/vbo/vbo_exec_array.c
++++ b/src/mesa/vbo/vbo_exec_array.c
+@@ -909,11 +909,10 @@ vbo_exec_DrawRangeElementsBaseVertex(GLenum mode,
+ if (0)
+ _mesa_print_arrays(ctx);
+
+-#ifdef DEBUG
+ /* 'end' was out of bounds, but now let's check the actual array
+ * indexes to see if any of them are out of bounds.
+ */
+- {
++ if (0) {
+ GLuint max = _mesa_max_buffer_index(ctx, count, type, indices,
+ ctx->Array.ElementArrayBufferObj);
+ if (max >= ctx->Array.ArrayObj->_MaxElement) {
+@@ -934,7 +933,6 @@ vbo_exec_DrawRangeElementsBaseVertex(GLenum mode,
+ * upper bound wrong.
+ */
}
- }
-+ else if ((datatype == GL_UNSIGNED_SHORT_5_5_5_1) && (comps == 4)) {
-+ DECLARE_ROW_POINTERS0(GLushort);
-+
-+ for (i = j = 0, k = k0; i < (GLuint) dstWidth;
-+ i++, j += colStride, k += colStride) {
-+ const GLint rowAr0 = (rowA[j] >> 11) & 0x1f;
-+ const GLint rowAr1 = (rowA[k] >> 11) & 0x1f;
-+ const GLint rowBr0 = (rowB[j] >> 11) & 0x1f;
-+ const GLint rowBr1 = (rowB[k] >> 11) & 0x1f;
-+ const GLint rowCr0 = (rowC[j] >> 11) & 0x1f;
-+ const GLint rowCr1 = (rowC[k] >> 11) & 0x1f;
-+ const GLint rowDr0 = (rowD[j] >> 11) & 0x1f;
-+ const GLint rowDr1 = (rowD[k] >> 11) & 0x1f;
-+ const GLint rowAg0 = (rowA[j] >> 6) & 0x1f;
-+ const GLint rowAg1 = (rowA[k] >> 6) & 0x1f;
-+ const GLint rowBg0 = (rowB[j] >> 6) & 0x1f;
-+ const GLint rowBg1 = (rowB[k] >> 6) & 0x1f;
-+ const GLint rowCg0 = (rowC[j] >> 6) & 0x1f;
-+ const GLint rowCg1 = (rowC[k] >> 6) & 0x1f;
-+ const GLint rowDg0 = (rowD[j] >> 6) & 0x1f;
-+ const GLint rowDg1 = (rowD[k] >> 6) & 0x1f;
-+ const GLint rowAb0 = (rowA[j] >> 1) & 0x1f;
-+ const GLint rowAb1 = (rowA[k] >> 1) & 0x1f;
-+ const GLint rowBb0 = (rowB[j] >> 1) & 0x1f;
-+ const GLint rowBb1 = (rowB[k] >> 1) & 0x1f;
-+ const GLint rowCb0 = (rowC[j] >> 1) & 0x1f;
-+ const GLint rowCb1 = (rowC[k] >> 1) & 0x1f;
-+ const GLint rowDb0 = (rowD[j] >> 1) & 0x1f;
-+ const GLint rowDb1 = (rowD[k] >> 1) & 0x1f;
-+ const GLint rowAa0 = (rowA[j] & 0x1);
-+ const GLint rowAa1 = (rowA[k] & 0x1);
-+ const GLint rowBa0 = (rowB[j] & 0x1);
-+ const GLint rowBa1 = (rowB[k] & 0x1);
-+ const GLint rowCa0 = (rowC[j] & 0x1);
-+ const GLint rowCa1 = (rowC[k] & 0x1);
-+ const GLint rowDa0 = (rowD[j] & 0x1);
-+ const GLint rowDa1 = (rowD[k] & 0x1);
-+ const GLint r = FILTER_SUM_3D(rowAr0, rowAr1, rowBr0, rowBr1,
-+ rowCr0, rowCr1, rowDr0, rowDr1);
-+ const GLint g = FILTER_SUM_3D(rowAg0, rowAg1, rowBg0, rowBg1,
-+ rowCg0, rowCg1, rowDg0, rowDg1);
-+ const GLint b = FILTER_SUM_3D(rowAb0, rowAb1, rowBb0, rowBb1,
-+ rowCb0, rowCb1, rowDb0, rowDb1);
-+ const GLint a = FILTER_SUM_3D(rowAa0, rowAa1, rowBa0, rowBa1,
-+ rowCa0, rowCa1, rowDa0, rowDa1);
-+
-+ dst[i] = (r << 11) | (g << 6) | (b << 1) | a;
-+ }
-+ }
- else if ((datatype == GL_UNSIGNED_BYTE_3_3_2) && (comps == 3)) {
- DECLARE_ROW_POINTERS0(GLushort);
-
-diff --git a/src/mesa/state_tracker/st_cb_eglimage.c b/src/mesa/state_tracker/st_cb_eglimage.c
-index 3145416..c54baf4 100644
---- a/src/mesa/state_tracker/st_cb_eglimage.c
-+++ b/src/mesa/state_tracker/st_cb_eglimage.c
-@@ -129,6 +129,7 @@ st_bind_surface(GLcontext *ctx, GLenum target,
-
- /* FIXME create a non-default sampler view from the pipe_surface? */
- pipe_resource_reference(&stObj->pt, ps->texture);
-+ pipe_sampler_view_reference(&stObj->sampler_view, NULL);
- pipe_resource_reference(&stImage->pt, stObj->pt);
-
- stObj->width0 = ps->width;
-diff --git a/src/mesa/state_tracker/st_manager.c b/src/mesa/state_tracker/st_manager.c
-index 66e32b4..cd418a0 100644
---- a/src/mesa/state_tracker/st_manager.c
-+++ b/src/mesa/state_tracker/st_manager.c
-@@ -486,9 +486,18 @@ st_context_notify_invalid_framebuffer(struct st_context_iface *stctxi,
- stfb = st_ws_framebuffer(st->ctx->WinSysDrawBuffer);
- if (!stfb || stfb->iface != stfbi)
- stfb = st_ws_framebuffer(st->ctx->WinSysReadBuffer);
-- assert(stfb && stfb->iface == stfbi);
+-#endif
-- p_atomic_set(&stfb->revalidate, TRUE);
-+ if (stfb && stfb->iface == stfbi) {
-+ p_atomic_set(&stfb->revalidate, TRUE);
-+ }
-+ else {
-+ /* This function is probably getting called when we've detected a
-+ * change in a window's size but the currently bound context is
-+ * not bound to that window.
-+ * If the st_framebuffer_iface structure had a pointer to the
-+ * corresponding st_framebuffer we'd be able to handle this.
-+ */
-+ }
- }
-
- static void
-diff --git a/src/mesa/swrast/s_texfilter.c b/src/mesa/swrast/s_texfilter.c
-index 3fc554c..198f0e2 100644
---- a/src/mesa/swrast/s_texfilter.c
-+++ b/src/mesa/swrast/s_texfilter.c
-@@ -2972,11 +2972,16 @@ choose_depth_texture_level(const struct gl_texture_object *tObj, GLfloat lambda)
- {
- GLint level;
-
-- lambda = CLAMP(lambda, tObj->MinLod, tObj->MaxLod);
--
-- level = (GLint) lambda;
--
-- level = CLAMP(level, tObj->BaseLevel, tObj->_MaxLevel);
-+ if (tObj->MinFilter == GL_NEAREST || tObj->MinFilter == GL_LINEAR) {
-+ /* no mipmapping - use base level */
-+ level = tObj->BaseLevel;
-+ }
-+ else {
-+ /* choose mipmap level */
-+ lambda = CLAMP(lambda, tObj->MinLod, tObj->MaxLod);
-+ level = (GLint) lambda;
-+ level = CLAMP(level, tObj->BaseLevel, tObj->_MaxLevel);
-+ }
-
- return level;
- }
+ /* Set 'end' to the max possible legal value */
+ assert(ctx->Array.ArrayObj->_MaxElement >= 1);