summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDave Airlie <airlied@fedoraproject.org>2009-02-27 09:41:56 +0000
committerDave Airlie <airlied@fedoraproject.org>2009-02-27 09:41:56 +0000
commita5cda00fd401899ec0d38e3519a8f1ad9cd3e1d3 (patch)
treee2f57f0d216c5b34d84df99a61ea439d930acba1
parent170ba7cda87dea42f87d56c3d9717210ba51ce90 (diff)
downloadmesa-a5cda00fd401899ec0d38e3519a8f1ad9cd3e1d3.tar.gz
mesa-a5cda00fd401899ec0d38e3519a8f1ad9cd3e1d3.tar.xz
mesa-a5cda00fd401899ec0d38e3519a8f1ad9cd3e1d3.zip
- reset whole place back to 7.3-6 - bad plan
-rw-r--r--mesa-7.1-nukeglthread-debug.patch18
-rw-r--r--mesa-7.3-dri-drivers-master.patch12430
-rw-r--r--mesa.spec9
-rw-r--r--radeon-rewrite.patch1481
4 files changed, 639 insertions, 13299 deletions
diff --git a/mesa-7.1-nukeglthread-debug.patch b/mesa-7.1-nukeglthread-debug.patch
index d69c4ab..dc8ad6f 100644
--- a/mesa-7.1-nukeglthread-debug.patch
+++ b/mesa-7.1-nukeglthread-debug.patch
@@ -1,8 +1,7 @@
-diff --git a/src/mesa/drivers/dri/intel/intel_fbo.c b/src/mesa/drivers/dri/intel/intel_fbo.c
-index 787c290..be81b65 100644
---- a/src/mesa/drivers/dri/intel/intel_fbo.c
-+++ b/src/mesa/drivers/dri/intel/intel_fbo.c
-@@ -573,11 +573,6 @@ intel_render_texture(GLcontext * ctx,
+diff -up Mesa-7.1/src/mesa/drivers/dri/intel/intel_fbo.c.intel-glthread Mesa-7.1/src/mesa/drivers/dri/intel/intel_fbo.c
+--- Mesa-7.1/src/mesa/drivers/dri/intel/intel_fbo.c.intel-glthread 2008-08-25 10:49:40.000000000 -0400
++++ Mesa-7.1/src/mesa/drivers/dri/intel/intel_fbo.c 2008-08-28 14:26:17.000000000 -0400
+@@ -633,11 +633,6 @@ intel_render_texture(GLcontext * ctx,
return;
}
@@ -14,3 +13,12 @@ index 787c290..be81b65 100644
/* point the renderbufer's region to the texture image region */
intel_image = intel_texture_image(newImage);
if (irb->region != intel_image->mt->region) {
+@@ -674,8 +669,6 @@ intel_finish_render_texture(GLcontext *
+ {
+ struct intel_renderbuffer *irb = intel_renderbuffer(att->Renderbuffer);
+
+- DBG("End render texture (tid %x) tex %u\n", _glthread_GetID(), att->Texture->Name);
+-
+ if (irb) {
+ /* just release the region */
+ intel_region_release(&irb->region);
diff --git a/mesa-7.3-dri-drivers-master.patch b/mesa-7.3-dri-drivers-master.patch
deleted file mode 100644
index 47969f3..0000000
--- a/mesa-7.3-dri-drivers-master.patch
+++ /dev/null
@@ -1,12430 +0,0 @@
-diff --git a/src/mesa/drivers/dri/common/dri_util.h b/src/mesa/drivers/dri/common/dri_util.h
-index c6781f1..c95a5c8 100644
---- a/src/mesa/drivers/dri/common/dri_util.h
-+++ b/src/mesa/drivers/dri/common/dri_util.h
-@@ -1,25 +1,3 @@
--/* $XFree86: xc/lib/GL/dri/dri_util.h,v 1.1 2002/02/22 21:32:52 dawes Exp $ */
--/**
-- * \file dri_util.h
-- * DRI utility functions definitions.
-- *
-- * This module acts as glue between GLX and the actual hardware driver. A DRI
-- * driver doesn't really \e have to use any of this - it's optional. But, some
-- * useful stuff is done here that otherwise would have to be duplicated in most
-- * drivers.
-- *
-- * Basically, these utility functions take care of some of the dirty details of
-- * screen initialization, context creation, context binding, DRM setup, etc.
-- *
-- * These functions are compiled into each DRI driver so libGL.so knows nothing
-- * about them.
-- *
-- * \sa dri_util.c.
-- *
-- * \author Kevin E. Martin <kevin@precisioninsight.com>
-- * \author Brian Paul <brian@precisioninsight.com>
-- */
--
- /*
- * Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas.
- * All Rights Reserved.
-@@ -45,6 +23,26 @@
- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-
-+/**
-+ * \file dri_util.h
-+ * DRI utility functions definitions.
-+ *
-+ * This module acts as glue between GLX and the actual hardware driver. A DRI
-+ * driver doesn't really \e have to use any of this - it's optional. But, some
-+ * useful stuff is done here that otherwise would have to be duplicated in most
-+ * drivers.
-+ *
-+ * Basically, these utility functions take care of some of the dirty details of
-+ * screen initialization, context creation, context binding, DRM setup, etc.
-+ *
-+ * These functions are compiled into each DRI driver so libGL.so knows nothing
-+ * about them.
-+ *
-+ * \sa dri_util.c.
-+ *
-+ * \author Kevin E. Martin <kevin@precisioninsight.com>
-+ * \author Brian Paul <brian@precisioninsight.com>
-+ */
-
- #ifndef _DRI_UTIL_H_
- #define _DRI_UTIL_H_
-diff --git a/src/mesa/drivers/dri/common/drirenderbuffer.c b/src/mesa/drivers/dri/common/drirenderbuffer.c
-index b99bf20..15af991 100644
---- a/src/mesa/drivers/dri/common/drirenderbuffer.c
-+++ b/src/mesa/drivers/dri/common/drirenderbuffer.c
-@@ -209,6 +209,8 @@ driUpdateFramebufferSize(GLcontext *ctx, const __DRIdrawablePrivate *dPriv)
- struct gl_framebuffer *fb = (struct gl_framebuffer *) dPriv->driverPrivate;
- if (fb && (dPriv->w != fb->Width || dPriv->h != fb->Height)) {
- ctx->Driver.ResizeBuffers(ctx, fb, dPriv->w, dPriv->h);
-+ /* if the driver needs the hw lock for ResizeBuffers, the drawable
-+ might have changed again by now */
- assert(fb->Width == dPriv->w);
- assert(fb->Height == dPriv->h);
- }
-diff --git a/src/mesa/drivers/dri/common/extension_helper.h b/src/mesa/drivers/dri/common/extension_helper.h
-index b977ebf..0d641f2 100644
---- a/src/mesa/drivers/dri/common/extension_helper.h
-+++ b/src/mesa/drivers/dri/common/extension_helper.h
-@@ -119,9 +119,10 @@ static const char ActiveTextureARB_names[] =
- "";
- #endif
-
--#if defined(need_GL_EXT_framebuffer_blit)
-+#if defined(need_GL_ARB_framebuffer_object) || defined(need_GL_EXT_framebuffer_blit)
- static const char BlitFramebufferEXT_names[] =
- "iiiiiiiiii\0" /* Parameter signature */
-+ "glBlitFramebuffer\0"
- "glBlitFramebufferEXT\0"
- "";
- #endif
-@@ -433,17 +434,18 @@ static const char Color4ubVertex3fvSUN_names[] =
- "";
- #endif
-
--#if defined(need_GL_EXT_texture_array)
-+#if defined(need_GL_ARB_framebuffer_object) || defined(need_GL_EXT_texture_array)
- static const char FramebufferTextureLayerEXT_names[] =
- "iiiii\0" /* Parameter signature */
-+ "glFramebufferTextureLayer\0"
- "glFramebufferTextureLayerEXT\0"
- "";
- #endif
-
- #if defined(need_GL_SGIX_list_priority)
--static const char GetListParameterivSGIX_names[] =
-+static const char GetListParameterfvSGIX_names[] =
- "iip\0" /* Parameter signature */
-- "glGetListParameterivSGIX\0"
-+ "glGetListParameterfvSGIX\0"
- "";
- #endif
-
-@@ -777,6 +779,13 @@ static const char VertexAttribs4fvNV_names[] =
- "";
- #endif
-
-+#if defined(need_GL_NV_vertex_array_range)
-+static const char VertexArrayRangeNV_names[] =
-+ "ip\0" /* Parameter signature */
-+ "glVertexArrayRangeNV\0"
-+ "";
-+#endif
-+
- #if defined(need_GL_SGIX_fragment_lighting)
- static const char FragmentLightiSGIX_names[] =
- "iii\0" /* Parameter signature */
-@@ -946,9 +955,10 @@ static const char VertexAttribs3fvNV_names[] =
- "";
- #endif
-
--#if defined(need_GL_EXT_framebuffer_object)
-+#if defined(need_GL_ARB_framebuffer_object) || defined(need_GL_EXT_framebuffer_object)
- static const char GenerateMipmapEXT_names[] =
- "i\0" /* Parameter signature */
-+ "glGenerateMipmap\0"
- "glGenerateMipmapEXT\0"
- "";
- #endif
-@@ -1077,13 +1087,6 @@ static const char AreTexturesResident_names[] =
- "";
- #endif
-
--#if defined(need_GL_EXT_framebuffer_object)
--static const char IsRenderbufferEXT_names[] =
-- "i\0" /* Parameter signature */
-- "glIsRenderbufferEXT\0"
-- "";
--#endif
--
- #if defined(need_GL_VERSION_2_0) || defined(need_GL_ATI_separate_stencil)
- static const char StencilOpSeparate_names[] =
- "iiii\0" /* Parameter signature */
-@@ -1171,9 +1174,10 @@ static const char TexCoord2fNormal3fVertex3fSUN_names[] =
- "";
- #endif
-
--#if defined(need_GL_EXT_framebuffer_object)
-+#if defined(need_GL_ARB_framebuffer_object) || defined(need_GL_EXT_framebuffer_object)
- static const char RenderbufferStorageEXT_names[] =
- "iiii\0" /* Parameter signature */
-+ "glRenderbufferStorage\0"
- "glRenderbufferStorageEXT\0"
- "";
- #endif
-@@ -1364,9 +1368,10 @@ static const char SpriteParameterfvSGIX_names[] =
- "";
- #endif
-
--#if defined(need_GL_EXT_framebuffer_object)
-+#if defined(need_GL_ARB_framebuffer_object) || defined(need_GL_EXT_framebuffer_object)
- static const char CheckFramebufferStatusEXT_names[] =
- "i\0" /* Parameter signature */
-+ "glCheckFramebufferStatus\0"
- "glCheckFramebufferStatusEXT\0"
- "";
- #endif
-@@ -1554,13 +1559,6 @@ static const char FragmentLightivSGIX_names[] =
- "";
- #endif
-
--#if defined(need_GL_EXT_framebuffer_object)
--static const char DeleteRenderbuffersEXT_names[] =
-- "ip\0" /* Parameter signature */
-- "glDeleteRenderbuffersEXT\0"
-- "";
--#endif
--
- #if defined(need_GL_EXT_pixel_transform)
- static const char PixelTransformParameterfvEXT_names[] =
- "iip\0" /* Parameter signature */
-@@ -1621,9 +1619,10 @@ static const char WindowPos2dMESA_names[] =
- "";
- #endif
-
--#if defined(need_GL_EXT_framebuffer_object)
-+#if defined(need_GL_ARB_framebuffer_object) || defined(need_GL_EXT_framebuffer_object)
- static const char FramebufferTexture3DEXT_names[] =
- "iiiiii\0" /* Parameter signature */
-+ "glFramebufferTexture3D\0"
- "glFramebufferTexture3DEXT\0"
- "";
- #endif
-@@ -1673,10 +1672,11 @@ static const char IndexFuncEXT_names[] =
- "";
- #endif
-
--#if defined(need_GL_SGIX_list_priority)
--static const char GetListParameterfvSGIX_names[] =
-- "iip\0" /* Parameter signature */
-- "glGetListParameterfvSGIX\0"
-+#if defined(need_GL_ARB_framebuffer_object) || defined(need_GL_EXT_framebuffer_object)
-+static const char FramebufferTexture2DEXT_names[] =
-+ "iiiii\0" /* Parameter signature */
-+ "glFramebufferTexture2D\0"
-+ "glFramebufferTexture2DEXT\0"
- "";
- #endif
-
-@@ -1763,13 +1763,6 @@ static const char DeleteFencesNV_names[] =
- "";
- #endif
-
--#if defined(need_GL_SGIX_polynomial_ffd)
--static const char DeformationMap3dSGIX_names[] =
-- "iddiiddiiddiip\0" /* Parameter signature */
-- "glDeformationMap3dSGIX\0"
-- "";
--#endif
--
- #if defined(need_GL_VERSION_2_0)
- static const char IsShader_names[] =
- "i\0" /* Parameter signature */
-@@ -1894,6 +1887,13 @@ static const char MatrixIndexuivARB_names[] =
- "";
- #endif
-
-+#if defined(need_GL_ARB_framebuffer_object)
-+static const char RenderbufferStorageMultisample_names[] =
-+ "iiiii\0" /* Parameter signature */
-+ "glRenderbufferStorageMultisample\0"
-+ "";
-+#endif
-+
- #if defined(need_GL_EXT_coordinate_frame)
- static const char Tangent3sEXT_names[] =
- "iii\0" /* Parameter signature */
-@@ -1944,9 +1944,10 @@ static const char VertexAttrib2dvNV_names[] =
- "";
- #endif
-
--#if defined(need_GL_EXT_framebuffer_object)
-+#if defined(need_GL_ARB_framebuffer_object) || defined(need_GL_EXT_framebuffer_object)
- static const char FramebufferRenderbufferEXT_names[] =
- "iiii\0" /* Parameter signature */
-+ "glFramebufferRenderbuffer\0"
- "glFramebufferRenderbufferEXT\0"
- "";
- #endif
-@@ -1973,9 +1974,10 @@ static const char SetFenceNV_names[] =
- "";
- #endif
-
--#if defined(need_GL_EXT_framebuffer_object)
-+#if defined(need_GL_ARB_framebuffer_object) || defined(need_GL_EXT_framebuffer_object)
- static const char FramebufferTexture1DEXT_names[] =
- "iiiii\0" /* Parameter signature */
-+ "glFramebufferTexture1D\0"
- "glFramebufferTexture1DEXT\0"
- "";
- #endif
-@@ -2105,9 +2107,10 @@ static const char Tangent3fvEXT_names[] =
- "";
- #endif
-
--#if defined(need_GL_EXT_framebuffer_object)
-+#if defined(need_GL_ARB_framebuffer_object) || defined(need_GL_EXT_framebuffer_object)
- static const char BindFramebufferEXT_names[] =
- "ii\0" /* Parameter signature */
-+ "glBindFramebuffer\0"
- "glBindFramebufferEXT\0"
- "";
- #endif
-@@ -2488,9 +2491,10 @@ static const char MapParameterivNV_names[] =
- "";
- #endif
-
--#if defined(need_GL_EXT_framebuffer_object)
-+#if defined(need_GL_ARB_framebuffer_object) || defined(need_GL_EXT_framebuffer_object)
- static const char GenRenderbuffersEXT_names[] =
- "ip\0" /* Parameter signature */
-+ "glGenRenderbuffers\0"
- "glGenRenderbuffersEXT\0"
- "";
- #endif
-@@ -2952,9 +2956,10 @@ static const char WindowPos2ivMESA_names[] =
- "";
- #endif
-
--#if defined(need_GL_EXT_framebuffer_object)
-+#if defined(need_GL_ARB_framebuffer_object) || defined(need_GL_EXT_framebuffer_object)
- static const char IsFramebufferEXT_names[] =
- "i\0" /* Parameter signature */
-+ "glIsFramebuffer\0"
- "glIsFramebufferEXT\0"
- "";
- #endif
-@@ -3125,13 +3130,6 @@ static const char ReplacementCodeuiSUN_names[] =
- "";
- #endif
-
--#if defined(need_GL_EXT_framebuffer_object)
--static const char FramebufferTexture2DEXT_names[] =
-- "iiiii\0" /* Parameter signature */
-- "glFramebufferTexture2DEXT\0"
-- "";
--#endif
--
- #if defined(need_GL_NV_vertex_program)
- static const char VertexAttribPointerNV_names[] =
- "iiiip\0" /* Parameter signature */
-@@ -3139,13 +3137,21 @@ static const char VertexAttribPointerNV_names[] =
- "";
- #endif
-
--#if defined(need_GL_EXT_framebuffer_object)
-+#if defined(need_GL_ARB_framebuffer_object) || defined(need_GL_EXT_framebuffer_object)
- static const char GetFramebufferAttachmentParameterivEXT_names[] =
- "iiip\0" /* Parameter signature */
-+ "glGetFramebufferAttachmentParameteriv\0"
- "glGetFramebufferAttachmentParameterivEXT\0"
- "";
- #endif
-
-+#if defined(need_GL_EXT_pixel_transform)
-+static const char PixelTransformParameterfEXT_names[] =
-+ "iif\0" /* Parameter signature */
-+ "glPixelTransformParameterfEXT\0"
-+ "";
-+#endif
-+
- #if defined(need_GL_VERSION_1_3)
- static const char MultiTexCoord4dvARB_names[] =
- "ip\0" /* Parameter signature */
-@@ -3264,9 +3270,10 @@ static const char VertexAttrib3fvARB_names[] =
- "";
- #endif
-
--#if defined(need_GL_EXT_framebuffer_object)
-+#if defined(need_GL_ARB_framebuffer_object) || defined(need_GL_EXT_framebuffer_object)
- static const char DeleteFramebuffersEXT_names[] =
- "ip\0" /* Parameter signature */
-+ "glDeleteFramebuffers\0"
- "glDeleteFramebuffersEXT\0"
- "";
- #endif
-@@ -3360,9 +3367,10 @@ static const char GetPixelTexGenParameterfvSGIS_names[] =
- "";
- #endif
-
--#if defined(need_GL_EXT_framebuffer_object)
-+#if defined(need_GL_ARB_framebuffer_object) || defined(need_GL_EXT_framebuffer_object)
- static const char GenFramebuffersEXT_names[] =
- "ip\0" /* Parameter signature */
-+ "glGenFramebuffers\0"
- "glGenFramebuffersEXT\0"
- "";
- #endif
-@@ -3374,10 +3382,10 @@ static const char GetProgramParameterdvNV_names[] =
- "";
- #endif
-
--#if defined(need_GL_EXT_pixel_transform)
--static const char PixelTransformParameterfEXT_names[] =
-- "iif\0" /* Parameter signature */
-- "glPixelTransformParameterfEXT\0"
-+#if defined(need_GL_SGIX_instruments)
-+static const char PollInstrumentsSGIX_names[] =
-+ "p\0" /* Parameter signature */
-+ "glPollInstrumentsSGIX\0"
- "";
- #endif
-
-@@ -3709,9 +3717,10 @@ static const char MultiDrawArraysEXT_names[] =
- "";
- #endif
-
--#if defined(need_GL_EXT_framebuffer_object)
-+#if defined(need_GL_ARB_framebuffer_object) || defined(need_GL_EXT_framebuffer_object)
- static const char BindRenderbufferEXT_names[] =
- "ii\0" /* Parameter signature */
-+ "glBindRenderbuffer\0"
- "glBindRenderbufferEXT\0"
- "";
- #endif
-@@ -4530,6 +4539,13 @@ static const char Minmax_names[] =
- "";
- #endif
-
-+#if defined(need_GL_SGIX_polynomial_ffd)
-+static const char DeformationMap3dSGIX_names[] =
-+ "iddiiddiiddiip\0" /* Parameter signature */
-+ "glDeformationMap3dSGIX\0"
-+ "";
-+#endif
-+
- #if defined(need_GL_VERSION_1_4) || defined(need_GL_EXT_fog_coord)
- static const char FogCoorddvEXT_names[] =
- "p\0" /* Parameter signature */
-@@ -4605,10 +4621,11 @@ static const char WeightdvARB_names[] =
- "";
- #endif
-
--#if defined(need_GL_SGIX_instruments)
--static const char PollInstrumentsSGIX_names[] =
-- "p\0" /* Parameter signature */
-- "glPollInstrumentsSGIX\0"
-+#if defined(need_GL_ARB_framebuffer_object) || defined(need_GL_EXT_framebuffer_object)
-+static const char DeleteRenderbuffersEXT_names[] =
-+ "ip\0" /* Parameter signature */
-+ "glDeleteRenderbuffers\0"
-+ "glDeleteRenderbuffersEXT\0"
- "";
- #endif
-
-@@ -4684,9 +4701,10 @@ static const char MultiTexCoord2fvARB_names[] =
- "";
- #endif
-
--#if defined(need_GL_EXT_framebuffer_object)
-+#if defined(need_GL_ARB_framebuffer_object) || defined(need_GL_EXT_framebuffer_object)
- static const char GetRenderbufferParameterivEXT_names[] =
- "iip\0" /* Parameter signature */
-+ "glGetRenderbufferParameteriv\0"
- "glGetRenderbufferParameterivEXT\0"
- "";
- #endif
-@@ -4742,6 +4760,13 @@ static const char Tangent3svEXT_names[] =
- "";
- #endif
-
-+#if defined(need_GL_SGIX_list_priority)
-+static const char GetListParameterivSGIX_names[] =
-+ "iip\0" /* Parameter signature */
-+ "glGetListParameterivSGIX\0"
-+ "";
-+#endif
-+
- #if defined(need_GL_VERSION_1_5) || defined(need_GL_ARB_vertex_buffer_object)
- static const char BindBufferARB_names[] =
- "ii\0" /* Parameter signature */
-@@ -4823,10 +4848,11 @@ static const char FragmentMaterialivSGIX_names[] =
- "";
- #endif
-
--#if defined(need_GL_NV_vertex_array_range)
--static const char VertexArrayRangeNV_names[] =
-- "ip\0" /* Parameter signature */
-- "glVertexArrayRangeNV\0"
-+#if defined(need_GL_ARB_framebuffer_object) || defined(need_GL_EXT_framebuffer_object)
-+static const char IsRenderbufferEXT_names[] =
-+ "i\0" /* Parameter signature */
-+ "glIsRenderbuffer\0"
-+ "glIsRenderbufferEXT\0"
- "";
- #endif
-
-@@ -4892,6 +4918,32 @@ static const struct dri_extension_function GL_ARB_draw_buffers_functions[] = {
- };
- #endif
-
-+#if defined(need_GL_ARB_framebuffer_object)
-+static const struct dri_extension_function GL_ARB_framebuffer_object_functions[] = {
-+ { BlitFramebufferEXT_names, BlitFramebufferEXT_remap_index, -1 },
-+ { FramebufferTextureLayerEXT_names, FramebufferTextureLayerEXT_remap_index, -1 },
-+ { GenerateMipmapEXT_names, GenerateMipmapEXT_remap_index, -1 },
-+ { RenderbufferStorageEXT_names, RenderbufferStorageEXT_remap_index, -1 },
-+ { CheckFramebufferStatusEXT_names, CheckFramebufferStatusEXT_remap_index, -1 },
-+ { FramebufferTexture3DEXT_names, FramebufferTexture3DEXT_remap_index, -1 },
-+ { FramebufferTexture2DEXT_names, FramebufferTexture2DEXT_remap_index, -1 },
-+ { RenderbufferStorageMultisample_names, RenderbufferStorageMultisample_remap_index, -1 },
-+ { FramebufferRenderbufferEXT_names, FramebufferRenderbufferEXT_remap_index, -1 },
-+ { FramebufferTexture1DEXT_names, FramebufferTexture1DEXT_remap_index, -1 },
-+ { BindFramebufferEXT_names, BindFramebufferEXT_remap_index, -1 },
-+ { GenRenderbuffersEXT_names, GenRenderbuffersEXT_remap_index, -1 },
-+ { IsFramebufferEXT_names, IsFramebufferEXT_remap_index, -1 },
-+ { GetFramebufferAttachmentParameterivEXT_names, GetFramebufferAttachmentParameterivEXT_remap_index, -1 },
-+ { DeleteFramebuffersEXT_names, DeleteFramebuffersEXT_remap_index, -1 },
-+ { GenFramebuffersEXT_names, GenFramebuffersEXT_remap_index, -1 },
-+ { BindRenderbufferEXT_names, BindRenderbufferEXT_remap_index, -1 },
-+ { DeleteRenderbuffersEXT_names, DeleteRenderbuffersEXT_remap_index, -1 },
-+ { GetRenderbufferParameterivEXT_names, GetRenderbufferParameterivEXT_remap_index, -1 },
-+ { IsRenderbufferEXT_names, IsRenderbufferEXT_remap_index, -1 },
-+ { NULL, 0, 0 }
-+};
-+#endif
-+
- #if defined(need_GL_ARB_matrix_palette)
- static const struct dri_extension_function GL_ARB_matrix_palette_functions[] = {
- { MatrixIndexusvARB_names, MatrixIndexusvARB_remap_index, -1 },
-@@ -5319,22 +5371,22 @@ static const struct dri_extension_function GL_EXT_framebuffer_blit_functions[] =
- #if defined(need_GL_EXT_framebuffer_object)
- static const struct dri_extension_function GL_EXT_framebuffer_object_functions[] = {
- { GenerateMipmapEXT_names, GenerateMipmapEXT_remap_index, -1 },
-- { IsRenderbufferEXT_names, IsRenderbufferEXT_remap_index, -1 },
- { RenderbufferStorageEXT_names, RenderbufferStorageEXT_remap_index, -1 },
- { CheckFramebufferStatusEXT_names, CheckFramebufferStatusEXT_remap_index, -1 },
-- { DeleteRenderbuffersEXT_names, DeleteRenderbuffersEXT_remap_index, -1 },
- { FramebufferTexture3DEXT_names, FramebufferTexture3DEXT_remap_index, -1 },
-+ { FramebufferTexture2DEXT_names, FramebufferTexture2DEXT_remap_index, -1 },
- { FramebufferRenderbufferEXT_names, FramebufferRenderbufferEXT_remap_index, -1 },
- { FramebufferTexture1DEXT_names, FramebufferTexture1DEXT_remap_index, -1 },
- { BindFramebufferEXT_names, BindFramebufferEXT_remap_index, -1 },
- { GenRenderbuffersEXT_names, GenRenderbuffersEXT_remap_index, -1 },
- { IsFramebufferEXT_names, IsFramebufferEXT_remap_index, -1 },
-- { FramebufferTexture2DEXT_names, FramebufferTexture2DEXT_remap_index, -1 },
- { GetFramebufferAttachmentParameterivEXT_names, GetFramebufferAttachmentParameterivEXT_remap_index, -1 },
- { DeleteFramebuffersEXT_names, DeleteFramebuffersEXT_remap_index, -1 },
- { GenFramebuffersEXT_names, GenFramebuffersEXT_remap_index, -1 },
- { BindRenderbufferEXT_names, BindRenderbufferEXT_remap_index, -1 },
-+ { DeleteRenderbuffersEXT_names, DeleteRenderbuffersEXT_remap_index, -1 },
- { GetRenderbufferParameterivEXT_names, GetRenderbufferParameterivEXT_remap_index, -1 },
-+ { IsRenderbufferEXT_names, IsRenderbufferEXT_remap_index, -1 },
- { NULL, 0, 0 }
- };
- #endif
-@@ -5415,8 +5467,8 @@ static const struct dri_extension_function GL_EXT_paletted_texture_functions[] =
- #if defined(need_GL_EXT_pixel_transform)
- static const struct dri_extension_function GL_EXT_pixel_transform_functions[] = {
- { PixelTransformParameterfvEXT_names, PixelTransformParameterfvEXT_remap_index, -1 },
-- { PixelTransformParameteriEXT_names, PixelTransformParameteriEXT_remap_index, -1 },
- { PixelTransformParameterfEXT_names, PixelTransformParameterfEXT_remap_index, -1 },
-+ { PixelTransformParameteriEXT_names, PixelTransformParameteriEXT_remap_index, -1 },
- { PixelTransformParameterivEXT_names, PixelTransformParameterivEXT_remap_index, -1 },
- { NULL, 0, 0 }
- };
-@@ -5716,8 +5768,8 @@ static const struct dri_extension_function GL_NV_register_combiners2_functions[]
-
- #if defined(need_GL_NV_vertex_array_range)
- static const struct dri_extension_function GL_NV_vertex_array_range_functions[] = {
-- { FlushVertexArrayRangeNV_names, FlushVertexArrayRangeNV_remap_index, -1 },
- { VertexArrayRangeNV_names, VertexArrayRangeNV_remap_index, -1 },
-+ { FlushVertexArrayRangeNV_names, FlushVertexArrayRangeNV_remap_index, -1 },
- { NULL, 0, 0 }
- };
- #endif
-@@ -5946,11 +5998,11 @@ static const struct dri_extension_function GL_SGIX_instruments_functions[] = {
- #if defined(need_GL_SGIX_list_priority)
- static const struct dri_extension_function GL_SGIX_list_priority_functions[] = {
- { ListParameterfSGIX_names, ListParameterfSGIX_remap_index, -1 },
-- { GetListParameterivSGIX_names, GetListParameterivSGIX_remap_index, -1 },
- { GetListParameterfvSGIX_names, GetListParameterfvSGIX_remap_index, -1 },
- { ListParameteriSGIX_names, ListParameteriSGIX_remap_index, -1 },
- { ListParameterfvSGIX_names, ListParameterfvSGIX_remap_index, -1 },
- { ListParameterivSGIX_names, ListParameterivSGIX_remap_index, -1 },
-+ { GetListParameterivSGIX_names, GetListParameterivSGIX_remap_index, -1 },
- { NULL, 0, 0 }
- };
- #endif
-@@ -5965,9 +6017,9 @@ static const struct dri_extension_function GL_SGIX_pixel_texture_functions[] = {
- #if defined(need_GL_SGIX_polynomial_ffd)
- static const struct dri_extension_function GL_SGIX_polynomial_ffd_functions[] = {
- { LoadIdentityDeformationMapSGIX_names, LoadIdentityDeformationMapSGIX_remap_index, -1 },
-- { DeformationMap3dSGIX_names, DeformationMap3dSGIX_remap_index, -1 },
- { DeformSGIX_names, DeformSGIX_remap_index, -1 },
- { DeformationMap3fSGIX_names, DeformationMap3fSGIX_remap_index, -1 },
-+ { DeformationMap3dSGIX_names, DeformationMap3dSGIX_remap_index, -1 },
- { NULL, 0, 0 }
- };
- #endif
-diff --git a/src/mesa/drivers/dri/common/utils.c b/src/mesa/drivers/dri/common/utils.c
-index 30c860b..6b44ed9 100644
---- a/src/mesa/drivers/dri/common/utils.c
-+++ b/src/mesa/drivers/dri/common/utils.c
-@@ -179,13 +179,18 @@ driGetRendererString( char * buffer, const char * hardware_name,
-
-
-
-+#define need_GL_ARB_draw_buffers
- #define need_GL_ARB_multisample
-+#define need_GL_ARB_texture_compression
- #define need_GL_ARB_transpose_matrix
-+#define need_GL_ARB_vertex_buffer_object
- #define need_GL_ARB_window_pos
- #define need_GL_EXT_compiled_vertex_array
-+#define need_GL_EXT_multi_draw_arrays
- #define need_GL_EXT_polygon_offset
- #define need_GL_EXT_texture_object
- #define need_GL_EXT_vertex_array
-+#define need_GL_IBM_multimode_draw_arrays
- #define need_GL_MESA_window_pos
-
- /* These are needed in *all* drivers because Mesa internally implements
-@@ -198,14 +203,19 @@ driGetRendererString( char * buffer, const char * hardware_name,
- #include "extension_helper.h"
-
- static const struct dri_extension all_mesa_extensions[] = {
-+ { "GL_ARB_draw_buffers", GL_ARB_draw_buffers_functions },
- { "GL_ARB_multisample", GL_ARB_multisample_functions },
-+ { "GL_ARB_texture_compression", GL_ARB_texture_compression_functions },
- { "GL_ARB_transpose_matrix", GL_ARB_transpose_matrix_functions },
-+ { "GL_ARB_vertex_buffer_object", GL_ARB_vertex_buffer_object_functions},
- { "GL_ARB_window_pos", GL_ARB_window_pos_functions },
- { "GL_EXT_blend_func_separate", GL_EXT_blend_func_separate_functions },
- { "GL_EXT_compiled_vertex_array", GL_EXT_compiled_vertex_array_functions },
-+ { "GL_EXT_multi_draw_arrays", GL_EXT_multi_draw_arrays_functions },
- { "GL_EXT_polygon_offset", GL_EXT_polygon_offset_functions },
- { "GL_EXT_texture_object", GL_EXT_texture_object_functions },
- { "GL_EXT_vertex_array", GL_EXT_vertex_array_functions },
-+ { "GL_IBM_multimode_draw_arrays", GL_IBM_multimode_draw_arrays_functions },
- { "GL_MESA_window_pos", GL_MESA_window_pos_functions },
- { "GL_NV_vertex_program", GL_NV_vertex_program_functions },
- { NULL, NULL }
-@@ -310,8 +320,10 @@ void driInitSingleExtension( GLcontext * ctx,
- */
- offset = _glapi_add_dispatch( functions, parameter_signature );
- if (offset == -1) {
-+#if 0 /* this causes noise with egl */
- fprintf(stderr, "DISPATCH ERROR! _glapi_add_dispatch failed "
- "to add %s!\n", functions[0]);
-+#endif
- }
- else if (ext->functions[i].remap_index != -1) {
- driDispatchRemapTable[ ext->functions[i].remap_index ] =
-@@ -504,6 +516,9 @@ GLboolean driClipRectToFramebuffer( const GLframebuffer *buffer,
- * \c GLX_SWAP_UNDEFINED_OML. See the
- * GLX_OML_swap_method extension spec for more details.
- * \param num_db_modes Number of entries in \c db_modes.
-+ * \param msaa_samples Array of msaa sample count. 0 represents a visual
-+ * without a multisample buffer.
-+ * \param num_msaa_modes Number of entries in \c msaa_samples.
- * \param visType GLX visual type. Usually either \c GLX_TRUE_COLOR or
- * \c GLX_DIRECT_COLOR.
- *
-@@ -523,7 +538,8 @@ __DRIconfig **
- driCreateConfigs(GLenum fb_format, GLenum fb_type,
- const uint8_t * depth_bits, const uint8_t * stencil_bits,
- unsigned num_depth_stencil_bits,
-- const GLenum * db_modes, unsigned num_db_modes)
-+ const GLenum * db_modes, unsigned num_db_modes,
-+ const u_int8_t * msaa_samples, unsigned num_msaa_modes)
- {
- static const uint8_t bits_table[4][4] = {
- /* R G B A */
-@@ -583,9 +599,7 @@ driCreateConfigs(GLenum fb_format, GLenum fb_type,
- int index;
- __DRIconfig **configs, **c;
- __GLcontextModes *modes;
-- unsigned i;
-- unsigned j;
-- unsigned k;
-+ unsigned i, j, k, h;
- unsigned num_modes;
- unsigned num_accum_bits = 2;
-
-@@ -658,7 +672,7 @@ driCreateConfigs(GLenum fb_format, GLenum fb_type,
- break;
- }
-
-- num_modes = num_depth_stencil_bits * num_db_modes * num_accum_bits;
-+ num_modes = num_depth_stencil_bits * num_db_modes * num_accum_bits * num_msaa_modes;
- configs = _mesa_calloc((num_modes + 1) * sizeof *configs);
- if (configs == NULL)
- return NULL;
-@@ -666,66 +680,72 @@ driCreateConfigs(GLenum fb_format, GLenum fb_type,
- c = configs;
- for ( k = 0 ; k < num_depth_stencil_bits ; k++ ) {
- for ( i = 0 ; i < num_db_modes ; i++ ) {
-- for ( j = 0 ; j < num_accum_bits ; j++ ) {
-- *c = _mesa_malloc (sizeof **c);
-- modes = &(*c)->modes;
-- c++;
--
-- memset(modes, 0, sizeof *modes);
-- modes->redBits = bits[0];
-- modes->greenBits = bits[1];
-- modes->blueBits = bits[2];
-- modes->alphaBits = bits[3];
-- modes->redMask = masks[0];
-- modes->greenMask = masks[1];
-- modes->blueMask = masks[2];
-- modes->alphaMask = masks[3];
-- modes->rgbBits = modes->redBits + modes->greenBits
-- + modes->blueBits + modes->alphaBits;
--
-- modes->accumRedBits = 16 * j;
-- modes->accumGreenBits = 16 * j;
-- modes->accumBlueBits = 16 * j;
-- modes->accumAlphaBits = (masks[3] != 0) ? 16 * j : 0;
-- modes->visualRating = (j == 0) ? GLX_NONE : GLX_SLOW_CONFIG;
--
-- modes->stencilBits = stencil_bits[k];
-- modes->depthBits = depth_bits[k];
--
-- modes->transparentPixel = GLX_NONE;
-- modes->transparentRed = GLX_DONT_CARE;
-- modes->transparentGreen = GLX_DONT_CARE;
-- modes->transparentBlue = GLX_DONT_CARE;
-- modes->transparentAlpha = GLX_DONT_CARE;
-- modes->transparentIndex = GLX_DONT_CARE;
-- modes->visualType = GLX_DONT_CARE;
-- modes->renderType = GLX_RGBA_BIT;
-- modes->drawableType = GLX_WINDOW_BIT;
-- modes->rgbMode = GL_TRUE;
--
-- if ( db_modes[i] == GLX_NONE ) {
-- modes->doubleBufferMode = GL_FALSE;
-- }
-- else {
-- modes->doubleBufferMode = GL_TRUE;
-- modes->swapMethod = db_modes[i];
-- }
--
-- modes->haveAccumBuffer = ((modes->accumRedBits +
-+ for ( h = 0 ; h < num_msaa_modes; h++ ) {
-+ for ( j = 0 ; j < num_accum_bits ; j++ ) {
-+ *c = _mesa_malloc (sizeof **c);
-+ modes = &(*c)->modes;
-+ c++;
-+
-+ memset(modes, 0, sizeof *modes);
-+ modes->redBits = bits[0];
-+ modes->greenBits = bits[1];
-+ modes->blueBits = bits[2];
-+ modes->alphaBits = bits[3];
-+ modes->redMask = masks[0];
-+ modes->greenMask = masks[1];
-+ modes->blueMask = masks[2];
-+ modes->alphaMask = masks[3];
-+ modes->rgbBits = modes->redBits + modes->greenBits
-+ + modes->blueBits + modes->alphaBits;
-+
-+ modes->accumRedBits = 16 * j;
-+ modes->accumGreenBits = 16 * j;
-+ modes->accumBlueBits = 16 * j;
-+ modes->accumAlphaBits = (masks[3] != 0) ? 16 * j : 0;
-+ modes->visualRating = (j == 0) ? GLX_NONE : GLX_SLOW_CONFIG;
-+
-+ modes->stencilBits = stencil_bits[k];
-+ modes->depthBits = depth_bits[k];
-+
-+ modes->transparentPixel = GLX_NONE;
-+ modes->transparentRed = GLX_DONT_CARE;
-+ modes->transparentGreen = GLX_DONT_CARE;
-+ modes->transparentBlue = GLX_DONT_CARE;
-+ modes->transparentAlpha = GLX_DONT_CARE;
-+ modes->transparentIndex = GLX_DONT_CARE;
-+ modes->visualType = GLX_DONT_CARE;
-+ modes->renderType = GLX_RGBA_BIT;
-+ modes->drawableType = GLX_WINDOW_BIT;
-+ modes->rgbMode = GL_TRUE;
-+
-+ if ( db_modes[i] == GLX_NONE ) {
-+ modes->doubleBufferMode = GL_FALSE;
-+ }
-+ else {
-+ modes->doubleBufferMode = GL_TRUE;
-+ modes->swapMethod = db_modes[i];
-+ }
-+
-+ modes->samples = msaa_samples[h];
-+ modes->sampleBuffers = modes->samples ? 1 : 0;
-+
-+
-+ modes->haveAccumBuffer = ((modes->accumRedBits +
- modes->accumGreenBits +
- modes->accumBlueBits +
- modes->accumAlphaBits) > 0);
-- modes->haveDepthBuffer = (modes->depthBits > 0);
-- modes->haveStencilBuffer = (modes->stencilBits > 0);
--
-- modes->bindToTextureRgb = GL_TRUE;
-- modes->bindToTextureRgba = GL_TRUE;
-- modes->bindToMipmapTexture = GL_FALSE;
-- modes->bindToTextureTargets = modes->rgbMode ?
-- __DRI_ATTRIB_TEXTURE_1D_BIT |
-- __DRI_ATTRIB_TEXTURE_2D_BIT |
-- __DRI_ATTRIB_TEXTURE_RECTANGLE_BIT :
-- 0;
-+ modes->haveDepthBuffer = (modes->depthBits > 0);
-+ modes->haveStencilBuffer = (modes->stencilBits > 0);
-+
-+ modes->bindToTextureRgb = GL_TRUE;
-+ modes->bindToTextureRgba = GL_TRUE;
-+ modes->bindToMipmapTexture = GL_FALSE;
-+ modes->bindToTextureTargets = modes->rgbMode ?
-+ __DRI_ATTRIB_TEXTURE_1D_BIT |
-+ __DRI_ATTRIB_TEXTURE_2D_BIT |
-+ __DRI_ATTRIB_TEXTURE_RECTANGLE_BIT :
-+ 0;
-+ }
- }
- }
- }
-@@ -734,9 +754,10 @@ driCreateConfigs(GLenum fb_format, GLenum fb_type,
- return configs;
- }
-
--const __DRIconfig **driConcatConfigs(__DRIconfig **a, __DRIconfig **b)
-+__DRIconfig **driConcatConfigs(__DRIconfig **a,
-+ __DRIconfig **b)
- {
-- const __DRIconfig **all;
-+ __DRIconfig **all;
- int i, j, index;
-
- i = 0;
-diff --git a/src/mesa/drivers/dri/common/utils.h b/src/mesa/drivers/dri/common/utils.h
-index 0c974db..9e9e5bc 100644
---- a/src/mesa/drivers/dri/common/utils.h
-+++ b/src/mesa/drivers/dri/common/utils.h
-@@ -131,9 +131,11 @@ extern __DRIconfig **
- driCreateConfigs(GLenum fb_format, GLenum fb_type,
- const uint8_t * depth_bits, const uint8_t * stencil_bits,
- unsigned num_depth_stencil_bits,
-- const GLenum * db_modes, unsigned num_db_modes);
-+ const GLenum * db_modes, unsigned num_db_modes,
-+ const uint8_t * msaa_samples, unsigned num_msaa_modes);
-
--const __DRIconfig **driConcatConfigs(__DRIconfig **a, __DRIconfig **b);
-+__DRIconfig **driConcatConfigs(__DRIconfig **a,
-+ __DRIconfig **b);
-
- int
- driGetConfigAttrib(const __DRIconfig *config,
-diff --git a/src/mesa/drivers/dri/ffb/ffb_xmesa.c b/src/mesa/drivers/dri/ffb/ffb_xmesa.c
-index 679f856..00bdcec 100644
---- a/src/mesa/drivers/dri/ffb/ffb_xmesa.c
-+++ b/src/mesa/drivers/dri/ffb/ffb_xmesa.c
-@@ -260,6 +260,8 @@ ffbCreateContext(const __GLcontextModes *mesaVis,
- ctx->Const.MaxLineWidthAA = 1.0;
- ctx->Const.LineWidthGranularity = 1.0;
-
-+ ctx->Const.MaxDrawBuffers = 1;
-+
- /* Instead of having GCC emit these constants a zillion times
- * everywhere in the driver, put them here.
- */
-@@ -626,6 +628,7 @@ ffbFillInModes( __DRIscreenPrivate *psp,
-
- uint8_t depth_bits_array[3];
- uint8_t stencil_bits_array[3];
-+ uint8_t msaa_samples_array[1];
-
- depth_bits_array[0] = 0;
- depth_bits_array[1] = depth_bits;
-@@ -639,6 +642,8 @@ ffbFillInModes( __DRIscreenPrivate *psp,
- stencil_bits_array[1] = 0;
- stencil_bits_array[2] = (stencil_bits == 0) ? 8 : stencil_bits;
-
-+ msaa_samples_array[0] = 0;
-+
- depth_buffer_factor = ((depth_bits != 0) || (stencil_bits != 0)) ? 3 : 1;
- back_buffer_factor = (have_back_buffer) ? 3 : 1;
-
-@@ -654,9 +659,10 @@ ffbFillInModes( __DRIscreenPrivate *psp,
- configs = driCreateConfigs(fb_format, fb_type,
- depth_bits_array, stencil_bits_array,
- depth_buffer_factor, back_buffer_modes,
-- back_buffer_factor);
-+ back_buffer_factor,
-+ msaa_samples_array, 1);
- if (configs == NULL) {
-- fprintf(stderr, "[%s:%u] Error creating FBConfig!\n", __func__,
-+ fprintf(stderr, "[%s:%u] Error creating FBConfig!\n", __func__,
- __LINE__);
- return NULL;
- }
-diff --git a/src/mesa/drivers/dri/gamma/gamma_context.c b/src/mesa/drivers/dri/gamma/gamma_context.c
-index c91bedc..b0ac299 100644
---- a/src/mesa/drivers/dri/gamma/gamma_context.c
-+++ b/src/mesa/drivers/dri/gamma/gamma_context.c
-@@ -133,6 +133,8 @@ GLboolean gammaCreateContext( const __GLcontextModes *glVisual,
- ctx->Const.MaxPointSizeAA = 16.0;
- ctx->Const.PointSizeGranularity = 0.25;
-
-+ ctx->Const.MaxDrawBuffers = 1;
-+
- gmesa->texHeap = mmInit( 0, gmesa->gammaScreen->textureSize );
-
- make_empty_list(&gmesa->TexObjList);
-diff --git a/src/mesa/drivers/dri/glcore/Makefile b/src/mesa/drivers/dri/glcore/Makefile
-new file mode 100644
-index 0000000..ac7e1de
---- /dev/null
-+++ b/src/mesa/drivers/dri/glcore/Makefile
-@@ -0,0 +1,84 @@
-+# src/mesa/drivers/dri/glcore/Makefile
-+
-+TOP = ../../../../..
-+include $(TOP)/configs/current
-+
-+LIBNAME = glcore_dri.so
-+
-+DRIVER_SOURCES = glcore_driver.c \
-+ $(TOP)/src/mesa/drivers/common/driverfuncs.c \
-+ ../common/dri_util.c
-+
-+C_SOURCES = \
-+ $(DRIVER_SOURCES) \
-+ $(DRI_SOURCES)
-+
-+
-+# Include directories
-+INCLUDE_DIRS = \
-+ -I. \
-+ -I../common \
-+ -I../dri_client \
-+ -I../dri_client/imports \
-+ -Iserver \
-+ -I$(TOP)/include \
-+ -I$(DRM_SOURCE_PATH)/shared-core \
-+ -I$(TOP)/src/mesa \
-+ -I$(TOP)/src/mesa/main \
-+ -I$(TOP)/src/mesa/glapi \
-+ -I$(TOP)/src/mesa/math \
-+ -I$(TOP)/src/mesa/transform \
-+ -I$(TOP)/src/mesa/shader \
-+ -I$(TOP)/src/mesa/swrast \
-+ -I$(TOP)/src/mesa/swrast_setup
-+
-+# Core Mesa objects
-+MESA_MODULES = $(TOP)/src/mesa/libmesa.a
-+
-+# Libraries that the driver shared lib depends on
-+LIB_DEPS = -lm -lpthread -lc
-+# LIB_DEPS = -lGL -lm -lpthread -lc
-+
-+
-+ASM_SOURCES =
-+
-+OBJECTS = $(C_SOURCES:.c=.o) \
-+ $(ASM_SOURCES:.S=.o)
-+
-+
-+##### RULES #####
-+
-+.c.o:
-+ $(CC) -c $(INCLUDE_DIRS) $(CFLAGS) $(DEFINES) $< -o $@
-+
-+.S.o:
-+ $(CC) -c $(INCLUDE_DIRS) $(CFLAGS) $(DEFINES) $< -o $@
-+
-+
-+##### TARGETS #####
-+
-+default: depend $(TOP)/$(LIB_DIR)/$(LIBNAME)
-+
-+
-+$(TOP)/$(LIB_DIR)/$(LIBNAME): $(OBJECTS) $(MESA_MODULES) $(WINOBJ) Makefile
-+ CC="$(CC)" CXX="$(CXX)" $(TOP)/bin/mklib -o $(LIBNAME) -noprefix -install $(TOP)/$(LIB_DIR) \
-+ $(OBJECTS) $(WINLIB) $(LIB_DEPS) $(WINOBJ) $(MESA_MODULES)
-+
-+
-+depend: $(C_SOURCES) $(ASM_SOURCES)
-+ rm -f depend
-+ touch depend
-+ $(MKDEP) $(MKDEP_OPTIONS) $(INCLUDE_DIRS) $(C_SOURCES) $(ASM_SOURCES) \
-+ > /dev/null
-+
-+
-+# Emacs tags
-+tags:
-+ etags `find . -name \*.[ch]` `find ../include`
-+
-+
-+clean:
-+ -rm -f *.o server/*.o
-+
-+
-+include depend
-diff --git a/src/mesa/drivers/dri/i810/i810context.c b/src/mesa/drivers/dri/i810/i810context.c
-index c281a49..6785655 100644
---- a/src/mesa/drivers/dri/i810/i810context.c
-+++ b/src/mesa/drivers/dri/i810/i810context.c
-@@ -63,11 +63,6 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- #include "drirenderbuffer.h"
- #include "utils.h"
-
--#define need_GL_ARB_multisample
--#define need_GL_ARB_texture_compression
--#define need_GL_ARB_vertex_buffer_object
--#include "extension_helper.h"
--
- #ifndef I810_DEBUG
- int I810_DEBUG = (0);
- #endif
-@@ -123,14 +118,11 @@ static void i810BufferSize(GLframebuffer *buffer, GLuint *width, GLuint *height)
- */
- const struct dri_extension card_extensions[] =
- {
-- { "GL_ARB_multisample", GL_ARB_multisample_functions },
- { "GL_ARB_multitexture", NULL },
-- { "GL_ARB_texture_compression", GL_ARB_texture_compression_functions },
- { "GL_ARB_texture_env_add", NULL },
- { "GL_ARB_texture_env_combine", NULL },
- { "GL_ARB_texture_env_crossbar", NULL },
- { "GL_ARB_texture_mirrored_repeat", NULL },
-- { "GL_ARB_vertex_buffer_object", GL_ARB_vertex_buffer_object_functions },
- { "GL_EXT_stencil_wrap", NULL },
- { "GL_EXT_texture_edge_clamp", NULL },
- { "GL_EXT_texture_env_combine", NULL },
-diff --git a/src/mesa/drivers/dri/i810/i810screen.c b/src/mesa/drivers/dri/i810/i810screen.c
-index 48603f5..9a5a39c 100644
---- a/src/mesa/drivers/dri/i810/i810screen.c
-+++ b/src/mesa/drivers/dri/i810/i810screen.c
-@@ -77,6 +77,7 @@ i810FillInModes( __DRIscreenPrivate *psp,
-
- uint8_t depth_bits_array[2];
- uint8_t stencil_bits_array[2];
-+ uint8_t msaa_samples_array[1];
-
- depth_bits_array[0] = depth_bits;
- depth_bits_array[1] = depth_bits;
-@@ -88,13 +89,16 @@ i810FillInModes( __DRIscreenPrivate *psp,
- stencil_bits_array[0] = 0;
- stencil_bits_array[1] = (stencil_bits == 0) ? 8 : stencil_bits;
-
-+ msaa_samples_array[0] = 0;
-+
- depth_buffer_factor = ((depth_bits != 0) || (stencil_bits != 0)) ? 2 : 1;
- back_buffer_factor = (have_back_buffer) ? 2 : 1;
-
- configs = driCreateConfigs(GL_RGB, GL_UNSIGNED_SHORT_5_6_5,
- depth_bits_array, stencil_bits_array,
- depth_buffer_factor,
-- back_buffer_modes, back_buffer_factor);
-+ back_buffer_modes, back_buffer_factor,
-+ msaa_samples_array, 1);
- if (configs == NULL) {
- fprintf( stderr, "[%s:%u] Error creating FBConfig!\n",
- __func__, __LINE__ );
-diff --git a/src/mesa/drivers/dri/i915/Makefile b/src/mesa/drivers/dri/i915/Makefile
-index 5858e0e..954a7e2 100644
---- a/src/mesa/drivers/dri/i915/Makefile
-+++ b/src/mesa/drivers/dri/i915/Makefile
-@@ -18,8 +18,9 @@ DRIVER_SOURCES = \
- intel_regions.c \
- intel_buffer_objects.c \
- intel_batchbuffer.c \
-+ intel_clear.c \
-+ intel_extensions.c \
- intel_mipmap_tree.c \
-- i915_tex_layout.c \
- intel_tex_layout.c \
- intel_tex_image.c \
- intel_tex_subimage.c \
-@@ -34,7 +35,9 @@ DRIVER_SOURCES = \
- intel_pixel_read.c \
- intel_buffers.c \
- intel_blit.c \
-+ intel_swapbuffers.c \
- i915_tex.c \
-+ i915_tex_layout.c \
- i915_texstate.c \
- i915_context.c \
- i915_debug.c \
-@@ -50,8 +53,7 @@ DRIVER_SOURCES = \
- intel_span.c \
- intel_state.c \
- intel_tris.c \
-- intel_fbo.c \
-- intel_depthstencil.c
-+ intel_fbo.c
-
- C_SOURCES = \
- $(COMMON_SOURCES) \
-diff --git a/src/mesa/drivers/dri/i915/i830_context.c b/src/mesa/drivers/dri/i915/i830_context.c
-index 09b1ec9..9c540cb 100644
---- a/src/mesa/drivers/dri/i915/i830_context.c
-+++ b/src/mesa/drivers/dri/i915/i830_context.c
-@@ -73,6 +73,8 @@ i830CreateContext(const __GLcontextModes * mesaVis,
- return GL_FALSE;
- }
-
-+ _math_matrix_ctr(&intel->ViewportMatrix);
-+
- /* Initialize swrast, tnl driver tables: */
- intelInitSpanFuncs(ctx);
- intelInitTriFuncs(ctx);
-@@ -97,6 +99,8 @@ i830CreateContext(const __GLcontextModes * mesaVis,
- ctx->Const.MaxTextureRectSize = (1 << 11);
- ctx->Const.MaxTextureUnits = I830_TEX_UNITS;
-
-+ ctx->Const.MaxDrawBuffers = 1;
-+
- _tnl_init_vertices(ctx, ctx->Const.MaxArrayLockSize + 12,
- 18 * sizeof(GLfloat));
-
-diff --git a/src/mesa/drivers/dri/i915/i915_context.c b/src/mesa/drivers/dri/i915/i915_context.c
-index 3d6af38..7549029 100644
---- a/src/mesa/drivers/dri/i915/i915_context.c
-+++ b/src/mesa/drivers/dri/i915/i915_context.c
-@@ -50,16 +50,6 @@
- * Mesa's Driver Functions
- ***************************************/
-
--static const struct dri_extension i915_extensions[] = {
-- {"GL_ARB_depth_texture", NULL},
-- {"GL_ARB_fragment_program", NULL},
-- {"GL_ARB_shadow", NULL},
-- {"GL_ARB_texture_non_power_of_two", NULL},
-- {"GL_ATI_texture_env_combine3", NULL},
-- {"GL_EXT_shadow_funcs", NULL},
-- {NULL, NULL}
--};
--
- /* Override intel default.
- */
- static void
-@@ -129,6 +119,8 @@ i915CreateContext(const __GLcontextModes * mesaVis,
- return GL_FALSE;
- }
-
-+ _math_matrix_ctr(&intel->ViewportMatrix);
-+
- /* Initialize swrast, tnl driver tables: */
- intelInitSpanFuncs(ctx);
- intelInitTriFuncs(ctx);
-@@ -172,8 +164,7 @@ i915CreateContext(const __GLcontextModes * mesaVis,
-
- ctx->FragmentProgram._MaintainTexEnvProgram = GL_TRUE;
-
-- driInitExtensions(ctx, i915_extensions, GL_FALSE);
--
-+ ctx->Const.MaxDrawBuffers = 1;
-
- _tnl_init_vertices(ctx, ctx->Const.MaxArrayLockSize + 12,
- 36 * sizeof(GLfloat));
-diff --git a/src/mesa/drivers/dri/i915/i915_state.c b/src/mesa/drivers/dri/i915/i915_state.c
-index a53f120..814fb59 100644
---- a/src/mesa/drivers/dri/i915/i915_state.c
-+++ b/src/mesa/drivers/dri/i915/i915_state.c
-@@ -41,6 +41,7 @@
- #include "intel_fbo.h"
- #include "intel_screen.h"
- #include "intel_batchbuffer.h"
-+#include "intel_buffers.h"
-
- #include "i915_context.h"
- #include "i915_reg.h"
-@@ -301,6 +302,65 @@ i915DepthMask(GLcontext * ctx, GLboolean flag)
- i915->state.Ctx[I915_CTXREG_LIS6] &= ~S6_DEPTH_WRITE_ENABLE;
- }
-
-+
-+
-+/**
-+ * Update the viewport transformation matrix. Depends on:
-+ * - viewport pos/size
-+ * - depthrange
-+ * - window pos/size or FBO size
-+ */
-+void
-+intelCalcViewport(GLcontext * ctx)
-+{
-+ struct intel_context *intel = intel_context(ctx);
-+ const GLfloat *v = ctx->Viewport._WindowMap.m;
-+ const GLfloat depthScale = 1.0F / ctx->DrawBuffer->_DepthMaxF;
-+ GLfloat *m = intel->ViewportMatrix.m;
-+ GLfloat yScale, yBias;
-+
-+ if (ctx->DrawBuffer->Name) {
-+ /* User created FBO */
-+ /* y=0=bottom */
-+ yScale = 1.0;
-+ yBias = 0.0;
-+ }
-+ else {
-+ /* window buffer, y=0=top */
-+ yScale = -1.0;
-+ yBias = (intel->driDrawable) ? intel->driDrawable->h : 0.0F;
-+ }
-+
-+ m[MAT_SX] = v[MAT_SX];
-+ m[MAT_TX] = v[MAT_TX];
-+
-+ m[MAT_SY] = v[MAT_SY] * yScale;
-+ m[MAT_TY] = v[MAT_TY] * yScale + yBias;
-+
-+ m[MAT_SZ] = v[MAT_SZ] * depthScale;
-+ m[MAT_TZ] = v[MAT_TZ] * depthScale;
-+}
-+
-+
-+/** Called from ctx->Driver.Viewport() */
-+static void
-+i915Viewport(GLcontext * ctx,
-+ GLint x, GLint y, GLsizei width, GLsizei height)
-+{
-+ intelCalcViewport(ctx);
-+
-+ intel_viewport(ctx, x, y, width, height);
-+}
-+
-+
-+/** Called from ctx->Driver.DepthRange() */
-+static void
-+i915DepthRange(GLcontext * ctx, GLclampd nearval, GLclampd farval)
-+{
-+ intelCalcViewport(ctx);
-+}
-+
-+
- /* =============================================================
- * Polygon stipple
- *
-@@ -964,6 +1024,8 @@ i915InitStateFunctions(struct dd_function_table *functions)
- functions->StencilFuncSeparate = i915StencilFuncSeparate;
- functions->StencilMaskSeparate = i915StencilMaskSeparate;
- functions->StencilOpSeparate = i915StencilOpSeparate;
-+ functions->DepthRange = i915DepthRange;
-+ functions->Viewport = i915Viewport;
- }
-
-
-diff --git a/src/mesa/drivers/dri/i915/intel_state.c b/src/mesa/drivers/dri/i915/intel_state.c
-deleted file mode 100644
-index 4aa43e5..519672f
---- a/src/mesa/drivers/dri/i915/intel_state.c
-+++ /dev/null
-@@ -1,297 +0,0 @@
--/**************************************************************************
-- *
-- * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas.
-- * All Rights Reserved.
-- *
-- * Permission is hereby granted, free of charge, to any person obtaining a
-- * copy of this software and associated documentation files (the
-- * "Software"), to deal in the Software without restriction, including
-- * without limitation the rights to use, copy, modify, merge, publish,
-- * distribute, sub license, and/or sell copies of the Software, and to
-- * permit persons to whom the Software is furnished to do so, subject to
-- * the following conditions:
-- *
-- * The above copyright notice and this permission notice (including the
-- * next paragraph) shall be included in all copies or substantial portions
-- * of the Software.
-- *
-- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
-- * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
-- * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-- *
-- **************************************************************************/
--
--
--#include "main/glheader.h"
--#include "main/context.h"
--#include "main/macros.h"
--#include "main/enums.h"
--#include "main/colormac.h"
--#include "main/dd.h"
--
--#include "intel_screen.h"
--#include "intel_context.h"
--#include "intel_fbo.h"
--#include "intel_regions.h"
--#include "swrast/swrast.h"
--
--int
--intel_translate_shadow_compare_func( GLenum func )
--{
-- switch(func) {
-- case GL_NEVER:
-- return COMPAREFUNC_ALWAYS;
-- case GL_LESS:
-- return COMPAREFUNC_LEQUAL;
-- case GL_LEQUAL:
-- return COMPAREFUNC_LESS;
-- case GL_GREATER:
-- return COMPAREFUNC_GEQUAL;
-- case GL_GEQUAL:
-- return COMPAREFUNC_GREATER;
-- case GL_NOTEQUAL:
-- return COMPAREFUNC_EQUAL;
-- case GL_EQUAL:
-- return COMPAREFUNC_NOTEQUAL;
-- case GL_ALWAYS:
-- return COMPAREFUNC_NEVER;
-- }
--
-- fprintf(stderr, "Unknown value in %s: %x\n", __FUNCTION__, func);
-- return COMPAREFUNC_NEVER;
--}
--
--int
--intel_translate_compare_func(GLenum func)
--{
-- switch (func) {
-- case GL_NEVER:
-- return COMPAREFUNC_NEVER;
-- case GL_LESS:
-- return COMPAREFUNC_LESS;
-- case GL_LEQUAL:
-- return COMPAREFUNC_LEQUAL;
-- case GL_GREATER:
-- return COMPAREFUNC_GREATER;
-- case GL_GEQUAL:
-- return COMPAREFUNC_GEQUAL;
-- case GL_NOTEQUAL:
-- return COMPAREFUNC_NOTEQUAL;
-- case GL_EQUAL:
-- return COMPAREFUNC_EQUAL;
-- case GL_ALWAYS:
-- return COMPAREFUNC_ALWAYS;
-- }
--
-- fprintf(stderr, "Unknown value in %s: %x\n", __FUNCTION__, func);
-- return COMPAREFUNC_ALWAYS;
--}
--
--int
--intel_translate_stencil_op(GLenum op)
--{
-- switch (op) {
-- case GL_KEEP:
-- return STENCILOP_KEEP;
-- case GL_ZERO:
-- return STENCILOP_ZERO;
-- case GL_REPLACE:
-- return STENCILOP_REPLACE;
-- case GL_INCR:
-- return STENCILOP_INCRSAT;
-- case GL_DECR:
-- return STENCILOP_DECRSAT;
-- case GL_INCR_WRAP:
-- return STENCILOP_INCR;
-- case GL_DECR_WRAP:
-- return STENCILOP_DECR;
-- case GL_INVERT:
-- return STENCILOP_INVERT;
-- default:
-- return STENCILOP_ZERO;
-- }
--}
--
--int
--intel_translate_blend_factor(GLenum factor)
--{
-- switch (factor) {
-- case GL_ZERO:
-- return BLENDFACT_ZERO;
-- case GL_SRC_ALPHA:
-- return BLENDFACT_SRC_ALPHA;
-- case GL_ONE:
-- return BLENDFACT_ONE;
-- case GL_SRC_COLOR:
-- return BLENDFACT_SRC_COLR;
-- case GL_ONE_MINUS_SRC_COLOR:
-- return BLENDFACT_INV_SRC_COLR;
-- case GL_DST_COLOR:
-- return BLENDFACT_DST_COLR;
-- case GL_ONE_MINUS_DST_COLOR:
-- return BLENDFACT_INV_DST_COLR;
-- case GL_ONE_MINUS_SRC_ALPHA:
-- return BLENDFACT_INV_SRC_ALPHA;
-- case GL_DST_ALPHA:
-- return BLENDFACT_DST_ALPHA;
-- case GL_ONE_MINUS_DST_ALPHA:
-- return BLENDFACT_INV_DST_ALPHA;
-- case GL_SRC_ALPHA_SATURATE:
-- return BLENDFACT_SRC_ALPHA_SATURATE;
-- case GL_CONSTANT_COLOR:
-- return BLENDFACT_CONST_COLOR;
-- case GL_ONE_MINUS_CONSTANT_COLOR:
-- return BLENDFACT_INV_CONST_COLOR;
-- case GL_CONSTANT_ALPHA:
-- return BLENDFACT_CONST_ALPHA;
-- case GL_ONE_MINUS_CONSTANT_ALPHA:
-- return BLENDFACT_INV_CONST_ALPHA;
-- }
--
-- fprintf(stderr, "Unknown value in %s: %x\n", __FUNCTION__, factor);
-- return BLENDFACT_ZERO;
--}
--
--int
--intel_translate_logic_op(GLenum opcode)
--{
-- switch (opcode) {
-- case GL_CLEAR:
-- return LOGICOP_CLEAR;
-- case GL_AND:
-- return LOGICOP_AND;
-- case GL_AND_REVERSE:
-- return LOGICOP_AND_RVRSE;
-- case GL_COPY:
-- return LOGICOP_COPY;
-- case GL_COPY_INVERTED:
-- return LOGICOP_COPY_INV;
-- case GL_AND_INVERTED:
-- return LOGICOP_AND_INV;
-- case GL_NOOP:
-- return LOGICOP_NOOP;
-- case GL_XOR:
-- return LOGICOP_XOR;
-- case GL_OR:
-- return LOGICOP_OR;
-- case GL_OR_INVERTED:
-- return LOGICOP_OR_INV;
-- case GL_NOR:
-- return LOGICOP_NOR;
-- case GL_EQUIV:
-- return LOGICOP_EQUIV;
-- case GL_INVERT:
-- return LOGICOP_INV;
-- case GL_OR_REVERSE:
-- return LOGICOP_OR_RVRSE;
-- case GL_NAND:
-- return LOGICOP_NAND;
-- case GL_SET:
-- return LOGICOP_SET;
-- default:
-- return LOGICOP_SET;
-- }
--}
--
--
--static void
--intelClearColor(GLcontext * ctx, const GLfloat color[4])
--{
-- struct intel_context *intel = intel_context(ctx);
-- GLubyte clear[4];
--
-- CLAMPED_FLOAT_TO_UBYTE(clear[0], color[0]);
-- CLAMPED_FLOAT_TO_UBYTE(clear[1], color[1]);
-- CLAMPED_FLOAT_TO_UBYTE(clear[2], color[2]);
-- CLAMPED_FLOAT_TO_UBYTE(clear[3], color[3]);
--
-- /* compute both 32 and 16-bit clear values */
-- intel->ClearColor8888 = INTEL_PACKCOLOR8888(clear[0], clear[1],
-- clear[2], clear[3]);
-- intel->ClearColor565 = INTEL_PACKCOLOR565(clear[0], clear[1], clear[2]);
--}
--
--
--/**
-- * Update the viewport transformation matrix. Depends on:
-- * - viewport pos/size
-- * - depthrange
-- * - window pos/size or FBO size
-- */
--static void
--intelCalcViewport(GLcontext * ctx)
--{
-- struct intel_context *intel = intel_context(ctx);
-- const GLfloat *v = ctx->Viewport._WindowMap.m;
-- const GLfloat depthScale = 1.0F / ctx->DrawBuffer->_DepthMaxF;
-- GLfloat *m = intel->ViewportMatrix.m;
-- GLfloat yScale, yBias;
--
-- if (ctx->DrawBuffer->Name) {
-- /* User created FBO */
-- struct intel_renderbuffer *irb
-- = intel_renderbuffer(ctx->DrawBuffer->_ColorDrawBuffers[0]);
-- if (irb && !irb->RenderToTexture) {
-- /* y=0=top */
-- yScale = -1.0;
-- yBias = irb->Base.Height;
-- }
-- else {
-- /* y=0=bottom */
-- yScale = 1.0;
-- yBias = 0.0;
-- }
-- }
-- else {
-- /* window buffer, y=0=top */
-- yScale = -1.0;
-- yBias = (intel->driDrawable) ? intel->driDrawable->h : 0.0F;
-- }
--
-- m[MAT_SX] = v[MAT_SX];
-- m[MAT_TX] = v[MAT_TX];
--
-- m[MAT_SY] = v[MAT_SY] * yScale;
-- m[MAT_TY] = v[MAT_TY] * yScale + yBias;
--
-- m[MAT_SZ] = v[MAT_SZ] * depthScale;
-- m[MAT_TZ] = v[MAT_TZ] * depthScale;
--}
--
--static void
--intelViewport(GLcontext * ctx,
-- GLint x, GLint y, GLsizei width, GLsizei height)
--{
-- intelCalcViewport(ctx);
--
-- intel_viewport(ctx, x, y, width, height);
--}
--
--static void
--intelDepthRange(GLcontext * ctx, GLclampd nearval, GLclampd farval)
--{
-- intelCalcViewport(ctx);
--}
--
--/* Fallback to swrast for select and feedback.
-- */
--static void
--intelRenderMode(GLcontext * ctx, GLenum mode)
--{
-- struct intel_context *intel = intel_context(ctx);
-- FALLBACK(intel, INTEL_FALLBACK_RENDERMODE, (mode != GL_RENDER));
--}
--
--
--void
--intelInitStateFuncs(struct dd_function_table *functions)
--{
-- functions->RenderMode = intelRenderMode;
-- functions->Viewport = intelViewport;
-- functions->DepthRange = intelDepthRange;
-- functions->ClearColor = intelClearColor;
--}
-diff --git a/src/mesa/drivers/dri/i965/Makefile b/src/mesa/drivers/dri/i965/Makefile
-index 37a470f..2934414 100644
---- a/src/mesa/drivers/dri/i965/Makefile
-+++ b/src/mesa/drivers/dri/i965/Makefile
-@@ -9,9 +9,10 @@ DRIVER_SOURCES = \
- intel_blit.c \
- intel_buffer_objects.c \
- intel_buffers.c \
-+ intel_clear.c \
- intel_context.c \
- intel_decode.c \
-- intel_depthstencil.c \
-+ intel_extensions.c \
- intel_fbo.c \
- intel_mipmap_tree.c \
- intel_regions.c \
-@@ -22,6 +23,7 @@ DRIVER_SOURCES = \
- intel_pixel_copy.c \
- intel_pixel_draw.c \
- intel_state.c \
-+ intel_swapbuffers.c \
- intel_tex.c \
- intel_tex_copy.c \
- intel_tex_format.c \
-@@ -49,7 +51,6 @@ DRIVER_SOURCES = \
- brw_gs.c \
- brw_gs_emit.c \
- brw_gs_state.c \
-- brw_metaops.c \
- brw_misc_state.c \
- brw_program.c \
- brw_queryobj.c \
-diff --git a/src/mesa/drivers/dri/i965/brw_cc.c b/src/mesa/drivers/dri/i965/brw_cc.c
-index fa8121e..8237016 100644
---- a/src/mesa/drivers/dri/i965/brw_cc.c
-+++ b/src/mesa/drivers/dri/i965/brw_cc.c
-@@ -83,59 +83,60 @@ struct brw_cc_unit_key {
- static void
- cc_unit_populate_key(struct brw_context *brw, struct brw_cc_unit_key *key)
- {
-- struct gl_stencil_attrib *stencil = brw->attribs.Stencil;
-+ GLcontext *ctx = &brw->intel.ctx;
-+ const unsigned back = ctx->Stencil._BackFace;
-
- memset(key, 0, sizeof(*key));
-
-- key->stencil = stencil->Enabled;
-- key->stencil_two_side = stencil->_TestTwoSide;
-+ key->stencil = ctx->Stencil.Enabled;
-+ key->stencil_two_side = ctx->Stencil._TestTwoSide;
-
- if (key->stencil) {
-- key->stencil_func[0] = stencil->Function[0];
-- key->stencil_fail_op[0] = stencil->FailFunc[0];
-- key->stencil_pass_depth_fail_op[0] = stencil->ZFailFunc[0];
-- key->stencil_pass_depth_pass_op[0] = stencil->ZPassFunc[0];
-- key->stencil_ref[0] = stencil->Ref[0];
-- key->stencil_write_mask[0] = stencil->WriteMask[0];
-- key->stencil_test_mask[0] = stencil->ValueMask[0];
-+ key->stencil_func[0] = ctx->Stencil.Function[0];
-+ key->stencil_fail_op[0] = ctx->Stencil.FailFunc[0];
-+ key->stencil_pass_depth_fail_op[0] = ctx->Stencil.ZFailFunc[0];
-+ key->stencil_pass_depth_pass_op[0] = ctx->Stencil.ZPassFunc[0];
-+ key->stencil_ref[0] = ctx->Stencil.Ref[0];
-+ key->stencil_write_mask[0] = ctx->Stencil.WriteMask[0];
-+ key->stencil_test_mask[0] = ctx->Stencil.ValueMask[0];
- }
- if (key->stencil_two_side) {
-- key->stencil_func[1] = stencil->Function[1];
-- key->stencil_fail_op[1] = stencil->FailFunc[1];
-- key->stencil_pass_depth_fail_op[1] = stencil->ZFailFunc[1];
-- key->stencil_pass_depth_pass_op[1] = stencil->ZPassFunc[1];
-- key->stencil_ref[1] = stencil->Ref[1];
-- key->stencil_write_mask[1] = stencil->WriteMask[1];
-- key->stencil_test_mask[1] = stencil->ValueMask[1];
-+ key->stencil_func[1] = ctx->Stencil.Function[back];
-+ key->stencil_fail_op[1] = ctx->Stencil.FailFunc[back];
-+ key->stencil_pass_depth_fail_op[1] = ctx->Stencil.ZFailFunc[back];
-+ key->stencil_pass_depth_pass_op[1] = ctx->Stencil.ZPassFunc[back];
-+ key->stencil_ref[1] = ctx->Stencil.Ref[back];
-+ key->stencil_write_mask[1] = ctx->Stencil.WriteMask[back];
-+ key->stencil_test_mask[1] = ctx->Stencil.ValueMask[back];
- }
-
-- if (brw->attribs.Color->_LogicOpEnabled)
-- key->logic_op = brw->attribs.Color->LogicOp;
-+ if (ctx->Color._LogicOpEnabled)
-+ key->logic_op = ctx->Color.LogicOp;
- else
- key->logic_op = GL_COPY;
-
-- key->color_blend = brw->attribs.Color->BlendEnabled;
-+ key->color_blend = ctx->Color.BlendEnabled;
- if (key->color_blend) {
-- key->blend_eq_rgb = brw->attribs.Color->BlendEquationRGB;
-- key->blend_eq_a = brw->attribs.Color->BlendEquationA;
-- key->blend_src_rgb = brw->attribs.Color->BlendSrcRGB;
-- key->blend_dst_rgb = brw->attribs.Color->BlendDstRGB;
-- key->blend_src_a = brw->attribs.Color->BlendSrcA;
-- key->blend_dst_a = brw->attribs.Color->BlendDstA;
-+ key->blend_eq_rgb = ctx->Color.BlendEquationRGB;
-+ key->blend_eq_a = ctx->Color.BlendEquationA;
-+ key->blend_src_rgb = ctx->Color.BlendSrcRGB;
-+ key->blend_dst_rgb = ctx->Color.BlendDstRGB;
-+ key->blend_src_a = ctx->Color.BlendSrcA;
-+ key->blend_dst_a = ctx->Color.BlendDstA;
- }
-
-- key->alpha_enabled = brw->attribs.Color->AlphaEnabled;
-+ key->alpha_enabled = ctx->Color.AlphaEnabled;
- if (key->alpha_enabled) {
-- key->alpha_func = brw->attribs.Color->AlphaFunc;
-- key->alpha_ref = brw->attribs.Color->AlphaRef;
-+ key->alpha_func = ctx->Color.AlphaFunc;
-+ key->alpha_ref = ctx->Color.AlphaRef;
- }
-
-- key->dither = brw->attribs.Color->DitherFlag;
-+ key->dither = ctx->Color.DitherFlag;
-
-- key->depth_test = brw->attribs.Depth->Test;
-+ key->depth_test = ctx->Depth.Test;
- if (key->depth_test) {
-- key->depth_func = brw->attribs.Depth->Func;
-- key->depth_write = brw->attribs.Depth->Mask;
-+ key->depth_func = ctx->Depth.Func;
-+ key->depth_write = ctx->Depth.Mask;
- }
- }
-
-diff --git a/src/mesa/drivers/dri/i965/brw_clip.c b/src/mesa/drivers/dri/i965/brw_clip.c
-index 38d8b70..5cffceb 100644
---- a/src/mesa/drivers/dri/i965/brw_clip.c
-+++ b/src/mesa/drivers/dri/i965/brw_clip.c
-@@ -145,14 +145,14 @@ static void upload_clip_prog(struct brw_context *brw)
- /* CACHE_NEW_VS_PROG */
- key.attrs = brw->vs.prog_data->outputs_written;
- /* _NEW_LIGHT */
-- key.do_flat_shading = (brw->attribs.Light->ShadeModel == GL_FLAT);
-+ key.do_flat_shading = (ctx->Light.ShadeModel == GL_FLAT);
- /* _NEW_TRANSFORM */
-- key.nr_userclip = brw_count_bits(brw->attribs.Transform->ClipPlanesEnabled);
-+ key.nr_userclip = brw_count_bits(ctx->Transform.ClipPlanesEnabled);
- key.clip_mode = BRW_CLIPMODE_NORMAL;
-
- /* _NEW_POLYGON */
- if (key.primitive == GL_TRIANGLES) {
-- if (brw->attribs.Polygon->CullFaceMode == GL_FRONT_AND_BACK)
-+ if (ctx->Polygon.CullFaceMode == GL_FRONT_AND_BACK)
- key.clip_mode = BRW_CLIPMODE_REJECT_ALL;
- else {
- GLuint fill_front = CLIP_CULL;
-@@ -160,44 +160,44 @@ static void upload_clip_prog(struct brw_context *brw)
- GLuint offset_front = 0;
- GLuint offset_back = 0;
-
-- if (!brw->attribs.Polygon->CullFlag ||
-- brw->attribs.Polygon->CullFaceMode != GL_FRONT) {
-- switch (brw->attribs.Polygon->FrontMode) {
-+ if (!ctx->Polygon.CullFlag ||
-+ ctx->Polygon.CullFaceMode != GL_FRONT) {
-+ switch (ctx->Polygon.FrontMode) {
- case GL_FILL:
- fill_front = CLIP_FILL;
- offset_front = 0;
- break;
- case GL_LINE:
- fill_front = CLIP_LINE;
-- offset_front = brw->attribs.Polygon->OffsetLine;
-+ offset_front = ctx->Polygon.OffsetLine;
- break;
- case GL_POINT:
- fill_front = CLIP_POINT;
-- offset_front = brw->attribs.Polygon->OffsetPoint;
-+ offset_front = ctx->Polygon.OffsetPoint;
- break;
- }
- }
-
-- if (!brw->attribs.Polygon->CullFlag ||
-- brw->attribs.Polygon->CullFaceMode != GL_BACK) {
-- switch (brw->attribs.Polygon->BackMode) {
-+ if (!ctx->Polygon.CullFlag ||
-+ ctx->Polygon.CullFaceMode != GL_BACK) {
-+ switch (ctx->Polygon.BackMode) {
- case GL_FILL:
- fill_back = CLIP_FILL;
- offset_back = 0;
- break;
- case GL_LINE:
- fill_back = CLIP_LINE;
-- offset_back = brw->attribs.Polygon->OffsetLine;
-+ offset_back = ctx->Polygon.OffsetLine;
- break;
- case GL_POINT:
- fill_back = CLIP_POINT;
-- offset_back = brw->attribs.Polygon->OffsetPoint;
-+ offset_back = ctx->Polygon.OffsetPoint;
- break;
- }
- }
-
-- if (brw->attribs.Polygon->BackMode != GL_FILL ||
-- brw->attribs.Polygon->FrontMode != GL_FILL) {
-+ if (ctx->Polygon.BackMode != GL_FILL ||
-+ ctx->Polygon.FrontMode != GL_FILL) {
- key.do_unfilled = 1;
-
- /* Most cases the fixed function units will handle. Cases where
-@@ -207,17 +207,17 @@ static void upload_clip_prog(struct brw_context *brw)
-
- if (offset_back || offset_front) {
- /* _NEW_POLYGON, _NEW_BUFFERS */
-- key.offset_units = brw->attribs.Polygon->OffsetUnits * brw->intel.polygon_offset_scale;
-- key.offset_factor = brw->attribs.Polygon->OffsetFactor * ctx->DrawBuffer->_MRD;
-+ key.offset_units = ctx->Polygon.OffsetUnits * brw->intel.polygon_offset_scale;
-+ key.offset_factor = ctx->Polygon.OffsetFactor * ctx->DrawBuffer->_MRD;
- }
-
-- switch (brw->attribs.Polygon->FrontFace) {
-+ switch (ctx->Polygon.FrontFace) {
- case GL_CCW:
- key.fill_ccw = fill_front;
- key.fill_cw = fill_back;
- key.offset_ccw = offset_front;
- key.offset_cw = offset_back;
-- if (brw->attribs.Light->Model.TwoSide &&
-+ if (ctx->Light.Model.TwoSide &&
- key.fill_cw != CLIP_CULL)
- key.copy_bfc_cw = 1;
- break;
-@@ -226,7 +226,7 @@ static void upload_clip_prog(struct brw_context *brw)
- key.fill_ccw = fill_back;
- key.offset_cw = offset_front;
- key.offset_ccw = offset_back;
-- if (brw->attribs.Light->Model.TwoSide &&
-+ if (ctx->Light.Model.TwoSide &&
- key.fill_ccw != CLIP_CULL)
- key.copy_bfc_ccw = 1;
- break;
-diff --git a/src/mesa/drivers/dri/i965/brw_clip_line.c b/src/mesa/drivers/dri/i965/brw_clip_line.c
-index c45d48d..d830e49 100644
---- a/src/mesa/drivers/dri/i965/brw_clip_line.c
-+++ b/src/mesa/drivers/dri/i965/brw_clip_line.c
-@@ -181,34 +181,54 @@ static void clip_and_emit_line( struct brw_clip_compile *c )
- brw_DP4(p, vec4(c->reg.dp1), deref_4f(vtx1, c->offset[VERT_RESULT_HPOS]), c->reg.plane_equation);
- is_negative = brw_IF(p, BRW_EXECUTE_1);
- {
-- brw_ADD(p, c->reg.t, c->reg.dp1, negate(c->reg.dp0));
-- brw_math_invert(p, c->reg.t, c->reg.t);
-- brw_MUL(p, c->reg.t, c->reg.t, c->reg.dp1);
--
-- brw_CMP(p, vec1(brw_null_reg()), BRW_CONDITIONAL_G, c->reg.t, c->reg.t1 );
-- brw_MOV(p, c->reg.t1, c->reg.t);
-- brw_set_predicate_control(p, BRW_PREDICATE_NONE);
-+ /*
-+ * Both can be negative on GM965/G965 due to RHW workaround
-+ * if so, this object should be rejected.
-+ */
-+ if (!BRW_IS_G4X(p->brw)) {
-+ brw_CMP(p, vec1(brw_null_reg()), BRW_CONDITIONAL_LE, c->reg.dp0, brw_imm_f(0.0));
-+ is_neg2 = brw_IF(p, BRW_EXECUTE_1);
-+ {
-+ brw_clip_kill_thread(c);
-+ }
-+ brw_ENDIF(p, is_neg2);
-+ }
-+
-+ brw_ADD(p, c->reg.t, c->reg.dp1, negate(c->reg.dp0));
-+ brw_math_invert(p, c->reg.t, c->reg.t);
-+ brw_MUL(p, c->reg.t, c->reg.t, c->reg.dp1);
-+
-+ brw_CMP(p, vec1(brw_null_reg()), BRW_CONDITIONAL_G, c->reg.t, c->reg.t1 );
-+ brw_MOV(p, c->reg.t1, c->reg.t);
-+ brw_set_predicate_control(p, BRW_PREDICATE_NONE);
- }
- is_negative = brw_ELSE(p, is_negative);
- {
-- /* Coming back in. We know that both cannot be negative
-- * because the line would have been culled in that case.
-- */
-+ /* Coming back in. We know that both cannot be negative
-+ * because the line would have been culled in that case.
-+ */
-+
-+ /* If both are positive, do nothing */
-+ /* Only on GM965/G965 */
-+ if (!BRW_IS_G4X(p->brw)) {
-+ brw_CMP(p, vec1(brw_null_reg()), BRW_CONDITIONAL_L, c->reg.dp0, brw_imm_f(0.0));
-+ is_neg2 = brw_IF(p, BRW_EXECUTE_1);
-+ }
-
-- /* If both are positive, do nothing */
-- brw_CMP(p, vec1(brw_null_reg()), BRW_CONDITIONAL_L, c->reg.dp0, brw_imm_f(0.0));
-- is_neg2 = brw_IF(p, BRW_EXECUTE_1);
- {
-- brw_ADD(p, c->reg.t, c->reg.dp0, negate(c->reg.dp1));
-- brw_math_invert(p, c->reg.t, c->reg.t);
-- brw_MUL(p, c->reg.t, c->reg.t, c->reg.dp0);
--
-- brw_CMP(p, vec1(brw_null_reg()), BRW_CONDITIONAL_G, c->reg.t, c->reg.t0 );
-- brw_MOV(p, c->reg.t0, c->reg.t);
-- brw_set_predicate_control(p, BRW_PREDICATE_NONE);
-- }
-- brw_ENDIF(p, is_neg2);
-- }
-+ brw_ADD(p, c->reg.t, c->reg.dp0, negate(c->reg.dp1));
-+ brw_math_invert(p, c->reg.t, c->reg.t);
-+ brw_MUL(p, c->reg.t, c->reg.t, c->reg.dp0);
-+
-+ brw_CMP(p, vec1(brw_null_reg()), BRW_CONDITIONAL_G, c->reg.t, c->reg.t0 );
-+ brw_MOV(p, c->reg.t0, c->reg.t);
-+ brw_set_predicate_control(p, BRW_PREDICATE_NONE);
-+ }
-+
-+ if (!BRW_IS_G4X(p->brw)) {
-+ brw_ENDIF(p, is_neg2);
-+ }
-+ }
- brw_ENDIF(p, is_negative);
- }
- brw_ENDIF(p, plane_active);
-diff --git a/src/mesa/drivers/dri/i965/brw_clip_tri.c b/src/mesa/drivers/dri/i965/brw_clip_tri.c
-index 1dbba37..7fd37bd 100644
---- a/src/mesa/drivers/dri/i965/brw_clip_tri.c
-+++ b/src/mesa/drivers/dri/i965/brw_clip_tri.c
-@@ -455,6 +455,8 @@ static void brw_clip_test( struct brw_clip_compile *c )
- struct brw_indirect vt2 = brw_indirect(2, 0);
-
- struct brw_compile *p = &c->func;
-+ struct brw_instruction *is_outside;
-+ struct brw_reg tmp0 = c->reg.loopcount; /* handy temporary */
-
- brw_MOV(p, get_addr_reg(vt0), brw_address(c->reg.vertex[0]));
- brw_MOV(p, get_addr_reg(vt1), brw_address(c->reg.vertex[1]));
-@@ -462,53 +464,87 @@ static void brw_clip_test( struct brw_clip_compile *c )
- brw_MOV(p, v0, deref_4f(vt0, c->offset[VERT_RESULT_HPOS]));
- brw_MOV(p, v1, deref_4f(vt1, c->offset[VERT_RESULT_HPOS]));
- brw_MOV(p, v2, deref_4f(vt2, c->offset[VERT_RESULT_HPOS]));
-+ brw_AND(p, c->reg.planemask, c->reg.planemask, brw_imm_ud(~0x3f));
-
- /* test nearz, xmin, ymin plane */
-- brw_CMP(p, t1, BRW_CONDITIONAL_LE, negate(v0), get_element(v0, 3));
-+ /* clip.xyz < -clip.w */
-+ brw_CMP(p, t1, BRW_CONDITIONAL_L, v0, negate(get_element(v0, 3)));
- brw_set_predicate_control(p, BRW_PREDICATE_NONE);
-- brw_CMP(p, t2, BRW_CONDITIONAL_LE, negate(v1), get_element(v1, 3));
-+ brw_CMP(p, t2, BRW_CONDITIONAL_L, v1, negate(get_element(v1, 3)));
- brw_set_predicate_control(p, BRW_PREDICATE_NONE);
-- brw_CMP(p, t3, BRW_CONDITIONAL_LE, negate(v2), get_element(v2, 3));
-+ brw_CMP(p, t3, BRW_CONDITIONAL_L, v2, negate(get_element(v2, 3)));
- brw_set_predicate_control(p, BRW_PREDICATE_NONE);
-+
-+ /* All vertices are outside of a plane, rejected */
-+ brw_AND(p, t, t1, t2);
-+ brw_AND(p, t, t, t3);
-+ brw_OR(p, tmp0, get_element(t, 0), get_element(t, 1));
-+ brw_OR(p, tmp0, tmp0, get_element(t, 2));
-+ brw_set_conditionalmod(p, BRW_CONDITIONAL_NZ);
-+ brw_AND(p, brw_null_reg(), tmp0, brw_imm_ud(0x1));
-+ is_outside = brw_IF(p, BRW_EXECUTE_1);
-+ {
-+ brw_clip_kill_thread(c);
-+ }
-+ brw_ENDIF(p, is_outside);
-+ brw_set_predicate_control(p, BRW_PREDICATE_NONE);
-+
-+ /* some vertices are inside a plane, some are outside,need to clip */
- brw_XOR(p, t, t1, t2);
- brw_XOR(p, t1, t2, t3);
- brw_OR(p, t, t, t1);
--
-- brw_CMP(p, brw_null_reg(), BRW_CONDITIONAL_NZ,
-- get_element(t, 0), brw_imm_ud(0));
-+ brw_AND(p, t, t, brw_imm_ud(0x1));
-+ brw_CMP(p, brw_null_reg(), BRW_CONDITIONAL_NZ,
-+ get_element(t, 0), brw_imm_ud(0));
- brw_OR(p, c->reg.planemask, c->reg.planemask, brw_imm_ud((1<<5)));
- brw_set_predicate_control(p, BRW_PREDICATE_NONE);
-- brw_CMP(p, brw_null_reg(), BRW_CONDITIONAL_NZ,
-- get_element(t, 1), brw_imm_ud(0));
-+ brw_CMP(p, brw_null_reg(), BRW_CONDITIONAL_NZ,
-+ get_element(t, 1), brw_imm_ud(0));
- brw_OR(p, c->reg.planemask, c->reg.planemask, brw_imm_ud((1<<3)));
- brw_set_predicate_control(p, BRW_PREDICATE_NONE);
-- brw_CMP(p, brw_null_reg(), BRW_CONDITIONAL_NZ,
-- get_element(t, 2), brw_imm_ud(0));
-+ brw_CMP(p, brw_null_reg(), BRW_CONDITIONAL_NZ,
-+ get_element(t, 2), brw_imm_ud(0));
- brw_OR(p, c->reg.planemask, c->reg.planemask, brw_imm_ud((1<<1)));
- brw_set_predicate_control(p, BRW_PREDICATE_NONE);
-
- /* test farz, xmax, ymax plane */
-- brw_CMP(p, t1, BRW_CONDITIONAL_L, v0, get_element(v0, 3));
-+ /* clip.xyz > clip.w */
-+ brw_CMP(p, t1, BRW_CONDITIONAL_G, v0, get_element(v0, 3));
- brw_set_predicate_control(p, BRW_PREDICATE_NONE);
-- brw_CMP(p, t2, BRW_CONDITIONAL_L, v1, get_element(v1, 3));
-+ brw_CMP(p, t2, BRW_CONDITIONAL_G, v1, get_element(v1, 3));
- brw_set_predicate_control(p, BRW_PREDICATE_NONE);
-- brw_CMP(p, t3, BRW_CONDITIONAL_L, v2, get_element(v2, 3));
-+ brw_CMP(p, t3, BRW_CONDITIONAL_G, v2, get_element(v2, 3));
- brw_set_predicate_control(p, BRW_PREDICATE_NONE);
-
-+ /* All vertices are outside of a plane, rejected */
-+ brw_AND(p, t, t1, t2);
-+ brw_AND(p, t, t, t3);
-+ brw_OR(p, tmp0, get_element(t, 0), get_element(t, 1));
-+ brw_OR(p, tmp0, tmp0, get_element(t, 2));
-+ brw_set_conditionalmod(p, BRW_CONDITIONAL_NZ);
-+ brw_AND(p, brw_null_reg(), tmp0, brw_imm_ud(0x1));
-+ is_outside = brw_IF(p, BRW_EXECUTE_1);
-+ {
-+ brw_clip_kill_thread(c);
-+ }
-+ brw_ENDIF(p, is_outside);
-+ brw_set_predicate_control(p, BRW_PREDICATE_NONE);
-+
-+ /* some vertices are inside a plane, some are outside,need to clip */
- brw_XOR(p, t, t1, t2);
- brw_XOR(p, t1, t2, t3);
- brw_OR(p, t, t, t1);
--
-- brw_CMP(p, brw_null_reg(), BRW_CONDITIONAL_NZ,
-- get_element(t, 0), brw_imm_ud(0));
-+ brw_AND(p, t, t, brw_imm_ud(0x1));
-+ brw_CMP(p, brw_null_reg(), BRW_CONDITIONAL_NZ,
-+ get_element(t, 0), brw_imm_ud(0));
- brw_OR(p, c->reg.planemask, c->reg.planemask, brw_imm_ud((1<<4)));
- brw_set_predicate_control(p, BRW_PREDICATE_NONE);
-- brw_CMP(p, brw_null_reg(), BRW_CONDITIONAL_NZ,
-- get_element(t, 1), brw_imm_ud(0));
-+ brw_CMP(p, brw_null_reg(), BRW_CONDITIONAL_NZ,
-+ get_element(t, 1), brw_imm_ud(0));
- brw_OR(p, c->reg.planemask, c->reg.planemask, brw_imm_ud((1<<2)));
- brw_set_predicate_control(p, BRW_PREDICATE_NONE);
-- brw_CMP(p, brw_null_reg(), BRW_CONDITIONAL_NZ,
-- get_element(t, 2), brw_imm_ud(0));
-+ brw_CMP(p, brw_null_reg(), BRW_CONDITIONAL_NZ,
-+ get_element(t, 2), brw_imm_ud(0));
- brw_OR(p, c->reg.planemask, c->reg.planemask, brw_imm_ud((1<<0)));
- brw_set_predicate_control(p, BRW_PREDICATE_NONE);
-
-diff --git a/src/mesa/drivers/dri/i965/brw_context.c b/src/mesa/drivers/dri/i965/brw_context.c
-index d7a2bd9..d96ff29 100644
---- a/src/mesa/drivers/dri/i965/brw_context.c
-+++ b/src/mesa/drivers/dri/i965/brw_context.c
-@@ -76,30 +76,6 @@ static void brwInitDriverFunctions( struct dd_function_table *functions )
- functions->Viewport = intel_viewport;
- }
-
--
--static void brw_init_attribs( struct brw_context *brw )
--{
-- GLcontext *ctx = &brw->intel.ctx;
--
-- brw->attribs.Color = &ctx->Color;
-- brw->attribs.Depth = &ctx->Depth;
-- brw->attribs.Fog = &ctx->Fog;
-- brw->attribs.Hint = &ctx->Hint;
-- brw->attribs.Light = &ctx->Light;
-- brw->attribs.Line = &ctx->Line;
-- brw->attribs.Point = &ctx->Point;
-- brw->attribs.Polygon = &ctx->Polygon;
-- brw->attribs.Scissor = &ctx->Scissor;
-- brw->attribs.Stencil = &ctx->Stencil;
-- brw->attribs.Texture = &ctx->Texture;
-- brw->attribs.Transform = &ctx->Transform;
-- brw->attribs.Viewport = &ctx->Viewport;
-- brw->attribs.VertexProgram = &ctx->VertexProgram;
-- brw->attribs.FragmentProgram = &ctx->FragmentProgram;
-- brw->attribs.PolygonStipple = &ctx->PolygonStipple[0];
--}
--
--
- GLboolean brwCreateContext( const __GLcontextModes *mesaVis,
- __DRIcontextPrivate *driContextPriv,
- void *sharedContextPrivate)
-@@ -135,21 +111,21 @@ GLboolean brwCreateContext( const __GLcontextModes *mesaVis,
- ctx->Const.MaxTextureImageUnits);
- ctx->Const.MaxVertexTextureImageUnits = 0; /* no vertex shader textures */
-
-- /* Advertise the full hardware capabilities. The new memory
-- * manager should cope much better with overload situations:
-+ /* Mesa limits textures to 4kx4k; it would be nice to fix that someday
- */
-- ctx->Const.MaxTextureLevels = 12;
-+ ctx->Const.MaxTextureLevels = 13;
- ctx->Const.Max3DTextureLevels = 9;
- ctx->Const.MaxCubeTextureLevels = 12;
-- ctx->Const.MaxTextureRectSize = (1<<11);
-+ ctx->Const.MaxTextureRectSize = (1<<12);
-
- /* if conformance mode is set, swrast can handle any size AA point */
- ctx->Const.MaxPointSizeAA = 255.0;
-
-+ /* We want the GLSL compiler to emit code that uses condition codes */
-+ ctx->Shader.EmitCondCodes = GL_TRUE;
-+
- /* ctx->Const.MaxNativeVertexProgramTemps = 32; */
-
-- brw_init_attribs( brw );
-- brw_init_metaops( brw );
- brw_init_state( brw );
-
- brw->state.dirty.mesa = ~0;
-diff --git a/src/mesa/drivers/dri/i965/brw_context.h b/src/mesa/drivers/dri/i965/brw_context.h
-index 5d3f99e..a43fc40 100644
---- a/src/mesa/drivers/dri/i965/brw_context.h
-+++ b/src/mesa/drivers/dri/i965/brw_context.h
-@@ -131,7 +131,6 @@ struct brw_context;
- #define BRW_NEW_WM_INPUT_DIMENSIONS 0x100
- #define BRW_NEW_INPUT_VARYING 0x200
- #define BRW_NEW_PSP 0x800
--#define BRW_NEW_METAOPS 0x1000
- #define BRW_NEW_FENCE 0x2000
- #define BRW_NEW_INDICES 0x4000
- #define BRW_NEW_VERTICES 0x8000
-@@ -164,7 +163,7 @@ struct brw_vertex_program {
-
- struct brw_fragment_program {
- struct gl_fragment_program program;
-- GLuint id;
-+ GLuint id; /**< serial no. to identify frag progs, never re-used */
- };
-
-
-@@ -303,26 +302,6 @@ struct brw_cache {
- };
-
-
--
--struct brw_state_pointers {
-- struct gl_colorbuffer_attrib *Color;
-- struct gl_depthbuffer_attrib *Depth;
-- struct gl_fog_attrib *Fog;
-- struct gl_hint_attrib *Hint;
-- struct gl_light_attrib *Light;
-- struct gl_line_attrib *Line;
-- struct gl_point_attrib *Point;
-- struct gl_polygon_attrib *Polygon;
-- GLuint *PolygonStipple;
-- struct gl_scissor_attrib *Scissor;
-- struct gl_stencil_attrib *Stencil;
-- struct gl_texture_attrib *Texture;
-- struct gl_transform_attrib *Transform;
-- struct gl_viewport_attrib *Viewport;
-- struct gl_vertex_program_state *VertexProgram;
-- struct gl_fragment_program_state *FragmentProgram;
--};
--
- /* Considered adding a member to this struct to document which flags
- * an update might raise so that ordering of the state atoms can be
- * checked or derived at runtime. Dropped the idea in favor of having
-@@ -439,8 +418,8 @@ struct brw_context
- struct brw_tracked_state **atoms;
- GLuint nr_atoms;
-
-- GLuint nr_draw_regions;
-- struct intel_region *draw_regions[MAX_DRAW_BUFFERS];
-+ GLuint nr_color_regions;
-+ struct intel_region *color_regions[MAX_DRAW_BUFFERS];
- struct intel_region *depth_region;
-
- /**
-@@ -457,7 +436,6 @@ struct brw_context
- int validated_bo_count;
- } state;
-
-- struct brw_state_pointers attribs;
- struct brw_cache cache;
- struct brw_cached_batch_item *cached_batch_items;
-
-@@ -491,28 +469,6 @@ struct brw_context
- unsigned int offset;
- } ib;
-
-- struct {
-- /* Will be allocated on demand if needed.
-- */
-- struct brw_state_pointers attribs;
-- struct gl_vertex_program *vp;
-- struct gl_fragment_program *fp, *fp_tex;
--
-- struct gl_buffer_object *vbo;
--
-- struct intel_region *saved_draw_region;
-- GLuint saved_nr_draw_regions;
-- struct intel_region *saved_depth_region;
--
-- GLuint restore_draw_buffers[MAX_DRAW_BUFFERS];
-- GLuint restore_num_draw_buffers;
--
-- struct gl_fragment_program *restore_fp;
--
-- GLboolean active;
-- } metaops;
--
--
- /* Active vertex program:
- */
- const struct gl_vertex_program *vertex_program;
-@@ -703,13 +659,6 @@ void brw_FrameBufferTexInit( struct brw_context *brw,
- void brw_FrameBufferTexDestroy( struct brw_context *brw );
- void brw_validate_textures( struct brw_context *brw );
-
--/*======================================================================
-- * brw_metaops.c
-- */
--
--void brw_init_metaops( struct brw_context *brw );
--void brw_destroy_metaops( struct brw_context *brw );
--
-
- /*======================================================================
- * brw_program.c
-@@ -721,7 +670,9 @@ void brwInitFragProgFuncs( struct dd_function_table *functions );
- */
- void brw_upload_urb_fence(struct brw_context *brw);
-
--void brw_upload_constant_buffer_state(struct brw_context *brw);
-+/* brw_curbe.c
-+ */
-+void brw_upload_cs_urb_state(struct brw_context *brw);
-
-
- /*======================================================================
-diff --git a/src/mesa/drivers/dri/i965/brw_curbe.c b/src/mesa/drivers/dri/i965/brw_curbe.c
-index fbf473a..4ec0cfb 100644
---- a/src/mesa/drivers/dri/i965/brw_curbe.c
-+++ b/src/mesa/drivers/dri/i965/brw_curbe.c
-@@ -48,6 +48,7 @@
- */
- static void calculate_curbe_offsets( struct brw_context *brw )
- {
-+ GLcontext *ctx = &brw->intel.ctx;
- /* CACHE_NEW_WM_PROG */
- GLuint nr_fp_regs = (brw->wm.prog_data->nr_params + 15) / 16;
-
-@@ -58,8 +59,8 @@ static void calculate_curbe_offsets( struct brw_context *brw )
- GLuint total_regs;
-
- /* _NEW_TRANSFORM */
-- if (brw->attribs.Transform->ClipPlanesEnabled) {
-- GLuint nr_planes = 6 + brw_count_bits(brw->attribs.Transform->ClipPlanesEnabled);
-+ if (ctx->Transform.ClipPlanesEnabled) {
-+ GLuint nr_planes = 6 + brw_count_bits(ctx->Transform.ClipPlanesEnabled);
- nr_clip_regs = (nr_planes * 4 + 15) / 16;
- }
-
-@@ -137,24 +138,24 @@ const struct brw_tracked_state brw_curbe_offsets = {
- * fixed-function hardware in a double-buffering scheme to avoid a
- * pipeline stall each time the contents of the curbe is changed.
- */
--void brw_upload_constant_buffer_state(struct brw_context *brw)
-+void brw_upload_cs_urb_state(struct brw_context *brw)
- {
-- struct brw_constant_buffer_state cbs;
-- memset(&cbs, 0, sizeof(cbs));
-+ struct brw_cs_urb_state cs_urb;
-+ memset(&cs_urb, 0, sizeof(cs_urb));
-
- /* It appears that this is the state packet for the CS unit, ie. the
- * urb entries detailed here are housed in the CS range from the
- * URB_FENCE command.
- */
-- cbs.header.opcode = CMD_CONST_BUFFER_STATE;
-- cbs.header.length = sizeof(cbs)/4 - 2;
-+ cs_urb.header.opcode = CMD_CS_URB_STATE;
-+ cs_urb.header.length = sizeof(cs_urb)/4 - 2;
-
- /* BRW_NEW_URB_FENCE */
-- cbs.bits0.nr_urb_entries = brw->urb.nr_cs_entries;
-- cbs.bits0.urb_entry_size = brw->urb.csize - 1;
-+ cs_urb.bits0.nr_urb_entries = brw->urb.nr_cs_entries;
-+ cs_urb.bits0.urb_entry_size = brw->urb.csize - 1;
-
- assert(brw->urb.nr_cs_entries);
-- BRW_CACHED_BATCH_STRUCT(brw, &cbs);
-+ BRW_CACHED_BATCH_STRUCT(brw, &cs_urb);
- }
-
- static GLfloat fixed_plane[6][4] = {
-@@ -233,11 +234,11 @@ static void prepare_constant_buffer(struct brw_context *brw)
- */
- assert(MAX_CLIP_PLANES == 6);
- for (j = 0; j < MAX_CLIP_PLANES; j++) {
-- if (brw->attribs.Transform->ClipPlanesEnabled & (1<<j)) {
-- buf[offset + i * 4 + 0] = brw->attribs.Transform->_ClipUserPlane[j][0];
-- buf[offset + i * 4 + 1] = brw->attribs.Transform->_ClipUserPlane[j][1];
-- buf[offset + i * 4 + 2] = brw->attribs.Transform->_ClipUserPlane[j][2];
-- buf[offset + i * 4 + 3] = brw->attribs.Transform->_ClipUserPlane[j][3];
-+ if (ctx->Transform.ClipPlanesEnabled & (1<<j)) {
-+ buf[offset + i * 4 + 0] = ctx->Transform._ClipUserPlane[j][0];
-+ buf[offset + i * 4 + 1] = ctx->Transform._ClipUserPlane[j][1];
-+ buf[offset + i * 4 + 2] = ctx->Transform._ClipUserPlane[j][2];
-+ buf[offset + i * 4 + 3] = ctx->Transform._ClipUserPlane[j][3];
- i++;
- }
- }
-diff --git a/src/mesa/drivers/dri/i965/brw_defines.h b/src/mesa/drivers/dri/i965/brw_defines.h
-index 39c3225..590b064 100644
---- a/src/mesa/drivers/dri/i965/brw_defines.h
-+++ b/src/mesa/drivers/dri/i965/brw_defines.h
-@@ -734,7 +734,7 @@
-
-
- #define CMD_URB_FENCE 0x6000
--#define CMD_CONST_BUFFER_STATE 0x6001
-+#define CMD_CS_URB_STATE 0x6001
- #define CMD_CONST_BUFFER 0x6002
-
- #define CMD_STATE_BASE_ADDRESS 0x6101
-diff --git a/src/mesa/drivers/dri/i965/brw_draw.c b/src/mesa/drivers/dri/i965/brw_draw.c
-index 785fb78..3ca953d 100644
---- a/src/mesa/drivers/dri/i965/brw_draw.c
-+++ b/src/mesa/drivers/dri/i965/brw_draw.c
-@@ -84,15 +84,17 @@ static const GLenum reduced_prim[GL_POLYGON+1] = {
- */
- static GLuint brw_set_prim(struct brw_context *brw, GLenum prim)
- {
-+ GLcontext *ctx = &brw->intel.ctx;
-+
- if (INTEL_DEBUG & DEBUG_PRIMS)
- _mesa_printf("PRIM: %s\n", _mesa_lookup_enum_by_nr(prim));
-
- /* Slight optimization to avoid the GS program when not needed:
- */
- if (prim == GL_QUAD_STRIP &&
-- brw->attribs.Light->ShadeModel != GL_FLAT &&
-- brw->attribs.Polygon->FrontMode == GL_FILL &&
-- brw->attribs.Polygon->BackMode == GL_FILL)
-+ ctx->Light.ShadeModel != GL_FLAT &&
-+ ctx->Polygon.FrontMode == GL_FILL &&
-+ ctx->Polygon.BackMode == GL_FILL)
- prim = GL_TRIANGLE_STRIP;
-
- if (prim != brw->primitive) {
-@@ -166,14 +168,11 @@ static void brw_merge_inputs( struct brw_context *brw,
- for (i = 0; i < VERT_ATTRIB_MAX; i++) {
- brw->vb.inputs[i].glarray = arrays[i];
-
-- /* XXX: metaops passes null arrays */
-- if (arrays[i]) {
-- if (arrays[i]->StrideB != 0)
-- brw->vb.info.varying |= 1 << i;
-+ if (arrays[i]->StrideB != 0)
-+ brw->vb.info.varying |= 1 << i;
-
- brw->vb.info.sizes[i/16] |= (brw->vb.inputs[i].glarray->Size - 1) <<
- ((i%16) * 2);
-- }
- }
-
- /* Raise statechanges if input sizes and varying have changed:
-@@ -192,12 +191,13 @@ static GLboolean check_fallbacks( struct brw_context *brw,
- const struct _mesa_prim *prim,
- GLuint nr_prims )
- {
-+ GLcontext *ctx = &brw->intel.ctx;
- GLuint i;
-
- if (!brw->intel.strict_conformance)
- return GL_FALSE;
-
-- if (brw->attribs.Polygon->SmoothFlag) {
-+ if (ctx->Polygon.SmoothFlag) {
- for (i = 0; i < nr_prims; i++)
- if (reduced_prim[prim[i].mode] == GL_TRIANGLES)
- return GL_TRUE;
-@@ -206,7 +206,7 @@ static GLboolean check_fallbacks( struct brw_context *brw,
- /* BRW hardware will do AA lines, but they are non-conformant it
- * seems. TBD whether we keep this fallback:
- */
-- if (brw->attribs.Line->SmoothFlag) {
-+ if (ctx->Line.SmoothFlag) {
- for (i = 0; i < nr_prims; i++)
- if (reduced_prim[prim[i].mode] == GL_LINES)
- return GL_TRUE;
-@@ -215,23 +215,23 @@ static GLboolean check_fallbacks( struct brw_context *brw,
- /* Stipple -- these fallbacks could be resolved with a little
- * bit of work?
- */
-- if (brw->attribs.Line->StippleFlag) {
-+ if (ctx->Line.StippleFlag) {
- for (i = 0; i < nr_prims; i++) {
- /* GS doesn't get enough information to know when to reset
- * the stipple counter?!?
- */
-- if (prim[i].mode == GL_LINE_LOOP)
-+ if (prim[i].mode == GL_LINE_LOOP || prim[i].mode == GL_LINE_STRIP)
- return GL_TRUE;
-
- if (prim[i].mode == GL_POLYGON &&
-- (brw->attribs.Polygon->FrontMode == GL_LINE ||
-- brw->attribs.Polygon->BackMode == GL_LINE))
-+ (ctx->Polygon.FrontMode == GL_LINE ||
-+ ctx->Polygon.BackMode == GL_LINE))
- return GL_TRUE;
- }
- }
-
-
-- if (brw->attribs.Point->SmoothFlag) {
-+ if (ctx->Point.SmoothFlag) {
- for (i = 0; i < nr_prims; i++)
- if (prim[i].mode == GL_POINTS)
- return GL_TRUE;
-diff --git a/src/mesa/drivers/dri/i965/brw_draw_upload.c b/src/mesa/drivers/dri/i965/brw_draw_upload.c
-index 73d6dea..02998d5 100644
---- a/src/mesa/drivers/dri/i965/brw_draw_upload.c
-+++ b/src/mesa/drivers/dri/i965/brw_draw_upload.c
-@@ -156,7 +156,13 @@ static GLuint byte_types_scale[5] = {
- };
-
-
--static GLuint get_surface_type( GLenum type, GLuint size, GLboolean normalized )
-+/**
-+ * Given vertex array type/size/format/normalized info, return
-+ * the appopriate hardware surface type.
-+ * Format will be GL_RGBA or possibly GL_BGRA for GLubyte[4] color arrays.
-+ */
-+static GLuint get_surface_type( GLenum type, GLuint size,
-+ GLenum format, GLboolean normalized )
- {
- if (INTEL_DEBUG & DEBUG_VERTS)
- _mesa_printf("type %s size %d normalized %d\n",
-@@ -171,11 +177,20 @@ static GLuint get_surface_type( GLenum type, GLuint size, GLboolean normalized )
- case GL_BYTE: return byte_types_norm[size];
- case GL_UNSIGNED_INT: return uint_types_norm[size];
- case GL_UNSIGNED_SHORT: return ushort_types_norm[size];
-- case GL_UNSIGNED_BYTE: return ubyte_types_norm[size];
-+ case GL_UNSIGNED_BYTE:
-+ if (format == GL_BGRA) {
-+ /* See GL_EXT_vertex_array_bgra */
-+ assert(size == 4);
-+ return BRW_SURFACEFORMAT_B8G8R8A8_UNORM;
-+ }
-+ else {
-+ return ubyte_types_norm[size];
-+ }
- default: assert(0); return 0;
- }
- }
- else {
-+ assert(format == GL_RGBA); /* sanity check */
- switch (type) {
- case GL_DOUBLE: return double_types[size];
- case GL_FLOAT: return float_types[size];
-@@ -281,7 +296,7 @@ copy_array_to_vbo_array( struct brw_context *brw,
- } else {
- void *data;
- char *dest;
-- const char *src = element->glarray->Ptr;
-+ const unsigned char *src = element->glarray->Ptr;
- int i;
-
- data = _mesa_malloc(dst_stride * element->count);
-@@ -484,6 +499,7 @@ static void brw_emit_vertices(struct brw_context *brw)
- struct brw_vertex_element *input = enabled[i];
- uint32_t format = get_surface_type(input->glarray->Type,
- input->glarray->Size,
-+ input->glarray->Format,
- input->glarray->Normalized);
- uint32_t comp0 = BRW_VE1_COMPONENT_STORE_SRC;
- uint32_t comp1 = BRW_VE1_COMPONENT_STORE_SRC;
-@@ -549,7 +565,7 @@ static void brw_prepare_indices(struct brw_context *brw)
- */
- dri_bo_subdata(bo, offset, ib_size, index_buffer->ptr);
- } else {
-- offset = (GLuint)index_buffer->ptr;
-+ offset = (GLuint) (unsigned long) index_buffer->ptr;
-
- /* If the index buffer isn't aligned to its element size, we have to
- * rebase it into a temporary.
-diff --git a/src/mesa/drivers/dri/i965/brw_eu.c b/src/mesa/drivers/dri/i965/brw_eu.c
-index b3ae4ee..c53efba 100644
---- a/src/mesa/drivers/dri/i965/brw_eu.c
-+++ b/src/mesa/drivers/dri/i965/brw_eu.c
-@@ -129,3 +129,126 @@ const GLuint *brw_get_program( struct brw_compile *p,
- return (const GLuint *)p->store;
- }
-
-+
-+
-+/**
-+ * Subroutine calls require special attention.
-+ * Mesa instructions may be expanded into multiple hardware instructions
-+ * so the prog_instruction::BranchTarget field can't be used as an index
-+ * into the hardware instructions.
-+ *
-+ * The BranchTarget field isn't needed, however. Mesa's GLSL compiler
-+ * emits CAL and BGNSUB instructions with labels that can be used to map
-+ * subroutine calls to actual subroutine code blocks.
-+ *
-+ * The structures and function here implement patching of CAL instructions
-+ * so they jump to the right subroutine code...
-+ */
-+
-+
-+/**
-+ * For each OPCODE_BGNSUB we create one of these.
-+ */
-+struct brw_glsl_label
-+{
-+ const char *name; /**< the label string */
-+ GLuint position; /**< the position of the brw instruction for this label */
-+ struct brw_glsl_label *next; /**< next in linked list */
-+};
-+
-+
-+/**
-+ * For each OPCODE_CAL we create one of these.
-+ */
-+struct brw_glsl_call
-+{
-+ GLuint call_inst_pos; /**< location of the CAL instruction */
-+ const char *sub_name; /**< name of subroutine to call */
-+ struct brw_glsl_call *next; /**< next in linked list */
-+};
-+
-+
-+/**
-+ * Called for each OPCODE_BGNSUB.
-+ */
-+void
-+brw_save_label(struct brw_compile *c, const char *name, GLuint position)
-+{
-+ struct brw_glsl_label *label = CALLOC_STRUCT(brw_glsl_label);
-+ label->name = name;
-+ label->position = position;
-+ label->next = c->first_label;
-+ c->first_label = label;
-+}
-+
-+
-+/**
-+ * Called for each OPCODE_CAL.
-+ */
-+void
-+brw_save_call(struct brw_compile *c, const char *name, GLuint call_pos)
-+{
-+ struct brw_glsl_call *call = CALLOC_STRUCT(brw_glsl_call);
-+ call->call_inst_pos = call_pos;
-+ call->sub_name = name;
-+ call->next = c->first_call;
-+ c->first_call = call;
-+}
-+
-+
-+/**
-+ * Lookup a label, return label's position/offset.
-+ */
-+static GLuint
-+brw_lookup_label(struct brw_compile *c, const char *name)
-+{
-+ const struct brw_glsl_label *label;
-+ for (label = c->first_label; label; label = label->next) {
-+ if (strcmp(name, label->name) == 0) {
-+ return label->position;
-+ }
-+ }
-+ abort(); /* should never happen */
-+ return ~0;
-+}
-+
-+
-+/**
-+ * When we're done generating code, this function is called to resolve
-+ * subroutine calls.
-+ */
-+void
-+brw_resolve_cals(struct brw_compile *c)
-+{
-+ const struct brw_glsl_call *call;
-+
-+ for (call = c->first_call; call; call = call->next) {
-+ const GLuint sub_loc = brw_lookup_label(c, call->sub_name);
-+ struct brw_instruction *brw_call_inst = &c->store[call->call_inst_pos];
-+ struct brw_instruction *brw_sub_inst = &c->store[sub_loc];
-+ GLint offset = brw_sub_inst - brw_call_inst;
-+
-+ /* patch brw_inst1 to point to brw_inst2 */
-+ brw_set_src1(brw_call_inst, brw_imm_d(offset * 16));
-+ }
-+
-+ /* free linked list of calls */
-+ {
-+ struct brw_glsl_call *call, *next;
-+ for (call = c->first_call; call; call = next) {
-+ next = call->next;
-+ _mesa_free(call);
-+ }
-+ c->first_call = NULL;
-+ }
-+
-+ /* free linked list of labels */
-+ {
-+ struct brw_glsl_label *label, *next;
-+ for (label = c->first_label; label; label = next) {
-+ next = label->next;
-+ _mesa_free(label);
-+ }
-+ c->first_label = NULL;
-+ }
-+}
-diff --git a/src/mesa/drivers/dri/i965/brw_eu.h b/src/mesa/drivers/dri/i965/brw_eu.h
-index 9e2b39a..b36a197 100644
---- a/src/mesa/drivers/dri/i965/brw_eu.h
-+++ b/src/mesa/drivers/dri/i965/brw_eu.h
-@@ -91,6 +91,11 @@ struct brw_indirect {
- };
-
-
-+struct brw_glsl_label;
-+struct brw_glsl_call;
-+
-+
-+
- #define BRW_EU_MAX_INSN_STACK 5
- #define BRW_EU_MAX_INSN 1200
-
-@@ -106,9 +111,22 @@ struct brw_compile {
- GLuint flag_value;
- GLboolean single_program_flow;
- struct brw_context *brw;
-+
-+ struct brw_glsl_label *first_label; /**< linked list of labels */
-+ struct brw_glsl_call *first_call; /**< linked list of CALs */
- };
-
-
-+void
-+brw_save_label(struct brw_compile *c, const char *name, GLuint position);
-+
-+void
-+brw_save_call(struct brw_compile *c, const char *name, GLuint call_pos);
-+
-+void
-+brw_resolve_cals(struct brw_compile *c);
-+
-+
-
- static INLINE int type_sz( GLuint type )
- {
-diff --git a/src/mesa/drivers/dri/i965/brw_eu_emit.c b/src/mesa/drivers/dri/i965/brw_eu_emit.c
-index 4e099b5..bac7135 100644
---- a/src/mesa/drivers/dri/i965/brw_eu_emit.c
-+++ b/src/mesa/drivers/dri/i965/brw_eu_emit.c
-@@ -96,7 +96,7 @@ static void brw_set_dest( struct brw_instruction *insn,
- }
-
- static void brw_set_src0( struct brw_instruction *insn,
-- struct brw_reg reg )
-+ struct brw_reg reg )
- {
- assert(reg.file != BRW_MESSAGE_REGISTER_FILE);
-
-@@ -169,7 +169,7 @@ static void brw_set_src0( struct brw_instruction *insn,
-
-
- void brw_set_src1( struct brw_instruction *insn,
-- struct brw_reg reg )
-+ struct brw_reg reg )
- {
- assert(reg.file != BRW_MESSAGE_REGISTER_FILE);
-
-@@ -323,13 +323,13 @@ static void brw_set_dp_read_message( struct brw_instruction *insn,
- }
-
- static void brw_set_sampler_message(struct brw_context *brw,
-- struct brw_instruction *insn,
-- GLuint binding_table_index,
-- GLuint sampler,
-- GLuint msg_type,
-- GLuint response_length,
-- GLuint msg_length,
-- GLboolean eot)
-+ struct brw_instruction *insn,
-+ GLuint binding_table_index,
-+ GLuint sampler,
-+ GLuint msg_type,
-+ GLuint response_length,
-+ GLuint msg_length,
-+ GLboolean eot)
- {
- brw_set_src1(insn, brw_imm_d(0));
-
-@@ -407,7 +407,7 @@ static struct brw_instruction *brw_alu2(struct brw_compile *p,
- * Convenience routines.
- */
- #define ALU1(OP) \
--struct brw_instruction *brw_##OP(struct brw_compile *p, \
-+struct brw_instruction *brw_##OP(struct brw_compile *p, \
- struct brw_reg dest, \
- struct brw_reg src0) \
- { \
-@@ -415,7 +415,7 @@ struct brw_instruction *brw_##OP(struct brw_compile *p, \
- }
-
- #define ALU2(OP) \
--struct brw_instruction *brw_##OP(struct brw_compile *p, \
-+struct brw_instruction *brw_##OP(struct brw_compile *p, \
- struct brw_reg dest, \
- struct brw_reg src0, \
- struct brw_reg src1) \
-@@ -469,9 +469,9 @@ void brw_NOP(struct brw_compile *p)
- */
-
- struct brw_instruction *brw_JMPI(struct brw_compile *p,
-- struct brw_reg dest,
-- struct brw_reg src0,
-- struct brw_reg src1)
-+ struct brw_reg dest,
-+ struct brw_reg src0,
-+ struct brw_reg src1)
- {
- struct brw_instruction *insn = brw_alu2(p, BRW_OPCODE_JMPI, dest, src0, src1);
-
-@@ -674,7 +674,7 @@ struct brw_instruction *brw_DO(struct brw_compile *p, GLuint execute_size)
-
-
- struct brw_instruction *brw_WHILE(struct brw_compile *p,
-- struct brw_instruction *do_insn)
-+ struct brw_instruction *do_insn)
- {
- struct brw_instruction *insn;
-
-@@ -931,13 +931,13 @@ void brw_dp_READ_16( struct brw_compile *p,
-
-
- void brw_fb_WRITE(struct brw_compile *p,
-- struct brw_reg dest,
-- GLuint msg_reg_nr,
-- struct brw_reg src0,
-- GLuint binding_table_index,
-- GLuint msg_length,
-- GLuint response_length,
-- GLboolean eot)
-+ struct brw_reg dest,
-+ GLuint msg_reg_nr,
-+ struct brw_reg src0,
-+ GLuint binding_table_index,
-+ GLuint msg_length,
-+ GLuint response_length,
-+ GLboolean eot)
- {
- struct brw_instruction *insn = next_insn(p, BRW_OPCODE_SEND);
-
-@@ -973,8 +973,8 @@ void brw_SAMPLE(struct brw_compile *p,
- {
- GLboolean need_stall = 0;
-
-- if(writemask == 0) {
--/* _mesa_printf("%s: zero writemask??\n", __FUNCTION__); */
-+ if (writemask == 0) {
-+ /*_mesa_printf("%s: zero writemask??\n", __FUNCTION__); */
- return;
- }
-
-@@ -1006,7 +1006,7 @@ void brw_SAMPLE(struct brw_compile *p,
-
- if (newmask != writemask) {
- need_stall = 1;
--/* _mesa_printf("need stall %x %x\n", newmask , writemask); */
-+ /* _mesa_printf("need stall %x %x\n", newmask , writemask); */
- }
- else {
- struct brw_reg m1 = brw_message_reg(msg_reg_nr);
-@@ -1047,8 +1047,7 @@ void brw_SAMPLE(struct brw_compile *p,
- eot);
- }
-
-- if (need_stall)
-- {
-+ if (need_stall) {
- struct brw_reg reg = vec8(offset(dest, response_length-1));
-
- /* mov (8) r9.0<1>:f r9.0<8;8,1>:f { Align1 }
-diff --git a/src/mesa/drivers/dri/i965/brw_fallback.c b/src/mesa/drivers/dri/i965/brw_fallback.c
-index 4ea660a..5f4f2d5 100644
---- a/src/mesa/drivers/dri/i965/brw_fallback.c
-+++ b/src/mesa/drivers/dri/i965/brw_fallback.c
-@@ -47,20 +47,12 @@ static GLboolean do_check_fallback(struct brw_context *brw)
- GLcontext *ctx = &brw->intel.ctx;
- GLuint i;
-
-- /* BRW_NEW_METAOPS
-- */
-- if (brw->metaops.active)
-- return GL_FALSE;
--
- if (brw->intel.no_rast) {
- DBG("FALLBACK: rasterization disabled\n");
- return GL_TRUE;
- }
-
- /* _NEW_RENDERMODE
-- *
-- * XXX: need to save/restore RenderMode in metaops state, or
-- * somehow move to a new attribs pointer:
- */
- if (ctx->RenderMode != GL_RENDER) {
- DBG("FALLBACK: render mode\n");
-@@ -70,7 +62,7 @@ static GLboolean do_check_fallback(struct brw_context *brw)
- /* _NEW_TEXTURE:
- */
- for (i = 0; i < BRW_MAX_TEX_UNIT; i++) {
-- struct gl_texture_unit *texUnit = &brw->attribs.Texture->Unit[i];
-+ struct gl_texture_unit *texUnit = &ctx->Texture.Unit[i];
- if (texUnit->_ReallyEnabled) {
- struct intel_texture_object *intelObj = intel_texture_object(texUnit->_Current);
- struct gl_texture_image *texImage = intelObj->base.Image[0][intelObj->firstLevel];
-@@ -83,8 +75,8 @@ static GLboolean do_check_fallback(struct brw_context *brw)
-
- /* _NEW_STENCIL
- */
-- if (brw->attribs.Stencil->Enabled &&
-- !brw->intel.hw_stencil) {
-+ if (ctx->Stencil.Enabled &&
-+ (ctx->DrawBuffer->Name == 0 && !brw->intel.hw_stencil)) {
- DBG("FALLBACK: stencil\n");
- return GL_TRUE;
- }
-@@ -101,7 +93,7 @@ static void check_fallback(struct brw_context *brw)
- const struct brw_tracked_state brw_check_fallback = {
- .dirty = {
- .mesa = _NEW_BUFFERS | _NEW_RENDERMODE | _NEW_TEXTURE | _NEW_STENCIL,
-- .brw = BRW_NEW_METAOPS,
-+ .brw = 0,
- .cache = 0
- },
- .prepare = check_fallback
-diff --git a/src/mesa/drivers/dri/i965/brw_metaops.c b/src/mesa/drivers/dri/i965/brw_metaops.c
-deleted file mode 100644
-index 41bfa2e..0000000
---- a/src/mesa/drivers/dri/i965/brw_metaops.c
-+++ /dev/null
-@@ -1,583 +0,0 @@
--/*
-- Copyright (C) Intel Corp. 2006. All Rights Reserved.
-- Intel funded Tungsten Graphics (http://www.tungstengraphics.com) to
-- develop this 3D driver.
--
-- Permission is hereby granted, free of charge, to any person obtaining
-- a copy of this software and associated documentation files (the
-- "Software"), to deal in the Software without restriction, including
-- without limitation the rights to use, copy, modify, merge, publish,
-- distribute, sublicense, and/or sell copies of the Software, and to
-- permit persons to whom the Software is furnished to do so, subject to
-- the following conditions:
--
-- The above copyright notice and this permission notice (including the
-- next paragraph) shall be included in all copies or substantial
-- portions of the Software.
--
-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-- IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
-- LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-- OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-- WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
--
-- **********************************************************************/
-- /*
-- * Authors:
-- * Keith Whitwell <keith@tungstengraphics.com>
-- * frame buffer texture by Gary Wong <gtw@gnu.org>
-- */
--
--
--
--#include "main/glheader.h"
--#include "main/context.h"
--#include "main/macros.h"
--
--#include "shader/arbprogparse.h"
--
--#include "intel_screen.h"
--#include "intel_batchbuffer.h"
--#include "intel_regions.h"
--#include "intel_buffers.h"
--
--#include "brw_context.h"
--#include "brw_defines.h"
--#include "brw_draw.h"
--#include "brw_fallback.h"
--
--#define INIT(brw, STRUCT, ATTRIB) \
--do { \
-- brw->attribs.ATTRIB = &ctx->ATTRIB; \
--} while (0)
--
--#define DUP(brw, STRUCT, ATTRIB) \
--do { \
-- brw->metaops.attribs.ATTRIB = MALLOC_STRUCT(STRUCT); \
-- memcpy(brw->metaops.attribs.ATTRIB, \
-- brw->attribs.ATTRIB, \
-- sizeof(struct STRUCT)); \
--} while (0)
--
--
--#define INSTALL(brw, ATTRIB, STATE) \
--do { \
-- brw->attribs.ATTRIB = brw->metaops.attribs.ATTRIB; \
-- brw->state.dirty.mesa |= STATE; \
--} while (0)
--
--#define RESTORE(brw, ATTRIB, STATE) \
--do { \
-- brw->attribs.ATTRIB = &brw->intel.ctx.ATTRIB; \
-- brw->state.dirty.mesa |= STATE; \
--} while (0)
--
--static void init_attribs( struct brw_context *brw )
--{
-- DUP(brw, gl_colorbuffer_attrib, Color);
-- DUP(brw, gl_depthbuffer_attrib, Depth);
-- DUP(brw, gl_fog_attrib, Fog);
-- DUP(brw, gl_hint_attrib, Hint);
-- DUP(brw, gl_light_attrib, Light);
-- DUP(brw, gl_line_attrib, Line);
-- DUP(brw, gl_point_attrib, Point);
-- DUP(brw, gl_polygon_attrib, Polygon);
-- DUP(brw, gl_scissor_attrib, Scissor);
-- DUP(brw, gl_stencil_attrib, Stencil);
-- DUP(brw, gl_texture_attrib, Texture);
-- DUP(brw, gl_transform_attrib, Transform);
-- DUP(brw, gl_viewport_attrib, Viewport);
-- DUP(brw, gl_vertex_program_state, VertexProgram);
-- DUP(brw, gl_fragment_program_state, FragmentProgram);
--}
--
--static void install_attribs( struct brw_context *brw )
--{
-- INSTALL(brw, Color, _NEW_COLOR);
-- INSTALL(brw, Depth, _NEW_DEPTH);
-- INSTALL(brw, Fog, _NEW_FOG);
-- INSTALL(brw, Hint, _NEW_HINT);
-- INSTALL(brw, Light, _NEW_LIGHT);
-- INSTALL(brw, Line, _NEW_LINE);
-- INSTALL(brw, Point, _NEW_POINT);
-- INSTALL(brw, Polygon, _NEW_POLYGON);
-- INSTALL(brw, Scissor, _NEW_SCISSOR);
-- INSTALL(brw, Stencil, _NEW_STENCIL);
-- INSTALL(brw, Texture, _NEW_TEXTURE);
-- INSTALL(brw, Transform, _NEW_TRANSFORM);
-- INSTALL(brw, Viewport, _NEW_VIEWPORT);
-- INSTALL(brw, VertexProgram, _NEW_PROGRAM);
-- INSTALL(brw, FragmentProgram, _NEW_PROGRAM);
--}
--
--static void restore_attribs( struct brw_context *brw )
--{
-- RESTORE(brw, Color, _NEW_COLOR);
-- RESTORE(brw, Depth, _NEW_DEPTH);
-- RESTORE(brw, Fog, _NEW_FOG);
-- RESTORE(brw, Hint, _NEW_HINT);
-- RESTORE(brw, Light, _NEW_LIGHT);
-- RESTORE(brw, Line, _NEW_LINE);
-- RESTORE(brw, Point, _NEW_POINT);
-- RESTORE(brw, Polygon, _NEW_POLYGON);
-- RESTORE(brw, Scissor, _NEW_SCISSOR);
-- RESTORE(brw, Stencil, _NEW_STENCIL);
-- RESTORE(brw, Texture, _NEW_TEXTURE);
-- RESTORE(brw, Transform, _NEW_TRANSFORM);
-- RESTORE(brw, Viewport, _NEW_VIEWPORT);
-- RESTORE(brw, VertexProgram, _NEW_PROGRAM);
-- RESTORE(brw, FragmentProgram, _NEW_PROGRAM);
--}
--
--
--static const char *vp_prog =
-- "!!ARBvp1.0\n"
-- "MOV result.color, vertex.color;\n"
-- "MOV result.position, vertex.position;\n"
-- "END\n";
--
--static const char *fp_prog =
-- "!!ARBfp1.0\n"
-- "MOV result.color, fragment.color;\n"
-- "END\n";
--
--static const char *fp_tex_prog =
-- "!!ARBfp1.0\n"
-- "TEMP a;\n"
-- "ADD a, fragment.position, program.local[0];\n"
-- "MUL a, a, program.local[1];\n"
-- "TEX result.color, a, texture[0], 2D;\n"
-- "MOV result.depth.z, fragment.position;\n"
-- "END\n";
--
--/* Derived values of importance:
-- *
-- * FragmentProgram->_Current
-- * VertexProgram->_Enabled
-- * brw->vertex_program
-- * DrawBuffer->_ColorDrawBufferIndexes[0]
-- *
-- *
-- * More if drawpixels-through-texture is added.
-- */
--static void init_metaops_state( struct brw_context *brw )
--{
-- GLcontext *ctx = &brw->intel.ctx;
--
-- brw->metaops.vbo = ctx->Driver.NewBufferObject(ctx, 1, GL_ARRAY_BUFFER_ARB);
--
-- ctx->Driver.BufferData(ctx,
-- GL_ARRAY_BUFFER_ARB,
-- 4096,
-- NULL,
-- GL_DYNAMIC_DRAW_ARB,
-- brw->metaops.vbo);
--
-- brw->metaops.fp = (struct gl_fragment_program *)
-- ctx->Driver.NewProgram(ctx, GL_FRAGMENT_PROGRAM_ARB, 1 );
--
-- brw->metaops.fp_tex = (struct gl_fragment_program *)
-- ctx->Driver.NewProgram(ctx, GL_FRAGMENT_PROGRAM_ARB, 1 );
--
-- brw->metaops.vp = (struct gl_vertex_program *)
-- ctx->Driver.NewProgram(ctx, GL_VERTEX_PROGRAM_ARB, 1 );
--
-- _mesa_parse_arb_fragment_program(ctx, GL_FRAGMENT_PROGRAM_ARB,
-- fp_prog, strlen(fp_prog),
-- brw->metaops.fp);
--
-- _mesa_parse_arb_fragment_program(ctx, GL_FRAGMENT_PROGRAM_ARB,
-- fp_tex_prog, strlen(fp_tex_prog),
-- brw->metaops.fp_tex);
--
-- _mesa_parse_arb_vertex_program(ctx, GL_VERTEX_PROGRAM_ARB,
-- vp_prog, strlen(vp_prog),
-- brw->metaops.vp);
--
-- brw->metaops.attribs.VertexProgram->_Current = brw->metaops.vp;
-- brw->metaops.attribs.VertexProgram->_Enabled = GL_TRUE;
--
-- brw->metaops.attribs.FragmentProgram->_Current = brw->metaops.fp;
--}
--
--static void meta_flat_shade( struct intel_context *intel )
--{
-- struct brw_context *brw = brw_context(&intel->ctx);
--
-- brw->metaops.attribs.Light->ShadeModel = GL_FLAT;
-- brw->state.dirty.mesa |= _NEW_LIGHT;
--}
--
--
--static void meta_no_stencil_write( struct intel_context *intel )
--{
-- struct brw_context *brw = brw_context(&intel->ctx);
--
-- brw->metaops.attribs.Stencil->Enabled = GL_FALSE;
-- brw->metaops.attribs.Stencil->WriteMask[0] = GL_FALSE;
-- brw->state.dirty.mesa |= _NEW_STENCIL;
--}
--
--static void meta_no_depth_write( struct intel_context *intel )
--{
-- struct brw_context *brw = brw_context(&intel->ctx);
--
-- brw->metaops.attribs.Depth->Test = GL_FALSE;
-- brw->metaops.attribs.Depth->Mask = GL_FALSE;
-- brw->state.dirty.mesa |= _NEW_DEPTH;
--}
--
--
--static void meta_depth_replace( struct intel_context *intel )
--{
-- struct brw_context *brw = brw_context(&intel->ctx);
--
-- /* ctx->Driver.Enable( ctx, GL_DEPTH_TEST, GL_TRUE )
-- * ctx->Driver.DepthMask( ctx, GL_TRUE )
-- */
-- brw->metaops.attribs.Depth->Test = GL_TRUE;
-- brw->metaops.attribs.Depth->Mask = GL_TRUE;
-- brw->state.dirty.mesa |= _NEW_DEPTH;
--
-- /* ctx->Driver.DepthFunc( ctx, GL_ALWAYS )
-- */
-- brw->metaops.attribs.Depth->Func = GL_ALWAYS;
--
-- brw->state.dirty.mesa |= _NEW_DEPTH;
--}
--
--
--static void meta_stencil_replace( struct intel_context *intel,
-- GLuint s_mask,
-- GLuint s_clear)
--{
-- struct brw_context *brw = brw_context(&intel->ctx);
--
-- brw->metaops.attribs.Stencil->Enabled = GL_TRUE;
-- brw->metaops.attribs.Stencil->WriteMask[0] = s_mask;
-- brw->metaops.attribs.Stencil->ValueMask[0] = 0xff;
-- brw->metaops.attribs.Stencil->Ref[0] = s_clear;
-- brw->metaops.attribs.Stencil->Function[0] = GL_ALWAYS;
-- brw->metaops.attribs.Stencil->FailFunc[0] = GL_REPLACE;
-- brw->metaops.attribs.Stencil->ZPassFunc[0] = GL_REPLACE;
-- brw->metaops.attribs.Stencil->ZFailFunc[0] = GL_REPLACE;
-- brw->state.dirty.mesa |= _NEW_STENCIL;
--}
--
--
--static void meta_color_mask( struct intel_context *intel, GLboolean state )
--{
-- struct brw_context *brw = brw_context(&intel->ctx);
--
-- if (state)
-- COPY_4V(brw->metaops.attribs.Color->ColorMask,
-- brw->intel.ctx.Color.ColorMask);
-- else
-- ASSIGN_4V(brw->metaops.attribs.Color->ColorMask, 0, 0, 0, 0);
--
-- brw->state.dirty.mesa |= _NEW_COLOR;
--}
--
--static void meta_no_texture( struct intel_context *intel )
--{
-- struct brw_context *brw = brw_context(&intel->ctx);
--
-- brw->metaops.attribs.FragmentProgram->_Current = brw->metaops.fp;
--
-- brw->metaops.attribs.Texture->CurrentUnit = 0;
-- brw->metaops.attribs.Texture->_EnabledUnits = 0;
-- brw->metaops.attribs.Texture->_EnabledCoordUnits = 0;
-- brw->metaops.attribs.Texture->Unit[ 0 ].Enabled = 0;
-- brw->metaops.attribs.Texture->Unit[ 0 ]._ReallyEnabled = 0;
--
-- brw->state.dirty.mesa |= _NEW_TEXTURE | _NEW_PROGRAM;
--}
--
--static void meta_texture_blend_replace(struct intel_context *intel)
--{
-- struct brw_context *brw = brw_context(&intel->ctx);
--
-- brw->metaops.attribs.Texture->CurrentUnit = 0;
-- brw->metaops.attribs.Texture->_EnabledUnits = 1;
-- brw->metaops.attribs.Texture->_EnabledCoordUnits = 1;
-- brw->metaops.attribs.Texture->Unit[ 0 ].Enabled = TEXTURE_2D_BIT;
-- brw->metaops.attribs.Texture->Unit[ 0 ]._ReallyEnabled = TEXTURE_2D_BIT;
-- brw->metaops.attribs.Texture->Unit[ 0 ].Current2D =
-- intel->frame_buffer_texobj;
-- brw->metaops.attribs.Texture->Unit[ 0 ]._Current =
-- intel->frame_buffer_texobj;
--
-- brw->state.dirty.mesa |= _NEW_TEXTURE | _NEW_PROGRAM;
--}
--
--static void meta_import_pixel_state(struct intel_context *intel)
--{
-- struct brw_context *brw = brw_context(&intel->ctx);
--
-- RESTORE(brw, Color, _NEW_COLOR);
-- RESTORE(brw, Depth, _NEW_DEPTH);
-- RESTORE(brw, Fog, _NEW_FOG);
-- RESTORE(brw, Scissor, _NEW_SCISSOR);
-- RESTORE(brw, Stencil, _NEW_STENCIL);
-- RESTORE(brw, Texture, _NEW_TEXTURE);
-- RESTORE(brw, FragmentProgram, _NEW_PROGRAM);
--}
--
--static void meta_frame_buffer_texture( struct intel_context *intel,
-- GLint xoff, GLint yoff )
--{
-- struct brw_context *brw = brw_context(&intel->ctx);
-- struct intel_region *region = intel_drawbuf_region( intel );
--
-- INSTALL(brw, FragmentProgram, _NEW_PROGRAM);
--
-- brw->metaops.attribs.FragmentProgram->_Current = brw->metaops.fp_tex;
-- /* This is unfortunate, but seems to be necessary, since later on we
-- will end up calling _mesa_load_state_parameters to lookup the
-- local params (below), and that will want to look in ctx.FragmentProgram
-- instead of brw->attribs.FragmentProgram. */
-- intel->ctx.FragmentProgram.Current = brw->metaops.fp_tex;
--
-- brw->metaops.fp_tex->Base.LocalParams[ 0 ][ 0 ] = xoff;
-- brw->metaops.fp_tex->Base.LocalParams[ 0 ][ 1 ] = yoff;
-- brw->metaops.fp_tex->Base.LocalParams[ 0 ][ 2 ] = 0.0;
-- brw->metaops.fp_tex->Base.LocalParams[ 0 ][ 3 ] = 0.0;
-- brw->metaops.fp_tex->Base.LocalParams[ 1 ][ 0 ] =
-- 1.0 / region->pitch;
-- brw->metaops.fp_tex->Base.LocalParams[ 1 ][ 1 ] =
-- -1.0 / region->height;
-- brw->metaops.fp_tex->Base.LocalParams[ 1 ][ 2 ] = 0.0;
-- brw->metaops.fp_tex->Base.LocalParams[ 1 ][ 3 ] = 1.0;
--
-- brw->state.dirty.mesa |= _NEW_PROGRAM;
--}
--
--
--static void meta_draw_region( struct intel_context *intel,
-- struct intel_region *draw_region,
-- struct intel_region *depth_region )
--{
-- struct brw_context *brw = brw_context(&intel->ctx);
--
-- if (!brw->metaops.saved_draw_region) {
-- brw->metaops.saved_draw_region = brw->state.draw_regions[0];
-- brw->metaops.saved_nr_draw_regions = brw->state.nr_draw_regions;
-- brw->metaops.saved_depth_region = brw->state.depth_region;
-- }
--
-- brw->state.draw_regions[0] = draw_region;
-- brw->state.nr_draw_regions = 1;
-- brw->state.depth_region = depth_region;
--
-- if (intel->frame_buffer_texobj != NULL)
-- brw_FrameBufferTexDestroy(brw);
--
-- if (draw_region)
-- brw_FrameBufferTexInit(brw, draw_region);
--
-- brw->state.dirty.mesa |= _NEW_BUFFERS;
--}
--
--
--static void meta_draw_quad(struct intel_context *intel,
-- GLfloat x0, GLfloat x1,
-- GLfloat y0, GLfloat y1,
-- GLfloat z,
-- GLuint color,
-- GLfloat s0, GLfloat s1,
-- GLfloat t0, GLfloat t1)
--{
-- GLcontext *ctx = &intel->ctx;
-- struct brw_context *brw = brw_context(&intel->ctx);
-- struct gl_client_array pos_array;
-- struct gl_client_array color_array;
-- struct gl_client_array *attribs[VERT_ATTRIB_MAX];
-- struct _mesa_prim prim[1];
-- GLfloat pos[4][3];
--
-- ctx->Driver.BufferData(ctx,
-- GL_ARRAY_BUFFER_ARB,
-- sizeof(pos) + sizeof(color),
-- NULL,
-- GL_DYNAMIC_DRAW_ARB,
-- brw->metaops.vbo);
--
-- pos[0][0] = x0;
-- pos[0][1] = y0;
-- pos[0][2] = z;
--
-- pos[1][0] = x1;
-- pos[1][1] = y0;
-- pos[1][2] = z;
--
-- pos[2][0] = x1;
-- pos[2][1] = y1;
-- pos[2][2] = z;
--
-- pos[3][0] = x0;
-- pos[3][1] = y1;
-- pos[3][2] = z;
--
-- ctx->Driver.BufferSubData(ctx,
-- GL_ARRAY_BUFFER_ARB,
-- 0,
-- sizeof(pos),
-- pos,
-- brw->metaops.vbo);
--
-- /* Convert incoming ARGB to required RGBA */
-- /* Note this color is stored as GL_UNSIGNED_BYTE */
-- color = (color & 0xff00ff00) | (((color >> 16) | (color << 16)) & 0xff00ff);
--
-- ctx->Driver.BufferSubData(ctx,
-- GL_ARRAY_BUFFER_ARB,
-- sizeof(pos),
-- sizeof(color),
-- &color,
-- brw->metaops.vbo);
--
-- /* Ignoring texture coords.
-- */
--
-- memset(attribs, 0, VERT_ATTRIB_MAX * sizeof(*attribs));
--
-- attribs[VERT_ATTRIB_POS] = &pos_array;
-- attribs[VERT_ATTRIB_POS]->Ptr = 0;
-- attribs[VERT_ATTRIB_POS]->Type = GL_FLOAT;
-- attribs[VERT_ATTRIB_POS]->Enabled = 1;
-- attribs[VERT_ATTRIB_POS]->Size = 3;
-- attribs[VERT_ATTRIB_POS]->StrideB = 3 * sizeof(GLfloat);
-- attribs[VERT_ATTRIB_POS]->Stride = 3 * sizeof(GLfloat);
-- attribs[VERT_ATTRIB_POS]->_MaxElement = 4;
-- attribs[VERT_ATTRIB_POS]->Normalized = 0;
-- attribs[VERT_ATTRIB_POS]->BufferObj = brw->metaops.vbo;
--
-- attribs[VERT_ATTRIB_COLOR0] = &color_array;
-- attribs[VERT_ATTRIB_COLOR0]->Ptr = (const GLubyte *)sizeof(pos);
-- attribs[VERT_ATTRIB_COLOR0]->Type = GL_UNSIGNED_BYTE;
-- attribs[VERT_ATTRIB_COLOR0]->Enabled = 1;
-- attribs[VERT_ATTRIB_COLOR0]->Size = 4;
-- attribs[VERT_ATTRIB_COLOR0]->StrideB = 0;
-- attribs[VERT_ATTRIB_COLOR0]->Stride = 0;
-- attribs[VERT_ATTRIB_COLOR0]->_MaxElement = 1;
-- attribs[VERT_ATTRIB_COLOR0]->Normalized = 1;
-- attribs[VERT_ATTRIB_COLOR0]->BufferObj = brw->metaops.vbo;
--
-- /* Just ignoring texture coordinates for now.
-- */
--
-- memset(prim, 0, sizeof(*prim));
--
-- prim[0].mode = GL_TRIANGLE_FAN;
-- prim[0].begin = 1;
-- prim[0].end = 1;
-- prim[0].weak = 0;
-- prim[0].pad = 0;
-- prim[0].start = 0;
-- prim[0].count = 4;
--
-- brw_draw_prims(&brw->intel.ctx,
-- (const struct gl_client_array **)attribs,
-- prim, 1,
-- NULL,
-- 0,
-- 3 );
--}
--
--
--static void install_meta_state( struct intel_context *intel )
--{
-- GLcontext *ctx = &intel->ctx;
-- struct brw_context *brw = brw_context(ctx);
-- GLuint i;
--
-- if (!brw->metaops.vbo) {
-- init_metaops_state(brw);
-- }
--
-- install_attribs(brw);
--
-- meta_no_texture(&brw->intel);
-- meta_flat_shade(&brw->intel);
-- for (i = 0; i < ctx->Const.MaxDrawBuffers; i++) {
-- brw->metaops.restore_draw_buffers[i]
-- = ctx->DrawBuffer->_ColorDrawBufferIndexes[i];
-- }
-- brw->metaops.restore_num_draw_buffers = ctx->DrawBuffer->_NumColorDrawBuffers;
--
-- brw->metaops.restore_fp = ctx->FragmentProgram.Current;
--
-- /* This works without adjusting refcounts. Fix later?
-- */
-- brw->metaops.saved_draw_region = brw->state.draw_regions[0];
-- brw->metaops.saved_nr_draw_regions = brw->state.nr_draw_regions;
-- brw->metaops.saved_depth_region = brw->state.depth_region;
-- brw->metaops.active = 1;
--
-- brw->state.dirty.brw |= BRW_NEW_METAOPS;
--}
--
--static void leave_meta_state( struct intel_context *intel )
--{
-- GLcontext *ctx = &intel->ctx;
-- struct brw_context *brw = brw_context(ctx);
-- GLuint i;
--
-- restore_attribs(brw);
--
-- for (i = 0; i < ctx->Const.MaxDrawBuffers; i++) {
-- ctx->DrawBuffer->_ColorDrawBufferIndexes[i]
-- = brw->metaops.restore_draw_buffers[i];
-- }
-- ctx->DrawBuffer->_NumColorDrawBuffers = brw->metaops.restore_num_draw_buffers;
--
-- ctx->FragmentProgram.Current = brw->metaops.restore_fp;
--
-- brw->state.draw_regions[0] = brw->metaops.saved_draw_region;
-- brw->state.nr_draw_regions = brw->metaops.saved_nr_draw_regions;
-- brw->state.depth_region = brw->metaops.saved_depth_region;
-- brw->metaops.saved_draw_region = NULL;
-- brw->metaops.saved_depth_region = NULL;
-- brw->metaops.active = 0;
--
-- brw->state.dirty.mesa |= _NEW_BUFFERS;
-- brw->state.dirty.brw |= BRW_NEW_METAOPS;
--}
--
--
--
--void brw_init_metaops( struct brw_context *brw )
--{
-- init_attribs(brw);
--
--
-- brw->intel.vtbl.install_meta_state = install_meta_state;
-- brw->intel.vtbl.leave_meta_state = leave_meta_state;
-- brw->intel.vtbl.meta_no_depth_write = meta_no_depth_write;
-- brw->intel.vtbl.meta_no_stencil_write = meta_no_stencil_write;
-- brw->intel.vtbl.meta_stencil_replace = meta_stencil_replace;
-- brw->intel.vtbl.meta_depth_replace = meta_depth_replace;
-- brw->intel.vtbl.meta_color_mask = meta_color_mask;
-- brw->intel.vtbl.meta_no_texture = meta_no_texture;
-- brw->intel.vtbl.meta_import_pixel_state = meta_import_pixel_state;
-- brw->intel.vtbl.meta_frame_buffer_texture = meta_frame_buffer_texture;
-- brw->intel.vtbl.meta_draw_region = meta_draw_region;
-- brw->intel.vtbl.meta_draw_quad = meta_draw_quad;
-- brw->intel.vtbl.meta_texture_blend_replace = meta_texture_blend_replace;
--/* brw->intel.vtbl.meta_tex_rect_source = meta_tex_rect_source; */
--/* brw->intel.vtbl.meta_draw_format = set_draw_format; */
--}
--
--void brw_destroy_metaops( struct brw_context *brw )
--{
-- GLcontext *ctx = &brw->intel.ctx;
--
-- if (brw->metaops.vbo)
-- ctx->Driver.DeleteBuffer( ctx, brw->metaops.vbo );
--
--/* ctx->Driver.DeleteProgram( ctx, brw->metaops.fp ); */
--/* ctx->Driver.DeleteProgram( ctx, brw->metaops.fp_tex ); */
--/* ctx->Driver.DeleteProgram( ctx, brw->metaops.vp ); */
--}
-diff --git a/src/mesa/drivers/dri/i965/brw_misc_state.c b/src/mesa/drivers/dri/i965/brw_misc_state.c
-index 627705f..40cb7a3 100644
---- a/src/mesa/drivers/dri/i965/brw_misc_state.c
-+++ b/src/mesa/drivers/dri/i965/brw_misc_state.c
-@@ -48,15 +48,16 @@
-
- static void upload_blend_constant_color(struct brw_context *brw)
- {
-+ GLcontext *ctx = &brw->intel.ctx;
- struct brw_blend_constant_color bcc;
-
- memset(&bcc, 0, sizeof(bcc));
- bcc.header.opcode = CMD_BLEND_CONSTANT_COLOR;
- bcc.header.length = sizeof(bcc)/4-2;
-- bcc.blend_constant_color[0] = brw->attribs.Color->BlendColor[0];
-- bcc.blend_constant_color[1] = brw->attribs.Color->BlendColor[1];
-- bcc.blend_constant_color[2] = brw->attribs.Color->BlendColor[2];
-- bcc.blend_constant_color[3] = brw->attribs.Color->BlendColor[3];
-+ bcc.blend_constant_color[0] = ctx->Color.BlendColor[0];
-+ bcc.blend_constant_color[1] = ctx->Color.BlendColor[1];
-+ bcc.blend_constant_color[2] = ctx->Color.BlendColor[2];
-+ bcc.blend_constant_color[3] = ctx->Color.BlendColor[3];
-
- BRW_CACHED_BATCH_STRUCT(brw, &bcc);
- }
-@@ -154,10 +155,7 @@ static void upload_pipelined_state_pointers(struct brw_context *brw )
- OUT_RELOC(brw->gs.state_bo, I915_GEM_DOMAIN_INSTRUCTION, 0, 1);
- else
- OUT_BATCH(0);
-- if (!brw->metaops.active)
-- OUT_RELOC(brw->clip.state_bo, I915_GEM_DOMAIN_INSTRUCTION, 0, 1);
-- else
-- OUT_BATCH(0);
-+ OUT_RELOC(brw->clip.state_bo, I915_GEM_DOMAIN_INSTRUCTION, 0, 1);
- OUT_RELOC(brw->sf.state_bo, I915_GEM_DOMAIN_INSTRUCTION, 0, 0);
- OUT_RELOC(brw->wm.state_bo, I915_GEM_DOMAIN_INSTRUCTION, 0, 0);
- OUT_RELOC(brw->cc.state_bo, I915_GEM_DOMAIN_INSTRUCTION, 0, 0);
-@@ -180,13 +178,13 @@ static void upload_psp_urb_cbs(struct brw_context *brw )
- {
- upload_pipelined_state_pointers(brw);
- brw_upload_urb_fence(brw);
-- brw_upload_constant_buffer_state(brw);
-+ brw_upload_cs_urb_state(brw);
- }
-
- const struct brw_tracked_state brw_psp_urb_cbs = {
- .dirty = {
- .mesa = 0,
-- .brw = BRW_NEW_URB_FENCE | BRW_NEW_METAOPS | BRW_NEW_BATCH,
-+ .brw = BRW_NEW_URB_FENCE | BRW_NEW_BATCH,
- .cache = (CACHE_NEW_VS_UNIT |
- CACHE_NEW_GS_UNIT |
- CACHE_NEW_GS_PROG |
-@@ -284,6 +282,7 @@ const struct brw_tracked_state brw_depthbuffer = {
-
- static void upload_polygon_stipple(struct brw_context *brw)
- {
-+ GLcontext *ctx = &brw->intel.ctx;
- struct brw_polygon_stipple bps;
- GLuint i;
-
-@@ -292,7 +291,7 @@ static void upload_polygon_stipple(struct brw_context *brw)
- bps.header.length = sizeof(bps)/4-2;
-
- for (i = 0; i < 32; i++)
-- bps.stipple[i] = brw->attribs.PolygonStipple[31 - i]; /* invert */
-+ bps.stipple[i] = ctx->PolygonStipple[31 - i]; /* invert */
-
- BRW_CACHED_BATCH_STRUCT(brw, &bps);
- }
-@@ -370,6 +369,7 @@ const struct brw_tracked_state brw_aa_line_parameters = {
-
- static void upload_line_stipple(struct brw_context *brw)
- {
-+ GLcontext *ctx = &brw->intel.ctx;
- struct brw_line_stipple bls;
- GLfloat tmp;
- GLint tmpi;
-@@ -378,10 +378,10 @@ static void upload_line_stipple(struct brw_context *brw)
- bls.header.opcode = CMD_LINE_STIPPLE_PATTERN;
- bls.header.length = sizeof(bls)/4 - 2;
-
-- bls.bits0.pattern = brw->attribs.Line->StipplePattern;
-- bls.bits1.repeat_count = brw->attribs.Line->StippleFactor;
-+ bls.bits0.pattern = ctx->Line.StipplePattern;
-+ bls.bits1.repeat_count = ctx->Line.StippleFactor;
-
-- tmp = 1.0 / (GLfloat) brw->attribs.Line->StippleFactor;
-+ tmp = 1.0 / (GLfloat) ctx->Line.StippleFactor;
- tmpi = tmp * (1<<13);
-
-
-diff --git a/src/mesa/drivers/dri/i965/brw_program.c b/src/mesa/drivers/dri/i965/brw_program.c
-index 0c86911..774180c 100644
---- a/src/mesa/drivers/dri/i965/brw_program.c
-+++ b/src/mesa/drivers/dri/i965/brw_program.c
-@@ -94,7 +94,6 @@ static struct gl_program *brwNewProgram( GLcontext *ctx,
- static void brwDeleteProgram( GLcontext *ctx,
- struct gl_program *prog )
- {
--
- _mesa_delete_program( ctx, prog );
- }
-
-@@ -110,30 +109,29 @@ static void brwProgramStringNotify( GLcontext *ctx,
- GLenum target,
- struct gl_program *prog )
- {
-+ struct brw_context *brw = brw_context(ctx);
- if (target == GL_FRAGMENT_PROGRAM_ARB) {
- struct gl_fragment_program *fprog = (struct gl_fragment_program *) prog;
-- struct brw_context *brw = brw_context(ctx);
-- struct brw_fragment_program *p = (struct brw_fragment_program *)prog;
-- struct brw_fragment_program *fp = (struct brw_fragment_program *)brw->fragment_program;
-+ struct brw_fragment_program *newFP = (struct brw_fragment_program *) prog;
-+ struct brw_fragment_program *curFP = (struct brw_fragment_program *) brw->fragment_program;
- if (fprog->FogOption) {
- _mesa_append_fog_code(ctx, fprog);
- fprog->FogOption = GL_NONE;
- }
-
-- if (p == fp)
-+ if (newFP == curFP)
- brw->state.dirty.brw |= BRW_NEW_FRAGMENT_PROGRAM;
-- p->id = brw->program_id++;
-+ newFP->id = brw->program_id++;
- }
- else if (target == GL_VERTEX_PROGRAM_ARB) {
-- struct brw_context *brw = brw_context(ctx);
-- struct brw_vertex_program *p = (struct brw_vertex_program *)prog;
-- struct brw_vertex_program *vp = (struct brw_vertex_program *)brw->vertex_program;
-- if (p == vp)
-+ struct brw_vertex_program *newVP = (struct brw_vertex_program *) prog;
-+ struct brw_vertex_program *curVP = (struct brw_vertex_program *) brw->vertex_program;
-+ if (newVP == curVP)
- brw->state.dirty.brw |= BRW_NEW_VERTEX_PROGRAM;
-- if (p->program.IsPositionInvariant) {
-- _mesa_insert_mvp_code(ctx, &p->program);
-+ if (newVP->program.IsPositionInvariant) {
-+ _mesa_insert_mvp_code(ctx, &newVP->program);
- }
-- p->id = brw->program_id++;
-+ newVP->id = brw->program_id++;
-
- /* Also tell tnl about it:
- */
-diff --git a/src/mesa/drivers/dri/i965/brw_sf.c b/src/mesa/drivers/dri/i965/brw_sf.c
-index 1a11d54..8c17115 100644
---- a/src/mesa/drivers/dri/i965/brw_sf.c
-+++ b/src/mesa/drivers/dri/i965/brw_sf.c
-@@ -46,6 +46,7 @@
- static void compile_sf_prog( struct brw_context *brw,
- struct brw_sf_prog_key *key )
- {
-+ GLcontext *ctx = &brw->intel.ctx;
- struct brw_sf_compile c;
- const GLuint *program;
- GLuint program_size;
-@@ -74,7 +75,7 @@ static void compile_sf_prog( struct brw_context *brw,
- c.idx_to_attr[idx] = i;
- if (i >= VERT_RESULT_TEX0 && i <= VERT_RESULT_TEX7) {
- c.point_attrs[i].CoordReplace =
-- brw->attribs.Point->CoordReplace[i - VERT_RESULT_TEX0];
-+ ctx->Point.CoordReplace[i - VERT_RESULT_TEX0];
- }
- else {
- c.point_attrs[i].CoordReplace = GL_FALSE;
-@@ -128,6 +129,7 @@ static void compile_sf_prog( struct brw_context *brw,
- */
- static void upload_sf_prog(struct brw_context *brw)
- {
-+ GLcontext *ctx = &brw->intel.ctx;
- struct brw_sf_prog_key key;
-
- memset(&key, 0, sizeof(key));
-@@ -158,15 +160,15 @@ static void upload_sf_prog(struct brw_context *brw)
- break;
- }
-
-- key.do_point_sprite = brw->attribs.Point->PointSprite;
-- key.SpriteOrigin = brw->attribs.Point->SpriteOrigin;
-+ key.do_point_sprite = ctx->Point.PointSprite;
-+ key.SpriteOrigin = ctx->Point.SpriteOrigin;
- /* _NEW_LIGHT */
-- key.do_flat_shading = (brw->attribs.Light->ShadeModel == GL_FLAT);
-- key.do_twoside_color = (brw->attribs.Light->Enabled && brw->attribs.Light->Model.TwoSide);
-+ key.do_flat_shading = (ctx->Light.ShadeModel == GL_FLAT);
-+ key.do_twoside_color = (ctx->Light.Enabled && ctx->Light.Model.TwoSide);
-
- /* _NEW_POLYGON */
- if (key.do_twoside_color)
-- key.frontface_ccw = (brw->attribs.Polygon->FrontFace == GL_CCW);
-+ key.frontface_ccw = (ctx->Polygon.FrontFace == GL_CCW);
-
- dri_bo_unreference(brw->sf.prog_bo);
- brw->sf.prog_bo = brw_search_cache(&brw->cache, BRW_SF_PROG,
-diff --git a/src/mesa/drivers/dri/i965/brw_sf_state.c b/src/mesa/drivers/dri/i965/brw_sf_state.c
-index 242b704..e96d535 100644
---- a/src/mesa/drivers/dri/i965/brw_sf_state.c
-+++ b/src/mesa/drivers/dri/i965/brw_sf_state.c
-@@ -43,10 +43,11 @@ static void upload_sf_vp(struct brw_context *brw)
- const GLfloat depth_scale = 1.0F / ctx->DrawBuffer->_DepthMaxF;
- struct brw_sf_viewport sfv;
- GLfloat y_scale, y_bias;
-+ const GLboolean render_to_fbo = (ctx->DrawBuffer->Name != 0);
-
- memset(&sfv, 0, sizeof(sfv));
-
-- if (intel_rendering_to_texture(ctx)) {
-+ if (render_to_fbo) {
- y_scale = 1.0;
- y_bias = 0;
- }
-@@ -55,25 +56,16 @@ static void upload_sf_vp(struct brw_context *brw)
- y_bias = ctx->DrawBuffer->Height;
- }
-
-- /* _NEW_VIEWPORT, BRW_NEW_METAOPS */
--
-- if (!brw->metaops.active) {
-- const GLfloat *v = ctx->Viewport._WindowMap.m;
--
-- sfv.viewport.m00 = v[MAT_SX];
-- sfv.viewport.m11 = v[MAT_SY] * y_scale;
-- sfv.viewport.m22 = v[MAT_SZ] * depth_scale;
-- sfv.viewport.m30 = v[MAT_TX];
-- sfv.viewport.m31 = v[MAT_TY] * y_scale + y_bias;
-- sfv.viewport.m32 = v[MAT_TZ] * depth_scale;
-- } else {
-- sfv.viewport.m00 = 1;
-- sfv.viewport.m11 = - 1;
-- sfv.viewport.m22 = 1;
-- sfv.viewport.m30 = 0;
-- sfv.viewport.m31 = ctx->DrawBuffer->Height;
-- sfv.viewport.m32 = 0;
-- }
-+ /* _NEW_VIEWPORT */
-+
-+ const GLfloat *v = ctx->Viewport._WindowMap.m;
-+
-+ sfv.viewport.m00 = v[MAT_SX];
-+ sfv.viewport.m11 = v[MAT_SY] * y_scale;
-+ sfv.viewport.m22 = v[MAT_SZ] * depth_scale;
-+ sfv.viewport.m30 = v[MAT_TX];
-+ sfv.viewport.m31 = v[MAT_TY] * y_scale + y_bias;
-+ sfv.viewport.m32 = v[MAT_TZ] * depth_scale;
-
- /* _NEW_SCISSOR */
-
-@@ -84,10 +76,20 @@ static void upload_sf_vp(struct brw_context *brw)
- * Note that the hardware's coordinates are inclusive, while Mesa's min is
- * inclusive but max is exclusive.
- */
-- sfv.scissor.xmin = ctx->DrawBuffer->_Xmin;
-- sfv.scissor.xmax = ctx->DrawBuffer->_Xmax - 1;
-- sfv.scissor.ymin = ctx->DrawBuffer->Height - ctx->DrawBuffer->_Ymax;
-- sfv.scissor.ymax = ctx->DrawBuffer->Height - ctx->DrawBuffer->_Ymin - 1;
-+ if (render_to_fbo) {
-+ /* texmemory: Y=0=bottom */
-+ sfv.scissor.xmin = ctx->DrawBuffer->_Xmin;
-+ sfv.scissor.xmax = ctx->DrawBuffer->_Xmax - 1;
-+ sfv.scissor.ymin = ctx->DrawBuffer->_Ymin;
-+ sfv.scissor.ymax = ctx->DrawBuffer->_Ymax - 1;
-+ }
-+ else {
-+ /* memory: Y=0=top */
-+ sfv.scissor.xmin = ctx->DrawBuffer->_Xmin;
-+ sfv.scissor.xmax = ctx->DrawBuffer->_Xmax - 1;
-+ sfv.scissor.ymin = ctx->DrawBuffer->Height - ctx->DrawBuffer->_Ymax;
-+ sfv.scissor.ymax = ctx->DrawBuffer->Height - ctx->DrawBuffer->_Ymin - 1;
-+ }
-
- dri_bo_unreference(brw->sf.vp_bo);
- brw->sf.vp_bo = brw_cache_data( &brw->cache, BRW_SF_VP, &sfv, NULL, 0 );
-@@ -97,7 +99,7 @@ const struct brw_tracked_state brw_sf_vp = {
- .dirty = {
- .mesa = (_NEW_VIEWPORT |
- _NEW_SCISSOR),
-- .brw = BRW_NEW_METAOPS,
-+ .brw = 0,
- .cache = 0
- },
- .prepare = upload_sf_vp
-@@ -110,15 +112,19 @@ struct brw_sf_unit_key {
- unsigned int nr_urb_entries, urb_size, sfsize;
-
- GLenum front_face, cull_face;
-- GLboolean scissor, line_smooth, point_sprite, point_attenuated;
-+ unsigned scissor:1;
-+ unsigned line_smooth:1;
-+ unsigned point_sprite:1;
-+ unsigned point_attenuated:1;
-+ unsigned render_to_fbo:1;
- float line_width;
- float point_size;
-- GLboolean render_to_texture;
- };
-
- static void
- sf_unit_populate_key(struct brw_context *brw, struct brw_sf_unit_key *key)
- {
-+ GLcontext *ctx = &brw->intel.ctx;
- memset(key, 0, sizeof(*key));
-
- /* CACHE_NEW_SF_PROG */
-@@ -130,22 +136,22 @@ sf_unit_populate_key(struct brw_context *brw, struct brw_sf_unit_key *key)
- key->urb_size = brw->urb.vsize;
- key->sfsize = brw->urb.sfsize;
-
-- key->scissor = brw->attribs.Scissor->Enabled;
-- key->front_face = brw->attribs.Polygon->FrontFace;
-+ key->scissor = ctx->Scissor.Enabled;
-+ key->front_face = ctx->Polygon.FrontFace;
-
-- if (brw->attribs.Polygon->CullFlag)
-- key->cull_face = brw->attribs.Polygon->CullFaceMode;
-+ if (ctx->Polygon.CullFlag)
-+ key->cull_face = ctx->Polygon.CullFaceMode;
- else
- key->cull_face = GL_NONE;
-
-- key->line_width = brw->attribs.Line->Width;
-- key->line_smooth = brw->attribs.Line->SmoothFlag;
-+ key->line_width = ctx->Line.Width;
-+ key->line_smooth = ctx->Line.SmoothFlag;
-
-- key->point_sprite = brw->attribs.Point->PointSprite;
-- key->point_size = brw->attribs.Point->Size;
-- key->point_attenuated = brw->attribs.Point->_Attenuated;
-+ key->point_sprite = ctx->Point.PointSprite;
-+ key->point_size = ctx->Point.Size;
-+ key->point_attenuated = ctx->Point._Attenuated;
-
-- key->render_to_texture = intel_rendering_to_texture(&brw->intel.ctx);
-+ key->render_to_fbo = brw->intel.ctx.DrawBuffer->Name != 0;
- }
-
- static dri_bo *
-@@ -192,10 +198,10 @@ sf_unit_create_from_key(struct brw_context *brw, struct brw_sf_unit_key *key,
- else
- sf.sf5.front_winding = BRW_FRONTWINDING_CW;
-
-- /* The viewport is inverted for rendering to texture, and that inverts
-+ /* The viewport is inverted for rendering to a FBO, and that inverts
- * polygon front/back orientation.
- */
-- sf.sf5.front_winding ^= key->render_to_texture;
-+ sf.sf5.front_winding ^= key->render_to_fbo;
-
- switch (key->cull_face) {
- case GL_FRONT:
-@@ -295,8 +301,7 @@ const struct brw_tracked_state brw_sf_unit = {
- _NEW_LINE |
- _NEW_POINT |
- _NEW_SCISSOR),
-- .brw = (BRW_NEW_URB_FENCE |
-- BRW_NEW_METAOPS),
-+ .brw = BRW_NEW_URB_FENCE,
- .cache = (CACHE_NEW_SF_VP |
- CACHE_NEW_SF_PROG)
- },
-diff --git a/src/mesa/drivers/dri/i965/brw_state.h b/src/mesa/drivers/dri/i965/brw_state.h
-index df839c5..81b0a45 100644
---- a/src/mesa/drivers/dri/i965/brw_state.h
-+++ b/src/mesa/drivers/dri/i965/brw_state.h
-@@ -52,7 +52,6 @@ const struct brw_tracked_state brw_cc_vp;
- const struct brw_tracked_state brw_check_fallback;
- const struct brw_tracked_state brw_clip_prog;
- const struct brw_tracked_state brw_clip_unit;
--const struct brw_tracked_state brw_constant_buffer_state;
- const struct brw_tracked_state brw_constant_buffer;
- const struct brw_tracked_state brw_curbe_offsets;
- const struct brw_tracked_state brw_invarient_state;
-diff --git a/src/mesa/drivers/dri/i965/brw_state_upload.c b/src/mesa/drivers/dri/i965/brw_state_upload.c
-index 4845859..5de1450 100644
---- a/src/mesa/drivers/dri/i965/brw_state_upload.c
-+++ b/src/mesa/drivers/dri/i965/brw_state_upload.c
-@@ -233,7 +233,6 @@ static struct dirty_bit_map brw_bits[] = {
- DEFINE_BIT(BRW_NEW_WM_INPUT_DIMENSIONS),
- DEFINE_BIT(BRW_NEW_INPUT_VARYING),
- DEFINE_BIT(BRW_NEW_PSP),
-- DEFINE_BIT(BRW_NEW_METAOPS),
- DEFINE_BIT(BRW_NEW_FENCE),
- DEFINE_BIT(BRW_NEW_INDICES),
- DEFINE_BIT(BRW_NEW_VERTICES),
-@@ -298,6 +297,7 @@ brw_print_dirty_count(struct dirty_bit_map *bit_map, int32_t bits)
- */
- void brw_validate_state( struct brw_context *brw )
- {
-+ GLcontext *ctx = &brw->intel.ctx;
- struct intel_context *intel = &brw->intel;
- struct brw_state_flags *state = &brw->state.dirty;
- GLuint i;
-@@ -314,13 +314,13 @@ void brw_validate_state( struct brw_context *brw )
- state->brw |= ~0;
- }
-
-- if (brw->fragment_program != brw->attribs.FragmentProgram->_Current) {
-- brw->fragment_program = brw->attribs.FragmentProgram->_Current;
-+ if (brw->fragment_program != ctx->FragmentProgram._Current) {
-+ brw->fragment_program = ctx->FragmentProgram._Current;
- brw->state.dirty.brw |= BRW_NEW_FRAGMENT_PROGRAM;
- }
-
-- if (brw->vertex_program != brw->attribs.VertexProgram->_Current) {
-- brw->vertex_program = brw->attribs.VertexProgram->_Current;
-+ if (brw->vertex_program != ctx->VertexProgram._Current) {
-+ brw->vertex_program = ctx->VertexProgram._Current;
- brw->state.dirty.brw |= BRW_NEW_VERTEX_PROGRAM;
- }
-
-diff --git a/src/mesa/drivers/dri/i965/brw_structs.h b/src/mesa/drivers/dri/i965/brw_structs.h
-index 4e577d0..89e2981 100644
---- a/src/mesa/drivers/dri/i965/brw_structs.h
-+++ b/src/mesa/drivers/dri/i965/brw_structs.h
-@@ -439,7 +439,7 @@ struct brw_urb_fence
- } bits1;
- };
-
--struct brw_constant_buffer_state /* previously brw_command_streamer */
-+struct brw_cs_urb_state
- {
- struct header header;
-
-@@ -1031,10 +1031,10 @@ struct brw_surface_state
- GLuint writedisable_green:1;
- GLuint writedisable_red:1;
- GLuint writedisable_alpha:1;
-- GLuint surface_format:9;
-+ GLuint surface_format:9; /**< BRW_SURFACEFORMAT_x */
- GLuint data_return_format:1;
- GLuint pad0:1;
-- GLuint surface_type:3;
-+ GLuint surface_type:3; /**< BRW_SURFACE_1D/2D/3D/CUBE */
- } ss0;
-
- struct {
-diff --git a/src/mesa/drivers/dri/i965/brw_tex.c b/src/mesa/drivers/dri/i965/brw_tex.c
-index 0bb6f17..ef99e9c 100644
---- a/src/mesa/drivers/dri/i965/brw_tex.c
-+++ b/src/mesa/drivers/dri/i965/brw_tex.c
-@@ -86,11 +86,12 @@ void brw_FrameBufferTexDestroy( struct brw_context *brw )
- */
- void brw_validate_textures( struct brw_context *brw )
- {
-+ GLcontext *ctx = &brw->intel.ctx;
- struct intel_context *intel = &brw->intel;
- int i;
-
- for (i = 0; i < BRW_MAX_TEX_UNIT; i++) {
-- struct gl_texture_unit *texUnit = &brw->attribs.Texture->Unit[i];
-+ struct gl_texture_unit *texUnit = &ctx->Texture.Unit[i];
-
- if (texUnit->_ReallyEnabled) {
- intel_finalize_mipmap_tree(intel, i);
-diff --git a/src/mesa/drivers/dri/i965/brw_vs.c b/src/mesa/drivers/dri/i965/brw_vs.c
-index 1db7cee..e3111c6 100644
---- a/src/mesa/drivers/dri/i965/brw_vs.c
-+++ b/src/mesa/drivers/dri/i965/brw_vs.c
-@@ -85,6 +85,7 @@ static void do_vs_prog( struct brw_context *brw,
-
- static void brw_upload_vs_prog(struct brw_context *brw)
- {
-+ GLcontext *ctx = &brw->intel.ctx;
- struct brw_vs_prog_key key;
- struct brw_vertex_program *vp =
- (struct brw_vertex_program *)brw->vertex_program;
-@@ -97,14 +98,9 @@ static void brw_upload_vs_prog(struct brw_context *brw)
- * the inputs it asks for, whether they are varying or not.
- */
- key.program_string_id = vp->id;
-- key.nr_userclip = brw_count_bits(brw->attribs.Transform->ClipPlanesEnabled);
-- key.copy_edgeflag = (brw->attribs.Polygon->FrontMode != GL_FILL ||
-- brw->attribs.Polygon->BackMode != GL_FILL);
--
-- /* BRW_NEW_METAOPS
-- */
-- if (brw->metaops.active)
-- key.know_w_is_one = 1;
-+ key.nr_userclip = brw_count_bits(ctx->Transform.ClipPlanesEnabled);
-+ key.copy_edgeflag = (ctx->Polygon.FrontMode != GL_FILL ||
-+ ctx->Polygon.BackMode != GL_FILL);
-
- /* Make an early check for the key.
- */
-@@ -123,7 +119,7 @@ static void brw_upload_vs_prog(struct brw_context *brw)
- const struct brw_tracked_state brw_vs_prog = {
- .dirty = {
- .mesa = _NEW_TRANSFORM | _NEW_POLYGON,
-- .brw = BRW_NEW_VERTEX_PROGRAM | BRW_NEW_METAOPS,
-+ .brw = BRW_NEW_VERTEX_PROGRAM,
- .cache = 0
- },
- .prepare = brw_upload_vs_prog
-diff --git a/src/mesa/drivers/dri/i965/brw_vs.h b/src/mesa/drivers/dri/i965/brw_vs.h
-index 22388ec..99d0e93 100644
---- a/src/mesa/drivers/dri/i965/brw_vs.h
-+++ b/src/mesa/drivers/dri/i965/brw_vs.h
-@@ -43,7 +43,6 @@ struct brw_vs_prog_key {
- GLuint program_string_id;
- GLuint nr_userclip:4;
- GLuint copy_edgeflag:1;
-- GLuint know_w_is_one:1;
- GLuint pad:26;
- };
-
-diff --git a/src/mesa/drivers/dri/i965/brw_vs_constval.c b/src/mesa/drivers/dri/i965/brw_vs_constval.c
-index 6fbac02..9977677 100644
---- a/src/mesa/drivers/dri/i965/brw_vs_constval.c
-+++ b/src/mesa/drivers/dri/i965/brw_vs_constval.c
-@@ -168,6 +168,7 @@ static GLuint get_input_size(struct brw_context *brw,
- */
- static void calc_wm_input_sizes( struct brw_context *brw )
- {
-+ GLcontext *ctx = &brw->intel.ctx;
- /* BRW_NEW_VERTEX_PROGRAM */
- struct brw_vertex_program *vp =
- (struct brw_vertex_program *)brw->vertex_program;
-@@ -179,7 +180,7 @@ static void calc_wm_input_sizes( struct brw_context *brw )
- memset(&t, 0, sizeof(t));
-
- /* _NEW_LIGHT */
-- if (brw->attribs.Light->Model.TwoSide)
-+ if (ctx->Light.Model.TwoSide)
- t.twoside = 1;
-
- for (i = 0; i < VERT_ATTRIB_MAX; i++)
-diff --git a/src/mesa/drivers/dri/i965/brw_vs_emit.c b/src/mesa/drivers/dri/i965/brw_vs_emit.c
-index 174331a..235f826 100644
---- a/src/mesa/drivers/dri/i965/brw_vs_emit.c
-+++ b/src/mesa/drivers/dri/i965/brw_vs_emit.c
-@@ -871,21 +871,15 @@ static void emit_vertex_write( struct brw_vs_compile *c)
- }
-
- /* Build ndc coords */
-- if (!c->key.know_w_is_one) {
-- ndc = get_tmp(c);
-- emit_math1(c, BRW_MATH_FUNCTION_INV, ndc, brw_swizzle1(pos, 3), BRW_MATH_PRECISION_FULL);
-- brw_MUL(p, brw_writemask(ndc, WRITEMASK_XYZ), pos, ndc);
-- }
-- else {
-- ndc = pos;
-- }
-+ ndc = get_tmp(c);
-+ emit_math1(c, BRW_MATH_FUNCTION_INV, ndc, brw_swizzle1(pos, 3), BRW_MATH_PRECISION_FULL);
-+ brw_MUL(p, brw_writemask(ndc, WRITEMASK_XYZ), pos, ndc);
-
- /* Update the header for point size, user clipping flags, and -ve rhw
- * workaround.
- */
- if ((c->prog_data.outputs_written & (1<<VERT_RESULT_PSIZ)) ||
-- c->key.nr_userclip ||
-- (!BRW_IS_G4X(p->brw) && !c->key.know_w_is_one))
-+ c->key.nr_userclip || !BRW_IS_G4X(p->brw))
- {
- struct brw_reg header1 = retype(get_tmp(c), BRW_REGISTER_TYPE_UD);
- GLuint i;
-@@ -916,7 +910,7 @@ static void emit_vertex_write( struct brw_vs_compile *c)
- * Later, clipping will detect ucp[6] and ensure the primitive is
- * clipped against all fixed planes.
- */
-- if (!BRW_IS_G4X(p->brw) && !c->key.know_w_is_one) {
-+ if (!BRW_IS_G4X(p->brw)) {
- brw_CMP(p,
- vec8(brw_null_reg()),
- BRW_CONDITIONAL_L,
-@@ -960,36 +954,27 @@ static void emit_vertex_write( struct brw_vs_compile *c)
- }
-
-
-+/**
-+ * Called after code generation to resolve subroutine calls and the
-+ * END instruction.
-+ * \param end_inst points to brw code for END instruction
-+ * \param last_inst points to last instruction emitted before vertex write
-+ */
- static void
--post_vs_emit( struct brw_vs_compile *c, struct brw_instruction *end_inst )
-+post_vs_emit( struct brw_vs_compile *c,
-+ struct brw_instruction *end_inst,
-+ struct brw_instruction *last_inst )
- {
-- GLuint nr_insns = c->vp->program.Base.NumInstructions;
-- GLuint insn, target_insn;
-- struct prog_instruction *inst1, *inst2;
-- struct brw_instruction *brw_inst1, *brw_inst2;
-- int offset;
-- for (insn = 0; insn < nr_insns; insn++) {
-- inst1 = &c->vp->program.Base.Instructions[insn];
-- brw_inst1 = inst1->Data;
-- switch (inst1->Opcode) {
-- case OPCODE_CAL:
-- case OPCODE_BRA:
-- target_insn = inst1->BranchTarget;
-- inst2 = &c->vp->program.Base.Instructions[target_insn];
-- brw_inst2 = inst2->Data;
-- offset = brw_inst2 - brw_inst1;
-- brw_set_src1(brw_inst1, brw_imm_d(offset*16));
-- break;
-- case OPCODE_END:
-- offset = end_inst - brw_inst1;
-- brw_set_src1(brw_inst1, brw_imm_d(offset*16));
-- break;
-- default:
-- break;
-- }
-- }
-+ GLint offset;
-+
-+ brw_resolve_cals(&c->func);
-+
-+ /* patch up the END code to jump past subroutines, etc */
-+ offset = last_inst - end_inst;
-+ brw_set_src1(end_inst, brw_imm_d(offset * 16));
- }
-
-+
- /* Emit the fragment program instructions here.
- */
- void brw_vs_emit(struct brw_vs_compile *c )
-@@ -998,7 +983,8 @@ void brw_vs_emit(struct brw_vs_compile *c )
- struct brw_compile *p = &c->func;
- GLuint nr_insns = c->vp->program.Base.NumInstructions;
- GLuint insn, if_insn = 0;
-- struct brw_instruction *end_inst;
-+ GLuint end_offset = 0;
-+ struct brw_instruction *end_inst, *last_inst;
- struct brw_instruction *if_inst[MAX_IFSN];
- struct brw_indirect stack_index = brw_indirect(0, 0);
-
-@@ -1041,7 +1027,6 @@ void brw_vs_emit(struct brw_vs_compile *c )
-
- /* Get argument regs. SWZ is special and does this itself.
- */
-- inst->Data = &p->store[p->nr_insn];
- if (inst->Opcode != OPCODE_SWZ)
- for (i = 0; i < 3; i++) {
- struct prog_src_register *src = &inst->SrcReg[i];
-@@ -1209,7 +1194,7 @@ void brw_vs_emit(struct brw_vs_compile *c )
- brw_set_access_mode(p, BRW_ALIGN_16);
- brw_ADD(p, get_addr_reg(stack_index),
- get_addr_reg(stack_index), brw_imm_d(4));
-- inst->Data = &p->store[p->nr_insn];
-+ brw_save_call(p, inst->Comment, p->nr_insn);
- brw_ADD(p, brw_ip_reg(), brw_ip_reg(), brw_imm_d(1*16));
- break;
- case OPCODE_RET:
-@@ -1218,14 +1203,23 @@ void brw_vs_emit(struct brw_vs_compile *c )
- brw_set_access_mode(p, BRW_ALIGN_1);
- brw_MOV(p, brw_ip_reg(), deref_1d(stack_index, 0));
- brw_set_access_mode(p, BRW_ALIGN_16);
-+ break;
- case OPCODE_END:
-+ end_offset = p->nr_insn;
-+ /* this instruction will get patched later to jump past subroutine
-+ * code, etc.
-+ */
- brw_ADD(p, brw_ip_reg(), brw_ip_reg(), brw_imm_d(1*16));
- break;
- case OPCODE_PRINT:
-+ /* no-op */
-+ break;
- case OPCODE_BGNSUB:
-+ brw_save_label(p, inst->Comment, p->nr_insn);
-+ break;
- case OPCODE_ENDSUB:
-- /* no-op instructions */
-- break;
-+ /* no-op */
-+ break;
- default:
- _mesa_problem(NULL, "Unsupported opcode %i (%s) in vertex shader",
- inst->Opcode, inst->Opcode < MAX_OPCODE ?
-@@ -1263,9 +1257,11 @@ void brw_vs_emit(struct brw_vs_compile *c )
- release_tmps(c);
- }
-
-- end_inst = &p->store[p->nr_insn];
-+ end_inst = &p->store[end_offset];
-+ last_inst = &p->store[p->nr_insn];
-+
-+ /* The END instruction will be patched to jump to this code */
- emit_vertex_write(c);
-- post_vs_emit(c, end_inst);
-- for (insn = 0; insn < nr_insns; insn++)
-- c->vp->program.Base.Instructions[insn].Data = NULL;
-+
-+ post_vs_emit(c, end_inst, last_inst);
- }
-diff --git a/src/mesa/drivers/dri/i965/brw_vs_state.c b/src/mesa/drivers/dri/i965/brw_vs_state.c
-index 9425816..1a63766 100644
---- a/src/mesa/drivers/dri/i965/brw_vs_state.c
-+++ b/src/mesa/drivers/dri/i965/brw_vs_state.c
-@@ -49,6 +49,8 @@ struct brw_vs_unit_key {
- static void
- vs_unit_populate_key(struct brw_context *brw, struct brw_vs_unit_key *key)
- {
-+ GLcontext *ctx = &brw->intel.ctx;
-+
- memset(key, 0, sizeof(*key));
-
- /* CACHE_NEW_VS_PROG */
-@@ -61,7 +63,7 @@ vs_unit_populate_key(struct brw_context *brw, struct brw_vs_unit_key *key)
- key->urb_size = brw->urb.vsize;
-
- /* BRW_NEW_CURBE_OFFSETS, _NEW_TRANSFORM */
-- if (brw->attribs.Transform->ClipPlanesEnabled) {
-+ if (ctx->Transform.ClipPlanesEnabled) {
- /* Note that we read in the userclip planes as well, hence
- * clip_start:
- */
-diff --git a/src/mesa/drivers/dri/i965/brw_vtbl.c b/src/mesa/drivers/dri/i965/brw_vtbl.c
-index f7293ef..fc9f6cc 100644
---- a/src/mesa/drivers/dri/i965/brw_vtbl.c
-+++ b/src/mesa/drivers/dri/i965/brw_vtbl.c
-@@ -23,14 +23,12 @@
- OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
- WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-- **********************************************************************/
-- /*
-- * Authors:
-- * Keith Whitwell <keith@tungstengraphics.com>
-- */
--
--
-+**********************************************************************/
-
-+/*
-+ * Authors:
-+ * Keith Whitwell <keith@tungstengraphics.com>
-+ */
-
- #include "main/glheader.h"
- #include "main/mtypes.h"
-@@ -44,12 +42,11 @@
- #include "brw_context.h"
- #include "brw_defines.h"
- #include "brw_state.h"
--
- #include "brw_draw.h"
- #include "brw_state.h"
- #include "brw_fallback.h"
- #include "brw_vs.h"
--#include <stdarg.h>
-+
-
- static void
- dri_bo_release(dri_bo **bo)
-@@ -58,22 +55,25 @@ dri_bo_release(dri_bo **bo)
- *bo = NULL;
- }
-
--/* called from intelDestroyContext()
-+
-+/**
-+ * called from intelDestroyContext()
- */
- static void brw_destroy_context( struct intel_context *intel )
- {
- struct brw_context *brw = brw_context(&intel->ctx);
- int i;
-
-- brw_destroy_metaops(brw);
- brw_destroy_state(brw);
- brw_draw_destroy( brw );
-
-+ _mesa_free(brw->wm.compile_data);
-+
- brw_FrameBufferTexDestroy( brw );
-
-- for (i = 0; i < brw->state.nr_draw_regions; i++)
-- intel_region_release(&brw->state.draw_regions[i]);
-- brw->state.nr_draw_regions = 0;
-+ for (i = 0; i < brw->state.nr_color_regions; i++)
-+ intel_region_release(&brw->state.color_regions[i]);
-+ brw->state.nr_color_regions = 0;
- intel_region_release(&brw->state.depth_region);
-
- dri_bo_release(&brw->curbe.curbe_bo);
-@@ -92,6 +92,7 @@ static void brw_destroy_context( struct intel_context *intel )
- dri_bo_release(&brw->wm.bind_bo);
- for (i = 0; i < BRW_WM_MAX_SURF; i++)
- dri_bo_release(&brw->wm.surf_bo[i]);
-+ dri_bo_release(&brw->wm.sampler_bo);
- dri_bo_release(&brw->wm.prog_bo);
- dri_bo_release(&brw->wm.state_bo);
- dri_bo_release(&brw->cc.prog_bo);
-@@ -99,37 +100,46 @@ static void brw_destroy_context( struct intel_context *intel )
- dri_bo_release(&brw->cc.vp_bo);
- }
-
--/* called from intelDrawBuffer()
-+
-+/**
-+ * called from intelDrawBuffer()
- */
- static void brw_set_draw_region( struct intel_context *intel,
-- struct intel_region *draw_regions[],
-- struct intel_region *depth_region,
-- GLuint num_regions)
-+ struct intel_region *color_regions[],
-+ struct intel_region *depth_region,
-+ GLuint num_color_regions)
- {
- struct brw_context *brw = brw_context(&intel->ctx);
-- int i;
-+ GLuint i;
-+
-+ /* release old color/depth regions */
- if (brw->state.depth_region != depth_region)
- brw->state.dirty.brw |= BRW_NEW_DEPTH_BUFFER;
-- for (i = 0; i < brw->state.nr_draw_regions; i++)
-- intel_region_release(&brw->state.draw_regions[i]);
-+ for (i = 0; i < brw->state.nr_color_regions; i++)
-+ intel_region_release(&brw->state.color_regions[i]);
- intel_region_release(&brw->state.depth_region);
-- for (i = 0; i < num_regions; i++)
-- intel_region_reference(&brw->state.draw_regions[i], draw_regions[i]);
-+
-+ /* reference new color/depth regions */
-+ for (i = 0; i < num_color_regions; i++)
-+ intel_region_reference(&brw->state.color_regions[i], color_regions[i]);
- intel_region_reference(&brw->state.depth_region, depth_region);
-- brw->state.nr_draw_regions = num_regions;
-+ brw->state.nr_color_regions = num_color_regions;
- }
-
--/* called from intel_batchbuffer_flush and children before sending a
-+
-+/**
-+ * called from intel_batchbuffer_flush and children before sending a
- * batchbuffer off.
- */
- static void brw_finish_batch(struct intel_context *intel)
- {
- struct brw_context *brw = brw_context(&intel->ctx);
--
- brw_emit_query_end(brw);
- }
-
--/* called from intelFlushBatchLocked
-+
-+/**
-+ * called from intelFlushBatchLocked
- */
- static void brw_new_batch( struct intel_context *intel )
- {
-@@ -160,22 +170,21 @@ static void brw_new_batch( struct intel_context *intel )
- }
- }
-
--static void brw_note_fence( struct intel_context *intel,
-- GLuint fence )
-+
-+static void brw_note_fence( struct intel_context *intel, GLuint fence )
- {
- brw_context(&intel->ctx)->state.dirty.brw |= BRW_NEW_FENCE;
- }
--
-+
-+
- static void brw_note_unlock( struct intel_context *intel )
- {
- struct brw_context *brw = brw_context(&intel->ctx);
--
- brw_state_cache_check_size(brw);
- }
-
-
--void brw_do_flush( struct brw_context *brw,
-- GLuint flags )
-+void brw_do_flush( struct brw_context *brw, GLuint flags )
- {
- struct brw_mi_flush flush;
- memset(&flush, 0, sizeof(flush));
-@@ -185,8 +194,7 @@ void brw_do_flush( struct brw_context *brw,
- }
-
-
--static void brw_emit_flush( struct intel_context *intel,
-- GLuint unused )
-+static void brw_emit_flush( struct intel_context *intel, GLuint unused )
- {
- brw_do_flush(brw_context(&intel->ctx),
- BRW_FLUSH_STATE_CACHE|BRW_FLUSH_READ_CACHE);
-@@ -206,6 +214,7 @@ static GLuint brw_flush_cmd( void )
- return *(GLuint *)&flush;
- }
-
-+
- static void brw_invalidate_state( struct intel_context *intel, GLuint new_state )
- {
- /* nothing */
-@@ -215,14 +224,14 @@ static void brw_invalidate_state( struct intel_context *intel, GLuint new_state
- void brwInitVtbl( struct brw_context *brw )
- {
- brw->intel.vtbl.check_vertex_size = 0;
-- brw->intel.vtbl.emit_state = 0;
-- brw->intel.vtbl.reduced_primitive_state = 0;
-+ brw->intel.vtbl.emit_state = 0;
-+ brw->intel.vtbl.reduced_primitive_state = 0;
- brw->intel.vtbl.render_start = 0;
-- brw->intel.vtbl.update_texture_state = 0;
-+ brw->intel.vtbl.update_texture_state = 0;
-
-- brw->intel.vtbl.invalidate_state = brw_invalidate_state;
-- brw->intel.vtbl.note_fence = brw_note_fence;
-- brw->intel.vtbl.note_unlock = brw_note_unlock;
-+ brw->intel.vtbl.invalidate_state = brw_invalidate_state;
-+ brw->intel.vtbl.note_fence = brw_note_fence;
-+ brw->intel.vtbl.note_unlock = brw_note_unlock;
- brw->intel.vtbl.new_batch = brw_new_batch;
- brw->intel.vtbl.finish_batch = brw_finish_batch;
- brw->intel.vtbl.destroy = brw_destroy_context;
-@@ -231,4 +240,3 @@ void brwInitVtbl( struct brw_context *brw )
- brw->intel.vtbl.emit_flush = brw_emit_flush;
- brw->intel.vtbl.debug_batch = brw_debug_batch;
- }
--
-diff --git a/src/mesa/drivers/dri/i965/brw_wm.c b/src/mesa/drivers/dri/i965/brw_wm.c
-index c50b0d2..10f38e0 100644
---- a/src/mesa/drivers/dri/i965/brw_wm.c
-+++ b/src/mesa/drivers/dri/i965/brw_wm.c
-@@ -80,6 +80,53 @@ GLuint brw_wm_is_scalar_result( GLuint opcode )
- }
-
-
-+/**
-+ * Do GPU code generation for non-GLSL shader. non-GLSL shaders have
-+ * no flow control instructions so we can more readily do SSA-style
-+ * optimizations.
-+ */
-+static void
-+brw_wm_non_glsl_emit(struct brw_context *brw, struct brw_wm_compile *c)
-+{
-+ /* Augment fragment program. Add instructions for pre- and
-+ * post-fragment-program tasks such as interpolation and fogging.
-+ */
-+ brw_wm_pass_fp(c);
-+
-+ /* Translate to intermediate representation. Build register usage
-+ * chains.
-+ */
-+ brw_wm_pass0(c);
-+
-+ /* Dead code removal.
-+ */
-+ brw_wm_pass1(c);
-+
-+ /* Register allocation.
-+ */
-+ c->grf_limit = BRW_WM_MAX_GRF / 2;
-+
-+ brw_wm_pass2(c);
-+
-+ c->prog_data.total_grf = c->max_wm_grf;
-+ if (c->last_scratch) {
-+ c->prog_data.total_scratch = c->last_scratch + 0x40;
-+ }
-+ else {
-+ c->prog_data.total_scratch = 0;
-+ }
-+
-+ /* Emit GEN4 code.
-+ */
-+ brw_wm_emit(c);
-+}
-+
-+
-+/**
-+ * All Mesa program -> GPU code generation goes through this function.
-+ * Depending on the instructions used (i.e. flow control instructions)
-+ * we'll use one of two code generators.
-+ */
- static void do_wm_prog( struct brw_context *brw,
- struct brw_fragment_program *fp,
- struct brw_wm_prog_key *key)
-@@ -90,52 +137,29 @@ static void do_wm_prog( struct brw_context *brw,
-
- c = brw->wm.compile_data;
- if (c == NULL) {
-- brw->wm.compile_data = calloc(1, sizeof(*brw->wm.compile_data));
-- c = brw->wm.compile_data;
-+ brw->wm.compile_data = calloc(1, sizeof(*brw->wm.compile_data));
-+ c = brw->wm.compile_data;
- } else {
-- memset(c, 0, sizeof(*brw->wm.compile_data));
-+ memset(c, 0, sizeof(*brw->wm.compile_data));
- }
- memcpy(&c->key, key, sizeof(*key));
-
- c->fp = fp;
- c->env_param = brw->intel.ctx.FragmentProgram.Parameters;
-
-- brw_init_compile(brw, &c->func);
-+ brw_init_compile(brw, &c->func);
-+
-+ /*
-+ * Shader which use GLSL features such as flow control are handled
-+ * differently from "simple" shaders.
-+ */
- if (brw_wm_is_glsl(&c->fp->program)) {
-- brw_wm_glsl_emit(brw, c);
-- } else {
-- /* Augment fragment program. Add instructions for pre- and
-- * post-fragment-program tasks such as interpolation and fogging.
-- */
-- brw_wm_pass_fp(c);
--
-- /* Translate to intermediate representation. Build register usage
-- * chains.
-- */
-- brw_wm_pass0(c);
--
-- /* Dead code removal.
-- */
-- brw_wm_pass1(c);
--
-- /* Register allocation.
-- */
-- c->grf_limit = BRW_WM_MAX_GRF/2;
--
-- brw_wm_pass2(c);
--
-- c->prog_data.total_grf = c->max_wm_grf;
-- if (c->last_scratch) {
-- c->prog_data.total_scratch =
-- c->last_scratch + 0x40;
-- } else {
-- c->prog_data.total_scratch = 0;
-- }
--
-- /* Emit GEN4 code.
-- */
-- brw_wm_emit(c);
-+ brw_wm_glsl_emit(brw, c);
- }
-+ else {
-+ brw_wm_non_glsl_emit(brw, c);
-+ }
-+
- if (INTEL_DEBUG & DEBUG_WM)
- fprintf(stderr, "\n");
-
-@@ -157,8 +181,9 @@ static void do_wm_prog( struct brw_context *brw,
- static void brw_wm_populate_key( struct brw_context *brw,
- struct brw_wm_prog_key *key )
- {
-+ GLcontext *ctx = &brw->intel.ctx;
- /* BRW_NEW_FRAGMENT_PROGRAM */
-- struct brw_fragment_program *fp =
-+ const struct brw_fragment_program *fp =
- (struct brw_fragment_program *)brw->fragment_program;
- GLuint lookup = 0;
- GLuint line_aa;
-@@ -170,51 +195,50 @@ static void brw_wm_populate_key( struct brw_context *brw,
- */
- /* _NEW_COLOR */
- if (fp->program.UsesKill ||
-- brw->attribs.Color->AlphaEnabled)
-+ ctx->Color.AlphaEnabled)
- lookup |= IZ_PS_KILL_ALPHATEST_BIT;
-
- if (fp->program.Base.OutputsWritten & (1<<FRAG_RESULT_DEPR))
- lookup |= IZ_PS_COMPUTES_DEPTH_BIT;
-
- /* _NEW_DEPTH */
-- if (brw->attribs.Depth->Test)
-+ if (ctx->Depth.Test)
- lookup |= IZ_DEPTH_TEST_ENABLE_BIT;
-
-- if (brw->attribs.Depth->Test &&
-- brw->attribs.Depth->Mask) /* ?? */
-+ if (ctx->Depth.Test &&
-+ ctx->Depth.Mask) /* ?? */
- lookup |= IZ_DEPTH_WRITE_ENABLE_BIT;
-
- /* _NEW_STENCIL */
-- if (brw->attribs.Stencil->Enabled) {
-+ if (ctx->Stencil.Enabled) {
- lookup |= IZ_STENCIL_TEST_ENABLE_BIT;
-
-- if (brw->attribs.Stencil->WriteMask[0] ||
-- (brw->attribs.Stencil->_TestTwoSide &&
-- brw->attribs.Stencil->WriteMask[1]))
-+ if (ctx->Stencil.WriteMask[0] ||
-+ ctx->Stencil.WriteMask[ctx->Stencil._BackFace])
- lookup |= IZ_STENCIL_WRITE_ENABLE_BIT;
- }
-
- line_aa = AA_NEVER;
-
- /* _NEW_LINE, _NEW_POLYGON, BRW_NEW_REDUCED_PRIMITIVE */
-- if (brw->attribs.Line->SmoothFlag) {
-+ if (ctx->Line.SmoothFlag) {
- if (brw->intel.reduced_primitive == GL_LINES) {
- line_aa = AA_ALWAYS;
- }
- else if (brw->intel.reduced_primitive == GL_TRIANGLES) {
-- if (brw->attribs.Polygon->FrontMode == GL_LINE) {
-+ if (ctx->Polygon.FrontMode == GL_LINE) {
- line_aa = AA_SOMETIMES;
-
-- if (brw->attribs.Polygon->BackMode == GL_LINE ||
-- (brw->attribs.Polygon->CullFlag &&
-- brw->attribs.Polygon->CullFaceMode == GL_BACK))
-+ if (ctx->Polygon.BackMode == GL_LINE ||
-+ (ctx->Polygon.CullFlag &&
-+ ctx->Polygon.CullFaceMode == GL_BACK))
- line_aa = AA_ALWAYS;
- }
-- else if (brw->attribs.Polygon->BackMode == GL_LINE) {
-+ else if (ctx->Polygon.BackMode == GL_LINE) {
- line_aa = AA_SOMETIMES;
-
-- if ((brw->attribs.Polygon->CullFlag &&
-- brw->attribs.Polygon->CullFaceMode == GL_FRONT))
-+ if ((ctx->Polygon.CullFlag &&
-+ ctx->Polygon.CullFaceMode == GL_FRONT))
- line_aa = AA_ALWAYS;
- }
- }
-@@ -229,20 +253,25 @@ static void brw_wm_populate_key( struct brw_context *brw,
- key->projtex_mask = brw->wm.input_size_masks[4-1] >> (FRAG_ATTRIB_TEX0 - FRAG_ATTRIB_WPOS);
-
- /* _NEW_LIGHT */
-- key->flat_shade = (brw->attribs.Light->ShadeModel == GL_FLAT);
-+ key->flat_shade = (ctx->Light.ShadeModel == GL_FLAT);
-
- /* _NEW_TEXTURE */
- for (i = 0; i < BRW_MAX_TEX_UNIT; i++) {
-- const struct gl_texture_unit *unit = &brw->attribs.Texture->Unit[i];
-- const struct gl_texture_object *t = unit->_Current;
-+ const struct gl_texture_unit *unit = &ctx->Texture.Unit[i];
-
- if (unit->_ReallyEnabled) {
-- if (t->Image[0][t->BaseLevel]->InternalFormat == GL_YCBCR_MESA) {
-- key->yuvtex_mask |= 1<<i;
-- if (t->Image[0][t->BaseLevel]->TexFormat->MesaFormat ==
-- MESA_FORMAT_YCBCR)
-- key->yuvtex_swap_mask |= 1<< i;
-+ const struct gl_texture_object *t = unit->_Current;
-+ const struct gl_texture_image *img = t->Image[0][t->BaseLevel];
-+ if (img->InternalFormat == GL_YCBCR_MESA) {
-+ key->yuvtex_mask |= 1 << i;
-+ if (img->TexFormat->MesaFormat == MESA_FORMAT_YCBCR)
-+ key->yuvtex_swap_mask |= 1 << i;
- }
-+
-+ key->tex_swizzles[i] = t->_Swizzle;
-+ }
-+ else {
-+ key->tex_swizzles[i] = SWIZZLE_NOOP;
- }
- }
-
-@@ -273,10 +302,8 @@ static void brw_wm_populate_key( struct brw_context *brw,
- key->drawable_height = brw->intel.driDrawable->h;
- }
-
-- /* Extra info:
-- */
-+ /* The unique fragment program ID */
- key->program_string_id = fp->id;
--
- }
-
-
-@@ -300,8 +327,6 @@ static void brw_prepare_wm_prog(struct brw_context *brw)
- }
-
-
--/* See brw_wm.c:
-- */
- const struct brw_tracked_state brw_wm_prog = {
- .dirty = {
- .mesa = (_NEW_COLOR |
-diff --git a/src/mesa/drivers/dri/i965/brw_wm.h b/src/mesa/drivers/dri/i965/brw_wm.h
-index ded0796..6b94591 100644
---- a/src/mesa/drivers/dri/i965/brw_wm.h
-+++ b/src/mesa/drivers/dri/i965/brw_wm.h
-@@ -60,16 +60,17 @@ struct brw_wm_prog_key {
- GLuint aa_dest_stencil_reg:3;
- GLuint dest_depth_reg:3;
- GLuint nr_depth_regs:3;
-- GLuint projtex_mask:8;
-- GLuint shadowtex_mask:8;
- GLuint computes_depth:1; /* could be derived from program string */
- GLuint source_depth_to_render_target:1;
- GLuint flat_shade:1;
- GLuint runtime_check_aads_emit:1;
-
-- GLuint yuvtex_mask:8;
-- GLuint yuvtex_swap_mask:8; /* UV swaped */
-- GLuint pad1:16;
-+ GLuint projtex_mask:16;
-+ GLuint shadowtex_mask:16;
-+ GLuint yuvtex_mask:16;
-+ GLuint yuvtex_swap_mask:16; /* UV swaped */
-+
-+ GLuint tex_swizzles[BRW_MAX_TEX_UNIT];
-
- GLuint program_string_id:32;
- GLuint origin_x, origin_y;
-@@ -142,6 +143,7 @@ struct brw_wm_instruction {
- GLuint writemask:4;
- GLuint tex_unit:4; /* texture unit for TEX, TXD, TXP instructions */
- GLuint tex_idx:3; /* TEXTURE_1D,2D,3D,CUBE,RECT_INDEX source target */
-+ GLuint tex_shadow:1; /* do shadow comparison? */
- GLuint eot:1; /* End of thread indicator for FB_WRITE*/
- GLuint target:10; /* target binding table index for FB_WRITE*/
- };
-@@ -280,4 +282,6 @@ void brw_wm_lookup_iz( GLuint line_aa,
-
- GLboolean brw_wm_is_glsl(const struct gl_fragment_program *fp);
- void brw_wm_glsl_emit(struct brw_context *brw, struct brw_wm_compile *c);
-+
-+
- #endif
-diff --git a/src/mesa/drivers/dri/i965/brw_wm_emit.c b/src/mesa/drivers/dri/i965/brw_wm_emit.c
-index b5050a3..281ffe0 100644
---- a/src/mesa/drivers/dri/i965/brw_wm_emit.c
-+++ b/src/mesa/drivers/dri/i965/brw_wm_emit.c
-@@ -671,7 +671,6 @@ static void emit_tex( struct brw_wm_compile *c,
- {
- struct brw_compile *p = &c->func;
- GLuint msgLength, responseLength;
-- GLboolean shadow = (c->key.shadowtex_mask & (1<<inst->tex_unit)) ? 1 : 0;
- GLuint i, nr;
- GLuint emit;
-
-@@ -693,7 +692,7 @@ static void emit_tex( struct brw_wm_compile *c,
- break;
- }
-
-- if (shadow) {
-+ if (inst->tex_shadow) {
- nr = 4;
- emit |= WRITEMASK_W;
- }
-@@ -718,7 +717,7 @@ static void emit_tex( struct brw_wm_compile *c,
- inst->tex_unit + MAX_DRAW_BUFFERS, /* surface */
- inst->tex_unit, /* sampler */
- inst->writemask,
-- (shadow ?
-+ (inst->tex_shadow ?
- BRW_SAMPLER_MESSAGE_SIMD16_SAMPLE_COMPARE :
- BRW_SAMPLER_MESSAGE_SIMD16_SAMPLE),
- responseLength,
-diff --git a/src/mesa/drivers/dri/i965/brw_wm_fp.c b/src/mesa/drivers/dri/i965/brw_wm_fp.c
-index 6df2c95..977b9dd 100644
---- a/src/mesa/drivers/dri/i965/brw_wm_fp.c
-+++ b/src/mesa/drivers/dri/i965/brw_wm_fp.c
-@@ -111,6 +111,12 @@ static struct prog_src_register src_swizzle1( struct prog_src_register reg, int
- return src_swizzle(reg, x, x, x, x);
- }
-
-+static struct prog_src_register src_swizzle4( struct prog_src_register reg, uint swizzle )
-+{
-+ reg.Swizzle = swizzle;
-+ return reg;
-+}
-+
-
- /***********************************************************************
- * Dest regs
-@@ -177,16 +183,16 @@ static struct prog_instruction *emit_insn(struct brw_wm_compile *c,
- {
- struct prog_instruction *inst = get_fp_inst(c);
- *inst = *inst0;
-- inst->Data = (void *)inst0;
- return inst;
- }
-
--static struct prog_instruction * emit_op(struct brw_wm_compile *c,
-+static struct prog_instruction * emit_tex_op(struct brw_wm_compile *c,
- GLuint op,
- struct prog_dst_register dest,
- GLuint saturate,
- GLuint tex_src_unit,
- GLuint tex_src_target,
-+ GLuint tex_shadow,
- struct prog_src_register src0,
- struct prog_src_register src1,
- struct prog_src_register src2 )
-@@ -200,6 +206,7 @@ static struct prog_instruction * emit_op(struct brw_wm_compile *c,
- inst->SaturateMode = saturate;
- inst->TexSrcUnit = tex_src_unit;
- inst->TexSrcTarget = tex_src_target;
-+ inst->TexShadow = tex_shadow;
- inst->SrcReg[0] = src0;
- inst->SrcReg[1] = src1;
- inst->SrcReg[2] = src2;
-@@ -207,6 +214,20 @@ static struct prog_instruction * emit_op(struct brw_wm_compile *c,
- }
-
-
-+static struct prog_instruction * emit_op(struct brw_wm_compile *c,
-+ GLuint op,
-+ struct prog_dst_register dest,
-+ GLuint saturate,
-+ struct prog_src_register src0,
-+ struct prog_src_register src1,
-+ struct prog_src_register src2 )
-+{
-+ return emit_tex_op(c, op, dest, saturate,
-+ 0, 0, 0, /* tex unit, target, shadow */
-+ src0, src1, src2);
-+}
-+
-+
-
-
- /***********************************************************************
-@@ -228,7 +249,7 @@ static struct prog_src_register get_pixel_xy( struct brw_wm_compile *c )
- emit_op(c,
- WM_PIXELXY,
- dst_mask(pixel_xy, WRITEMASK_XY),
-- 0, 0, 0,
-+ 0,
- payload_r0_depth,
- src_undef(),
- src_undef());
-@@ -251,7 +272,7 @@ static struct prog_src_register get_delta_xy( struct brw_wm_compile *c )
- emit_op(c,
- WM_DELTAXY,
- dst_mask(delta_xy, WRITEMASK_XY),
-- 0, 0, 0,
-+ 0,
- pixel_xy,
- payload_r0_depth,
- src_undef());
-@@ -268,14 +289,13 @@ static struct prog_src_register get_pixel_w( struct brw_wm_compile *c )
- struct prog_dst_register pixel_w = get_temp(c);
- struct prog_src_register deltas = get_delta_xy(c);
- struct prog_src_register interp_wpos = src_reg(PROGRAM_PAYLOAD, FRAG_ATTRIB_WPOS);
--
--
-+
- /* deltas.xyw = DELTAS2 deltas.xy, payload.interp_wpos.x
- */
- emit_op(c,
- WM_PIXELW,
- dst_mask(pixel_w, WRITEMASK_W),
-- 0, 0, 0,
-+ 0,
- interp_wpos,
- deltas,
- src_undef());
-@@ -310,7 +330,7 @@ static void emit_interp( struct brw_wm_compile *c,
- emit_op(c,
- WM_WPOSXY,
- dst_mask(dst, WRITEMASK_XY),
-- 0, 0, 0,
-+ 0,
- get_pixel_xy(c),
- src_undef(),
- src_undef());
-@@ -322,7 +342,7 @@ static void emit_interp( struct brw_wm_compile *c,
- emit_op(c,
- WM_LINTERP,
- dst,
-- 0, 0, 0,
-+ 0,
- interp,
- deltas,
- arg2);
-@@ -333,7 +353,7 @@ static void emit_interp( struct brw_wm_compile *c,
- emit_op(c,
- WM_CINTERP,
- dst,
-- 0, 0, 0,
-+ 0,
- interp,
- src_undef(),
- src_undef());
-@@ -342,7 +362,7 @@ static void emit_interp( struct brw_wm_compile *c,
- emit_op(c,
- WM_LINTERP,
- dst,
-- 0, 0, 0,
-+ 0,
- interp,
- deltas,
- src_undef());
-@@ -352,7 +372,7 @@ static void emit_interp( struct brw_wm_compile *c,
- emit_op(c,
- WM_PINTERP,
- dst,
-- 0, 0, 0,
-+ 0,
- interp,
- deltas,
- get_pixel_w(c));
-@@ -372,7 +392,7 @@ static void emit_ddx( struct brw_wm_compile *c,
- emit_op(c,
- OPCODE_DDX,
- inst->DstReg,
-- 0, 0, 0,
-+ 0,
- interp,
- get_pixel_w(c),
- src_undef());
-@@ -388,7 +408,7 @@ static void emit_ddy( struct brw_wm_compile *c,
- emit_op(c,
- OPCODE_DDY,
- inst->DstReg,
-- 0, 0, 0,
-+ 0,
- interp,
- get_pixel_w(c),
- src_undef());
-@@ -483,13 +503,12 @@ static void precalc_dst( struct brw_wm_compile *c,
- emit_op(c,
- OPCODE_MUL,
- dst_mask(dst, WRITEMASK_Y),
-- inst->SaturateMode, 0, 0,
-+ inst->SaturateMode,
- src0,
- src1,
- src_undef());
- }
-
--
- if (dst.WriteMask & WRITEMASK_XZ) {
- struct prog_instruction *swz;
- GLuint z = GET_SWZ(src0.Swizzle, Z);
-@@ -499,7 +518,7 @@ static void precalc_dst( struct brw_wm_compile *c,
- swz = emit_op(c,
- OPCODE_SWZ,
- dst_mask(dst, WRITEMASK_XZ),
-- inst->SaturateMode, 0, 0,
-+ inst->SaturateMode,
- src_swizzle(src0, SWIZZLE_ONE, z, z, z),
- src_undef(),
- src_undef());
-@@ -512,7 +531,7 @@ static void precalc_dst( struct brw_wm_compile *c,
- emit_op(c,
- OPCODE_MOV,
- dst_mask(dst, WRITEMASK_W),
-- inst->SaturateMode, 0, 0,
-+ inst->SaturateMode,
- src1,
- src_undef(),
- src_undef());
-@@ -534,7 +553,7 @@ static void precalc_lit( struct brw_wm_compile *c,
- swz = emit_op(c,
- OPCODE_SWZ,
- dst_mask(dst, WRITEMASK_XW),
-- 0, 0, 0,
-+ 0,
- src_swizzle1(src0, SWIZZLE_ONE),
- src_undef(),
- src_undef());
-@@ -542,24 +561,30 @@ static void precalc_lit( struct brw_wm_compile *c,
- swz->SrcReg[0].NegateBase = 0;
- }
-
--
- if (dst.WriteMask & WRITEMASK_YZ) {
- emit_op(c,
- OPCODE_LIT,
- dst_mask(dst, WRITEMASK_YZ),
-- inst->SaturateMode, 0, 0,
-+ inst->SaturateMode,
- src0,
- src_undef(),
- src_undef());
- }
- }
-
-+
-+/**
-+ * Some TEX instructions require extra code, cube map coordinate
-+ * normalization, or coordinate scaling for RECT textures, etc.
-+ * This function emits those extra instructions and the TEX
-+ * instruction itself.
-+ */
- static void precalc_tex( struct brw_wm_compile *c,
- const struct prog_instruction *inst )
- {
- struct prog_src_register coord;
- struct prog_dst_register tmpcoord;
-- GLuint unit = c->fp->program.Base.SamplerUnits[inst->TexSrcUnit];
-+ const GLuint unit = c->fp->program.Base.SamplerUnits[inst->TexSrcUnit];
-
- if (inst->TexSrcTarget == TEXTURE_CUBE_INDEX) {
- struct prog_instruction *out;
-@@ -569,49 +594,56 @@ static void precalc_tex( struct brw_wm_compile *c,
- struct prog_src_register tmp1src = src_reg_from_dst(tmp1);
- struct prog_src_register src0 = inst->SrcReg[0];
-
-+ /* find longest component of coord vector and normalize it */
- tmpcoord = get_temp(c);
- coord = src_reg_from_dst(tmpcoord);
-
-+ /* tmpcoord = src0 (i.e.: coord = src0) */
- out = emit_op(c, OPCODE_MOV,
- tmpcoord,
-- 0, 0, 0,
-+ 0,
- src0,
- src_undef(),
- src_undef());
- out->SrcReg[0].NegateBase = 0;
- out->SrcReg[0].Abs = 1;
-
-+ /* tmp0 = MAX(coord.X, coord.Y) */
- emit_op(c, OPCODE_MAX,
- tmp0,
-- 0, 0, 0,
-+ 0,
- src_swizzle1(coord, X),
- src_swizzle1(coord, Y),
- src_undef());
-
-+ /* tmp1 = MAX(tmp0, coord.Z) */
- emit_op(c, OPCODE_MAX,
- tmp1,
-- 0, 0, 0,
-+ 0,
- tmp0src,
- src_swizzle1(coord, Z),
- src_undef());
-
-+ /* tmp0 = 1 / tmp1 */
- emit_op(c, OPCODE_RCP,
- tmp0,
-- 0, 0, 0,
-+ 0,
- tmp1src,
- src_undef(),
- src_undef());
-
-+ /* tmpCoord = src0 * tmp0 */
- emit_op(c, OPCODE_MUL,
- tmpcoord,
-- 0, 0, 0,
-+ 0,
- src0,
- tmp0src,
- src_undef());
-
- release_temp(c, tmp0);
- release_temp(c, tmp1);
-- } else if (inst->TexSrcTarget == TEXTURE_RECT_INDEX) {
-+ }
-+ else if (inst->TexSrcTarget == TEXTURE_RECT_INDEX) {
- struct prog_src_register scale =
- search_or_add_param5( c,
- STATE_INTERNAL,
-@@ -626,7 +658,7 @@ static void precalc_tex( struct brw_wm_compile *c,
- emit_op(c,
- OPCODE_MUL,
- tmpcoord,
-- 0, 0, 0,
-+ 0,
- inst->SrcReg[0],
- scale,
- src_undef());
-@@ -642,19 +674,9 @@ static void precalc_tex( struct brw_wm_compile *c,
- * conversion requires allocating a temporary variable which we
- * don't have the facility to do that late in the compilation.
- */
-- if (!(c->key.yuvtex_mask & (1<<unit))) {
-- emit_op(c,
-- OPCODE_TEX,
-- inst->DstReg,
-- inst->SaturateMode,
-- unit,
-- inst->TexSrcTarget,
-- coord,
-- src_undef(),
-- src_undef());
-- }
-- else {
-- GLboolean swap_uv = c->key.yuvtex_swap_mask & (1<<unit);
-+ if (c->key.yuvtex_mask & (1 << unit)) {
-+ /* convert ycbcr to RGBA */
-+ GLboolean swap_uv = c->key.yuvtex_swap_mask & (1<<unit);
-
- /*
- CONST C0 = { -.5, -.0625, -.5, 1.164 }
-@@ -676,22 +698,23 @@ static void precalc_tex( struct brw_wm_compile *c,
-
- /* tmp = TEX ...
- */
-- emit_op(c,
-- OPCODE_TEX,
-- tmp,
-- inst->SaturateMode,
-- unit,
-- inst->TexSrcTarget,
-- coord,
-- src_undef(),
-- src_undef());
-+ emit_tex_op(c,
-+ OPCODE_TEX,
-+ tmp,
-+ inst->SaturateMode,
-+ unit,
-+ inst->TexSrcTarget,
-+ inst->TexShadow,
-+ coord,
-+ src_undef(),
-+ src_undef());
-
- /* tmp.xyz = ADD TMP, C0
- */
- emit_op(c,
- OPCODE_ADD,
- dst_mask(tmp, WRITEMASK_XYZ),
-- 0, 0, 0,
-+ 0,
- tmpsrc,
- C0,
- src_undef());
-@@ -702,7 +725,7 @@ static void precalc_tex( struct brw_wm_compile *c,
- emit_op(c,
- OPCODE_MUL,
- dst_mask(tmp, WRITEMASK_Y),
-- 0, 0, 0,
-+ 0,
- tmpsrc,
- src_swizzle1(C0, W),
- src_undef());
-@@ -717,7 +740,7 @@ static void precalc_tex( struct brw_wm_compile *c,
- emit_op(c,
- OPCODE_MAD,
- dst_mask(dst, WRITEMASK_XYZ),
-- 0, 0, 0,
-+ 0,
- swap_uv?src_swizzle(tmpsrc, Z,Z,X,X):src_swizzle(tmpsrc, X,X,Z,Z),
- C1,
- src_swizzle1(tmpsrc, Y));
-@@ -727,13 +750,38 @@ static void precalc_tex( struct brw_wm_compile *c,
- emit_op(c,
- OPCODE_MAD,
- dst_mask(dst, WRITEMASK_Y),
-- 0, 0, 0,
-+ 0,
- src_swizzle1(tmpsrc, Z),
- src_swizzle1(C1, W),
- src_swizzle1(src_reg_from_dst(dst), Y));
-
- release_temp(c, tmp);
- }
-+ else {
-+ /* ordinary RGBA tex instruction */
-+ emit_tex_op(c,
-+ OPCODE_TEX,
-+ inst->DstReg,
-+ inst->SaturateMode,
-+ unit,
-+ inst->TexSrcTarget,
-+ inst->TexShadow,
-+ coord,
-+ src_undef(),
-+ src_undef());
-+ }
-+
-+ /* For GL_EXT_texture_swizzle: */
-+ if (c->key.tex_swizzles[unit] != SWIZZLE_NOOP) {
-+ /* swizzle the result of the TEX instruction */
-+ struct prog_src_register tmpsrc = src_reg_from_dst(inst->DstReg);
-+ emit_op(c, OPCODE_SWZ,
-+ inst->DstReg,
-+ SATURATE_OFF, /* saturate already done above */
-+ src_swizzle4(tmpsrc, c->key.tex_swizzles[unit]),
-+ src_undef(),
-+ src_undef());
-+ }
-
- if ((inst->TexSrcTarget == TEXTURE_RECT_INDEX) ||
- (inst->TexSrcTarget == TEXTURE_CUBE_INDEX))
-@@ -778,7 +826,7 @@ static void precalc_txp( struct brw_wm_compile *c,
- emit_op(c,
- OPCODE_RCP,
- dst_mask(tmp, WRITEMASK_W),
-- 0, 0, 0,
-+ 0,
- src_swizzle1(src0, GET_SWZ(src0.Swizzle, W)),
- src_undef(),
- src_undef());
-@@ -788,7 +836,7 @@ static void precalc_txp( struct brw_wm_compile *c,
- emit_op(c,
- OPCODE_MUL,
- dst_mask(tmp, WRITEMASK_XYZ),
-- 0, 0, 0,
-+ 0,
- src0,
- src_swizzle1(src_reg_from_dst(tmp), W),
- src_undef());
-@@ -821,24 +869,23 @@ static void emit_fb_write( struct brw_wm_compile *c )
- struct prog_instruction *inst, *last_inst;
- struct brw_context *brw = c->func.brw;
-
-- /* inst->Sampler is not used by backend,
-- use it for fb write target and eot */
--
-- if (brw->state.nr_draw_regions > 1) {
-- for (i = 0 ; i < brw->state.nr_draw_regions; i++) {
-- outcolor = src_reg(PROGRAM_OUTPUT, FRAG_RESULT_DATA0 + i);
-- last_inst = inst = emit_op(c,
-- WM_FB_WRITE, dst_mask(dst_undef(),0), 0, 0, 0,
-- outcolor, payload_r0_depth, outdepth);
-- inst->Sampler = (i<<1);
-- if (c->fp_fragcolor_emitted) {
-- outcolor = src_reg(PROGRAM_OUTPUT, FRAG_RESULT_COLR);
-- last_inst = inst = emit_op(c, WM_FB_WRITE, dst_mask(dst_undef(),0),
-- 0, 0, 0, outcolor, payload_r0_depth, outdepth);
-- inst->Sampler = (i<<1);
-- }
-- }
-- last_inst->Sampler |= 1; //eot
-+ /* The inst->Aux field is used for FB write target and the EOT marker */
-+
-+ if (brw->state.nr_color_regions > 1) {
-+ for (i = 0 ; i < brw->state.nr_color_regions; i++) {
-+ outcolor = src_reg(PROGRAM_OUTPUT, FRAG_RESULT_DATA0 + i);
-+ last_inst = inst = emit_op(c,
-+ WM_FB_WRITE, dst_mask(dst_undef(),0), 0,
-+ outcolor, payload_r0_depth, outdepth);
-+ inst->Aux = (i<<1);
-+ if (c->fp_fragcolor_emitted) {
-+ outcolor = src_reg(PROGRAM_OUTPUT, FRAG_RESULT_COLR);
-+ last_inst = inst = emit_op(c, WM_FB_WRITE, dst_mask(dst_undef(),0),
-+ 0, outcolor, payload_r0_depth, outdepth);
-+ inst->Aux = (i<<1);
-+ }
-+ }
-+ last_inst->Aux |= 1; //eot
- }
- else {
- /* if gl_FragData[0] is written, use it, else use gl_FragColor */
-@@ -847,9 +894,9 @@ static void emit_fb_write( struct brw_wm_compile *c )
- else
- outcolor = src_reg(PROGRAM_OUTPUT, FRAG_RESULT_COLR);
-
-- inst = emit_op(c, WM_FB_WRITE, dst_mask(dst_undef(),0),
-- 0, 0, 0, outcolor, payload_r0_depth, outdepth);
-- inst->Sampler = 1|(0<<1);
-+ inst = emit_op(c, WM_FB_WRITE, dst_mask(dst_undef(),0),
-+ 0, outcolor, payload_r0_depth, outdepth);
-+ inst->Aux = 1|(0<<1);
- }
- }
-
-@@ -880,9 +927,9 @@ static void validate_dst_regs( struct brw_wm_compile *c,
- const struct prog_instruction *inst )
- {
- if (inst->DstReg.File == PROGRAM_OUTPUT) {
-- GLuint idx = inst->DstReg.Index;
-- if (idx == FRAG_RESULT_COLR)
-- c->fp_fragcolor_emitted = 1;
-+ GLuint idx = inst->DstReg.Index;
-+ if (idx == FRAG_RESULT_COLR)
-+ c->fp_fragcolor_emitted = 1;
- }
- }
-
-@@ -903,10 +950,14 @@ static void print_insns( const struct prog_instruction *insn,
- }
- else
- _mesa_printf("UNKNOWN\n");
--
- }
- }
-
-+
-+/**
-+ * Initial pass for fragment program code generation.
-+ * This function is used by both the GLSL and non-GLSL paths.
-+ */
- void brw_wm_pass_fp( struct brw_wm_compile *c )
- {
- struct brw_fragment_program *fp = c->fp;
-@@ -923,15 +974,19 @@ void brw_wm_pass_fp( struct brw_wm_compile *c )
- c->pixel_w = src_undef();
- c->nr_fp_insns = 0;
-
-- /* Emit preamble instructions:
-+ /* Emit preamble instructions. This is where special instructions such as
-+ * WM_CINTERP, WM_LINTERP, WM_PINTERP and WM_WPOSXY are emitted to
-+ * compute shader inputs from varying vars.
- */
--
--
- for (insn = 0; insn < fp->program.Base.NumInstructions; insn++) {
- const struct prog_instruction *inst = &fp->program.Base.Instructions[insn];
- validate_src_regs(c, inst);
- validate_dst_regs(c, inst);
- }
-+
-+ /* Loop over all instructions doing assorted simplifications and
-+ * transformations.
-+ */
- for (insn = 0; insn < fp->program.Base.NumInstructions; insn++) {
- const struct prog_instruction *inst = &fp->program.Base.Instructions[insn];
- struct prog_instruction *out;
-@@ -940,7 +995,6 @@ void brw_wm_pass_fp( struct brw_wm_compile *c )
- * necessary:
- */
-
--
- switch (inst->Opcode) {
- case OPCODE_SWZ:
- out = emit_insn(c, inst);
-@@ -1020,9 +1074,9 @@ void brw_wm_pass_fp( struct brw_wm_compile *c )
- }
-
- if (INTEL_DEBUG & DEBUG_WM) {
-- _mesa_printf("pass_fp:\n");
-- print_insns( c->prog_instructions, c->nr_fp_insns );
-- _mesa_printf("\n");
-+ _mesa_printf("pass_fp:\n");
-+ print_insns( c->prog_instructions, c->nr_fp_insns );
-+ _mesa_printf("\n");
- }
- }
-
-diff --git a/src/mesa/drivers/dri/i965/brw_wm_glsl.c b/src/mesa/drivers/dri/i965/brw_wm_glsl.c
-index 8fd776a..8e404bc 100644
---- a/src/mesa/drivers/dri/i965/brw_wm_glsl.c
-+++ b/src/mesa/drivers/dri/i965/brw_wm_glsl.c
-@@ -8,12 +8,17 @@ enum _subroutine {
- SUB_NOISE1, SUB_NOISE2, SUB_NOISE3, SUB_NOISE4
- };
-
--/* Only guess, need a flag in gl_fragment_program later */
-+
-+/**
-+ * Determine if the given fragment program uses GLSL features such
-+ * as flow conditionals, loops, subroutines.
-+ * Some GLSL shaders may use these features, others might not.
-+ */
- GLboolean brw_wm_is_glsl(const struct gl_fragment_program *fp)
- {
- int i;
- for (i = 0; i < fp->Base.NumInstructions; i++) {
-- struct prog_instruction *inst = &fp->Base.Instructions[i];
-+ const struct prog_instruction *inst = &fp->Base.Instructions[i];
- switch (inst->Opcode) {
- case OPCODE_IF:
- case OPCODE_TRUNC:
-@@ -176,13 +181,15 @@ static struct brw_reg get_src_reg(struct brw_wm_compile *c,
- src->NegateBase, src->Abs);
- }
-
--/* Subroutines are minimal support for resusable instruction sequences.
-- They are implemented as simply as possible to minimise overhead: there
-- is no explicit support for communication between the caller and callee
-- other than saving the return address in a temporary register, nor is
-- there any automatic local storage. This implies that great care is
-- required before attempting reentrancy or any kind of nested
-- subroutine invocations. */
-+/**
-+ * Subroutines are minimal support for resusable instruction sequences.
-+ * They are implemented as simply as possible to minimise overhead: there
-+ * is no explicit support for communication between the caller and callee
-+ * other than saving the return address in a temporary register, nor is
-+ * there any automatic local storage. This implies that great care is
-+ * required before attempting reentrancy or any kind of nested
-+ * subroutine invocations.
-+ */
- static void invoke_subroutine( struct brw_wm_compile *c,
- enum _subroutine subroutine,
- void (*emit)( struct brw_wm_compile * ) )
-@@ -319,11 +326,10 @@ static void emit_pixel_xy(struct brw_wm_compile *c,
- stride(suboffset(r1_uw, 5), 2, 4, 0),
- brw_imm_v(0x11001100));
- }
--
- }
-
- static void emit_delta_xy(struct brw_wm_compile *c,
-- struct prog_instruction *inst)
-+ struct prog_instruction *inst)
- {
- struct brw_reg r1 = brw_vec1_grf(1, 0);
- struct brw_reg dst0, dst1, src0, src1;
-@@ -351,10 +357,8 @@ static void emit_delta_xy(struct brw_wm_compile *c,
- negate(suboffset(r1,1)));
-
- }
--
- }
-
--
- static void fire_fb_write( struct brw_wm_compile *c,
- GLuint base_reg,
- GLuint nr,
-@@ -397,33 +401,33 @@ static void emit_fb_write(struct brw_wm_compile *c,
- */
- if (c->key.aa_dest_stencil_reg)
- nr += 1;
-- {
-- brw_push_insn_state(p);
-- for (channel = 0; channel < 4; channel++) {
-- src0 = get_src_reg(c, &inst->SrcReg[0], channel, 1);
-- /* mov (8) m2.0<1>:ud r28.0<8;8,1>:ud { Align1 } */
-- /* mov (8) m6.0<1>:ud r29.0<8;8,1>:ud { Align1 SecHalf } */
-- brw_MOV(p, brw_message_reg(nr + channel), src0);
-- }
-- /* skip over the regs populated above: */
-- nr += 8;
-- brw_pop_insn_state(p);
-+
-+ brw_push_insn_state(p);
-+ for (channel = 0; channel < 4; channel++) {
-+ src0 = get_src_reg(c, &inst->SrcReg[0], channel, 1);
-+ /* mov (8) m2.0<1>:ud r28.0<8;8,1>:ud { Align1 } */
-+ /* mov (8) m6.0<1>:ud r29.0<8;8,1>:ud { Align1 SecHalf } */
-+ brw_MOV(p, brw_message_reg(nr + channel), src0);
- }
-+ /* skip over the regs populated above: */
-+ nr += 8;
-+ brw_pop_insn_state(p);
-
-- if (c->key.source_depth_to_render_target)
-- {
-- if (c->key.computes_depth) {
-- src0 = get_src_reg(c, &inst->SrcReg[2], 2, 1);
-- brw_MOV(p, brw_message_reg(nr), src0);
-- } else {
-- src0 = get_src_reg(c, &inst->SrcReg[1], 1, 1);
-- brw_MOV(p, brw_message_reg(nr), src0);
-- }
--
-- nr += 2;
-- }
-- target = inst->Sampler >> 1;
-- eot = inst->Sampler & 1;
-+ if (c->key.source_depth_to_render_target) {
-+ if (c->key.computes_depth) {
-+ src0 = get_src_reg(c, &inst->SrcReg[2], 2, 1);
-+ brw_MOV(p, brw_message_reg(nr), src0);
-+ }
-+ else {
-+ src0 = get_src_reg(c, &inst->SrcReg[1], 1, 1);
-+ brw_MOV(p, brw_message_reg(nr), src0);
-+ }
-+
-+ nr += 2;
-+ }
-+
-+ target = inst->Aux >> 1;
-+ eot = inst->Aux & 1;
- fire_fb_write(c, 0, nr, target, eot);
- }
-
-@@ -1045,23 +1049,23 @@ static void emit_ddy(struct brw_wm_compile *c,
- brw_set_saturate(p, 0);
- }
-
--static __inline struct brw_reg high_words( struct brw_reg reg )
-+static INLINE struct brw_reg high_words( struct brw_reg reg )
- {
- return stride( suboffset( retype( reg, BRW_REGISTER_TYPE_W ), 1 ),
- 0, 8, 2 );
- }
-
--static __inline struct brw_reg low_words( struct brw_reg reg )
-+static INLINE struct brw_reg low_words( struct brw_reg reg )
- {
- return stride( retype( reg, BRW_REGISTER_TYPE_W ), 0, 8, 2 );
- }
-
--static __inline struct brw_reg even_bytes( struct brw_reg reg )
-+static INLINE struct brw_reg even_bytes( struct brw_reg reg )
- {
- return stride( retype( reg, BRW_REGISTER_TYPE_B ), 0, 16, 2 );
- }
-
--static __inline struct brw_reg odd_bytes( struct brw_reg reg )
-+static INLINE struct brw_reg odd_bytes( struct brw_reg reg )
- {
- return stride( suboffset( retype( reg, BRW_REGISTER_TYPE_B ), 1 ),
- 0, 16, 2 );
-@@ -1366,9 +1370,11 @@ static void emit_noise2( struct brw_wm_compile *c,
- release_tmps( c, mark );
- }
-
--/* The three-dimensional case is much like the one- and two- versions above,
-- but since the number of corners is rapidly growing we now pack 16 16-bit
-- hashes into each register to extract more parallelism from the EUs. */
-+/**
-+ * The three-dimensional case is much like the one- and two- versions above,
-+ * but since the number of corners is rapidly growing we now pack 16 16-bit
-+ * hashes into each register to extract more parallelism from the EUs.
-+ */
- static void noise3_sub( struct brw_wm_compile *c ) {
-
- struct brw_compile *p = &c->func;
-@@ -1670,13 +1676,15 @@ static void emit_noise3( struct brw_wm_compile *c,
- release_tmps( c, mark );
- }
-
--/* For the four-dimensional case, the little micro-optimisation benefits
-- we obtain by unrolling all the loops aren't worth the massive bloat it
-- now causes. Instead, we loop twice around performing a similar operation
-- to noise3, once for the w=0 cube and once for the w=1, with a bit more
-- code to glue it all together. */
--static void noise4_sub( struct brw_wm_compile *c ) {
--
-+/**
-+ * For the four-dimensional case, the little micro-optimisation benefits
-+ * we obtain by unrolling all the loops aren't worth the massive bloat it
-+ * now causes. Instead, we loop twice around performing a similar operation
-+ * to noise3, once for the w=0 cube and once for the w=1, with a bit more
-+ * code to glue it all together.
-+ */
-+static void noise4_sub( struct brw_wm_compile *c )
-+{
- struct brw_compile *p = &c->func;
- struct brw_reg param[ 4 ],
- x0y0, x0y1, x1y0, x1y1, /* gradients at four of the corners */
-@@ -2244,28 +2252,12 @@ static void emit_tex(struct brw_wm_compile *c,
- brw_MOV(p, dst[3], brw_imm_f(1.0));
- }
-
-+/**
-+ * Resolve subroutine calls after code emit is done.
-+ */
- static void post_wm_emit( struct brw_wm_compile *c )
- {
-- GLuint nr_insns = c->fp->program.Base.NumInstructions;
-- GLuint insn, target_insn;
-- struct prog_instruction *inst1, *inst2;
-- struct brw_instruction *brw_inst1, *brw_inst2;
-- int offset;
-- for (insn = 0; insn < nr_insns; insn++) {
-- inst1 = &c->fp->program.Base.Instructions[insn];
-- brw_inst1 = inst1->Data;
-- switch (inst1->Opcode) {
-- case OPCODE_CAL:
-- target_insn = inst1->BranchTarget;
-- inst2 = &c->fp->program.Base.Instructions[target_insn];
-- brw_inst2 = inst2->Data;
-- offset = brw_inst2 - brw_inst1;
-- brw_set_src1(brw_inst1, brw_imm_d(offset*16));
-- break;
-- default:
-- break;
-- }
-- }
-+ brw_resolve_cals(&c->func);
- }
-
- static void brw_wm_emit_glsl(struct brw_context *brw, struct brw_wm_compile *c)
-@@ -2285,10 +2277,6 @@ static void brw_wm_emit_glsl(struct brw_context *brw, struct brw_wm_compile *c)
-
- for (i = 0; i < c->nr_fp_insns; i++) {
- struct prog_instruction *inst = &c->prog_instructions[i];
-- struct prog_instruction *orig_inst;
--
-- if ((orig_inst = inst->Data) != 0)
-- orig_inst->Data = current_insn(p);
-
- if (inst->CondUpdate)
- brw_set_conditionalmod(p, BRW_CONDITIONAL_NZ);
-@@ -2446,7 +2434,10 @@ static void brw_wm_emit_glsl(struct brw_context *brw, struct brw_wm_compile *c)
- brw_ENDIF(p, if_inst[--if_insn]);
- break;
- case OPCODE_BGNSUB:
-+ brw_save_label(p, inst->Comment, p->nr_insn);
-+ break;
- case OPCODE_ENDSUB:
-+ /* no-op */
- break;
- case OPCODE_CAL:
- brw_push_insn_state(p);
-@@ -2456,8 +2447,7 @@ static void brw_wm_emit_glsl(struct brw_context *brw, struct brw_wm_compile *c)
- brw_set_access_mode(p, BRW_ALIGN_16);
- brw_ADD(p, get_addr_reg(stack_index),
- get_addr_reg(stack_index), brw_imm_d(4));
-- orig_inst = inst->Data;
-- orig_inst->Data = &p->store[p->nr_insn];
-+ brw_save_call(&c->func, inst->Comment, p->nr_insn);
- brw_ADD(p, brw_ip_reg(), brw_ip_reg(), brw_imm_d(1*16));
- brw_pop_insn_state(p);
- break;
-@@ -2510,14 +2500,29 @@ static void brw_wm_emit_glsl(struct brw_context *brw, struct brw_wm_compile *c)
- brw_set_predicate_control(p, BRW_PREDICATE_NONE);
- }
- post_wm_emit(c);
-- for (i = 0; i < c->fp->program.Base.NumInstructions; i++)
-- c->fp->program.Base.Instructions[i].Data = NULL;
- }
-
-+
-+/**
-+ * Do GPU code generation for shaders that use GLSL features such as
-+ * flow control. Other shaders will be compiled with the
-+ */
- void brw_wm_glsl_emit(struct brw_context *brw, struct brw_wm_compile *c)
- {
-+ if (INTEL_DEBUG & DEBUG_WM) {
-+ _mesa_printf("brw_wm_glsl_emit:\n");
-+ }
-+
-+ /* initial instruction translation/simplification */
- brw_wm_pass_fp(c);
-+
-+ /* actual code generation */
- brw_wm_emit_glsl(brw, c);
-+
-+ if (INTEL_DEBUG & DEBUG_WM) {
-+ brw_wm_print_program(c, "brw_wm_glsl_emit done");
-+ }
-+
- c->prog_data.total_grf = c->reg_index;
- c->prog_data.total_scratch = 0;
- }
-diff --git a/src/mesa/drivers/dri/i965/brw_wm_pass0.c b/src/mesa/drivers/dri/i965/brw_wm_pass0.c
-index 205a716..2debd06 100644
---- a/src/mesa/drivers/dri/i965/brw_wm_pass0.c
-+++ b/src/mesa/drivers/dri/i965/brw_wm_pass0.c
-@@ -51,6 +51,7 @@ static struct brw_wm_value *get_value( struct brw_wm_compile *c)
- return &c->vreg[c->nr_vreg++];
- }
-
-+/** return pointer to a newly allocated instruction */
- static struct brw_wm_instruction *get_instruction( struct brw_wm_compile *c )
- {
- assert(c->nr_insns < BRW_WM_MAX_INSN);
-@@ -60,6 +61,7 @@ static struct brw_wm_instruction *get_instruction( struct brw_wm_compile *c )
- /***********************************************************************
- */
-
-+/** Init the "undef" register */
- static void pass0_init_undef( struct brw_wm_compile *c)
- {
- struct brw_wm_ref *ref = &c->undef_ref;
-@@ -69,6 +71,7 @@ static void pass0_init_undef( struct brw_wm_compile *c)
- ref->prevuse = NULL;
- }
-
-+/** Set a FP register to a value */
- static void pass0_set_fpreg_value( struct brw_wm_compile *c,
- GLuint file,
- GLuint idx,
-@@ -83,6 +86,7 @@ static void pass0_set_fpreg_value( struct brw_wm_compile *c,
- c->pass0_fp_reg[file][idx][component] = ref;
- }
-
-+/** Set a FP register to a ref */
- static void pass0_set_fpreg_ref( struct brw_wm_compile *c,
- GLuint file,
- GLuint idx,
-@@ -115,12 +119,13 @@ static const struct brw_wm_ref *get_param_ref( struct brw_wm_compile *c,
- ref->value = &c->creg[i/16];
- ref->insn = 0;
- ref->prevuse = NULL;
--
-+
- return ref;
- }
- }
-
-
-+/** Return a ref to a constant/literal value */
- static const struct brw_wm_ref *get_const_ref( struct brw_wm_compile *c,
- const GLfloat *constval )
- {
-@@ -142,7 +147,7 @@ static const struct brw_wm_ref *get_const_ref( struct brw_wm_compile *c,
- */
- c->constref[i].constval = *constval;
- c->constref[i].ref = get_param_ref(c, constval);
--
-+
- return c->constref[i].ref;
- }
- else {
-@@ -187,7 +192,7 @@ static const struct brw_wm_ref *pass0_get_reg( struct brw_wm_compile *c,
-
- /* There's something really hokey about parameters parsed in
- * arb programs - they all end up in here, whether they be
-- * state values, paramters or constants. This duplicates the
-+ * state values, parameters or constants. This duplicates the
- * structure above & also seems to subvert the limits set for
- * each type of constant/param.
- */
-@@ -198,7 +203,7 @@ static const struct brw_wm_ref *pass0_get_reg( struct brw_wm_compile *c,
- */
- ref = get_const_ref(c, &plist->ParameterValues[idx][component]);
- break;
--
-+
- case PROGRAM_STATE_VAR:
- case PROGRAM_UNIFORM:
- /* These may change from run to run:
-@@ -229,14 +234,13 @@ static const struct brw_wm_ref *pass0_get_reg( struct brw_wm_compile *c,
-
-
-
--
- /***********************************************************************
- * Straight translation to internal instruction format
- */
-
- static void pass0_set_dst( struct brw_wm_compile *c,
-- struct brw_wm_instruction *out,
-- const struct prog_instruction *inst,
-+ struct brw_wm_instruction *out,
-+ const struct prog_instruction *inst,
- GLuint writemask )
- {
- const struct prog_dst_register *dst = &inst->DstReg;
-@@ -245,18 +249,17 @@ static void pass0_set_dst( struct brw_wm_compile *c,
- for (i = 0; i < 4; i++) {
- if (writemask & (1<<i)) {
- out->dst[i] = get_value(c);
--
- pass0_set_fpreg_value(c, dst->File, dst->Index, i, out->dst[i]);
- }
- }
--
-+
- out->writemask = writemask;
- }
-
-
- static void pass0_set_dst_scalar( struct brw_wm_compile *c,
-- struct brw_wm_instruction *out,
-- const struct prog_instruction *inst,
-+ struct brw_wm_instruction *out,
-+ const struct prog_instruction *inst,
- GLuint writemask )
- {
- if (writemask) {
-@@ -282,7 +285,6 @@ static void pass0_set_dst_scalar( struct brw_wm_compile *c,
- }
-
-
--
- static const struct brw_wm_ref *get_fp_src_reg_ref( struct brw_wm_compile *c,
- struct prog_src_register src,
- GLuint i )
-@@ -292,14 +294,13 @@ static const struct brw_wm_ref *get_fp_src_reg_ref( struct brw_wm_compile *c,
- static const GLfloat const_zero = 0.0;
- static const GLfloat const_one = 1.0;
-
--
- if (component == SWIZZLE_ZERO)
- src_ref = get_const_ref(c, &const_zero);
- else if (component == SWIZZLE_ONE)
- src_ref = get_const_ref(c, &const_one);
- else
- src_ref = pass0_get_reg(c, src.File, src.Index, component);
--
-+
- return src_ref;
- }
-
-@@ -311,19 +312,19 @@ static struct brw_wm_ref *get_new_ref( struct brw_wm_compile *c,
- {
- const struct brw_wm_ref *ref = get_fp_src_reg_ref(c, src, i);
- struct brw_wm_ref *newref = get_ref(c);
--
-+
- newref->value = ref->value;
- newref->hw_reg = ref->hw_reg;
-
-- if (insn) {
-+ if (insn) {
- newref->insn = insn - c->instruction;
- newref->prevuse = newref->value->lastuse;
- newref->value->lastuse = newref;
- }
-
-- if (src.NegateBase & (1<<i))
-+ if (src.NegateBase & (1<<i))
- newref->hw_reg.negate ^= 1;
--
-+
- if (src.Abs) {
- newref->hw_reg.negate = 0;
- newref->hw_reg.abs = 1;
-@@ -333,9 +334,9 @@ static struct brw_wm_ref *get_new_ref( struct brw_wm_compile *c,
- }
-
-
--
--static struct brw_wm_instruction *translate_insn( struct brw_wm_compile *c,
-- const struct prog_instruction *inst )
-+static void
-+translate_insn(struct brw_wm_compile *c,
-+ const struct prog_instruction *inst)
- {
- struct brw_wm_instruction *out = get_instruction(c);
- GLuint writemask = inst->DstReg.WriteMask;
-@@ -348,8 +349,9 @@ static struct brw_wm_instruction *translate_insn( struct brw_wm_compile *c,
- out->saturate = (inst->SaturateMode != SATURATE_OFF);
- out->tex_unit = inst->TexSrcUnit;
- out->tex_idx = inst->TexSrcTarget;
-- out->eot = inst->Sampler & 1;
-- out->target = inst->Sampler>>1;
-+ out->tex_shadow = inst->TexShadow;
-+ out->eot = inst->Aux & 1;
-+ out->target = inst->Aux >> 1;
-
- /* Args:
- */
-@@ -365,8 +367,6 @@ static struct brw_wm_instruction *translate_insn( struct brw_wm_compile *c,
- pass0_set_dst_scalar(c, out, inst, writemask);
- else
- pass0_set_dst(c, out, inst, writemask);
--
-- return out;
- }
-
-
-@@ -379,14 +379,22 @@ static void pass0_precalc_mov( struct brw_wm_compile *c,
- {
- const struct prog_dst_register *dst = &inst->DstReg;
- GLuint writemask = inst->DstReg.WriteMask;
-+ struct brw_wm_ref *refs[4];
- GLuint i;
-
- /* Get the effect of a MOV by manipulating our register table:
-+ * First get all refs, then assign refs. This ensures that "in-place"
-+ * swizzles such as:
-+ * MOV t, t.xxyx
-+ * are handled correctly. Previously, these two steps were done in
-+ * one loop and the above case was incorrectly handled.
- */
- for (i = 0; i < 4; i++) {
-- if (writemask & (1<<i)) {
-- pass0_set_fpreg_ref( c, dst->File, dst->Index, i,
-- get_new_ref(c, inst->SrcReg[0], i, NULL));
-+ refs[i] = get_new_ref(c, inst->SrcReg[0], i, NULL);
-+ }
-+ for (i = 0; i < 4; i++) {
-+ if (writemask & (1 << i)) {
-+ pass0_set_fpreg_ref( c, dst->File, dst->Index, i, refs[i]);
- }
- }
- }
-@@ -418,6 +426,7 @@ static void pass0_init_payload( struct brw_wm_compile *c )
- &c->payload.input_interp[i] );
- }
-
-+
- /***********************************************************************
- * PASS 0
- *
-@@ -440,7 +449,6 @@ void brw_wm_pass0( struct brw_wm_compile *c )
- for (insn = 0; insn < c->nr_fp_insns; insn++) {
- const struct prog_instruction *inst = &c->prog_instructions[insn];
-
--
- /* Optimize away moves, otherwise emit translated instruction:
- */
- switch (inst->Opcode) {
-@@ -453,8 +461,6 @@ void brw_wm_pass0( struct brw_wm_compile *c )
- translate_insn(c, inst);
- }
- break;
--
--
- default:
- translate_insn(c, inst);
- break;
-@@ -465,4 +471,3 @@ void brw_wm_pass0( struct brw_wm_compile *c )
- brw_wm_print_program(c, "pass0");
- }
- }
--
-diff --git a/src/mesa/drivers/dri/i965/brw_wm_pass1.c b/src/mesa/drivers/dri/i965/brw_wm_pass1.c
-index f6f3a38..cf03189 100644
---- a/src/mesa/drivers/dri/i965/brw_wm_pass1.c
-+++ b/src/mesa/drivers/dri/i965/brw_wm_pass1.c
-@@ -58,7 +58,8 @@ static void unlink_ref(struct brw_wm_ref *ref)
-
- if (ref == value->lastuse) {
- value->lastuse = ref->prevuse;
-- } else {
-+ }
-+ else {
- struct brw_wm_ref *i = value->lastuse;
- while (i->prevuse != ref) i = i->prevuse;
- i->prevuse = ref->prevuse;
-@@ -75,8 +76,9 @@ static void track_arg(struct brw_wm_compile *c,
- for (i = 0; i < 4; i++) {
- struct brw_wm_ref *ref = inst->src[arg][i];
- if (ref) {
-- if (readmask & (1<<i))
-+ if (readmask & (1<<i)) {
- ref->value->contributes_to_output = 1;
-+ }
- else {
- unlink_ref(ref);
- inst->src[arg][i] = NULL;
-@@ -88,15 +90,21 @@ static void track_arg(struct brw_wm_compile *c,
- static GLuint get_texcoord_mask( GLuint tex_idx )
- {
- switch (tex_idx) {
-- case TEXTURE_1D_INDEX: return WRITEMASK_X;
-- case TEXTURE_2D_INDEX: return WRITEMASK_XY;
-- case TEXTURE_3D_INDEX: return WRITEMASK_XYZ;
-- case TEXTURE_CUBE_INDEX: return WRITEMASK_XYZ;
-- case TEXTURE_RECT_INDEX: return WRITEMASK_XY;
-+ case TEXTURE_1D_INDEX:
-+ return WRITEMASK_X;
-+ case TEXTURE_2D_INDEX:
-+ return WRITEMASK_XY;
-+ case TEXTURE_3D_INDEX:
-+ return WRITEMASK_XYZ;
-+ case TEXTURE_CUBE_INDEX:
-+ return WRITEMASK_XYZ;
-+ case TEXTURE_RECT_INDEX:
-+ return WRITEMASK_XY;
- default: return 0;
- }
- }
-
-+
- /* Step two: Basically this is dead code elimination.
- *
- * Iterate backwards over instructions, noting which values
-@@ -202,9 +210,10 @@ void brw_wm_pass1( struct brw_wm_compile *c )
- break;
-
- case OPCODE_TEX:
-+ case OPCODE_TXP:
- read0 = get_texcoord_mask(inst->tex_idx);
-
-- if (c->key.shadowtex_mask & (1<<inst->tex_unit))
-+ if (inst->tex_shadow)
- read0 |= WRITEMASK_Z;
- break;
-
-@@ -259,7 +268,6 @@ void brw_wm_pass1( struct brw_wm_compile *c )
- break;
-
- case OPCODE_DST:
-- case OPCODE_TXP:
- default:
- break;
- }
-@@ -273,6 +281,3 @@ void brw_wm_pass1( struct brw_wm_compile *c )
- brw_wm_print_program(c, "pass1");
- }
- }
--
--
--
-diff --git a/src/mesa/drivers/dri/i965/brw_wm_pass2.c b/src/mesa/drivers/dri/i965/brw_wm_pass2.c
-index 6fca9ad..780edbc 100644
---- a/src/mesa/drivers/dri/i965/brw_wm_pass2.c
-+++ b/src/mesa/drivers/dri/i965/brw_wm_pass2.c
-@@ -84,7 +84,7 @@ static void init_registers( struct brw_wm_compile *c )
- for (j = 0; j < c->nr_creg; j++)
- prealloc_reg(c, &c->creg[j], i++);
-
-- for (j = 0; j < FRAG_ATTRIB_MAX; j++)
-+ for (j = 0; j < FRAG_ATTRIB_MAX; j++) {
- if (inputs & (1<<j)) {
- /* index for vs output and ps input are not the same
- in shader varying */
-@@ -96,6 +96,7 @@ static void init_registers( struct brw_wm_compile *c )
- nr_interp_regs++;
- prealloc_reg(c, &c->payload.input_interp[index], i++);
- }
-+ }
-
- assert(nr_interp_regs >= 1);
-
-@@ -120,7 +121,7 @@ static void update_register_usage(struct brw_wm_compile *c,
- /* Only search those which can change:
- */
- if (grf->nextuse < thisinsn) {
-- struct brw_wm_ref *ref = grf->value->lastuse;
-+ const struct brw_wm_ref *ref = grf->value->lastuse;
-
- /* Has last use of value been passed?
- */
-@@ -148,7 +149,7 @@ static void spill_value(struct brw_wm_compile *c,
- /* Allocate a spill slot. Note that allocations start from 0x40 -
- * the first slot is reserved to mean "undef" in brw_wm_emit.c
- */
-- if (!value->spill_slot) {
-+ if (!value->spill_slot) {
- c->last_scratch += 0x40;
- value->spill_slot = c->last_scratch;
- }
-@@ -189,7 +190,7 @@ static GLuint search_contiguous_regs(struct brw_wm_compile *c,
- if (grf[i+j].nextuse < group_nextuse)
- group_nextuse = grf[i+j].nextuse;
- }
--
-+
- if (group_nextuse > furthest) {
- furthest = group_nextuse;
- reg = i;
-@@ -197,7 +198,7 @@ static GLuint search_contiguous_regs(struct brw_wm_compile *c,
- }
-
- assert(furthest != thisinsn);
--
-+
- /* Any non-empty regs will need to be spilled:
- */
- for (j = 0; j < nr; j++)
-@@ -243,7 +244,7 @@ static void alloc_contiguous_dest(struct brw_wm_compile *c,
-
- static void load_args(struct brw_wm_compile *c,
- struct brw_wm_instruction *inst)
--{
-+{
- GLuint thisinsn = inst - c->instruction;
- GLuint i,j;
-
-@@ -258,17 +259,17 @@ static void load_args(struct brw_wm_compile *c,
- * register allocation and mark the ref as requiring a fill.
- */
- GLuint reg = search_contiguous_regs(c, 1, thisinsn);
--
-+
- c->pass2_grf[reg].value = ref->value;
- c->pass2_grf[reg].nextuse = thisinsn;
--
-+
- ref->value->resident = &c->pass2_grf[reg];
-
- /* Note that a fill is required:
- */
- ref->unspill_reg = reg*2;
- }
--
-+
- /* Adjust the hw_reg to point at the value's current location:
- */
- assert(ref->value == ref->value->resident->value);
-@@ -294,7 +295,7 @@ void brw_wm_pass2( struct brw_wm_compile *c )
-
- for (insn = 0; insn < c->nr_insns; insn++) {
- struct brw_wm_instruction *inst = &c->instruction[insn];
--
-+
- /* Update registers' nextuse values:
- */
- update_register_usage(c, insn);
-@@ -322,11 +323,11 @@ void brw_wm_pass2( struct brw_wm_compile *c )
- break;
- }
-
-- if (TEST_DST_SPILLS && inst->opcode != WM_PIXELXY)
-+ if (TEST_DST_SPILLS && inst->opcode != WM_PIXELXY) {
- for (i = 0; i < 4; i++)
- if (inst->dst[i])
- spill_value(c, inst->dst[i]);
--
-+ }
- }
-
- if (INTEL_DEBUG & DEBUG_WM) {
-@@ -339,6 +340,3 @@ void brw_wm_pass2( struct brw_wm_compile *c )
- brw_wm_print_program(c, "pass2/done");
- }
- }
--
--
--
-diff --git a/src/mesa/drivers/dri/i965/brw_wm_sampler_state.c b/src/mesa/drivers/dri/i965/brw_wm_sampler_state.c
-index 8c9cb78..b6dac0d 100644
---- a/src/mesa/drivers/dri/i965/brw_wm_sampler_state.c
-+++ b/src/mesa/drivers/dri/i965/brw_wm_sampler_state.c
-@@ -220,14 +220,15 @@ static void
- brw_wm_sampler_populate_key(struct brw_context *brw,
- struct wm_sampler_key *key)
- {
-+ GLcontext *ctx = &brw->intel.ctx;
- int unit;
-
- memset(key, 0, sizeof(*key));
-
- for (unit = 0; unit < BRW_MAX_TEX_UNIT; unit++) {
-- if (brw->attribs.Texture->Unit[unit]._ReallyEnabled) {
-+ if (ctx->Texture.Unit[unit]._ReallyEnabled) {
- struct wm_sampler_entry *entry = &key->sampler[unit];
-- struct gl_texture_unit *texUnit = &brw->attribs.Texture->Unit[unit];
-+ struct gl_texture_unit *texUnit = &ctx->Texture.Unit[unit];
- struct gl_texture_object *texObj = texUnit->_Current;
- struct intel_texture_object *intelObj = intel_texture_object(texObj);
- struct gl_texture_image *firstImage =
-@@ -274,6 +275,7 @@ brw_wm_sampler_populate_key(struct brw_context *brw,
- */
- static void upload_wm_samplers( struct brw_context *brw )
- {
-+ GLcontext *ctx = &brw->intel.ctx;
- struct wm_sampler_key key;
- int i;
-
-@@ -317,7 +319,7 @@ static void upload_wm_samplers( struct brw_context *brw )
-
- /* Emit SDC relocations */
- for (i = 0; i < BRW_MAX_TEX_UNIT; i++) {
-- if (!brw->attribs.Texture->Unit[i]._ReallyEnabled)
-+ if (!ctx->Texture.Unit[i]._ReallyEnabled)
- continue;
-
- dri_bo_emit_reloc(brw->wm.sampler_bo,
-diff --git a/src/mesa/drivers/dri/i965/brw_wm_state.c b/src/mesa/drivers/dri/i965/brw_wm_state.c
-index 5302405..3c3b347 100644
---- a/src/mesa/drivers/dri/i965/brw_wm_state.c
-+++ b/src/mesa/drivers/dri/i965/brw_wm_state.c
-@@ -60,6 +60,7 @@ struct brw_wm_unit_key {
- static void
- wm_unit_populate_key(struct brw_context *brw, struct brw_wm_unit_key *key)
- {
-+ GLcontext *ctx = &brw->intel.ctx;
- const struct gl_fragment_program *fp = brw->fragment_program;
- struct intel_context *intel = &brw->intel;
-
-@@ -95,7 +96,7 @@ wm_unit_populate_key(struct brw_context *brw, struct brw_wm_unit_key *key)
- key->sampler_count = brw->wm.sampler_count;
-
- /* _NEW_POLYGONSTIPPLE */
-- key->polygon_stipple = brw->attribs.Polygon->StippleFlag;
-+ key->polygon_stipple = ctx->Polygon.StippleFlag;
-
- /* BRW_NEW_FRAGMENT_PROGRAM */
- key->uses_depth = (fp->Base.InputsRead & (1 << FRAG_ATTRIB_WPOS)) != 0;
-@@ -105,19 +106,19 @@ wm_unit_populate_key(struct brw_context *brw, struct brw_wm_unit_key *key)
- (fp->Base.OutputsWritten & (1 << FRAG_RESULT_DEPR)) != 0;
-
- /* _NEW_COLOR */
-- key->uses_kill = fp->UsesKill || brw->attribs.Color->AlphaEnabled;
-+ key->uses_kill = fp->UsesKill || ctx->Color.AlphaEnabled;
- key->is_glsl = brw_wm_is_glsl(fp);
-
- /* XXX: This needs a flag to indicate when it changes. */
- key->stats_wm = intel->stats_wm;
-
- /* _NEW_LINE */
-- key->line_stipple = brw->attribs.Line->StippleFlag;
-+ key->line_stipple = ctx->Line.StippleFlag;
-
- /* _NEW_POLYGON */
-- key->offset_enable = brw->attribs.Polygon->OffsetFill;
-- key->offset_units = brw->attribs.Polygon->OffsetUnits;
-- key->offset_factor = brw->attribs.Polygon->OffsetFactor;
-+ key->offset_enable = ctx->Polygon.OffsetFill;
-+ key->offset_units = ctx->Polygon.OffsetUnits;
-+ key->offset_factor = ctx->Polygon.OffsetFactor;
- }
-
- static dri_bo *
-diff --git a/src/mesa/drivers/dri/i965/brw_wm_surface_state.c b/src/mesa/drivers/dri/i965/brw_wm_surface_state.c
-index 06e71e6..e402fdf 100644
---- a/src/mesa/drivers/dri/i965/brw_wm_surface_state.c
-+++ b/src/mesa/drivers/dri/i965/brw_wm_surface_state.c
-@@ -139,7 +139,15 @@ static GLuint translate_tex_format( GLuint mesa_format, GLenum depth_mode )
- return BRW_SURFACEFORMAT_BC1_UNORM_SRGB;
-
- case MESA_FORMAT_S8_Z24:
-- return BRW_SURFACEFORMAT_I24X8_UNORM;
-+ /* XXX: these different surface formats don't seem to
-+ * make any difference for shadow sampler/compares.
-+ */
-+ if (depth_mode == GL_INTENSITY)
-+ return BRW_SURFACEFORMAT_I24X8_UNORM;
-+ else if (depth_mode == GL_ALPHA)
-+ return BRW_SURFACEFORMAT_A24X8_UNORM;
-+ else
-+ return BRW_SURFACEFORMAT_L24X8_UNORM;
-
- default:
- assert(0);
-@@ -253,7 +261,7 @@ static void
- brw_update_texture_surface( GLcontext *ctx, GLuint unit )
- {
- struct brw_context *brw = brw_context(ctx);
-- struct gl_texture_object *tObj = brw->attribs.Texture->Unit[unit]._Current;
-+ struct gl_texture_object *tObj = ctx->Texture.Unit[unit]._Current;
- struct intel_texture_object *intelObj = intel_texture_object(tObj);
- struct gl_texture_image *firstImage = tObj->Image[0][intelObj->firstLevel];
- struct brw_wm_surface_key key;
-@@ -301,6 +309,7 @@ static void
- brw_update_region_surface(struct brw_context *brw, struct intel_region *region,
- unsigned int unit, GLboolean cached)
- {
-+ GLcontext *ctx = &brw->intel.ctx;
- dri_bo *region_bo = NULL;
- struct {
- unsigned int surface_type;
-@@ -333,10 +342,10 @@ brw_update_region_surface(struct brw_context *brw, struct intel_region *region,
- key.height = 1;
- key.cpp = 4;
- }
-- memcpy(key.color_mask, brw->attribs.Color->ColorMask,
-+ memcpy(key.color_mask, ctx->Color.ColorMask,
- sizeof(key.color_mask));
-- key.color_blend = (!brw->attribs.Color->_LogicOpEnabled &&
-- brw->attribs.Color->BlendEnabled);
-+ key.color_blend = (!ctx->Color._LogicOpEnabled &&
-+ ctx->Color.BlendEnabled);
-
- dri_bo_unreference(brw->wm.surf_bo[unit]);
- brw->wm.surf_bo[unit] = NULL;
-@@ -380,8 +389,7 @@ brw_update_region_surface(struct brw_context *brw, struct intel_region *region,
- * a more restrictive relocation to emit.
- */
- dri_bo_emit_reloc(brw->wm.surf_bo[unit],
-- I915_GEM_DOMAIN_RENDER |
-- I915_GEM_DOMAIN_SAMPLER,
-+ I915_GEM_DOMAIN_RENDER,
- I915_GEM_DOMAIN_RENDER,
- 0,
- offsetof(struct brw_surface_state, ss1),
-@@ -446,20 +454,20 @@ static void prepare_wm_surfaces(struct brw_context *brw )
- GLuint i;
- int old_nr_surfaces;
-
-- if (brw->state.nr_draw_regions > 1) {
-- for (i = 0; i < brw->state.nr_draw_regions; i++) {
-- brw_update_region_surface(brw, brw->state.draw_regions[i], i,
-+ if (brw->state.nr_color_regions > 1) {
-+ for (i = 0; i < brw->state.nr_color_regions; i++) {
-+ brw_update_region_surface(brw, brw->state.color_regions[i], i,
- GL_FALSE);
- }
-- }else {
-- brw_update_region_surface(brw, brw->state.draw_regions[0], 0, GL_TRUE);
-+ } else {
-+ brw_update_region_surface(brw, brw->state.color_regions[0], 0, GL_TRUE);
- }
-
- old_nr_surfaces = brw->wm.nr_surfaces;
- brw->wm.nr_surfaces = MAX_DRAW_BUFFERS;
-
- for (i = 0; i < BRW_MAX_TEX_UNIT; i++) {
-- struct gl_texture_unit *texUnit = &brw->attribs.Texture->Unit[i];
-+ struct gl_texture_unit *texUnit = &ctx->Texture.Unit[i];
-
- /* _NEW_TEXTURE, BRW_NEW_TEXDATA */
- if(texUnit->_ReallyEnabled) {
-\ No newline at end of file
-diff --git a/src/mesa/drivers/dri/i965/intel_state.c b/src/mesa/drivers/dri/i965/intel_state.c
-deleted file mode 100644
-index 67ef5f7..519672f
---- a/src/mesa/drivers/dri/i965/intel_state.c
-+++ /dev/null
-@@ -1,225 +0,0 @@
--/**************************************************************************
-- *
-- * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas.
-- * All Rights Reserved.
-- *
-- * Permission is hereby granted, free of charge, to any person obtaining a
-- * copy of this software and associated documentation files (the
-- * "Software"), to deal in the Software without restriction, including
-- * without limitation the rights to use, copy, modify, merge, publish,
-- * distribute, sub license, and/or sell copies of the Software, and to
-- * permit persons to whom the Software is furnished to do so, subject to
-- * the following conditions:
-- *
-- * The above copyright notice and this permission notice (including the
-- * next paragraph) shall be included in all copies or substantial portions
-- * of the Software.
-- *
-- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
-- * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
-- * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-- *
-- **************************************************************************/
--
--
--#include "main/glheader.h"
--#include "main/context.h"
--#include "main/macros.h"
--#include "main/enums.h"
--#include "main/colormac.h"
--#include "main/dd.h"
--
--#include "intel_screen.h"
--#include "intel_context.h"
--#include "intel_regions.h"
--#include "swrast/swrast.h"
--
--int intel_translate_shadow_compare_func( GLenum func )
--{
-- switch(func) {
-- case GL_NEVER:
-- return COMPAREFUNC_ALWAYS;
-- case GL_LESS:
-- return COMPAREFUNC_LEQUAL;
-- case GL_LEQUAL:
-- return COMPAREFUNC_LESS;
-- case GL_GREATER:
-- return COMPAREFUNC_GEQUAL;
-- case GL_GEQUAL:
-- return COMPAREFUNC_GREATER;
-- case GL_NOTEQUAL:
-- return COMPAREFUNC_EQUAL;
-- case GL_EQUAL:
-- return COMPAREFUNC_NOTEQUAL;
-- case GL_ALWAYS:
-- return COMPAREFUNC_NEVER;
-- }
--
-- fprintf(stderr, "Unknown value in %s: %x\n", __FUNCTION__, func);
-- return COMPAREFUNC_NEVER;
--}
--
--int intel_translate_compare_func( GLenum func )
--{
-- switch(func) {
-- case GL_NEVER:
-- return COMPAREFUNC_NEVER;
-- case GL_LESS:
-- return COMPAREFUNC_LESS;
-- case GL_LEQUAL:
-- return COMPAREFUNC_LEQUAL;
-- case GL_GREATER:
-- return COMPAREFUNC_GREATER;
-- case GL_GEQUAL:
-- return COMPAREFUNC_GEQUAL;
-- case GL_NOTEQUAL:
-- return COMPAREFUNC_NOTEQUAL;
-- case GL_EQUAL:
-- return COMPAREFUNC_EQUAL;
-- case GL_ALWAYS:
-- return COMPAREFUNC_ALWAYS;
-- }
--
-- fprintf(stderr, "Unknown value in %s: %x\n", __FUNCTION__, func);
-- return COMPAREFUNC_ALWAYS;
--}
--
--int intel_translate_stencil_op( GLenum op )
--{
-- switch(op) {
-- case GL_KEEP:
-- return STENCILOP_KEEP;
-- case GL_ZERO:
-- return STENCILOP_ZERO;
-- case GL_REPLACE:
-- return STENCILOP_REPLACE;
-- case GL_INCR:
-- return STENCILOP_INCRSAT;
-- case GL_DECR:
-- return STENCILOP_DECRSAT;
-- case GL_INCR_WRAP:
-- return STENCILOP_INCR;
-- case GL_DECR_WRAP:
-- return STENCILOP_DECR;
-- case GL_INVERT:
-- return STENCILOP_INVERT;
-- default:
-- return STENCILOP_ZERO;
-- }
--}
--
--int intel_translate_blend_factor( GLenum factor )
--{
-- switch(factor) {
-- case GL_ZERO:
-- return BLENDFACT_ZERO;
-- case GL_SRC_ALPHA:
-- return BLENDFACT_SRC_ALPHA;
-- case GL_ONE:
-- return BLENDFACT_ONE;
-- case GL_SRC_COLOR:
-- return BLENDFACT_SRC_COLR;
-- case GL_ONE_MINUS_SRC_COLOR:
-- return BLENDFACT_INV_SRC_COLR;
-- case GL_DST_COLOR:
-- return BLENDFACT_DST_COLR;
-- case GL_ONE_MINUS_DST_COLOR:
-- return BLENDFACT_INV_DST_COLR;
-- case GL_ONE_MINUS_SRC_ALPHA:
-- return BLENDFACT_INV_SRC_ALPHA;
-- case GL_DST_ALPHA:
-- return BLENDFACT_DST_ALPHA;
-- case GL_ONE_MINUS_DST_ALPHA:
-- return BLENDFACT_INV_DST_ALPHA;
-- case GL_SRC_ALPHA_SATURATE:
-- return BLENDFACT_SRC_ALPHA_SATURATE;
-- case GL_CONSTANT_COLOR:
-- return BLENDFACT_CONST_COLOR;
-- case GL_ONE_MINUS_CONSTANT_COLOR:
-- return BLENDFACT_INV_CONST_COLOR;
-- case GL_CONSTANT_ALPHA:
-- return BLENDFACT_CONST_ALPHA;
-- case GL_ONE_MINUS_CONSTANT_ALPHA:
-- return BLENDFACT_INV_CONST_ALPHA;
-- }
--
-- fprintf(stderr, "Unknown value in %s: %x\n", __FUNCTION__, factor);
-- return BLENDFACT_ZERO;
--}
--
--int intel_translate_logic_op( GLenum opcode )
--{
-- switch(opcode) {
-- case GL_CLEAR:
-- return LOGICOP_CLEAR;
-- case GL_AND:
-- return LOGICOP_AND;
-- case GL_AND_REVERSE:
-- return LOGICOP_AND_RVRSE;
-- case GL_COPY:
-- return LOGICOP_COPY;
-- case GL_COPY_INVERTED:
-- return LOGICOP_COPY_INV;
-- case GL_AND_INVERTED:
-- return LOGICOP_AND_INV;
-- case GL_NOOP:
-- return LOGICOP_NOOP;
-- case GL_XOR:
-- return LOGICOP_XOR;
-- case GL_OR:
-- return LOGICOP_OR;
-- case GL_OR_INVERTED:
-- return LOGICOP_OR_INV;
-- case GL_NOR:
-- return LOGICOP_NOR;
-- case GL_EQUIV:
-- return LOGICOP_EQUIV;
-- case GL_INVERT:
-- return LOGICOP_INV;
-- case GL_OR_REVERSE:
-- return LOGICOP_OR_RVRSE;
-- case GL_NAND:
-- return LOGICOP_NAND;
-- case GL_SET:
-- return LOGICOP_SET;
-- default:
-- return LOGICOP_SET;
-- }
--}
--
--
--static void intelClearColor(GLcontext *ctx, const GLfloat color[4])
--{
-- struct intel_context *intel = intel_context(ctx);
--
-- UNCLAMPED_FLOAT_TO_RGBA_CHAN(intel->clear_chan, color);
--
-- intel->ClearColor8888 = INTEL_PACKCOLOR8888(intel->clear_chan[0],
-- intel->clear_chan[1],
-- intel->clear_chan[2],
-- intel->clear_chan[3]);
-- intel->ClearColor565 = INTEL_PACKCOLOR565(intel->clear_chan[0],
-- intel->clear_chan[1],
-- intel->clear_chan[2]);
--}
--
--
--
--/* Fallback to swrast for select and feedback.
-- */
--static void intelRenderMode( GLcontext *ctx, GLenum mode )
--{
-- struct intel_context *intel = intel_context(ctx);
-- FALLBACK( intel, INTEL_FALLBACK_RENDERMODE, (mode != GL_RENDER) );
--}
--
--
--void intelInitStateFuncs( struct dd_function_table *functions )
--{
-- functions->RenderMode = intelRenderMode;
-- functions->ClearColor = intelClearColor;
--}
-diff --git a/src/mesa/drivers/dri/intel/intel_buffers.c b/src/mesa/drivers/dri/intel/intel_buffers.c
-index 0fd2f16..7f2144a 100644
---- a/src/mesa/drivers/dri/intel/intel_buffers.c
-+++ b/src/mesa/drivers/dri/intel/intel_buffers.c
-@@ -25,25 +25,14 @@
- *
- **************************************************************************/
-
--#include "intel_screen.h"
- #include "intel_context.h"
--#include "intel_blit.h"
- #include "intel_buffers.h"
--#include "intel_chipset.h"
--#include "intel_depthstencil.h"
- #include "intel_fbo.h"
- #include "intel_regions.h"
- #include "intel_batchbuffer.h"
--#include "intel_reg.h"
--#include "main/context.h"
- #include "main/framebuffer.h"
--#include "swrast/swrast.h"
--#include "utils.h"
- #include "drirenderbuffer.h"
--#include "vblank.h"
--#include "i915_drm.h"
-
--#define FILE_DEBUG_FLAG DEBUG_BLIT
-
- /**
- * XXX move this into a new dri/common/cliprects.c file.
-@@ -114,7 +103,6 @@ intel_get_cliprects(struct intel_context *intel,
- int *x_off, int *y_off)
- {
- __DRIdrawablePrivate *dPriv = intel->driDrawable;
-- struct intel_framebuffer *intel_fb = dPriv->driverPrivate;
-
- if (intel->constant_cliprect) {
- /* FBO or DRI2 rendering, which can just use the fb's size. */
-@@ -143,399 +131,6 @@ intel_get_cliprects(struct intel_context *intel,
- }
- }
-
--/**
-- * This will be called whenever the currently bound window is moved/resized.
-- * XXX: actually, it seems to NOT be called when the window is only moved (BP).
-- */
--void
--intelWindowMoved(struct intel_context *intel)
--{
-- GLcontext *ctx = &intel->ctx;
-- __DRIdrawablePrivate *dPriv = intel->driDrawable;
-- struct intel_framebuffer *intel_fb = dPriv->driverPrivate;
--
-- if (!intel->intelScreen->driScrnPriv->dri2.enabled &&
-- intel->intelScreen->driScrnPriv->ddx_version.minor >= 7) {
-- volatile drm_i915_sarea_t *sarea = intel->sarea;
-- drm_clip_rect_t drw_rect = { .x1 = dPriv->x, .x2 = dPriv->x + dPriv->w,
-- .y1 = dPriv->y, .y2 = dPriv->y + dPriv->h };
-- drm_clip_rect_t planeA_rect = { .x1 = sarea->planeA_x, .y1 = sarea->planeA_y,
-- .x2 = sarea->planeA_x + sarea->planeA_w,
-- .y2 = sarea->planeA_y + sarea->planeA_h };
-- drm_clip_rect_t planeB_rect = { .x1 = sarea->planeB_x, .y1 = sarea->planeB_y,
-- .x2 = sarea->planeB_x + sarea->planeB_w,
-- .y2 = sarea->planeB_y + sarea->planeB_h };
-- GLint areaA = driIntersectArea( drw_rect, planeA_rect );
-- GLint areaB = driIntersectArea( drw_rect, planeB_rect );
-- GLuint flags = dPriv->vblFlags;
--
-- /* Update vblank info
-- */
-- if (areaB > areaA || (areaA == areaB && areaB > 0)) {
-- flags = dPriv->vblFlags | VBLANK_FLAG_SECONDARY;
-- } else {
-- flags = dPriv->vblFlags & ~VBLANK_FLAG_SECONDARY;
-- }
--
-- /* Check to see if we changed pipes */
-- if (flags != dPriv->vblFlags && dPriv->vblFlags &&
-- !(dPriv->vblFlags & VBLANK_FLAG_NO_IRQ)) {
-- int64_t count;
-- drmVBlank vbl;
-- int i;
--
-- /*
-- * Deal with page flipping
-- */
-- vbl.request.type = DRM_VBLANK_ABSOLUTE;
--
-- if ( dPriv->vblFlags & VBLANK_FLAG_SECONDARY ) {
-- vbl.request.type |= DRM_VBLANK_SECONDARY;
-- }
--
-- for (i = 0; i < 2; i++) {
-- if (!intel_fb->color_rb[i] ||
-- (intel_fb->vbl_waited - intel_fb->color_rb[i]->vbl_pending) <=
-- (1<<23))
-- continue;
--
-- vbl.request.sequence = intel_fb->color_rb[i]->vbl_pending;
-- drmWaitVBlank(intel->driFd, &vbl);
-- }
--
-- /*
-- * Update msc_base from old pipe
-- */
-- driDrawableGetMSC32(dPriv->driScreenPriv, dPriv, &count);
-- dPriv->msc_base = count;
-- /*
-- * Then get new vblank_base and vblSeq values
-- */
-- dPriv->vblFlags = flags;
-- driGetCurrentVBlank(dPriv);
-- dPriv->vblank_base = dPriv->vblSeq;
--
-- intel_fb->vbl_waited = dPriv->vblSeq;
--
-- for (i = 0; i < 2; i++) {
-- if (intel_fb->color_rb[i])
-- intel_fb->color_rb[i]->vbl_pending = intel_fb->vbl_waited;
-- }
-- }
-- } else {
-- dPriv->vblFlags &= ~VBLANK_FLAG_SECONDARY;
-- }
--
-- /* Update Mesa's notion of window size */
-- driUpdateFramebufferSize(ctx, dPriv);
-- intel_fb->Base.Initialized = GL_TRUE; /* XXX remove someday */
--
-- /* Update hardware scissor */
-- if (ctx->Driver.Scissor != NULL) {
-- ctx->Driver.Scissor(ctx, ctx->Scissor.X, ctx->Scissor.Y,
-- ctx->Scissor.Width, ctx->Scissor.Height);
-- }
--
-- /* Re-calculate viewport related state */
-- if (ctx->Driver.DepthRange != NULL)
-- ctx->Driver.DepthRange( ctx, ctx->Viewport.Near, ctx->Viewport.Far );
--}
--
--
--
--/* A true meta version of this would be very simple and additionally
-- * machine independent. Maybe we'll get there one day.
-- */
--static void
--intelClearWithTris(struct intel_context *intel, GLbitfield mask)
--{
-- GLcontext *ctx = &intel->ctx;
-- struct gl_framebuffer *fb = ctx->DrawBuffer;
-- GLuint buf;
--
-- intel->vtbl.install_meta_state(intel);
--
-- /* Back and stencil cliprects are the same. Try and do both
-- * buffers at once:
-- */
-- if (mask & (BUFFER_BIT_BACK_LEFT | BUFFER_BIT_STENCIL | BUFFER_BIT_DEPTH)) {
-- struct intel_region *backRegion =
-- intel_get_rb_region(fb, BUFFER_BACK_LEFT);
-- struct intel_region *depthRegion =
-- intel_get_rb_region(fb, BUFFER_DEPTH);
--
-- intel->vtbl.meta_draw_region(intel, backRegion, depthRegion);
--
-- if (mask & BUFFER_BIT_BACK_LEFT)
-- intel->vtbl.meta_color_mask(intel, GL_TRUE);
-- else
-- intel->vtbl.meta_color_mask(intel, GL_FALSE);
--
-- if (mask & BUFFER_BIT_STENCIL)
-- intel->vtbl.meta_stencil_replace(intel,
-- intel->ctx.Stencil.WriteMask[0],
-- intel->ctx.Stencil.Clear);
-- else
-- intel->vtbl.meta_no_stencil_write(intel);
--
-- if (mask & BUFFER_BIT_DEPTH)
-- intel->vtbl.meta_depth_replace(intel);
-- else
-- intel->vtbl.meta_no_depth_write(intel);
--
-- intel->vtbl.meta_draw_quad(intel,
-- fb->_Xmin,
-- fb->_Xmax,
-- fb->_Ymin,
-- fb->_Ymax,
-- intel->ctx.Depth.Clear,
-- intel->ClearColor8888,
-- 0, 0, 0, 0); /* texcoords */
--
-- mask &= ~(BUFFER_BIT_BACK_LEFT | BUFFER_BIT_STENCIL | BUFFER_BIT_DEPTH);
-- }
--
-- /* clear the remaining (color) renderbuffers */
-- for (buf = 0; buf < BUFFER_COUNT && mask; buf++) {
-- const GLuint bufBit = 1 << buf;
-- if (mask & bufBit) {
-- struct intel_renderbuffer *irbColor =
-- intel_renderbuffer(fb->Attachment[buf].Renderbuffer);
--
-- ASSERT(irbColor);
--
-- intel->vtbl.meta_no_depth_write(intel);
-- intel->vtbl.meta_no_stencil_write(intel);
-- intel->vtbl.meta_color_mask(intel, GL_TRUE);
-- intel->vtbl.meta_draw_region(intel, irbColor->region, NULL);
--
-- intel->vtbl.meta_draw_quad(intel,
-- fb->_Xmin,
-- fb->_Xmax,
-- fb->_Ymin,
-- fb->_Ymax,
-- 0, intel->ClearColor8888,
-- 0, 0, 0, 0); /* texcoords */
--
-- mask &= ~bufBit;
-- }
-- }
--
-- intel->vtbl.leave_meta_state(intel);
--}
--
--static const char *buffer_names[] = {
-- [BUFFER_FRONT_LEFT] = "front",
-- [BUFFER_BACK_LEFT] = "back",
-- [BUFFER_FRONT_RIGHT] = "front right",
-- [BUFFER_BACK_RIGHT] = "back right",
-- [BUFFER_AUX0] = "aux0",
-- [BUFFER_AUX1] = "aux1",
-- [BUFFER_AUX2] = "aux2",
-- [BUFFER_AUX3] = "aux3",
-- [BUFFER_DEPTH] = "depth",
-- [BUFFER_STENCIL] = "stencil",
-- [BUFFER_ACCUM] = "accum",
-- [BUFFER_COLOR0] = "color0",
-- [BUFFER_COLOR1] = "color1",
-- [BUFFER_COLOR2] = "color2",
-- [BUFFER_COLOR3] = "color3",
-- [BUFFER_COLOR4] = "color4",
-- [BUFFER_COLOR5] = "color5",
-- [BUFFER_COLOR6] = "color6",
-- [BUFFER_COLOR7] = "color7",
--};
--
--/**
-- * Called by ctx->Driver.Clear.
-- */
--static void
--intelClear(GLcontext *ctx, GLbitfield mask)
--{
-- struct intel_context *intel = intel_context(ctx);
-- const GLuint colorMask = *((GLuint *) & ctx->Color.ColorMask);
-- GLbitfield tri_mask = 0;
-- GLbitfield blit_mask = 0;
-- GLbitfield swrast_mask = 0;
-- struct gl_framebuffer *fb = ctx->DrawBuffer;
-- GLuint i;
--
-- if (0)
-- fprintf(stderr, "%s\n", __FUNCTION__);
--
-- /* HW color buffers (front, back, aux, generic FBO, etc) */
-- if (colorMask == ~0) {
-- /* clear all R,G,B,A */
-- /* XXX FBO: need to check if colorbuffers are software RBOs! */
-- blit_mask |= (mask & BUFFER_BITS_COLOR);
-- }
-- else {
-- /* glColorMask in effect */
-- tri_mask |= (mask & BUFFER_BITS_COLOR);
-- }
--
-- /* HW stencil */
-- if (mask & BUFFER_BIT_STENCIL) {
-- const struct intel_region *stencilRegion
-- = intel_get_rb_region(fb, BUFFER_STENCIL);
-- if (stencilRegion) {
-- /* have hw stencil */
-- if (IS_965(intel->intelScreen->deviceID) ||
-- (ctx->Stencil.WriteMask[0] & 0xff) != 0xff) {
-- /* We have to use the 3D engine if we're clearing a partial mask
-- * of the stencil buffer, or if we're on a 965 which has a tiled
-- * depth/stencil buffer in a layout we can't blit to.
-- */
-- tri_mask |= BUFFER_BIT_STENCIL;
-- }
-- else {
-- /* clearing all stencil bits, use blitting */
-- blit_mask |= BUFFER_BIT_STENCIL;
-- }
-- }
-- }
--
-- /* HW depth */
-- if (mask & BUFFER_BIT_DEPTH) {
-- /* clear depth with whatever method is used for stencil (see above) */
-- if (IS_965(intel->intelScreen->deviceID) ||
-- tri_mask & BUFFER_BIT_STENCIL)
-- tri_mask |= BUFFER_BIT_DEPTH;
-- else
-- blit_mask |= BUFFER_BIT_DEPTH;
-- }
--
-- /* SW fallback clearing */
-- swrast_mask = mask & ~tri_mask & ~blit_mask;
--
-- for (i = 0; i < BUFFER_COUNT; i++) {
-- GLuint bufBit = 1 << i;
-- if ((blit_mask | tri_mask) & bufBit) {
-- if (!fb->Attachment[i].Renderbuffer->ClassID) {
-- blit_mask &= ~bufBit;
-- tri_mask &= ~bufBit;
-- swrast_mask |= bufBit;
-- }
-- }
-- }
--
-- if (blit_mask) {
-- if (INTEL_DEBUG & DEBUG_BLIT) {
-- DBG("blit clear:");
-- for (i = 0; i < BUFFER_COUNT; i++) {
-- if (blit_mask & (1 << i))
-- DBG(" %s", buffer_names[i]);
-- }
-- DBG("\n");
-- }
-- intelClearWithBlit(ctx, blit_mask);
-- }
--
-- if (tri_mask) {
-- if (INTEL_DEBUG & DEBUG_BLIT) {
-- DBG("tri clear:");
-- for (i = 0; i < BUFFER_COUNT; i++) {
-- if (tri_mask & (1 << i))
-- DBG(" %s", buffer_names[i]);
-- }
-- DBG("\n");
-- }
-- intelClearWithTris(intel, tri_mask);
-- }
--
-- if (swrast_mask) {
-- if (INTEL_DEBUG & DEBUG_BLIT) {
-- DBG("swrast clear:");
-- for (i = 0; i < BUFFER_COUNT; i++) {
-- if (swrast_mask & (1 << i))
-- DBG(" %s", buffer_names[i]);
-- }
-- DBG("\n");
-- }
-- _swrast_Clear(ctx, swrast_mask);
-- }
--}
--
--void
--intelSwapBuffers(__DRIdrawablePrivate * dPriv)
--{
-- __DRIscreenPrivate *psp = dPriv->driScreenPriv;
--
-- if (dPriv->driContextPriv && dPriv->driContextPriv->driverPrivate) {
-- GET_CURRENT_CONTEXT(ctx);
-- struct intel_context *intel;
--
-- if (ctx == NULL)
-- return;
--
-- intel = intel_context(ctx);
--
-- if (ctx->Visual.doubleBufferMode) {
-- GLboolean missed_target;
-- struct intel_framebuffer *intel_fb = dPriv->driverPrivate;
-- int64_t ust;
--
-- _mesa_notifySwapBuffers(ctx); /* flush pending rendering comands */
--
-- /*
-- * The old swapping ioctl was incredibly racy, just wait for vblank
-- * and do the swap ourselves.
-- */
-- driWaitForVBlank(dPriv, &missed_target);
--
-- /*
-- * Update each buffer's vbl_pending so we don't get too out of
-- * sync
-- */
-- intel_get_renderbuffer(&intel_fb->Base,
-- BUFFER_BACK_LEFT)->vbl_pending = dPriv->vblSeq;
-- intel_get_renderbuffer(&intel_fb->Base,
-- BUFFER_FRONT_LEFT)->vbl_pending = dPriv->vblSeq;
--
-- intelCopyBuffer(dPriv, NULL);
--
-- intel_fb->swap_count++;
-- (*psp->systemTime->getUST) (&ust);
-- if (missed_target) {
-- intel_fb->swap_missed_count++;
-- intel_fb->swap_missed_ust = ust - intel_fb->swap_ust;
-- }
--
-- intel_fb->swap_ust = ust;
-- }
-- drmCommandNone(intel->driFd, DRM_I915_GEM_THROTTLE);
--
-- }
-- else {
-- /* XXX this shouldn't be an error but we can't handle it for now */
-- fprintf(stderr, "%s: drawable has no context!\n", __FUNCTION__);
-- }
--}
--
--void
--intelCopySubBuffer(__DRIdrawablePrivate * dPriv, int x, int y, int w, int h)
--{
-- if (dPriv->driContextPriv && dPriv->driContextPriv->driverPrivate) {
-- struct intel_context *intel =
-- (struct intel_context *) dPriv->driContextPriv->driverPrivate;
-- GLcontext *ctx = &intel->ctx;
--
-- if (ctx->Visual.doubleBufferMode) {
-- drm_clip_rect_t rect;
-- rect.x1 = x + dPriv->x;
-- rect.y1 = (dPriv->h - y - h) + dPriv->y;
-- rect.x2 = rect.x1 + w;
-- rect.y2 = rect.y1 + h;
-- _mesa_notifySwapBuffers(ctx); /* flush pending rendering comands */
-- intelCopyBuffer(dPriv, &rect);
-- }
-- }
-- else {
-- /* XXX this shouldn't be an error but we can't handle it for now */
-- fprintf(stderr, "%s: drawable has no context!\n", __FUNCTION__);
-- }
--}
--
-
- /**
- * Update the hardware state for drawing into a window or framebuffer object.
-@@ -559,7 +154,7 @@ intel_draw_buffer(GLcontext * ctx, struct gl_framebuffer *fb)
- return;
- }
-
-- /* Do this here, note core Mesa, since this function is called from
-+ /* Do this here, not core Mesa, since this function is called from
- * many places within the driver.
- */
- if (ctx->NewState & (_NEW_BUFFERS | _NEW_COLOR | _NEW_PIXEL)) {
-@@ -577,9 +172,6 @@ intel_draw_buffer(GLcontext * ctx, struct gl_framebuffer *fb)
- return;
- }
-
-- if (fb->Name)
-- intel_validate_paired_depth_stencil(ctx, fb);
--
- /*
- * How many color buffers are we drawing into?
- */
-@@ -587,7 +179,8 @@ intel_draw_buffer(GLcontext * ctx, struct gl_framebuffer *fb)
- /* writing to 0 */
- colorRegions[0] = NULL;
- intel->constant_cliprect = GL_TRUE;
-- } else if (fb->_NumColorDrawBuffers > 1) {
-+ }
-+ else if (fb->_NumColorDrawBuffers > 1) {
- int i;
- struct intel_renderbuffer *irb;
-
-@@ -626,14 +219,6 @@ intel_draw_buffer(GLcontext * ctx, struct gl_framebuffer *fb)
- }
- }
-
-- /* Update culling direction which changes depending on the
-- * orientation of the buffer:
-- */
-- if (ctx->Driver.FrontFace)
-- ctx->Driver.FrontFace(ctx, ctx->Polygon.FrontFace);
-- else
-- ctx->NewState |= _NEW_POLYGON;
--
- if (!colorRegions[0]) {
- FALLBACK(intel, INTEL_FALLBACK_DRAW_BUFFER, GL_TRUE);
- }
-@@ -665,20 +250,13 @@ intel_draw_buffer(GLcontext * ctx, struct gl_framebuffer *fb)
- /***
- *** Stencil buffer
- *** This can only be hardware accelerated if we're using a
-- *** combined DEPTH_STENCIL buffer (for now anyway).
-+ *** combined DEPTH_STENCIL buffer.
- ***/
- if (fb->_StencilBuffer && fb->_StencilBuffer->Wrapped) {
- irbStencil = intel_renderbuffer(fb->_StencilBuffer->Wrapped);
- if (irbStencil && irbStencil->region) {
- ASSERT(irbStencil->Base._ActualFormat == GL_DEPTH24_STENCIL8_EXT);
- FALLBACK(intel, INTEL_FALLBACK_STENCIL_BUFFER, GL_FALSE);
-- /* need to re-compute stencil hw state */
-- if (ctx->Driver.Enable != NULL)
-- ctx->Driver.Enable(ctx, GL_STENCIL_TEST, ctx->Stencil.Enabled);
-- else
-- ctx->NewState |= _NEW_STENCIL;
-- if (!depthRegion)
-- depthRegion = irbStencil->region;
- }
- else {
- FALLBACK(intel, INTEL_FALLBACK_STENCIL_BUFFER, GL_TRUE);
-@@ -687,37 +265,30 @@ intel_draw_buffer(GLcontext * ctx, struct gl_framebuffer *fb)
- else {
- /* XXX FBO: instead of FALSE, pass ctx->Stencil.Enabled ??? */
- FALLBACK(intel, INTEL_FALLBACK_STENCIL_BUFFER, GL_FALSE);
-- /* need to re-compute stencil hw state */
-- if (ctx->Driver.Enable != NULL)
-- ctx->Driver.Enable(ctx, GL_STENCIL_TEST, ctx->Stencil.Enabled);
-- else
-- ctx->NewState |= _NEW_STENCIL;
- }
-
- /*
-- * Update depth test state
-+ * Update depth and stencil test state
- */
- if (ctx->Driver.Enable) {
-- if (ctx->Depth.Test && fb->Visual.depthBits > 0) {
-- ctx->Driver.Enable(ctx, GL_DEPTH_TEST, GL_TRUE);
-- } else {
-- ctx->Driver.Enable(ctx, GL_DEPTH_TEST, GL_FALSE);
-- }
-- } else {
-- ctx->NewState |= _NEW_DEPTH;
-+ ctx->Driver.Enable(ctx, GL_DEPTH_TEST,
-+ (ctx->Depth.Test && fb->Visual.depthBits > 0));
-+ ctx->Driver.Enable(ctx, GL_STENCIL_TEST,
-+ (ctx->Stencil.Enabled && fb->Visual.stencilBits > 0));
-+ }
-+ else {
-+ ctx->NewState |= (_NEW_DEPTH | _NEW_STENCIL);
- }
-
- intel->vtbl.set_draw_region(intel, colorRegions, depthRegion,
-- fb->_NumColorDrawBuffers);
-+ fb->_NumColorDrawBuffers);
-
- /* update viewport since it depends on window size */
-- if (ctx->Driver.Viewport) {
-- ctx->Driver.Viewport(ctx, ctx->Viewport.X, ctx->Viewport.Y,
-- ctx->Viewport.Width, ctx->Viewport.Height);
-- } else {
-- ctx->NewState |= _NEW_VIEWPORT;
-- }
--
-+#ifdef I915
-+ intelCalcViewport(ctx);
-+#else
-+ ctx->NewState |= _NEW_VIEWPORT;
-+#endif
- /* Set state we know depends on drawable parameters:
- */
- if (ctx->Driver.Scissor)
-@@ -729,6 +300,14 @@ intel_draw_buffer(GLcontext * ctx, struct gl_framebuffer *fb)
- ctx->Driver.DepthRange(ctx,
- ctx->Viewport.Near,
- ctx->Viewport.Far);
-+
-+ /* Update culling direction which changes depending on the
-+ * orientation of the buffer:
-+ */
-+ if (ctx->Driver.FrontFace)
-+ ctx->Driver.FrontFace(ctx, ctx->Polygon.FrontFace);
-+ else
-+ ctx->NewState |= _NEW_POLYGON;
- }
-
-
-@@ -759,7 +338,6 @@ intelReadBuffer(GLcontext * ctx, GLenum mode)
- void
- intelInitBufferFuncs(struct dd_function_table *functions)
- {
-- functions->Clear = intelClear;
- functions->DrawBuffer = intelDrawBuffer;
- functions->ReadBuffer = intelReadBuffer;
- }
-diff --git a/src/mesa/drivers/dri/intel/intel_buffers.h b/src/mesa/drivers/dri/intel/intel_buffers.h
-index 0be1cee..6069d38 100644
---- a/src/mesa/drivers/dri/intel/intel_buffers.h
-+++ b/src/mesa/drivers/dri/intel/intel_buffers.h
-@@ -45,10 +45,6 @@ extern struct intel_region *intel_readbuf_region(struct intel_context *intel);
-
- extern struct intel_region *intel_drawbuf_region(struct intel_context *intel);
-
--extern void intelSwapBuffers(__DRIdrawablePrivate * dPriv);
--
--extern void intelWindowMoved(struct intel_context *intel);
--
- extern void intel_draw_buffer(GLcontext * ctx, struct gl_framebuffer *fb);
-
- extern void intelInitBufferFuncs(struct dd_function_table *functions);
-@@ -57,5 +53,8 @@ void intel_get_cliprects(struct intel_context *intel,
- struct drm_clip_rect **cliprects,
- unsigned int *num_cliprects,
- int *x_off, int *y_off);
-+#ifdef I915
-+void intelCalcViewport(GLcontext * ctx);
-+#endif
-
- #endif /* INTEL_BUFFERS_H */
-diff --git a/src/mesa/drivers/dri/intel/intel_clear.c b/src/mesa/drivers/dri/intel/intel_clear.c
-new file mode 100644
-index 0000000..c3ba50f
---- /dev/null
-+++ b/src/mesa/drivers/dri/intel/intel_clear.c
-@@ -0,0 +1,393 @@
-+/**************************************************************************
-+ *
-+ * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas.
-+ * Copyright 2009 Intel Corporation.
-+ * All Rights Reserved.
-+ *
-+ * Permission is hereby granted, free of charge, to any person obtaining a
-+ * copy of this software and associated documentation files (the
-+ * "Software"), to deal in the Software without restriction, including
-+ * without limitation the rights to use, copy, modify, merge, publish,
-+ * distribute, sub license, and/or sell copies of the Software, and to
-+ * permit persons to whom the Software is furnished to do so, subject to
-+ * the following conditions:
-+ *
-+ * The above copyright notice and this permission notice (including the
-+ * next paragraph) shall be included in all copies or substantial portions
-+ * of the Software.
-+ *
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
-+ * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
-+ * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-+ *
-+ **************************************************************************/
-+
-+#include "main/glheader.h"
-+#include "main/enums.h"
-+#include "main/image.h"
-+#include "main/mtypes.h"
-+#include "main/attrib.h"
-+#include "main/blend.h"
-+#include "main/bufferobj.h"
-+#include "main/buffers.h"
-+#include "main/depth.h"
-+#include "main/enable.h"
-+#include "main/macros.h"
-+#include "main/matrix.h"
-+#include "main/texstate.h"
-+#include "main/shaders.h"
-+#include "main/stencil.h"
-+#include "main/varray.h"
-+#include "glapi/dispatch.h"
-+#include "swrast/swrast.h"
-+
-+#include "intel_context.h"
-+#include "intel_blit.h"
-+#include "intel_chipset.h"
-+#include "intel_clear.h"
-+#include "intel_fbo.h"
-+#include "intel_pixel.h"
-+
-+#define FILE_DEBUG_FLAG DEBUG_BLIT
-+
-+#define TRI_CLEAR_COLOR_BITS (BUFFER_BIT_BACK_LEFT | \
-+ BUFFER_BIT_FRONT_LEFT | \
-+ BUFFER_BIT_COLOR0 | \
-+ BUFFER_BIT_COLOR1 | \
-+ BUFFER_BIT_COLOR2 | \
-+ BUFFER_BIT_COLOR3 | \
-+ BUFFER_BIT_COLOR4 | \
-+ BUFFER_BIT_COLOR5 | \
-+ BUFFER_BIT_COLOR6 | \
-+ BUFFER_BIT_COLOR7)
-+
-+/**
-+ * Perform glClear where mask contains only color, depth, and/or stencil.
-+ *
-+ * The implementation is based on calling into Mesa to set GL state and
-+ * performing normal triangle rendering. The intent of this path is to
-+ * have as generic a path as possible, so that any driver could make use of
-+ * it.
-+ */
-+void
-+intel_clear_tris(GLcontext *ctx, GLbitfield mask)
-+{
-+ struct intel_context *intel = intel_context(ctx);
-+ GLfloat vertices[4][3];
-+ GLfloat color[4][4];
-+ GLfloat dst_z;
-+ struct gl_framebuffer *fb = ctx->DrawBuffer;
-+ int i;
-+ GLboolean saved_fp_enable = GL_FALSE, saved_vp_enable = GL_FALSE;
-+ GLuint saved_shader_program = 0;
-+ unsigned int saved_active_texture;
-+
-+ assert((mask & ~(TRI_CLEAR_COLOR_BITS | BUFFER_BIT_DEPTH |
-+ BUFFER_BIT_STENCIL)) == 0);
-+
-+ _mesa_PushAttrib(GL_COLOR_BUFFER_BIT |
-+ GL_CURRENT_BIT |
-+ GL_DEPTH_BUFFER_BIT |
-+ GL_ENABLE_BIT |
-+ GL_STENCIL_BUFFER_BIT |
-+ GL_TRANSFORM_BIT |
-+ GL_CURRENT_BIT);
-+ _mesa_PushClientAttrib(GL_CLIENT_VERTEX_ARRAY_BIT);
-+ saved_active_texture = ctx->Texture.CurrentUnit;
-+
-+ /* Disable existing GL state we don't want to apply to a clear. */
-+ _mesa_Disable(GL_ALPHA_TEST);
-+ _mesa_Disable(GL_BLEND);
-+ _mesa_Disable(GL_CULL_FACE);
-+ _mesa_Disable(GL_FOG);
-+ _mesa_Disable(GL_POLYGON_SMOOTH);
-+ _mesa_Disable(GL_POLYGON_STIPPLE);
-+ _mesa_Disable(GL_POLYGON_OFFSET_FILL);
-+ _mesa_Disable(GL_LIGHTING);
-+ _mesa_Disable(GL_CLIP_PLANE0);
-+ _mesa_Disable(GL_CLIP_PLANE1);
-+ _mesa_Disable(GL_CLIP_PLANE2);
-+ _mesa_Disable(GL_CLIP_PLANE3);
-+ _mesa_Disable(GL_CLIP_PLANE4);
-+ _mesa_Disable(GL_CLIP_PLANE5);
-+ if (ctx->Extensions.ARB_fragment_program && ctx->FragmentProgram.Enabled) {
-+ saved_fp_enable = GL_TRUE;
-+ _mesa_Disable(GL_FRAGMENT_PROGRAM_ARB);
-+ }
-+ if (ctx->Extensions.ARB_vertex_program && ctx->VertexProgram.Enabled) {
-+ saved_vp_enable = GL_TRUE;
-+ _mesa_Disable(GL_VERTEX_PROGRAM_ARB);
-+ }
-+ if (ctx->Extensions.ARB_shader_objects && ctx->Shader.CurrentProgram) {
-+ saved_shader_program = ctx->Shader.CurrentProgram->Name;
-+ _mesa_UseProgramObjectARB(0);
-+ }
-+
-+ if (ctx->Texture._EnabledUnits != 0) {
-+ int i;
-+
-+ for (i = 0; i < ctx->Const.MaxTextureUnits; i++) {
-+ _mesa_ActiveTextureARB(GL_TEXTURE0 + i);
-+ _mesa_Disable(GL_TEXTURE_1D);
-+ _mesa_Disable(GL_TEXTURE_2D);
-+ _mesa_Disable(GL_TEXTURE_3D);
-+ if (ctx->Extensions.ARB_texture_cube_map)
-+ _mesa_Disable(GL_TEXTURE_CUBE_MAP_ARB);
-+ if (ctx->Extensions.NV_texture_rectangle)
-+ _mesa_Disable(GL_TEXTURE_RECTANGLE_NV);
-+ if (ctx->Extensions.MESA_texture_array) {
-+ _mesa_Disable(GL_TEXTURE_1D_ARRAY_EXT);
-+ _mesa_Disable(GL_TEXTURE_2D_ARRAY_EXT);
-+ }
-+ }
-+ }
-+
-+ intel_meta_set_passthrough_transform(intel);
-+
-+ for (i = 0; i < 4; i++) {
-+ color[i][0] = ctx->Color.ClearColor[0];
-+ color[i][1] = ctx->Color.ClearColor[1];
-+ color[i][2] = ctx->Color.ClearColor[2];
-+ color[i][3] = ctx->Color.ClearColor[3];
-+ }
-+
-+ /* convert clear Z from [0,1] to NDC coord in [-1,1] */
-+ dst_z = -1.0 + 2.0 * ctx->Depth.Clear;
-+
-+ /* Prepare the vertices, which are the same regardless of which buffer we're
-+ * drawing to.
-+ */
-+ vertices[0][0] = fb->_Xmin;
-+ vertices[0][1] = fb->_Ymin;
-+ vertices[0][2] = dst_z;
-+ vertices[1][0] = fb->_Xmax;
-+ vertices[1][1] = fb->_Ymin;
-+ vertices[1][2] = dst_z;
-+ vertices[2][0] = fb->_Xmax;
-+ vertices[2][1] = fb->_Ymax;
-+ vertices[2][2] = dst_z;
-+ vertices[3][0] = fb->_Xmin;
-+ vertices[3][1] = fb->_Ymax;
-+ vertices[3][2] = dst_z;
-+
-+ _mesa_ColorPointer(4, GL_FLOAT, 4 * sizeof(GLfloat), &color);
-+ _mesa_VertexPointer(3, GL_FLOAT, 3 * sizeof(GLfloat), &vertices);
-+ _mesa_Enable(GL_COLOR_ARRAY);
-+ _mesa_Enable(GL_VERTEX_ARRAY);
-+
-+ while (mask != 0) {
-+ GLuint this_mask = 0;
-+ GLuint color_bit;
-+
-+ color_bit = _mesa_ffs(mask & TRI_CLEAR_COLOR_BITS);
-+ if (color_bit != 0)
-+ this_mask |= (1 << (color_bit - 1));
-+
-+ /* Clear depth/stencil in the same pass as color. */
-+ this_mask |= (mask & (BUFFER_BIT_DEPTH | BUFFER_BIT_STENCIL));
-+
-+ /* Select the current color buffer and use the color write mask if
-+ * we have one, otherwise don't write any color channels.
-+ */
-+ if (this_mask & BUFFER_BIT_FRONT_LEFT)
-+ _mesa_DrawBuffer(GL_FRONT_LEFT);
-+ else if (this_mask & BUFFER_BIT_BACK_LEFT)
-+ _mesa_DrawBuffer(GL_BACK_LEFT);
-+ else if (color_bit != 0)
-+ _mesa_DrawBuffer(GL_COLOR_ATTACHMENT0 +
-+ (color_bit - BUFFER_COLOR0 - 1));
-+ else
-+ _mesa_ColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
-+
-+ /* Control writing of the depth clear value to depth. */
-+ if (this_mask & BUFFER_BIT_DEPTH) {
-+ _mesa_DepthFunc(GL_ALWAYS);
-+ _mesa_Enable(GL_DEPTH_TEST);
-+ } else {
-+ _mesa_Disable(GL_DEPTH_TEST);
-+ _mesa_DepthMask(GL_FALSE);
-+ }
-+
-+ /* Control writing of the stencil clear value to stencil. */
-+ if (this_mask & BUFFER_BIT_STENCIL) {
-+ _mesa_Enable(GL_STENCIL_TEST);
-+ _mesa_StencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
-+ _mesa_StencilFuncSeparate(GL_FRONT, GL_ALWAYS, ctx->Stencil.Clear,
-+ ctx->Stencil.WriteMask[0]);
-+ } else {
-+ _mesa_Disable(GL_STENCIL_TEST);
-+ }
-+
-+ CALL_DrawArrays(ctx->Exec, (GL_TRIANGLE_FAN, 0, 4));
-+
-+ mask &= ~this_mask;
-+ }
-+
-+ intel_meta_restore_transform(intel);
-+
-+ _mesa_ActiveTextureARB(GL_TEXTURE0 + saved_active_texture);
-+ if (saved_fp_enable)
-+ _mesa_Enable(GL_FRAGMENT_PROGRAM_ARB);
-+ if (saved_vp_enable)
-+ _mesa_Enable(GL_VERTEX_PROGRAM_ARB);
-+
-+ if (saved_shader_program)
-+ _mesa_UseProgramObjectARB(saved_shader_program);
-+
-+ _mesa_PopClientAttrib();
-+ _mesa_PopAttrib();
-+}
-+
-+static const char *buffer_names[] = {
-+ [BUFFER_FRONT_LEFT] = "front",
-+ [BUFFER_BACK_LEFT] = "back",
-+ [BUFFER_FRONT_RIGHT] = "front right",
-+ [BUFFER_BACK_RIGHT] = "back right",
-+ [BUFFER_AUX0] = "aux0",
-+ [BUFFER_AUX1] = "aux1",
-+ [BUFFER_AUX2] = "aux2",
-+ [BUFFER_AUX3] = "aux3",
-+ [BUFFER_DEPTH] = "depth",
-+ [BUFFER_STENCIL] = "stencil",
-+ [BUFFER_ACCUM] = "accum",
-+ [BUFFER_COLOR0] = "color0",
-+ [BUFFER_COLOR1] = "color1",
-+ [BUFFER_COLOR2] = "color2",
-+ [BUFFER_COLOR3] = "color3",
-+ [BUFFER_COLOR4] = "color4",
-+ [BUFFER_COLOR5] = "color5",
-+ [BUFFER_COLOR6] = "color6",
-+ [BUFFER_COLOR7] = "color7",
-+};
-+
-+/**
-+ * Called by ctx->Driver.Clear.
-+ */
-+static void
-+intelClear(GLcontext *ctx, GLbitfield mask)
-+{
-+ struct intel_context *intel = intel_context(ctx);
-+ const GLuint colorMask = *((GLuint *) & ctx->Color.ColorMask);
-+ GLbitfield tri_mask = 0;
-+ GLbitfield blit_mask = 0;
-+ GLbitfield swrast_mask = 0;
-+ struct gl_framebuffer *fb = ctx->DrawBuffer;
-+ GLuint i;
-+
-+ if (0)
-+ fprintf(stderr, "%s\n", __FUNCTION__);
-+
-+ /* HW color buffers (front, back, aux, generic FBO, etc) */
-+ if (colorMask == ~0) {
-+ /* clear all R,G,B,A */
-+ /* XXX FBO: need to check if colorbuffers are software RBOs! */
-+ blit_mask |= (mask & BUFFER_BITS_COLOR);
-+ }
-+ else {
-+ /* glColorMask in effect */
-+ tri_mask |= (mask & (BUFFER_BIT_FRONT_LEFT | BUFFER_BIT_BACK_LEFT));
-+ }
-+
-+ /* HW stencil */
-+ if (mask & BUFFER_BIT_STENCIL) {
-+ const struct intel_region *stencilRegion
-+ = intel_get_rb_region(fb, BUFFER_STENCIL);
-+ if (stencilRegion) {
-+ /* have hw stencil */
-+ if (IS_965(intel->intelScreen->deviceID) ||
-+ (ctx->Stencil.WriteMask[0] & 0xff) != 0xff) {
-+ /* We have to use the 3D engine if we're clearing a partial mask
-+ * of the stencil buffer, or if we're on a 965 which has a tiled
-+ * depth/stencil buffer in a layout we can't blit to.
-+ */
-+ tri_mask |= BUFFER_BIT_STENCIL;
-+ }
-+ else {
-+ /* clearing all stencil bits, use blitting */
-+ blit_mask |= BUFFER_BIT_STENCIL;
-+ }
-+ }
-+ }
-+
-+ /* HW depth */
-+ if (mask & BUFFER_BIT_DEPTH) {
-+ /* clear depth with whatever method is used for stencil (see above) */
-+ if (IS_965(intel->intelScreen->deviceID) ||
-+ tri_mask & BUFFER_BIT_STENCIL)
-+ tri_mask |= BUFFER_BIT_DEPTH;
-+ else
-+ blit_mask |= BUFFER_BIT_DEPTH;
-+ }
-+
-+ /* If we're doing a tri pass for depth/stencil, include a likely color
-+ * buffer with it.
-+ */
-+ if (mask & (BUFFER_BIT_DEPTH | BUFFER_BIT_STENCIL)) {
-+ int color_bit = _mesa_ffs(mask & TRI_CLEAR_COLOR_BITS);
-+ if (color_bit != 0) {
-+ tri_mask |= blit_mask & (1 << (color_bit - 1));
-+ blit_mask &= ~(1 << (color_bit - 1));
-+ }
-+ }
-+
-+ /* SW fallback clearing */
-+ swrast_mask = mask & ~tri_mask & ~blit_mask;
-+
-+ for (i = 0; i < BUFFER_COUNT; i++) {
-+ GLuint bufBit = 1 << i;
-+ if ((blit_mask | tri_mask) & bufBit) {
-+ if (!fb->Attachment[i].Renderbuffer->ClassID) {
-+ blit_mask &= ~bufBit;
-+ tri_mask &= ~bufBit;
-+ swrast_mask |= bufBit;
-+ }
-+ }
-+ }
-+
-+ if (blit_mask) {
-+ if (INTEL_DEBUG & DEBUG_BLIT) {
-+ DBG("blit clear:");
-+ for (i = 0; i < BUFFER_COUNT; i++) {
-+ if (blit_mask & (1 << i))
-+ DBG(" %s", buffer_names[i]);
-+ }
-+ DBG("\n");
-+ }
-+ intelClearWithBlit(ctx, blit_mask);
-+ }
-+
-+ if (tri_mask) {
-+ if (INTEL_DEBUG & DEBUG_BLIT) {
-+ DBG("tri clear:");
-+ for (i = 0; i < BUFFER_COUNT; i++) {
-+ if (tri_mask & (1 << i))
-+ DBG(" %s", buffer_names[i]);
-+ }
-+ DBG("\n");
-+ }
-+ intel_clear_tris(ctx, tri_mask);
-+ }
-+
-+ if (swrast_mask) {
-+ if (INTEL_DEBUG & DEBUG_BLIT) {
-+ DBG("swrast clear:");
-+ for (i = 0; i < BUFFER_COUNT; i++) {
-+ if (swrast_mask & (1 << i))
-+ DBG(" %s", buffer_names[i]);
-+ }
-+ DBG("\n");
-+ }
-+ _swrast_Clear(ctx, swrast_mask);
-+ }
-+}
-+
-+
-+void
-+intelInitClearFuncs(struct dd_function_table *functions)
-+{
-+ functions->Clear = intelClear;
-+}
-diff --git a/src/mesa/drivers/dri/intel/intel_clear.h b/src/mesa/drivers/dri/intel/intel_clear.h
-new file mode 100644
-index 0000000..7fd6b31
---- /dev/null
-+++ b/src/mesa/drivers/dri/intel/intel_clear.h
-@@ -0,0 +1,38 @@
-+
-+/**************************************************************************
-+ *
-+ * Copyright 2006 Tungsten Graphics, Inc., Cedar Park, Texas.
-+ * All Rights Reserved.
-+ *
-+ * Permission is hereby granted, free of charge, to any person obtaining a
-+ * copy of this software and associated documentation files (the
-+ * "Software"), to deal in the Software without restriction, including
-+ * without limitation the rights to use, copy, modify, merge, publish,
-+ * distribute, sub license, and/or sell copies of the Software, and to
-+ * permit persons to whom the Software is furnished to do so, subject to
-+ * the following conditions:
-+ *
-+ * The above copyright notice and this permission notice (including the
-+ * next paragraph) shall be included in all copies or substantial portions
-+ * of the Software.
-+ *
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
-+ * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
-+ * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-+ *
-+ **************************************************************************/
-+
-+#ifndef INTEL_CLEAR_H
-+#define INTEL_CLEAR_H
-+
-+struct dd_function_table;
-+
-+extern void
-+intelInitClearFuncs(struct dd_function_table *functions);
-+
-+
-+#endif /* INTEL_CLEAR_H */
-diff --git a/src/mesa/drivers/dri/intel/intel_context.c b/src/mesa/drivers/dri/intel/intel_context.c
-index c4a24d7..1aa173d 100644
---- a/src/mesa/drivers/dri/intel/intel_context.c
-+++ b/src/mesa/drivers/dri/intel/intel_context.c
-@@ -28,8 +28,6 @@
-
- #include "main/glheader.h"
- #include "main/context.h"
--#include "main/matrix.h"
--#include "main/simple_list.h"
- #include "main/extensions.h"
- #include "main/framebuffer.h"
- #include "main/imports.h"
-@@ -38,66 +36,40 @@
- #include "swrast/swrast.h"
- #include "swrast_setup/swrast_setup.h"
- #include "tnl/tnl.h"
--
--#include "tnl/t_pipeline.h"
--#include "tnl/t_vertex.h"
--
- #include "drivers/common/driverfuncs.h"
-
--#include "intel_screen.h"
--
- #include "i830_dri.h"
-
- #include "intel_chipset.h"
- #include "intel_buffers.h"
- #include "intel_tex.h"
- #include "intel_batchbuffer.h"
--#include "intel_blit.h"
-+#include "intel_clear.h"
-+#include "intel_extensions.h"
- #include "intel_pixel.h"
- #include "intel_regions.h"
- #include "intel_buffer_objects.h"
- #include "intel_fbo.h"
- #include "intel_decode.h"
- #include "intel_bufmgr.h"
-+#include "intel_screen.h"
-+#include "intel_swapbuffers.h"
-
- #include "drirenderbuffer.h"
- #include "vblank.h"
- #include "utils.h"
- #include "xmlpool.h" /* for symbolic values of enum-type options */
-+
-+
- #ifndef INTEL_DEBUG
- int INTEL_DEBUG = (0);
- #endif
-
--#define need_GL_ARB_multisample
--#define need_GL_ARB_occlusion_query
--#define need_GL_ARB_point_parameters
--#define need_GL_ARB_shader_objects
--#define need_GL_ARB_texture_compression
--#define need_GL_ARB_vertex_buffer_object
--#define need_GL_ARB_vertex_program
--#define need_GL_ARB_vertex_shader
--#define need_GL_ARB_window_pos
--#define need_GL_EXT_blend_color
--#define need_GL_EXT_blend_equation_separate
--#define need_GL_EXT_blend_func_separate
--#define need_GL_EXT_blend_minmax
--#define need_GL_EXT_cull_vertex
--#define need_GL_EXT_fog_coord
--#define need_GL_EXT_framebuffer_object
--#define need_GL_EXT_multi_draw_arrays
--#define need_GL_EXT_point_parameters
--#define need_GL_EXT_secondary_color
--#define need_GL_ATI_separate_stencil
--#define need_GL_NV_point_sprite
--#define need_GL_NV_vertex_program
--#define need_GL_VERSION_2_0
--#define need_GL_VERSION_2_1
--
--#include "extension_helper.h"
-
- #define DRIVER_DATE "20090114"
- #define DRIVER_DATE_GEM "GEM " DRIVER_DATE
-
-+
- static const GLubyte *
- intelGetString(GLcontext * ctx, GLenum name)
- {
-@@ -282,6 +254,9 @@ intel_update_renderbuffers(__DRIcontext *context, __DRIdrawable *drawable)
- return;
- }
-
-+ if (rb == NULL)
-+ continue;
-+
- if (rb->region) {
- dri_bo_flink(rb->region->buffer, &name);
- if (name == buffers[i].name)
-@@ -340,112 +315,6 @@ intel_viewport(GLcontext *ctx, GLint x, GLint y, GLsizei w, GLsizei h)
- ctx->Driver.Viewport = old_viewport;
- }
-
--/**
-- * Extension strings exported by the intel driver.
-- *
-- * Extensions supported by all chips supported by i830_dri, i915_dri, or
-- * i965_dri.
-- */
--static const struct dri_extension card_extensions[] = {
-- { "GL_ARB_multisample", GL_ARB_multisample_functions },
-- { "GL_ARB_multitexture", NULL },
-- { "GL_ARB_point_parameters", GL_ARB_point_parameters_functions },
-- { "GL_ARB_texture_border_clamp", NULL },
-- { "GL_ARB_texture_compression", GL_ARB_texture_compression_functions },
-- { "GL_ARB_texture_cube_map", NULL },
-- { "GL_ARB_texture_env_add", NULL },
-- { "GL_ARB_texture_env_combine", NULL },
-- { "GL_ARB_texture_env_crossbar", NULL },
-- { "GL_ARB_texture_env_dot3", NULL },
-- { "GL_ARB_texture_mirrored_repeat", NULL },
-- { "GL_ARB_texture_rectangle", NULL },
-- { "GL_ARB_vertex_buffer_object", GL_ARB_vertex_buffer_object_functions },
-- { "GL_ARB_vertex_program", GL_ARB_vertex_program_functions },
-- { "GL_ARB_window_pos", GL_ARB_window_pos_functions },
-- { "GL_EXT_blend_color", GL_EXT_blend_color_functions },
-- { "GL_EXT_blend_equation_separate", GL_EXT_blend_equation_separate_functions },
-- { "GL_EXT_blend_func_separate", GL_EXT_blend_func_separate_functions },
-- { "GL_EXT_blend_minmax", GL_EXT_blend_minmax_functions },
-- { "GL_EXT_blend_logic_op", NULL },
-- { "GL_EXT_blend_subtract", NULL },
-- { "GL_EXT_cull_vertex", GL_EXT_cull_vertex_functions },
-- { "GL_EXT_fog_coord", GL_EXT_fog_coord_functions },
-- { "GL_EXT_multi_draw_arrays", GL_EXT_multi_draw_arrays_functions },
-- { "GL_EXT_packed_depth_stencil", NULL },
-- { "GL_EXT_secondary_color", GL_EXT_secondary_color_functions },
-- { "GL_EXT_stencil_wrap", NULL },
-- { "GL_EXT_texture_edge_clamp", NULL },
-- { "GL_EXT_texture_env_combine", NULL },
-- { "GL_EXT_texture_env_dot3", NULL },
-- { "GL_EXT_texture_filter_anisotropic", NULL },
-- { "GL_EXT_texture_lod_bias", NULL },
-- { "GL_3DFX_texture_compression_FXT1", NULL },
-- { "GL_APPLE_client_storage", NULL },
-- { "GL_MESA_pack_invert", NULL },
-- { "GL_MESA_ycbcr_texture", NULL },
-- { "GL_NV_blend_square", NULL },
-- { "GL_NV_point_sprite", GL_NV_point_sprite_functions },
-- { "GL_NV_vertex_program", GL_NV_vertex_program_functions },
-- { "GL_NV_vertex_program1_1", NULL },
-- { "GL_SGIS_generate_mipmap", NULL },
-- { NULL, NULL }
--};
--
--static const struct dri_extension brw_extensions[] = {
-- { "GL_ARB_depth_texture", NULL },
-- { "GL_ARB_draw_buffers", NULL },
-- { "GL_ARB_fragment_program", NULL },
-- { "GL_ARB_fragment_program_shadow", NULL },
-- { "GL_ARB_fragment_shader", NULL },
-- { "GL_ARB_occlusion_query", GL_ARB_occlusion_query_functions },
-- { "GL_ARB_point_sprite", NULL },
-- { "GL_ARB_shader_objects", GL_ARB_shader_objects_functions },
-- { "GL_ARB_shading_language_100", GL_VERSION_2_0_functions },
--#if 0
-- /* Support for GLSL 1.20 is currently broken in core Mesa.
-- */
-- { "GL_ARB_shading_language_120", GL_VERSION_2_1_functions },
--#endif
-- { "GL_ARB_shadow", NULL },
-- { "GL_ARB_texture_non_power_of_two", NULL },
-- { "GL_ARB_vertex_shader", GL_ARB_vertex_shader_functions },
-- { "GL_EXT_shadow_funcs", NULL },
-- { "GL_EXT_texture_sRGB", NULL },
-- { "GL_ATI_separate_stencil", GL_ATI_separate_stencil_functions },
-- { "GL_ATI_texture_env_combine3", NULL },
-- { NULL, NULL }
--};
--
--static const struct dri_extension arb_oq_extensions[] = {
-- { NULL, NULL }
--};
--
--static const struct dri_extension ttm_extensions[] = {
-- { "GL_ARB_pixel_buffer_object", NULL },
-- { "GL_EXT_framebuffer_object", GL_EXT_framebuffer_object_functions },
-- { NULL, NULL }
--};
--
--/**
-- * Initializes potential list of extensions if ctx == NULL, or actually enables
-- * extensions for a context.
-- */
--void intelInitExtensions(GLcontext *ctx, GLboolean enable_imaging)
--{
-- struct intel_context *intel = ctx?intel_context(ctx):NULL;
--
-- /* Disable imaging extension until convolution is working in teximage paths.
-- */
-- enable_imaging = GL_FALSE;
--
-- driInitExtensions(ctx, card_extensions, enable_imaging);
--
-- if (intel == NULL || intel->ttm)
-- driInitExtensions(ctx, ttm_extensions, GL_FALSE);
--
-- if (intel == NULL || IS_965(intel->intelScreen->deviceID))
-- driInitExtensions(ctx, brw_extensions, GL_FALSE);
--}
-
- static const struct dri_debug_control debug_control[] = {
- { "tex", DEBUG_TEXTURE},
-@@ -496,9 +365,8 @@ intelInvalidateState(GLcontext * ctx, GLuint new_state)
- intel->vtbl.invalidate_state( intel, new_state );
- }
-
--
--void
--intelFlush(GLcontext * ctx)
-+static void
-+intel_flush(GLcontext *ctx, GLboolean needs_mi_flush)
- {
- struct intel_context *intel = intel_context(ctx);
-
-@@ -512,13 +380,26 @@ intelFlush(GLcontext * ctx)
- * lands onscreen in a timely manner, even if the X Server doesn't trigger
- * a flush for us.
- */
-- intel_batchbuffer_emit_mi_flush(intel->batch);
-+ if (needs_mi_flush)
-+ intel_batchbuffer_emit_mi_flush(intel->batch);
-
- if (intel->batch->map != intel->batch->ptr)
- intel_batchbuffer_flush(intel->batch);
- }
-
- void
-+intelFlush(GLcontext * ctx)
-+{
-+ intel_flush(ctx, GL_FALSE);
-+}
-+
-+static void
-+intel_glFlush(GLcontext *ctx)
-+{
-+ intel_flush(ctx, GL_TRUE);
-+}
-+
-+void
- intelFinish(GLcontext * ctx)
- {
- struct gl_framebuffer *fb = ctx->DrawBuffer;
-@@ -544,7 +425,7 @@ intelInitDriverFunctions(struct dd_function_table *functions)
- {
- _mesa_init_driver_functions(functions);
-
-- functions->Flush = intelFlush;
-+ functions->Flush = intel_glFlush;
- functions->Finish = intelFinish;
- functions->GetString = intelGetString;
- functions->UpdateState = intelInvalidateState;
-@@ -556,6 +437,7 @@ intelInitDriverFunctions(struct dd_function_table *functions)
-
- intelInitTextureFuncs(functions);
- intelInitStateFuncs(functions);
-+ intelInitClearFuncs(functions);
- intelInitBufferFuncs(functions);
- intelInitPixelFuncs(functions);
- }
-@@ -691,8 +573,6 @@ intelInitContext(struct intel_context *intel,
-
- intel->do_usleeps = (fthrottle_mode == DRI_CONF_FTHROTTLE_USLEEPS);
-
-- _math_matrix_ctr(&intel->ViewportMatrix);
--
- if (IS_965(intelScreen->deviceID) && !intel->intelScreen->irq_active) {
- _mesa_printf("IRQs not active. Exiting\n");
- exit(1);
-@@ -858,6 +738,11 @@ intelMakeCurrent(__DRIcontextPrivate * driContextPriv,
- ? driGetDefaultVBlankFlags(&intel->optionCache)
- : VBLANK_FLAG_NO_IRQ;
-
-+ /* Prevent error printf if one crtc is disabled, this will
-+ * be properly calculated in intelWindowMoved() next.
-+ */
-+ driDrawPriv->vblFlags = intelFixupVblank(intel, driDrawPriv);
-+
- (*psp->systemTime->getUST) (&intel_fb->swap_ust);
- driDrawableInitVBlank(driDrawPriv);
- intel_fb->vbl_waited = driDrawPriv->vblSeq;
-diff --git a/src/mesa/drivers/dri/intel/intel_context.h b/src/mesa/drivers/dri/intel/intel_context.h
-index 048286c..18dc43c 100644
---- a/src/mesa/drivers/dri/intel/intel_context.h
-+++ b/src/mesa/drivers/dri/intel/intel_context.h
-@@ -168,6 +168,7 @@ struct intel_context
-
- GLint saved_vp_x, saved_vp_y;
- GLsizei saved_vp_width, saved_vp_height;
-+ GLenum saved_matrix_mode;
- } meta;
-
- GLint refcount;
-@@ -209,7 +210,6 @@ struct intel_context
- char *prevLockFile;
- int prevLockLine;
-
-- GLubyte clear_chan[4];
- GLuint ClearColor565;
- GLuint ClearColor8888;
-
-@@ -437,7 +437,6 @@ extern void intelFinish(GLcontext * ctx);
- extern void intelFlush(GLcontext * ctx);
-
- extern void intelInitDriverFunctions(struct dd_function_table *functions);
--extern void intelInitExtensions(GLcontext *ctx, GLboolean enable_imaging);
-
-
- /* ================================================================
-diff --git a/src/mesa/drivers/dri/intel/intel_decode.c b/src/mesa/drivers/dri/intel/intel_decode.c
-index 5f90ca2..136221c 100644
---- a/src/mesa/drivers/dri/intel/intel_decode.c
-+++ b/src/mesa/drivers/dri/intel/intel_decode.c
-@@ -87,27 +87,28 @@ decode_mi(uint32_t *data, int count, uint32_t hw_offset, int *failures)
-
- struct {
- uint32_t opcode;
-+ int len_mask;
- int min_len;
- int max_len;
- char *name;
- } opcodes_mi[] = {
-- { 0x08, 1, 1, "MI_ARB_ON_OFF" },
-- { 0x0a, 1, 1, "MI_BATCH_BUFFER_END" },
-- { 0x31, 2, 2, "MI_BATCH_BUFFER_START" },
-- { 0x14, 3, 3, "MI_DISPLAY_BUFFER_INFO" },
-- { 0x04, 1, 1, "MI_FLUSH" },
-- { 0x22, 3, 3, "MI_LOAD_REGISTER_IMM" },
-- { 0x13, 2, 2, "MI_LOAD_SCAN_LINES_EXCL" },
-- { 0x12, 2, 2, "MI_LOAD_SCAN_LINES_INCL" },
-- { 0x00, 1, 1, "MI_NOOP" },
-- { 0x11, 2, 2, "MI_OVERLAY_FLIP" },
-- { 0x07, 1, 1, "MI_REPORT_HEAD" },
-- { 0x18, 2, 2, "MI_SET_CONTEXT" },
-- { 0x20, 3, 4, "MI_STORE_DATA_IMM" },
-- { 0x21, 3, 4, "MI_STORE_DATA_INDEX" },
-- { 0x24, 3, 3, "MI_STORE_REGISTER_MEM" },
-- { 0x02, 1, 1, "MI_USER_INTERRUPT" },
-- { 0x03, 1, 1, "MI_WAIT_FOR_EVENT" },
-+ { 0x08, 0, 1, 1, "MI_ARB_ON_OFF" },
-+ { 0x0a, 0, 1, 1, "MI_BATCH_BUFFER_END" },
-+ { 0x31, 0x3f, 2, 2, "MI_BATCH_BUFFER_START" },
-+ { 0x14, 0x3f, 3, 3, "MI_DISPLAY_BUFFER_INFO" },
-+ { 0x04, 0, 1, 1, "MI_FLUSH" },
-+ { 0x22, 0, 3, 3, "MI_LOAD_REGISTER_IMM" },
-+ { 0x13, 0x3f, 2, 2, "MI_LOAD_SCAN_LINES_EXCL" },
-+ { 0x12, 0x3f, 2, 2, "MI_LOAD_SCAN_LINES_INCL" },
-+ { 0x00, 0, 1, 1, "MI_NOOP" },
-+ { 0x11, 0x3f, 2, 2, "MI_OVERLAY_FLIP" },
-+ { 0x07, 0, 1, 1, "MI_REPORT_HEAD" },
-+ { 0x18, 0x3f, 2, 2, "MI_SET_CONTEXT" },
-+ { 0x20, 0x3f, 3, 4, "MI_STORE_DATA_IMM" },
-+ { 0x21, 0x3f, 3, 4, "MI_STORE_DATA_INDEX" },
-+ { 0x24, 0x3f, 3, 3, "MI_STORE_REGISTER_MEM" },
-+ { 0x02, 0, 1, 1, "MI_USER_INTERRUPT" },
-+ { 0x03, 0, 1, 1, "MI_WAIT_FOR_EVENT" },
- };
-
-
-@@ -118,12 +119,14 @@ decode_mi(uint32_t *data, int count, uint32_t hw_offset, int *failures)
-
- instr_out(data, hw_offset, 0, "%s\n", opcodes_mi[opcode].name);
- if (opcodes_mi[opcode].max_len > 1) {
-- len = (data[0] & 0x000000ff) + 2;
-+ len = (data[0] & opcodes_mi[opcode].len_mask) + 2;
- if (len < opcodes_mi[opcode].min_len ||
- len > opcodes_mi[opcode].max_len)
- {
-- fprintf(out, "Bad length in %s\n",
-- opcodes_mi[opcode].name);
-+ fprintf(out, "Bad length (%d) in %s, [%d, %d]\n",
-+ len, opcodes_mi[opcode].name,
-+ opcodes_mi[opcode].min_len,
-+ opcodes_mi[opcode].max_len);
- }
- }
-
-@@ -932,7 +935,7 @@ decode_3d_1d(uint32_t *data, int count, uint32_t hw_offset, int *failures, int i
- instr_out(data, hw_offset, 0, "3DSTATE_PIXEL_SHADER_CONSTANTS\n");
- len = (data[0] & 0x000000ff) + 2;
-
-- i = 1;
-+ i = 2;
- for (c = 0; c <= 31; c++) {
- if (data[1] & (1 << c)) {
- if (i + 4 >= count)
-@@ -952,7 +955,7 @@ decode_3d_1d(uint32_t *data, int count, uint32_t hw_offset, int *failures, int i
- }
- }
- if (len != i) {
-- fprintf(out, "Bad count in 3DSTATE_MAP_STATE\n");
-+ fprintf(out, "Bad count in 3DSTATE_PIXEL_SHADER_CONSTANTS\n");
- (*failures)++;
- }
- return len;
-diff --git a/src/mesa/drivers/dri/intel/intel_depthstencil.c b/src/mesa/drivers/dri/intel/intel_depthstencil.c
-deleted file mode 100644
-index 354b3bf..0000000
---- a/src/mesa/drivers/dri/intel/intel_depthstencil.c
-+++ /dev/null
-@@ -1,261 +0,0 @@
--/**************************************************************************
-- *
-- * Copyright 2006 Tungsten Graphics, Inc., Cedar Park, Texas.
-- * All Rights Reserved.
-- *
-- * Permission is hereby granted, free of charge, to any person obtaining a
-- * copy of this software and associated documentation files (the
-- * "Software"), to deal in the Software without restriction, including
-- * without limitation the rights to use, copy, modify, merge, publish,
-- * distribute, sub license, and/or sell copies of the Software, and to
-- * permit persons to whom the Software is furnished to do so, subject to
-- * the following conditions:
-- *
-- * The above copyright notice and this permission notice (including the
-- * next paragraph) shall be included in all copies or substantial portions
-- * of the Software.
-- *
-- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
-- * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
-- * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-- *
-- **************************************************************************/
--
--#include "main/glheader.h"
--#include "main/imports.h"
--#include "main/context.h"
--#include "main/depthstencil.h"
--#include "main/fbobject.h"
--#include "main/framebuffer.h"
--#include "main/hash.h"
--#include "main/mtypes.h"
--#include "main/renderbuffer.h"
--
--#include "intel_context.h"
--#include "intel_fbo.h"
--#include "intel_depthstencil.h"
--#include "intel_regions.h"
--#include "intel_span.h"
--
--/**
-- * The GL_EXT_framebuffer_object allows the user to create their own
-- * framebuffer objects consisting of color renderbuffers (0 or more),
-- * depth renderbuffers (0 or 1) and stencil renderbuffers (0 or 1).
-- *
-- * The spec considers depth and stencil renderbuffers to be totally independent
-- * buffers. In reality, most graphics hardware today uses a combined
-- * depth+stencil buffer (one 32-bit pixel = 24 bits of Z + 8 bits of stencil).
-- *
-- * This causes difficulty because the user may create some number of depth
-- * renderbuffers and some number of stencil renderbuffers and bind them
-- * together in framebuffers in any combination.
-- *
-- * This code manages all that.
-- *
-- * 1. Depth renderbuffers are always allocated in hardware as 32bpp
-- * GL_DEPTH24_STENCIL8 buffers.
-- *
-- * 2. Stencil renderbuffers are initially allocated in software as 8bpp
-- * GL_STENCIL_INDEX8 buffers.
-- *
-- * 3. Depth and Stencil renderbuffers use the PairedStencil and PairedDepth
-- * fields (respectively) to indicate if the buffer's currently paired
-- * with another stencil or depth buffer (respectively).
-- *
-- * 4. When a depth and stencil buffer are initially both attached to the
-- * current framebuffer, we merge the stencil buffer values into the
-- * depth buffer (really a depth+stencil buffer). The then hardware uses
-- * the combined buffer.
-- *
-- * 5. Whenever a depth or stencil buffer is reallocated (with
-- * glRenderbufferStorage) we undo the pairing and copy the stencil values
-- * from the combined depth/stencil buffer back to the stencil-only buffer.
-- *
-- * 6. We also undo the pairing when we find a change in buffer bindings.
-- *
-- * 7. If a framebuffer is only using a depth renderbuffer (no stencil), we
-- * just use the combined depth/stencil buffer and ignore the stencil values.
-- *
-- * 8. If a framebuffer is only using a stencil renderbuffer (no depth) we have
-- * to promote the 8bpp software stencil buffer to a 32bpp hardware
-- * depth+stencil buffer.
-- *
-- */
--
--/**
-- * Undo the pairing/interleaving between depth and stencil buffers.
-- * irb should be a depth/stencil or stencil renderbuffer.
-- */
--void
--intel_unpair_depth_stencil(GLcontext *ctx, struct intel_renderbuffer *irb)
--{
-- struct intel_context *intel = intel_context(ctx);
-- struct gl_renderbuffer *rb = &irb->Base;
--
-- if (irb->PairedStencil) {
-- /* irb is a depth/stencil buffer */
-- struct gl_renderbuffer *stencilRb;
-- struct intel_renderbuffer *stencilIrb;
--
-- ASSERT(rb->_ActualFormat == GL_DEPTH24_STENCIL8_EXT);
--
-- stencilRb = _mesa_lookup_renderbuffer(ctx, irb->PairedStencil);
-- stencilIrb = intel_renderbuffer(stencilRb);
-- if (stencilIrb) {
-- /* need to extract stencil values from the depth buffer */
-- ASSERT(stencilIrb->PairedDepth == rb->Name);
-- intel_renderbuffer_map(intel, rb);
-- intel_renderbuffer_map(intel, stencilRb);
--#if 0
-- /* disable for now */
-- _mesa_extract_stencil(ctx, rb, stencilRb);
--#endif
-- intel_renderbuffer_unmap(intel, stencilRb);
-- intel_renderbuffer_unmap(intel, rb);
-- stencilIrb->PairedDepth = 0;
-- }
-- irb->PairedStencil = 0;
-- }
-- else if (irb->PairedDepth) {
-- /* irb is a stencil buffer */
-- struct gl_renderbuffer *depthRb;
-- struct intel_renderbuffer *depthIrb;
--
-- ASSERT(rb->_ActualFormat == GL_STENCIL_INDEX8_EXT ||
-- rb->_ActualFormat == GL_DEPTH24_STENCIL8_EXT);
--
-- depthRb = _mesa_lookup_renderbuffer(ctx, irb->PairedDepth);
-- depthIrb = intel_renderbuffer(depthRb);
-- if (depthIrb) {
-- /* need to extract stencil values from the depth buffer */
-- ASSERT(depthIrb->PairedStencil == rb->Name);
-- intel_renderbuffer_map(intel, rb);
-- intel_renderbuffer_map(intel, depthRb);
--#if 0
-- /* disable for now */
-- _mesa_extract_stencil(ctx, depthRb, rb);
--#endif
-- intel_renderbuffer_unmap(intel, depthRb);
-- intel_renderbuffer_unmap(intel, rb);
-- depthIrb->PairedStencil = 0;
-- }
-- irb->PairedDepth = 0;
-- }
-- else {
-- _mesa_problem(ctx, "Problem in undo_depth_stencil_pairing");
-- }
--
-- ASSERT(irb->PairedStencil == 0);
-- ASSERT(irb->PairedDepth == 0);
--}
--
--
--/**
-- * Examine the depth and stencil renderbuffers which are attached to the
-- * framebuffer. If both depth and stencil are attached, make sure that the
-- * renderbuffers are 'paired' (combined). If only depth or only stencil is
-- * attached, undo any previous pairing.
-- *
-- * Must be called if NewState & _NEW_BUFFER (when renderbuffer attachments
-- * change, for example).
-- */
--void
--intel_validate_paired_depth_stencil(GLcontext * ctx,
-- struct gl_framebuffer *fb)
--{
-- struct intel_context *intel = intel_context(ctx);
-- struct intel_renderbuffer *depthRb, *stencilRb;
--
-- depthRb = intel_get_renderbuffer(fb, BUFFER_DEPTH);
-- stencilRb = intel_get_renderbuffer(fb, BUFFER_STENCIL);
--
-- if (depthRb && stencilRb) {
-- if (depthRb == stencilRb) {
-- /* Using a user-created combined depth/stencil buffer.
-- * Nothing to do.
-- */
-- ASSERT(depthRb->Base._BaseFormat == GL_DEPTH_STENCIL_EXT);
-- ASSERT(depthRb->Base._ActualFormat == GL_DEPTH24_STENCIL8_EXT);
-- }
-- else {
-- /* Separate depth/stencil buffers, need to interleave now */
-- ASSERT(depthRb->Base._BaseFormat == GL_DEPTH_COMPONENT ||
-- depthRb->Base._BaseFormat == GL_DEPTH_STENCIL);
-- ASSERT(stencilRb->Base._BaseFormat == GL_STENCIL_INDEX ||
-- stencilRb->Base._BaseFormat == GL_DEPTH_STENCIL);
--
-- /* may need to interleave depth/stencil now */
-- if (depthRb->PairedStencil == stencilRb->Base.Name) {
-- /* OK, the depth and stencil buffers are already interleaved */
-- ASSERT(stencilRb->PairedDepth == depthRb->Base.Name);
-- }
-- else {
-- /* need to setup new pairing/interleaving */
-- if (depthRb->PairedStencil) {
-- intel_unpair_depth_stencil(ctx, depthRb);
-- }
-- if (stencilRb->PairedDepth) {
-- intel_unpair_depth_stencil(ctx, stencilRb);
-- }
--
-- ASSERT(depthRb->Base._ActualFormat == GL_DEPTH24_STENCIL8_EXT);
-- ASSERT(stencilRb->Base._ActualFormat == GL_STENCIL_INDEX8_EXT ||
-- stencilRb->Base._ActualFormat == GL_DEPTH24_STENCIL8_EXT);
--
-- /* establish new pairing: interleave stencil into depth buffer */
-- intel_renderbuffer_map(intel, &depthRb->Base);
-- intel_renderbuffer_map(intel, &stencilRb->Base);
-- _mesa_insert_stencil(ctx, &depthRb->Base, &stencilRb->Base);
-- intel_renderbuffer_unmap(intel, &stencilRb->Base);
-- intel_renderbuffer_unmap(intel, &depthRb->Base);
-- depthRb->PairedStencil = stencilRb->Base.Name;
-- stencilRb->PairedDepth = depthRb->Base.Name;
-- }
--
-- }
-- }
-- else if (depthRb) {
-- /* Depth buffer but no stencil buffer.
-- * We'll use a GL_DEPTH24_STENCIL8 buffer and ignore the stencil bits.
-- */
-- /* can't assert this until storage is allocated:
-- ASSERT(depthRb->Base._ActualFormat == GL_DEPTH24_STENCIL8_EXT);
-- */
-- /* intel_undo any previous pairing */
-- if (depthRb->PairedStencil) {
-- intel_unpair_depth_stencil(ctx, depthRb);
-- }
-- }
-- else if (stencilRb) {
-- /* Stencil buffer but no depth buffer.
-- * Since h/w doesn't typically support just 8bpp stencil w/out Z,
-- * we'll use a GL_DEPTH24_STENCIL8 buffer and ignore the depth bits.
-- */
-- /* undo any previous pairing */
-- if (stencilRb->PairedDepth) {
-- intel_unpair_depth_stencil(ctx, stencilRb);
-- }
-- if (stencilRb->Base._ActualFormat == GL_STENCIL_INDEX8_EXT) {
-- /* promote buffer to GL_DEPTH24_STENCIL8 for hw rendering */
-- _mesa_promote_stencil(ctx, &stencilRb->Base);
-- ASSERT(stencilRb->Base._ActualFormat == GL_DEPTH24_STENCIL8_EXT);
-- }
-- }
--
-- /* Finally, update the fb->_DepthBuffer and fb->_StencilBuffer fields */
-- _mesa_update_depth_buffer(ctx, fb, BUFFER_DEPTH);
-- if (depthRb && depthRb->PairedStencil)
-- _mesa_update_stencil_buffer(ctx, fb, BUFFER_DEPTH);
-- else
-- _mesa_update_stencil_buffer(ctx, fb, BUFFER_STENCIL);
--
--
-- /* The hardware should use fb->Attachment[BUFFER_DEPTH].Renderbuffer
-- * first, if present, then fb->Attachment[BUFFER_STENCIL].Renderbuffer
-- * if present.
-- */
--}
-diff --git a/src/mesa/drivers/dri/intel/intel_depthstencil.h b/src/mesa/drivers/dri/intel/intel_depthstencil.h
-deleted file mode 100644
-index 740eb0d..0000000
---- a/src/mesa/drivers/dri/intel/intel_depthstencil.h
-+++ /dev/null
-@@ -1,15 +0,0 @@
--
--#ifndef INTEL_DEPTH_STENCIL_H
--#define INTEL_DEPTH_STENCIL_H
--
--#include "intel_fbo.h"
--
--extern void
--intel_unpair_depth_stencil(GLcontext * ctx, struct intel_renderbuffer *irb);
--
--extern void
--intel_validate_paired_depth_stencil(GLcontext * ctx,
-- struct gl_framebuffer *fb);
--
--
--#endif /* INTEL_DEPTH_STENCIL_H */
-diff --git a/src/mesa/drivers/dri/intel/intel_depthtmp.h b/src/mesa/drivers/dri/intel/intel_depthtmp.h
-new file mode 100644
-index 0000000..16d7708
---- /dev/null
-+++ b/src/mesa/drivers/dri/intel/intel_depthtmp.h
-@@ -0,0 +1,54 @@
-+/*
-+ * Copyright © 2009 Intel Corporation
-+ *
-+ * Permission is hereby granted, free of charge, to any person obtaining a
-+ * copy of this software and associated documentation files (the "Software"),
-+ * to deal in the Software without restriction, including without limitation
-+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
-+ * and/or sell copies of the Software, and to permit persons to whom the
-+ * Software is furnished to do so, subject to the following conditions:
-+ *
-+ * The above copyright notice and this permission notice (including the next
-+ * paragraph) shall be included in all copies or substantial portions of the
-+ * Software.
-+ *
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
-+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-+ * IN THE SOFTWARE.
-+ *
-+ * Authors:
-+ * Eric Anholt <eric@anholt.net>
-+ *
-+ */
-+
-+/**
-+ * Wrapper around the depthtmp.h macrofest to generate spans code for
-+ * all the tiling styles.
-+ */
-+
-+#define VALUE_TYPE INTEL_VALUE_TYPE
-+#define WRITE_DEPTH(_x, _y, d) INTEL_WRITE_DEPTH(NO_TILE(_x, _y), d)
-+#define READ_DEPTH(d, _x, _y) d = INTEL_READ_DEPTH(NO_TILE(_x, _y))
-+#define TAG(x) INTEL_TAG(intel##x)
-+#include "depthtmp.h"
-+
-+#define VALUE_TYPE INTEL_VALUE_TYPE
-+#define WRITE_DEPTH(_x, _y, d) INTEL_WRITE_DEPTH(X_TILE(_x, _y), d)
-+#define READ_DEPTH(d, _x, _y) d = INTEL_READ_DEPTH(X_TILE(_x, _y))
-+#define TAG(x) INTEL_TAG(intel_XTile_##x)
-+#include "depthtmp.h"
-+
-+#define VALUE_TYPE INTEL_VALUE_TYPE
-+#define WRITE_DEPTH(_x, _y, d) INTEL_WRITE_DEPTH(Y_TILE(_x, _y), d)
-+#define READ_DEPTH(d, _x, _y) d = INTEL_READ_DEPTH(Y_TILE(_x, _y))
-+#define TAG(x) INTEL_TAG(intel_YTile_##x)
-+#include "depthtmp.h"
-+
-+#undef INTEL_VALUE_TYPE
-+#undef INTEL_WRITE_DEPTH
-+#undef INTEL_READ_DEPTH
-+#undef INTEL_TAG
-diff --git a/src/mesa/drivers/dri/intel/intel_extensions.c b/src/mesa/drivers/dri/intel/intel_extensions.c
-new file mode 100644
-index 0000000..9058e48
---- /dev/null
-+++ b/src/mesa/drivers/dri/intel/intel_extensions.c
-@@ -0,0 +1,185 @@
-+/**************************************************************************
-+ *
-+ * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas.
-+ * All Rights Reserved.
-+ *
-+ * Permission is hereby granted, free of charge, to any person obtaining a
-+ * copy of this software and associated documentation files (the
-+ * "Software"), to deal in the Software without restriction, including
-+ * without limitation the rights to use, copy, modify, merge, publish,
-+ * distribute, sub license, and/or sell copies of the Software, and to
-+ * permit persons to whom the Software is furnished to do so, subject to
-+ * the following conditions:
-+ *
-+ * The above copyright notice and this permission notice (including the
-+ * next paragraph) shall be included in all copies or substantial portions
-+ * of the Software.
-+ *
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
-+ * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
-+ * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-+ *
-+ **************************************************************************/
-+
-+#include "intel_chipset.h"
-+#include "intel_context.h"
-+#include "intel_extensions.h"
-+
-+
-+#define need_GL_ARB_framebuffer_object
-+#define need_GL_ARB_occlusion_query
-+#define need_GL_ARB_point_parameters
-+#define need_GL_ARB_shader_objects
-+#define need_GL_ARB_vertex_program
-+#define need_GL_ARB_vertex_shader
-+#define need_GL_ARB_window_pos
-+#define need_GL_EXT_blend_color
-+#define need_GL_EXT_blend_equation_separate
-+#define need_GL_EXT_blend_func_separate
-+#define need_GL_EXT_blend_minmax
-+#define need_GL_EXT_cull_vertex
-+#define need_GL_EXT_fog_coord
-+#define need_GL_EXT_framebuffer_object
-+#define need_GL_EXT_framebuffer_blit
-+#define need_GL_EXT_point_parameters
-+#define need_GL_EXT_secondary_color
-+#define need_GL_EXT_stencil_two_side
-+#define need_GL_ATI_separate_stencil
-+#define need_GL_NV_point_sprite
-+#define need_GL_NV_vertex_program
-+#define need_GL_VERSION_2_0
-+#define need_GL_VERSION_2_1
-+
-+#include "extension_helper.h"
-+
-+
-+/**
-+ * Extension strings exported by the intel driver.
-+ *
-+ * Extensions supported by all chips supported by i830_dri, i915_dri, or
-+ * i965_dri.
-+ */
-+static const struct dri_extension card_extensions[] = {
-+ { "GL_ARB_multitexture", NULL },
-+ { "GL_ARB_point_parameters", GL_ARB_point_parameters_functions },
-+ { "GL_ARB_texture_border_clamp", NULL },
-+ { "GL_ARB_texture_cube_map", NULL },
-+ { "GL_ARB_texture_env_add", NULL },
-+ { "GL_ARB_texture_env_combine", NULL },
-+ { "GL_ARB_texture_env_crossbar", NULL },
-+ { "GL_ARB_texture_env_dot3", NULL },
-+ { "GL_ARB_texture_mirrored_repeat", NULL },
-+ { "GL_ARB_texture_rectangle", NULL },
-+ { "GL_ARB_vertex_program", GL_ARB_vertex_program_functions },
-+ { "GL_ARB_window_pos", GL_ARB_window_pos_functions },
-+ { "GL_EXT_blend_color", GL_EXT_blend_color_functions },
-+ { "GL_EXT_blend_equation_separate", GL_EXT_blend_equation_separate_functions },
-+ { "GL_EXT_blend_func_separate", GL_EXT_blend_func_separate_functions },
-+ { "GL_EXT_blend_minmax", GL_EXT_blend_minmax_functions },
-+ { "GL_EXT_blend_logic_op", NULL },
-+ { "GL_EXT_blend_subtract", NULL },
-+ { "GL_EXT_cull_vertex", GL_EXT_cull_vertex_functions },
-+ { "GL_EXT_fog_coord", GL_EXT_fog_coord_functions },
-+ { "GL_EXT_packed_depth_stencil", NULL },
-+ { "GL_EXT_secondary_color", GL_EXT_secondary_color_functions },
-+ { "GL_EXT_stencil_wrap", NULL },
-+ { "GL_EXT_texture_edge_clamp", NULL },
-+ { "GL_EXT_texture_env_combine", NULL },
-+ { "GL_EXT_texture_env_dot3", NULL },
-+ { "GL_EXT_texture_filter_anisotropic", NULL },
-+ { "GL_EXT_texture_lod_bias", NULL },
-+ { "GL_3DFX_texture_compression_FXT1", NULL },
-+ { "GL_APPLE_client_storage", NULL },
-+ { "GL_MESA_pack_invert", NULL },
-+ { "GL_MESA_ycbcr_texture", NULL },
-+ { "GL_NV_blend_square", NULL },
-+ { "GL_NV_point_sprite", GL_NV_point_sprite_functions },
-+ { "GL_NV_vertex_program", GL_NV_vertex_program_functions },
-+ { "GL_NV_vertex_program1_1", NULL },
-+ { "GL_SGIS_generate_mipmap", NULL },
-+ { NULL, NULL }
-+};
-+
-+
-+/** i915 / i945-only extensions */
-+static const struct dri_extension i915_extensions[] = {
-+ { "GL_ARB_depth_texture", NULL },
-+ { "GL_ARB_fragment_program", NULL },
-+ { "GL_ARB_shadow", NULL },
-+ { "GL_ARB_texture_non_power_of_two", NULL },
-+ { "GL_ATI_texture_env_combine3", NULL },
-+ { "GL_EXT_shadow_funcs", NULL },
-+ { "GL_NV_texture_env_combine4", NULL },
-+ { NULL, NULL }
-+};
-+
-+
-+/** i965-only extensions */
-+static const struct dri_extension brw_extensions[] = {
-+ { "GL_ARB_depth_texture", NULL },
-+ { "GL_ARB_fragment_program", NULL },
-+ { "GL_ARB_fragment_program_shadow", NULL },
-+ { "GL_ARB_fragment_shader", NULL },
-+ { "GL_ARB_framebuffer_object", GL_ARB_framebuffer_object_functions},
-+ { "GL_ARB_occlusion_query", GL_ARB_occlusion_query_functions },
-+ { "GL_ARB_point_sprite", NULL },
-+ { "GL_ARB_shader_objects", GL_ARB_shader_objects_functions },
-+ { "GL_ARB_shading_language_100", GL_VERSION_2_0_functions },
-+ { "GL_ARB_shading_language_120", GL_VERSION_2_1_functions },
-+ { "GL_ARB_shadow", NULL },
-+ { "GL_ARB_texture_non_power_of_two", NULL },
-+ { "GL_ARB_vertex_shader", GL_ARB_vertex_shader_functions },
-+ { "GL_EXT_shadow_funcs", NULL },
-+ { "GL_EXT_stencil_two_side", GL_EXT_stencil_two_side_functions },
-+ { "GL_EXT_texture_sRGB", NULL },
-+ { "GL_EXT_texture_swizzle", NULL },
-+ { "GL_EXT_vertex_array_bgra", NULL },
-+ { "GL_ATI_separate_stencil", GL_ATI_separate_stencil_functions },
-+ { "GL_ATI_texture_env_combine3", NULL },
-+ { "GL_NV_texture_env_combine4", NULL },
-+ { NULL, NULL }
-+};
-+
-+
-+static const struct dri_extension arb_oq_extensions[] = {
-+ { NULL, NULL }
-+};
-+
-+
-+static const struct dri_extension ttm_extensions[] = {
-+ { "GL_ARB_pixel_buffer_object", NULL },
-+ { "GL_EXT_framebuffer_blit", GL_EXT_framebuffer_blit_functions },
-+ { "GL_EXT_framebuffer_object", GL_EXT_framebuffer_object_functions },
-+ { NULL, NULL }
-+};
-+
-+
-+/**
-+ * Initializes potential list of extensions if ctx == NULL, or actually enables
-+ * extensions for a context.
-+ */
-+void
-+intelInitExtensions(GLcontext *ctx, GLboolean enable_imaging)
-+{
-+ struct intel_context *intel = ctx?intel_context(ctx):NULL;
-+
-+ /* Disable imaging extension until convolution is working in teximage paths.
-+ */
-+ enable_imaging = GL_FALSE;
-+
-+ driInitExtensions(ctx, card_extensions, enable_imaging);
-+
-+ if (intel == NULL || intel->ttm)
-+ driInitExtensions(ctx, ttm_extensions, GL_FALSE);
-+
-+ if (intel == NULL || IS_965(intel->intelScreen->deviceID))
-+ driInitExtensions(ctx, brw_extensions, GL_FALSE);
-+
-+ if (intel == NULL || IS_915(intel->intelScreen->deviceID)
-+ || IS_945(intel->intelScreen->deviceID))
-+ driInitExtensions(ctx, i915_extensions, GL_FALSE);
-+}
-diff --git a/src/mesa/drivers/dri/intel/intel_extensions.h b/src/mesa/drivers/dri/intel/intel_extensions.h
-new file mode 100644
-index 0000000..97147ec
---- /dev/null
-+++ b/src/mesa/drivers/dri/intel/intel_extensions.h
-@@ -0,0 +1,36 @@
-+/**************************************************************************
-+ *
-+ * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas.
-+ * All Rights Reserved.
-+ *
-+ * Permission is hereby granted, free of charge, to any person obtaining a
-+ * copy of this software and associated documentation files (the
-+ * "Software"), to deal in the Software without restriction, including
-+ * without limitation the rights to use, copy, modify, merge, publish,
-+ * distribute, sub license, and/or sell copies of the Software, and to
-+ * permit persons to whom the Software is furnished to do so, subject to
-+ * the following conditions:
-+ *
-+ * The above copyright notice and this permission notice (including the
-+ * next paragraph) shall be included in all copies or substantial portions
-+ * of the Software.
-+ *
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
-+ * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
-+ * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-+ *
-+ **************************************************************************/
-+
-+#ifndef INTEL_EXTENSIONS_H
-+#define INTEL_EXTENSIONS_H
-+
-+
-+extern void
-+intelInitExtensions(GLcontext *ctx, GLboolean enable_imaging);
-+
-+
-+#endif
-diff --git a/src/mesa/drivers/dri/intel/intel_fbo.c b/src/mesa/drivers/dri/intel/intel_fbo.c
-index 7cf1261..787c290 100644
---- a/src/mesa/drivers/dri/intel/intel_fbo.c
-+++ b/src/mesa/drivers/dri/intel/intel_fbo.c
-@@ -27,6 +27,7 @@
-
-
- #include "main/imports.h"
-+#include "main/macros.h"
- #include "main/mtypes.h"
- #include "main/fbobject.h"
- #include "main/framebuffer.h"
-@@ -37,58 +38,13 @@
-
- #include "intel_context.h"
- #include "intel_buffers.h"
--#include "intel_depthstencil.h"
- #include "intel_fbo.h"
- #include "intel_mipmap_tree.h"
- #include "intel_regions.h"
--#include "intel_span.h"
-
-
- #define FILE_DEBUG_FLAG DEBUG_FBO
-
--#define INTEL_RB_CLASS 0x12345678
--
--
--/* XXX FBO: move this to intel_context.h (inlined) */
--/**
-- * Return a gl_renderbuffer ptr casted to intel_renderbuffer.
-- * NULL will be returned if the rb isn't really an intel_renderbuffer.
-- * This is determiend by checking the ClassID.
-- */
--struct intel_renderbuffer *
--intel_renderbuffer(struct gl_renderbuffer *rb)
--{
-- struct intel_renderbuffer *irb = (struct intel_renderbuffer *) rb;
-- if (irb && irb->Base.ClassID == INTEL_RB_CLASS) {
-- /*_mesa_warning(NULL, "Returning non-intel Rb\n");*/
-- return irb;
-- }
-- else
-- return NULL;
--}
--
--
--struct intel_renderbuffer *
--intel_get_renderbuffer(struct gl_framebuffer *fb, int attIndex)
--{
-- if (attIndex >= 0)
-- return intel_renderbuffer(fb->Attachment[attIndex].Renderbuffer);
-- else
-- return NULL;
--}
--
--struct intel_region *
--intel_get_rb_region(struct gl_framebuffer *fb, GLuint attIndex)
--{
-- struct intel_renderbuffer *irb = intel_get_renderbuffer(fb, attIndex);
--
-- if (irb)
-- return irb->region;
-- else
-- return NULL;
--}
--
--
-
- /**
- * Create a new framebuffer object.
-@@ -103,6 +59,7 @@ intel_new_framebuffer(GLcontext * ctx, GLuint name)
- }
-
-
-+/** Called by gl_renderbuffer::Delete() */
- static void
- intel_delete_renderbuffer(struct gl_renderbuffer *rb)
- {
-@@ -112,10 +69,6 @@ intel_delete_renderbuffer(struct gl_renderbuffer *rb)
-
- ASSERT(irb);
-
-- if (irb->PairedStencil || irb->PairedDepth) {
-- intel_unpair_depth_stencil(ctx, irb);
-- }
--
- if (irb->span_cache != NULL)
- _mesa_free(irb->span_cache);
-
-@@ -127,7 +80,6 @@ intel_delete_renderbuffer(struct gl_renderbuffer *rb)
- }
-
-
--
- /**
- * Return a pointer to a specific pixel in a renderbuffer.
- */
-@@ -142,7 +94,6 @@ intel_get_pointer(GLcontext * ctx, struct gl_renderbuffer *rb,
- }
-
-
--
- /**
- * Called via glRenderbufferStorageEXT() to set the format and allocate
- * storage for a user-created renderbuffer.
-@@ -211,18 +162,11 @@ intel_alloc_renderbuffer_storage(GLcontext * ctx, struct gl_renderbuffer *rb,
- cpp = 4;
- break;
- case GL_DEPTH_COMPONENT16:
--#if 0
- rb->_ActualFormat = GL_DEPTH_COMPONENT16;
- rb->DataType = GL_UNSIGNED_SHORT;
- rb->DepthBits = 16;
- cpp = 2;
- break;
--#else
-- /* fall-through.
-- * 16bpp depth renderbuffer can't be paired with a stencil buffer so
-- * always used combined depth/stencil format.
-- */
--#endif
- case GL_DEPTH_COMPONENT:
- case GL_DEPTH_COMPONENT24:
- case GL_DEPTH_COMPONENT32:
-@@ -266,7 +210,8 @@ intel_alloc_renderbuffer_storage(GLcontext * ctx, struct gl_renderbuffer *rb,
- DBG("Allocating %d x %d Intel RBO (pitch %d)\n", width,
- height, pitch);
-
-- irb->region = intel_region_alloc(intel, cpp, width, height, pitch);
-+ irb->region = intel_region_alloc(intel, cpp, width, height, pitch,
-+ GL_TRUE);
- if (!irb->region)
- return GL_FALSE; /* out of memory? */
-
-@@ -280,7 +225,6 @@ intel_alloc_renderbuffer_storage(GLcontext * ctx, struct gl_renderbuffer *rb,
- }
-
-
--
- /**
- * Called for each hardware renderbuffer when a _window_ is resized.
- * Just update fields.
-@@ -298,6 +242,7 @@ intel_alloc_window_storage(GLcontext * ctx, struct gl_renderbuffer *rb,
- return GL_TRUE;
- }
-
-+
- static void
- intel_resize_buffers(GLcontext *ctx, struct gl_framebuffer *fb,
- GLuint width, GLuint height)
-@@ -324,6 +269,8 @@ intel_resize_buffers(GLcontext *ctx, struct gl_framebuffer *fb,
- }
- }
-
-+
-+/** Dummy function for gl_renderbuffer::AllocStorage() */
- static GLboolean
- intel_nop_alloc_storage(GLcontext * ctx, struct gl_renderbuffer *rb,
- GLenum internalFormat, GLuint width, GLuint height)
-@@ -343,10 +290,9 @@ intel_renderbuffer_set_region(struct intel_renderbuffer *rb,
- rb->region = NULL;
- intel_region_reference(&rb->region, region);
- intel_region_release(&old);
--
-- rb->pfPitch = region->pitch;
- }
-
-+
- /**
- * Create a new intel_renderbuffer which corresponds to an on-screen window,
- * not a user-created renderbuffer.
-@@ -377,6 +323,15 @@ intel_create_renderbuffer(GLenum intFormat)
- irb->Base.BlueBits = 5;
- irb->Base.DataType = GL_UNSIGNED_BYTE;
- break;
-+ case GL_RGB8:
-+ irb->Base._ActualFormat = GL_RGB8;
-+ irb->Base._BaseFormat = GL_RGB;
-+ irb->Base.RedBits = 8;
-+ irb->Base.GreenBits = 8;
-+ irb->Base.BlueBits = 8;
-+ irb->Base.AlphaBits = 0;
-+ irb->Base.DataType = GL_UNSIGNED_BYTE;
-+ break;
- case GL_RGBA8:
- irb->Base._ActualFormat = GL_RGBA8;
- irb->Base._BaseFormat = GL_RGBA;
-@@ -466,9 +421,6 @@ intel_bind_framebuffer(GLcontext * ctx, GLenum target,
- {
- if (target == GL_FRAMEBUFFER_EXT || target == GL_DRAW_FRAMEBUFFER_EXT) {
- intel_draw_buffer(ctx, fb);
-- /* Integer depth range depends on depth buffer bits */
-- if (ctx->Driver.DepthRange != NULL)
-- ctx->Driver.DepthRange(ctx, ctx->Viewport.Near, ctx->Viewport.Far);
- }
- else {
- /* don't need to do anything if target == GL_READ_FRAMEBUFFER_EXT */
-@@ -492,6 +444,7 @@ intel_framebuffer_renderbuffer(GLcontext * ctx,
- intel_draw_buffer(ctx, fb);
- }
-
-+
- static GLboolean
- intel_update_wrapper(GLcontext *ctx, struct intel_renderbuffer *irb,
- struct gl_texture_image *texImage)
-@@ -538,11 +491,10 @@ intel_update_wrapper(GLcontext *ctx, struct intel_renderbuffer *irb,
- irb->Base.Delete = intel_delete_renderbuffer;
- irb->Base.AllocStorage = intel_nop_alloc_storage;
-
-- irb->RenderToTexture = GL_TRUE;
--
- return GL_TRUE;
- }
-
-+
- /**
- * When glFramebufferTexture[123]D is called this function sets up the
- * gl_renderbuffer wrapper around the texture image.
-@@ -551,7 +503,7 @@ intel_update_wrapper(GLcontext *ctx, struct intel_renderbuffer *irb,
- static struct intel_renderbuffer *
- intel_wrap_texture(GLcontext * ctx, struct gl_texture_image *texImage)
- {
-- const GLuint name = ~0; /* not significant, but distinct for debugging */
-+ const GLuint name = ~0; /* not significant, but distinct for debugging */
- struct intel_renderbuffer *irb;
-
- /* make an intel_renderbuffer to wrap the texture image */
-@@ -598,10 +550,11 @@ intel_render_texture(GLcontext * ctx,
- /* Fallback on drawing to a texture with a border, which won't have a
- * miptree.
- */
-- _mesa_reference_renderbuffer(&att->Renderbuffer, NULL);
-- _mesa_render_texture(ctx, fb, att);
-- return;
-- } else if (!irb) {
-+ _mesa_reference_renderbuffer(&att->Renderbuffer, NULL);
-+ _mesa_render_texture(ctx, fb, att);
-+ return;
-+ }
-+ else if (!irb) {
- irb = intel_wrap_texture(ctx, newImage);
- if (irb) {
- /* bind the wrapper to the attachment point */
-@@ -612,7 +565,9 @@ intel_render_texture(GLcontext * ctx,
- _mesa_render_texture(ctx, fb, att);
- return;
- }
-- } if (!intel_update_wrapper(ctx, irb, newImage)) {
-+ }
-+
-+ if (!intel_update_wrapper(ctx, irb, newImage)) {
- _mesa_reference_renderbuffer(&att->Renderbuffer, NULL);
- _mesa_render_texture(ctx, fb, att);
- return;
-@@ -657,19 +612,133 @@ static void
- intel_finish_render_texture(GLcontext * ctx,
- struct gl_renderbuffer_attachment *att)
- {
-- struct intel_renderbuffer *irb = intel_renderbuffer(att->Renderbuffer);
-+ /* no-op
-+ * Previously we released the renderbuffer's intel_region but
-+ * that's not necessary and actually caused problems when trying
-+ * to do a glRead/CopyPixels from the renderbuffer later.
-+ * The region will be released later if the texture is replaced
-+ * or the renderbuffer deleted.
-+ *
-+ * The intention of this driver hook is more of a "done rendering
-+ * to texture, please re-twiddle/etc if necessary".
-+ */
-+}
-
-- DBG("End render texture (tid %x) tex %u\n", _glthread_GetID(), att->Texture->Name);
-
-- if (irb) {
-- /* just release the region */
-- intel_region_release(&irb->region);
-+/**
-+ * Do additional "completeness" testing of a framebuffer object.
-+ */
-+static void
-+intel_validate_framebuffer(GLcontext *ctx, struct gl_framebuffer *fb)
-+{
-+ struct intel_context *intel = intel_context(ctx);
-+ const struct intel_renderbuffer *depthRb =
-+ intel_get_renderbuffer(fb, BUFFER_DEPTH);
-+ const struct intel_renderbuffer *stencilRb =
-+ intel_get_renderbuffer(fb, BUFFER_STENCIL);
-+
-+ if (stencilRb && stencilRb != depthRb) {
-+ /* we only support combined depth/stencil buffers, not separate
-+ * stencil buffers.
-+ */
-+ fb->_Status = GL_FRAMEBUFFER_UNSUPPORTED_EXT;
-+ }
-+
-+ /* check that texture color buffers are a format we can render into */
-+ {
-+ const struct gl_texture_format *supportedFormat;
-+ GLuint i;
-+
-+ /* The texture format we can render into seems to depend on the
-+ * screen depth. There currently seems to be a problem when
-+ * rendering into a rgb565 texture when the screen is abgr8888.
-+ */
-+ if (intel->front_region->cpp == 4)
-+ supportedFormat = &_mesa_texformat_argb8888;
-+ else
-+ supportedFormat = &_mesa_texformat_rgb565;
-+
-+ for (i = 0; i < ctx->Const.MaxDrawBuffers; i++) {
-+ const struct gl_texture_object *texObj =
-+ fb->Attachment[BUFFER_COLOR0 + i].Texture;
-+ if (texObj) {
-+ const struct gl_texture_image *texImg =
-+ texObj->Image[0][texObj->BaseLevel];
-+ if (texImg && texImg->TexFormat != supportedFormat) {
-+ fb->_Status = GL_FRAMEBUFFER_UNSUPPORTED_EXT;
-+ break;
-+ }
-+ }
-+ }
-+ }
-+}
-+
-+
-+/**
-+ * Called from glBlitFramebuffer().
-+ * For now, we're doing an approximation with glCopyPixels().
-+ * XXX we need to bypass all the per-fragment operations, except scissor.
-+ */
-+static void
-+intel_blit_framebuffer(GLcontext *ctx,
-+ GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
-+ GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
-+ GLbitfield mask, GLenum filter)
-+{
-+ const GLfloat xZoomSave = ctx->Pixel.ZoomX;
-+ const GLfloat yZoomSave = ctx->Pixel.ZoomY;
-+ GLsizei width, height;
-+ GLfloat xFlip = 1.0F, yFlip = 1.0F;
-+
-+ if (srcX1 < srcX0) {
-+ GLint tmp = srcX1;
-+ srcX1 = srcX0;
-+ srcX0 = tmp;
-+ xFlip = -1.0F;
-+ }
-+
-+ if (srcY1 < srcY0) {
-+ GLint tmp = srcY1;
-+ srcY1 = srcY0;
-+ srcY0 = tmp;
-+ yFlip = -1.0F;
-+ }
-+
-+ width = srcX1 - srcX0;
-+ height = srcY1 - srcY0;
-+
-+ ctx->Pixel.ZoomX = xFlip * (dstX1 - dstX0) / (srcX1 - srcY0);
-+ ctx->Pixel.ZoomY = yFlip * (dstY1 - dstY0) / (srcY1 - srcY0);
-+
-+ if (ctx->Pixel.ZoomX < 0.0F) {
-+ dstX0 = MAX2(dstX0, dstX1);
-+ }
-+ else {
-+ dstX0 = MIN2(dstX0, dstX1);
-+ }
-+
-+ if (ctx->Pixel.ZoomY < 0.0F) {
-+ dstY0 = MAX2(dstY0, dstY1);
-+ }
-+ else {
-+ dstY0 = MIN2(dstY0, dstY1);
-+ }
-+
-+ if (mask & GL_COLOR_BUFFER_BIT) {
-+ ctx->Driver.CopyPixels(ctx, srcX0, srcY0, width, height,
-+ dstX0, dstY0, GL_COLOR);
-+ }
-+ if (mask & GL_DEPTH_BUFFER_BIT) {
-+ ctx->Driver.CopyPixels(ctx, srcX0, srcY0, width, height,
-+ dstX0, dstY0, GL_DEPTH);
- }
-- else if (att->Renderbuffer) {
-- /* software fallback */
-- _mesa_finish_render_texture(ctx, att);
-- /* XXX FBO: Need to unmap the buffer (or in intelSpanRenderStart???) */
-+ if (mask & GL_STENCIL_BUFFER_BIT) {
-+ ctx->Driver.CopyPixels(ctx, srcX0, srcY0, width, height,
-+ dstX0, dstY0, GL_STENCIL);
- }
-+
-+ ctx->Pixel.ZoomX = xZoomSave;
-+ ctx->Pixel.ZoomY = yZoomSave;
- }
-
-
-@@ -687,4 +756,6 @@ intel_fbo_init(struct intel_context *intel)
- intel->ctx.Driver.RenderTexture = intel_render_texture;
- intel->ctx.Driver.FinishRenderTexture = intel_finish_render_texture;
- intel->ctx.Driver.ResizeBuffers = intel_resize_buffers;
-+ intel->ctx.Driver.ValidateFramebuffer = intel_validate_framebuffer;
-+ intel->ctx.Driver.BlitFramebuffer = intel_blit_framebuffer;
- }
-diff --git a/src/mesa/drivers/dri/intel/intel_fbo.h b/src/mesa/drivers/dri/intel/intel_fbo.h
-index b7e9280..7226ee0 100644
---- a/src/mesa/drivers/dri/intel/intel_fbo.h
-+++ b/src/mesa/drivers/dri/intel/intel_fbo.h
-@@ -55,19 +55,11 @@ struct intel_framebuffer
-
- /**
- * Intel renderbuffer, derived from gl_renderbuffer.
-- * Note: The PairedDepth and PairedStencil fields use renderbuffer IDs,
-- * not pointers because in some circumstances a deleted renderbuffer could
-- * result in a dangling pointer here.
- */
- struct intel_renderbuffer
- {
- struct gl_renderbuffer Base;
- struct intel_region *region;
-- GLuint pfPitch; /* possibly paged flipped pitch */
-- GLboolean RenderToTexture; /* RTT? */
--
-- GLuint PairedDepth; /**< only used if this is a depth renderbuffer */
-- GLuint PairedStencil; /**< only used if this is a stencil renderbuffer */
-
- GLuint vbl_pending; /**< vblank sequence number of pending flip */
-
-@@ -75,48 +67,70 @@ struct intel_renderbuffer
- unsigned long span_cache_offset;
- };
-
--extern struct intel_renderbuffer *intel_renderbuffer(struct gl_renderbuffer
-- *rb);
-+
-+/**
-+ * gl_renderbuffer is a base class which we subclass. The Class field
-+ * is used for simple run-time type checking.
-+ */
-+#define INTEL_RB_CLASS 0x12345678
-+
-+
-+/**
-+ * Return a gl_renderbuffer ptr casted to intel_renderbuffer.
-+ * NULL will be returned if the rb isn't really an intel_renderbuffer.
-+ * This is determined by checking the ClassID.
-+ */
-+static INLINE struct intel_renderbuffer *
-+intel_renderbuffer(struct gl_renderbuffer *rb)
-+{
-+ struct intel_renderbuffer *irb = (struct intel_renderbuffer *) rb;
-+ if (irb && irb->Base.ClassID == INTEL_RB_CLASS) {
-+ /*_mesa_warning(NULL, "Returning non-intel Rb\n");*/
-+ return irb;
-+ }
-+ else
-+ return NULL;
-+}
-+
-+
-+/**
-+ * Return a framebuffer's renderbuffer, named by a BUFFER_x index.
-+ */
-+static INLINE struct intel_renderbuffer *
-+intel_get_renderbuffer(struct gl_framebuffer *fb, int attIndex)
-+{
-+ if (attIndex >= 0)
-+ return intel_renderbuffer(fb->Attachment[attIndex].Renderbuffer);
-+ else
-+ return NULL;
-+}
-+
-
- extern void
- intel_renderbuffer_set_region(struct intel_renderbuffer *irb,
- struct intel_region *region);
-
-+
- extern struct intel_renderbuffer *
- intel_create_renderbuffer(GLenum intFormat);
-
--extern void intel_fbo_init(struct intel_context *intel);
--
--
--/* XXX make inline or macro */
--extern struct intel_renderbuffer *intel_get_renderbuffer(struct gl_framebuffer
-- *fb,
-- int attIndex);
--
--extern void intel_flip_renderbuffers(struct intel_framebuffer *intel_fb);
-
-+extern void
-+intel_fbo_init(struct intel_context *intel);
-
--/* XXX make inline or macro */
--extern struct intel_region *intel_get_rb_region(struct gl_framebuffer *fb,
-- GLuint attIndex);
-
-+extern void
-+intel_flip_renderbuffers(struct intel_framebuffer *intel_fb);
-
-
--/**
-- * Are we currently rendering into a texture?
-- */
--static INLINE GLboolean
--intel_rendering_to_texture(const GLcontext *ctx)
-+static INLINE struct intel_region *
-+intel_get_rb_region(struct gl_framebuffer *fb, GLuint attIndex)
- {
-- if (ctx->DrawBuffer->Name) {
-- /* User-created FBO */
-- const struct intel_renderbuffer *irb =
-- intel_renderbuffer(ctx->DrawBuffer->_ColorDrawBuffers[0]);
-- return irb && irb->RenderToTexture;
-- }
-- else {
-- return GL_FALSE;
-- }
-+ struct intel_renderbuffer *irb = intel_get_renderbuffer(fb, attIndex);
-+ if (irb)
-+ return irb->region;
-+ else
-+ return NULL;
- }
-
-
-diff --git a/src/mesa/drivers/dri/intel/intel_mipmap_tree.c b/src/mesa/drivers/dri/intel/intel_mipmap_tree.c
-index bf1c3f0..6e1e034 100644
---- a/src/mesa/drivers/dri/intel/intel_mipmap_tree.c
-+++ b/src/mesa/drivers/dri/intel/intel_mipmap_tree.c
-@@ -103,7 +103,8 @@ intel_miptree_create(struct intel_context *intel,
- GLuint last_level,
- GLuint width0,
- GLuint height0,
-- GLuint depth0, GLuint cpp, GLuint compress_byte)
-+ GLuint depth0, GLuint cpp, GLuint compress_byte,
-+ GLboolean expect_accelerated_upload)
- {
- struct intel_mipmap_tree *mt;
-
-@@ -120,7 +121,8 @@ intel_miptree_create(struct intel_context *intel,
- mt->cpp,
- mt->pitch,
- mt->total_height,
-- mt->pitch);
-+ mt->pitch,
-+ expect_accelerated_upload);
-
- if (!mt->region) {
- free(mt);
-diff --git a/src/mesa/drivers/dri/intel/intel_mipmap_tree.h b/src/mesa/drivers/dri/intel/intel_mipmap_tree.h
-index c9537db..4060b9d 100644
---- a/src/mesa/drivers/dri/intel/intel_mipmap_tree.h
-+++ b/src/mesa/drivers/dri/intel/intel_mipmap_tree.h
-@@ -133,7 +133,8 @@ struct intel_mipmap_tree *intel_miptree_create(struct intel_context *intel,
- GLuint height0,
- GLuint depth0,
- GLuint cpp,
-- GLuint compress_byte);
-+ GLuint compress_byte,
-+ GLboolean expect_accelerated_upload);
-
- struct intel_mipmap_tree *
- intel_miptree_create_for_region(struct intel_context *intel,
-diff --git a/src/mesa/drivers/dri/intel/intel_pixel.c b/src/mesa/drivers/dri/intel/intel_pixel.c
-index cf2f32d..5e32288 100644
---- a/src/mesa/drivers/dri/intel/intel_pixel.c
-+++ b/src/mesa/drivers/dri/intel/intel_pixel.c
-@@ -181,6 +181,7 @@ intel_meta_set_passthrough_transform(struct intel_context *intel)
- intel->meta.saved_vp_y = ctx->Viewport.Y;
- intel->meta.saved_vp_width = ctx->Viewport.Width;
- intel->meta.saved_vp_height = ctx->Viewport.Height;
-+ intel->meta.saved_matrix_mode = ctx->Transform.MatrixMode;
-
- _mesa_Viewport(0, 0, ctx->DrawBuffer->Width, ctx->DrawBuffer->Height);
-
-@@ -202,6 +203,8 @@ intel_meta_restore_transform(struct intel_context *intel)
- _mesa_MatrixMode(GL_MODELVIEW);
- _mesa_PopMatrix();
-
-+ _mesa_MatrixMode(intel->meta.saved_matrix_mode);
-+
- _mesa_Viewport(intel->meta.saved_vp_x, intel->meta.saved_vp_y,
- intel->meta.saved_vp_width, intel->meta.saved_vp_height);
- }
-diff --git a/src/mesa/drivers/dri/intel/intel_pixel.h b/src/mesa/drivers/dri/intel/intel_pixel.h
-index 76b8781..cb41fa1 100644
---- a/src/mesa/drivers/dri/intel/intel_pixel.h
-+++ b/src/mesa/drivers/dri/intel/intel_pixel.h
-@@ -76,4 +76,6 @@ void intelBitmap(GLcontext * ctx,
- const struct gl_pixelstore_attrib *unpack,
- const GLubyte * pixels);
-
-+void intel_clear_tris(GLcontext *ctx, GLbitfield mask);
-+
- #endif
-diff --git a/src/mesa/drivers/dri/intel/intel_pixel_bitmap.c b/src/mesa/drivers/dri/intel/intel_pixel_bitmap.c
-index 3a01f63..1db7f55 100644
---- a/src/mesa/drivers/dri/intel/intel_pixel_bitmap.c
-+++ b/src/mesa/drivers/dri/intel/intel_pixel_bitmap.c
-@@ -495,6 +495,7 @@ intel_texture_bitmap(GLcontext * ctx,
- texcoords[3][1] = 1.0;
-
- _mesa_VertexPointer(4, GL_FLOAT, 4 * sizeof(GLfloat), &vertices);
-+ _mesa_ClientActiveTextureARB(GL_TEXTURE0);
- _mesa_TexCoordPointer(2, GL_FLOAT, 2 * sizeof(GLfloat), &texcoords);
- _mesa_Enable(GL_VERTEX_ARRAY);
- _mesa_Enable(GL_TEXTURE_COORD_ARRAY);
-diff --git a/src/mesa/drivers/dri/intel/intel_pixel_draw.c b/src/mesa/drivers/dri/intel/intel_pixel_draw.c
-index 0e83afa..7be7ea8 100644
---- a/src/mesa/drivers/dri/intel/intel_pixel_draw.c
-+++ b/src/mesa/drivers/dri/intel/intel_pixel_draw.c
-@@ -72,6 +72,8 @@ intel_texture_drawpixels(GLcontext * ctx,
- GLfloat vertices[4][4];
- GLfloat texcoords[4][2];
- GLfloat z;
-+ GLint old_active_texture;
-+ GLenum internalFormat;
-
- /* We're going to mess with texturing with no regard to existing texture
- * state, so if there is some set up we have to bail.
-@@ -92,7 +94,7 @@ intel_texture_drawpixels(GLcontext * ctx,
- return GL_FALSE;
- }
-
-- /* We don't have a way to generate fragments with stencil values which *
-+ /* We don't have a way to generate fragments with stencil values which
- * will set the resulting stencil value.
- */
- if (format == GL_STENCIL_INDEX)
-@@ -125,6 +127,7 @@ intel_texture_drawpixels(GLcontext * ctx,
- /* XXX: pixel store stuff */
- _mesa_Disable(GL_POLYGON_STIPPLE);
-
-+ old_active_texture = ctx->Texture.CurrentUnit;
- _mesa_ActiveTextureARB(GL_TEXTURE0_ARB);
- _mesa_Enable(GL_TEXTURE_2D);
- _mesa_GenTextures(1, &texname);
-@@ -132,11 +135,11 @@ intel_texture_drawpixels(GLcontext * ctx,
- _mesa_TexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
- _mesa_TexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
- _mesa_TexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
-- /*
-- _mesa_TexEnvf(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_REPLACE);
-- _mesa_TexEnvf(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_REPLACE);
-- */
-- _mesa_TexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, format,
-+ if (type == GL_ALPHA)
-+ internalFormat = GL_ALPHA;
-+ else
-+ internalFormat = GL_RGBA;
-+ _mesa_TexImage2D(GL_TEXTURE_2D, 0, internalFormat, width, height, 0, format,
- type, pixels);
-
- intel_meta_set_passthrough_transform(intel);
-@@ -176,12 +179,15 @@ intel_texture_drawpixels(GLcontext * ctx,
- texcoords[3][1] = 1.0;
-
- _mesa_VertexPointer(4, GL_FLOAT, 4 * sizeof(GLfloat), &vertices);
-+ _mesa_ClientActiveTextureARB(GL_TEXTURE0);
- _mesa_TexCoordPointer(2, GL_FLOAT, 2 * sizeof(GLfloat), &texcoords);
- _mesa_Enable(GL_VERTEX_ARRAY);
- _mesa_Enable(GL_TEXTURE_COORD_ARRAY);
- CALL_DrawArrays(ctx->Exec, (GL_TRIANGLE_FAN, 0, 4));
-
- intel_meta_restore_transform(intel);
-+
-+ _mesa_ActiveTextureARB(GL_TEXTURE0_ARB + old_active_texture);
- _mesa_PopClientAttrib();
- _mesa_PopAttrib();
-
-@@ -209,6 +215,7 @@ intel_stencil_drawpixels(GLcontext * ctx,
- struct gl_pixelstore_attrib old_unpack;
- GLstencil *stencil_pixels;
- int row;
-+ GLint old_active_texture;
-
- if (format != GL_STENCIL_INDEX)
- return GL_FALSE;
-@@ -225,6 +232,10 @@ intel_stencil_drawpixels(GLcontext * ctx,
- return GL_FALSE;
- }
-
-+ /* We don't support stencil testing/ops here */
-+ if (ctx->Stencil.Enabled)
-+ return GL_FALSE;
-+
- /* We use FBOs for our wrapping of the depthbuffer into a color
- * destination.
- */
-@@ -266,6 +277,7 @@ intel_stencil_drawpixels(GLcontext * ctx,
- GL_CURRENT_BIT | GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
- _mesa_PushClientAttrib(GL_CLIENT_VERTEX_ARRAY_BIT);
- old_fb_name = ctx->DrawBuffer->Name;
-+ old_active_texture = ctx->Texture.CurrentUnit;
-
- _mesa_Disable(GL_POLYGON_STIPPLE);
- _mesa_Disable(GL_DEPTH_TEST);
-@@ -351,6 +363,7 @@ intel_stencil_drawpixels(GLcontext * ctx,
- texcoords[3][1] = 1.0;
-
- _mesa_VertexPointer(2, GL_FLOAT, 2 * sizeof(GLfloat), &vertices);
-+ _mesa_ClientActiveTextureARB(GL_TEXTURE0);
- _mesa_TexCoordPointer(2, GL_FLOAT, 2 * sizeof(GLfloat), &texcoords);
- _mesa_Enable(GL_VERTEX_ARRAY);
- _mesa_Enable(GL_TEXTURE_COORD_ARRAY);
-@@ -358,6 +371,7 @@ intel_stencil_drawpixels(GLcontext * ctx,
-
- intel_meta_restore_transform(intel);
-
-+ _mesa_ActiveTextureARB(GL_TEXTURE0_ARB + old_active_texture);
- _mesa_BindFramebufferEXT(GL_FRAMEBUFFER_EXT, old_fb_name);
-
- _mesa_PopClientAttrib();
-diff --git a/src/mesa/drivers/dri/intel/intel_regions.c b/src/mesa/drivers/dri/intel/intel_regions.c
-index 51ce32a..0aa5b8c 100644
---- a/src/mesa/drivers/dri/intel/intel_regions.c
-+++ b/src/mesa/drivers/dri/intel/intel_regions.c
-@@ -109,12 +109,18 @@ intel_region_alloc_internal(struct intel_context *intel,
-
- struct intel_region *
- intel_region_alloc(struct intel_context *intel,
-- GLuint cpp, GLuint width, GLuint height, GLuint pitch)
-+ GLuint cpp, GLuint width, GLuint height, GLuint pitch,
-+ GLboolean expect_accelerated_upload)
- {
- dri_bo *buffer;
-
-- buffer = dri_bo_alloc(intel->bufmgr, "region",
-- pitch * cpp * height, 64);
-+ if (expect_accelerated_upload) {
-+ buffer = drm_intel_bo_alloc_for_render(intel->bufmgr, "region",
-+ pitch * cpp * height, 64);
-+ } else {
-+ buffer = drm_intel_bo_alloc(intel->bufmgr, "region",
-+ pitch * cpp * height, 64);
-+ }
-
- return intel_region_alloc_internal(intel, cpp, width, height, pitch, buffer);
- }
-@@ -152,7 +158,7 @@ void
- intel_region_reference(struct intel_region **dst, struct intel_region *src)
- {
- if (src)
-- DBG("%s %d\n", __FUNCTION__, src->refcount);
-+ DBG("%s %p %d\n", __FUNCTION__, src, src->refcount);
-
- assert(*dst == NULL);
- if (src) {
-@@ -169,7 +175,7 @@ intel_region_release(struct intel_region **region_handle)
- if (region == NULL)
- return;
-
-- DBG("%s %d\n", __FUNCTION__, region->refcount - 1);
-+ DBG("%s %p %d\n", __FUNCTION__, region, region->refcount - 1);
-
- ASSERT(region->refcount > 0);
- region->refcount--;
-@@ -460,7 +466,8 @@ intel_recreate_static(struct intel_context *intel,
- else
- region->cpp = intel->ctx.Visual.rgbBits / 8;
- region->pitch = intelScreen->pitch;
-- region->height = intelScreen->height; /* needed? */
-+ region->width = intelScreen->width;
-+ region->height = intelScreen->height;
-
- if (region->buffer != NULL) {
- dri_bo_unreference(region->buffer);
-diff --git a/src/mesa/drivers/dri/intel/intel_regions.h b/src/mesa/drivers/dri/intel/intel_regions.h
-index 4b120ba..45e2bf4 100644
---- a/src/mesa/drivers/dri/intel/intel_regions.h
-+++ b/src/mesa/drivers/dri/intel/intel_regions.h
-@@ -74,7 +74,8 @@ struct intel_region
- */
- struct intel_region *intel_region_alloc(struct intel_context *intel,
- GLuint cpp, GLuint width,
-- GLuint height, GLuint pitch);
-+ GLuint height, GLuint pitch,
-+ GLboolean expect_accelerated_upload);
-
- struct intel_region *
- intel_region_alloc_for_handle(struct intel_context *intel,
-diff --git a/src/mesa/drivers/dri/intel/intel_screen.c b/src/mesa/drivers/dri/intel/intel_screen.c
-index 7042c25..09eba13 100644
---- a/src/mesa/drivers/dri/intel/intel_screen.c
-+++ b/src/mesa/drivers/dri/intel/intel_screen.c
-@@ -28,27 +28,27 @@
- #include "main/glheader.h"
- #include "main/context.h"
- #include "main/framebuffer.h"
--#include "main/matrix.h"
- #include "main/renderbuffer.h"
--#include "main/simple_list.h"
-+
- #include "utils.h"
- #include "vblank.h"
- #include "xmlpool.h"
-
--
--#include "intel_screen.h"
--
-+#include "intel_batchbuffer.h"
- #include "intel_buffers.h"
--#include "intel_tex.h"
--#include "intel_span.h"
--#include "intel_fbo.h"
-+#include "intel_bufmgr.h"
- #include "intel_chipset.h"
-+#include "intel_extensions.h"
-+#include "intel_fbo.h"
-+#include "intel_regions.h"
-+#include "intel_swapbuffers.h"
-+#include "intel_screen.h"
-+#include "intel_span.h"
-+#include "intel_tex.h"
-
- #include "i915_drm.h"
- #include "i830_dri.h"
--#include "intel_regions.h"
--#include "intel_batchbuffer.h"
--#include "intel_bufmgr.h"
-+
-
- PUBLIC const char __driConfigOptions[] =
- DRI_CONF_BEGIN
-@@ -159,7 +159,7 @@ intelPrintSAREA(const drm_i915_sarea_t * sarea)
- * A number of the screen parameters are obtained/computed from
- * information in the SAREA. This function updates those parameters.
- */
--void
-+static void
- intelUpdateScreenFromSAREA(intelScreenPrivate * intelScreen,
- drm_i915_sarea_t * sarea)
- {
-@@ -302,6 +302,7 @@ intelDestroyScreen(__DRIscreenPrivate * sPriv)
-
- dri_bufmgr_destroy(intelScreen->bufmgr);
- intelUnmapScreenRegions(intelScreen);
-+ driDestroyOptionCache(&intelScreen->optionCache);
-
- FREE(intelScreen);
- sPriv->private = NULL;
-@@ -316,15 +317,13 @@ intelCreateBuffer(__DRIscreenPrivate * driScrnPriv,
- __DRIdrawablePrivate * driDrawPriv,
- const __GLcontextModes * mesaVis, GLboolean isPixmap)
- {
-- intelScreenPrivate *screen = (intelScreenPrivate *) driScrnPriv->private;
--
- if (isPixmap) {
- return GL_FALSE; /* not implemented */
- }
- else {
- GLboolean swStencil = (mesaVis->stencilBits > 0 &&
- mesaVis->depthBits != 24);
-- GLenum rgbFormat = (mesaVis->redBits == 5 ? GL_RGB5 : GL_RGBA8);
-+ GLenum rgbFormat;
-
- struct intel_framebuffer *intel_fb = CALLOC_STRUCT(intel_framebuffer);
-
-@@ -333,6 +332,13 @@ intelCreateBuffer(__DRIscreenPrivate * driScrnPriv,
-
- _mesa_initialize_framebuffer(&intel_fb->Base, mesaVis);
-
-+ if (mesaVis->redBits == 5)
-+ rgbFormat = GL_RGB5;
-+ else if (mesaVis->alphaBits == 0)
-+ rgbFormat = GL_RGB8;
-+ else
-+ rgbFormat = GL_RGBA8;
-+
- /* setup the hardware-based renderbuffers */
- intel_fb->color_rb[0] = intel_create_renderbuffer(rgbFormat);
- _mesa_add_renderbuffer(&intel_fb->Base, BUFFER_FRONT_LEFT,
-@@ -467,8 +473,6 @@ intelFillInModes(__DRIscreenPrivate *psp,
- __GLcontextModes *m;
- unsigned depth_buffer_factor;
- unsigned back_buffer_factor;
-- GLenum fb_format;
-- GLenum fb_type;
- int i;
-
- /* GLX_SWAP_COPY_OML is only supported because the Intel driver doesn't
-@@ -480,6 +484,7 @@ intelFillInModes(__DRIscreenPrivate *psp,
-
- uint8_t depth_bits_array[3];
- uint8_t stencil_bits_array[3];
-+ uint8_t msaa_samples_array[1];
-
- depth_bits_array[0] = 0;
- depth_bits_array[1] = depth_bits;
-@@ -496,22 +501,39 @@ intelFillInModes(__DRIscreenPrivate *psp,
-
- stencil_bits_array[2] = (stencil_bits == 0) ? 8 : stencil_bits;
-
-+ msaa_samples_array[0] = 0;
-+
- depth_buffer_factor = ((depth_bits != 0) || (stencil_bits != 0)) ? 3 : 1;
- back_buffer_factor = (have_back_buffer) ? 3 : 1;
-
- if (pixel_bits == 16) {
-- fb_format = GL_RGB;
-- fb_type = GL_UNSIGNED_SHORT_5_6_5;
-+ configs = driCreateConfigs(GL_RGB, GL_UNSIGNED_SHORT_5_6_5,
-+ depth_bits_array, stencil_bits_array,
-+ depth_buffer_factor, back_buffer_modes,
-+ back_buffer_factor,
-+ msaa_samples_array, 1);
- }
- else {
-- fb_format = GL_BGRA;
-- fb_type = GL_UNSIGNED_INT_8_8_8_8_REV;
-+ __DRIconfig **configs_a8r8g8b8;
-+ __DRIconfig **configs_x8r8g8b8;
-+
-+ configs_a8r8g8b8 = driCreateConfigs(GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV,
-+ depth_bits_array,
-+ stencil_bits_array,
-+ depth_buffer_factor,
-+ back_buffer_modes,
-+ back_buffer_factor,
-+ msaa_samples_array, 1);
-+ configs_x8r8g8b8 = driCreateConfigs(GL_BGR, GL_UNSIGNED_INT_8_8_8_8_REV,
-+ depth_bits_array,
-+ stencil_bits_array,
-+ depth_buffer_factor,
-+ back_buffer_modes,
-+ back_buffer_factor,
-+ msaa_samples_array, 1);
-+ configs = driConcatConfigs(configs_a8r8g8b8, configs_x8r8g8b8);
- }
-
-- configs = driCreateConfigs(fb_format, fb_type,
-- depth_bits_array, stencil_bits_array,
-- depth_buffer_factor, back_buffer_modes,
-- back_buffer_factor);
- if (configs == NULL) {
- fprintf(stderr, "[%s:%u] Error creating FBConfig!\n", __func__,
- __LINE__);
-@@ -673,6 +695,17 @@ static const
- __DRIconfig **intelInitScreen2(__DRIscreenPrivate *psp)
- {
- intelScreenPrivate *intelScreen;
-+ GLenum fb_format[3];
-+ GLenum fb_type[3];
-+ /* GLX_SWAP_COPY_OML is only supported because the Intel driver doesn't
-+ * support pageflipping at all.
-+ */
-+ static const GLenum back_buffer_modes[] = {
-+ GLX_NONE, GLX_SWAP_UNDEFINED_OML, GLX_SWAP_COPY_OML
-+ };
-+ uint8_t depth_bits[4], stencil_bits[4], msaa_samples_array[1];
-+ int color;
-+ __DRIconfig **configs = NULL;
-
- /* Calling driInitExtensions here, with a NULL context pointer,
- * does not actually enable the extensions. It just makes sure
-@@ -712,8 +745,71 @@ __DRIconfig **intelInitScreen2(__DRIscreenPrivate *psp)
- intelScreen->irq_active = 1;
- psp->extensions = intelScreenExtensions;
-
-- return driConcatConfigs(intelFillInModes(psp, 16, 16, 0, 1),
-- intelFillInModes(psp, 32, 24, 8, 1));
-+ depth_bits[0] = 0;
-+ stencil_bits[0] = 0;
-+ depth_bits[1] = 16;
-+ stencil_bits[1] = 0;
-+ depth_bits[2] = 24;
-+ stencil_bits[2] = 0;
-+ depth_bits[3] = 24;
-+ stencil_bits[3] = 8;
-+
-+ msaa_samples_array[0] = 0;
-+
-+ fb_format[0] = GL_RGB;
-+ fb_type[0] = GL_UNSIGNED_SHORT_5_6_5;
-+
-+ fb_format[1] = GL_BGR;
-+ fb_type[1] = GL_UNSIGNED_INT_8_8_8_8_REV;
-+
-+ fb_format[2] = GL_BGRA;
-+ fb_type[2] = GL_UNSIGNED_INT_8_8_8_8_REV;
-+
-+ depth_bits[0] = 0;
-+ stencil_bits[0] = 0;
-+
-+ for (color = 0; color < ARRAY_SIZE(fb_format); color++) {
-+ __DRIconfig **new_configs;
-+ int depth_factor;
-+
-+ /* With DRI2 right now, GetBuffers always returns a depth/stencil buffer
-+ * with the same cpp as the drawable. So we can't support depth cpp !=
-+ * color cpp currently.
-+ */
-+ if (fb_type[color] == GL_UNSIGNED_SHORT_5_6_5) {
-+ depth_bits[1] = 16;
-+ stencil_bits[1] = 0;
-+
-+ depth_factor = 2;
-+ } else {
-+ depth_bits[1] = 24;
-+ stencil_bits[1] = 0;
-+ depth_bits[2] = 24;
-+ stencil_bits[2] = 8;
-+
-+ depth_factor = 3;
-+ }
-+ new_configs = driCreateConfigs(fb_format[color], fb_type[color],
-+ depth_bits,
-+ stencil_bits,
-+ depth_factor,
-+ back_buffer_modes,
-+ ARRAY_SIZE(back_buffer_modes),
-+ msaa_samples_array,
-+ ARRAY_SIZE(msaa_samples_array));
-+ if (configs == NULL)
-+ configs = new_configs;
-+ else
-+ configs = driConcatConfigs(configs, new_configs);
-+ }
-+
-+ if (configs == NULL) {
-+ fprintf(stderr, "[%s:%u] Error creating FBConfig!\n", __func__,
-+ __LINE__);
-+ return NULL;
-+ }
-+
-+ return (const __DRIconfig **)configs;
- }
-
- const struct __DriverAPIRec driDriverAPI = {
-diff --git a/src/mesa/drivers/dri/intel/intel_screen.h b/src/mesa/drivers/dri/intel/intel_screen.h
-index fcd0d9c..e1036de 100644
---- a/src/mesa/drivers/dri/intel/intel_screen.h
-+++ b/src/mesa/drivers/dri/intel/intel_screen.h
-@@ -92,10 +92,6 @@ extern GLboolean intelMapScreenRegions(__DRIscreenPrivate * sPriv);
-
- extern void intelUnmapScreenRegions(intelScreenPrivate * intelScreen);
-
--extern void
--intelUpdateScreenFromSAREA(intelScreenPrivate * intelScreen,
-- drm_i915_sarea_t * sarea);
--
- extern void intelDestroyContext(__DRIcontextPrivate * driContextPriv);
-
- extern GLboolean intelUnbindContext(__DRIcontextPrivate * driContextPriv);
-@@ -105,11 +101,6 @@ intelMakeCurrent(__DRIcontextPrivate * driContextPriv,
- __DRIdrawablePrivate * driDrawPriv,
- __DRIdrawablePrivate * driReadPriv);
-
--extern void intelSwapBuffers(__DRIdrawablePrivate * dPriv);
--
--extern void
--intelCopySubBuffer(__DRIdrawablePrivate * dPriv, int x, int y, int w, int h);
--
- extern struct intel_context *intelScreenContext(intelScreenPrivate *intelScreen);
-
- #endif
-diff --git a/src/mesa/drivers/dri/intel/intel_span.c b/src/mesa/drivers/dri/intel/intel_span.c
-index d931504..c3a873f 100644
---- a/src/mesa/drivers/dri/intel/intel_span.c
-+++ b/src/mesa/drivers/dri/intel/intel_span.c
-@@ -131,6 +131,18 @@ pwrite_8(struct intel_renderbuffer *irb, uint32_t offset, uint8_t val)
- dri_bo_subdata(irb->region->buffer, offset, 1, &val);
- }
-
-+static uint32_t
-+z24s8_to_s8z24(uint32_t val)
-+{
-+ return (val << 24) | (val >> 8);
-+}
-+
-+static uint32_t
-+s8z24_to_z24s8(uint32_t val)
-+{
-+ return (val >> 24) | (val << 8);
-+}
-+
- static uint32_t no_tile_swizzle(struct intel_renderbuffer *irb,
- int x, int y)
- {
-@@ -150,7 +162,7 @@ static uint32_t x_tile_swizzle(struct intel_renderbuffer *irb,
- int x_tile_number, y_tile_number;
- int tile_off, tile_base;
-
-- tile_stride = (irb->pfPitch * irb->region->cpp) << 3;
-+ tile_stride = (irb->region->pitch * irb->region->cpp) << 3;
-
- xbyte = x * irb->region->cpp;
-
-@@ -190,7 +202,7 @@ static uint32_t x_tile_swizzle(struct intel_renderbuffer *irb,
- printf("(%d,%d) -> %d + %d = %d (pitch = %d, tstride = %d)\n",
- x, y, tile_off, tile_base,
- tile_off + tile_base,
-- irb->pfPitch, tile_stride);
-+ irb->region->pitch, tile_stride);
- #endif
-
- return tile_base + tile_off;
-@@ -205,7 +217,7 @@ static uint32_t y_tile_swizzle(struct intel_renderbuffer *irb,
- int x_tile_number, y_tile_number;
- int tile_off, tile_base;
-
-- tile_stride = (irb->pfPitch * irb->region->cpp) << 5;
-+ tile_stride = (irb->region->pitch * irb->region->cpp) << 5;
-
- xbyte = x * irb->region->cpp;
-
-@@ -255,8 +267,8 @@ static uint32_t y_tile_swizzle(struct intel_renderbuffer *irb,
- #define LOCAL_VARS \
- struct intel_context *intel = intel_context(ctx); \
- struct intel_renderbuffer *irb = intel_renderbuffer(rb); \
-- const GLint yScale = irb->RenderToTexture ? 1 : -1; \
-- const GLint yBias = irb->RenderToTexture ? 0 : irb->Base.Height - 1; \
-+ const GLint yScale = ctx->DrawBuffer->Name ? 1 : -1; \
-+ const GLint yBias = ctx->DrawBuffer->Name ? 0 : irb->Base.Height - 1;\
- unsigned int num_cliprects; \
- struct drm_clip_rect *cliprects; \
- int x_off, y_off; \
-@@ -293,107 +305,35 @@ static uint32_t y_tile_swizzle(struct intel_renderbuffer *irb,
- #define X_TILE(_X, _Y) x_tile_swizzle(irb, (_X) + x_off, (_Y) + y_off)
- #define Y_TILE(_X, _Y) y_tile_swizzle(irb, (_X) + x_off, (_Y) + y_off)
-
--/* 16 bit, RGB565 color spanline and pixel functions
-- */
--#define SPANTMP_PIXEL_FMT GL_RGB
--#define SPANTMP_PIXEL_TYPE GL_UNSIGNED_SHORT_5_6_5
--
--#define TAG(x) intel##x##_RGB565
--#define TAG2(x,y) intel##x##_RGB565##y
--#define GET_VALUE(X, Y) pread_16(irb, NO_TILE(X, Y))
--#define PUT_VALUE(X, Y, V) pwrite_16(irb, NO_TILE(X, Y), V)
--#include "spantmp2.h"
--
--/* 32 bit, ARGB8888 color spanline and pixel functions
-- */
--#define SPANTMP_PIXEL_FMT GL_BGRA
--#define SPANTMP_PIXEL_TYPE GL_UNSIGNED_INT_8_8_8_8_REV
--
--#define TAG(x) intel##x##_ARGB8888
--#define TAG2(x,y) intel##x##_ARGB8888##y
--#define GET_VALUE(X, Y) pread_32(irb, NO_TILE(X, Y))
--#define PUT_VALUE(X, Y, V) pwrite_32(irb, NO_TILE(X, Y), V)
--#include "spantmp2.h"
--
--/* 32 bit, xRGB8888 color spanline and pixel functions
-- */
--#define SPANTMP_PIXEL_FMT GL_BGRA
--#define SPANTMP_PIXEL_TYPE GL_UNSIGNED_INT_8_8_8_8_REV
--
--#define TAG(x) intel##x##_xRGB8888
--#define TAG2(x,y) intel##x##_xRGB8888##y
--#define GET_VALUE(X, Y) pread_xrgb8888(irb, NO_TILE(X, Y))
--#define PUT_VALUE(X, Y, V) pwrite_xrgb8888(irb, NO_TILE(X, Y), V)
--#include "spantmp2.h"
--
--/* 16 bit RGB565 color tile spanline and pixel functions
-- */
--
--#define SPANTMP_PIXEL_FMT GL_RGB
--#define SPANTMP_PIXEL_TYPE GL_UNSIGNED_SHORT_5_6_5
--
--#define TAG(x) intel_XTile_##x##_RGB565
--#define TAG2(x,y) intel_XTile_##x##_RGB565##y
--#define GET_VALUE(X, Y) pread_16(irb, X_TILE(X, Y))
--#define PUT_VALUE(X, Y, V) pwrite_16(irb, X_TILE(X, Y), V)
--#include "spantmp2.h"
--
--#define SPANTMP_PIXEL_FMT GL_RGB
--#define SPANTMP_PIXEL_TYPE GL_UNSIGNED_SHORT_5_6_5
--
--#define TAG(x) intel_YTile_##x##_RGB565
--#define TAG2(x,y) intel_YTile_##x##_RGB565##y
--#define GET_VALUE(X, Y) pread_16(irb, Y_TILE(X, Y))
--#define PUT_VALUE(X, Y, V) pwrite_16(irb, Y_TILE(X, Y), V)
--#include "spantmp2.h"
--
--/* 32 bit ARGB888 color tile spanline and pixel functions
-- */
--
--#define SPANTMP_PIXEL_FMT GL_BGRA
--#define SPANTMP_PIXEL_TYPE GL_UNSIGNED_INT_8_8_8_8_REV
--
--#define TAG(x) intel_XTile_##x##_ARGB8888
--#define TAG2(x,y) intel_XTile_##x##_ARGB8888##y
--#define GET_VALUE(X, Y) pread_32(irb, X_TILE(X, Y))
--#define PUT_VALUE(X, Y, V) pwrite_32(irb, X_TILE(X, Y), V)
--#include "spantmp2.h"
--
--#define SPANTMP_PIXEL_FMT GL_BGRA
--#define SPANTMP_PIXEL_TYPE GL_UNSIGNED_INT_8_8_8_8_REV
--
--#define TAG(x) intel_YTile_##x##_ARGB8888
--#define TAG2(x,y) intel_YTile_##x##_ARGB8888##y
--#define GET_VALUE(X, Y) pread_32(irb, Y_TILE(X, Y))
--#define PUT_VALUE(X, Y, V) pwrite_32(irb, Y_TILE(X, Y), V)
--#include "spantmp2.h"
--
--/* 32 bit xRGB888 color tile spanline and pixel functions
-- */
--
--#define SPANTMP_PIXEL_FMT GL_BGRA
--#define SPANTMP_PIXEL_TYPE GL_UNSIGNED_INT_8_8_8_8_REV
--
--#define TAG(x) intel_XTile_##x##_xRGB8888
--#define TAG2(x,y) intel_XTile_##x##_xRGB8888##y
--#define GET_VALUE(X, Y) pread_xrgb8888(irb, X_TILE(X, Y))
--#define PUT_VALUE(X, Y, V) pwrite_xrgb8888(irb, X_TILE(X, Y), V)
--#include "spantmp2.h"
--
--#define SPANTMP_PIXEL_FMT GL_BGRA
--#define SPANTMP_PIXEL_TYPE GL_UNSIGNED_INT_8_8_8_8_REV
--
--#define TAG(x) intel_YTile_##x##_xRGB8888
--#define TAG2(x,y) intel_YTile_##x##_xRGB8888##y
--#define GET_VALUE(X, Y) pread_xrgb8888(irb, Y_TILE(X, Y))
--#define PUT_VALUE(X, Y, V) pwrite_xrgb8888(irb, Y_TILE(X, Y), V)
--#include "spantmp2.h"
-+/* r5g6b5 color span and pixel functions */
-+#define INTEL_PIXEL_FMT GL_RGB
-+#define INTEL_PIXEL_TYPE GL_UNSIGNED_SHORT_5_6_5
-+#define INTEL_READ_VALUE(offset) pread_16(irb, offset)
-+#define INTEL_WRITE_VALUE(offset, v) pwrite_16(irb, offset, v)
-+#define INTEL_TAG(x) x##_RGB565
-+#include "intel_spantmp.h"
-+
-+/* a8r8g8b8 color span and pixel functions */
-+#define INTEL_PIXEL_FMT GL_BGRA
-+#define INTEL_PIXEL_TYPE GL_UNSIGNED_INT_8_8_8_8_REV
-+#define INTEL_READ_VALUE(offset) pread_32(irb, offset)
-+#define INTEL_WRITE_VALUE(offset, v) pwrite_32(irb, offset, v)
-+#define INTEL_TAG(x) x##_ARGB8888
-+#include "intel_spantmp.h"
-+
-+/* x8r8g8b8 color span and pixel functions */
-+#define INTEL_PIXEL_FMT GL_BGRA
-+#define INTEL_PIXEL_TYPE GL_UNSIGNED_INT_8_8_8_8_REV
-+#define INTEL_READ_VALUE(offset) pread_xrgb8888(irb, offset)
-+#define INTEL_WRITE_VALUE(offset, v) pwrite_xrgb8888(irb, offset, v)
-+#define INTEL_TAG(x) x##_xRGB8888
-+#include "intel_spantmp.h"
-
- #define LOCAL_DEPTH_VARS \
- struct intel_context *intel = intel_context(ctx); \
- struct intel_renderbuffer *irb = intel_renderbuffer(rb); \
-- const GLint yScale = irb->RenderToTexture ? 1 : -1; \
-- const GLint yBias = irb->RenderToTexture ? 0 : irb->Base.Height - 1; \
-+ const GLint yScale = ctx->DrawBuffer->Name ? 1 : -1; \
-+ const GLint yBias = ctx->DrawBuffer->Name ? 0 : irb->Base.Height - 1;\
- unsigned int num_cliprects; \
- struct drm_clip_rect *cliprects; \
- int x_off, y_off; \
-@@ -402,98 +342,26 @@ static uint32_t y_tile_swizzle(struct intel_renderbuffer *irb,
-
- #define LOCAL_STENCIL_VARS LOCAL_DEPTH_VARS
-
--/**
-- ** 16-bit depthbuffer functions.
-- **/
--#define VALUE_TYPE GLushort
--#define WRITE_DEPTH(_x, _y, d) pwrite_16(irb, NO_TILE(_x, _y), d)
--#define READ_DEPTH(d, _x, _y) d = pread_16(irb, NO_TILE(_x, _y))
--#define TAG(x) intel##x##_z16
--#include "depthtmp.h"
--
--
--/**
-- ** 16-bit x tile depthbuffer functions.
-- **/
--#define VALUE_TYPE GLushort
--#define WRITE_DEPTH(_x, _y, d) pwrite_16(irb, X_TILE(_x, _y), d)
--#define READ_DEPTH(d, _x, _y) d = pread_16(irb, X_TILE(_x, _y))
--#define TAG(x) intel_XTile_##x##_z16
--#include "depthtmp.h"
--
--/**
-- ** 16-bit y tile depthbuffer functions.
-- **/
--#define VALUE_TYPE GLushort
--#define WRITE_DEPTH(_x, _y, d) pwrite_16(irb, Y_TILE(_x, _y), d)
--#define READ_DEPTH(d, _x, _y) d = pread_16(irb, Y_TILE(_x, _y))
--#define TAG(x) intel_YTile_##x##_z16
--#include "depthtmp.h"
--
--
--/**
-- ** 24/8-bit interleaved depth/stencil functions
-- ** Note: we're actually reading back combined depth+stencil values.
-- ** The wrappers in main/depthstencil.c are used to extract the depth
-- ** and stencil values.
-- **/
--#define VALUE_TYPE GLuint
--
--/* Change ZZZS -> SZZZ */
--#define WRITE_DEPTH(_x, _y, d) \
-- pwrite_32(irb, NO_TILE(_x, _y), ((d) >> 8) | ((d) << 24))
--
--/* Change SZZZ -> ZZZS */
--#define READ_DEPTH( d, _x, _y ) { \
-- GLuint tmp = pread_32(irb, NO_TILE(_x, _y)); \
-- d = (tmp << 8) | (tmp >> 24); \
--}
--
--#define TAG(x) intel##x##_z24_s8
--#include "depthtmp.h"
--
--
--/**
-- ** 24/8-bit x-tile interleaved depth/stencil functions
-- ** Note: we're actually reading back combined depth+stencil values.
-- ** The wrappers in main/depthstencil.c are used to extract the depth
-- ** and stencil values.
-- **/
--#define VALUE_TYPE GLuint
-+/* z16 depthbuffer functions. */
-+#define INTEL_VALUE_TYPE GLushort
-+#define INTEL_WRITE_DEPTH(offset, d) pwrite_16(irb, offset, d)
-+#define INTEL_READ_DEPTH(offset) pread_16(irb, offset)
-+#define INTEL_TAG(name) name##_z16
-+#include "intel_depthtmp.h"
-
--/* Change ZZZS -> SZZZ */
--#define WRITE_DEPTH(_x, _y, d) \
-- pwrite_32(irb, X_TILE(_x, _y), ((d) >> 8) | ((d) << 24))
-+/* z24 depthbuffer functions. */
-+#define INTEL_VALUE_TYPE GLuint
-+#define INTEL_WRITE_DEPTH(offset, d) pwrite_32(irb, offset, d)
-+#define INTEL_READ_DEPTH(offset) pread_32(irb, offset)
-+#define INTEL_TAG(name) name##_z24
-+#include "intel_depthtmp.h"
-
--/* Change SZZZ -> ZZZS */
--#define READ_DEPTH( d, _x, _y ) { \
-- GLuint tmp = pread_32(irb, X_TILE(_x, _y)); \
-- d = (tmp << 8) | (tmp >> 24); \
--}
--
--#define TAG(x) intel_XTile_##x##_z24_s8
--#include "depthtmp.h"
--
--/**
-- ** 24/8-bit y-tile interleaved depth/stencil functions
-- ** Note: we're actually reading back combined depth+stencil values.
-- ** The wrappers in main/depthstencil.c are used to extract the depth
-- ** and stencil values.
-- **/
--#define VALUE_TYPE GLuint
--
--/* Change ZZZS -> SZZZ */
--#define WRITE_DEPTH(_x, _y, d) \
-- pwrite_32(irb, Y_TILE(_x, _y), ((d) >> 8) | ((d) << 24))
--
--/* Change SZZZ -> ZZZS */
--#define READ_DEPTH( d, _x, _y ) { \
-- GLuint tmp = pread_32(irb, Y_TILE(_x, _y)); \
-- d = (tmp << 8) | (tmp >> 24); \
--}
--
--#define TAG(x) intel_YTile_##x##_z24_s8
--#include "depthtmp.h"
-+/* z24s8 depthbuffer functions. */
-+#define INTEL_VALUE_TYPE GLuint
-+#define INTEL_WRITE_DEPTH(offset, d) pwrite_32(irb, offset, z24s8_to_s8z24(d))
-+#define INTEL_READ_DEPTH(offset) s8z24_to_z24s8(pread_32(irb, offset))
-+#define INTEL_TAG(name) name##_z24_s8
-+#include "intel_depthtmp.h"
-
-
- /**
-@@ -528,8 +396,6 @@ intel_renderbuffer_map(struct intel_context *intel, struct gl_renderbuffer *rb)
- if (irb == NULL || irb->region == NULL)
- return;
-
-- irb->pfPitch = irb->region->pitch;
--
- intel_set_span_functions(intel, rb);
- }
-
-@@ -543,7 +409,6 @@ intel_renderbuffer_unmap(struct intel_context *intel,
- return;
-
- clear_span_cache(irb);
-- irb->pfPitch = 0;
-
- rb->GetRow = NULL;
- rb->PutRow = NULL;
-@@ -755,8 +620,21 @@ intel_set_span_functions(struct intel_context *intel,
- break;
- }
- }
-- else if (rb->_ActualFormat == GL_DEPTH_COMPONENT24 || /* XXX FBO remove */
-- rb->_ActualFormat == GL_DEPTH24_STENCIL8_EXT) {
-+ else if (rb->_ActualFormat == GL_DEPTH_COMPONENT24) {
-+ switch (tiling) {
-+ case I915_TILING_NONE:
-+ default:
-+ intelInitDepthPointers_z24(rb);
-+ break;
-+ case I915_TILING_X:
-+ intel_XTile_InitDepthPointers_z24(rb);
-+ break;
-+ case I915_TILING_Y:
-+ intel_YTile_InitDepthPointers_z24(rb);
-+ break;
-+ }
-+ }
-+ else if (rb->_ActualFormat == GL_DEPTH24_STENCIL8_EXT) {
- switch (tiling) {
- case I915_TILING_NONE:
- default:
-diff --git a/src/mesa/drivers/dri/intel/intel_spantmp.h b/src/mesa/drivers/dri/intel/intel_spantmp.h
-new file mode 100644
-index 0000000..ead0b1c
---- /dev/null
-+++ b/src/mesa/drivers/dri/intel/intel_spantmp.h
-@@ -0,0 +1,61 @@
-+/*
-+ * Copyright © 2009 Intel Corporation
-+ *
-+ * Permission is hereby granted, free of charge, to any person obtaining a
-+ * copy of this software and associated documentation files (the "Software"),
-+ * to deal in the Software without restriction, including without limitation
-+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
-+ * and/or sell copies of the Software, and to permit persons to whom the
-+ * Software is furnished to do so, subject to the following conditions:
-+ *
-+ * The above copyright notice and this permission notice (including the next
-+ * paragraph) shall be included in all copies or substantial portions of the
-+ * Software.
-+ *
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
-+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-+ * IN THE SOFTWARE.
-+ *
-+ * Authors:
-+ * Eric Anholt <eric@anholt.net>
-+ *
-+ */
-+
-+/**
-+ * Wrapper around the spantmp.h macrofest to generate spans code for
-+ * all the tiling styles.
-+ */
-+
-+#define SPANTMP_PIXEL_FMT INTEL_PIXEL_FMT
-+#define SPANTMP_PIXEL_TYPE INTEL_PIXEL_TYPE
-+#define PUT_VALUE(_x, _y, v) INTEL_WRITE_VALUE(NO_TILE(_x, _y), v)
-+#define GET_VALUE(_x, _y) INTEL_READ_VALUE(NO_TILE(_x, _y))
-+#define TAG(x) INTEL_TAG(intel##x)
-+#define TAG2(x, y) INTEL_TAG(intel##x)##y
-+#include "spantmp2.h"
-+
-+#define SPANTMP_PIXEL_FMT INTEL_PIXEL_FMT
-+#define SPANTMP_PIXEL_TYPE INTEL_PIXEL_TYPE
-+#define PUT_VALUE(_x, _y, v) INTEL_WRITE_VALUE(X_TILE(_x, _y), v)
-+#define GET_VALUE(_x, _y) INTEL_READ_VALUE(X_TILE(_x, _y))
-+#define TAG(x) INTEL_TAG(intel_XTile_##x)
-+#define TAG2(x, y) INTEL_TAG(intel_XTile_##x)##y
-+#include "spantmp2.h"
-+
-+#define SPANTMP_PIXEL_FMT INTEL_PIXEL_FMT
-+#define SPANTMP_PIXEL_TYPE INTEL_PIXEL_TYPE
-+#define PUT_VALUE(_x, _y, v) INTEL_WRITE_VALUE(X_TILE(_x, _y), v)
-+#define GET_VALUE(_x, _y) INTEL_READ_VALUE(X_TILE(_x, _y))
-+#define TAG(x) INTEL_TAG(intel_YTile_##x)
-+#define TAG2(x, y) INTEL_TAG(intel_YTile_##x)##y
-+#include "spantmp2.h"
-+
-+#undef INTEL_PIXEL_FMT
-+#undef INTEL_PIXEL_TYPE
-+#undef INTEL_WRITE_VALUE
-+#undef INTEL_READ_VALUE
-+#undef INTEL_TAG
-diff --git a/src/mesa/drivers/dri/intel/intel_state.c b/src/mesa/drivers/dri/intel/intel_state.c
-new file mode 100644
-index 0000000..4ee7423
---- /dev/null
-+++ b/src/mesa/drivers/dri/intel/intel_state.c
-@@ -0,0 +1,233 @@
-+/**************************************************************************
-+ *
-+ * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas.
-+ * All Rights Reserved.
-+ *
-+ * Permission is hereby granted, free of charge, to any person obtaining a
-+ * copy of this software and associated documentation files (the
-+ * "Software"), to deal in the Software without restriction, including
-+ * without limitation the rights to use, copy, modify, merge, publish,
-+ * distribute, sub license, and/or sell copies of the Software, and to
-+ * permit persons to whom the Software is furnished to do so, subject to
-+ * the following conditions:
-+ *
-+ * The above copyright notice and this permission notice (including the
-+ * next paragraph) shall be included in all copies or substantial portions
-+ * of the Software.
-+ *
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
-+ * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
-+ * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-+ *
-+ **************************************************************************/
-+
-+
-+#include "main/glheader.h"
-+#include "main/context.h"
-+#include "main/macros.h"
-+#include "main/enums.h"
-+#include "main/colormac.h"
-+#include "main/dd.h"
-+
-+#include "intel_screen.h"
-+#include "intel_context.h"
-+#include "intel_regions.h"
-+#include "swrast/swrast.h"
-+
-+int
-+intel_translate_shadow_compare_func(GLenum func)
-+{
-+ switch (func) {
-+ case GL_NEVER:
-+ return COMPAREFUNC_ALWAYS;
-+ case GL_LESS:
-+ return COMPAREFUNC_LEQUAL;
-+ case GL_LEQUAL:
-+ return COMPAREFUNC_LESS;
-+ case GL_GREATER:
-+ return COMPAREFUNC_GEQUAL;
-+ case GL_GEQUAL:
-+ return COMPAREFUNC_GREATER;
-+ case GL_NOTEQUAL:
-+ return COMPAREFUNC_EQUAL;
-+ case GL_EQUAL:
-+ return COMPAREFUNC_NOTEQUAL;
-+ case GL_ALWAYS:
-+ return COMPAREFUNC_NEVER;
-+ }
-+
-+ fprintf(stderr, "Unknown value in %s: %x\n", __FUNCTION__, func);
-+ return COMPAREFUNC_NEVER;
-+}
-+
-+int
-+intel_translate_compare_func(GLenum func)
-+{
-+ switch (func) {
-+ case GL_NEVER:
-+ return COMPAREFUNC_NEVER;
-+ case GL_LESS:
-+ return COMPAREFUNC_LESS;
-+ case GL_LEQUAL:
-+ return COMPAREFUNC_LEQUAL;
-+ case GL_GREATER:
-+ return COMPAREFUNC_GREATER;
-+ case GL_GEQUAL:
-+ return COMPAREFUNC_GEQUAL;
-+ case GL_NOTEQUAL:
-+ return COMPAREFUNC_NOTEQUAL;
-+ case GL_EQUAL:
-+ return COMPAREFUNC_EQUAL;
-+ case GL_ALWAYS:
-+ return COMPAREFUNC_ALWAYS;
-+ }
-+
-+ fprintf(stderr, "Unknown value in %s: %x\n", __FUNCTION__, func);
-+ return COMPAREFUNC_ALWAYS;
-+}
-+
-+int
-+intel_translate_stencil_op(GLenum op)
-+{
-+ switch (op) {
-+ case GL_KEEP:
-+ return STENCILOP_KEEP;
-+ case GL_ZERO:
-+ return STENCILOP_ZERO;
-+ case GL_REPLACE:
-+ return STENCILOP_REPLACE;
-+ case GL_INCR:
-+ return STENCILOP_INCRSAT;
-+ case GL_DECR:
-+ return STENCILOP_DECRSAT;
-+ case GL_INCR_WRAP:
-+ return STENCILOP_INCR;
-+ case GL_DECR_WRAP:
-+ return STENCILOP_DECR;
-+ case GL_INVERT:
-+ return STENCILOP_INVERT;
-+ default:
-+ return STENCILOP_ZERO;
-+ }
-+}
-+
-+int
-+intel_translate_blend_factor(GLenum factor)
-+{
-+ switch (factor) {
-+ case GL_ZERO:
-+ return BLENDFACT_ZERO;
-+ case GL_SRC_ALPHA:
-+ return BLENDFACT_SRC_ALPHA;
-+ case GL_ONE:
-+ return BLENDFACT_ONE;
-+ case GL_SRC_COLOR:
-+ return BLENDFACT_SRC_COLR;
-+ case GL_ONE_MINUS_SRC_COLOR:
-+ return BLENDFACT_INV_SRC_COLR;
-+ case GL_DST_COLOR:
-+ return BLENDFACT_DST_COLR;
-+ case GL_ONE_MINUS_DST_COLOR:
-+ return BLENDFACT_INV_DST_COLR;
-+ case GL_ONE_MINUS_SRC_ALPHA:
-+ return BLENDFACT_INV_SRC_ALPHA;
-+ case GL_DST_ALPHA:
-+ return BLENDFACT_DST_ALPHA;
-+ case GL_ONE_MINUS_DST_ALPHA:
-+ return BLENDFACT_INV_DST_ALPHA;
-+ case GL_SRC_ALPHA_SATURATE:
-+ return BLENDFACT_SRC_ALPHA_SATURATE;
-+ case GL_CONSTANT_COLOR:
-+ return BLENDFACT_CONST_COLOR;
-+ case GL_ONE_MINUS_CONSTANT_COLOR:
-+ return BLENDFACT_INV_CONST_COLOR;
-+ case GL_CONSTANT_ALPHA:
-+ return BLENDFACT_CONST_ALPHA;
-+ case GL_ONE_MINUS_CONSTANT_ALPHA:
-+ return BLENDFACT_INV_CONST_ALPHA;
-+ }
-+
-+ fprintf(stderr, "Unknown value in %s: %x\n", __FUNCTION__, factor);
-+ return BLENDFACT_ZERO;
-+}
-+
-+int
-+intel_translate_logic_op(GLenum opcode)
-+{
-+ switch (opcode) {
-+ case GL_CLEAR:
-+ return LOGICOP_CLEAR;
-+ case GL_AND:
-+ return LOGICOP_AND;
-+ case GL_AND_REVERSE:
-+ return LOGICOP_AND_RVRSE;
-+ case GL_COPY:
-+ return LOGICOP_COPY;
-+ case GL_COPY_INVERTED:
-+ return LOGICOP_COPY_INV;
-+ case GL_AND_INVERTED:
-+ return LOGICOP_AND_INV;
-+ case GL_NOOP:
-+ return LOGICOP_NOOP;
-+ case GL_XOR:
-+ return LOGICOP_XOR;
-+ case GL_OR:
-+ return LOGICOP_OR;
-+ case GL_OR_INVERTED:
-+ return LOGICOP_OR_INV;
-+ case GL_NOR:
-+ return LOGICOP_NOR;
-+ case GL_EQUIV:
-+ return LOGICOP_EQUIV;
-+ case GL_INVERT:
-+ return LOGICOP_INV;
-+ case GL_OR_REVERSE:
-+ return LOGICOP_OR_RVRSE;
-+ case GL_NAND:
-+ return LOGICOP_NAND;
-+ case GL_SET:
-+ return LOGICOP_SET;
-+ default:
-+ return LOGICOP_SET;
-+ }
-+}
-+
-+
-+static void
-+intelClearColor(GLcontext *ctx, const GLfloat color[4])
-+{
-+ struct intel_context *intel = intel_context(ctx);
-+ GLubyte clear[4];
-+
-+ CLAMPED_FLOAT_TO_UBYTE(clear[0], color[0]);
-+ CLAMPED_FLOAT_TO_UBYTE(clear[1], color[1]);
-+ CLAMPED_FLOAT_TO_UBYTE(clear[2], color[2]);
-+ CLAMPED_FLOAT_TO_UBYTE(clear[3], color[3]);
-+
-+ /* compute both 32 and 16-bit clear values */
-+ intel->ClearColor8888 = INTEL_PACKCOLOR8888(clear[0], clear[1],
-+ clear[2], clear[3]);
-+ intel->ClearColor565 = INTEL_PACKCOLOR565(clear[0], clear[1], clear[2]);
-+}
-+
-+
-+/* Fallback to swrast for select and feedback.
-+ */
-+static void
-+intelRenderMode(GLcontext *ctx, GLenum mode)
-+{
-+ struct intel_context *intel = intel_context(ctx);
-+ FALLBACK(intel, INTEL_FALLBACK_RENDERMODE, (mode != GL_RENDER));
-+}
-+
-+
-+void
-+intelInitStateFuncs(struct dd_function_table *functions)
-+{
-+ functions->RenderMode = intelRenderMode;
-+ functions->ClearColor = intelClearColor;
-+}
-diff --git a/src/mesa/drivers/dri/intel/intel_swapbuffers.c b/src/mesa/drivers/dri/intel/intel_swapbuffers.c
-new file mode 100644
-index 0000000..7d035b9
---- /dev/null
-+++ b/src/mesa/drivers/dri/intel/intel_swapbuffers.c
-@@ -0,0 +1,248 @@
-+/**************************************************************************
-+ *
-+ * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas.
-+ * All Rights Reserved.
-+ *
-+ * Permission is hereby granted, free of charge, to any person obtaining a
-+ * copy of this software and associated documentation files (the
-+ * "Software"), to deal in the Software without restriction, including
-+ * without limitation the rights to use, copy, modify, merge, publish,
-+ * distribute, sub license, and/or sell copies of the Software, and to
-+ * permit persons to whom the Software is furnished to do so, subject to
-+ * the following conditions:
-+ *
-+ * The above copyright notice and this permission notice (including the
-+ * next paragraph) shall be included in all copies or substantial portions
-+ * of the Software.
-+ *
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
-+ * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
-+ * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-+ *
-+ **************************************************************************/
-+
-+#include "intel_blit.h"
-+#include "intel_buffers.h"
-+#include "intel_swapbuffers.h"
-+#include "intel_fbo.h"
-+#include "intel_batchbuffer.h"
-+#include "drirenderbuffer.h"
-+#include "vblank.h"
-+#include "i915_drm.h"
-+
-+
-+
-+/*
-+ * Correct a drawablePrivate's set of vblank flags WRT the current context.
-+ * When considering multiple crtcs.
-+ */
-+GLuint
-+intelFixupVblank(struct intel_context *intel, __DRIdrawablePrivate *dPriv)
-+{
-+ if (!intel->intelScreen->driScrnPriv->dri2.enabled &&
-+ intel->intelScreen->driScrnPriv->ddx_version.minor >= 7) {
-+ volatile drm_i915_sarea_t *sarea = intel->sarea;
-+ drm_clip_rect_t drw_rect = { .x1 = dPriv->x, .x2 = dPriv->x + dPriv->w,
-+ .y1 = dPriv->y, .y2 = dPriv->y + dPriv->h };
-+ drm_clip_rect_t planeA_rect = { .x1 = sarea->planeA_x, .y1 = sarea->planeA_y,
-+ .x2 = sarea->planeA_x + sarea->planeA_w,
-+ .y2 = sarea->planeA_y + sarea->planeA_h };
-+ drm_clip_rect_t planeB_rect = { .x1 = sarea->planeB_x, .y1 = sarea->planeB_y,
-+ .x2 = sarea->planeB_x + sarea->planeB_w,
-+ .y2 = sarea->planeB_y + sarea->planeB_h };
-+ GLint areaA = driIntersectArea( drw_rect, planeA_rect );
-+ GLint areaB = driIntersectArea( drw_rect, planeB_rect );
-+ GLuint flags = dPriv->vblFlags;
-+
-+ /* Update vblank info
-+ */
-+ if (areaB > areaA || (areaA == areaB && areaB > 0)) {
-+ flags = dPriv->vblFlags | VBLANK_FLAG_SECONDARY;
-+ } else {
-+ flags = dPriv->vblFlags & ~VBLANK_FLAG_SECONDARY;
-+ }
-+
-+ /* Do the stupid test: Is one of them actually disabled?
-+ */
-+ if (sarea->planeA_w == 0 || sarea->planeA_h == 0) {
-+ flags = dPriv->vblFlags | VBLANK_FLAG_SECONDARY;
-+ } else if (sarea->planeB_w == 0 || sarea->planeB_h == 0) {
-+ flags = dPriv->vblFlags & ~VBLANK_FLAG_SECONDARY;
-+ }
-+
-+ return flags;
-+ } else {
-+ return dPriv->vblFlags & ~VBLANK_FLAG_SECONDARY;
-+ }
-+}
-+
-+
-+/**
-+ * Called from driSwapBuffers()
-+ */
-+void
-+intelSwapBuffers(__DRIdrawablePrivate * dPriv)
-+{
-+ __DRIscreenPrivate *psp = dPriv->driScreenPriv;
-+
-+ if (dPriv->driContextPriv && dPriv->driContextPriv->driverPrivate) {
-+ GET_CURRENT_CONTEXT(ctx);
-+ struct intel_context *intel;
-+
-+ if (ctx == NULL)
-+ return;
-+
-+ intel = intel_context(ctx);
-+
-+ if (ctx->Visual.doubleBufferMode) {
-+ GLboolean missed_target;
-+ struct intel_framebuffer *intel_fb = dPriv->driverPrivate;
-+ int64_t ust;
-+
-+ _mesa_notifySwapBuffers(ctx); /* flush pending rendering comands */
-+
-+ /*
-+ * The old swapping ioctl was incredibly racy, just wait for vblank
-+ * and do the swap ourselves.
-+ */
-+ driWaitForVBlank(dPriv, &missed_target);
-+
-+ /*
-+ * Update each buffer's vbl_pending so we don't get too out of
-+ * sync
-+ */
-+ intel_get_renderbuffer(&intel_fb->Base,
-+ BUFFER_BACK_LEFT)->vbl_pending = dPriv->vblSeq;
-+ intel_get_renderbuffer(&intel_fb->Base,
-+ BUFFER_FRONT_LEFT)->vbl_pending = dPriv->vblSeq;
-+
-+ intelCopyBuffer(dPriv, NULL);
-+
-+ intel_fb->swap_count++;
-+ (*psp->systemTime->getUST) (&ust);
-+ if (missed_target) {
-+ intel_fb->swap_missed_count++;
-+ intel_fb->swap_missed_ust = ust - intel_fb->swap_ust;
-+ }
-+
-+ intel_fb->swap_ust = ust;
-+ }
-+ drmCommandNone(intel->driFd, DRM_I915_GEM_THROTTLE);
-+ }
-+ else {
-+ /* XXX this shouldn't be an error but we can't handle it for now */
-+ fprintf(stderr, "%s: drawable has no context!\n", __FUNCTION__);
-+ }
-+}
-+
-+
-+/**
-+ * Called from driCopySubBuffer()
-+ */
-+void
-+intelCopySubBuffer(__DRIdrawablePrivate * dPriv, int x, int y, int w, int h)
-+{
-+ if (dPriv->driContextPriv && dPriv->driContextPriv->driverPrivate) {
-+ struct intel_context *intel =
-+ (struct intel_context *) dPriv->driContextPriv->driverPrivate;
-+ GLcontext *ctx = &intel->ctx;
-+
-+ if (ctx->Visual.doubleBufferMode) {
-+ drm_clip_rect_t rect;
-+ rect.x1 = x + dPriv->x;
-+ rect.y1 = (dPriv->h - y - h) + dPriv->y;
-+ rect.x2 = rect.x1 + w;
-+ rect.y2 = rect.y1 + h;
-+ _mesa_notifySwapBuffers(ctx); /* flush pending rendering comands */
-+ intelCopyBuffer(dPriv, &rect);
-+ }
-+ }
-+ else {
-+ /* XXX this shouldn't be an error but we can't handle it for now */
-+ fprintf(stderr, "%s: drawable has no context!\n", __FUNCTION__);
-+ }
-+}
-+
-+
-+/**
-+ * This will be called whenever the currently bound window is moved/resized.
-+ * XXX: actually, it seems to NOT be called when the window is only moved (BP).
-+ */
-+void
-+intelWindowMoved(struct intel_context *intel)
-+{
-+ GLcontext *ctx = &intel->ctx;
-+ __DRIdrawablePrivate *dPriv = intel->driDrawable;
-+ struct intel_framebuffer *intel_fb = dPriv->driverPrivate;
-+
-+ if (!intel->intelScreen->driScrnPriv->dri2.enabled &&
-+ intel->intelScreen->driScrnPriv->ddx_version.minor >= 7) {
-+ GLuint flags = intelFixupVblank(intel, dPriv);
-+
-+ /* Check to see if we changed pipes */
-+ if (flags != dPriv->vblFlags && dPriv->vblFlags &&
-+ !(dPriv->vblFlags & VBLANK_FLAG_NO_IRQ)) {
-+ int64_t count;
-+ drmVBlank vbl;
-+ int i;
-+
-+ /*
-+ * Deal with page flipping
-+ */
-+ vbl.request.type = DRM_VBLANK_ABSOLUTE;
-+
-+ if ( dPriv->vblFlags & VBLANK_FLAG_SECONDARY ) {
-+ vbl.request.type |= DRM_VBLANK_SECONDARY;
-+ }
-+
-+ for (i = 0; i < 2; i++) {
-+ if (!intel_fb->color_rb[i] ||
-+ (intel_fb->vbl_waited - intel_fb->color_rb[i]->vbl_pending) <=
-+ (1<<23))
-+ continue;
-+
-+ vbl.request.sequence = intel_fb->color_rb[i]->vbl_pending;
-+ drmWaitVBlank(intel->driFd, &vbl);
-+ }
-+
-+ /*
-+ * Update msc_base from old pipe
-+ */
-+ driDrawableGetMSC32(dPriv->driScreenPriv, dPriv, &count);
-+ dPriv->msc_base = count;
-+ /*
-+ * Then get new vblank_base and vblSeq values
-+ */
-+ dPriv->vblFlags = flags;
-+ driGetCurrentVBlank(dPriv);
-+ dPriv->vblank_base = dPriv->vblSeq;
-+
-+ intel_fb->vbl_waited = dPriv->vblSeq;
-+
-+ for (i = 0; i < 2; i++) {
-+ if (intel_fb->color_rb[i])
-+ intel_fb->color_rb[i]->vbl_pending = intel_fb->vbl_waited;
-+ }
-+ }
-+ } else {
-+ dPriv->vblFlags &= ~VBLANK_FLAG_SECONDARY;
-+ }
-+
-+ /* Update Mesa's notion of window size */
-+ driUpdateFramebufferSize(ctx, dPriv);
-+ intel_fb->Base.Initialized = GL_TRUE; /* XXX remove someday */
-+
-+ /* Update hardware scissor */
-+ if (ctx->Driver.Scissor != NULL) {
-+ ctx->Driver.Scissor(ctx, ctx->Scissor.X, ctx->Scissor.Y,
-+ ctx->Scissor.Width, ctx->Scissor.Height);
-+ }
-+
-+ /* Re-calculate viewport related state */
-+ if (ctx->Driver.DepthRange != NULL)
-+ ctx->Driver.DepthRange( ctx, ctx->Viewport.Near, ctx->Viewport.Far );
-+}
-diff --git a/src/mesa/drivers/dri/intel/intel_swapbuffers.h b/src/mesa/drivers/dri/intel/intel_swapbuffers.h
-new file mode 100644
-index 0000000..75bb624
---- /dev/null
-+++ b/src/mesa/drivers/dri/intel/intel_swapbuffers.h
-@@ -0,0 +1,52 @@
-+
-+/**************************************************************************
-+ *
-+ * Copyright 2006 Tungsten Graphics, Inc., Cedar Park, Texas.
-+ * All Rights Reserved.
-+ *
-+ * Permission is hereby granted, free of charge, to any person obtaining a
-+ * copy of this software and associated documentation files (the
-+ * "Software"), to deal in the Software without restriction, including
-+ * without limitation the rights to use, copy, modify, merge, publish,
-+ * distribute, sub license, and/or sell copies of the Software, and to
-+ * permit persons to whom the Software is furnished to do so, subject to
-+ * the following conditions:
-+ *
-+ * The above copyright notice and this permission notice (including the
-+ * next paragraph) shall be included in all copies or substantial portions
-+ * of the Software.
-+ *
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
-+ * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
-+ * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-+ *
-+ **************************************************************************/
-+
-+#ifndef INTEL_SWAPBUFFERS_H
-+#define INTEL_SWAPBUFFERS_H
-+
-+#include "dri_util.h"
-+#include "drm.h"
-+
-+struct intel_context;
-+struct intel_framebuffer;
-+
-+
-+extern void
-+intelSwapBuffers(__DRIdrawablePrivate * dPriv);
-+
-+extern void
-+intelCopySubBuffer(__DRIdrawablePrivate * dPriv, int x, int y, int w, int h);
-+
-+extern GLuint
-+intelFixupVblank(struct intel_context *intel, __DRIdrawablePrivate *dPriv);
-+
-+extern void
-+intelWindowMoved(struct intel_context *intel);
-+
-+
-+#endif /* INTEL_SWAPBUFFERS_H */
-diff --git a/src/mesa/drivers/dri/intel/intel_tex.c b/src/mesa/drivers/dri/intel/intel_tex.c
-index e64d8a1..ae0994b 100644
---- a/src/mesa/drivers/dri/intel/intel_tex.c
-+++ b/src/mesa/drivers/dri/intel/intel_tex.c
-@@ -93,7 +93,7 @@ intelFreeTextureImageData(GLcontext * ctx, struct gl_texture_image *texImage)
- static void *
- do_memcpy(void *dest, const void *src, size_t n)
- {
-- if ((((unsigned) src) & 63) || (((unsigned) dest) & 63)) {
-+ if ((((unsigned long) src) & 63) || (((unsigned long) dest) & 63)) {
- return __memcpy(dest, src, n);
- }
- else
-diff --git a/src/mesa/drivers/dri/intel/intel_tex_format.c b/src/mesa/drivers/dri/intel/intel_tex_format.c
-index 5e418ac..2d57c67 100644
---- a/src/mesa/drivers/dri/intel/intel_tex_format.c
-+++ b/src/mesa/drivers/dri/intel/intel_tex_format.c
-@@ -3,11 +3,15 @@
- #include "main/texformat.h"
- #include "main/enums.h"
-
--/* It works out that this function is fine for all the supported
-+
-+/**
-+ * Choose hardware texture format given the user's glTexImage parameters.
-+ *
-+ * It works out that this function is fine for all the supported
- * hardware. However, there is still a need to map the formats onto
- * hardware descriptors.
-- */
--/* Note that the i915 can actually support many more formats than
-+ *
-+ * Note that the i915 can actually support many more formats than
- * these if we take the step of simply swizzling the colors
- * immediately after sampling...
- */
-@@ -16,7 +20,12 @@ intelChooseTextureFormat(GLcontext * ctx, GLint internalFormat,
- GLenum format, GLenum type)
- {
- struct intel_context *intel = intel_context(ctx);
-- const GLboolean do32bpt = (intel->ctx.Visual.rgbBits == 32);
-+ const GLboolean do32bpt = (intel->ctx.Visual.rgbBits >= 24);
-+
-+#if 0
-+ printf("%s intFmt=0x%x format=0x%x type=0x%x\n",
-+ __FUNCTION__, internalFormat, format, type);
-+#endif
-
- switch (internalFormat) {
- case 4:
-diff --git a/src/mesa/drivers/dri/intel/intel_tex_image.c b/src/mesa/drivers/dri/intel/intel_tex_image.c
-index 2ac7dce..943636c 100644
---- a/src/mesa/drivers/dri/intel/intel_tex_image.c
-+++ b/src/mesa/drivers/dri/intel/intel_tex_image.c
-@@ -62,7 +62,8 @@ logbase2(int n)
- static void
- guess_and_alloc_mipmap_tree(struct intel_context *intel,
- struct intel_texture_object *intelObj,
-- struct intel_texture_image *intelImage)
-+ struct intel_texture_image *intelImage,
-+ GLboolean expect_accelerated_upload)
- {
- GLuint firstLevel;
- GLuint lastLevel;
-@@ -136,7 +137,8 @@ guess_and_alloc_mipmap_tree(struct intel_context *intel,
- height,
- depth,
- intelImage->base.TexFormat->TexelBytes,
-- comp_byte);
-+ comp_byte,
-+ expect_accelerated_upload);
-
- DBG("%s - success\n", __FUNCTION__);
- }
-@@ -209,7 +211,8 @@ try_pbo_upload(struct intel_context *intel,
- return GL_FALSE;
- }
-
-- src_offset = (GLuint) pixels;
-+ /* note: potential 64-bit ptr to 32-bit int cast */
-+ src_offset = (GLuint) (unsigned long) pixels;
-
- if (unpack->RowLength > 0)
- src_stride = unpack->RowLength;
-@@ -264,7 +267,8 @@ try_pbo_zcopy(struct intel_context *intel,
- return GL_FALSE;
- }
-
-- src_offset = (GLuint) pixels;
-+ /* note: potential 64-bit ptr to 32-bit int cast */
-+ src_offset = (GLuint) (unsigned long) pixels;
-
- if (unpack->RowLength > 0)
- src_stride = unpack->RowLength;
-@@ -383,7 +387,7 @@ intelTexImage(GLcontext * ctx,
- }
-
- if (!intelObj->mt) {
-- guess_and_alloc_mipmap_tree(intel, intelObj, intelImage);
-+ guess_and_alloc_mipmap_tree(intel, intelObj, intelImage, pixels == NULL);
- if (!intelObj->mt) {
- DBG("guess_and_alloc_mipmap_tree: failed\n");
- }
-@@ -413,7 +417,7 @@ intelTexImage(GLcontext * ctx,
- level, level,
- width, height, depth,
- intelImage->base.TexFormat->TexelBytes,
-- comp_byte);
-+ comp_byte, pixels == NULL);
-
- }
-
-@@ -751,16 +755,21 @@ intelSetTexBuffer(__DRIcontext *pDRICtx, GLint target, __DRIdrawable *dPriv)
-
- _mesa_lock_texture(&intel->ctx, texObj);
-
-+ texImage = _mesa_get_tex_image(&intel->ctx, texObj, target, level);
-+ intelImage = intel_texture_image(texImage);
-+
-+ if (intelImage->mt) {
-+ intel_miptree_release(intel, &intelImage->mt);
-+ assert(!texImage->Data);
-+ }
- if (intelObj->mt)
- intel_miptree_release(intel, &intelObj->mt);
-
- intelObj->mt = mt;
-- texImage = _mesa_get_tex_image(&intel->ctx, texObj, target, level);
- _mesa_init_teximage_fields(&intel->ctx, target, texImage,
- rb->region->width, rb->region->height, 1,
- 0, internalFormat);
-
-- intelImage = intel_texture_image(texImage);
- intelImage->face = target_to_face(target);
- intelImage->level = level;
- texImage->TexFormat = intelChooseTextureFormat(&intel->ctx, internalFormat,
-diff --git a/src/mesa/drivers/dri/intel/intel_tex_validate.c b/src/mesa/drivers/dri/intel/intel_tex_validate.c
-index 820683d..05a375e 100644
---- a/src/mesa/drivers/dri/intel/intel_tex_validate.c
-+++ b/src/mesa/drivers/dri/intel/intel_tex_validate.c
-@@ -206,7 +206,8 @@ intel_finalize_mipmap_tree(struct intel_context *intel, GLuint unit)
- firstImage->base.Height,
- firstImage->base.Depth,
- cpp,
-- comp_byte);
-+ comp_byte,
-+ GL_TRUE);
- }
-
- /* Pull in any images not in the object's tree:
-diff --git a/src/mesa/drivers/dri/mach64/mach64_context.c b/src/mesa/drivers/dri/mach64/mach64_context.c
-index 99abd20..9c7f513 100644
---- a/src/mesa/drivers/dri/mach64/mach64_context.c
-+++ b/src/mesa/drivers/dri/mach64/mach64_context.c
-@@ -57,10 +57,6 @@
- #include "utils.h"
- #include "vblank.h"
-
--#define need_GL_ARB_multisample
--#define need_GL_ARB_vertex_buffer_object
--#include "extension_helper.h"
--
- #ifndef MACH64_DEBUG
- int MACH64_DEBUG = (0);
- #endif
-@@ -82,9 +78,7 @@ static const struct dri_debug_control debug_control[] =
-
- const struct dri_extension card_extensions[] =
- {
-- { "GL_ARB_multisample", GL_ARB_multisample_functions },
- { "GL_ARB_multitexture", NULL },
-- { "GL_ARB_vertex_buffer_object", GL_ARB_vertex_buffer_object_functions },
- { "GL_EXT_texture_edge_clamp", NULL },
- { "GL_MESA_ycbcr_texture", NULL },
- { "GL_SGIS_generate_mipmap", NULL },
-@@ -196,6 +190,7 @@ GLboolean mach64CreateContext( const __GLcontextModes *glVisual,
- ctx->Const.MaxTextureUnits = 2;
- ctx->Const.MaxTextureImageUnits = 2;
- ctx->Const.MaxTextureCoordUnits = 2;
-+ ctx->Const.MaxDrawBuffers = 1;
-
- heap = mach64Screen->IsPCI ? MACH64_CARD_HEAP : MACH64_AGP_HEAP;
-
-diff --git a/src/mesa/drivers/dri/mach64/mach64_screen.c b/src/mesa/drivers/dri/mach64/mach64_screen.c
-index 6bfb4c3..43e5959 100644
---- a/src/mesa/drivers/dri/mach64/mach64_screen.c
-+++ b/src/mesa/drivers/dri/mach64/mach64_screen.c
-@@ -93,6 +93,7 @@ mach64FillInModes( __DRIscreenPrivate *psp,
-
- uint8_t depth_bits_array[2];
- uint8_t stencil_bits_array[2];
-+ uint8_t msaa_samples_array[1];
-
- depth_bits_array[0] = depth_bits;
- depth_bits_array[1] = depth_bits;
-@@ -104,6 +105,8 @@ mach64FillInModes( __DRIscreenPrivate *psp,
- stencil_bits_array[0] = 0;
- stencil_bits_array[1] = (stencil_bits == 0) ? 8 : stencil_bits;
-
-+ msaa_samples_array[0] = 0;
-+
- depth_buffer_factor = ((depth_bits != 0) || (stencil_bits != 0)) ? 2 : 1;
- back_buffer_factor = (have_back_buffer) ? 2 : 1;
-
-@@ -119,7 +122,8 @@ mach64FillInModes( __DRIscreenPrivate *psp,
- configs = driCreateConfigs(fb_format, fb_type,
- depth_bits_array, stencil_bits_array,
- depth_buffer_factor, back_buffer_modes,
-- back_buffer_factor);
-+ back_buffer_factor,
-+ msaa_samples_array, 1);
- if (configs == NULL) {
- fprintf(stderr, "[%s:%u] Error creating FBConfig!\n",
- __func__, __LINE__);
-diff --git a/src/mesa/drivers/dri/mach64/mach64_tex.c b/src/mesa/drivers/dri/mach64/mach64_tex.c
-index 1f9d3c5..9fe267e 100644
---- a/src/mesa/drivers/dri/mach64/mach64_tex.c
-+++ b/src/mesa/drivers/dri/mach64/mach64_tex.c
-@@ -152,6 +152,7 @@ mach64ChooseTextureFormat( GLcontext *ctx, GLint internalFormat,
- case GL_ALPHA8:
- case GL_ALPHA12:
- case GL_ALPHA16:
-+ case GL_COMPRESSED_ALPHA:
- case 2:
- case GL_LUMINANCE_ALPHA:
- case GL_LUMINANCE4_ALPHA4:
-@@ -160,9 +161,11 @@ mach64ChooseTextureFormat( GLcontext *ctx, GLint internalFormat,
- case GL_LUMINANCE12_ALPHA4:
- case GL_LUMINANCE12_ALPHA12:
- case GL_LUMINANCE16_ALPHA16:
-+ case GL_COMPRESSED_LUMINANCE_ALPHA:
- case 4:
- case GL_RGBA:
- case GL_RGBA2:
-+ case GL_COMPRESSED_RGBA:
- if (mmesa->mach64Screen->cpp == 4)
- return &_mesa_texformat_argb8888;
- else
-@@ -193,6 +196,7 @@ mach64ChooseTextureFormat( GLcontext *ctx, GLint internalFormat,
- case GL_RGB10:
- case GL_RGB12:
- case GL_RGB16:
-+ case GL_COMPRESSED_RGB:
- if (mmesa->mach64Screen->cpp == 4)
- return &_mesa_texformat_argb8888;
- else
-@@ -204,6 +208,7 @@ mach64ChooseTextureFormat( GLcontext *ctx, GLint internalFormat,
- case GL_LUMINANCE8:
- case GL_LUMINANCE12:
- case GL_LUMINANCE16:
-+ case GL_COMPRESSED_LUMINANCE:
- if (mmesa->mach64Screen->cpp == 4)
- return &_mesa_texformat_argb8888; /* inefficient but accurate */
- else
-@@ -214,6 +219,7 @@ mach64ChooseTextureFormat( GLcontext *ctx, GLint internalFormat,
- case GL_INTENSITY8:
- case GL_INTENSITY12:
- case GL_INTENSITY16:
-+ case GL_COMPRESSED_INTENSITY:
- if (mmesa->mach64Screen->cpp == 4)
- return &_mesa_texformat_argb8888; /* inefficient but accurate */
- else
-diff --git a/src/mesa/drivers/dri/mga/mga_texstate.c b/src/mesa/drivers/dri/mga/mga_texstate.c
-index d4c5b6f..ad765d1 100644
-diff --git a/src/mesa/drivers/dri/mga/mga_xmesa.c b/src/mesa/drivers/dri/mga/mga_xmesa.c
-index 86da3a2..926534d 100644
---- a/src/mesa/drivers/dri/mga/mga_xmesa.c
-+++ b/src/mesa/drivers/dri/mga/mga_xmesa.c
-@@ -69,13 +69,9 @@
-
- #include "GL/internal/dri_interface.h"
-
--#define need_GL_ARB_multisample
--#define need_GL_ARB_texture_compression
--#define need_GL_ARB_vertex_buffer_object
- #define need_GL_ARB_vertex_program
- #define need_GL_EXT_fog_coord
- #define need_GL_EXT_gpu_program_parameters
--#define need_GL_EXT_multi_draw_arrays
- #define need_GL_EXT_secondary_color
- #if 0
- #define need_GL_EXT_paletted_texture
-@@ -133,6 +129,7 @@ mgaFillInModes( __DRIscreenPrivate *psp,
-
- uint8_t depth_bits_array[3];
- uint8_t stencil_bits_array[3];
-+ uint8_t msaa_samples_array[1];
-
-
- depth_bits_array[0] = 0;
-@@ -147,6 +144,8 @@ mgaFillInModes( __DRIscreenPrivate *psp,
- stencil_bits_array[1] = 0;
- stencil_bits_array[2] = (stencil_bits == 0) ? 8 : stencil_bits;
-
-+ msaa_samples_array[0] = 0;
-+
- depth_buffer_factor = ((depth_bits != 0) || (stencil_bits != 0)) ? 3 : 1;
- back_buffer_factor = (have_back_buffer) ? 2 : 1;
-
-@@ -162,7 +161,8 @@ mgaFillInModes( __DRIscreenPrivate *psp,
- configs = driCreateConfigs(fb_format, fb_type,
- depth_bits_array, stencil_bits_array,
- depth_buffer_factor,
-- back_buffer_modes, back_buffer_factor);
-+ back_buffer_modes, back_buffer_factor,
-+ msaa_samples_array, 1);
- if (configs == NULL) {
- fprintf( stderr, "[%s:%u] Error creating FBConfig!\n",
- __func__, __LINE__ );
-@@ -385,13 +385,9 @@ static const struct dri_extension g400_extensions[] =
-
- static const struct dri_extension card_extensions[] =
- {
-- { "GL_ARB_multisample", GL_ARB_multisample_functions },
-- { "GL_ARB_texture_compression", GL_ARB_texture_compression_functions },
- { "GL_ARB_texture_rectangle", NULL },
-- { "GL_ARB_vertex_buffer_object", GL_ARB_vertex_buffer_object_functions },
- { "GL_EXT_blend_logic_op", NULL },
- { "GL_EXT_fog_coord", GL_EXT_fog_coord_functions },
-- { "GL_EXT_multi_draw_arrays", GL_EXT_multi_draw_arrays_functions },
- /* paletted_textures currently doesn't work, but we could fix them later */
- #if defined( need_GL_EXT_paletted_texture )
- { "GL_EXT_shared_texture_palette", NULL },
-@@ -539,6 +535,8 @@ mgaCreateContext( const __GLcontextModes *mesaVis,
- ctx->Const.MaxLineWidthAA = 10.0;
- ctx->Const.LineWidthGranularity = 1.0;
-
-+ ctx->Const.MaxDrawBuffers = 1;
-+
- mmesa->texture_depth = driQueryOptioni (&mmesa->optionCache,
- "texture_depth");
- if (mmesa->texture_depth == DRI_CONF_TEXTURE_DEPTH_FB)
-diff --git a/src/mesa/drivers/dri/r128/r128_context.c b/src/mesa/drivers/dri/r128/r128_context.c
-index 535a98c..f511a67 100644
---- a/src/mesa/drivers/dri/r128/r128_context.c
-+++ b/src/mesa/drivers/dri/r128/r128_context.c
-@@ -65,9 +65,6 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.
- int R128_DEBUG = 0;
- #endif
-
--#define need_GL_ARB_multisample
--#define need_GL_ARB_texture_compression
--#define need_GL_ARB_vertex_buffer_object
- #define need_GL_EXT_blend_minmax
- #define need_GL_EXT_fog_coord
- #define need_GL_EXT_secondary_color
-@@ -75,12 +72,9 @@ int R128_DEBUG = 0;
-
- const struct dri_extension card_extensions[] =
- {
-- { "GL_ARB_multisample", GL_ARB_multisample_functions },
- { "GL_ARB_multitexture", NULL },
-- { "GL_ARB_texture_compression", GL_ARB_texture_compression_functions },
- { "GL_ARB_texture_env_add", NULL },
- { "GL_ARB_texture_mirrored_repeat", NULL },
-- { "GL_ARB_vertex_buffer_object", GL_ARB_vertex_buffer_object_functions },
- { "GL_EXT_blend_subtract", GL_EXT_blend_minmax_functions },
- { "GL_EXT_fog_coord", GL_EXT_fog_coord_functions },
- { "GL_EXT_texture_edge_clamp", NULL },
-@@ -229,6 +223,8 @@ GLboolean r128CreateContext( const __GLcontextModes *glVisual,
- ctx->Const.MaxLineWidthAA = 1.0;
- ctx->Const.LineWidthGranularity = 1.0;
-
-+ ctx->Const.MaxDrawBuffers = 1;
-+
- #if ENABLE_PERF_BOXES
- rmesa->boxes = driQueryOptionb(&rmesa->optionCache, "performance_boxes");
- #endif
-diff --git a/src/mesa/drivers/dri/r128/r128_screen.c b/src/mesa/drivers/dri/r128/r128_screen.c
-index cb3a147..7cda4ca 100644
---- a/src/mesa/drivers/dri/r128/r128_screen.c
-+++ b/src/mesa/drivers/dri/r128/r128_screen.c
-@@ -422,7 +422,7 @@ r128FillInModes( __DRIscreenPrivate *psp,
-
- uint8_t depth_bits_array[2];
- uint8_t stencil_bits_array[2];
--
-+ uint8_t msaa_samples_array[1];
-
- depth_bits_array[0] = depth_bits;
- depth_bits_array[1] = depth_bits;
-@@ -434,6 +434,8 @@ r128FillInModes( __DRIscreenPrivate *psp,
- stencil_bits_array[0] = 0;
- stencil_bits_array[1] = (stencil_bits == 0) ? 8 : stencil_bits;
-
-+ msaa_samples_array[0] = 0;
-+
- depth_buffer_factor = ((depth_bits != 0) || (stencil_bits != 0)) ? 2 : 1;
- back_buffer_factor = (have_back_buffer) ? 2 : 1;
-
-@@ -446,26 +448,27 @@ r128FillInModes( __DRIscreenPrivate *psp,
- fb_type = GL_UNSIGNED_INT_8_8_8_8_REV;
- }
-
-- configs = driCreateConfigs(fb_format, fb_type,
-- depth_bits_array, stencil_bits_array,
-- depth_buffer_factor, back_buffer_modes,
-- back_buffer_factor);
-- if (configs == NULL) {
-- fprintf(stderr, "[%s:%u] Error creating FBConfig!\n", __func__,
-- __LINE__);
-- return NULL;
-- }
-+ configs = driCreateConfigs(fb_format, fb_type,
-+ depth_bits_array, stencil_bits_array,
-+ depth_buffer_factor, back_buffer_modes,
-+ back_buffer_factor,
-+ msaa_samples_array, 1);
-+ if (configs == NULL) {
-+ fprintf(stderr, "[%s:%u] Error creating FBConfig!\n", __func__,
-+ __LINE__);
-+ return NULL;
-+ }
-
-- /* Mark the visual as slow if there are "fake" stencil bits.
-- */
-- for (i = 0; configs[i]; i++) {
-- m = &configs[i]->modes;
-- if ((m->stencilBits != 0) && (m->stencilBits != stencil_bits)) {
-- m->visualRating = GLX_SLOW_CONFIG;
-- }
-- }
-+ /* Mark the visual as slow if there are "fake" stencil bits.
-+ */
-+ for (i = 0; configs[i]; i++) {
-+ m = &configs[i]->modes;
-+ if ((m->stencilBits != 0) && (m->stencilBits != stencil_bits)) {
-+ m->visualRating = GLX_SLOW_CONFIG;
-+ }
-+ }
-
-- return (const __DRIconfig **) configs;
-+ return (const __DRIconfig **) configs;
- }
-
-
-diff --git a/src/mesa/drivers/dri/r200/r200_context.c b/src/mesa/drivers/dri/r200/r200_context.c
-index 5531e0a..c067515 100644
---- a/src/mesa/drivers/dri/r200/r200_context.c
-+++ b/src/mesa/drivers/dri/r200/r200_context.c
-@@ -62,14 +62,10 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- #include "r200_maos.h"
- #include "r200_vertprog.h"
-
--#define need_GL_ARB_multisample
--#define need_GL_ARB_texture_compression
--#define need_GL_ARB_vertex_buffer_object
- #define need_GL_ARB_vertex_program
- #define need_GL_ATI_fragment_shader
- #define need_GL_EXT_blend_minmax
- #define need_GL_EXT_fog_coord
--#define need_GL_EXT_multi_draw_arrays
- #define need_GL_EXT_secondary_color
- #define need_GL_EXT_blend_equation_separate
- #define need_GL_EXT_blend_func_separate
-@@ -120,20 +116,16 @@ static const GLubyte *r200GetString( GLcontext *ctx, GLenum name )
- */
- const struct dri_extension card_extensions[] =
- {
-- { "GL_ARB_multisample", GL_ARB_multisample_functions },
- { "GL_ARB_multitexture", NULL },
- { "GL_ARB_texture_border_clamp", NULL },
-- { "GL_ARB_texture_compression", GL_ARB_texture_compression_functions },
- { "GL_ARB_texture_env_add", NULL },
- { "GL_ARB_texture_env_combine", NULL },
- { "GL_ARB_texture_env_dot3", NULL },
- { "GL_ARB_texture_env_crossbar", NULL },
- { "GL_ARB_texture_mirrored_repeat", NULL },
-- { "GL_ARB_vertex_buffer_object", GL_ARB_vertex_buffer_object_functions },
- { "GL_EXT_blend_minmax", GL_EXT_blend_minmax_functions },
- { "GL_EXT_blend_subtract", NULL },
- { "GL_EXT_fog_coord", GL_EXT_fog_coord_functions },
-- { "GL_EXT_multi_draw_arrays", GL_EXT_multi_draw_arrays_functions },
- { "GL_EXT_secondary_color", GL_EXT_secondary_color_functions },
- { "GL_EXT_stencil_wrap", NULL },
- { "GL_EXT_texture_edge_clamp", NULL },
-@@ -411,6 +403,8 @@ GLboolean r200CreateContext( const __GLcontextModes *glVisual,
- ctx->Const.VertexProgram.MaxNativeParameters = R200_VSF_MAX_PARAM;
- ctx->Const.VertexProgram.MaxNativeAddressRegs = 1;
-
-+ ctx->Const.MaxDrawBuffers = 1;
-+
- /* Initialize the software rasterizer and helper modules.
- */
- _swrast_CreateContext( ctx );
-diff --git a/src/mesa/drivers/dri/r200/r200_texstate.c b/src/mesa/drivers/dri/r200/r200_texstate.c
-index 3f9a2f4..0ad5651 100644
---- a/src/mesa/drivers/dri/r200/r200_texstate.c
-+++ b/src/mesa/drivers/dri/r200/r200_texstate.c
-@@ -1366,27 +1366,27 @@ static GLboolean r200_validate_texgen( GLcontext *ctx, GLuint unit )
- fprintf(stderr, "%s unit %d\n", __FUNCTION__, unit);
-
- if (texUnit->TexGenEnabled & S_BIT) {
-- mode = texUnit->GenModeS;
-+ mode = texUnit->GenS.Mode;
- } else {
- tgcm |= R200_TEXGEN_COMP_S << (unit * 4);
- }
-
- if (texUnit->TexGenEnabled & T_BIT) {
-- if (texUnit->GenModeT != mode)
-+ if (texUnit->GenT.Mode != mode)
- mixed_fallback = GL_TRUE;
- } else {
- tgcm |= R200_TEXGEN_COMP_T << (unit * 4);
- }
-
- if (texUnit->TexGenEnabled & R_BIT) {
-- if (texUnit->GenModeR != mode)
-+ if (texUnit->GenR.Mode != mode)
- mixed_fallback = GL_TRUE;
- } else {
- tgcm |= R200_TEXGEN_COMP_R << (unit * 4);
- }
-
- if (texUnit->TexGenEnabled & Q_BIT) {
-- if (texUnit->GenModeQ != mode)
-+ if (texUnit->GenQ.Mode != mode)
- mixed_fallback = GL_TRUE;
- } else {
- tgcm |= R200_TEXGEN_COMP_Q << (unit * 4);
-@@ -1395,8 +1395,8 @@ static GLboolean r200_validate_texgen( GLcontext *ctx, GLuint unit )
- if (mixed_fallback) {
- if (R200_DEBUG & DEBUG_FALLBACKS)
- fprintf(stderr, "fallback mixed texgen, 0x%x (0x%x 0x%x 0x%x 0x%x)\n",
-- texUnit->TexGenEnabled, texUnit->GenModeS, texUnit->GenModeT,
-- texUnit->GenModeR, texUnit->GenModeQ);
-+ texUnit->TexGenEnabled, texUnit->GenS.Mode, texUnit->GenT.Mode,
-+ texUnit->GenR.Mode, texUnit->GenQ.Mode);
- return GL_FALSE;
- }
-
-@@ -1414,8 +1414,10 @@ static GLboolean r200_validate_texgen( GLcontext *ctx, GLuint unit )
- switch (mode) {
- case GL_OBJECT_LINEAR: {
- GLuint needtgenable = r200_need_dis_texgen( texUnit->TexGenEnabled,
-- texUnit->ObjectPlaneS, texUnit->ObjectPlaneT,
-- texUnit->ObjectPlaneR, texUnit->ObjectPlaneQ );
-+ texUnit->GenS.ObjectPlane,
-+ texUnit->GenT.ObjectPlane,
-+ texUnit->GenR.ObjectPlane,
-+ texUnit->GenQ.ObjectPlane );
- if (needtgenable & (S_BIT | T_BIT)) {
- if (R200_DEBUG & DEBUG_FALLBACKS)
- fprintf(stderr, "fallback mixed texgen / obj plane, 0x%x\n",
-@@ -1431,17 +1433,19 @@ static GLboolean r200_validate_texgen( GLcontext *ctx, GLuint unit )
-
- tgi |= R200_TEXGEN_INPUT_OBJ << inputshift;
- set_texgen_matrix( rmesa, unit,
-- (texUnit->TexGenEnabled & S_BIT) ? texUnit->ObjectPlaneS : I,
-- (texUnit->TexGenEnabled & T_BIT) ? texUnit->ObjectPlaneT : I + 4,
-- (texUnit->TexGenEnabled & R_BIT) ? texUnit->ObjectPlaneR : I + 8,
-- (texUnit->TexGenEnabled & Q_BIT) ? texUnit->ObjectPlaneQ : I + 12);
-+ (texUnit->TexGenEnabled & S_BIT) ? texUnit->GenS.ObjectPlane : I,
-+ (texUnit->TexGenEnabled & T_BIT) ? texUnit->GenT.ObjectPlane : I + 4,
-+ (texUnit->TexGenEnabled & R_BIT) ? texUnit->GenR.ObjectPlane : I + 8,
-+ (texUnit->TexGenEnabled & Q_BIT) ? texUnit->GenQ.ObjectPlane : I + 12);
- }
- break;
-
- case GL_EYE_LINEAR: {
- GLuint needtgenable = r200_need_dis_texgen( texUnit->TexGenEnabled,
-- texUnit->EyePlaneS, texUnit->EyePlaneT,
-- texUnit->EyePlaneR, texUnit->EyePlaneQ );
-+ texUnit->GenS.EyePlane,
-+ texUnit->GenT.EyePlane,
-+ texUnit->GenR.EyePlane,
-+ texUnit->GenQ.EyePlane );
- if (needtgenable & (S_BIT | T_BIT)) {
- if (R200_DEBUG & DEBUG_FALLBACKS)
- fprintf(stderr, "fallback mixed texgen / eye plane, 0x%x\n",
-@@ -1456,10 +1460,10 @@ static GLboolean r200_validate_texgen( GLcontext *ctx, GLuint unit )
- }
- tgi |= R200_TEXGEN_INPUT_EYE << inputshift;
- set_texgen_matrix( rmesa, unit,
-- (texUnit->TexGenEnabled & S_BIT) ? texUnit->EyePlaneS : I,
-- (texUnit->TexGenEnabled & T_BIT) ? texUnit->EyePlaneT : I + 4,
-- (texUnit->TexGenEnabled & R_BIT) ? texUnit->EyePlaneR : I + 8,
-- (texUnit->TexGenEnabled & Q_BIT) ? texUnit->EyePlaneQ : I + 12);
-+ (texUnit->TexGenEnabled & S_BIT) ? texUnit->GenS.EyePlane : I,
-+ (texUnit->TexGenEnabled & T_BIT) ? texUnit->GenT.EyePlane : I + 4,
-+ (texUnit->TexGenEnabled & R_BIT) ? texUnit->GenR.EyePlane : I + 8,
-+ (texUnit->TexGenEnabled & Q_BIT) ? texUnit->GenQ.EyePlane : I + 12);
- }
- break;
-
-@@ -1495,7 +1499,7 @@ static GLboolean r200_validate_texgen( GLcontext *ctx, GLuint unit )
- */
- if (R200_DEBUG & DEBUG_FALLBACKS)
- fprintf(stderr, "fallback unsupported texgen, %d\n",
-- texUnit->GenModeS);
-+ texUnit->GenS.Mode);
- return GL_FALSE;
- }
-
-diff --git a/src/mesa/drivers/dri/r300/r300_context.c b/src/mesa/drivers/dri/r300/r300_context.c
-index 3743627..4c14c7e 100644
---- a/src/mesa/drivers/dri/r300/r300_context.c
-+++ b/src/mesa/drivers/dri/r300/r300_context.c
-@@ -77,19 +77,17 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- int future_hw_tcl_on = 1;
- int hw_tcl_on = 1;
-
--#define need_GL_EXT_stencil_two_side
--#define need_GL_ARB_multisample
-+#define need_GL_VERSION_2_0
- #define need_GL_ARB_point_parameters
--#define need_GL_ARB_texture_compression
--#define need_GL_ARB_vertex_buffer_object
- #define need_GL_ARB_vertex_program
--#define need_GL_EXT_blend_minmax
--//#define need_GL_EXT_fog_coord
--#define need_GL_EXT_multi_draw_arrays
--#define need_GL_EXT_secondary_color
- #define need_GL_EXT_blend_equation_separate
- #define need_GL_EXT_blend_func_separate
-+#define need_GL_EXT_blend_minmax
-+//#define need_GL_EXT_fog_coord
- #define need_GL_EXT_gpu_program_parameters
-+#define need_GL_EXT_secondary_color
-+#define need_GL_EXT_stencil_two_side
-+#define need_GL_ATI_separate_stencil
- #define need_GL_NV_vertex_program
- #include "extension_helper.h"
-
-@@ -97,27 +95,23 @@ const struct dri_extension card_extensions[] = {
- /* *INDENT-OFF* */
- {"GL_ARB_depth_texture", NULL},
- {"GL_ARB_fragment_program", NULL},
-- {"GL_ARB_multisample", GL_ARB_multisample_functions},
- {"GL_ARB_multitexture", NULL},
- {"GL_ARB_point_parameters", GL_ARB_point_parameters_functions},
- {"GL_ARB_shadow", NULL},
- {"GL_ARB_shadow_ambient", NULL},
- {"GL_ARB_texture_border_clamp", NULL},
-- {"GL_ARB_texture_compression", GL_ARB_texture_compression_functions},
- {"GL_ARB_texture_cube_map", NULL},
- {"GL_ARB_texture_env_add", NULL},
- {"GL_ARB_texture_env_combine", NULL},
- {"GL_ARB_texture_env_crossbar", NULL},
- {"GL_ARB_texture_env_dot3", NULL},
- {"GL_ARB_texture_mirrored_repeat", NULL},
-- {"GL_ARB_vertex_buffer_object", GL_ARB_vertex_buffer_object_functions},
- {"GL_ARB_vertex_program", GL_ARB_vertex_program_functions},
- {"GL_EXT_blend_equation_separate", GL_EXT_blend_equation_separate_functions},
- {"GL_EXT_blend_func_separate", GL_EXT_blend_func_separate_functions},
- {"GL_EXT_blend_minmax", GL_EXT_blend_minmax_functions},
- {"GL_EXT_blend_subtract", NULL},
- // {"GL_EXT_fog_coord", GL_EXT_fog_coord_functions },
-- {"GL_EXT_multi_draw_arrays", GL_EXT_multi_draw_arrays_functions},
- {"GL_EXT_gpu_program_parameters", GL_EXT_gpu_program_parameters_functions},
- {"GL_EXT_secondary_color", GL_EXT_secondary_color_functions},
- {"GL_EXT_shadow_funcs", NULL},
-@@ -130,6 +124,7 @@ const struct dri_extension card_extensions[] = {
- {"GL_EXT_texture_lod_bias", NULL},
- {"GL_EXT_texture_mirror_clamp", NULL},
- {"GL_EXT_texture_rectangle", NULL},
-+ {"GL_ATI_separate_stencil", GL_ATI_separate_stencil_functions},
- {"GL_ATI_texture_env_combine3", NULL},
- {"GL_ATI_texture_mirror_once", NULL},
- {"GL_MESA_pack_invert", NULL},
-@@ -142,6 +137,16 @@ const struct dri_extension card_extensions[] = {
- /* *INDENT-ON* */
- };
-
-+
-+/**
-+ * The GL 2.0 functions are needed to make display lists work with
-+ * functions added by GL_ATI_separate_stencil.
-+ */
-+const struct dri_extension gl_20_extension[] = {
-+ {"GL_VERSION_2_0", GL_VERSION_2_0_functions },
-+};
-+
-+
- extern struct tnl_pipeline_stage _r300_render_stage;
- extern const struct tnl_pipeline_stage _r300_tcl_stage;
-
-@@ -306,6 +311,8 @@ GLboolean r300CreateContext(const __GLcontextModes * glVisual,
- #endif
- #endif
-
-+ ctx->Const.MaxDrawBuffers = 1;
-+
- /* Initialize the software rasterizer and helper modules.
- */
- _swrast_CreateContext(ctx);
-diff --git a/src/mesa/drivers/dri/r300/r300_fragprog.c b/src/mesa/drivers/dri/r300/r300_fragprog.c
-index 4ef7f2b..8d030c6 100644
---- a/src/mesa/drivers/dri/r300/r300_fragprog.c
-+++ b/src/mesa/drivers/dri/r300/r300_fragprog.c
-@@ -163,6 +163,19 @@ static GLboolean transform_TEX(
- }
- }
-
-+ if (inst.SrcReg[0].File != PROGRAM_TEMPORARY && inst.SrcReg[0].File != PROGRAM_INPUT) {
-+ int tmpreg = radeonFindFreeTemporary(t);
-+ tgt = radeonAppendInstructions(t->Program, 1);
-+ tgt->Opcode = OPCODE_MOV;
-+ tgt->DstReg.File = PROGRAM_TEMPORARY;
-+ tgt->DstReg.Index = tmpreg;
-+ tgt->SrcReg[0] = inst.SrcReg[0];
-+
-+ reset_srcreg(&inst.SrcReg[0]);
-+ inst.SrcReg[0].File = PROGRAM_TEMPORARY;
-+ inst.SrcReg[0].Index = tmpreg;
-+ }
-+
- tgt = radeonAppendInstructions(t->Program, 1);
- _mesa_copy_instructions(tgt, &inst, 1);
-
-diff --git a/src/mesa/drivers/dri/r300/r300_reg.h b/src/mesa/drivers/dri/r300/r300_reg.h
-index 7c6485e..872a33e 100644
---- a/src/mesa/drivers/dri/r300/r300_reg.h
-+++ b/src/mesa/drivers/dri/r300/r300_reg.h
-@@ -656,7 +656,7 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.
- # define R300_GB_FOG_SELECT_C3A (3 << 0)
- # define R300_GB_FOG_SELECT_1_1_W (4 << 0)
- # define R300_GB_FOG_SELECT_Z (5 << 0)
--# define R300_GB_DEPTH_SELECT_Z (0 << 3
-+# define R300_GB_DEPTH_SELECT_Z (0 << 3)
- # define R300_GB_DEPTH_SELECT_1_1_W (1 << 3)
- # define R300_GB_W_SELECT_1_W (0 << 4)
- # define R300_GB_W_SELECT_1 (1 << 4)
-@@ -730,8 +730,8 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.
- #define R500_RS_IP_TEX_PTR_Q_SHIFT 18
- #define R500_RS_IP_COL_PTR_SHIFT 24
- #define R500_RS_IP_COL_FMT_SHIFT 27
--# define R500_RS_COL_PTR(x) (x << 24)
--# define R500_RS_COL_FMT(x) (x << 27)
-+# define R500_RS_COL_PTR(x) ((x) << 24)
-+# define R500_RS_COL_FMT(x) ((x) << 27)
- /* gap */
- #define R500_RS_IP_OFFSET_DIS (0 << 31)
- #define R500_RS_IP_OFFSET_EN (1 << 31)
-@@ -1172,9 +1172,9 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.
- #define R300_RS_IP_3 0x431C
- # define R300_RS_INTERP_SRC_SHIFT 2 /* TODO: check for removal */
- # define R300_RS_INTERP_SRC_MASK (7 << 2) /* TODO: check for removal */
--# define R300_RS_TEX_PTR(x) (x << 0)
--# define R300_RS_COL_PTR(x) (x << 6)
--# define R300_RS_COL_FMT(x) (x << 9)
-+# define R300_RS_TEX_PTR(x) ((x) << 0)
-+# define R300_RS_COL_PTR(x) ((x) << 6)
-+# define R300_RS_COL_FMT(x) ((x) << 9)
- # define R300_RS_COL_FMT_RGBA 0
- # define R300_RS_COL_FMT_RGB0 1
- # define R300_RS_COL_FMT_RGB1 2
-@@ -1184,10 +1184,10 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.
- # define R300_RS_COL_FMT_111A 8
- # define R300_RS_COL_FMT_1110 9
- # define R300_RS_COL_FMT_1111 10
--# define R300_RS_SEL_S(x) (x << 13)
--# define R300_RS_SEL_T(x) (x << 16)
--# define R300_RS_SEL_R(x) (x << 19)
--# define R300_RS_SEL_Q(x) (x << 22)
-+# define R300_RS_SEL_S(x) ((x) << 13)
-+# define R300_RS_SEL_T(x) ((x) << 16)
-+# define R300_RS_SEL_R(x) ((x) << 19)
-+# define R300_RS_SEL_Q(x) ((x) << 22)
- # define R300_RS_SEL_C0 0
- # define R300_RS_SEL_C1 1
- # define R300_RS_SEL_C2 2
-@@ -2705,7 +2705,7 @@ enum {
- # define R500_ALPHA_OP_COS 13
- # define R500_ALPHA_OP_MDH 14
- # define R500_ALPHA_OP_MDV 15
--# define R500_ALPHA_ADDRD(x) (x << 4)
-+# define R500_ALPHA_ADDRD(x) ((x) << 4)
- # define R500_ALPHA_ADDRD_REL (1 << 11)
- # define R500_ALPHA_SEL_A_SHIFT 12
- # define R500_ALPHA_SEL_A_SRC0 (0 << 12)
-@@ -2749,16 +2749,16 @@ enum {
- # define R500_ALPHA_OMOD_DIV_4 (5 << 26)
- # define R500_ALPHA_OMOD_DIV_8 (6 << 26)
- # define R500_ALPHA_OMOD_DISABLE (7 << 26)
--# define R500_ALPHA_TARGET(x) (x << 29)
-+# define R500_ALPHA_TARGET(x) ((x) << 29)
- # define R500_ALPHA_W_OMASK (1 << 31)
- #define R500_US_ALU_ALPHA_ADDR_0 0x9800
--# define R500_ALPHA_ADDR0(x) (x << 0)
-+# define R500_ALPHA_ADDR0(x) ((x) << 0)
- # define R500_ALPHA_ADDR0_CONST (1 << 8)
- # define R500_ALPHA_ADDR0_REL (1 << 9)
--# define R500_ALPHA_ADDR1(x) (x << 10)
-+# define R500_ALPHA_ADDR1(x) ((x) << 10)
- # define R500_ALPHA_ADDR1_CONST (1 << 18)
- # define R500_ALPHA_ADDR1_REL (1 << 19)
--# define R500_ALPHA_ADDR2(x) (x << 20)
-+# define R500_ALPHA_ADDR2(x) ((x) << 20)
- # define R500_ALPHA_ADDR2_CONST (1 << 28)
- # define R500_ALPHA_ADDR2_REL (1 << 29)
- # define R500_ALPHA_SRCP_OP_1_MINUS_2A0 (0 << 30)
-@@ -2779,7 +2779,7 @@ enum {
- # define R500_ALU_RGBA_OP_SOP (10 << 0)
- # define R500_ALU_RGBA_OP_MDH (11 << 0)
- # define R500_ALU_RGBA_OP_MDV (12 << 0)
--# define R500_ALU_RGBA_ADDRD(x) (x << 4)
-+# define R500_ALU_RGBA_ADDRD(x) ((x) << 4)
- # define R500_ALU_RGBA_ADDRD_REL (1 << 11)
- # define R500_ALU_RGBA_SEL_C_SHIFT 12
- # define R500_ALU_RGBA_SEL_C_SRC0 (0 << 12)
-@@ -2906,16 +2906,16 @@ enum {
- # define R500_ALU_RGB_OMOD_DIV_4 (5 << 26)
- # define R500_ALU_RGB_OMOD_DIV_8 (6 << 26)
- # define R500_ALU_RGB_OMOD_DISABLE (7 << 26)
--# define R500_ALU_RGB_TARGET(x) (x << 29)
-+# define R500_ALU_RGB_TARGET(x) ((x) << 29)
- # define R500_ALU_RGB_WMASK (1 << 31)
- #define R500_US_ALU_RGB_ADDR_0 0x9000
--# define R500_RGB_ADDR0(x) (x << 0)
-+# define R500_RGB_ADDR0(x) ((x) << 0)
- # define R500_RGB_ADDR0_CONST (1 << 8)
- # define R500_RGB_ADDR0_REL (1 << 9)
--# define R500_RGB_ADDR1(x) (x << 10)
-+# define R500_RGB_ADDR1(x) ((x) << 10)
- # define R500_RGB_ADDR1_CONST (1 << 18)
- # define R500_RGB_ADDR1_REL (1 << 19)
--# define R500_RGB_ADDR2(x) (x << 20)
-+# define R500_RGB_ADDR2(x) ((x) << 20)
- # define R500_RGB_ADDR2_CONST (1 << 28)
- # define R500_RGB_ADDR2_REL (1 << 29)
- # define R500_RGB_SRCP_OP_1_MINUS_2RGB0 (0 << 30)
-@@ -2970,19 +2970,19 @@ enum {
-
- /* note that these are 8 bit lengths, despite the offsets, at least for R500 */
- #define R500_US_CODE_ADDR 0x4630
--# define R500_US_CODE_START_ADDR(x) (x << 0)
--# define R500_US_CODE_END_ADDR(x) (x << 16)
-+# define R500_US_CODE_START_ADDR(x) ((x) << 0)
-+# define R500_US_CODE_END_ADDR(x) ((x) << 16)
- #define R500_US_CODE_OFFSET 0x4638
--# define R500_US_CODE_OFFSET_ADDR(x) (x << 0)
-+# define R500_US_CODE_OFFSET_ADDR(x) ((x) << 0)
- #define R500_US_CODE_RANGE 0x4634
--# define R500_US_CODE_RANGE_ADDR(x) (x << 0)
--# define R500_US_CODE_RANGE_SIZE(x) (x << 16)
-+# define R500_US_CODE_RANGE_ADDR(x) ((x) << 0)
-+# define R500_US_CODE_RANGE_SIZE(x) ((x) << 16)
- #define R500_US_CONFIG 0x4600
- # define R500_ZERO_TIMES_ANYTHING_EQUALS_ZERO (1 << 1)
- #define R500_US_FC_ADDR_0 0xa000
--# define R500_FC_BOOL_ADDR(x) (x << 0)
--# define R500_FC_INT_ADDR(x) (x << 8)
--# define R500_FC_JUMP_ADDR(x) (x << 16)
-+# define R500_FC_BOOL_ADDR(x) ((x) << 0)
-+# define R500_FC_INT_ADDR(x) ((x) << 8)
-+# define R500_FC_JUMP_ADDR(x) ((x) << 16)
- # define R500_FC_JUMP_GLOBAL (1 << 31)
- #define R500_US_FC_BOOL_CONST 0x4620
- # define R500_FC_KBOOL(x) (x)
-@@ -3003,8 +3003,8 @@ enum {
- # define R500_FC_A_OP_NONE (0 << 6)
- # define R500_FC_A_OP_POP (1 << 6)
- # define R500_FC_A_OP_PUSH (2 << 6)
--# define R500_FC_JUMP_FUNC(x) (x << 8)
--# define R500_FC_B_POP_CNT(x) (x << 16)
-+# define R500_FC_JUMP_FUNC(x) ((x) << 8)
-+# define R500_FC_B_POP_CNT(x) ((x) << 16)
- # define R500_FC_B_OP0_NONE (0 << 24)
- # define R500_FC_B_OP0_DECR (1 << 24)
- # define R500_FC_B_OP0_INCR (2 << 24)
-@@ -3013,14 +3013,14 @@ enum {
- # define R500_FC_B_OP1_INCR (2 << 26)
- # define R500_FC_IGNORE_UNCOVERED (1 << 28)
- #define R500_US_FC_INT_CONST_0 0x4c00
--# define R500_FC_INT_CONST_KR(x) (x << 0)
--# define R500_FC_INT_CONST_KG(x) (x << 8)
--# define R500_FC_INT_CONST_KB(x) (x << 16)
-+# define R500_FC_INT_CONST_KR(x) ((x) << 0)
-+# define R500_FC_INT_CONST_KG(x) ((x) << 8)
-+# define R500_FC_INT_CONST_KB(x) ((x) << 16)
- /* _0 through _15 */
- #define R500_US_FORMAT0_0 0x4640
--# define R500_FORMAT_TXWIDTH(x) (x << 0)
--# define R500_FORMAT_TXHEIGHT(x) (x << 11)
--# define R500_FORMAT_TXDEPTH(x) (x << 22)
-+# define R500_FORMAT_TXWIDTH(x) ((x) << 0)
-+# define R500_FORMAT_TXHEIGHT(x) ((x) << 11)
-+# define R500_FORMAT_TXDEPTH(x) ((x) << 22)
- /* _0 through _3 */
- #define R500_US_OUT_FMT_0 0x46a4
- # define R500_OUT_FMT_C4_8 (0 << 0)
-@@ -3061,12 +3061,12 @@ enum {
- # define R500_C3_SEL_R (1 << 14)
- # define R500_C3_SEL_G (2 << 14)
- # define R500_C3_SEL_B (3 << 14)
--# define R500_OUT_SIGN(x) (x << 16)
-+# define R500_OUT_SIGN(x) ((x) << 16)
- # define R500_ROUND_ADJ (1 << 20)
- #define R500_US_PIXSIZE 0x4604
- # define R500_PIX_SIZE(x) (x)
- #define R500_US_TEX_ADDR_0 0x9800
--# define R500_TEX_SRC_ADDR(x) (x << 0)
-+# define R500_TEX_SRC_ADDR(x) ((x) << 0)
- # define R500_TEX_SRC_ADDR_REL (1 << 7)
- # define R500_TEX_SRC_S_SWIZ_R (0 << 8)
- # define R500_TEX_SRC_S_SWIZ_G (1 << 8)
-@@ -3084,7 +3084,7 @@ enum {
- # define R500_TEX_SRC_Q_SWIZ_G (1 << 14)
- # define R500_TEX_SRC_Q_SWIZ_B (2 << 14)
- # define R500_TEX_SRC_Q_SWIZ_A (3 << 14)
--# define R500_TEX_DST_ADDR(x) (x << 16)
-+# define R500_TEX_DST_ADDR(x) ((x) << 16)
- # define R500_TEX_DST_ADDR_REL (1 << 23)
- # define R500_TEX_DST_R_SWIZ_R (0 << 24)
- # define R500_TEX_DST_R_SWIZ_G (1 << 24)
-@@ -3103,7 +3103,7 @@ enum {
- # define R500_TEX_DST_A_SWIZ_B (2 << 30)
- # define R500_TEX_DST_A_SWIZ_A (3 << 30)
- #define R500_US_TEX_ADDR_DXDY_0 0xa000
--# define R500_DX_ADDR(x) (x << 0)
-+# define R500_DX_ADDR(x) ((x) << 0)
- # define R500_DX_ADDR_REL (1 << 7)
- # define R500_DX_S_SWIZ_R (0 << 8)
- # define R500_DX_S_SWIZ_G (1 << 8)
-@@ -3121,7 +3121,7 @@ enum {
- # define R500_DX_Q_SWIZ_G (1 << 14)
- # define R500_DX_Q_SWIZ_B (2 << 14)
- # define R500_DX_Q_SWIZ_A (3 << 14)
--# define R500_DY_ADDR(x) (x << 16)
-+# define R500_DY_ADDR(x) ((x) << 16)
- # define R500_DY_ADDR_REL (1 << 17)
- # define R500_DY_S_SWIZ_R (0 << 24)
- # define R500_DY_S_SWIZ_G (1 << 24)
-@@ -3140,7 +3140,7 @@ enum {
- # define R500_DY_Q_SWIZ_B (2 << 30)
- # define R500_DY_Q_SWIZ_A (3 << 30)
- #define R500_US_TEX_INST_0 0x9000
--# define R500_TEX_ID(x) (x << 16)
-+# define R500_TEX_ID(x) ((x) << 16)
- # define R500_TEX_INST_NOP (0 << 22)
- # define R500_TEX_INST_LD (1 << 22)
- # define R500_TEX_INST_TEXKILL (2 << 22)
-diff --git a/src/mesa/drivers/dri/r300/r300_render.c b/src/mesa/drivers/dri/r300/r300_render.c
-index f9266e4..16ce4a1 100644
---- a/src/mesa/drivers/dri/r300/r300_render.c
-+++ b/src/mesa/drivers/dri/r300/r300_render.c
-@@ -347,6 +347,8 @@ static GLboolean r300RunRender(GLcontext * ctx,
- static int r300Fallback(GLcontext * ctx)
- {
- r300ContextPtr r300 = R300_CONTEXT(ctx);
-+ const unsigned back = ctx->Stencil._BackFace;
-+
- /* Do we need to use new-style shaders?
- * Also is there a better way to do this? */
- if (r300->radeon.radeonScreen->chip_family >= CHIP_FAMILY_RV515) {
-@@ -371,12 +373,14 @@ static int r300Fallback(GLcontext * ctx)
-
- FALLBACK_IF(ctx->RenderMode != GL_RENDER);
-
-- FALLBACK_IF(ctx->Stencil._TestTwoSide
-- && (ctx->Stencil.Ref[0] != ctx->Stencil.Ref[1]
-- || ctx->Stencil.ValueMask[0] !=
-- ctx->Stencil.ValueMask[1]
-- || ctx->Stencil.WriteMask[0] !=
-- ctx->Stencil.WriteMask[1]));
-+ /* If GL_EXT_stencil_two_side is disabled, this fallback check can
-+ * be removed.
-+ */
-+ FALLBACK_IF(ctx->Stencil.Ref[0] != ctx->Stencil.Ref[back]
-+ || ctx->Stencil.ValueMask[0] !=
-+ ctx->Stencil.ValueMask[back]
-+ || ctx->Stencil.WriteMask[0] !=
-+ ctx->Stencil.WriteMask[back]);
-
- if (ctx->Extensions.NV_point_sprite || ctx->Extensions.ARB_point_sprite)
- FALLBACK_IF(ctx->Point.PointSprite);
-diff --git a/src/mesa/drivers/dri/r300/r300_state.c b/src/mesa/drivers/dri/r300/r300_state.c
-index a63dbac..ade45f5 100644
---- a/src/mesa/drivers/dri/r300/r300_state.c
-+++ b/src/mesa/drivers/dri/r300/r300_state.c
-@@ -783,6 +783,7 @@ static void r300Fogfv(GLcontext * ctx, GLenum pname, const GLfloat * param)
- R300_FG_FOG_BLEND_FN_EXP2;
- fogScale.f = 0.3 * ctx->Fog.Density;
- fogStart.f = 0.0;
-+ break;
- default:
- return;
- }
-@@ -974,15 +975,9 @@ static void r300StencilFuncSeparate(GLcontext * ctx, GLenum face,
- {
- r300ContextPtr rmesa = R300_CONTEXT(ctx);
- GLuint refmask =
-- (((ctx->Stencil.
-- Ref[0] & 0xff) << R300_STENCILREF_SHIFT) | ((ctx->
-- Stencil.
-- ValueMask
-- [0] &
-- 0xff)
-- <<
-- R300_STENCILMASK_SHIFT));
--
-+ ((ctx->Stencil.Ref[0] & 0xff) << R300_STENCILREF_SHIFT)
-+ | ((ctx->Stencil.ValueMask[0] & 0xff) << R300_STENCILMASK_SHIFT);
-+ const unsigned back = ctx->Stencil._BackFace;
- GLuint flag;
-
- R300_STATECHANGE(rmesa, zs);
-@@ -1000,8 +995,7 @@ static void r300StencilFuncSeparate(GLcontext * ctx, GLenum face,
- rmesa->hw.zs.cmd[R300_ZS_CNTL_1] |=
- (flag << R300_S_FRONT_FUNC_SHIFT);
-
-- if (ctx->Stencil._TestTwoSide)
-- flag = translate_func(ctx->Stencil.Function[1]);
-+ flag = translate_func(ctx->Stencil.Function[back]);
-
- rmesa->hw.zs.cmd[R300_ZS_CNTL_1] |=
- (flag << R300_S_BACK_FUNC_SHIFT);
-@@ -1026,6 +1020,7 @@ static void r300StencilOpSeparate(GLcontext * ctx, GLenum face,
- GLenum fail, GLenum zfail, GLenum zpass)
- {
- r300ContextPtr rmesa = R300_CONTEXT(ctx);
-+ const unsigned back = ctx->Stencil._BackFace;
-
- R300_STATECHANGE(rmesa, zs);
- /* It is easier to mask what's left.. */
-@@ -1042,23 +1037,13 @@ static void r300StencilOpSeparate(GLcontext * ctx, GLenum face,
- | (translate_stencil_op(ctx->Stencil.ZPassFunc[0]) <<
- R300_S_FRONT_ZPASS_OP_SHIFT);
-
-- if (ctx->Stencil._TestTwoSide) {
-- rmesa->hw.zs.cmd[R300_ZS_CNTL_1] |=
-- (translate_stencil_op(ctx->Stencil.FailFunc[1]) <<
-- R300_S_BACK_SFAIL_OP_SHIFT)
-- | (translate_stencil_op(ctx->Stencil.ZFailFunc[1]) <<
-- R300_S_BACK_ZFAIL_OP_SHIFT)
-- | (translate_stencil_op(ctx->Stencil.ZPassFunc[1]) <<
-- R300_S_BACK_ZPASS_OP_SHIFT);
-- } else {
-- rmesa->hw.zs.cmd[R300_ZS_CNTL_1] |=
-- (translate_stencil_op(ctx->Stencil.FailFunc[0]) <<
-- R300_S_BACK_SFAIL_OP_SHIFT)
-- | (translate_stencil_op(ctx->Stencil.ZFailFunc[0]) <<
-- R300_S_BACK_ZFAIL_OP_SHIFT)
-- | (translate_stencil_op(ctx->Stencil.ZPassFunc[0]) <<
-- R300_S_BACK_ZPASS_OP_SHIFT);
-- }
-+ rmesa->hw.zs.cmd[R300_ZS_CNTL_1] |=
-+ (translate_stencil_op(ctx->Stencil.FailFunc[back]) <<
-+ R300_S_BACK_SFAIL_OP_SHIFT)
-+ | (translate_stencil_op(ctx->Stencil.ZFailFunc[back]) <<
-+ R300_S_BACK_ZFAIL_OP_SHIFT)
-+ | (translate_stencil_op(ctx->Stencil.ZPassFunc[back]) <<
-+ R300_S_BACK_ZPASS_OP_SHIFT);
- }
-
- /* =============================================================
-diff --git a/src/mesa/drivers/dri/r300/r500_fragprog.c b/src/mesa/drivers/dri/r300/r500_fragprog.c
-index 75dae86..926ddd5 100644
---- a/src/mesa/drivers/dri/r300/r500_fragprog.c
-+++ b/src/mesa/drivers/dri/r300/r500_fragprog.c
-@@ -31,6 +31,12 @@
- #include "radeon_program_alu.h"
-
-
-+static void reset_srcreg(struct prog_src_register* reg)
-+{
-+ _mesa_bzero(reg, sizeof(*reg));
-+ reg->Swizzle = SWIZZLE_NOOP;
-+}
-+
- static struct prog_src_register shadow_ambient(struct gl_program *program, int tmu)
- {
- gl_state_index fail_value_tokens[STATE_LENGTH] = {
-@@ -99,6 +105,19 @@ static GLboolean transform_TEX(
- destredirect = GL_TRUE;
- }
-
-+ if (inst.SrcReg[0].File != PROGRAM_TEMPORARY && inst.SrcReg[0].File != PROGRAM_INPUT) {
-+ int tmpreg = radeonFindFreeTemporary(t);
-+ tgt = radeonAppendInstructions(t->Program, 1);
-+ tgt->Opcode = OPCODE_MOV;
-+ tgt->DstReg.File = PROGRAM_TEMPORARY;
-+ tgt->DstReg.Index = tmpreg;
-+ tgt->SrcReg[0] = inst.SrcReg[0];
-+
-+ reset_srcreg(&inst.SrcReg[0]);
-+ inst.SrcReg[0].File = PROGRAM_TEMPORARY;
-+ inst.SrcReg[0].Index = tmpreg;
-+ }
-+
- tgt = radeonAppendInstructions(t->Program, 1);
- _mesa_copy_instructions(tgt, &inst, 1);
-
-diff --git a/src/mesa/drivers/dri/radeon/radeon_chipset.h b/src/mesa/drivers/dri/radeon/radeon_chipset.h
-index 55a73ea..f6bd1eb 100644
---- a/src/mesa/drivers/dri/radeon/radeon_chipset.h
-+++ b/src/mesa/drivers/dri/radeon/radeon_chipset.h
-@@ -247,6 +247,9 @@
- #define PCI_CHIP_RS350_7835 0x7835
- #define PCI_CHIP_RS690_791E 0x791E
- #define PCI_CHIP_RS690_791F 0x791F
-+#define PCI_CHIP_RS600_793F 0x793F
-+#define PCI_CHIP_RS600_7941 0x7941
-+#define PCI_CHIP_RS600_7942 0x7942
- #define PCI_CHIP_RS740_796C 0x796C
- #define PCI_CHIP_RS740_796D 0x796D
- #define PCI_CHIP_RS740_796E 0x796E
-@@ -270,6 +273,7 @@ enum {
- CHIP_FAMILY_R420,
- CHIP_FAMILY_RV410,
- CHIP_FAMILY_RS400,
-+ CHIP_FAMILY_RS600,
- CHIP_FAMILY_RS690,
- CHIP_FAMILY_RS740,
- CHIP_FAMILY_RV515,
-diff --git a/src/mesa/drivers/dri/radeon/radeon_context.c b/src/mesa/drivers/dri/radeon/radeon_context.c
-index 1e992c0..ea81a32 100644
---- a/src/mesa/drivers/dri/radeon/radeon_context.c
-+++ b/src/mesa/drivers/dri/radeon/radeon_context.c
-@@ -62,9 +62,6 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- #include "radeon_tcl.h"
- #include "radeon_maos.h"
-
--#define need_GL_ARB_multisample
--#define need_GL_ARB_texture_compression
--#define need_GL_ARB_vertex_buffer_object
- #define need_GL_EXT_blend_minmax
- #define need_GL_EXT_fog_coord
- #define need_GL_EXT_secondary_color
-@@ -114,16 +111,13 @@ static const GLubyte *radeonGetString( GLcontext *ctx, GLenum name )
- */
- const struct dri_extension card_extensions[] =
- {
-- { "GL_ARB_multisample", GL_ARB_multisample_functions },
- { "GL_ARB_multitexture", NULL },
- { "GL_ARB_texture_border_clamp", NULL },
-- { "GL_ARB_texture_compression", GL_ARB_texture_compression_functions },
- { "GL_ARB_texture_env_add", NULL },
- { "GL_ARB_texture_env_combine", NULL },
- { "GL_ARB_texture_env_crossbar", NULL },
- { "GL_ARB_texture_env_dot3", NULL },
- { "GL_ARB_texture_mirrored_repeat", NULL },
-- { "GL_ARB_vertex_buffer_object", GL_ARB_vertex_buffer_object_functions },
- { "GL_EXT_blend_logic_op", NULL },
- { "GL_EXT_blend_subtract", GL_EXT_blend_minmax_functions },
- { "GL_EXT_fog_coord", GL_EXT_fog_coord_functions },
-@@ -359,6 +353,8 @@ radeonCreateContext( const __GLcontextModes *glVisual,
-
- rmesa->boxes = 0;
-
-+ ctx->Const.MaxDrawBuffers = 1;
-+
- /* Initialize the software rasterizer and helper modules.
- */
- _swrast_CreateContext( ctx );
-diff --git a/src/mesa/drivers/dri/radeon/radeon_maos_arrays.c b/src/mesa/drivers/dri/radeon/radeon_maos_arrays.c
-index de3c3a1..31eea13 100644
---- a/src/mesa/drivers/dri/radeon/radeon_maos_arrays.c
-+++ b/src/mesa/drivers/dri/radeon/radeon_maos_arrays.c
-@@ -40,7 +40,6 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- #include "swrast_setup/swrast_setup.h"
- #include "math/m_translate.h"
- #include "tnl/tnl.h"
--#include "tnl/tcontext.h"
-
- #include "radeon_context.h"
- #include "radeon_ioctl.h"
-diff --git a/src/mesa/drivers/dri/radeon/radeon_screen.c b/src/mesa/drivers/dri/radeon/radeon_screen.c
-index 5f32dd5..f7cba50 100644
---- a/src/mesa/drivers/dri/radeon/radeon_screen.c
-+++ b/src/mesa/drivers/dri/radeon/radeon_screen.c
-@@ -206,6 +206,8 @@ DRI_CONF_BEGIN
- DRI_CONF_END;
- static const GLuint __driNConfigOptions = 17;
-
-+extern const struct dri_extension gl_20_extension[];
-+
- #ifndef RADEON_DEBUG
- int RADEON_DEBUG = 0;
-
-@@ -274,7 +276,7 @@ radeonFillInModes( __DRIscreenPrivate *psp,
-
- uint8_t depth_bits_array[2];
- uint8_t stencil_bits_array[2];
--
-+ uint8_t msaa_samples_array[1];
-
- depth_bits_array[0] = depth_bits;
- depth_bits_array[1] = depth_bits;
-@@ -286,6 +288,8 @@ radeonFillInModes( __DRIscreenPrivate *psp,
- stencil_bits_array[0] = 0;
- stencil_bits_array[1] = (stencil_bits == 0) ? 8 : stencil_bits;
-
-+ msaa_samples_array[0] = 0;
-+
- depth_buffer_factor = ((depth_bits != 0) || (stencil_bits != 0)) ? 2 : 1;
- back_buffer_factor = (have_back_buffer) ? 2 : 1;
-
-@@ -301,7 +305,8 @@ radeonFillInModes( __DRIscreenPrivate *psp,
- configs = driCreateConfigs(fb_format, fb_type,
- depth_bits_array, stencil_bits_array,
- depth_buffer_factor,
-- back_buffer_modes, back_buffer_factor);
-+ back_buffer_modes, back_buffer_factor,
-+ msaa_samples_array, 1);
- if (configs == NULL) {
- fprintf( stderr, "[%s:%u] Error creating FBConfig!\n",
- __func__, __LINE__ );
-@@ -680,6 +685,12 @@ radeonCreateScreen( __DRIscreenPrivate *sPriv )
- screen->chip_family = CHIP_FAMILY_RS400;
- break;
-
-+ case PCI_CHIP_RS600_793F:
-+ case PCI_CHIP_RS600_7941:
-+ case PCI_CHIP_RS600_7942:
-+ screen->chip_family = CHIP_FAMILY_RS600;
-+ break;
-+
- case PCI_CHIP_RS690_791E:
- case PCI_CHIP_RS690_791F:
- screen->chip_family = CHIP_FAMILY_RS690;
-@@ -838,7 +849,7 @@ radeonCreateScreen( __DRIscreenPrivate *sPriv )
- ret = radeonGetParam( sPriv->fd, RADEON_PARAM_FB_LOCATION,
- &temp);
- if (ret) {
-- if (screen->chip_family < CHIP_FAMILY_RS690)
-+ if (screen->chip_family < CHIP_FAMILY_RS600)
- screen->fbLocation = ( INREG( RADEON_MC_FB_LOCATION ) & 0xffff) << 16;
- else {
- FREE( screen );
-@@ -849,7 +860,7 @@ radeonCreateScreen( __DRIscreenPrivate *sPriv )
- screen->fbLocation = (temp & 0xffff) << 16;
- }
-
-- if (screen->chip_family >= CHIP_FAMILY_RV515) {
-+ if (screen->chip_family >= CHIP_FAMILY_R300) {
- ret = radeonGetParam( sPriv->fd, RADEON_PARAM_NUM_GB_PIPES,
- &temp);
- if (ret) {
-@@ -1140,6 +1151,7 @@ static void radeonDestroyContext(__DRIcontextPrivate * driContextPriv)
-
- #endif
-
-+
- /**
- * This is the driver specific part of the createNewScreen entry point.
- *
-@@ -1192,6 +1204,8 @@ radeonInitScreen(__DRIscreenPrivate *psp)
- driInitSingleExtension( NULL, NV_vp_extension );
- driInitSingleExtension( NULL, ATI_fs_extension );
- driInitExtensions( NULL, point_extensions, GL_FALSE );
-+#elif defined(RADEON_COMMON_FOR_R300)
-+ driInitSingleExtension( NULL, gl_20_extension );
- #endif
-
- if (!radeonInitDriver(psp))
-diff --git a/src/mesa/drivers/dri/radeon/radeon_texstate.c b/src/mesa/drivers/dri/radeon/radeon_texstate.c
-index 1e2f654..b165205 100644
---- a/src/mesa/drivers/dri/radeon/radeon_texstate.c
-+++ b/src/mesa/drivers/dri/radeon/radeon_texstate.c
-@@ -1023,11 +1023,11 @@ static GLboolean radeon_validate_texgen( GLcontext *ctx, GLuint unit )
- */
- else if ( (texUnit->TexGenEnabled & S_BIT) &&
- (texUnit->TexGenEnabled & T_BIT) &&
-- (texUnit->GenModeS == texUnit->GenModeT) ) {
-+ (texUnit->GenS.Mode == texUnit->GenT.Mode) ) {
- if ( ((texUnit->TexGenEnabled & R_BIT) &&
-- (texUnit->GenModeS != texUnit->GenModeR)) ||
-+ (texUnit->GenS.Mode != texUnit->GenR.Mode)) ||
- ((texUnit->TexGenEnabled & Q_BIT) &&
-- (texUnit->GenModeS != texUnit->GenModeQ)) ) {
-+ (texUnit->GenS.Mode != texUnit->GenQ.Mode)) ) {
- /* Mixed modes, fallback:
- */
- if (RADEON_DEBUG & DEBUG_FALLBACKS)
-@@ -1051,23 +1051,23 @@ static GLboolean radeon_validate_texgen( GLcontext *ctx, GLuint unit )
- rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXFMT] |= RADEON_Q_BIT(unit);
- }
-
-- switch (texUnit->GenModeS) {
-+ switch (texUnit->GenS.Mode) {
- case GL_OBJECT_LINEAR:
- rmesa->TexGenEnabled |= RADEON_TEXGEN_INPUT_OBJ << inputshift;
- set_texgen_matrix( rmesa, unit,
-- texUnit->ObjectPlaneS,
-- texUnit->ObjectPlaneT,
-- texUnit->ObjectPlaneR,
-- texUnit->ObjectPlaneQ);
-+ texUnit->GenS.ObjectPlane,
-+ texUnit->GenT.ObjectPlane,
-+ texUnit->GenR.ObjectPlane,
-+ texUnit->GenQ.ObjectPlane);
- break;
-
- case GL_EYE_LINEAR:
- rmesa->TexGenEnabled |= RADEON_TEXGEN_INPUT_EYE << inputshift;
- set_texgen_matrix( rmesa, unit,
-- texUnit->EyePlaneS,
-- texUnit->EyePlaneT,
-- texUnit->EyePlaneR,
-- texUnit->EyePlaneQ);
-+ texUnit->GenS.EyePlane,
-+ texUnit->GenT.EyePlane,
-+ texUnit->GenR.EyePlane,
-+ texUnit->GenQ.EyePlane);
- break;
-
- case GL_REFLECTION_MAP_NV:
-diff --git a/src/mesa/drivers/dri/s3v/s3v_context.c b/src/mesa/drivers/dri/s3v/s3v_context.c
-index 14502f9..0a3bf72 100644
---- a/src/mesa/drivers/dri/s3v/s3v_context.c
-+++ b/src/mesa/drivers/dri/s3v/s3v_context.c
-@@ -108,6 +108,8 @@ GLboolean s3vCreateContext(const __GLcontextModes *glVisual,
- ctx->Const.MaxLineWidthAA = 1.0;
- ctx->Const.LineWidthGranularity = 1.0;
-
-+ ctx->Const.MaxDrawBuffers = 1;
-+
- vmesa->texHeap = mmInit( 0, vmesa->s3vScreen->textureSize );
- DEBUG(("vmesa->s3vScreen->textureSize = 0x%x\n",
- vmesa->s3vScreen->textureSize));
-diff --git a/src/mesa/drivers/dri/savage/savage_xmesa.c b/src/mesa/drivers/dri/savage/savage_xmesa.c
-index a344aab..326d595 100644
---- a/src/mesa/drivers/dri/savage/savage_xmesa.c
-+++ b/src/mesa/drivers/dri/savage/savage_xmesa.c
-@@ -59,9 +59,6 @@
- #include "drirenderbuffer.h"
- #include "texmem.h"
-
--#define need_GL_ARB_multisample
--#define need_GL_ARB_texture_compression
--#define need_GL_ARB_vertex_buffer_object
- #define need_GL_EXT_secondary_color
- #include "extension_helper.h"
-
-@@ -133,10 +130,7 @@ struct timeval tv_s1,tv_f1;
-
- static const struct dri_extension card_extensions[] =
- {
-- { "GL_ARB_multisample", GL_ARB_multisample_functions },
- { "GL_ARB_multitexture", NULL },
-- { "GL_ARB_texture_compression", GL_ARB_texture_compression_functions },
-- { "GL_ARB_vertex_buffer_object", GL_ARB_vertex_buffer_object_functions },
- { "GL_EXT_stencil_wrap", NULL },
- { "GL_EXT_texture_lod_bias", NULL },
- { "GL_EXT_secondary_color", GL_EXT_secondary_color_functions },
-@@ -350,7 +344,9 @@ savageCreateContext( const __GLcontextModes *mesaVis,
- ctx->Const.MaxLineWidthAA = 3.0;
- ctx->Const.LineWidthGranularity = 1.0;
- #endif
--
-+
-+ ctx->Const.MaxDrawBuffers = 1;
-+
- /* Dri stuff
- */
- imesa->hHWContext = driContextPriv->hHWContext;
-@@ -914,7 +910,7 @@ savageFillInModes( __DRIscreenPrivate *psp,
-
- uint8_t depth_bits_array[2];
- uint8_t stencil_bits_array[2];
--
-+ uint8_t msaa_samples_array[1];
-
- depth_bits_array[0] = depth_bits;
- depth_bits_array[1] = depth_bits;
-@@ -926,6 +922,8 @@ savageFillInModes( __DRIscreenPrivate *psp,
- stencil_bits_array[0] = 0;
- stencil_bits_array[1] = (stencil_bits == 0) ? 8 : stencil_bits;
-
-+ msaa_samples_array[0] = 0;
-+
- depth_buffer_factor = ((depth_bits != 0) || (stencil_bits != 0)) ? 2 : 1;
- back_buffer_factor = (have_back_buffer) ? 2 : 1;
-
-@@ -941,7 +939,8 @@ savageFillInModes( __DRIscreenPrivate *psp,
- configs = driCreateConfigs(fb_format, fb_type,
- depth_bits_array, stencil_bits_array,
- depth_buffer_factor,
-- back_buffer_modes, back_buffer_factor);
-+ back_buffer_modes, back_buffer_factor,
-+ msaa_samples_array, 1);
- if (configs == NULL) {
- fprintf( stderr, "[%s:%u] Error creating FBConfig!\n",
- __func__, __LINE__ );
-diff --git a/src/mesa/drivers/dri/sis/sis_alloc.c b/src/mesa/drivers/dri/sis/sis_alloc.c
-index 4ca4052..ce34e44 100644
---- a/src/mesa/drivers/dri/sis/sis_alloc.c
-+++ b/src/mesa/drivers/dri/sis/sis_alloc.c
-@@ -137,7 +137,7 @@ sisAllocZStencilBuffer( sisContextPtr smesa )
- {
- int cpp = ( smesa->glCtx->Visual.depthBits +
- smesa->glCtx->Visual.stencilBits ) / 8;
-- unsigned char *addr;
-+ char *addr;
-
- smesa->depth.bpp = cpp * 8;
- smesa->depth.pitch = ALIGNMENT(smesa->driDrawable->w * cpp, 4);
-@@ -150,7 +150,7 @@ sisAllocZStencilBuffer( sisContextPtr smesa )
- addr = (char *)ALIGNMENT((unsigned long)addr, Z_BUFFER_HW_ALIGNMENT);
-
- smesa->depth.map = addr;
-- smesa->depth.offset = addr - smesa->FbBase;
-+ smesa->depth.offset = addr - (char *)smesa->FbBase;
-
- /* stencil buffer is same as depth buffer */
- smesa->stencil.size = smesa->depth.size;
-@@ -173,7 +173,7 @@ void
- sisAllocBackbuffer( sisContextPtr smesa )
- {
- int cpp = smesa->bytesPerPixel;
-- unsigned char *addr;
-+ char *addr;
-
- smesa->back.bpp = smesa->bytesPerPixel * 8;
- smesa->back.pitch = ALIGNMENT(smesa->driDrawable->w * cpp, 4);
-@@ -186,7 +186,7 @@ sisAllocBackbuffer( sisContextPtr smesa )
- addr = (char *)ALIGNMENT((unsigned long)addr, DRAW_BUFFER_HW_ALIGNMENT);
-
- smesa->back.map = addr;
-- smesa->back.offset = addr - smesa->FbBase;
-+ smesa->back.offset = addr - (char *)smesa->FbBase;
- }
-
- void
-diff --git a/src/mesa/drivers/dri/sis/sis_context.c b/src/mesa/drivers/dri/sis/sis_context.c
-index 00d17da..a070fe3 100644
---- a/src/mesa/drivers/dri/sis/sis_context.c
-+++ b/src/mesa/drivers/dri/sis/sis_context.c
-@@ -57,9 +57,6 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.
- #include "tnl/tnl.h"
- #include "tnl/t_pipeline.h"
-
--#define need_GL_ARB_multisample
--#define need_GL_ARB_texture_compression
--#define need_GL_ARB_vertex_buffer_object
- #define need_GL_EXT_fog_coord
- #define need_GL_EXT_secondary_color
- #include "extension_helper.h"
-@@ -74,12 +71,9 @@ int GlobalCmdQueueLen = 0;
-
- struct dri_extension card_extensions[] =
- {
-- { "GL_ARB_multisample", GL_ARB_multisample_functions },
- { "GL_ARB_multitexture", NULL },
- { "GL_ARB_texture_border_clamp", NULL },
-- { "GL_ARB_texture_compression", GL_ARB_texture_compression_functions },
- { "GL_ARB_texture_mirrored_repeat", NULL },
-- { "GL_ARB_vertex_buffer_object", GL_ARB_vertex_buffer_object_functions },
- /*{ "GL_EXT_fog_coord", GL_EXT_fog_coord_functions },*/
- { "GL_EXT_texture_lod_bias", NULL },
- { "GL_EXT_secondary_color", GL_EXT_secondary_color_functions },
-@@ -91,9 +85,7 @@ struct dri_extension card_extensions[] =
-
- struct dri_extension card_extensions_6326[] =
- {
-- { "GL_ARB_multisample", GL_ARB_multisample_functions },
- /*{ "GL_ARB_texture_border_clamp", NULL },*/
-- { "GL_ARB_texture_compression", GL_ARB_texture_compression_functions },
- /*{ "GL_ARB_texture_mirrored_repeat", NULL },*/
- /*{ "GL_MESA_ycbcr_texture", NULL },*/
- { NULL, NULL }
-diff --git a/src/mesa/drivers/dri/sis/sis_screen.c b/src/mesa/drivers/dri/sis/sis_screen.c
-index b1a5d15..9eb27fe 100644
---- a/src/mesa/drivers/dri/sis/sis_screen.c
-+++ b/src/mesa/drivers/dri/sis/sis_screen.c
-@@ -77,6 +77,7 @@ sisFillInModes(__DRIscreenPrivate *psp, int bpp)
- };
- uint8_t depth_bits_array[4];
- uint8_t stencil_bits_array[4];
-+ uint8_t msaa_samples_array[1];
-
- depth_bits_array[0] = 0;
- stencil_bits_array[0] = 0;
-@@ -87,6 +88,8 @@ sisFillInModes(__DRIscreenPrivate *psp, int bpp)
- depth_bits_array[3] = 32;
- stencil_bits_array[3] = 0;
-
-+ msaa_samples_array[0] = 0;
-+
- depth_buffer_factor = 4;
- back_buffer_factor = 2;
-
-@@ -100,7 +103,8 @@ sisFillInModes(__DRIscreenPrivate *psp, int bpp)
-
- configs = driCreateConfigs(fb_format, fb_type, depth_bits_array,
- stencil_bits_array, depth_buffer_factor,
-- back_buffer_modes, back_buffer_factor);
-+ back_buffer_modes, back_buffer_factor,
-+ msaa_samples_array, 1);
- if (configs == NULL) {
- fprintf(stderr, "[%s:%u] Error creating FBConfig!\n", __func__, __LINE__);
- return NULL;
-diff --git a/src/mesa/drivers/dri/sis/sis_tris.c b/src/mesa/drivers/dri/sis/sis_tris.c
-index 095941a..76d12d0 100644
---- a/src/mesa/drivers/dri/sis/sis_tris.c
-+++ b/src/mesa/drivers/dri/sis/sis_tris.c
-@@ -994,7 +994,7 @@ sisFlushPrimsLocked(sisContextPtr smesa)
- MMIO(REG_3D_PrimitiveSet, smesa->dwPrimitiveSet);
- }
- while (smesa->vb_last < smesa->vb_cur) {
-- sis_emit_func(smesa, smesa->vb_last);
-+ sis_emit_func(smesa, (char *)smesa->vb_last);
- smesa->vb_last += incr;
- }
- mWait3DCmdQueue(1);
-diff --git a/src/mesa/drivers/dri/swrast/swrast.c b/src/mesa/drivers/dri/swrast/swrast.c
-index 15b5724..2e7f113 100644
---- a/src/mesa/drivers/dri/swrast/swrast.c
-+++ b/src/mesa/drivers/dri/swrast/swrast.c
-@@ -72,7 +72,7 @@
- #define need_GL_EXT_framebuffer_blit
- #define need_GL_EXT_gpu_program_parameters
- #define need_GL_EXT_paletted_texture
--#define need_GL_IBM_multimode_draw_arrays
-+#define need_GL_EXT_stencil_two_side
- #define need_GL_MESA_resize_buffers
- #define need_GL_NV_vertex_program
- #define need_GL_NV_fragment_program
-@@ -103,7 +103,7 @@ const struct dri_extension card_extensions[] =
- { "GL_EXT_framebuffer_blit", GL_EXT_framebuffer_blit_functions },
- { "GL_EXT_gpu_program_parameters", GL_EXT_gpu_program_parameters_functions },
- { "GL_EXT_paletted_texture", GL_EXT_paletted_texture_functions },
-- { "GL_IBM_multimode_draw_arrays", GL_IBM_multimode_draw_arrays_functions },
-+ { "GL_EXT_stencil_two_side", GL_EXT_stencil_two_side_functions },
- { "GL_MESA_resize_buffers", GL_MESA_resize_buffers_functions },
- { "GL_NV_vertex_program", GL_NV_vertex_program_functions },
- { "GL_NV_fragment_program", GL_NV_fragment_program_functions },
-@@ -147,6 +147,7 @@ swrastFillInModes(__DRIscreen *psp,
-
- uint8_t depth_bits_array[4];
- uint8_t stencil_bits_array[4];
-+ uint8_t msaa_samples_array[1];
-
- depth_bits_array[0] = 0;
- depth_bits_array[1] = 0;
-@@ -161,26 +162,38 @@ swrastFillInModes(__DRIscreen *psp,
- stencil_bits_array[2] = 0;
- stencil_bits_array[3] = (stencil_bits == 0) ? 8 : stencil_bits;
-
-+ msaa_samples_array[0] = 0;
-+
- depth_buffer_factor = 4;
- back_buffer_factor = 2;
-
-- if (pixel_bits == 8) {
-+ switch (pixel_bits) {
-+ case 8:
- fb_format = GL_RGB;
- fb_type = GL_UNSIGNED_BYTE_2_3_3_REV;
-- }
-- else if (pixel_bits == 16) {
-+ break;
-+ case 16:
- fb_format = GL_RGB;
- fb_type = GL_UNSIGNED_SHORT_5_6_5;
-- }
-- else {
-+ break;
-+ case 24:
-+ fb_format = GL_BGR;
-+ fb_type = GL_UNSIGNED_INT_8_8_8_8_REV;
-+ break;
-+ case 32:
- fb_format = GL_BGRA;
- fb_type = GL_UNSIGNED_INT_8_8_8_8_REV;
-+ break;
-+ default:
-+ fprintf(stderr, "[%s:%u] bad depth %d\n", __func__, __LINE__,
-+ pixel_bits);
-+ return NULL;
- }
-
- configs = driCreateConfigs(fb_format, fb_type,
- depth_bits_array, stencil_bits_array,
- depth_buffer_factor, back_buffer_modes,
-- back_buffer_factor);
-+ back_buffer_factor, msaa_samples_array, 1);
- if (configs == NULL) {
- fprintf(stderr, "[%s:%u] Error creating FBConfig!\n", __func__,
- __LINE__);
-@@ -196,7 +209,7 @@ driCreateNewScreen(int scrn, const __DRIextension **extensions,
- {
- static const __DRIextension *emptyExtensionList[] = { NULL };
- __DRIscreen *psp;
-- __DRIconfig **configs8, **configs16, **configs32;
-+ __DRIconfig **configs8, **configs16, **configs24, **configs32;
-
- (void) data;
-
-@@ -213,11 +226,13 @@ driCreateNewScreen(int scrn, const __DRIextension **extensions,
-
- configs8 = swrastFillInModes(psp, 8, 8, 0, 1);
- configs16 = swrastFillInModes(psp, 16, 16, 0, 1);
-+ configs24 = swrastFillInModes(psp, 24, 24, 8, 1);
- configs32 = swrastFillInModes(psp, 32, 24, 8, 1);
-
-- configs16 = (__DRIconfig **)driConcatConfigs(configs8, configs16);
--
-- *driver_configs = driConcatConfigs(configs16, configs32);
-+ configs16 = driConcatConfigs(configs8, configs16);
-+ configs24 = driConcatConfigs(configs16, configs24);
-+ *driver_configs = (const __DRIconfig **)
-+ driConcatConfigs(configs24, configs32);
-
- driInitExtensions( NULL, card_extensions, GL_FALSE );
-
-@@ -249,19 +264,24 @@ static GLuint
- choose_pixel_format(const GLvisual *v)
- {
- if (v->rgbMode) {
-- int bpp = v->rgbBits;
-+ int depth = v->rgbBits;
-
-- if (bpp == 32
-+ if (depth == 32
- && v->redMask == 0xff0000
- && v->greenMask == 0x00ff00
- && v->blueMask == 0x0000ff)
- return PF_A8R8G8B8;
-- else if (bpp == 16
-+ else if (depth == 24
-+ && v->redMask == 0xff0000
-+ && v->greenMask == 0x00ff00
-+ && v->blueMask == 0x0000ff)
-+ return PF_X8R8G8B8;
-+ else if (depth == 16
- && v->redMask == 0xf800
- && v->greenMask == 0x07e0
- && v->blueMask == 0x001f)
- return PF_R5G6B5;
-- else if (bpp == 8
-+ else if (depth == 8
- && v->redMask == 0x07
- && v->greenMask == 0x38
- && v->blueMask == 0xc0)
-@@ -290,7 +310,6 @@ swrast_alloc_front_storage(GLcontext *ctx, struct gl_renderbuffer *rb,
- GLenum internalFormat, GLuint width, GLuint height)
- {
- struct swrast_renderbuffer *xrb = swrast_renderbuffer(rb);
-- int bpp;
- unsigned mask = PITCH_ALIGN_BITS - 1;
-
- TRACE;
-@@ -299,23 +318,8 @@ swrast_alloc_front_storage(GLcontext *ctx, struct gl_renderbuffer *rb,
- rb->Width = width;
- rb->Height = height;
-
-- switch (internalFormat) {
-- case GL_RGB:
-- bpp = rb->RedBits + rb->GreenBits + rb->BlueBits;
-- break;
-- case GL_RGBA:
-- bpp = rb->RedBits + rb->GreenBits + rb->BlueBits + rb->AlphaBits;
-- break;
-- case GL_COLOR_INDEX8_EXT:
-- bpp = rb->IndexBits;
-- break;
-- default:
-- _mesa_problem( NULL, "unexpected format in %s", __FUNCTION__ );
-- return GL_FALSE;
-- }
--
- /* always pad to PITCH_ALIGN_BITS */
-- xrb->pitch = ((width * bpp + mask) & ~mask) / 8;
-+ xrb->pitch = ((width * xrb->bpp + mask) & ~mask) / 8;
-
- return GL_TRUE;
- }
-@@ -371,6 +375,17 @@ swrast_new_renderbuffer(const GLvisual *visual, GLboolean front)
- xrb->Base.GreenBits = 8 * sizeof(GLubyte);
- xrb->Base.BlueBits = 8 * sizeof(GLubyte);
- xrb->Base.AlphaBits = 8 * sizeof(GLubyte);
-+ xrb->bpp = 32;
-+ break;
-+ case PF_X8R8G8B8:
-+ xrb->Base.InternalFormat = GL_RGB;
-+ xrb->Base._BaseFormat = GL_RGB;
-+ xrb->Base.DataType = GL_UNSIGNED_BYTE;
-+ xrb->Base.RedBits = 8 * sizeof(GLubyte);
-+ xrb->Base.GreenBits = 8 * sizeof(GLubyte);
-+ xrb->Base.BlueBits = 8 * sizeof(GLubyte);
-+ xrb->Base.AlphaBits = 0;
-+ xrb->bpp = 32;
- break;
- case PF_R5G6B5:
- xrb->Base.InternalFormat = GL_RGB;
-@@ -380,6 +395,7 @@ swrast_new_renderbuffer(const GLvisual *visual, GLboolean front)
- xrb->Base.GreenBits = 6 * sizeof(GLubyte);
- xrb->Base.BlueBits = 5 * sizeof(GLubyte);
- xrb->Base.AlphaBits = 0;
-+ xrb->bpp = 16;
- break;
- case PF_R3G3B2:
- xrb->Base.InternalFormat = GL_RGB;
-@@ -389,12 +405,14 @@ swrast_new_renderbuffer(const GLvisual *visual, GLboolean front)
- xrb->Base.GreenBits = 3 * sizeof(GLubyte);
- xrb->Base.BlueBits = 2 * sizeof(GLubyte);
- xrb->Base.AlphaBits = 0;
-+ xrb->bpp = 8;
- break;
- case PF_CI8:
- xrb->Base.InternalFormat = GL_COLOR_INDEX8_EXT;
- xrb->Base._BaseFormat = GL_COLOR_INDEX;
- xrb->Base.DataType = GL_UNSIGNED_BYTE;
- xrb->Base.IndexBits = 8 * sizeof(GLubyte);
-+ xrb->bpp = 8;
- break;
- default:
- return NULL;
-diff --git a/src/mesa/drivers/dri/swrast/swrast_priv.h b/src/mesa/drivers/dri/swrast/swrast_priv.h
-index a707ffc..1a5fb31 100644
---- a/src/mesa/drivers/dri/swrast/swrast_priv.h
-+++ b/src/mesa/drivers/dri/swrast/swrast_priv.h
-@@ -90,6 +90,8 @@ struct swrast_renderbuffer {
-
- /* renderbuffer pitch (in bytes) */
- GLuint pitch;
-+ /* bits per pixel of storage */
-+ GLuint bpp;
- };
-
- static INLINE __DRIcontext *
-@@ -115,10 +117,10 @@ swrast_renderbuffer(struct gl_renderbuffer *rb)
- * Pixel formats we support
- */
- #define PF_CI8 1 /**< Color Index mode */
--#define PF_A8R8G8B8 2 /**< 32-bit TrueColor: 8-A, 8-R, 8-G, 8-B bits */
--#define PF_R5G6B5 3 /**< 16-bit TrueColor: 5-R, 6-G, 5-B bits */
--#define PF_R3G3B2 4 /**< 8-bit TrueColor: 3-R, 3-G, 2-B bits */
--
-+#define PF_A8R8G8B8 2 /**< 32bpp TrueColor: 8-A, 8-R, 8-G, 8-B bits */
-+#define PF_R5G6B5 3 /**< 16bpp TrueColor: 5-R, 6-G, 5-B bits */
-+#define PF_R3G3B2 4 /**< 8bpp TrueColor: 3-R, 3-G, 2-B bits */
-+#define PF_X8R8G8B8 5 /**< 32bpp TrueColor: 8-R, 8-G, 8-B bits */
-
- /**
- * Renderbuffer pitch alignment (in bits).
-diff --git a/src/mesa/drivers/dri/swrast/swrast_span.c b/src/mesa/drivers/dri/swrast/swrast_span.c
-index 5e99036..2d3c25d 100644
---- a/src/mesa/drivers/dri/swrast/swrast_span.c
-+++ b/src/mesa/drivers/dri/swrast/swrast_span.c
-@@ -79,6 +79,24 @@ static const GLubyte kernel[16] = {
- DST[BCOMP] = SRC[0]
-
-
-+/* 32-bit BGRX */
-+#define STORE_PIXEL_X8R8G8B8(DST, X, Y, VALUE) \
-+ DST[3] = 0xff; \
-+ DST[2] = VALUE[RCOMP]; \
-+ DST[1] = VALUE[GCOMP]; \
-+ DST[0] = VALUE[BCOMP]
-+#define STORE_PIXEL_RGB_X8R8G8B8(DST, X, Y, VALUE) \
-+ DST[3] = 0xff; \
-+ DST[2] = VALUE[RCOMP]; \
-+ DST[1] = VALUE[GCOMP]; \
-+ DST[0] = VALUE[BCOMP]
-+#define FETCH_PIXEL_X8R8G8B8(DST, SRC) \
-+ DST[ACOMP] = 0xff; \
-+ DST[RCOMP] = SRC[2]; \
-+ DST[GCOMP] = SRC[1]; \
-+ DST[BCOMP] = SRC[0]
-+
-+
- /* 16-bit BGR */
- #define STORE_PIXEL_R5G6B5(DST, X, Y, VALUE) \
- do { \
-@@ -139,6 +157,24 @@ static const GLubyte kernel[16] = {
- #include "swrast/s_spantemp.h"
-
-
-+/* 32-bit BGRX */
-+#define NAME(FUNC) FUNC##_X8R8G8B8
-+#define RB_TYPE GLubyte
-+#define SPAN_VARS \
-+ struct swrast_renderbuffer *xrb = swrast_renderbuffer(rb);
-+#define INIT_PIXEL_PTR(P, X, Y) \
-+ GLubyte *P = (GLubyte *)xrb->Base.Data + YFLIP(xrb, Y) * xrb->pitch + (X) * 4;
-+#define INC_PIXEL_PTR(P) P += 4
-+#define STORE_PIXEL(DST, X, Y, VALUE) \
-+ STORE_PIXEL_X8R8G8B8(DST, X, Y, VALUE)
-+#define STORE_PIXEL_RGB(DST, X, Y, VALUE) \
-+ STORE_PIXEL_RGB_X8R8G8B8(DST, X, Y, VALUE)
-+#define FETCH_PIXEL(DST, SRC) \
-+ FETCH_PIXEL_X8R8G8B8(DST, SRC)
-+
-+#include "swrast/s_spantemp.h"
-+
-+
- /* 16-bit BGR */
- #define NAME(FUNC) FUNC##_R5G6B5
- #define RB_TYPE GLubyte
-@@ -210,6 +246,24 @@ static const GLubyte kernel[16] = {
- #include "swrast_spantemp.h"
-
-
-+/* 32-bit BGRX */
-+#define NAME(FUNC) FUNC##_X8R8G8B8_front
-+#define RB_TYPE GLubyte
-+#define SPAN_VARS \
-+ struct swrast_renderbuffer *xrb = swrast_renderbuffer(rb);
-+#define INIT_PIXEL_PTR(P, X, Y) \
-+ GLubyte *P = (GLubyte *)row;
-+#define INC_PIXEL_PTR(P) P += 4
-+#define STORE_PIXEL(DST, X, Y, VALUE) \
-+ STORE_PIXEL_X8R8G8B8(DST, X, Y, VALUE)
-+#define STORE_PIXEL_RGB(DST, X, Y, VALUE) \
-+ STORE_PIXEL_RGB_X8R8G8B8(DST, X, Y, VALUE)
-+#define FETCH_PIXEL(DST, SRC) \
-+ FETCH_PIXEL_X8R8G8B8(DST, SRC)
-+
-+#include "swrast_spantemp.h"
-+
-+
- /* 16-bit BGR */
- #define NAME(FUNC) FUNC##_R5G6B5_front
- #define RB_TYPE GLubyte
-@@ -279,6 +333,15 @@ swrast_set_span_funcs_back(struct swrast_renderbuffer *xrb,
- xrb->Base.PutValues = put_values_A8R8G8B8;
- xrb->Base.PutMonoValues = put_mono_values_A8R8G8B8;
- break;
-+ case PF_X8R8G8B8:
-+ xrb->Base.GetRow = get_row_X8R8G8B8;
-+ xrb->Base.GetValues = get_values_X8R8G8B8;
-+ xrb->Base.PutRow = put_row_X8R8G8B8;
-+ xrb->Base.PutRowRGB = put_row_rgb_X8R8G8B8;
-+ xrb->Base.PutMonoRow = put_mono_row_X8R8G8B8;
-+ xrb->Base.PutValues = put_values_X8R8G8B8;
-+ xrb->Base.PutMonoValues = put_mono_values_X8R8G8B8;
-+ break;
- case PF_R5G6B5:
- xrb->Base.GetRow = get_row_R5G6B5;
- xrb->Base.GetValues = get_values_R5G6B5;
-@@ -334,6 +397,15 @@ swrast_set_span_funcs_front(struct swrast_renderbuffer *xrb,
- xrb->Base.PutValues = put_values_A8R8G8B8_front;
- xrb->Base.PutMonoValues = put_mono_values_A8R8G8B8_front;
- break;
-+ case PF_X8R8G8B8:
-+ xrb->Base.GetRow = get_row_X8R8G8B8_front;
-+ xrb->Base.GetValues = get_values_X8R8G8B8_front;
-+ xrb->Base.PutRow = put_row_X8R8G8B8_front;
-+ xrb->Base.PutRowRGB = put_row_rgb_X8R8G8B8_front;
-+ xrb->Base.PutMonoRow = put_mono_row_X8R8G8B8_front;
-+ xrb->Base.PutValues = put_values_X8R8G8B8_front;
-+ xrb->Base.PutMonoValues = put_mono_values_X8R8G8B8_front;
-+ break;
- case PF_R5G6B5:
- xrb->Base.GetRow = get_row_R5G6B5_front;
- xrb->Base.GetValues = get_values_R5G6B5_front;
-diff --git a/src/mesa/drivers/dri/tdfx/tdfx_context.c b/src/mesa/drivers/dri/tdfx/tdfx_context.c
-index ef688d1..20046fc 100644
---- a/src/mesa/drivers/dri/tdfx/tdfx_context.c
-+++ b/src/mesa/drivers/dri/tdfx/tdfx_context.c
-@@ -58,20 +58,15 @@
-
- #include "utils.h"
-
--#define need_GL_ARB_multisample
- /* #define need_GL_ARB_point_parameters */
- #define need_GL_ARB_occlusion_query
--#define need_GL_ARB_texture_compression
--#define need_GL_ARB_vertex_buffer_object
- /* #define need_GL_ARB_vertex_program */
- #define need_GL_EXT_blend_equation_separate
- #define need_GL_EXT_blend_func_separate
- #define need_GL_EXT_blend_minmax
- #define need_GL_EXT_fog_coord
--#define need_GL_EXT_multi_draw_arrays
- #define need_GL_EXT_paletted_texture
- /* #define need_GL_EXT_secondary_color */
--#define need_GL_IBM_multimode_draw_arrays
- /* #define need_GL_MESA_program_debug */
- /* #define need_GL_NV_vertex_program */
- #include "extension_helper.h"
-@@ -82,20 +77,16 @@
- */
- const struct dri_extension card_extensions[] =
- {
-- { "GL_ARB_multisample", GL_ARB_multisample_functions },
- { "GL_ARB_occlusion_query", GL_ARB_occlusion_query_functions },
- { "GL_ARB_texture_mirrored_repeat", NULL },
-- { "GL_ARB_vertex_buffer_object", GL_ARB_vertex_buffer_object_functions },
-
- { "GL_EXT_blend_func_separate", GL_EXT_blend_func_separate_functions },
- { "GL_EXT_fog_coord", GL_EXT_fog_coord_functions },
-- { "GL_EXT_multi_draw_arrays", GL_EXT_multi_draw_arrays_functions },
- { "GL_EXT_paletted_texture", GL_EXT_paletted_texture_functions },
- { "GL_EXT_shared_texture_palette", NULL },
- { "GL_EXT_stencil_wrap", NULL },
- { "GL_EXT_texture_env_add", NULL },
- { "GL_EXT_texture_lod_bias", NULL },
-- { "GL_IBM_multimode_draw_arrays", GL_IBM_multimode_draw_arrays_functions },
-
- #ifdef need_GL_ARB_point_parameters
- { "GL_ARB_point_parameters", GL_ARB_point_parameters_functions },
-@@ -122,7 +113,6 @@ const struct dri_extension card_extensions[] =
- */
- const struct dri_extension napalm_extensions[] =
- {
-- { "GL_ARB_texture_compression", GL_ARB_texture_compression_functions },
- { "GL_ARB_texture_env_combine", NULL },
- { "GL_EXT_blend_equation_separate", GL_EXT_blend_equation_separate_functions },
- { "GL_EXT_blend_subtract", GL_EXT_blend_minmax_functions },
-@@ -319,6 +309,8 @@ GLboolean tdfxCreateContext( const __GLcontextModes *mesaVis,
- ctx->Const.MaxLineWidthAA = 1.0;
- ctx->Const.LineWidthGranularity = 1.0;
-
-+ ctx->Const.MaxDrawBuffers = 1;
-+
- /* Initialize the software rasterizer and helper modules.
- */
- _swrast_CreateContext( ctx );
-diff --git a/src/mesa/drivers/dri/tdfx/tdfx_dd.c b/src/mesa/drivers/dri/tdfx/tdfx_dd.c
-index 2cef079..8472df6 100644
---- a/src/mesa/drivers/dri/tdfx/tdfx_dd.c
-+++ b/src/mesa/drivers/dri/tdfx/tdfx_dd.c
-@@ -110,13 +110,13 @@ static const GLubyte *tdfxDDGetString( GLcontext *ctx, GLenum name )
-
-
- static void
--tdfxBeginQuery(GLcontext *ctx, GLenum target, struct gl_query_object *q)
-+tdfxBeginQuery(GLcontext *ctx, struct gl_query_object *q)
- {
- tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
-
- (void) q;
-
-- if (target == GL_SAMPLES_PASSED_ARB) {
-+ if (q->Target == GL_SAMPLES_PASSED_ARB) {
- LOCK_HARDWARE(fxMesa);
- fxMesa->Glide.grFinish();
- fxMesa->Glide.grReset(GR_STATS_PIXELS);
-@@ -126,14 +126,14 @@ tdfxBeginQuery(GLcontext *ctx, GLenum target, struct gl_query_object *q)
-
-
- static void
--tdfxEndQuery(GLcontext *ctx, GLenum target, struct gl_query_object *q)
-+tdfxEndQuery(GLcontext *ctx, struct gl_query_object *q)
- {
- tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
- FxI32 total_pixels;
- FxI32 z_fail_pixels;
-
-
-- if (target == GL_SAMPLES_PASSED_ARB) {
-+ if (q->Target == GL_SAMPLES_PASSED_ARB) {
- LOCK_HARDWARE(fxMesa);
- fxMesa->Glide.grFinish();
-
-diff --git a/src/mesa/drivers/dri/tdfx/tdfx_screen.c b/src/mesa/drivers/dri/tdfx/tdfx_screen.c
-index cd22b84..5f2f5cf 100644
---- a/src/mesa/drivers/dri/tdfx/tdfx_screen.c
-+++ b/src/mesa/drivers/dri/tdfx/tdfx_screen.c
-@@ -361,6 +361,7 @@ tdfxFillInModes(__DRIscreenPrivate *psp,
- static const GLenum db_modes[2] = { GLX_NONE, GLX_SWAP_UNDEFINED_OML };
- uint8_t depth_bits_array[4];
- uint8_t stencil_bits_array[4];
-+ uint8_t msaa_samples_array[1];
- if(deep) {
- depth_bits_array[0] = 0;
- depth_bits_array[1] = 24;
-@@ -377,13 +378,17 @@ tdfxFillInModes(__DRIscreenPrivate *psp,
- stencil_bits_array[3] = 8;
- }
-
-- return driCreateConfigs(
-- deep ? GL_RGBA : GL_RGB,
-- deep ? GL_UNSIGNED_INT_8_8_8_8 : GL_UNSIGNED_SHORT_5_6_5,
-- depth_bits_array,
-- stencil_bits_array,
-- deep ? 2 : 4,
-- db_modes, 2);
-+ msaa_samples_array[0] = 0;
-+
-+ return (const __DRIconfig **)
-+ driCreateConfigs(deep ? GL_RGBA : GL_RGB,
-+ deep ? GL_UNSIGNED_INT_8_8_8_8 :
-+ GL_UNSIGNED_SHORT_5_6_5,
-+ depth_bits_array,
-+ stencil_bits_array,
-+ deep ? 2 : 4,
-+ db_modes, 2,
-+ msaa_samples_array, 1);
- }
-
- /**
-diff --git a/src/mesa/drivers/dri/trident/trident_context.c b/src/mesa/drivers/dri/trident/trident_context.c
-index e134cfc..aefd8a2 100644
---- a/src/mesa/drivers/dri/trident/trident_context.c
-+++ b/src/mesa/drivers/dri/trident/trident_context.c
-@@ -128,6 +128,8 @@ tridentCreateContext( const __GLcontextModes *glVisual,
- ctx->Const.MaxPointSizeAA = 16.0;
- ctx->Const.PointSizeGranularity = 0.25;
-
-+ ctx->Const.MaxDrawBuffers = 1;
-+
- #if 0
- tmesa->texHeap = mmInit( 0, tmesa->tridentScreen->textureSize );
-
-diff --git a/src/mesa/drivers/dri/trident/trident_vb.c b/src/mesa/drivers/dri/trident/trident_vb.c
-index b231f5e..055a914 100644
---- a/src/mesa/drivers/dri/trident/trident_vb.c
-+++ b/src/mesa/drivers/dri/trident/trident_vb.c
-@@ -402,7 +402,7 @@ void tridentInitVB( GLcontext *ctx )
- tridentContextPtr tmesa = TRIDENT_CONTEXT(ctx);
- GLuint size = TNL_CONTEXT(ctx)->vb.Size;
-
-- tmesa->verts = (char *)ALIGN_MALLOC( size * 16 * 4, 32 );
-+ tmesa->verts = (GLubyte *)ALIGN_MALLOC( size * 16 * 4, 32 );
-
- {
- static int firsttime = 1;
-diff --git a/src/mesa/drivers/dri/unichrome/via_context.c b/src/mesa/drivers/dri/unichrome/via_context.c
-index f5bdb65..6eb19ac 100644
---- a/src/mesa/drivers/dri/unichrome/via_context.c
-+++ b/src/mesa/drivers/dri/unichrome/via_context.c
-@@ -62,9 +62,7 @@
- #include "main/macros.h"
- #include "drirenderbuffer.h"
-
--#define need_GL_ARB_multisample
- #define need_GL_ARB_point_parameters
--#define need_GL_ARB_vertex_buffer_object
- #define need_GL_EXT_fog_coord
- #define need_GL_EXT_secondary_color
- #include "extension_helper.h"
-@@ -366,14 +364,12 @@ void viaReAllocateBuffers(GLcontext *ctx, GLframebuffer *drawbuffer,
- */
- const struct dri_extension card_extensions[] =
- {
-- { "GL_ARB_multisample", GL_ARB_multisample_functions },
- { "GL_ARB_multitexture", NULL },
- { "GL_ARB_point_parameters", GL_ARB_point_parameters_functions },
- { "GL_ARB_texture_env_add", NULL },
- { "GL_ARB_texture_env_combine", NULL },
- /* { "GL_ARB_texture_env_dot3", NULL }, */
- { "GL_ARB_texture_mirrored_repeat", NULL },
-- { "GL_ARB_vertex_buffer_object", GL_ARB_vertex_buffer_object_functions },
- { "GL_EXT_fog_coord", GL_EXT_fog_coord_functions },
- { "GL_EXT_secondary_color", GL_EXT_secondary_color_functions },
- { "GL_EXT_stencil_wrap", NULL },
-@@ -577,6 +573,8 @@ viaCreateContext(const __GLcontextModes *visual,
- ctx->Const.MaxPointSizeAA = 1.0;
- ctx->Const.PointSizeGranularity = 1.0;
-
-+ ctx->Const.MaxDrawBuffers = 1;
-+
- ctx->Driver.GetString = viaGetString;
-
- ctx->DriverCtx = (void *)vmesa;
-diff --git a/src/mesa/drivers/dri/unichrome/via_screen.c b/src/mesa/drivers/dri/unichrome/via_screen.c
-index 988f993..e9f5661 100644
---- a/src/mesa/drivers/dri/unichrome/via_screen.c
-+++ b/src/mesa/drivers/dri/unichrome/via_screen.c
-@@ -342,6 +342,7 @@ viaFillInModes( __DRIscreenPrivate *psp,
- */
- static const uint8_t depth_bits_array[4] = { 0, 16, 24, 32 };
- static const uint8_t stencil_bits_array[4] = { 0, 0, 8, 0 };
-+ uint8_t msaa_samples_array[1] = { 0 };
- const unsigned depth_buffer_factor = 3;
-
- if ( pixel_bits == 16 ) {
-@@ -356,7 +357,8 @@ viaFillInModes( __DRIscreenPrivate *psp,
- configs = driCreateConfigs(fb_format, fb_type,
- depth_bits_array, stencil_bits_array,
- depth_buffer_factor, back_buffer_modes,
-- back_buffer_factor);
-+ back_buffer_factor,
-+ msaa_samples_array, 1);
- if (configs == NULL) {
- fprintf(stderr, "[%s:%u] Error creating FBConfig!\n", __func__,
- __LINE__);
diff --git a/mesa.spec b/mesa.spec
index 77f6d48..39a935e 100644
--- a/mesa.spec
+++ b/mesa.spec
@@ -37,7 +37,6 @@ Source3: make-git-snapshot.sh
Source5: http://www.x.org/pub/individual/app/%{xdriinfo}.tar.bz2
Patch0: mesa-7.1-osmesa-version.patch
-Patch1: mesa-7.3-dri-drivers-master.patch
Patch2: mesa-7.1-nukeglthread-debug.patch
Patch3: mesa-no-mach64.patch
@@ -47,6 +46,7 @@ Patch7: mesa-7.1-link-shared.patch
Patch9: intel-revert-vbl.patch
Patch12: mesa-7.1-disable-intel-classic-warn.patch
+Patch13: mesa-7.3-965-texture-size.patch
BuildRequires: pkgconfig autoconf automake
%if %{with_dri}
@@ -168,13 +168,13 @@ This package provides some demo applications for testing Mesa.
%setup -q -n Mesa-%{version}%{?snapshot} -b0 -b1 -b2 -b5
#%setup -q -n mesa-%{gitdate} -b2 -b5
%patch0 -p1 -b .osmesa
-%patch1 -p1 -b .mesa-dri-master
%patch2 -p1 -b .intel-glthread
%patch3 -p0 -b .no-mach64
%patch5 -p1 -b .radeon-rewrite
%patch7 -p1 -b .dricore
%patch9 -p1 -b .intel-vbl
%patch12 -p1 -b .intel-nowarn
+%patch13 -p1 -b .965-texture
# Hack the demos to use installed data files
sed -i 's,../images,%{_libdir}/mesa-demos-data,' progs/demos/*.c
@@ -424,10 +424,7 @@ rm -rf $RPM_BUILD_ROOT
%changelog
* Fri Feb 27 2009 Dave Airlie <airlied@redhat.com> 7.3-8
-- mesa-7.3-dri-drivers-master.patch - pull in DRI drivers from master
-
-* Fri Feb 27 2009 Dave Airlie <airlied@redhat.com> 7.3-7
-- radeon-dri2-fixes.patch: add some fixes to radeon code
+- reset whole place back to 7.3-6 - bad plan
* Tue Feb 24 2009 Adam Jackson <ajax@redhat.com> 7.3-6
- Fix text relocations in OSMesa build. (#475146)
diff --git a/radeon-rewrite.patch b/radeon-rewrite.patch
index f0f14a0..9a86cc4 100644
--- a/radeon-rewrite.patch
+++ b/radeon-rewrite.patch
@@ -1,5 +1,5 @@
diff --git a/configs/autoconf.in b/configs/autoconf.in
-index e034431..98e39bb 100644
+index b352974..d786029 100644
--- a/configs/autoconf.in
+++ b/configs/autoconf.in
@@ -20,6 +20,8 @@ CXXFLAGS = @CPPFLAGS@ @CXXFLAGS@ \
@@ -12,20 +12,10 @@ index e034431..98e39bb 100644
# Assembler
MESA_ASM_SOURCES = @MESA_ASM_SOURCES@
diff --git a/configure.ac b/configure.ac
-index 2f3f0be..3554982 100644
+index a9a8d5a..ea2992d 100644
--- a/configure.ac
+++ b/configure.ac
-@@ -410,6 +410,9 @@ AC_SUBST([GLU_DIRS])
- AC_SUBST([DRIVER_DIRS])
- AC_SUBST([WINDOW_SYSTEM])
-
-+AC_SUBST([RADEON_CFLAGS])
-+AC_SUBST([RADEON_LDFLAGS])
-+
- dnl
- dnl User supplied program configuration
- dnl
-@@ -583,6 +585,13 @@ dri)
+@@ -573,6 +575,13 @@ dri)
GL_PC_REQ_PRIV="libdrm >= $LIBDRM_REQUIRED dri2proto >= $DRI2PROTO_REQUIRED"
DRI_PC_REQ_PRIV="libdrm >= $LIBDRM_REQUIRED"
@@ -39,6 +29,15 @@ index 2f3f0be..3554982 100644
# find the DRI deps for libGL
if test "$x11_pkgconfig" = yes; then
# add xcb modules if necessary
+@@ -578,6 +585,8 @@ AC_SUBST([GL_PC_REQ_PRIV])
+ AC_SUBST([GL_PC_LIB_PRIV])
+ AC_SUBST([GL_PC_CFLAGS])
+ AC_SUBST([DRI_PC_REQ_PRIV])
++AC_SUBST([RADEON_CFLAGS])
++AC_SUBST([RADEON_LDFLAGS])
+
+ dnl
+ dnl More X11 setup
diff --git a/src/mesa/drivers/dri/r200/Makefile b/src/mesa/drivers/dri/r200/Makefile
index e9144ac..e593ed9 100644
--- a/src/mesa/drivers/dri/r200/Makefile
@@ -739,23 +738,17 @@ diff --git a/src/mesa/drivers/dri/r200/r200_context.c b/src/mesa/drivers/dri/r20
index c067515..a744469 100644
--- a/src/mesa/drivers/dri/r200/r200_context.c
+++ b/src/mesa/drivers/dri/r200/r200_context.c
-@@ -54,7 +54,6 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+@@ -52,9 +52,9 @@ WITH THE SOFTWARE OR THE USE OR OTHER DE
+ #include "drivers/common/driverfuncs.h"
+
#include "r200_context.h"
++#include "radeon_span.h"
#include "r200_ioctl.h"
#include "r200_state.h"
-#include "r200_span.h"
#include "r200_pixel.h"
#include "r200_tex.h"
#include "r200_swtcl.h"
-@@ -62,6 +61,8 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- #include "r200_maos.h"
- #include "r200_vertprog.h"
-
-+#include "radeon_span.h"
-+
- #define need_GL_ARB_vertex_program
- #define need_GL_ATI_fragment_shader
- #define need_GL_EXT_blend_minmax
@@ -78,9 +79,6 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#include "vblank.h"
#include "utils.h"
@@ -4962,7 +4955,7 @@ index a917163..1dddbfd 100644
extern void r200LightingSpaceChange( GLcontext *ctx );
diff --git a/src/mesa/drivers/dri/r200/r200_state_init.c b/src/mesa/drivers/dri/r200/r200_state_init.c
-index 9e4677e..b40690e 100644
+index 9e4677e..013064d 100644
--- a/src/mesa/drivers/dri/r200/r200_state_init.c
+++ b/src/mesa/drivers/dri/r200/r200_state_init.c
@@ -43,6 +43,8 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -5127,7 +5120,7 @@ index 9e4677e..b40690e 100644
return h.i;
}
-@@ -127,96 +243,388 @@ static int cmdscl2( int offset, int stride, int count )
+@@ -127,71 +243,353 @@ static int cmdscl2( int offset, int stride, int count )
}
#define CHECK( NM, FLAG ) \
@@ -5254,7 +5247,6 @@ index 9e4677e..b40690e 100644
+ BATCH_LOCALS(&r200->radeon);
+ uint32_t dwords = atom->cmd_size;
+
-+ dwords += 6;
+ BEGIN_BATCH_NO_AUTOSTATE(dwords);
+ OUT_VEC(atom->cmd[MTL_CMD_0], (atom->cmd+1));
+ OUT_SCL2(atom->cmd[MTL_CMD_1], (atom->cmd + 18));
@@ -5267,7 +5259,6 @@ index 9e4677e..b40690e 100644
+ BATCH_LOCALS(&r200->radeon);
+ uint32_t dwords = atom->cmd_size;
+
-+ dwords += 8;
+ BEGIN_BATCH_NO_AUTOSTATE(dwords);
+ OUT_VEC(atom->cmd[LIT_CMD_0], atom->cmd+1);
+ OUT_VEC(atom->cmd[LIT_CMD_1], atom->cmd+LIT_CMD_1+1);
@@ -5280,7 +5271,6 @@ index 9e4677e..b40690e 100644
+ BATCH_LOCALS(&r200->radeon);
+ uint32_t dwords = atom->cmd_size;
+
-+ dwords += 8;
+ BEGIN_BATCH_NO_AUTOSTATE(dwords);
+ OUT_VEC(atom->cmd[PTP_CMD_0], atom->cmd+1);
+ OUT_VEC(atom->cmd[PTP_CMD_1], atom->cmd+PTP_CMD_1+1);
@@ -5293,7 +5283,6 @@ index 9e4677e..b40690e 100644
+ BATCH_LOCALS(&r200->radeon);
+ uint32_t dwords = atom->cmd_size;
+
-+ dwords += 4;
+ BEGIN_BATCH_NO_AUTOSTATE(dwords);
+ OUT_VECLINEAR(atom->cmd[0], atom->cmd+1);
+ END_BATCH();
@@ -5305,7 +5294,6 @@ index 9e4677e..b40690e 100644
+ BATCH_LOCALS(&r200->radeon);
+ uint32_t dwords = atom->cmd_size;
+
-+ dwords += 2;
+ BEGIN_BATCH_NO_AUTOSTATE(dwords);
+ OUT_SCL(atom->cmd[0], atom->cmd+1);
+ END_BATCH();
@@ -5318,7 +5306,6 @@ index 9e4677e..b40690e 100644
+ BATCH_LOCALS(&r200->radeon);
+ uint32_t dwords = atom->cmd_size;
+
-+ dwords += 4;
+ BEGIN_BATCH_NO_AUTOSTATE(dwords);
+ OUT_VEC(atom->cmd[0], atom->cmd+1);
+ END_BATCH();
@@ -5330,47 +5317,36 @@ index 9e4677e..b40690e 100644
+ BATCH_LOCALS(&r200->radeon);
+ struct radeon_renderbuffer *rrb;
+ uint32_t cbpitch;
-+ uint32_t zbpitch, depth_fmt;
++ uint32_t zbpitch;
+ uint32_t dwords = atom->cmd_size;
++ GLframebuffer *fb = r200->radeon.dri.drawable->driverPrivate;
+
+ /* output the first 7 bytes of context */
+ BEGIN_BATCH_NO_AUTOSTATE(dwords+2+2);
+ OUT_BATCH_TABLE(atom->cmd, 5);
+
-+ rrb = radeon_get_depthbuffer(&r200->radeon);
++ rrb = r200->radeon.state.depth.rrb;
+ if (!rrb) {
+ OUT_BATCH(0);
+ OUT_BATCH(0);
+ } else {
+ zbpitch = (rrb->pitch / rrb->cpp);
-+ if (r200->using_hyperz)
-+ zbpitch |= RADEON_DEPTH_HYPERZ;
+ OUT_BATCH_RELOC(0, rrb->bo, 0, 0, RADEON_GEM_DOMAIN_VRAM, 0);
+ OUT_BATCH(zbpitch);
-+ if (rrb->cpp == 4)
-+ depth_fmt = RADEON_DEPTH_FORMAT_24BIT_INT_Z;
-+ else
-+ depth_fmt = RADEON_DEPTH_FORMAT_16BIT_INT_Z;
-+ atom->cmd[CTX_RB3D_ZSTENCILCNTL] &= ~RADEON_DEPTH_FORMAT_MASK;
-+ atom->cmd[CTX_RB3D_ZSTENCILCNTL] |= depth_fmt;
+ }
+
+ OUT_BATCH(atom->cmd[CTX_RB3D_ZSTENCILCNTL]);
+ OUT_BATCH(atom->cmd[CTX_CMD_1]);
+ OUT_BATCH(atom->cmd[CTX_PP_CNTL]);
++ OUT_BATCH(atom->cmd[CTX_RB3D_CNTL]);
+
-+ rrb = radeon_get_colorbuffer(&r200->radeon);
++ rrb = r200->radeon.state.color.rrb;
++ if (r200->radeon.radeonScreen->driScreen->dri2.enabled) {
++ rrb = (struct radeon_renderbuffer *)fb->Attachment[BUFFER_BACK_LEFT].Renderbuffer;
++ }
+ if (!rrb || !rrb->bo) {
-+ OUT_BATCH(atom->cmd[CTX_RB3D_CNTL]);
+ OUT_BATCH(atom->cmd[CTX_RB3D_COLOROFFSET]);
+ } else {
-+ atom->cmd[CTX_RB3D_CNTL] &= ~(0xf << 10);
-+ if (rrb->cpp == 4)
-+ atom->cmd[CTX_RB3D_CNTL] |= RADEON_COLOR_FORMAT_ARGB8888;
-+ else
-+ atom->cmd[CTX_RB3D_CNTL] |= RADEON_COLOR_FORMAT_RGB565;
-+
-+ OUT_BATCH(atom->cmd[CTX_RB3D_CNTL]);
+ OUT_BATCH_RELOC(0, rrb->bo, 0, 0, RADEON_GEM_DOMAIN_VRAM, 0);
+ }
+
@@ -5380,7 +5356,11 @@ index 9e4677e..b40690e 100644
+ OUT_BATCH(atom->cmd[CTX_RB3D_COLORPITCH]);
+ } else {
+ cbpitch = (rrb->pitch / rrb->cpp);
-+ if (rrb->bo->flags & RADEON_BO_FLAGS_MACRO_TILE)
++ if (rrb->cpp == 4)
++ ;
++ else
++ ;
++ if (r200->radeon.sarea->tiling_enabled)
+ cbpitch |= R200_COLOR_TILE_ENABLE;
+ OUT_BATCH(cbpitch);
+ }
@@ -5399,38 +5379,22 @@ index 9e4677e..b40690e 100644
+ uint32_t cbpitch = 0;
+ uint32_t zbpitch = 0;
+ uint32_t dwords = atom->cmd_size;
-+ uint32_t depth_fmt;
++ GLframebuffer *fb = r200->radeon.dri.drawable->driverPrivate;
+
-+ rrb = radeon_get_colorbuffer(&r200->radeon);
-+ if (!rrb || !rrb->bo) {
-+ return;
++ rrb = r200->radeon.state.color.rrb;
++ if (r200->radeon.radeonScreen->driScreen->dri2.enabled) {
++ rrb = (struct radeon_renderbuffer *)fb->Attachment[BUFFER_BACK_LEFT].Renderbuffer;
+ }
-+
-+ atom->cmd[CTX_RB3D_CNTL] &= ~(0xf << 10);
-+ if (rrb->cpp == 4)
-+ atom->cmd[CTX_RB3D_CNTL] |= RADEON_COLOR_FORMAT_ARGB8888;
-+ else
-+ atom->cmd[CTX_RB3D_CNTL] |= RADEON_COLOR_FORMAT_RGB565;
-+
-+ cbpitch = (rrb->pitch / rrb->cpp);
-+ if (rrb->bo->flags & RADEON_BO_FLAGS_MACRO_TILE)
++ if (rrb) {
++ assert(rrb->bo != NULL);
++ cbpitch = (rrb->pitch / rrb->cpp);
++ if (r200->radeon.sarea->tiling_enabled)
+ cbpitch |= R200_COLOR_TILE_ENABLE;
-+
-+ drb = radeon_get_depthbuffer(&r200->radeon);
-+ if (drb) {
-+ zbpitch = (drb->pitch / drb->cpp);
-+ if (drb->cpp == 4)
-+ depth_fmt = RADEON_DEPTH_FORMAT_24BIT_INT_Z;
-+ else
-+ depth_fmt = RADEON_DEPTH_FORMAT_16BIT_INT_Z;
-+ atom->cmd[CTX_RB3D_ZSTENCILCNTL] &= ~RADEON_DEPTH_FORMAT_MASK;
-+ atom->cmd[CTX_RB3D_ZSTENCILCNTL] |= depth_fmt;
+ }
+
++ drb = r200->radeon.state.depth.rrb;
+ if (drb)
-+ dwords += 4;
-+ if (rrb)
-+ dwords += 4;
++ zbpitch = (drb->pitch / drb->cpp);
+
+ /* output the first 7 bytes of context */
+ BEGIN_BATCH_NO_AUTOSTATE(dwords);
@@ -5460,6 +5424,10 @@ index 9e4677e..b40690e 100644
+ }
+
+ if (rrb) {
++ if (rrb->cpp == 4)
++ ;
++ else
++ ;
+ OUT_BATCH(CP_PACKET0(RADEON_RB3D_COLORPITCH, 0));
+ OUT_BATCH(cbpitch);
+ }
@@ -5523,22 +5491,18 @@ index 9e4677e..b40690e 100644
void r200InitState( r200ContextPtr rmesa )
{
- GLcontext *ctx = rmesa->glCtx;
-- GLuint color_fmt, depth_fmt, i;
-- GLint drawPitch, drawOffset;
--
-- switch ( rmesa->r200Screen->cpp ) {
-- case 2:
-- color_fmt = R200_COLOR_FORMAT_RGB565;
-- break;
-- case 4:
-- color_fmt = R200_COLOR_FORMAT_ARGB8888;
-- break;
-- default:
-- fprintf( stderr, "Error: Unsupported pixel depth... exiting\n" );
-- exit( -1 );
-- }
+ GLcontext *ctx = rmesa->radeon.glCtx;
-+ GLuint i;
+ GLuint color_fmt, depth_fmt, i;
+ GLint drawPitch, drawOffset;
+
+- switch ( rmesa->r200Screen->cpp ) {
++ switch ( rmesa->radeon.radeonScreen->cpp ) {
+ case 2:
+ color_fmt = R200_COLOR_FORMAT_RGB565;
+ break;
+@@ -203,20 +601,20 @@ void r200InitState( r200ContextPtr rmesa )
+ exit( -1 );
+ }
- rmesa->state.color.clear = 0x00000000;
+ rmesa->radeon.state.color.clear = 0x00000000;
@@ -5547,24 +5511,24 @@ index 9e4677e..b40690e 100644
case 16:
- rmesa->state.depth.clear = 0x0000ffff;
- rmesa->state.depth.scale = 1.0 / (GLfloat)0xffff;
-- depth_fmt = R200_DEPTH_FORMAT_16BIT_INT_Z;
-- rmesa->state.stencil.clear = 0x00000000;
+ rmesa->radeon.state.depth.clear = 0x0000ffff;
+ rmesa->radeon.state.depth.scale = 1.0 / (GLfloat)0xffff;
+ depth_fmt = R200_DEPTH_FORMAT_16BIT_INT_Z;
+- rmesa->state.stencil.clear = 0x00000000;
+ rmesa->radeon.state.stencil.clear = 0x00000000;
break;
case 24:
- rmesa->state.depth.clear = 0x00ffffff;
- rmesa->state.depth.scale = 1.0 / (GLfloat)0xffffff;
-- depth_fmt = R200_DEPTH_FORMAT_24BIT_INT_Z;
-- rmesa->state.stencil.clear = 0xffff0000;
+ rmesa->radeon.state.depth.clear = 0x00ffffff;
+ rmesa->radeon.state.depth.scale = 1.0 / (GLfloat)0xffffff;
+ depth_fmt = R200_DEPTH_FORMAT_24BIT_INT_Z;
+- rmesa->state.stencil.clear = 0xffff0000;
+ rmesa->radeon.state.stencil.clear = 0xffff0000;
break;
default:
fprintf( stderr, "Error: Unsupported depth %d... exiting\n",
-@@ -225,52 +633,37 @@ void r200InitState( r200ContextPtr rmesa )
+@@ -225,52 +623,57 @@ void r200InitState( r200ContextPtr rmesa )
}
/* Only have hw stencil when depth buffer is 24 bits deep */
@@ -5578,23 +5542,34 @@ index 9e4677e..b40690e 100644
- if ( ctx->Visual.doubleBufferMode && rmesa->sarea->pfCurrentPage == 0 ) {
- drawOffset = rmesa->r200Screen->backOffset;
- drawPitch = rmesa->r200Screen->backPitch;
-- } else {
++ if ( ctx->Visual.doubleBufferMode && rmesa->radeon.sarea->pfCurrentPage == 0 ) {
++ drawOffset = rmesa->radeon.radeonScreen->backOffset;
++ drawPitch = rmesa->radeon.radeonScreen->backPitch;
+ } else {
- drawOffset = rmesa->r200Screen->frontOffset;
- drawPitch = rmesa->r200Screen->frontPitch;
-- }
--#if 000
-- if ( ctx->Visual.doubleBufferMode && rmesa->sarea->pfCurrentPage == 0 ) {
++ drawOffset = rmesa->radeon.radeonScreen->frontOffset;
++ drawPitch = rmesa->radeon.radeonScreen->frontPitch;
+ }
+ #if 000
+ if ( ctx->Visual.doubleBufferMode && rmesa->sarea->pfCurrentPage == 0 ) {
- rmesa->state.color.drawOffset = rmesa->r200Screen->backOffset;
- rmesa->state.color.drawPitch = rmesa->r200Screen->backPitch;
-- } else {
++ rmesa->radeon.state.color.drawOffset = rmesa->radeon.radeonScreen->backOffset;
++ rmesa->radeon.state.color.drawPitch = rmesa->radeon.radeonScreen->backPitch;
+ } else {
- rmesa->state.color.drawOffset = rmesa->r200Screen->frontOffset;
- rmesa->state.color.drawPitch = rmesa->r200Screen->frontPitch;
-- }
--
++ rmesa->radeon.state.color.drawOffset = rmesa->radeon.radeonScreen->frontOffset;
++ rmesa->radeon.state.color.drawPitch = rmesa->radeon.radeonScreen->frontPitch;
+ }
+
- rmesa->state.pixel.readOffset = rmesa->state.color.drawOffset;
- rmesa->state.pixel.readPitch = rmesa->state.color.drawPitch;
--#endif
--
++ rmesa->state.pixel.readOffset = rmesa->radeon.state.color.drawOffset;
++ rmesa->state.pixel.readPitch = rmesa->radeon.state.color.drawPitch;
+ #endif
+
- rmesa->hw.max_state_size = 0;
+ rmesa->radeon.hw.max_state_size = 0;
@@ -5629,7 +5604,7 @@ index 9e4677e..b40690e 100644
ALLOC_STATE( set, always, SET_STATE_SIZE, "SET/setup", 0 );
ALLOC_STATE( lin, always, LIN_STATE_SIZE, "LIN/line", 0 );
ALLOC_STATE( msk, always, MSK_STATE_SIZE, "MSK/mask", 0 );
-@@ -282,8 +675,8 @@ void r200InitState( r200ContextPtr rmesa )
+@@ -282,8 +685,8 @@ void r200InitState( r200ContextPtr rmesa )
ALLOC_STATE( cst, always, CST_STATE_SIZE, "CST/constant", 0 );
ALLOC_STATE( zbs, always, ZBS_STATE_SIZE, "ZBS/zbias", 0 );
ALLOC_STATE( tf, tf, TF_STATE_SIZE, "TF/tfactor", 0 );
@@ -5640,7 +5615,7 @@ index 9e4677e..b40690e 100644
/* make sure texture units 0/1 are emitted pair-wise for r200 t0 hang workaround */
ALLOC_STATE( tex[0], tex_pair, TEX_STATE_SIZE_NEWDRM, "TEX/tex-0", 0 );
ALLOC_STATE( tex[1], tex_pair, TEX_STATE_SIZE_NEWDRM, "TEX/tex-1", 1 );
-@@ -303,7 +696,7 @@ void r200InitState( r200ContextPtr rmesa )
+@@ -303,7 +706,7 @@ void r200InitState( r200ContextPtr rmesa )
ALLOC_STATE( afs[1], afs, AFS_STATE_SIZE, "AFS/afsinst-1", 1 );
}
else {
@@ -5649,7 +5624,7 @@ index 9e4677e..b40690e 100644
ALLOC_STATE( tex[0], tex_pair, TEX_STATE_SIZE_OLDDRM, "TEX/tex-0", 0 );
ALLOC_STATE( tex[1], tex_pair, TEX_STATE_SIZE_OLDDRM, "TEX/tex-1", 1 );
ALLOC_STATE( tam, tex_any, TAM_STATE_SIZE, "TAM/tam", 0 );
-@@ -321,13 +714,18 @@ void r200InitState( r200ContextPtr rmesa )
+@@ -321,13 +724,18 @@ void r200InitState( r200ContextPtr rmesa )
ALLOC_STATE( afs[0], never, AFS_STATE_SIZE, "AFS/afsinst-0", 0 );
ALLOC_STATE( afs[1], never, AFS_STATE_SIZE, "AFS/afsinst-1", 1 );
}
@@ -5669,7 +5644,7 @@ index 9e4677e..b40690e 100644
}
else {
ALLOC_STATE( cube[0], never, CUBE_STATE_SIZE, "CUBE/tex-0", 0 );
-@@ -337,7 +735,8 @@ void r200InitState( r200ContextPtr rmesa )
+@@ -337,7 +745,8 @@ void r200InitState( r200ContextPtr rmesa )
ALLOC_STATE( cube[4], never, CUBE_STATE_SIZE, "CUBE/tex-4", 4 );
ALLOC_STATE( cube[5], never, CUBE_STATE_SIZE, "CUBE/tex-5", 5 );
}
@@ -5679,7 +5654,7 @@ index 9e4677e..b40690e 100644
ALLOC_STATE( pvs, tcl_vp, PVS_STATE_SIZE, "PVS/pvscntl", 0 );
ALLOC_STATE( vpi[0], tcl_vp, VPI_STATE_SIZE, "VP/vertexprog-0", 0 );
ALLOC_STATE( vpi[1], tcl_vp_size, VPI_STATE_SIZE, "VP/vertexprog-1", 1 );
-@@ -390,13 +789,13 @@ void r200InitState( r200ContextPtr rmesa )
+@@ -390,13 +799,13 @@ void r200InitState( r200ContextPtr rmesa )
ALLOC_STATE( pix[3], texenv, PIX_STATE_SIZE, "PIX/pixstage-3", 3 );
ALLOC_STATE( pix[4], texenv, PIX_STATE_SIZE, "PIX/pixstage-4", 4 );
ALLOC_STATE( pix[5], texenv, PIX_STATE_SIZE, "PIX/pixstage-5", 5 );
@@ -5695,7 +5670,7 @@ index 9e4677e..b40690e 100644
ALLOC_STATE( spr, always, SPR_STATE_SIZE, "SPR/pointsprite", 0 );
ALLOC_STATE( ptp, tcl, PTP_STATE_SIZE, "PTP/pointparams", 0 );
}
-@@ -409,87 +808,115 @@ void r200InitState( r200ContextPtr rmesa )
+@@ -409,87 +818,115 @@ void r200InitState( r200ContextPtr rmesa )
/* Fill in the packet headers:
*/
@@ -5891,7 +5866,7 @@ index 9e4677e..b40690e 100644
rmesa->hw.mtl[0].cmd[MTL_CMD_0] =
cmdvec( R200_VS_MAT_0_EMISS, 1, 16 );
rmesa->hw.mtl[0].cmd[MTL_CMD_1] =
-@@ -567,7 +994,7 @@ void r200InitState( r200ContextPtr rmesa )
+@@ -567,7 +1004,7 @@ void r200InitState( r200ContextPtr rmesa )
(R200_BLEND_GL_ONE << R200_SRC_BLEND_SHIFT) |
(R200_BLEND_GL_ZERO << R200_DST_BLEND_SHIFT));
@@ -5900,7 +5875,7 @@ index 9e4677e..b40690e 100644
rmesa->hw.ctx.cmd[CTX_RB3D_BLENDCOLOR] = 0x00000000;
rmesa->hw.ctx.cmd[CTX_RB3D_ABLENDCNTL] = (R200_COMB_FCN_ADD_CLAMP |
(R200_BLEND_GL_ONE << R200_SRC_BLEND_SHIFT) |
-@@ -578,18 +1005,17 @@ void r200InitState( r200ContextPtr rmesa )
+@@ -578,10 +1015,10 @@ void r200InitState( r200ContextPtr rmesa )
}
rmesa->hw.ctx.cmd[CTX_RB3D_DEPTHOFFSET] =
@@ -5913,16 +5888,7 @@ index 9e4677e..b40690e 100644
R200_DEPTHPITCH_MASK) |
R200_DEPTH_ENDIAN_NO_SWAP);
- if (rmesa->using_hyperz)
- rmesa->hw.ctx.cmd[CTX_RB3D_DEPTHPITCH] |= R200_DEPTH_HYPERZ;
-
-- rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] = (depth_fmt |
-- R200_Z_TEST_LESS |
-+ rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] = (R200_Z_TEST_LESS |
- R200_STENCIL_TEST_ALWAYS |
- R200_STENCIL_FAIL_KEEP |
- R200_STENCIL_ZPASS_KEEP |
-@@ -599,15 +1025,14 @@ void r200InitState( r200ContextPtr rmesa )
+@@ -599,7 +1036,7 @@ void r200InitState( r200ContextPtr rmesa )
if (rmesa->using_hyperz) {
rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= R200_Z_COMPRESSION_ENABLE |
R200_Z_DECOMPRESSION_ENABLE;
@@ -5931,16 +5897,16 @@ index 9e4677e..b40690e 100644
rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_Z_HIERARCHY_ENABLE;*/
}
- rmesa->hw.ctx.cmd[CTX_PP_CNTL] = (R200_ANTI_ALIAS_NONE
+@@ -607,7 +1044,7 @@ void r200InitState( r200ContextPtr rmesa )
| R200_TEX_BLEND_0_ENABLE);
-- rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] = color_fmt;
+ rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] = color_fmt;
- switch ( driQueryOptioni( &rmesa->optionCache, "dither_mode" ) ) {
+ switch ( driQueryOptioni( &rmesa->radeon.optionCache, "dither_mode" ) ) {
case DRI_CONF_DITHER_XERRORDIFFRESET:
rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |= R200_DITHER_INIT;
break;
-@@ -615,41 +1040,19 @@ void r200InitState( r200ContextPtr rmesa )
+@@ -615,28 +1052,28 @@ void r200InitState( r200ContextPtr rmesa )
rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |= R200_SCALE_DITHER_ENABLE;
break;
}
@@ -5958,29 +5924,34 @@ index 9e4677e..b40690e 100644
rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |= R200_DITHER_ENABLE;
else
- rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |= rmesa->state.color.roundEnable;
--
--#if 000
++ rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |= rmesa->radeon.state.color.roundEnable;
+
+ #if 000
- rmesa->hw.ctx.cmd[CTX_RB3D_COLOROFFSET] = ((rmesa->state.color.drawOffset +
- rmesa->r200Screen->fbLocation)
-- & R200_COLOROFFSET_MASK);
--
++ rmesa->hw.ctx.cmd[CTX_RB3D_COLOROFFSET] = ((rmesa->radeon.state.color.drawOffset +
++ rmesa->radeon.radeonScreen->fbLocation)
+ & R200_COLOROFFSET_MASK);
+
- rmesa->hw.ctx.cmd[CTX_RB3D_COLORPITCH] = ((rmesa->state.color.drawPitch &
-- R200_COLORPITCH_MASK) |
-- R200_COLOR_ENDIAN_NO_SWAP);
--#else
-- rmesa->hw.ctx.cmd[CTX_RB3D_COLOROFFSET] = ((drawOffset +
++ rmesa->hw.ctx.cmd[CTX_RB3D_COLORPITCH] = ((rmesa->radeon.state.color.drawPitch &
+ R200_COLORPITCH_MASK) |
+ R200_COLOR_ENDIAN_NO_SWAP);
+ #else
+ rmesa->hw.ctx.cmd[CTX_RB3D_COLOROFFSET] = ((drawOffset +
- rmesa->r200Screen->fbLocation)
-- & R200_COLOROFFSET_MASK);
--
-- rmesa->hw.ctx.cmd[CTX_RB3D_COLORPITCH] = ((drawPitch &
-- R200_COLORPITCH_MASK) |
-- R200_COLOR_ENDIAN_NO_SWAP);
--#endif
-- /* (fixed size) sarea is initialized to zero afaics so can omit version check. Phew! */
++ rmesa->radeon.radeonScreen->fbLocation)
+ & R200_COLOROFFSET_MASK);
+
+ rmesa->hw.ctx.cmd[CTX_RB3D_COLORPITCH] = ((drawPitch &
+@@ -644,12 +1081,12 @@ void r200InitState( r200ContextPtr rmesa )
+ R200_COLOR_ENDIAN_NO_SWAP);
+ #endif
+ /* (fixed size) sarea is initialized to zero afaics so can omit version check. Phew! */
- if (rmesa->sarea->tiling_enabled) {
-- rmesa->hw.ctx.cmd[CTX_RB3D_COLORPITCH] |= R200_COLOR_TILE_ENABLE;
-- }
-+ rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |= rmesa->radeon.state.color.roundEnable;
++ if (rmesa->radeon.sarea->tiling_enabled) {
+ rmesa->hw.ctx.cmd[CTX_RB3D_COLORPITCH] |= R200_COLOR_TILE_ENABLE;
+ }
rmesa->hw.prf.cmd[PRF_PP_TRI_PERF] = R200_TRI_CUTOFF_MASK - R200_TRI_CUTOFF_MASK *
- driQueryOptionf (&rmesa->optionCache,"texture_blend_quality");
@@ -5988,7 +5959,7 @@ index 9e4677e..b40690e 100644
rmesa->hw.prf.cmd[PRF_PP_PERF_CNTL] = 0;
rmesa->hw.set.cmd[SET_SE_CNTL] = (R200_FFACE_CULL_CCW |
-@@ -704,7 +1107,7 @@ void r200InitState( r200ContextPtr rmesa )
+@@ -704,7 +1141,7 @@ void r200InitState( r200ContextPtr rmesa )
R200_VC_NO_SWAP;
#endif
@@ -5997,7 +5968,7 @@ index 9e4677e..b40690e 100644
/* Bypass TCL */
rmesa->hw.cst.cmd[CST_SE_VAP_CNTL_STATUS] |= (1<<8);
}
-@@ -743,28 +1146,28 @@ void r200InitState( r200ContextPtr rmesa )
+@@ -743,28 +1180,28 @@ void r200InitState( r200ContextPtr rmesa )
rmesa->hw.tex[i].cmd[TEX_PP_TXFORMAT_X] =
(/* R200_TEXCOORD_PROJ | */
0x100000); /* Small default bias */
@@ -6034,7 +6005,7 @@ index 9e4677e..b40690e 100644
rmesa->hw.pix[i].cmd[PIX_PP_TXCBLEND] =
(R200_TXC_ARG_A_ZERO |
-@@ -967,5 +1370,7 @@ void r200InitState( r200ContextPtr rmesa )
+@@ -967,5 +1404,7 @@ void r200InitState( r200ContextPtr rmesa )
r200LightingSpaceChange( ctx );
@@ -8171,7 +8142,7 @@ index 3b81ac0..0000000
- return 0;
-}
diff --git a/src/mesa/drivers/dri/r200/r200_texstate.c b/src/mesa/drivers/dri/r200/r200_texstate.c
-index 0ad5651..302ea2e 100644
+index 3f9a2f4..6432068 100644
--- a/src/mesa/drivers/dri/r200/r200_texstate.c
+++ b/src/mesa/drivers/dri/r200/r200_texstate.c
@@ -40,6 +40,8 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -8556,9 +8527,9 @@ index 0ad5651..302ea2e 100644
}
-
if (texUnit->TexGenEnabled & R_BIT) {
- if (texUnit->GenR.Mode != mode)
+ if (texUnit->GenModeR != mode)
mixed_fallback = GL_TRUE;
-@@ -1517,52 +1280,6 @@ static GLboolean r200_validate_texgen( GLcontext *ctx, GLuint unit )
+@@ -1513,52 +1276,6 @@ static GLboolean r200_validate_texgen( GLcontext *ctx, GLuint unit )
return GL_TRUE;
}
@@ -8611,7 +8582,7 @@ index 0ad5651..302ea2e 100644
void set_re_cntl_d3d( GLcontext *ctx, int unit, GLboolean use_d3d )
{
r200ContextPtr rmesa = R200_CONTEXT(ctx);
-@@ -1579,237 +1296,165 @@ void set_re_cntl_d3d( GLcontext *ctx, int unit, GLboolean use_d3d )
+@@ -1575,237 +1292,165 @@ void set_re_cntl_d3d( GLcontext *ctx, int unit, GLboolean use_d3d )
}
}
@@ -8973,7 +8944,7 @@ index 0ad5651..302ea2e 100644
}
-@@ -1850,11 +1495,11 @@ void r200UpdateTextureState( GLcontext *ctx )
+@@ -1846,11 +1491,11 @@ void r200UpdateTextureState( GLcontext *ctx )
FALLBACK( rmesa, R200_FALLBACK_TEXTURE, !ok );
@@ -8987,7 +8958,7 @@ index 0ad5651..302ea2e 100644
/*
* T0 hang workaround -------------
-@@ -1867,7 +1512,7 @@ void r200UpdateTextureState( GLcontext *ctx )
+@@ -1863,7 +1508,7 @@ void r200UpdateTextureState( GLcontext *ctx )
R200_STATECHANGE(rmesa, tex[1]);
rmesa->hw.ctx.cmd[CTX_PP_CNTL] |= R200_TEX_1_ENABLE;
if (!(rmesa->hw.cst.cmd[CST_PP_CNTL_X] & R200_PPX_TEX_1_ENABLE))
@@ -9105,10 +9076,10 @@ index 6ca9342..497b1ec 100644
##### TARGETS #####
diff --git a/src/mesa/drivers/dri/r300/r300_cmdbuf.c b/src/mesa/drivers/dri/r300/r300_cmdbuf.c
-index c9e1dfe..231576f 100644
+index c9e1dfe..ac1c128 100644
--- a/src/mesa/drivers/dri/r300/r300_cmdbuf.c
+++ b/src/mesa/drivers/dri/r300/r300_cmdbuf.c
-@@ -44,235 +44,288 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+@@ -44,235 +44,252 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#include "drm.h"
#include "radeon_drm.h"
@@ -9208,20 +9179,14 @@ index c9e1dfe..231576f 100644
+ addr = (cmd.vpu.adrhi << 8) | cmd.vpu.adrlo;
+ ndw = cmd.vpu.count * 4;
+ if (ndw) {
-+
-+ if (r300->vap_flush_needed) {
-+ BEGIN_BATCH_NO_AUTOSTATE(15 + ndw);
-+
-+ /* flush processing vertices */
-+ OUT_BATCH_REGVAL(R300_SC_SCREENDOOR, 0);
-+ OUT_BATCH_REGVAL(R300_RB3D_DSTCACHE_CTLSTAT, R300_RB3D_DSTCACHE_CTLSTAT_DC_FLUSH_FLUSH_DIRTY_3D);
-+ OUT_BATCH_REGVAL(RADEON_WAIT_UNTIL, RADEON_WAIT_3D_IDLECLEAN);
-+ OUT_BATCH_REGVAL(R300_SC_SCREENDOOR, 0xffffff);
-+ OUT_BATCH_REGVAL(R300_VAP_PVS_STATE_FLUSH_REG, 0);
-+ r300->vap_flush_needed = GL_FALSE;
-+ } else {
-+ BEGIN_BATCH_NO_AUTOSTATE(5 + ndw);
-+ }
++ BEGIN_BATCH_NO_AUTOSTATE(13 + ndw);
++
++ /* flush processing vertices */
++ OUT_BATCH_REGVAL(R300_SC_SCREENDOOR, 0);
++ OUT_BATCH_REGVAL(R300_RB3D_DSTCACHE_CTLSTAT, R300_RB3D_DSTCACHE_CTLSTAT_DC_FLUSH_FLUSH_DIRTY_3D);
++ OUT_BATCH_REGVAL(RADEON_WAIT_UNTIL, RADEON_WAIT_3D_IDLECLEAN);
++ OUT_BATCH_REGVAL(R300_SC_SCREENDOOR, 0xffffff);
++ OUT_BATCH_REGVAL(R300_VAP_PVS_STATE_FLUSH_REG, 1);
+ OUT_BATCH_REGVAL(R300_VAP_PVS_UPLOAD_ADDRESS, addr);
+ OUT_BATCH(CP_PACKET0(R300_VAP_PVS_UPLOAD_DATA, ndw-1) | RADEON_ONE_REG_WR);
+ for (i = 0; i < ndw; i++) {
@@ -9242,6 +9207,16 @@ index c9e1dfe..231576f 100644
+void emit_r500fp(GLcontext *ctx, struct radeon_state_atom * atom)
{
- int ret;
+-
+- LOCK_HARDWARE(&r300->radeon);
+-
+- ret = r300FlushCmdBufLocked(r300, caller);
+-
+- UNLOCK_HARDWARE(&r300->radeon);
+-
+- if (ret) {
+- fprintf(stderr, "drmRadeonCmdBuffer: %d\n", ret);
+- _mesa_exit(ret);
+ r300ContextPtr r300 = R300_CONTEXT(ctx);
+ BATCH_LOCALS(&r300->radeon);
+ drm_r300_cmd_header_t cmd;
@@ -9255,91 +9230,41 @@ index c9e1dfe..231576f 100644
+ OUT_BATCH_TABLE(atom->cmd, dwords);
+ END_BATCH();
+ return;
-+ }
+ }
-- LOCK_HARDWARE(&r300->radeon);
+- return ret;
+-}
+ cmd.u = atom->cmd[0];
+ sz = cmd.r500fp.count;
+ addr = ((cmd.r500fp.adrhi_flags & 1) << 8) | cmd.r500fp.adrlo;
+ type = !!(cmd.r500fp.adrhi_flags & R500FP_CONSTANT_TYPE);
+ clamp = !!(cmd.r500fp.adrhi_flags & R500FP_CONSTANT_CLAMP);
-- ret = r300FlushCmdBufLocked(r300, caller);
+-static void r300PrintStateAtom(r300ContextPtr r300, struct r300_state_atom *state)
+-{
+- int i;
+- int dwords = (*state->check) (r300, state);
+ addr |= (type << 16);
+ addr |= (clamp << 17);
-- UNLOCK_HARDWARE(&r300->radeon);
+- fprintf(stderr, " emit %s %d/%d\n", state->name, dwords,
+- state->cmd_size);
+ stride = type ? 4 : 6;
-- if (ret) {
-- fprintf(stderr, "drmRadeonCmdBuffer: %d\n", ret);
-- _mesa_exit(ret);
-- }
+- if (RADEON_DEBUG & DEBUG_VERBOSE) {
+- for (i = 0; i < dwords; i++) {
+- fprintf(stderr, " %s[%d]: %08x\n",
+- state->name, i, state->cmd[i]);
+ ndw = sz * stride;
+ if (ndw) {
-
-- return ret;
++
+ BEGIN_BATCH_NO_AUTOSTATE(3 + ndw);
+ OUT_BATCH(CP_PACKET0(R500_GA_US_VECTOR_INDEX, 0));
+ OUT_BATCH(addr);
+ OUT_BATCH(CP_PACKET0(R500_GA_US_VECTOR_DATA, ndw-1) | RADEON_ONE_REG_WR);
+ for (i = 0; i < ndw; i++) {
+ OUT_BATCH(atom->cmd[i+1]);
-+ }
-+ END_BATCH();
-+ }
- }
-
--static void r300PrintStateAtom(r300ContextPtr r300, struct r300_state_atom *state)
-+static void emit_tex_offsets(GLcontext *ctx, struct radeon_state_atom * atom)
- {
-- int i;
-- int dwords = (*state->check) (r300, state);
--
-- fprintf(stderr, " emit %s %d/%d\n", state->name, dwords,
-- state->cmd_size);
-+ r300ContextPtr r300 = R300_CONTEXT(ctx);
-+ BATCH_LOCALS(&r300->radeon);
-+ int numtmus = packet0_count(r300, r300->hw.tex.offset.cmd);
-+ int notexture = 0;
-+
-+ if (numtmus) {
-+ int i;
-+
-+ for(i = 0; i < numtmus; ++i) {
-+ radeonTexObj *t = r300->hw.textures[i];
-+
-+ if (!t)
-+ notexture = 1;
-+ }
-
-- if (RADEON_DEBUG & DEBUG_VERBOSE) {
-- for (i = 0; i < dwords; i++) {
-- fprintf(stderr, " %s[%d]: %08x\n",
-- state->name, i, state->cmd[i]);
-+ if (r300->radeon.radeonScreen->kernel_mm && notexture) {
-+ return;
}
-+ BEGIN_BATCH_NO_AUTOSTATE(4 * numtmus);
-+ for(i = 0; i < numtmus; ++i) {
-+ radeonTexObj *t = r300->hw.textures[i];
-+ OUT_BATCH_REGSEQ(R300_TX_OFFSET_0 + (i * 4), 1);
-+ if (t && !t->image_override) {
-+ OUT_BATCH_RELOC(t->tile_bits, t->mt->bo, 0,
-+ RADEON_GEM_DOMAIN_VRAM, 0, 0);
-+ } else if (!t) {
-+ OUT_BATCH(r300->radeon.radeonScreen->texOffset[0]);
-+ } else { /* override cases */
-+ if (t->bo) {
-+ OUT_BATCH_RELOC(t->tile_bits, t->bo, 0,
-+ RADEON_GEM_DOMAIN_VRAM, 0, 0);
-+ } else if (!r300->radeon.radeonScreen->kernel_mm) {
-+ OUT_BATCH(t->override_offset);
-+ }
-+ else
-+ OUT_BATCH(r300->radeon.radeonScreen->texOffset[0]);
-+ }
-+ }
+ END_BATCH();
}
}
@@ -9351,7 +9276,7 @@ index c9e1dfe..231576f 100644
- * buffer.
- */
-static INLINE void r300EmitAtoms(r300ContextPtr r300, GLboolean dirty)
-+static void emit_cb_offset(GLcontext *ctx, struct radeon_state_atom * atom)
++static void emit_tex_offsets(GLcontext *ctx, struct radeon_state_atom * atom)
{
- struct r300_state_atom *atom;
- uint32_t *dest;
@@ -9397,33 +9322,43 @@ index c9e1dfe..231576f 100644
- atom->name);
- }
- }
-- }
+ r300ContextPtr r300 = R300_CONTEXT(ctx);
+ BATCH_LOCALS(&r300->radeon);
-+ struct radeon_renderbuffer *rrb;
-+ uint32_t cbpitch;
-+
-+ rrb = radeon_get_colorbuffer(&r300->radeon);
-+ if (!rrb || !rrb->bo) {
-+ fprintf(stderr, "no rrb\n");
-+ return;
- }
-+
-+ cbpitch = (rrb->pitch / rrb->cpp);
-+ if (rrb->cpp == 4)
-+ cbpitch |= R300_COLOR_FORMAT_ARGB8888;
-+ else
-+ cbpitch |= R300_COLOR_FORMAT_RGB565;
++ int numtmus = packet0_count(r300, r300->hw.tex.offset.cmd);
+
-+ if (rrb->bo->flags & RADEON_BO_FLAGS_MACRO_TILE)
-+ cbpitch |= R300_COLOR_TILE_ENABLE;
++ if (numtmus) {
++ int i;
+
-+ BEGIN_BATCH_NO_AUTOSTATE(6);
-+ OUT_BATCH_REGSEQ(R300_RB3D_COLOROFFSET0, 1);
-+ OUT_BATCH_RELOC(0, rrb->bo, 0, 0, RADEON_GEM_DOMAIN_VRAM, 0);
-+ OUT_BATCH_REGSEQ(R300_RB3D_COLORPITCH0, 1);
-+ OUT_BATCH(cbpitch);
-+ END_BATCH();
++ for(i = 0; i < numtmus; ++i) {
++ radeonTexObj *t = r300->hw.textures[i];
++ if (t && !t->image_override) {
++ BEGIN_BATCH_NO_AUTOSTATE(4);
++ OUT_BATCH_REGSEQ(R300_TX_OFFSET_0 + (i * 4), 1);
++ OUT_BATCH_RELOC(t->tile_bits, t->mt->bo, 0,
++ RADEON_GEM_DOMAIN_VRAM, 0, 0);
++ END_BATCH();
++ } else if (!t) {
++ //assert(0);
++ BEGIN_BATCH_NO_AUTOSTATE(4);
++ OUT_BATCH_REGSEQ(R300_TX_OFFSET_0 + (i * 4), 1);
++ OUT_BATCH(r300->radeon.radeonScreen->texOffset[0]);
++ END_BATCH();
++ } else {
++ if (t->bo) {
++ BEGIN_BATCH_NO_AUTOSTATE(4);
++ OUT_BATCH_REGSEQ(R300_TX_OFFSET_0 + (i * 4), 1);
++ OUT_BATCH_RELOC(t->tile_bits, t->bo, 0,
++ RADEON_GEM_DOMAIN_VRAM, 0, 0);
++ END_BATCH();
++ } else if (!r300->radeon.radeonScreen->kernel_mm) {
++ BEGIN_BATCH_NO_AUTOSTATE(2);
++ OUT_BATCH_REGSEQ(R300_TX_OFFSET_0 + (i * 4), 1);
++ OUT_BATCH(t->override_offset);
++ END_BATCH();
++ }
++ }
+ }
+ }
}
-/**
@@ -9433,21 +9368,23 @@ index c9e1dfe..231576f 100644
- * it easy to recover from lost contexts.
- */
-void r300EmitState(r300ContextPtr r300)
-+static void emit_zb_offset(GLcontext *ctx, struct radeon_state_atom * atom)
++static void emit_cb_offset(GLcontext *ctx, struct radeon_state_atom * atom)
{
- if (RADEON_DEBUG & (DEBUG_STATE | DEBUG_PRIMS))
- fprintf(stderr, "%s\n", __FUNCTION__);
+-
+- if (r300->cmdbuf.count_used && !r300->hw.is_dirty
+- && !r300->hw.all_dirty)
+ r300ContextPtr r300 = R300_CONTEXT(ctx);
+ BATCH_LOCALS(&r300->radeon);
+ struct radeon_renderbuffer *rrb;
-+ uint32_t zbpitch;
-
-- if (r300->cmdbuf.count_used && !r300->hw.is_dirty
-- && !r300->hw.all_dirty)
-+ rrb = radeon_get_depthbuffer(&r300->radeon);
-+ if (!rrb)
++ uint32_t cbpitch;
++
++ rrb = radeon_get_colorbuffer(&r300->radeon);
++ if (!rrb || !rrb->bo) {
++ fprintf(stderr, "no rrb\n");
return;
-
+-
- /* To avoid going across the entire set of states multiple times, just check
- * for enough space for the case of emitting all state, and inline the
- * r300AllocCmdBuf code here without all the checks.
@@ -9460,54 +9397,55 @@ index c9e1dfe..231576f 100644
-
- r300EmitAtoms(r300, GL_FALSE);
- r300->cmdbuf.count_reemit = r300->cmdbuf.count_used;
-+ zbpitch = (rrb->pitch / rrb->cpp);
-+ if (rrb->bo->flags & RADEON_BO_FLAGS_MACRO_TILE) {
-+ zbpitch |= R300_DEPTHMACROTILE_ENABLE;
}
-+ if (rrb->bo->flags & RADEON_BO_FLAGS_MICRO_TILE){
-+ zbpitch |= R300_DEPTHMICROTILE_TILED;
-+ }
-+
+
+- if (RADEON_DEBUG & DEBUG_STATE)
+- fprintf(stderr, "Begin dirty state\n");
++ cbpitch = (rrb->pitch / rrb->cpp);
++ if (rrb->cpp == 4)
++ cbpitch |= R300_COLOR_FORMAT_ARGB8888;
++ else
++ cbpitch |= R300_COLOR_FORMAT_RGB565;
++
++ if (rrb->bo->flags & RADEON_BO_FLAGS_MACRO_TILE)
++ cbpitch |= R300_COLOR_TILE_ENABLE;
++
+ BEGIN_BATCH_NO_AUTOSTATE(6);
-+ OUT_BATCH_REGSEQ(R300_ZB_DEPTHOFFSET, 1);
++ OUT_BATCH_REGSEQ(R300_RB3D_COLOROFFSET0, 1);
+ OUT_BATCH_RELOC(0, rrb->bo, 0, 0, RADEON_GEM_DOMAIN_VRAM, 0);
-+ OUT_BATCH_REGVAL(R300_ZB_DEPTHPITCH, zbpitch);
++ OUT_BATCH_REGSEQ(R300_RB3D_COLORPITCH0, 1);
++ OUT_BATCH(cbpitch);
+ END_BATCH();
+}
-- if (RADEON_DEBUG & DEBUG_STATE)
-- fprintf(stderr, "Begin dirty state\n");
--
- r300EmitAtoms(r300, GL_TRUE);
--
-- assert(r300->cmdbuf.count_used < r300->cmdbuf.size);
-+static void emit_zstencil_format(GLcontext *ctx, struct radeon_state_atom * atom)
++static void emit_zb_offset(GLcontext *ctx, struct radeon_state_atom * atom)
+{
+ r300ContextPtr r300 = R300_CONTEXT(ctx);
+ BATCH_LOCALS(&r300->radeon);
+ struct radeon_renderbuffer *rrb;
+ uint32_t zbpitch;
-+ uint32_t format;
-+
+
+- assert(r300->cmdbuf.count_used < r300->cmdbuf.size);
+ rrb = radeon_get_depthbuffer(&r300->radeon);
+ if (!rrb)
-+ format = 0;
-+ else {
-+ if (rrb->cpp == 2)
-+ format = R300_DEPTHFORMAT_16BIT_INT_Z;
-+ else if (rrb->cpp == 4)
-+ format = R300_DEPTHFORMAT_24BIT_INT_Z_8BIT_STENCIL;
-+ }
++ return;
- r300->hw.is_dirty = GL_FALSE;
- r300->hw.all_dirty = GL_FALSE;
-+ OUT_BATCH(atom->cmd[0]);
-+ atom->cmd[1] &= ~(3 << 0);
-+ atom->cmd[1] |= format;
-+ OUT_BATCH(atom->cmd[1]);
-+ OUT_BATCH(atom->cmd[2]);
-+ OUT_BATCH(atom->cmd[3]);
-+ OUT_BATCH(atom->cmd[4]);
++ zbpitch = (rrb->pitch / rrb->cpp);
++ if (rrb->bo->flags & RADEON_BO_FLAGS_MACRO_TILE) {
++ zbpitch |= R300_DEPTHMACROTILE_ENABLE;
++ }
++ if (rrb->bo->flags & RADEON_BO_FLAGS_MICRO_TILE){
++ zbpitch |= R300_DEPTHMICROTILE_TILED;
++ }
++
++ BEGIN_BATCH_NO_AUTOSTATE(6);
++ OUT_BATCH_REGSEQ(R300_ZB_DEPTHOFFSET, 1);
++ OUT_BATCH_RELOC(0, rrb->bo, 0, 0, RADEON_GEM_DOMAIN_VRAM, 0);
++ OUT_BATCH_REGVAL(R300_ZB_DEPTHPITCH, zbpitch);
++ END_BATCH();
}
-#define packet0_count(ptr) (((drm_r300_cmd_header_t*)(ptr))->packet0.count)
@@ -9559,7 +9497,7 @@ index c9e1dfe..231576f 100644
cnt = r500fp_count(atom->cmd);
return cnt ? (cnt * 4) + 1 : 0;
}
-@@ -285,8 +338,8 @@ static int check_r500fp_const(r300ContextPtr r300, struct r300_state_atom *atom)
+@@ -285,8 +302,8 @@ static int check_r500fp_const(r300ContextPtr r300, struct r300_state_atom *atom)
r300->hw.ATOM.idx = (IDX); \
r300->hw.ATOM.check = check_##CHK; \
r300->hw.ATOM.dirty = GL_FALSE; \
@@ -9570,7 +9508,7 @@ index c9e1dfe..231576f 100644
} while (0)
/**
* Allocate memory for the command buffer and initialize the state atom
-@@ -294,7 +347,7 @@ static int check_r500fp_const(r300ContextPtr r300, struct r300_state_atom *atom)
+@@ -294,7 +311,7 @@ static int check_r500fp_const(r300ContextPtr r300, struct r300_state_atom *atom)
*/
void r300InitCmdBuf(r300ContextPtr r300)
{
@@ -9579,7 +9517,7 @@ index c9e1dfe..231576f 100644
int has_tcl = 1;
int is_r500 = 0;
int i;
-@@ -305,7 +358,7 @@ void r300InitCmdBuf(r300ContextPtr r300)
+@@ -305,7 +322,7 @@ void r300InitCmdBuf(r300ContextPtr r300)
if (r300->radeon.radeonScreen->chip_family >= CHIP_FAMILY_RV515)
is_r500 = 1;
@@ -9588,7 +9526,7 @@ index c9e1dfe..231576f 100644
mtu = r300->radeon.glCtx->Const.MaxTextureUnits;
if (RADEON_DEBUG & DEBUG_TEXTURE) {
-@@ -313,97 +366,97 @@ void r300InitCmdBuf(r300ContextPtr r300)
+@@ -313,97 +330,97 @@ void r300InitCmdBuf(r300ContextPtr r300)
}
/* Setup the atom linked list */
@@ -9723,7 +9661,7 @@ index c9e1dfe..231576f 100644
for (i = 0; i < 8; i++) {
r300->hw.ri.cmd[R300_RI_CMD_0 + i +1] =
(R500_RS_IP_PTR_K0 << R500_RS_IP_TEX_PTR_S_SHIFT) |
-@@ -412,133 +465,149 @@ void r300InitCmdBuf(r300ContextPtr r300)
+@@ -412,133 +429,146 @@ void r300InitCmdBuf(r300ContextPtr r300)
(R500_RS_IP_PTR_K1 << R500_RS_IP_TEX_PTR_Q_SHIFT);
}
ALLOC_STATE(rr, variable, R300_RR_CMDSIZE, 0);
@@ -9845,13 +9783,10 @@ index c9e1dfe..231576f 100644
r300->hw.zs.cmd[R300_ZS_CMD_0] =
- cmdpacket0(R300_ZB_CNTL, 3);
+ cmdpacket0(r300->radeon.radeonScreen, R300_ZB_CNTL, 3);
-+
ALLOC_STATE(zstencil_format, always, 5, 0);
r300->hw.zstencil_format.cmd[0] =
- cmdpacket0(R300_ZB_FORMAT, 4);
+ cmdpacket0(r300->radeon.radeonScreen, R300_ZB_FORMAT, 4);
-+ r300->hw.zstencil_format.emit = emit_zstencil_format;
-+
ALLOC_STATE(zb, always, R300_ZB_CMDSIZE, 0);
- r300->hw.zb.cmd[R300_ZB_CMD_0] = cmdpacket0(R300_ZB_DEPTHOFFSET, 2);
+ r300->hw.zb.emit = emit_zb_offset;
@@ -9929,7 +9864,7 @@ index c9e1dfe..231576f 100644
}
}
}
-@@ -546,61 +615,39 @@ void r300InitCmdBuf(r300ContextPtr r300)
+@@ -546,61 +576,39 @@ void r300InitCmdBuf(r300ContextPtr r300)
/* Textures */
ALLOC_STATE(tex.filter, variable, mtu + 1, 0);
r300->hw.tex.filter.cmd[R300_TEX_CMD_0] =
@@ -9969,10 +9904,12 @@ index c9e1dfe..231576f 100644
ALLOC_STATE(tex.border_color, variable, mtu + 1, 0);
r300->hw.tex.border_color.cmd[R300_TEX_CMD_0] =
- cmdpacket0(R300_TX_BORDER_COLOR_0, 0);
--
++ cmdpacket0(r300->radeon.radeonScreen, R300_TX_BORDER_COLOR_0, 0);
+
- r300->hw.is_dirty = GL_TRUE;
- r300->hw.all_dirty = GL_TRUE;
-+ cmdpacket0(r300->radeon.radeonScreen, R300_TX_BORDER_COLOR_0, 0);
++ r300->radeon.hw.is_dirty = GL_TRUE;
++ r300->radeon.hw.all_dirty = GL_TRUE;
- /* Initialize command buffer */
- size =
@@ -9993,9 +9930,7 @@ index c9e1dfe..231576f 100644
- "Allocating %d bytes command buffer (max state is %d bytes)\n",
- size * 4, r300->hw.max_state_size * 4);
- }
-+ r300->radeon.hw.is_dirty = GL_TRUE;
-+ r300->radeon.hw.all_dirty = GL_TRUE;
-
+-
- r300->cmdbuf.size = size;
- r300->cmdbuf.cmd_buf = (uint32_t *) CALLOC(size * 4);
- r300->cmdbuf.count_used = 0;
@@ -10004,15 +9939,15 @@ index c9e1dfe..231576f 100644
}
/**
-@@ -608,68 +655,10 @@ void r300InitCmdBuf(r300ContextPtr r300)
+@@ -608,68 +616,10 @@ void r300InitCmdBuf(r300ContextPtr r300)
*/
void r300DestroyCmdBuf(r300ContextPtr r300)
{
- struct r300_state_atom *atom;
+-
+- FREE(r300->cmdbuf.cmd_buf);
+ struct radeon_state_atom *atom;
-- FREE(r300->cmdbuf.cmd_buf);
--
- foreach(atom, &r300->hw.atomlist) {
+ foreach(atom, &r300->radeon.hw.atomlist) {
FREE(atom->cmd);
@@ -10165,7 +10100,7 @@ index a8eaa58..b7798eb 100644
#endif /* __R300_CMDBUF_H__ */
diff --git a/src/mesa/drivers/dri/r300/r300_context.c b/src/mesa/drivers/dri/r300/r300_context.c
-index 4c14c7e..5d497ef 100644
+index 4c14c7e..dd63add 100644
--- a/src/mesa/drivers/dri/r300/r300_context.c
+++ b/src/mesa/drivers/dri/r300/r300_context.c
@@ -44,6 +44,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -10199,7 +10134,7 @@ index 4c14c7e..5d497ef 100644
#include "vblank.h"
#include "utils.h"
-@@ -183,6 +182,82 @@ static const struct tnl_pipeline_stage *r300_pipeline[] = {
+@@ -183,6 +182,78 @@ static const struct tnl_pipeline_stage *r300_pipeline[] = {
0,
};
@@ -10256,11 +10191,7 @@ index 4c14c7e..5d497ef 100644
+
+static void r300_vtbl_pre_emit_atoms(radeonContextPtr radeon)
+{
-+ r300ContextPtr r300 = (r300ContextPtr)radeon;
+ BATCH_LOCALS(radeon);
-+
-+ r300->vap_flush_needed = GL_TRUE;
-+
+ cp_wait(radeon, R300_WAIT_3D | R300_WAIT_3D_CLEAN);
+ BEGIN_BATCH_NO_AUTOSTATE(2);
+ OUT_BATCH_REGVAL(R300_TX_INVALTAGS, R300_TX_FLUSH);
@@ -10282,7 +10213,7 @@ index 4c14c7e..5d497ef 100644
/* Create the device specific rendering context.
*/
GLboolean r300CreateContext(const __GLcontextModes * glVisual,
-@@ -194,7 +269,7 @@ GLboolean r300CreateContext(const __GLcontextModes * glVisual,
+@@ -194,7 +265,7 @@ GLboolean r300CreateContext(const __GLcontextModes * glVisual,
struct dd_function_table functions;
r300ContextPtr r300;
GLcontext *ctx;
@@ -10291,7 +10222,7 @@ index 4c14c7e..5d497ef 100644
assert(glVisual);
assert(driContextPriv);
-@@ -208,13 +283,14 @@ GLboolean r300CreateContext(const __GLcontextModes * glVisual,
+@@ -208,13 +279,14 @@ GLboolean r300CreateContext(const __GLcontextModes * glVisual,
if (!(screen->chip_flags & RADEON_CHIPSET_TCL))
hw_tcl_on = future_hw_tcl_on = 0;
@@ -10307,7 +10238,7 @@ index 4c14c7e..5d497ef 100644
"def_max_anisotropy");
/* Init default driver functions then plug in our R300-specific functions
-@@ -226,10 +302,6 @@ GLboolean r300CreateContext(const __GLcontextModes * glVisual,
+@@ -226,10 +298,6 @@ GLboolean r300CreateContext(const __GLcontextModes * glVisual,
r300InitTextureFuncs(&functions);
r300InitShaderFuncs(&functions);
@@ -10318,7 +10249,7 @@ index 4c14c7e..5d497ef 100644
if (!radeonInitContext(&r300->radeon, &functions,
glVisual, driContextPriv,
sharedContextPrivate)) {
-@@ -238,37 +310,10 @@ GLboolean r300CreateContext(const __GLcontextModes * glVisual,
+@@ -238,37 +306,10 @@ GLboolean r300CreateContext(const __GLcontextModes * glVisual,
}
/* Init r300 context data */
@@ -10359,7 +10290,7 @@ index 4c14c7e..5d497ef 100644
DRI_CONF_TEXTURE_DEPTH_32 : DRI_CONF_TEXTURE_DEPTH_16;
/* Set the maximum texture size small enough that we can guarentee that
-@@ -303,13 +348,11 @@ GLboolean r300CreateContext(const __GLcontextModes * glVisual,
+@@ -303,13 +344,11 @@ GLboolean r300CreateContext(const __GLcontextModes * glVisual,
ctx->Const.MaxLineWidth = R300_LINESIZE_MAX;
ctx->Const.MaxLineWidthAA = R300_LINESIZE_MAX;
@@ -10373,7 +10304,7 @@ index 4c14c7e..5d497ef 100644
ctx->Const.MaxDrawBuffers = 1;
-@@ -384,13 +427,13 @@ GLboolean r300CreateContext(const __GLcontextModes * glVisual,
+@@ -384,13 +423,13 @@ GLboolean r300CreateContext(const __GLcontextModes * glVisual,
driQueryOptionb(&r300->radeon.optionCache,
"disable_lowimpact_fallback");
@@ -10389,7 +10320,7 @@ index 4c14c7e..5d497ef 100644
tcl_mode = driQueryOptioni(&r300->radeon.optionCache, "tcl_mode");
if (driQueryOptionb(&r300->radeon.optionCache, "no_rast")) {
-@@ -413,72 +456,6 @@ GLboolean r300CreateContext(const __GLcontextModes * glVisual,
+@@ -413,72 +452,6 @@ GLboolean r300CreateContext(const __GLcontextModes * glVisual,
return GL_TRUE;
}
@@ -10462,7 +10393,7 @@ index 4c14c7e..5d497ef 100644
/* Destroy the device specific context.
*/
void r300DestroyContext(__DRIcontextPrivate * driContextPriv)
-@@ -502,55 +479,27 @@ void r300DestroyContext(__DRIcontextPrivate * driContextPriv)
+@@ -502,55 +475,27 @@ void r300DestroyContext(__DRIcontextPrivate * driContextPriv)
assert(r300); /* should never be null */
if (r300) {
@@ -10522,7 +10453,7 @@ index 4c14c7e..5d497ef 100644
FREE(r300);
}
diff --git a/src/mesa/drivers/dri/r300/r300_context.h b/src/mesa/drivers/dri/r300/r300_context.h
-index c15e9fa..37718f5 100644
+index c15e9fa..6d34727 100644
--- a/src/mesa/drivers/dri/r300/r300_context.h
+++ b/src/mesa/drivers/dri/r300/r300_context.h
@@ -42,21 +42,20 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -11011,7 +10942,7 @@ index c15e9fa..37718f5 100644
};
-@@ -897,40 +670,22 @@ struct r300_context {
+@@ -897,33 +670,13 @@ struct r300_context {
struct radeon_context radeon; /* parent class, must be first */
struct r300_hw_state hw;
@@ -11046,16 +10977,7 @@ index c15e9fa..37718f5 100644
GLvector4f dummy_attrib[_TNL_ATTRIB_MAX];
GLvector4f *temp_attrib[_TNL_ATTRIB_MAX];
- GLboolean disable_lowimpact_fallback;
-
- DECLARE_RENDERINPUTS(tnl_index_bitset); /* index of bits for last tnl_install_attrs */
-+
- struct r300_swtcl_info swtcl;
-+ GLboolean vap_flush_needed;
- };
-
- struct r300_buffer_object {
-@@ -956,4 +711,7 @@ extern int r300VertexProgUpdateParams(GLcontext * ctx,
+@@ -956,4 +709,7 @@ extern int r300VertexProgUpdateParams(GLcontext * ctx,
#define RADEON_D_PLAYBACK_RAW 2
#define RADEON_D_T 3
@@ -11713,8 +11635,32 @@ index 89d7383..6bc8f8e 100644
extern void r300ReleaseArrays(GLcontext * ctx);
extern int r300PrimitiveType(r300ContextPtr rmesa, int prim);
extern int r300NumVerts(r300ContextPtr rmesa, int num_verts, int prim);
+diff --git a/src/mesa/drivers/dri/r300/r300_fragprog.c b/src/mesa/drivers/dri/r300/r300_fragprog.c
+index 4ef7f2b..8d030c6 100644
+--- a/src/mesa/drivers/dri/r300/r300_fragprog.c
++++ b/src/mesa/drivers/dri/r300/r300_fragprog.c
+@@ -163,6 +163,19 @@ static GLboolean transform_TEX(
+ }
+ }
+
++ if (inst.SrcReg[0].File != PROGRAM_TEMPORARY && inst.SrcReg[0].File != PROGRAM_INPUT) {
++ int tmpreg = radeonFindFreeTemporary(t);
++ tgt = radeonAppendInstructions(t->Program, 1);
++ tgt->Opcode = OPCODE_MOV;
++ tgt->DstReg.File = PROGRAM_TEMPORARY;
++ tgt->DstReg.Index = tmpreg;
++ tgt->SrcReg[0] = inst.SrcReg[0];
++
++ reset_srcreg(&inst.SrcReg[0]);
++ inst.SrcReg[0].File = PROGRAM_TEMPORARY;
++ inst.SrcReg[0].Index = tmpreg;
++ }
++
+ tgt = radeonAppendInstructions(t->Program, 1);
+ _mesa_copy_instructions(tgt, &inst, 1);
+
diff --git a/src/mesa/drivers/dri/r300/r300_ioctl.c b/src/mesa/drivers/dri/r300/r300_ioctl.c
-index ee85e22..619d268 100644
+index ee85e22..90b85f0 100644
--- a/src/mesa/drivers/dri/r300/r300_ioctl.c
+++ b/src/mesa/drivers/dri/r300/r300_ioctl.c
@@ -46,8 +46,9 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -11993,7 +11939,7 @@ index ee85e22..619d268 100644
(R300_SWIZZLE_SELECT_Y << R300_SWIZZLE_SELECT_Y_SHIFT) |
(R300_SWIZZLE_SELECT_Z << R300_SWIZZLE_SELECT_Z_SHIFT) |
(R300_SWIZZLE_SELECT_W << R300_SWIZZLE_SELECT_W_SHIFT) |
-@@ -226,238 +259,278 @@ static void r300EmitClearState(GLcontext * ctx)
+@@ -226,238 +259,276 @@ static void r300EmitClearState(GLcontext * ctx)
<< R300_SWIZZLE1_SHIFT)));
/* R300_VAP_INPUT_CNTL_0, R300_VAP_INPUT_CNTL_1 */
@@ -12439,13 +12385,11 @@ index ee85e22..619d268 100644
+ PVS_SRC_SELECT_FORCE_0,
+ PVS_SRC_REG_INPUT, VSF_FLAG_NONE);
+ vpu.cmd[8] = 0x0;
-+
-+ r300->vap_flush_needed = GL_TRUE;
+ emit_vpu(ctx, &vpu);
}
}
-@@ -468,9 +541,11 @@ static void r300Clear(GLcontext * ctx, GLbitfield mask)
+@@ -468,9 +539,11 @@ static void r300Clear(GLcontext * ctx, GLbitfield mask)
{
r300ContextPtr r300 = R300_CONTEXT(ctx);
__DRIdrawablePrivate *dPriv = r300->radeon.dri.drawable;
@@ -12458,7 +12402,7 @@ index ee85e22..619d268 100644
if (RADEON_DEBUG & DEBUG_IOCTL)
fprintf(stderr, "r300Clear\n");
-@@ -482,6 +557,12 @@ static void r300Clear(GLcontext * ctx, GLbitfield mask)
+@@ -482,6 +555,12 @@ static void r300Clear(GLcontext * ctx, GLbitfield mask)
return;
}
@@ -12471,7 +12415,7 @@ index ee85e22..619d268 100644
if (mask & BUFFER_BIT_FRONT_LEFT) {
flags |= BUFFER_BIT_FRONT_LEFT;
mask &= ~BUFFER_BIT_FRONT_LEFT;
-@@ -497,7 +578,7 @@ static void r300Clear(GLcontext * ctx, GLbitfield mask)
+@@ -497,7 +576,7 @@ static void r300Clear(GLcontext * ctx, GLbitfield mask)
mask &= ~BUFFER_BIT_DEPTH;
}
@@ -12480,7 +12424,7 @@ index ee85e22..619d268 100644
bits |= CLEARBUFFER_STENCIL;
mask &= ~BUFFER_BIT_STENCIL;
}
-@@ -509,336 +590,33 @@ static void r300Clear(GLcontext * ctx, GLbitfield mask)
+@@ -509,26 +588,28 @@ static void r300Clear(GLcontext * ctx, GLbitfield mask)
_swrast_Clear(ctx, mask);
}
@@ -12511,15 +12455,14 @@ index ee85e22..619d268 100644
- r300ClearBuffer(r300, bits, 0);
+ r300ClearBuffer(r300, bits, NULL, rrbd);
--}
--
--void r300Flush(GLcontext * ctx)
--{
-- r300ContextPtr rmesa = R300_CONTEXT(ctx);
--
-- if (RADEON_DEBUG & DEBUG_IOCTL)
-- fprintf(stderr, "%s\n", __FUNCTION__);
--
++ COMMIT_BATCH();
+ }
+
+ void r300Flush(GLcontext * ctx)
+@@ -538,302 +619,13 @@ void r300Flush(GLcontext * ctx)
+ if (RADEON_DEBUG & DEBUG_IOCTL)
+ fprintf(stderr, "%s\n", __FUNCTION__);
+
- if (rmesa->dma.flush)
- rmesa->dma.flush( rmesa );
-
@@ -12654,7 +12597,9 @@ index ee85e22..619d268 100644
-
- if (rmesa->dma.flush) {
- rmesa->dma.flush(rmesa);
-- }
++ if (rmesa->radeon.dma.flush) {
++ rmesa->radeon.dma.flush(ctx);
+ }
-
- if (rmesa->dma.current.buf)
- r300ReleaseDmaRegion(rmesa, &rmesa->dma.current, __FUNCTION__);
@@ -12741,7 +12686,10 @@ index ee85e22..619d268 100644
-
- FREE(region->buf);
- rmesa->dma.nr_released_bufs++;
-- }
++
++ if (rmesa->radeon.cmdbuf.cs->cdw) {
++ rcommonFlushCmdBuf(&rmesa->radeon, __FUNCTION__);
+ }
-
- region->buf = 0;
- region->start = 0;
@@ -12816,21 +12764,14 @@ index ee85e22..619d268 100644
- return ~0;
- else
- return rmesa->radeon.radeonScreen->gart_texture_offset + offset;
-+ COMMIT_BATCH();
}
void r300InitIoctlFuncs(struct dd_function_table *functions)
- {
- functions->Clear = r300Clear;
- functions->Finish = radeonFinish;
-- functions->Flush = r300Flush;
-+ functions->Flush = radeonFlush;
- }
diff --git a/src/mesa/drivers/dri/r300/r300_ioctl.h b/src/mesa/drivers/dri/r300/r300_ioctl.h
-index e1143fb..3abfa71 100644
+index e1143fb..5f00264 100644
--- a/src/mesa/drivers/dri/r300/r300_ioctl.h
+++ b/src/mesa/drivers/dri/r300/r300_ioctl.h
-@@ -39,22 +39,6 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+@@ -39,20 +39,11 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#include "r300_context.h"
#include "radeon_drm.h"
@@ -12840,19 +12781,19 @@ index e1143fb..3abfa71 100644
-extern GLuint r300GartOffsetFromVirtual(r300ContextPtr rmesa,
- const GLvoid * pointer);
-
--extern void r300Flush(GLcontext * ctx);
--
+ extern void r300Flush(GLcontext * ctx);
+
-extern void r300ReleaseDmaRegion(r300ContextPtr rmesa,
- struct r300_dma_region *region,
- const char *caller);
--extern void r300AllocDmaRegion(r300ContextPtr rmesa,
+ extern void r300AllocDmaRegion(r300ContextPtr rmesa,
- struct r300_dma_region *region, int bytes,
- int alignment);
--
++ struct radeon_bo **pbo, int *poffset,
++ int bytes, int alignment);
+
extern void r300InitIoctlFuncs(struct dd_function_table *functions);
--extern void r300RefillCurrentDmaRegion(r300ContextPtr rmesa, int size);
- #endif /* __R300_IOCTL_H__ */
diff --git a/src/mesa/drivers/dri/r300/r300_mem.c b/src/mesa/drivers/dri/r300/r300_mem.c
deleted file mode 100644
index f8f9d4f..0000000
@@ -13604,7 +13545,7 @@ index 16ce4a1..f46477f 100644
vp = (struct r300_vertex_program *)CURRENT_VERTEX_SHADER(ctx);
diff --git a/src/mesa/drivers/dri/r300/r300_state.c b/src/mesa/drivers/dri/r300/r300_state.c
-index ade45f5..03c0a14 100644
+index c192fec..93ef06f 100644
--- a/src/mesa/drivers/dri/r300/r300_state.c
+++ b/src/mesa/drivers/dri/r300/r300_state.c
@@ -53,8 +53,6 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -13944,26 +13885,7 @@ index ade45f5..03c0a14 100644
/* XXX: Turn off when clearing buffers ? */
r300->hw.zb.cmd[R300_ZB_PITCH] |= R300_DEPTHMACROTILE_ENABLE;
-@@ -2408,18 +2367,6 @@ static void r300ResetHwState(r300ContextPtr r300)
-
- r300->hw.zb_depthclearvalue.cmd[1] = 0;
-
-- switch (ctx->Visual.depthBits) {
-- case 16:
-- r300->hw.zstencil_format.cmd[1] = R300_DEPTHFORMAT_16BIT_INT_Z;
-- break;
-- case 24:
-- r300->hw.zstencil_format.cmd[1] = R300_DEPTHFORMAT_24BIT_INT_Z_8BIT_STENCIL;
-- break;
-- default:
-- fprintf(stderr, "Error: Unsupported depth %d... exiting\n", ctx->Visual.depthBits);
-- _mesa_exit(-1);
-- }
--
- r300->hw.zstencil_format.cmd[2] = R300_ZTOP_DISABLE;
- r300->hw.zstencil_format.cmd[3] = 0x00000003;
- r300->hw.zstencil_format.cmd[4] = 0x00000000;
-@@ -2440,7 +2387,7 @@ static void r300ResetHwState(r300ContextPtr r300)
+@@ -2440,7 +2399,7 @@ static void r300ResetHwState(r300ContextPtr r300)
r300->hw.vps.cmd[R300_VPS_ZERO_3] = 0;
}
@@ -13972,7 +13894,7 @@ index ade45f5..03c0a14 100644
}
void r300UpdateShaders(r300ContextPtr rmesa)
-@@ -2451,8 +2398,8 @@ void r300UpdateShaders(r300ContextPtr rmesa)
+@@ -2451,8 +2410,8 @@ void r300UpdateShaders(r300ContextPtr rmesa)
ctx = rmesa->radeon.glCtx;
@@ -13983,7 +13905,7 @@ index ade45f5..03c0a14 100644
for (i = _TNL_FIRST_MAT; i <= _TNL_LAST_MAT; i++) {
rmesa->temp_attrib[i] =
-@@ -2531,10 +2478,10 @@ static void r300SetupPixelShader(r300ContextPtr rmesa)
+@@ -2531,10 +2490,10 @@ static void r300SetupPixelShader(r300ContextPtr rmesa)
R300_STATECHANGE(rmesa, fpi[1]);
R300_STATECHANGE(rmesa, fpi[2]);
R300_STATECHANGE(rmesa, fpi[3]);
@@ -13998,7 +13920,7 @@ index ade45f5..03c0a14 100644
for (i = 0; i < code->alu.length; i++) {
rmesa->hw.fpi[0].cmd[R300_FPI_INSTR_0 + i] = code->alu.inst[i].inst0;
rmesa->hw.fpi[1].cmd[R300_FPI_INSTR_0 + i] = code->alu.inst[i].inst1;
-@@ -2565,7 +2512,7 @@ static void r300SetupPixelShader(r300ContextPtr rmesa)
+@@ -2565,7 +2524,7 @@ static void r300SetupPixelShader(r300ContextPtr rmesa)
}
R300_STATECHANGE(rmesa, fpp);
@@ -14007,7 +13929,7 @@ index ade45f5..03c0a14 100644
for (i = 0; i < code->const_nr; i++) {
const GLfloat *constant = get_fragmentprogram_constant(ctx,
&fp->mesa_program.Base, code->constant[i]);
-@@ -2667,7 +2614,6 @@ void r300UpdateShaderStates(r300ContextPtr rmesa)
+@@ -2667,7 +2626,6 @@ void r300UpdateShaderStates(r300ContextPtr rmesa)
GLcontext *ctx;
ctx = rmesa->radeon.glCtx;
@@ -14015,7 +13937,7 @@ index ade45f5..03c0a14 100644
r300SetEarlyZState(ctx);
GLuint fgdepthsrc = R300_FG_DEPTH_SRC_SCAN;
-@@ -2712,7 +2658,7 @@ static void r300InvalidateState(GLcontext * ctx, GLuint new_state)
+@@ -2712,7 +2670,7 @@ static void r300InvalidateState(GLcontext * ctx, GLuint new_state)
r300UpdateStateParameters(ctx, new_state);
@@ -14024,27 +13946,27 @@ index ade45f5..03c0a14 100644
}
/**
-@@ -2725,26 +2671,9 @@ void r300InitState(r300ContextPtr r300)
+@@ -2725,15 +2683,13 @@ void r300InitState(r300ContextPtr r300)
GLcontext *ctx = r300->radeon.glCtx;
GLuint depth_fmt;
- radeonInitState(&r300->radeon);
-
-- switch (ctx->Visual.depthBits) {
-- case 16:
+ switch (ctx->Visual.depthBits) {
+ case 16:
- r300->state.depth.scale = 1.0 / (GLfloat) 0xffff;
-- depth_fmt = R300_DEPTHFORMAT_16BIT_INT_Z;
-- break;
-- case 24:
++ r300->radeon.state.depth.scale = 1.0 / (GLfloat) 0xffff;
+ depth_fmt = R300_DEPTHFORMAT_16BIT_INT_Z;
+ break;
+ case 24:
- r300->state.depth.scale = 1.0 / (GLfloat) 0xffffff;
-- depth_fmt = R300_DEPTHFORMAT_24BIT_INT_Z_8BIT_STENCIL;
-- break;
-- default:
-- fprintf(stderr, "Error: Unsupported depth %d... exiting\n",
-- ctx->Visual.depthBits);
-- _mesa_exit(-1);
-- }
--
++ r300->radeon.state.depth.scale = 1.0 / (GLfloat) 0xffffff;
+ depth_fmt = R300_DEPTHFORMAT_24BIT_INT_Z_8BIT_STENCIL;
+ break;
+ default:
+@@ -2743,8 +2699,8 @@ void r300InitState(r300ContextPtr r300)
+ }
+
/* Only have hw stencil when depth buffer is 24 bits deep */
- r300->state.stencil.hw_stencil = (ctx->Visual.stencilBits > 0 &&
- ctx->Visual.depthBits == 24);
@@ -14053,7 +13975,7 @@ index ade45f5..03c0a14 100644
memset(&(r300->state.texture), 0, sizeof(r300->state.texture));
-@@ -2776,12 +2705,33 @@ void r300UpdateClipPlanes( GLcontext *ctx )
+@@ -2776,12 +2732,32 @@ void r300UpdateClipPlanes( GLcontext *ctx )
}
}
@@ -14067,8 +13989,7 @@ index ade45f5..03c0a14 100644
+ radeon_firevertices(&rmesa->radeon); /* don't pipeline cliprect changes */
+
+ radeonSetCliprects( &rmesa->radeon );
-+ if (!rmesa->radeon.radeonScreen->driScreen->dri2.enabled)
-+ radeonUpdatePageFlipping(&rmesa->radeon);
++ radeonUpdatePageFlipping(&rmesa->radeon);
+}
+
+static void r300ReadBuffer( GLcontext *ctx, GLenum mode )
@@ -14088,7 +14009,7 @@ index ade45f5..03c0a14 100644
functions->UpdateState = r300InvalidateState;
functions->AlphaFunc = r300AlphaFunc;
-@@ -2818,4 +2768,8 @@ void r300InitStateFuncs(struct dd_function_table *functions)
+@@ -2818,4 +2794,8 @@ void r300InitStateFuncs(struct dd_function_table *functions)
functions->RenderMode = r300RenderMode;
functions->ClipPlane = r300ClipPlane;
@@ -14585,7 +14506,7 @@ index 55df53c..23b4ce3 100644
+extern void r300_swtcl_flush(GLcontext *ctx, uint32_t current_offset);
#endif
diff --git a/src/mesa/drivers/dri/r300/r300_tex.c b/src/mesa/drivers/dri/r300/r300_tex.c
-index 8ab382c..0f5afbf 100644
+index 8ab382c..27b9070 100644
--- a/src/mesa/drivers/dri/r300/r300_tex.c
+++ b/src/mesa/drivers/dri/r300/r300_tex.c
@@ -38,6 +38,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -15484,7 +15405,7 @@ index 8ab382c..0f5afbf 100644
if (RADEON_DEBUG & (DEBUG_STATE | DEBUG_TEXTURE)) {
fprintf(stderr, "%s( %p (target = %s) )\n", __FUNCTION__,
-@@ -992,14 +261,24 @@ static void r300DeleteTexture(GLcontext * ctx, struct gl_texture_object *texObj)
+@@ -992,14 +261,19 @@ static void r300DeleteTexture(GLcontext * ctx, struct gl_texture_object *texObj)
_mesa_lookup_enum_by_nr(texObj->Target));
}
@@ -15495,17 +15416,12 @@ index 8ab382c..0f5afbf 100644
+ if (rmesa) {
+ int i;
+ radeon_firevertices(&rmesa->radeon);
-+
+
+- driDestroyTextureObject(t);
+ for(i = 0; i < R300_MAX_TEXTURE_UNITS; ++i)
+ if (rmesa->hw.textures[i] == t)
+ rmesa->hw.textures[i] = 0;
+ }
-
-- driDestroyTextureObject(t);
-+ if (t->bo) {
-+ radeon_bo_unref(t->bo);
-+ t->bo = NULL;
-+ }
+
+ if (t->mt) {
+ radeon_miptree_unreference(t->mt);
@@ -15515,7 +15431,7 @@ index 8ab382c..0f5afbf 100644
_mesa_delete_texture_object(ctx, texObj);
}
-@@ -1008,8 +287,6 @@ static void r300DeleteTexture(GLcontext * ctx, struct gl_texture_object *texObj)
+@@ -1008,8 +282,6 @@ static void r300DeleteTexture(GLcontext * ctx, struct gl_texture_object *texObj)
* Called via ctx->Driver.NewTextureObject.
* Note: this function will be called during context creation to
* allocate the default texture objects.
@@ -15524,7 +15440,7 @@ index 8ab382c..0f5afbf 100644
* Fixup MaxAnisotropy according to user preference.
*/
static struct gl_texture_object *r300NewTextureObject(GLcontext * ctx,
-@@ -1017,14 +294,23 @@ static struct gl_texture_object *r300NewTextureObject(GLcontext * ctx,
+@@ -1017,14 +289,23 @@ static struct gl_texture_object *r300NewTextureObject(GLcontext * ctx,
GLenum target)
{
r300ContextPtr rmesa = R300_CONTEXT(ctx);
@@ -15555,7 +15471,7 @@ index 8ab382c..0f5afbf 100644
}
void r300InitTextureFuncs(struct dd_function_table *functions)
-@@ -1032,22 +318,30 @@ void r300InitTextureFuncs(struct dd_function_table *functions)
+@@ -1032,22 +313,30 @@ void r300InitTextureFuncs(struct dd_function_table *functions)
/* Note: we only plug in the functions we implement in the driver
* since _mesa_init_driver_functions() was already called.
*/
@@ -16195,7 +16111,7 @@ index b03eefa..0000000
- return 0;
-}
diff --git a/src/mesa/drivers/dri/r300/r300_texstate.c b/src/mesa/drivers/dri/r300/r300_texstate.c
-index e2329f0..8a90069 100644
+index e2329f0..25cd4d8 100644
--- a/src/mesa/drivers/dri/r300/r300_texstate.c
+++ b/src/mesa/drivers/dri/r300/r300_texstate.c
@@ -47,7 +47,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -16240,7 +16156,7 @@ index e2329f0..8a90069 100644
break;
default:
/* Error...which should have already been caught by higher
-@@ -190,479 +189,309 @@ void r300SetDepthTexMode(struct gl_texture_object *tObj)
+@@ -190,479 +189,296 @@ void r300SetDepthTexMode(struct gl_texture_object *tObj)
/**
@@ -16411,7 +16327,7 @@ index e2329f0..8a90069 100644
- log2Depth = tObj->Image[0][t->base.firstLevel]->DepthLog2;
-
- numLevels = t->base.lastLevel - t->base.firstLevel + 1;
-+ if (t->image_override && t->bo)
++ if (t->image_override)
+ return;
- assert(numLevels <= RADEON_MAX_TEXTURE_LEVELS);
@@ -16445,24 +16361,24 @@ index e2329f0..8a90069 100644
- t->tile_bits |= R300_TXO_MICRO_TILE;
- }
- }
-+ if (t->base.Target == GL_TEXTURE_CUBE_MAP)
-+ t->pp_txformat |= R300_TX_FORMAT_CUBIC_MAP;
-+ if (t->base.Target == GL_TEXTURE_3D)
-+ t->pp_txformat |= R300_TX_FORMAT_3D;
-
+-
- if (tObj->Target != GL_TEXTURE_RECTANGLE_NV) {
- /* we can set macro tiling even for small textures, they will be untiled anyway */
- t->tile_bits |= R300_TXO_MACRO_TILE;
- }
- }
-#endif
-
-- curOffset = 0;
-
+- curOffset = 0;
++ if (t->base.Target == GL_TEXTURE_CUBE_MAP)
++ t->pp_txformat |= R300_TX_FORMAT_CUBIC_MAP;
++ if (t->base.Target == GL_TEXTURE_3D)
++ t->pp_txformat |= R300_TX_FORMAT_3D;
+
- if (tObj->Target == GL_TEXTURE_CUBE_MAP) {
- ASSERT(log2Width == log2Height);
- t->format |= R300_TX_FORMAT_CUBIC_MAP;
--
+
- for(i = 0; i < numLevels; i++) {
- GLuint face;
- for(face = 0; face < 6; face++)
@@ -16545,10 +16461,10 @@ index e2329f0..8a90069 100644
- struct gl_texture_unit *texUnit = &ctx->Texture.Unit[unit];
- struct gl_texture_object *tObj = texUnit->_Current;
- r300TexObjPtr t = (r300TexObjPtr) tObj->DriverData;
--
-- ASSERT(tObj->Target == GL_TEXTURE_2D || tObj->Target == GL_TEXTURE_1D);
+ radeonTexObj *t = radeon_tex_obj(texObj);
+- ASSERT(tObj->Target == GL_TEXTURE_2D || tObj->Target == GL_TEXTURE_1D);
+-
- if (t->base.dirty_images[0]) {
- R300_FIREVERTICES(rmesa);
+ if (!radeon_validate_texture_miptree(ctx, texObj))
@@ -16624,9 +16540,7 @@ index e2329f0..8a90069 100644
- return GL_TRUE;
-}
-+ if (!ctx->Texture.Unit[i]._ReallyEnabled)
-+ continue;
-
+-
-static GLboolean r300EnableTextureCube(GLcontext * ctx, int unit)
-{
- r300ContextPtr rmesa = R300_CONTEXT(ctx);
@@ -16645,7 +16559,9 @@ index e2329f0..8a90069 100644
- /* layout memory space, once for all faces */
- r300SetTexImages(rmesa, tObj);
- }
--
++ if (!ctx->Texture.Unit[i]._ReallyEnabled)
++ continue;
+
- /* upload (per face) */
- for (face = 0; face < 6; face++) {
- if (t->base.dirty_images[face]) {
@@ -16695,7 +16611,7 @@ index e2329f0..8a90069 100644
- if (!t->base.memBlock && !t->image_override &&
- !rmesa->prefer_gart_client_texturing)
+ if (ret == RADEON_CS_SPACE_FLUSH) {
-+ radeonFlush(ctx);
++ r300Flush(ctx);
+ if (flushed)
return GL_FALSE;
+ flushed = 1;
@@ -16873,15 +16789,9 @@ index e2329f0..8a90069 100644
+
+ _mesa_lock_texture(radeon->glCtx, texObj);
+ if (t->bo) {
-+ radeon_bo_unref(t->bo);
+ t->bo = NULL;
-+ }
-+ if (rImage->bo) {
-+ radeon_bo_unref(rImage->bo);
-+ rImage->bo = NULL;
-+ }
+ }
+ if (t->mt) {
-+ radeon_miptree_unreference(t->mt);
+ t->mt = NULL;
+ }
+ if (rImage->mt) {
@@ -16893,7 +16803,7 @@ index e2329f0..8a90069 100644
+ rb->width, rb->height, 1, 0, rb->cpp);
+ texImage->TexFormat = &_mesa_texformat_rgba8888_rev;
+ rImage->bo = rb->bo;
-+ radeon_bo_ref(rImage->bo);
++
+ t->bo = rb->bo;
+ radeon_bo_ref(t->bo);
+ t->tile_bits = 0;
@@ -16924,17 +16834,47 @@ index e2329f0..8a90069 100644
+ ((rb->height - 1) << R300_TX_HEIGHTMASK_SHIFT);
+ t->pp_txsize |= R300_TX_SIZE_TXPITCH_EN;
+ t->pp_txpitch |= pitch_val;
-+
-+ if (rmesa->radeon.radeonScreen->chip_family >= CHIP_FAMILY_RV515) {
-+ if (rb->width > 2048)
-+ t->pp_txpitch |= R500_TXWIDTH_BIT11;
-+ if (rb->height > 2048)
-+ t->pp_txpitch |= R500_TXHEIGHT_BIT11;
- }
+ t->validated = GL_TRUE;
+ _mesa_unlock_texture(radeon->glCtx, texObj);
+ return;
}
+diff --git a/src/mesa/drivers/dri/r300/r500_fragprog.c b/src/mesa/drivers/dri/r300/r500_fragprog.c
+index 75dae86..926ddd5 100644
+--- a/src/mesa/drivers/dri/r300/r500_fragprog.c
++++ b/src/mesa/drivers/dri/r300/r500_fragprog.c
+@@ -31,6 +31,12 @@
+ #include "radeon_program_alu.h"
+
+
++static void reset_srcreg(struct prog_src_register* reg)
++{
++ _mesa_bzero(reg, sizeof(*reg));
++ reg->Swizzle = SWIZZLE_NOOP;
++}
++
+ static struct prog_src_register shadow_ambient(struct gl_program *program, int tmu)
+ {
+ gl_state_index fail_value_tokens[STATE_LENGTH] = {
+@@ -99,6 +105,19 @@ static GLboolean transform_TEX(
+ destredirect = GL_TRUE;
+ }
+
++ if (inst.SrcReg[0].File != PROGRAM_TEMPORARY && inst.SrcReg[0].File != PROGRAM_INPUT) {
++ int tmpreg = radeonFindFreeTemporary(t);
++ tgt = radeonAppendInstructions(t->Program, 1);
++ tgt->Opcode = OPCODE_MOV;
++ tgt->DstReg.File = PROGRAM_TEMPORARY;
++ tgt->DstReg.Index = tmpreg;
++ tgt->SrcReg[0] = inst.SrcReg[0];
++
++ reset_srcreg(&inst.SrcReg[0]);
++ inst.SrcReg[0].File = PROGRAM_TEMPORARY;
++ inst.SrcReg[0].Index = tmpreg;
++ }
++
+ tgt = radeonAppendInstructions(t->Program, 1);
+ _mesa_copy_instructions(tgt, &inst, 1);
+
diff --git a/src/mesa/drivers/dri/r300/radeon_context.c b/src/mesa/drivers/dri/r300/radeon_context.c
deleted file mode 100644
index 5267fe9..0000000
@@ -18182,14 +18122,6 @@ index a344837..64bdf94
- } while (0)
-
-#endif /* __RADEON_LOCK_H__ */
-diff --git a/src/mesa/drivers/dri/r300/radeon_lock.h b/src/mesa/drivers/dri/r300/radeon_lock.h
-new file mode 120000
-index a344837..64bdf94
---- /dev/null
-+++ b/src/mesa/drivers/dri/r300/radeon_lock.h
-@@ -0,0 +1 @@
-+../radeon/radeon_lock.h
-\ No newline at end of file
diff --git a/src/mesa/drivers/dri/r300/radeon_program_pair.c b/src/mesa/drivers/dri/r300/radeon_program_pair.c
index 58bc0d5..8a945d8 100644
--- a/src/mesa/drivers/dri/r300/radeon_program_pair.c
@@ -24735,7 +24667,7 @@ index 0000000..cee3744
+void *rcommonAllocDmaLowVerts(radeonContextPtr rmesa, int nverts, int vsize);
+#endif
diff --git a/src/mesa/drivers/dri/radeon/radeon_ioctl.c b/src/mesa/drivers/dri/radeon/radeon_ioctl.c
-index 09acf6b..b5ab923 100644
+index 09acf6b..fb3a236 100644
--- a/src/mesa/drivers/dri/radeon/radeon_ioctl.c
+++ b/src/mesa/drivers/dri/radeon/radeon_ioctl.c
@@ -43,6 +43,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -24822,7 +24754,7 @@ index 09acf6b..b5ab923 100644
/* =============================================================
* Kernel command buffer handling
*/
-@@ -134,893 +66,340 @@ static void radeonBackUpAndEmitLostStateLocked( radeonContextPtr rmesa )
+@@ -134,893 +66,308 @@ static void radeonBackUpAndEmitLostStateLocked( radeonContextPtr rmesa )
/* The state atoms will be emitted in the order they appear in the atom list,
* so this step is important.
*/
@@ -25006,26 +24938,13 @@ index 09acf6b..b5ab923 100644
- cmd[1].i, cmd[2].i, cmd[3].i);
+ BEGIN_BATCH(8);
+ OUT_BATCH_PACKET3_CLIP(RADEON_CP_PACKET3_3D_RNDR_GEN_INDX_PRIM, 3);
-+ if (!rmesa->radeon.radeonScreen->kernel_mm) {
-+ OUT_BATCH_RELOC(rmesa->ioctl.vertex_offset, rmesa->ioctl.bo, rmesa->ioctl.vertex_offset, RADEON_GEM_DOMAIN_GTT, 0, 0);
-+ } else {
-+ OUT_BATCH(rmesa->ioctl.vertex_offset);
-+ }
-+
++ OUT_BATCH_RELOC(rmesa->ioctl.vertex_offset, rmesa->ioctl.bo, rmesa->ioctl.vertex_offset, RADEON_GEM_DOMAIN_GTT, 0, 0);
+ OUT_BATCH(vertex_nr);
+ OUT_BATCH(vertex_format);
+ OUT_BATCH(primitive | RADEON_CP_VC_CNTL_PRIM_WALK_LIST |
+ RADEON_CP_VC_CNTL_COLOR_ORDER_RGBA |
+ RADEON_CP_VC_CNTL_VTX_FMT_RADEON_MODE |
+ (vertex_nr << RADEON_CP_VC_CNTL_NUM_SHIFT));
-+
-+ if (rmesa->radeon.radeonScreen->kernel_mm) {
-+ radeon_cs_write_reloc(rmesa->radeon.cmdbuf.cs,
-+ rmesa->ioctl.bo,
-+ RADEON_GEM_DOMAIN_GTT,
-+ 0, 0);
-+ }
-+
+ END_BATCH();
+
+#else
@@ -25073,15 +24992,11 @@ index 09acf6b..b5ab923 100644
- rmesa->store.cmd_used = (rmesa->store.cmd_used + 2) & ~2;
- dwords = (rmesa->store.cmd_used - rmesa->store.elts_start) / 4;
+ nr = rmesa->tcl.elt_used;
++
++ rmesa->radeon.cmdbuf.cs->cdw += dwords;
#if RADEON_OLD_PACKETS
- cmd[1] |= (dwords - 3) << 16;
-+ if (rmesa->radeon.radeonScreen->kernel_mm) {
-+ dwords -= 2;
-+ }
-+#endif
-+
-+#if RADEON_OLD_PACKETS
+ cmd[1] |= (dwords + 3) << 16;
cmd[5] |= nr << RADEON_CP_VC_CNTL_NUM_SHIFT;
#else
@@ -25090,18 +25005,7 @@ index 09acf6b..b5ab923 100644
cmd[3] |= nr << RADEON_CP_VC_CNTL_NUM_SHIFT;
#endif
-+ rmesa->radeon.cmdbuf.cs->cdw += dwords;
+ rmesa->radeon.cmdbuf.cs->section_cdw += dwords;
-+
-+#if RADEON_OLD_PACKETS
-+ if (rmesa->radeon.radeonScreen->kernel_mm) {
-+ radeon_cs_write_reloc(rmesa->radeon.cmdbuf.cs,
-+ rmesa->ioctl.bo,
-+ RADEON_GEM_DOMAIN_GTT,
-+ 0, 0);
-+ }
-+#endif
-+
+ END_BATCH();
+
if (RADEON_DEBUG & DEBUG_SYNC) {
@@ -25168,11 +25072,7 @@ index 09acf6b..b5ab923 100644
- retval = (GLushort *)(cmd+4);
+ BEGIN_BATCH_NO_AUTOSTATE(2+ELTS_BUFSZ(align_min_nr)/4);
+ OUT_BATCH_PACKET3_CLIP(RADEON_CP_PACKET3_3D_RNDR_GEN_INDX_PRIM, 0);
-+ if (!rmesa->radeon.radeonScreen->kernel_mm) {
-+ OUT_BATCH_RELOC(rmesa->ioctl.vertex_offset, rmesa->ioctl.bo, rmesa->ioctl.vertex_offset, RADEON_GEM_DOMAIN_GTT, 0, 0);
-+ } else {
-+ OUT_BATCH(rmesa->ioctl.vertex_offset);
-+ }
++ OUT_BATCH_RELOC(rmesa->ioctl.vertex_offset, rmesa->ioctl.bo, rmesa->ioctl.vertex_offset, RADEON_GEM_DOMAIN_GTT, 0, 0);
+ OUT_BATCH(0xffff);
+ OUT_BATCH(vertex_format);
+ OUT_BATCH(primitive |
@@ -25741,11 +25641,6 @@ index 09acf6b..b5ab923 100644
- LOCK_HARDWARE( rmesa );
- }
- rmesa->irqsEmitted = 10;
-- }
--
-- if (rmesa->irqsEmitted) {
-- radeonEmitIrqLocked( rmesa );
-- rmesa->irqsEmitted--;
+ if (nr & 1) {
+ OUT_BATCH((rmesa->tcl.aos[nr - 1].components << 0) |
+ (rmesa->tcl.aos[nr - 1].stride << 8));
@@ -25753,6 +25648,24 @@ index 09acf6b..b5ab923 100644
+ offset * 4 * rmesa->tcl.aos[nr - 1].stride;
+ OUT_BATCH(voffset);
}
+-
+- if (rmesa->irqsEmitted) {
+- radeonEmitIrqLocked( rmesa );
+- rmesa->irqsEmitted--;
++ for (i = 0; i + 1 < nr; i += 2) {
++ voffset = rmesa->tcl.aos[i + 0].offset +
++ offset * 4 * rmesa->tcl.aos[i + 0].stride;
++ radeon_cs_write_reloc(rmesa->radeon.cmdbuf.cs,
++ rmesa->tcl.aos[i+0].bo,
++ RADEON_GEM_DOMAIN_GTT,
++ 0, 0);
++ voffset = rmesa->tcl.aos[i + 1].offset +
++ offset * 4 * rmesa->tcl.aos[i + 1].stride;
++ radeon_cs_write_reloc(rmesa->radeon.cmdbuf.cs,
++ rmesa->tcl.aos[i+1].bo,
++ RADEON_GEM_DOMAIN_GTT,
++ 0, 0);
+ }
- }
- else {
- while (radeonGetLastFrame (rmesa) < sarea->last_frame) {
@@ -25760,8 +25673,15 @@ index 09acf6b..b5ab923 100644
- if (rmesa->do_usleeps)
- DO_USLEEP( 1 );
- LOCK_HARDWARE( rmesa );
-- }
-- }
++ if (nr & 1) {
++ voffset = rmesa->tcl.aos[nr - 1].offset +
++ offset * 4 * rmesa->tcl.aos[nr - 1].stride;
++ radeon_cs_write_reloc(rmesa->radeon.cmdbuf.cs,
++ rmesa->tcl.aos[nr-1].bo,
++ RADEON_GEM_DOMAIN_GTT,
++ 0, 0);
+ }
+ }
-}
-
-/* Copy the back color buffer to the front color buffer.
@@ -25798,7 +25718,8 @@ index 09acf6b..b5ab923 100644
- driWaitForVBlank( dPriv, & missed_target );
- LOCK_HARDWARE( rmesa );
- }
--
++ END_BATCH();
+
- nbox = dPriv->numClipRects; /* must be in locked region */
-
- for ( i = 0 ; i < nbox ; ) {
@@ -25828,20 +25749,7 @@ index 09acf6b..b5ab923 100644
-
- b++;
- n++;
-+ for (i = 0; i + 1 < nr; i += 2) {
-+ voffset = rmesa->tcl.aos[i + 0].offset +
-+ offset * 4 * rmesa->tcl.aos[i + 0].stride;
-+ radeon_cs_write_reloc(rmesa->radeon.cmdbuf.cs,
-+ rmesa->tcl.aos[i+0].bo,
-+ RADEON_GEM_DOMAIN_GTT,
-+ 0, 0);
-+ voffset = rmesa->tcl.aos[i + 1].offset +
-+ offset * 4 * rmesa->tcl.aos[i + 1].stride;
-+ radeon_cs_write_reloc(rmesa->radeon.cmdbuf.cs,
-+ rmesa->tcl.aos[i+1].bo,
-+ RADEON_GEM_DOMAIN_GTT,
-+ 0, 0);
- }
+- }
- rmesa->sarea->nbox = n;
-
- if (!n)
@@ -25853,17 +25761,9 @@ index 09acf6b..b5ab923 100644
- fprintf( stderr, "DRM_RADEON_SWAP_BUFFERS: return = %d\n", ret );
- UNLOCK_HARDWARE( rmesa );
- exit( 1 );
-+ if (nr & 1) {
-+ voffset = rmesa->tcl.aos[nr - 1].offset +
-+ offset * 4 * rmesa->tcl.aos[nr - 1].stride;
-+ radeon_cs_write_reloc(rmesa->radeon.cmdbuf.cs,
-+ rmesa->tcl.aos[nr-1].bo,
-+ RADEON_GEM_DOMAIN_GTT,
-+ 0, 0);
- }
- }
-+ END_BATCH();
-
+- }
+- }
+-
- UNLOCK_HARDWARE( rmesa );
- if (!rect)
- {
@@ -25950,7 +25850,7 @@ index 09acf6b..b5ab923 100644
/* ================================================================
* Buffer clear
*/
-@@ -1028,9 +407,9 @@ void radeonPageFlip( __DRIdrawablePrivate *dPriv )
+@@ -1028,9 +375,9 @@ void radeonPageFlip( __DRIdrawablePrivate *dPriv )
static void radeonClear( GLcontext *ctx, GLbitfield mask )
{
@@ -25963,7 +25863,7 @@ index 09acf6b..b5ab923 100644
uint32_t clear;
GLuint flags = 0;
GLuint color_mask = 0;
-@@ -1042,8 +421,8 @@ static void radeonClear( GLcontext *ctx, GLbitfield mask )
+@@ -1042,8 +389,8 @@ static void radeonClear( GLcontext *ctx, GLbitfield mask )
}
{
@@ -25974,7 +25874,7 @@ index 09acf6b..b5ab923 100644
if ( dPriv->numClipRects == 0 )
return;
}
-@@ -1067,7 +446,7 @@ static void radeonClear( GLcontext *ctx, GLbitfield mask )
+@@ -1067,7 +414,7 @@ static void radeonClear( GLcontext *ctx, GLbitfield mask )
mask &= ~BUFFER_BIT_DEPTH;
}
@@ -25983,7 +25883,7 @@ index 09acf6b..b5ab923 100644
flags |= RADEON_STENCIL;
mask &= ~BUFFER_BIT_STENCIL;
}
-@@ -1083,16 +462,16 @@ static void radeonClear( GLcontext *ctx, GLbitfield mask )
+@@ -1083,16 +430,16 @@ static void radeonClear( GLcontext *ctx, GLbitfield mask )
if (rmesa->using_hyperz) {
flags |= RADEON_USE_COMP_ZBUF;
@@ -26004,7 +25904,7 @@ index 09acf6b..b5ab923 100644
/* compute region after locking: */
cx = ctx->DrawBuffer->_Xmin;
-@@ -1112,7 +491,7 @@ static void radeonClear( GLcontext *ctx, GLbitfield mask )
+@@ -1112,7 +459,7 @@ static void radeonClear( GLcontext *ctx, GLbitfield mask )
gp.param = RADEON_PARAM_LAST_CLEAR;
gp.value = (int *)&clear;
@@ -26013,7 +25913,7 @@ index 09acf6b..b5ab923 100644
DRM_RADEON_GETPARAM, &gp, sizeof(gp) );
if ( ret ) {
-@@ -1124,20 +503,20 @@ static void radeonClear( GLcontext *ctx, GLbitfield mask )
+@@ -1124,20 +471,20 @@ static void radeonClear( GLcontext *ctx, GLbitfield mask )
break;
}
@@ -26039,7 +25939,7 @@ index 09acf6b..b5ab923 100644
drm_radeon_clear_t clear;
drm_radeon_clear_rect_t depth_boxes[RADEON_NR_SAREA_CLIPRECTS];
GLint n = 0;
-@@ -1172,106 +551,40 @@ static void radeonClear( GLcontext *ctx, GLbitfield mask )
+@@ -1172,106 +519,40 @@ static void radeonClear( GLcontext *ctx, GLbitfield mask )
}
}
@@ -27696,7 +27596,7 @@ index 1ec06bc..f30eb1c 100644
drm_clip_rect_t *boxes );
diff --git a/src/mesa/drivers/dri/radeon/radeon_screen.c b/src/mesa/drivers/dri/radeon/radeon_screen.c
-index f7cba50..78f0bc2 100644
+index 56c22fa..086a268 100644
--- a/src/mesa/drivers/dri/radeon/radeon_screen.c
+++ b/src/mesa/drivers/dri/radeon/radeon_screen.c
@@ -35,6 +35,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -27950,7 +27850,7 @@ index f7cba50..78f0bc2 100644
case PCI_CHIP_RADEON_LY:
case PCI_CHIP_RADEON_LZ:
case PCI_CHIP_RADEON_QY:
-@@ -819,9 +704,162 @@ radeonCreateScreen( __DRIscreenPrivate *sPriv )
+@@ -813,9 +698,162 @@ radeonCreateScreen( __DRIscreenPrivate *sPriv )
default:
fprintf(stderr, "unknown chip id 0x%x, can't guess.\n",
@@ -28114,41 +28014,28 @@ index f7cba50..78f0bc2 100644
if ((screen->chip_family == CHIP_FAMILY_R350 || screen->chip_family == CHIP_FAMILY_R300) &&
sPriv->ddx_version.minor < 2) {
fprintf(stderr, "xf86-video-ati-6.6.2 or newer needed for Radeon 9500/9700/9800 cards.\n");
-@@ -849,7 +887,7 @@ radeonCreateScreen( __DRIscreenPrivate *sPriv )
+@@ -843,7 +881,7 @@ radeonCreateScreen( __DRIscreenPrivate *sPriv )
ret = radeonGetParam( sPriv->fd, RADEON_PARAM_FB_LOCATION,
&temp);
if (ret) {
-- if (screen->chip_family < CHIP_FAMILY_RS600)
-+ if (screen->chip_family < CHIP_FAMILY_RS600 && !screen->kernel_mm)
+- if (screen->chip_family < CHIP_FAMILY_RS690)
++ if (screen->chip_family < CHIP_FAMILY_RS690 && !screen->kernel_mm)
screen->fbLocation = ( INREG( RADEON_MC_FB_LOCATION ) & 0xffff) << 16;
else {
FREE( screen );
-@@ -951,6 +989,103 @@ radeonCreateScreen( __DRIscreenPrivate *sPriv )
- screen->extensions[i++] = &driMediaStreamCounterExtension.base;
- }
+@@ -957,7 +995,7 @@ radeonCreateScreen( __DRIscreenPrivate *sPriv )
+ #endif
-+ if (!screen->kernel_mm) {
-+#if !RADEON_COMMON
-+ screen->extensions[i++] = &radeonTexOffsetExtension.base;
-+#endif
-+
-+#if RADEON_COMMON && defined(RADEON_COMMON_FOR_R200)
-+ if (IS_R200_CLASS(screen))
-+ screen->extensions[i++] = &r200AllocateExtension.base;
-+
-+ screen->extensions[i++] = &r200texOffsetExtension.base;
-+#endif
-+
-+#if RADEON_COMMON && defined(RADEON_COMMON_FOR_R300)
-+ screen->extensions[i++] = &r300texOffsetExtension.base;
-+#endif
-+ }
-+
-+ screen->extensions[i++] = NULL;
-+ sPriv->extensions = screen->extensions;
-+
-+ screen->driScreen = sPriv;
-+ screen->sarea_priv_offset = dri_priv->sarea_priv_offset;
+ #if RADEON_COMMON && defined(RADEON_COMMON_FOR_R300)
+- screen->extensions[i++] = &r300texOffsetExtension.base;
++ //screen->extensions[i++] = &r300texOffsetExtension.base;
+ #endif
+
+ screen->extensions[i++] = NULL;
+@@ -965,6 +1003,106 @@ radeonCreateScreen( __DRIscreenPrivate *sPriv )
+
+ screen->driScreen = sPriv;
+ screen->sarea_priv_offset = dri_priv->sarea_priv_offset;
+ screen->sarea = (drm_radeon_sarea_t *) ((GLubyte *) sPriv->pSAREA +
+ screen->sarea_priv_offset);
+
@@ -28224,23 +28111,26 @@ index f7cba50..78f0bc2 100644
+ screen->extensions[i++] = &driMediaStreamCounterExtension.base;
+ }
+
- #if !RADEON_COMMON
- screen->extensions[i++] = &radeonTexOffsetExtension.base;
- #endif
-@@ -963,14 +1098,19 @@ radeonCreateScreen( __DRIscreenPrivate *sPriv )
- #endif
-
- #if RADEON_COMMON && defined(RADEON_COMMON_FOR_R300)
-- screen->extensions[i++] = &r300texOffsetExtension.base;
-+ //screen->extensions[i++] = &r300texOffsetExtension.base;
++#if !RADEON_COMMON
++ screen->extensions[i++] = &radeonTexOffsetExtension.base;
++#endif
++
++#if RADEON_COMMON && defined(RADEON_COMMON_FOR_R200)
++ if (IS_R200_CLASS(screen))
++ screen->extensions[i++] = &r200AllocateExtension.base;
++
++ screen->extensions[i++] = &r200texOffsetExtension.base;
++#endif
++
++#if RADEON_COMMON && defined(RADEON_COMMON_FOR_R300)
++ screen->extensions[i++] = &r300texOffsetExtension.base;
+ screen->extensions[i++] = &r300TexBufferExtension.base;
- #endif
-
- screen->extensions[i++] = NULL;
- sPriv->extensions = screen->extensions;
-
- screen->driScreen = sPriv;
-- screen->sarea_priv_offset = dri_priv->sarea_priv_offset;
++#endif
++
++ screen->extensions[i++] = NULL;
++ sPriv->extensions = screen->extensions;
++
++ screen->driScreen = sPriv;
+ screen->bom = radeon_bo_manager_gem_ctor(sPriv->fd);
+ if (screen->bom == NULL) {
+ free(screen);
@@ -28249,7 +28139,7 @@ index f7cba50..78f0bc2 100644
return screen;
}
-@@ -979,23 +1119,32 @@ radeonCreateScreen( __DRIscreenPrivate *sPriv )
+@@ -973,23 +1111,32 @@ radeonCreateScreen( __DRIscreenPrivate *sPriv )
static void
radeonDestroyScreen( __DRIscreenPrivate *sPriv )
{
@@ -28295,7 +28185,7 @@ index f7cba50..78f0bc2 100644
}
-@@ -1004,15 +1153,102 @@ radeonDestroyScreen( __DRIscreenPrivate *sPriv )
+@@ -998,16 +1145,103 @@ radeonDestroyScreen( __DRIscreenPrivate *sPriv )
static GLboolean
radeonInitDriver( __DRIscreenPrivate *sPriv )
{
@@ -28313,11 +28203,11 @@ index f7cba50..78f0bc2 100644
+ radeonDestroyScreen( sPriv );
+ return GL_FALSE;
+ }
-
-- return GL_TRUE;
++
+ return GL_TRUE;
- }
++}
+- return GL_TRUE;
+static GLboolean
+radeon_alloc_window_storage(GLcontext *ctx, struct gl_renderbuffer *rb,
+ GLenum intFormat, GLuint w, GLuint h)
@@ -28327,9 +28217,9 @@ index f7cba50..78f0bc2 100644
+ rb->_ActualFormat = intFormat;
+
+ return GL_TRUE;
-+}
-+
-+
+ }
+
+
+static struct radeon_renderbuffer *
+radeon_create_renderbuffer(GLenum format, __DRIdrawablePrivate *driDrawPriv)
+{
@@ -28401,10 +28291,11 @@ index f7cba50..78f0bc2 100644
+ ret->bo = NULL;
+ return ret;
+}
-
++
/**
* Create the Mesa framebuffer and renderbuffers for a given window/drawable.
-@@ -1028,95 +1264,86 @@ radeonCreateBuffer( __DRIscreenPrivate *driScrnPriv,
+ *
+@@ -1022,95 +1256,86 @@ radeonCreateBuffer( __DRIscreenPrivate *driScrnPriv,
{
radeonScreenPtr screen = (radeonScreenPtr) driScrnPriv->private;
@@ -28570,7 +28461,7 @@ index f7cba50..78f0bc2 100644
_mesa_unreference_framebuffer((GLframebuffer **)(&(driDrawPriv->driverPrivate)));
}
-@@ -1211,13 +1438,102 @@ radeonInitScreen(__DRIscreenPrivate *psp)
+@@ -1205,13 +1430,48 @@ radeonInitScreen(__DRIscreenPrivate *psp)
if (!radeonInitDriver(psp))
return NULL;
@@ -28582,8 +28473,7 @@ index f7cba50..78f0bc2 100644
- (dri_priv->backOffset != dri_priv->depthOffset) );
+ (dri_priv->bpp == 16) ? 0 : 8, 1);
}
-+#define ARRAY_SIZE(a) (sizeof (a) / sizeof ((a)[0]))
-+
+
+/**
+ * This is the driver specific part of the createNewScreen entry point.
+ * Called when using DRI2.
@@ -28593,18 +28483,6 @@ index f7cba50..78f0bc2 100644
+static const
+__DRIconfig **radeonInitScreen2(__DRIscreenPrivate *psp)
+{
-+ GLenum fb_format[3];
-+ GLenum fb_type[3];
-+ /* GLX_SWAP_COPY_OML is only supported because the Intel driver doesn't
-+ * support pageflipping at all.
-+ */
-+ static const GLenum back_buffer_modes[] = {
-+ GLX_NONE, GLX_SWAP_UNDEFINED_OML, /*, GLX_SWAP_COPY_OML*/
-+ };
-+ uint8_t depth_bits[4], stencil_bits[4], msaa_samples_array[1];
-+ int color;
-+ __DRIconfig **configs = NULL;
-+
+ /* Calling driInitExtensions here, with a NULL context pointer,
+ * does not actually enable the extensions. It just makes sure
+ * that all the dispatch offsets for all the extensions that
@@ -28627,55 +28505,14 @@ index f7cba50..78f0bc2 100644
+ if (!radeonInitDriver(psp)) {
+ return NULL;
+ }
-+ depth_bits[0] = 0;
-+ stencil_bits[0] = 0;
-+ depth_bits[1] = 16;
-+ stencil_bits[1] = 0;
-+ depth_bits[2] = 24;
-+ stencil_bits[2] = 0;
-+ depth_bits[3] = 24;
-+ stencil_bits[3] = 8;
-+
-+ msaa_samples_array[0] = 0;
-+
-+ fb_format[0] = GL_RGB;
-+ fb_type[0] = GL_UNSIGNED_SHORT_5_6_5;
-+
-+ fb_format[1] = GL_BGR;
-+ fb_type[1] = GL_UNSIGNED_INT_8_8_8_8_REV;
-+
-+ fb_format[2] = GL_BGRA;
-+ fb_type[2] = GL_UNSIGNED_INT_8_8_8_8_REV;
-+
-+ for (color = 0; color < ARRAY_SIZE(fb_format); color++) {
-+ __DRIconfig **new_configs;
-+
-+ new_configs = driCreateConfigs(fb_format[color], fb_type[color],
-+ depth_bits,
-+ stencil_bits,
-+ ARRAY_SIZE(depth_bits),
-+ back_buffer_modes,
-+ ARRAY_SIZE(back_buffer_modes),
-+ msaa_samples_array,
-+ ARRAY_SIZE(msaa_samples_array));
-+ if (configs == NULL)
-+ configs = new_configs;
-+ else
-+ configs = driConcatConfigs(configs, new_configs);
-+ }
+
-+ if (configs == NULL) {
-+ fprintf(stderr, "[%s:%u] Error creating FBConfig!\n", __func__,
-+ __LINE__);
-+ return NULL;
-+ }
-
-+ return (const __DRIconfig **)configs;
++ /* for now fill in all modes */
++ return radeonFillInModes( psp, 24, 24, 8, 1);
+}
/**
* Get information about previous buffer swaps.
-@@ -1225,11 +1541,7 @@ radeonInitScreen(__DRIscreenPrivate *psp)
+@@ -1219,11 +1479,7 @@ radeonInitScreen(__DRIscreenPrivate *psp)
static int
getSwapInfo( __DRIdrawablePrivate *dPriv, __DRIswapInfo * sInfo )
{
@@ -28687,7 +28524,7 @@ index f7cba50..78f0bc2 100644
if ( (dPriv == NULL) || (dPriv->driContextPriv == NULL)
|| (dPriv->driContextPriv->driverPrivate == NULL)
-@@ -1266,6 +1578,8 @@ const struct __DriverAPIRec driDriverAPI = {
+@@ -1260,6 +1516,8 @@ const struct __DriverAPIRec driDriverAPI = {
.WaitForSBC = NULL,
.SwapBuffersMSC = NULL,
.CopySubBuffer = radeonCopySubBuffer,
@@ -28696,7 +28533,7 @@ index f7cba50..78f0bc2 100644
};
#else
const struct __DriverAPIRec driDriverAPI = {
-@@ -1275,14 +1589,16 @@ const struct __DriverAPIRec driDriverAPI = {
+@@ -1269,14 +1527,15 @@ const struct __DriverAPIRec driDriverAPI = {
.DestroyContext = r200DestroyContext,
.CreateBuffer = radeonCreateBuffer,
.DestroyBuffer = radeonDestroyBuffer,
@@ -28713,7 +28550,6 @@ index f7cba50..78f0bc2 100644
.SwapBuffersMSC = NULL,
- .CopySubBuffer = r200CopySubBuffer,
+ .CopySubBuffer = radeonCopySubBuffer,
-+ .InitScreen2 = radeonInitScreen2,
};
#endif
+
@@ -29260,7 +29096,7 @@ index 9abe086..dd44ab5 100644
+extern void radeonSetSpanFunctions(struct radeon_renderbuffer *rrb);
#endif
diff --git a/src/mesa/drivers/dri/radeon/radeon_state.c b/src/mesa/drivers/dri/radeon/radeon_state.c
-index 32bcff3..5fffa28 100644
+index 32bcff3..86d8720 100644
--- a/src/mesa/drivers/dri/radeon/radeon_state.c
+++ b/src/mesa/drivers/dri/radeon/radeon_state.c
@@ -62,7 +62,7 @@ static void radeonUpdateSpecular( GLcontext *ctx );
@@ -29857,19 +29693,18 @@ index 32bcff3..5fffa28 100644
if (ctx->DrawBuffer->_NumColorDrawBuffers != 1) {
/* 0 (GL_NONE) buffers or multiple color drawing buffers */
-@@ -1707,8 +1562,9 @@ static void radeonDrawBuffer( GLcontext *ctx, GLenum mode )
+@@ -1707,8 +1562,8 @@ static void radeonDrawBuffer( GLcontext *ctx, GLenum mode )
return;
}
- radeonSetCliprects( rmesa );
-
+ radeonSetCliprects( &rmesa->radeon );
-+ if (!rmesa->radeon.radeonScreen->driScreen->dri2.enabled)
-+ radeonUpdatePageFlipping(&rmesa->radeon);
++ radeonUpdatePageFlipping(&rmesa->radeon);
/* We'll set the drawing engine's offset/pitch parameters later
* when we update other state.
*/
-@@ -1726,7 +1582,7 @@ static void radeonReadBuffer( GLcontext *ctx, GLenum mode )
+@@ -1726,7 +1581,7 @@ static void radeonReadBuffer( GLcontext *ctx, GLenum mode )
static void radeonEnable( GLcontext *ctx, GLenum cap, GLboolean state )
{
@@ -29878,7 +29713,7 @@ index 32bcff3..5fffa28 100644
GLuint p, flag;
if ( RADEON_DEBUG & DEBUG_STATE )
-@@ -1821,10 +1677,10 @@ static void radeonEnable( GLcontext *ctx, GLenum cap, GLboolean state )
+@@ -1821,10 +1676,10 @@ static void radeonEnable( GLcontext *ctx, GLenum cap, GLboolean state )
RADEON_STATECHANGE(rmesa, ctx );
if ( state ) {
rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |= RADEON_DITHER_ENABLE;
@@ -29891,7 +29726,7 @@ index 32bcff3..5fffa28 100644
}
break;
-@@ -1971,13 +1827,13 @@ static void radeonEnable( GLcontext *ctx, GLenum cap, GLboolean state )
+@@ -1971,13 +1826,13 @@ static void radeonEnable( GLcontext *ctx, GLenum cap, GLboolean state )
}
case GL_SCISSOR_TEST:
@@ -29908,7 +29743,7 @@ index 32bcff3..5fffa28 100644
RADEON_STATECHANGE( rmesa, ctx );
if ( state ) {
rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |= RADEON_STENCIL_ENABLE;
-@@ -2010,7 +1866,7 @@ static void radeonEnable( GLcontext *ctx, GLenum cap, GLboolean state )
+@@ -2010,7 +1865,7 @@ static void radeonEnable( GLcontext *ctx, GLenum cap, GLboolean state )
static void radeonLightingSpaceChange( GLcontext *ctx )
{
@@ -29917,7 +29752,7 @@ index 32bcff3..5fffa28 100644
GLboolean tmp;
RADEON_STATECHANGE( rmesa, tcl );
-@@ -2039,7 +1895,7 @@ static void radeonLightingSpaceChange( GLcontext *ctx )
+@@ -2039,7 +1894,7 @@ static void radeonLightingSpaceChange( GLcontext *ctx )
*/
@@ -29926,7 +29761,7 @@ index 32bcff3..5fffa28 100644
int unit, GLboolean swapcols )
{
/* Here's how this works: on r100, only 3 tex coords can be submitted, so the
-@@ -2065,7 +1921,7 @@ void radeonUploadTexMatrix( radeonContextPtr rmesa,
+@@ -2065,7 +1920,7 @@ void radeonUploadTexMatrix( radeonContextPtr rmesa,
int idx = TEXMAT_0 + unit;
float *dest = ((float *)RADEON_DB_STATE( mat[idx] )) + MAT_ELT_0;
int i;
@@ -29935,7 +29770,7 @@ index 32bcff3..5fffa28 100644
GLfloat *src = rmesa->tmpmat[unit].m;
rmesa->TexMatColSwap &= ~(1 << unit);
-@@ -2119,7 +1975,7 @@ void radeonUploadTexMatrix( radeonContextPtr rmesa,
+@@ -2119,7 +1974,7 @@ void radeonUploadTexMatrix( radeonContextPtr rmesa,
}
@@ -29944,7 +29779,7 @@ index 32bcff3..5fffa28 100644
{
float *dest = ((float *)RADEON_DB_STATE( mat[idx] ))+MAT_ELT_0;
int i;
-@@ -2135,7 +1991,7 @@ static void upload_matrix( radeonContextPtr rmesa, GLfloat *src, int idx )
+@@ -2135,7 +1990,7 @@ static void upload_matrix( radeonContextPtr rmesa, GLfloat *src, int idx )
RADEON_DB_STATECHANGE( rmesa, &rmesa->hw.mat[idx] );
}
@@ -29953,7 +29788,7 @@ index 32bcff3..5fffa28 100644
{
float *dest = ((float *)RADEON_DB_STATE( mat[idx] ))+MAT_ELT_0;
memcpy(dest, src, 16*sizeof(float));
-@@ -2145,7 +2001,7 @@ static void upload_matrix_t( radeonContextPtr rmesa, GLfloat *src, int idx )
+@@ -2145,7 +2000,7 @@ static void upload_matrix_t( radeonContextPtr rmesa, GLfloat *src, int idx )
static void update_texturematrix( GLcontext *ctx )
{
@@ -29962,7 +29797,7 @@ index 32bcff3..5fffa28 100644
GLuint tpc = rmesa->hw.tcl.cmd[TCL_TEXTURE_PROC_CTL];
GLuint vs = rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXSEL];
int unit;
-@@ -2217,43 +2073,32 @@ static void update_texturematrix( GLcontext *ctx )
+@@ -2217,43 +2072,32 @@ static void update_texturematrix( GLcontext *ctx )
void
radeonUpdateDrawBuffer(GLcontext *ctx)
{
@@ -30020,7 +29855,7 @@ index 32bcff3..5fffa28 100644
if (new_state & (_NEW_BUFFERS | _NEW_COLOR | _NEW_PIXEL)) {
radeonUpdateDrawBuffer(ctx);
-@@ -2261,7 +2106,7 @@ void radeonValidateState( GLcontext *ctx )
+@@ -2261,7 +2105,7 @@ void radeonValidateState( GLcontext *ctx )
if (new_state & _NEW_TEXTURE) {
radeonUpdateTextureState( ctx );
@@ -30029,7 +29864,7 @@ index 32bcff3..5fffa28 100644
}
/* Need an event driven matrix update?
-@@ -2295,7 +2140,7 @@ void radeonValidateState( GLcontext *ctx )
+@@ -2295,7 +2139,7 @@ void radeonValidateState( GLcontext *ctx )
}
@@ -30038,7 +29873,7 @@ index 32bcff3..5fffa28 100644
}
-@@ -2306,7 +2151,7 @@ static void radeonInvalidateState( GLcontext *ctx, GLuint new_state )
+@@ -2306,7 +2150,7 @@ static void radeonInvalidateState( GLcontext *ctx, GLuint new_state )
_vbo_InvalidateState( ctx, new_state );
_tnl_InvalidateState( ctx, new_state );
_ae_invalidate_state( ctx, new_state );
@@ -30047,7 +29882,7 @@ index 32bcff3..5fffa28 100644
}
-@@ -2330,15 +2175,15 @@ static GLboolean check_material( GLcontext *ctx )
+@@ -2330,15 +2174,15 @@ static GLboolean check_material( GLcontext *ctx )
static void radeonWrapRunPipeline( GLcontext *ctx )
{
@@ -30106,7 +29941,7 @@ index 2171879..17c2b11 100644
diff --git a/src/mesa/drivers/dri/radeon/radeon_state_init.c b/src/mesa/drivers/dri/radeon/radeon_state_init.c
-index 57dc380..7ff0eb4 100644
+index 57dc380..617e731 100644
--- a/src/mesa/drivers/dri/radeon/radeon_state_init.c
+++ b/src/mesa/drivers/dri/radeon/radeon_state_init.c
@@ -38,39 +38,156 @@
@@ -30298,7 +30133,7 @@ index 57dc380..7ff0eb4 100644
}
-@@ -146,42 +263,290 @@ CHECK( txr0, (ctx->Texture.Unit[0]._ReallyEnabled & TEXTURE_RECT_BIT))
+@@ -146,17 +263,244 @@ CHECK( txr0, (ctx->Texture.Unit[0]._ReallyEnabled & TEXTURE_RECT_BIT))
CHECK( txr1, (ctx->Texture.Unit[1]._ReallyEnabled & TEXTURE_RECT_BIT))
CHECK( txr2, (ctx->Texture.Unit[2]._ReallyEnabled & TEXTURE_RECT_BIT))
@@ -30327,53 +30162,21 @@ index 57dc380..7ff0eb4 100644
+ r100ContextPtr r100 = R100_CONTEXT(ctx);
+ BATCH_LOCALS(&r100->radeon);
+ uint32_t dwords = atom->cmd_size;
-+
-+ dwords += 2;
++
+ BEGIN_BATCH_NO_AUTOSTATE(dwords);
+ OUT_SCL(atom->cmd[0], atom->cmd+1);
+ END_BATCH();
+}
-
-
--/* Initialize the context's hardware state.
-- */
--void radeonInitState( radeonContextPtr rmesa )
-+static void vec_emit(GLcontext *ctx, struct radeon_state_atom *atom)
- {
-- GLcontext *ctx = rmesa->glCtx;
-- GLuint color_fmt, depth_fmt, i;
-- GLint drawPitch, drawOffset;
-+ r100ContextPtr r100 = R100_CONTEXT(ctx);
-+ BATCH_LOCALS(&r100->radeon);
-+ uint32_t dwords = atom->cmd_size;
+
-+ dwords += 4;
-+ BEGIN_BATCH_NO_AUTOSTATE(dwords);
-+ OUT_VEC(atom->cmd[0], atom->cmd+1);
-+ END_BATCH();
-+}
-
-- switch ( rmesa->radeonScreen->cpp ) {
-- case 2:
-- color_fmt = RADEON_COLOR_FORMAT_RGB565;
-- break;
-- case 4:
-- color_fmt = RADEON_COLOR_FORMAT_ARGB8888;
-- break;
-- default:
-- fprintf( stderr, "Error: Unsupported pixel depth... exiting\n" );
-- exit( -1 );
+
-+static void lit_emit(GLcontext *ctx, struct radeon_state_atom *atom)
++static void vec_emit(GLcontext *ctx, struct radeon_state_atom *atom)
+{
+ r100ContextPtr r100 = R100_CONTEXT(ctx);
+ BATCH_LOCALS(&r100->radeon);
+ uint32_t dwords = atom->cmd_size;
+
-+ dwords += 6;
+ BEGIN_BATCH_NO_AUTOSTATE(dwords);
-+ OUT_VEC(atom->cmd[LIT_CMD_0], atom->cmd+1);
-+ OUT_SCL(atom->cmd[LIT_CMD_1], atom->cmd+LIT_CMD_1+1);
++ OUT_VEC(atom->cmd[0], atom->cmd+1);
+ END_BATCH();
+}
+
@@ -30383,59 +30186,51 @@ index 57dc380..7ff0eb4 100644
+ BATCH_LOCALS(&r100->radeon);
+ struct radeon_renderbuffer *rrb;
+ uint32_t cbpitch;
-+ uint32_t zbpitch, depth_fmt;
++ uint32_t zbpitch;
+ uint32_t dwords = atom->cmd_size;
++ GLframebuffer *fb = r100->radeon.dri.drawable->driverPrivate;
+
+ /* output the first 7 bytes of context */
+ BEGIN_BATCH_NO_AUTOSTATE(dwords + 4);
+ OUT_BATCH_TABLE(atom->cmd, 5);
+
-+ rrb = radeon_get_depthbuffer(&r100->radeon);
++ rrb = r100->radeon.state.depth.rrb;
+ if (!rrb) {
+ OUT_BATCH(0);
+ OUT_BATCH(0);
+ } else {
+ zbpitch = (rrb->pitch / rrb->cpp);
-+ if (r100->using_hyperz)
-+ zbpitch |= RADEON_DEPTH_HYPERZ;
-+
+ OUT_BATCH_RELOC(0, rrb->bo, 0, 0, RADEON_GEM_DOMAIN_VRAM, 0);
+ OUT_BATCH(zbpitch);
-+ if (rrb->cpp == 4)
-+ depth_fmt = RADEON_DEPTH_FORMAT_24BIT_INT_Z;
-+ else
-+ depth_fmt = RADEON_DEPTH_FORMAT_16BIT_INT_Z;
-+ atom->cmd[CTX_RB3D_ZSTENCILCNTL] &= ~RADEON_DEPTH_FORMAT_MASK;
-+ atom->cmd[CTX_RB3D_ZSTENCILCNTL] |= depth_fmt;
+ }
+
+ OUT_BATCH(atom->cmd[CTX_RB3D_ZSTENCILCNTL]);
+ OUT_BATCH(atom->cmd[CTX_CMD_1]);
+ OUT_BATCH(atom->cmd[CTX_PP_CNTL]);
++ OUT_BATCH(atom->cmd[CTX_RB3D_CNTL]);
+
-+ rrb = radeon_get_colorbuffer(&r100->radeon);
++ rrb = r100->radeon.state.color.rrb;
++ if (r100->radeon.radeonScreen->driScreen->dri2.enabled) {
++ rrb = (struct radeon_renderbuffer *)fb->Attachment[BUFFER_BACK_LEFT].Renderbuffer;
++ }
+ if (!rrb || !rrb->bo) {
-+ OUT_BATCH(atom->cmd[CTX_RB3D_CNTL]);
-+ OUT_BATCH(atom->cmd[CTX_RB3D_COLOROFFSET]);
++ OUT_BATCH(atom->cmd[CTX_RB3D_COLOROFFSET]);
+ } else {
-+ atom->cmd[CTX_RB3D_CNTL] &= ~(0xf << 10);
-+ if (rrb->cpp == 4)
-+ atom->cmd[CTX_RB3D_CNTL] |= RADEON_COLOR_FORMAT_ARGB8888;
-+ else
-+ atom->cmd[CTX_RB3D_CNTL] |= RADEON_COLOR_FORMAT_RGB565;
-+
-+ OUT_BATCH(atom->cmd[CTX_RB3D_CNTL]);
-+ OUT_BATCH_RELOC(0, rrb->bo, 0, 0, RADEON_GEM_DOMAIN_VRAM, 0);
++ OUT_BATCH_RELOC(0, rrb->bo, 0, 0, RADEON_GEM_DOMAIN_VRAM, 0);
+ }
-+
+
+ OUT_BATCH(atom->cmd[CTX_CMD_2]);
+
+ if (!rrb || !rrb->bo) {
+ OUT_BATCH(atom->cmd[CTX_RB3D_COLORPITCH]);
+ } else {
+ cbpitch = (rrb->pitch / rrb->cpp);
-+ if (rrb->bo->flags & RADEON_BO_FLAGS_MACRO_TILE)
-+ cbpitch |= RADEON_COLOR_TILE_ENABLE;
++ if (rrb->cpp == 4)
++ ;
++ else
++ ;
++ if (r100->radeon.sarea->tiling_enabled)
++ cbpitch |= R200_COLOR_TILE_ENABLE;
+ OUT_BATCH(cbpitch);
+ }
+
@@ -30450,41 +30245,24 @@ index 57dc380..7ff0eb4 100644
+ uint32_t cbpitch = 0;
+ uint32_t zbpitch = 0;
+ uint32_t dwords = atom->cmd_size;
-+ uint32_t depth_fmt;
++ GLframebuffer *fb = r100->radeon.dri.drawable->driverPrivate;
+
-+ rrb = radeon_get_colorbuffer(&r100->radeon);
-+ if (!rrb || !rrb->bo) {
-+ fprintf(stderr, "no rrb\n");
-+ return;
++ rrb = r100->radeon.state.color.rrb;
++ if (r100->radeon.radeonScreen->driScreen->dri2.enabled) {
++ rrb = (struct radeon_renderbuffer *)fb->Attachment[BUFFER_BACK_LEFT].Renderbuffer;
+ }
-+
-+ atom->cmd[CTX_RB3D_CNTL] &= ~(0xf << 10);
-+ if (rrb->cpp == 4)
-+ atom->cmd[CTX_RB3D_CNTL] |= RADEON_COLOR_FORMAT_ARGB8888;
-+ else
-+ atom->cmd[CTX_RB3D_CNTL] |= RADEON_COLOR_FORMAT_RGB565;
-+
-+ cbpitch = (rrb->pitch / rrb->cpp);
-+ if (rrb->bo->flags & RADEON_BO_FLAGS_MACRO_TILE)
++ if (rrb) {
++ assert(rrb->bo != NULL);
++ cbpitch = (rrb->pitch / rrb->cpp);
++ if (r100->radeon.sarea->tiling_enabled)
+ cbpitch |= R200_COLOR_TILE_ENABLE;
++ }
+
-+ drb = radeon_get_depthbuffer(&r100->radeon);
-+ if (drb) {
++ drb = r100->radeon.state.depth.rrb;
++ if (drb)
+ zbpitch = (drb->pitch / drb->cpp);
-+ if (drb->cpp == 4)
-+ depth_fmt = RADEON_DEPTH_FORMAT_24BIT_INT_Z;
-+ else
-+ depth_fmt = RADEON_DEPTH_FORMAT_16BIT_INT_Z;
-+ atom->cmd[CTX_RB3D_ZSTENCILCNTL] &= ~RADEON_DEPTH_FORMAT_MASK;
-+ atom->cmd[CTX_RB3D_ZSTENCILCNTL] |= depth_fmt;
-+
-+ }
+
+ /* output the first 7 bytes of context */
-+ if (drb)
-+ dwords += 4;
-+ if (rrb)
-+ dwords += 4;
+ BEGIN_BATCH_NO_AUTOSTATE(dwords);
+
+ /* In the CS case we need to split this up */
@@ -30505,13 +30283,17 @@ index 57dc380..7ff0eb4 100644
+ OUT_BATCH(atom->cmd[CTX_PP_CNTL]);
+ OUT_BATCH(atom->cmd[CTX_RB3D_CNTL]);
+
++
+ if (rrb) {
+ OUT_BATCH(CP_PACKET0(RADEON_RB3D_COLOROFFSET, 0));
+ OUT_BATCH_RELOC(0, rrb->bo, 0, 0, RADEON_GEM_DOMAIN_VRAM, 0);
- }
-
-- rmesa->state.color.clear = 0x00000000;
++ }
++
+ if (rrb) {
++ if (rrb->cpp == 4)
++ ;
++ else
++ ;
+ OUT_BATCH(CP_PACKET0(RADEON_RB3D_COLORPITCH, 0));
+ OUT_BATCH(cbpitch);
+ }
@@ -30583,38 +30365,51 @@ index 57dc380..7ff0eb4 100644
+ OUT_BATCH_TABLE((atom->cmd+4), 5);
+ END_BATCH();
+}
-+
-+/* Initialize the context's hardware state.
-+ */
+
+ /* Initialize the context's hardware state.
+ */
+-void radeonInitState( radeonContextPtr rmesa )
+void radeonInitState( r100ContextPtr rmesa )
-+{
+ {
+- GLcontext *ctx = rmesa->glCtx;
+ GLcontext *ctx = rmesa->radeon.glCtx;
-+ GLuint i;
-+
+ GLuint color_fmt, depth_fmt, i;
+ GLint drawPitch, drawOffset;
+
+- switch ( rmesa->radeonScreen->cpp ) {
++ switch ( rmesa->radeon.radeonScreen->cpp ) {
+ case 2:
+ color_fmt = RADEON_COLOR_FORMAT_RGB565;
+ break;
+@@ -168,20 +512,20 @@ void radeonInitState( radeonContextPtr rmesa )
+ exit( -1 );
+ }
+
+- rmesa->state.color.clear = 0x00000000;
+ rmesa->radeon.state.color.clear = 0x00000000;
switch ( ctx->Visual.depthBits ) {
case 16:
- rmesa->state.depth.clear = 0x0000ffff;
- rmesa->state.depth.scale = 1.0 / (GLfloat)0xffff;
-- depth_fmt = RADEON_DEPTH_FORMAT_16BIT_INT_Z;
-- rmesa->state.stencil.clear = 0x00000000;
+ rmesa->radeon.state.depth.clear = 0x0000ffff;
+ rmesa->radeon.state.depth.scale = 1.0 / (GLfloat)0xffff;
+ depth_fmt = RADEON_DEPTH_FORMAT_16BIT_INT_Z;
+- rmesa->state.stencil.clear = 0x00000000;
+ rmesa->radeon.state.stencil.clear = 0x00000000;
break;
case 24:
- rmesa->state.depth.clear = 0x00ffffff;
- rmesa->state.depth.scale = 1.0 / (GLfloat)0xffffff;
-- depth_fmt = RADEON_DEPTH_FORMAT_24BIT_INT_Z;
-- rmesa->state.stencil.clear = 0xffff0000;
+ rmesa->radeon.state.depth.clear = 0x00ffffff;
+ rmesa->radeon.state.depth.scale = 1.0 / (GLfloat)0xffffff;
+ depth_fmt = RADEON_DEPTH_FORMAT_24BIT_INT_Z;
+- rmesa->state.stencil.clear = 0xffff0000;
+ rmesa->radeon.state.stencil.clear = 0xffff0000;
break;
default:
fprintf( stderr, "Error: Unsupported depth %d... exiting\n",
-@@ -190,37 +555,37 @@ void radeonInitState( radeonContextPtr rmesa )
+@@ -190,37 +534,44 @@ void radeonInitState( radeonContextPtr rmesa )
}
/* Only have hw stencil when depth buffer is 24 bits deep */
@@ -30628,10 +30423,15 @@ index 57dc380..7ff0eb4 100644
- if ( ctx->Visual.doubleBufferMode && rmesa->sarea->pfCurrentPage == 0 ) {
- drawOffset = rmesa->radeonScreen->backOffset;
- drawPitch = rmesa->radeonScreen->backPitch;
-- } else {
++ if ( ctx->Visual.doubleBufferMode && rmesa->radeon.sarea->pfCurrentPage == 0 ) {
++ drawOffset = rmesa->radeon.radeonScreen->backOffset;
++ drawPitch = rmesa->radeon.radeonScreen->backPitch;
+ } else {
- drawOffset = rmesa->radeonScreen->frontOffset;
- drawPitch = rmesa->radeonScreen->frontPitch;
-- }
++ drawOffset = rmesa->radeon.radeonScreen->frontOffset;
++ drawPitch = rmesa->radeon.radeonScreen->frontPitch;
+ }
- rmesa->hw.max_state_size = 0;
+ rmesa->radeon.hw.max_state_size = 0;
@@ -30670,7 +30470,7 @@ index 57dc380..7ff0eb4 100644
ALLOC_STATE( lin, always, LIN_STATE_SIZE, "LIN/line", 0 );
ALLOC_STATE( msk, always, MSK_STATE_SIZE, "MSK/mask", 0 );
ALLOC_STATE( vpt, always, VPT_STATE_SIZE, "VPT/viewport", 0 );
-@@ -233,20 +598,25 @@ void radeonInitState( radeonContextPtr rmesa )
+@@ -233,20 +584,25 @@ void radeonInitState( radeonContextPtr rmesa )
ALLOC_STATE( fog, fog, FOG_STATE_SIZE, "FOG/fog", 1 );
ALLOC_STATE( glt, tcl_lighting, GLT_STATE_SIZE, "GLT/light-global", 1 );
ALLOC_STATE( eye, tcl_lighting, EYE_STATE_SIZE, "EYE/eye-vector", 1 );
@@ -30706,7 +30506,7 @@ index 57dc380..7ff0eb4 100644
}
ALLOC_STATE( mat[0], tcl, MAT_STATE_SIZE, "MAT/modelproject", 1 );
ALLOC_STATE( mat[1], tcl_eyespace_or_fog, MAT_STATE_SIZE, "MAT/modelview", 1 );
-@@ -268,43 +638,43 @@ void radeonInitState( radeonContextPtr rmesa )
+@@ -268,43 +624,43 @@ void radeonInitState( radeonContextPtr rmesa )
ALLOC_STATE( lit[5], tcl_lit5, LIT_STATE_SIZE, "LIT/light-5", 1 );
ALLOC_STATE( lit[6], tcl_lit6, LIT_STATE_SIZE, "LIT/light-6", 1 );
ALLOC_STATE( lit[7], tcl_lit7, LIT_STATE_SIZE, "LIT/light-7", 1 );
@@ -30781,51 +30581,20 @@ index 57dc380..7ff0eb4 100644
rmesa->hw.grd.cmd[GRD_CMD_0] =
cmdscl( RADEON_SS_VERT_GUARD_CLIP_ADJ_ADDR, 1, 4 );
rmesa->hw.fog.cmd[FOG_CMD_0] =
-@@ -331,6 +701,22 @@ void radeonInitState( radeonContextPtr rmesa )
- cmdvec( RADEON_VS_UCP_ADDR + i, 1, 4 );
- }
-
-+ if (rmesa->radeon.radeonScreen->kernel_mm) {
-+ rmesa->hw.grd.emit = scl_emit;
-+ rmesa->hw.fog.emit = vec_emit;
-+ rmesa->hw.glt.emit = vec_emit;
-+ rmesa->hw.eye.emit = vec_emit;
-+
-+ for (i = 0; i <= 6; i++)
-+ rmesa->hw.mat[i].emit = vec_emit;
-+
-+ for (i = 0; i < 8; i++)
-+ rmesa->hw.lit[i].emit = lit_emit;
-+
-+ for (i = 0; i < 6; i++)
-+ rmesa->hw.ucp[i].emit = vec_emit;
-+ }
-+
- rmesa->last_ReallyEnabled = -1;
-
- /* Initial Harware state:
-@@ -352,19 +738,7 @@ void radeonInitState( radeonContextPtr rmesa )
- RADEON_SRC_BLEND_GL_ONE |
+@@ -353,10 +709,10 @@ void radeonInitState( radeonContextPtr rmesa )
RADEON_DST_BLEND_GL_ZERO );
-- rmesa->hw.ctx.cmd[CTX_RB3D_DEPTHOFFSET] =
+ rmesa->hw.ctx.cmd[CTX_RB3D_DEPTHOFFSET] =
- rmesa->radeonScreen->depthOffset + rmesa->radeonScreen->fbLocation;
--
-- rmesa->hw.ctx.cmd[CTX_RB3D_DEPTHPITCH] =
++ rmesa->radeon.radeonScreen->depthOffset + rmesa->radeon.radeonScreen->fbLocation;
+
+ rmesa->hw.ctx.cmd[CTX_RB3D_DEPTHPITCH] =
- ((rmesa->radeonScreen->depthPitch &
-- RADEON_DEPTHPITCH_MASK) |
-- RADEON_DEPTH_ENDIAN_NO_SWAP);
--
-- if (rmesa->using_hyperz)
-- rmesa->hw.ctx.cmd[CTX_RB3D_DEPTHPITCH] |= RADEON_DEPTH_HYPERZ;
--
-- rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] = (depth_fmt |
-- RADEON_Z_TEST_LESS |
-+ rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] = (RADEON_Z_TEST_LESS |
- RADEON_STENCIL_TEST_ALWAYS |
- RADEON_STENCIL_FAIL_KEEP |
- RADEON_STENCIL_ZPASS_KEEP |
-@@ -374,7 +748,7 @@ void radeonInitState( radeonContextPtr rmesa )
++ ((rmesa->radeon.radeonScreen->depthPitch &
+ RADEON_DEPTHPITCH_MASK) |
+ RADEON_DEPTH_ENDIAN_NO_SWAP);
+
+@@ -374,7 +730,7 @@ void radeonInitState( radeonContextPtr rmesa )
if (rmesa->using_hyperz) {
rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_Z_COMPRESSION_ENABLE |
RADEON_Z_DECOMPRESSION_ENABLE;
@@ -30834,11 +30603,8 @@ index 57dc380..7ff0eb4 100644
/* works for q3, but slight rendering errors with glxgears ? */
/* rmesa->hw.ctx.cmd[CTX_RB3D_ZSTENCILCNTL] |= RADEON_Z_HIERARCHY_ENABLE;*/
/* need this otherwise get lots of lockups with q3 ??? */
-@@ -386,10 +760,9 @@ void radeonInitState( radeonContextPtr rmesa )
- RADEON_ANTI_ALIAS_NONE);
-
- rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] = (RADEON_PLANE_MASK_ENABLE |
-- color_fmt |
+@@ -389,7 +745,7 @@ void radeonInitState( radeonContextPtr rmesa )
+ color_fmt |
RADEON_ZBLOCK16);
- switch ( driQueryOptioni( &rmesa->optionCache, "dither_mode" ) ) {
@@ -30846,7 +30612,7 @@ index 57dc380..7ff0eb4 100644
case DRI_CONF_DITHER_XERRORDIFFRESET:
rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |= RADEON_DITHER_INIT;
break;
-@@ -397,30 +770,17 @@ void radeonInitState( radeonContextPtr rmesa )
+@@ -397,19 +753,19 @@ void radeonInitState( radeonContextPtr rmesa )
rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |= RADEON_SCALE_DITHER_ENABLE;
break;
}
@@ -30866,23 +30632,22 @@ index 57dc380..7ff0eb4 100644
- rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |= rmesa->state.color.roundEnable;
+ rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |= rmesa->radeon.state.color.roundEnable;
-- rmesa->hw.ctx.cmd[CTX_RB3D_COLOROFFSET] = ((drawOffset +
+ rmesa->hw.ctx.cmd[CTX_RB3D_COLOROFFSET] = ((drawOffset +
- rmesa->radeonScreen->fbLocation)
-- & RADEON_COLOROFFSET_MASK);
--
-- rmesa->hw.ctx.cmd[CTX_RB3D_COLORPITCH] = ((drawPitch &
-- RADEON_COLORPITCH_MASK) |
-- RADEON_COLOR_ENDIAN_NO_SWAP);
--
--
-- /* (fixed size) sarea is initialized to zero afaics so can omit version check. Phew! */
++ rmesa->radeon.radeonScreen->fbLocation)
+ & RADEON_COLOROFFSET_MASK);
+
+ rmesa->hw.ctx.cmd[CTX_RB3D_COLORPITCH] = ((drawPitch &
+@@ -418,7 +774,7 @@ void radeonInitState( radeonContextPtr rmesa )
+
+
+ /* (fixed size) sarea is initialized to zero afaics so can omit version check. Phew! */
- if (rmesa->sarea->tiling_enabled) {
-- rmesa->hw.ctx.cmd[CTX_RB3D_COLORPITCH] |= RADEON_COLOR_TILE_ENABLE;
-- }
++ if (rmesa->radeon.sarea->tiling_enabled) {
+ rmesa->hw.ctx.cmd[CTX_RB3D_COLORPITCH] |= RADEON_COLOR_TILE_ENABLE;
+ }
- rmesa->hw.set.cmd[SET_SE_CNTL] = (RADEON_FFACE_CULL_CCW |
- RADEON_BFACE_SOLID |
-@@ -444,7 +804,7 @@ void radeonInitState( radeonContextPtr rmesa )
+@@ -444,7 +800,7 @@ void radeonInitState( radeonContextPtr rmesa )
RADEON_VC_NO_SWAP;
#endif
@@ -30891,7 +30656,7 @@ index 57dc380..7ff0eb4 100644
rmesa->hw.set.cmd[SET_SE_CNTL_STATUS] |= RADEON_TCL_BYPASS;
}
-@@ -491,8 +851,8 @@ void radeonInitState( radeonContextPtr rmesa )
+@@ -491,8 +847,8 @@ void radeonInitState( radeonContextPtr rmesa )
(2 << RADEON_TXFORMAT_HEIGHT_SHIFT));
/* Initialize the texture offset to the start of the card texture heap */
@@ -30902,7 +30667,7 @@ index 57dc380..7ff0eb4 100644
rmesa->hw.tex[i].cmd[TEX_PP_BORDER_COLOR] = 0;
rmesa->hw.tex[i].cmd[TEX_PP_TXCBLEND] =
-@@ -513,15 +873,15 @@ void radeonInitState( radeonContextPtr rmesa )
+@@ -513,15 +869,15 @@ void radeonInitState( radeonContextPtr rmesa )
rmesa->hw.cube[i].cmd[CUBE_PP_CUBIC_FACES] = 0;
rmesa->hw.cube[i].cmd[CUBE_PP_CUBIC_OFFSET_0] =
@@ -30923,7 +30688,7 @@ index 57dc380..7ff0eb4 100644
}
/* Can only add ST1 at the time of doing some multitex but can keep
-@@ -613,5 +973,7 @@ void radeonInitState( radeonContextPtr rmesa )
+@@ -613,5 +969,7 @@ void radeonInitState( radeonContextPtr rmesa )
rmesa->hw.eye.cmd[EYE_Z] = IEEE_ONE;
rmesa->hw.eye.cmd[EYE_RESCALE_FACTOR] = IEEE_ONE;
@@ -32658,7 +32423,7 @@ index 5f7bbe6..0000000
- return 0;
-}
diff --git a/src/mesa/drivers/dri/radeon/radeon_texstate.c b/src/mesa/drivers/dri/radeon/radeon_texstate.c
-index b165205..2b0ebbc 100644
+index 1e2f654..6a34f1e 100644
--- a/src/mesa/drivers/dri/radeon/radeon_texstate.c
+++ b/src/mesa/drivers/dri/radeon/radeon_texstate.c
@@ -43,6 +43,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.