xf86-video-intel: Branch 'textured-video' - 24 commits - configure.ac src/common.h src/i810_dri.c src/i810_reg.h src/i830_3d.c src/i830_common.h src/i830_dri.c src/i830_dri.h src/i830_driver.c src/i830.h src/i830_randr.c src/i830_reg.h src/i830_rotate.c src/i830_video.c src/i830_video.h src/i915_3d.c src/i915_3d.h src/i915_reg.h src/i915_video.c src/Makefile.am

Eric Anholt anholt at kemper.freedesktop.org
Wed Jul 19 07:27:42 PDT 2006


 configure.ac      |   12 
 src/Makefile.am   |    9 
 src/common.h      |   15 
 src/i810_dri.c    |    4 
 src/i810_reg.h    |  615 ---------------------------------------
 src/i830.h        |   15 
 src/i830_3d.c     |  130 ++++++++
 src/i830_common.h |    9 
 src/i830_dri.c    |   63 ++--
 src/i830_dri.h    |    4 
 src/i830_driver.c |  117 +++++--
 src/i830_randr.c  |    1 
 src/i830_reg.h    |  637 ++++++++++++++++++++++++++++++++++++++++
 src/i830_rotate.c |  169 +++++-----
 src/i830_video.c  |  538 ----------------------------------
 src/i830_video.h  |   76 ++++
 src/i915_3d.c     |  106 ++++++
 src/i915_3d.h     |  431 +++++++++++++++++++++++++++
 src/i915_reg.h    |  848 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 src/i915_video.c  |  467 +++++++++++++++++++++++++++++
 20 files changed, 2957 insertions(+), 1309 deletions(-)

New commits:
diff-tree baf65ce98abcdd21dff2531a43bb9c5044732c28 (from bb81e8d6c777a5e16b8193c07667fbee8e21203e)
Author: Eric Anholt <anholt at FreeBSD.org>
Date:   Tue Jul 18 19:42:37 2006 -0400

    Re-convert i915 video to new fragment shader API.
    
    Although in the history of this branch it had happened before, this time it's
    for real.

diff --git a/src/i915_video.c b/src/i915_video.c
index 8d687a1..e05ad72 100644
--- a/src/i915_video.c
+++ b/src/i915_video.c
@@ -37,6 +37,7 @@
 #include "i830.h"
 #include "i830_video.h"
 #include "i915_reg.h"
+#include "i915_3d.h"
 
 union intfloat {
    CARD32 ui;
@@ -49,68 +50,6 @@ union intfloat {
    OUT_RING(_tmp.ui);							\
 } while (0)
 
-#define OUT_DCL(type, nr) do {						\
-   CARD32 chans = 0;							\
-   if (REG_TYPE_##type == REG_TYPE_T)					\
-      chans = D0_CHANNEL_ALL;						\
-   else if (REG_TYPE_##type != REG_TYPE_S)				\
-      FatalError("wrong reg type %d to declare\n", REG_TYPE_##type);	\
-   OUT_RING(D0_DCL |							\
-	    (REG_TYPE_##type << D0_TYPE_SHIFT) | (nr << D0_NR_SHIFT) |	\
-	    chans);							\
-   OUT_RING(0x00000000);						\
-   OUT_RING(0x00000000);						\
-} while (0)
-
-#define OUT_TEXLD(dest_type, dest_nr, sampler_nr, addr_type, addr_nr)	\
-do {									\
-      OUT_RING(T0_TEXLD |						\
-	       (REG_TYPE_##dest_type << T0_DEST_TYPE_SHIFT) |		\
-	       (dest_nr << T0_DEST_NR_SHIFT) |				\
-	       (sampler_nr << T0_SAMPLER_NR_SHIFT));			\
-      OUT_RING((REG_TYPE_##addr_type << T1_ADDRESS_REG_TYPE_SHIFT) |	\
-	       (addr_nr << T1_ADDRESS_REG_NR_SHIFT));			\
-      OUT_RING(0x00000000);						\
-} while (0)
-
-/* Move the dest_chan from src0 to dest, leaving the other channels alone */
-#define OUT_MOV_TO_CHANNEL(dest_type, dest_nr, src0_type, src0_nr,	\
-			   dest_chan)					\
-do {									\
-   OUT_RING(A0_MOV | A0_DEST_CHANNEL_##dest_chan |			\
-	    (REG_TYPE_##dest_type << A0_DEST_TYPE_SHIFT) |		\
-	    (dest_nr << A0_DEST_NR_SHIFT) |				\
-	    (REG_TYPE_##src0_type << A0_SRC0_TYPE_SHIFT) |		\
-	    (src0_nr << A0_SRC0_NR_SHIFT));				\
-   OUT_RING((SRC_X << A1_SRC0_CHANNEL_X_SHIFT) |			\
-	    (SRC_Y << A1_SRC0_CHANNEL_Y_SHIFT) |			\
-	    (SRC_Z << A1_SRC0_CHANNEL_Z_SHIFT) |			\
-	    (SRC_W << A1_SRC0_CHANNEL_W_SHIFT));			\
-   OUT_RING(0);								\
-} while (0)
-
-/* Dot3-product src0 and src1, storing the result in dest_chan of the dest.
- * Saturates, in case we have out-of-range YUV values.
- */
-#define OUT_DP3_TO_CHANNEL(dest_type, dest_nr, src0_type, src0_nr,	\
-			   src1_type, src1_nr, dest_chan)		\
-do {									\
-   OUT_RING(A0_DP3 | A0_DEST_CHANNEL_##dest_chan | A0_DEST_SATURATE |	\
-	    (REG_TYPE_##dest_type << A0_DEST_TYPE_SHIFT) |		\
-	    (dest_nr << A0_DEST_NR_SHIFT) |				\
-	    (REG_TYPE_##src0_type << A0_SRC0_TYPE_SHIFT) |		\
-	    (src0_nr << A0_SRC0_NR_SHIFT));				\
-   OUT_RING((SRC_X << A1_SRC0_CHANNEL_X_SHIFT) |			\
-	    (SRC_Y << A1_SRC0_CHANNEL_Y_SHIFT) |			\
-	    (SRC_Z << A1_SRC0_CHANNEL_Z_SHIFT) |			\
-	    (SRC_W << A1_SRC0_CHANNEL_W_SHIFT) |			\
-	    (REG_TYPE_##src1_type << A1_SRC1_TYPE_SHIFT) |		\
-	    (src1_nr << A1_SRC1_TYPE_SHIFT) |				\
-	    (SRC_X << A1_SRC1_CHANNEL_X_SHIFT) |			\
-	    (SRC_Y << A1_SRC1_CHANNEL_Y_SHIFT));			\
-   OUT_RING((SRC_Z << A2_SRC1_CHANNEL_Z_SHIFT) |			\
-	    (SRC_W << A2_SRC1_CHANNEL_W_SHIFT));			\
-} while (0)
 
 void
 I915DisplayVideoTextured(ScrnInfoPtr pScrn, I830PortPrivPtr pPriv, int id,
@@ -261,14 +200,9 @@ I915DisplayVideoTextured(ScrnInfoPtr pSc
    ADVANCE_LP_RING();
 
    if (!planar) {
-      BEGIN_LP_RING(20);
-      /* fragment program - texture blend replace. */
-      OUT_RING(_3DSTATE_PIXEL_SHADER_PROGRAM | 8);
-      OUT_DCL(S, 0);
-      OUT_DCL(T, 0);
-      OUT_TEXLD(OC, 0, 0, T, 0);
-      /* End fragment program */
+      FS_LOCALS(3);
 
+      BEGIN_LP_RING(10);
       OUT_RING(_3DSTATE_SAMPLER_STATE | 3);
       OUT_RING(0x00000001);
       OUT_RING(SS2_COLORSPACE_CONVERSION |
@@ -297,8 +231,16 @@ I915DisplayVideoTextured(ScrnInfoPtr pSc
       OUT_RING(ms3);
       OUT_RING(((video_pitch / 4) - 1) << 21);
       ADVANCE_LP_RING();
+
+      FS_BEGIN();
+      i915_fs_dcl(FS_S0);
+      i915_fs_dcl(FS_T0);
+      i915_fs_texld(FS_OC, FS_S0, FS_T0);
+      FS_END();
    } else {
-      BEGIN_LP_RING(1 + 18 + (1 + 3*16) + 11 + 11);
+      FS_LOCALS(16);
+
+      BEGIN_LP_RING(1 + 18 + 11 + 11);
       OUT_RING(MI_NOOP);
       /* For the planar formats, we set up three samplers -- one for each plane,
        * in a Y8 format.  Because I couldn't get the special PLANAR_TO_PACKED
@@ -342,61 +284,6 @@ I915DisplayVideoTextured(ScrnInfoPtr pSc
       OUT_RING_F(0.0);
       OUT_RING_F(0.0);
 
-      OUT_RING(_3DSTATE_PIXEL_SHADER_PROGRAM | (3 * 16 - 1));
-      /* Declare samplers */
-      OUT_DCL(S, 0);
-      OUT_DCL(S, 1);
-      OUT_DCL(S, 2);
-      OUT_DCL(T, 0);
-      OUT_DCL(T, 1);
-
-      /* Load samplers to temporaries.  Y (sampler 0) gets the un-halved coords
-       * from t1.
-       */
-      OUT_TEXLD(R, 1, 0, T, 1);
-      OUT_TEXLD(R, 2, 1, T, 0);
-      OUT_TEXLD(R, 3, 2, T, 0);
-
-      /* Move the sampled YUV data in R[123] to the first 3 channels of R0. */
-      OUT_MOV_TO_CHANNEL(R, 0, R, 1, X);
-      OUT_MOV_TO_CHANNEL(R, 0, R, 2, Y);
-      OUT_MOV_TO_CHANNEL(R, 0, R, 3, Z);
-
-      /* Normalize the YUV data */
-      OUT_RING(A0_ADD | A0_DEST_CHANNEL_ALL |
-	       (REG_TYPE_R << A0_DEST_TYPE_SHIFT) | (0 << A0_DEST_NR_SHIFT) |				\
-	       (REG_TYPE_R << A0_SRC0_TYPE_SHIFT) | (0 << A0_SRC0_NR_SHIFT));
-      OUT_RING((SRC_X << A1_SRC0_CHANNEL_X_SHIFT) |
-	       (SRC_Y << A1_SRC0_CHANNEL_Y_SHIFT) |
-	       (SRC_Z << A1_SRC0_CHANNEL_Z_SHIFT) |
-	       (SRC_W << A1_SRC0_CHANNEL_W_SHIFT) |
-	       (REG_TYPE_CONST << A1_SRC1_TYPE_SHIFT) | (0 << A1_SRC1_NR_SHIFT) |
-	       (SRC_X << A1_SRC1_CHANNEL_X_SHIFT) |
-	       (SRC_Y << A1_SRC1_CHANNEL_Y_SHIFT));
-      OUT_RING((SRC_Z << A2_SRC1_CHANNEL_Z_SHIFT) |
-	       (SRC_W << A2_SRC1_CHANNEL_W_SHIFT));
-
-      /* dot-product the YUV data in R0 by the vectors of coefficients for
-       * calculating R, G, and B, storing the results in the R, G, or B channels
-       * of the output color.
-       */
-      OUT_DP3_TO_CHANNEL(OC, 0, R, 0, CONST, 1, X);
-      OUT_DP3_TO_CHANNEL(OC, 0, R, 0, CONST, 2, Y);
-      OUT_DP3_TO_CHANNEL(OC, 0, R, 0, CONST, 3, Z);
-
-      /* Set alpha of the output to 1.0, by wiring W to 1 and not actually using
-       * the source.
-       */
-      OUT_RING(A0_MOV | A0_DEST_CHANNEL_W |
-	       (REG_TYPE_OC << A0_DEST_TYPE_SHIFT) | (0 << A0_DEST_NR_SHIFT) |
-	       (REG_TYPE_OC << A0_SRC0_TYPE_SHIFT) | (0 << A0_SRC0_NR_SHIFT));
-      OUT_RING((SRC_X << A1_SRC0_CHANNEL_X_SHIFT) |
-	       (SRC_Y << A1_SRC0_CHANNEL_Y_SHIFT) |
-	       (SRC_Z << A1_SRC0_CHANNEL_Z_SHIFT) |
-	       (SRC_ONE << A1_SRC0_CHANNEL_W_SHIFT));
-      OUT_RING(0);
-      /* End fragment program */
-
       OUT_RING(_3DSTATE_SAMPLER_STATE | 9);
       OUT_RING(0x00000007);
       /* sampler 0 */
@@ -442,6 +329,48 @@ I915DisplayVideoTextured(ScrnInfoPtr pSc
       OUT_RING(ms3);
       OUT_RING(((video_pitch / 4) - 1) << 21);
       ADVANCE_LP_RING();
+
+      FS_BEGIN();
+      /* Declare samplers */
+      i915_fs_dcl(FS_S0);
+      i915_fs_dcl(FS_S1);
+      i915_fs_dcl(FS_S2);
+      i915_fs_dcl(FS_T0);
+      i915_fs_dcl(FS_T1);
+
+      /* Load samplers to temporaries.  Y (sampler 0) gets the un-halved coords-
+       * from t1.
+       */
+      i915_fs_texld(FS_R1, FS_S0, FS_T1);
+      i915_fs_texld(FS_R2, FS_S1, FS_T0);
+      i915_fs_texld(FS_R3, FS_S2, FS_T0);
+
+      /* Move the sampled YUV data in R[123] to the first 3 channels of R0. */
+      i915_fs_mov_masked(FS_R0, MASK_X, i915_fs_operand_reg(FS_R1));
+      i915_fs_mov_masked(FS_R0, MASK_Y, i915_fs_operand_reg(FS_R2));
+      i915_fs_mov_masked(FS_R0, MASK_Z, i915_fs_operand_reg(FS_R3));
+
+      /* Normalize the YUV data */
+      i915_fs_add(FS_R0, i915_fs_operand_reg(FS_R0),
+                 i915_fs_operand_reg(FS_C0));
+      /* dot-product the YUV data in R0 by the vectors of coefficients for
+       * calculating R, G, and B, storing the results in the R, G, or B channels
+       * of the output color.
+       */
+      i915_fs_dp3_masked(FS_OC, MASK_X | MASK_SATURATE,
+                        i915_fs_operand_reg(FS_R0),
+-                        i915_fs_operand_reg(FS_C1));
+      i915_fs_dp3_masked(FS_OC, MASK_Y | MASK_SATURATE,
+                        i915_fs_operand_reg(FS_R0),
+                        i915_fs_operand_reg(FS_C2));
+      i915_fs_dp3_masked(FS_OC, MASK_Z | MASK_SATURATE,
+                        i915_fs_operand_reg(FS_R0),
+                        i915_fs_operand_reg(FS_C3));
+      /* Set alpha of the output to 1.0, by wiring W to 1 and not actually using
+       * the source.
+       */
+      i915_fs_mov_masked(FS_OC, MASK_W, i915_fs_operand_one());
+      FS_END();
    }
    
    {
diff-tree bb81e8d6c777a5e16b8193c07667fbee8e21203e (from parents)
Merge: 2a1b3cfccb7de53f7ce8f9e4816e4278afb1fcab 84805167ab8a422966355b9753bfcb4dad802413
Author: Eric Anholt <anholt at FreeBSD.org>
Date:   Tue Jul 18 19:23:21 2006 -0400

    Merge branch 'master' into textured-video
    
    This moves the i915 textured video implementation into i915_video.c to avoid
    conflicts in register definitions with i830_reg.h when we use i915_reg.h.
    This also means that i810_reg.h's i915 3D regs definitions are removed and
    replaced with i915_reg.h usage.
    
    Conflicts:
    
    	src/i830_rotate.c

diff --cc src/Makefile.am
index c64c203,f97dc52..bf4ded4
@@@ -53,8 -53,13 +53,15 @@@
           i830_memory.c \
           i830_modes.c \
           i830_video.c \
++         i830_video.h \
           i830_rotate.c \
- 	 i830_randr.c
+ 	 i830_randr.c \
+ 	 i830_3d.c \
+ 	 i830_reg.h \
+ 	 i915_3d.c \
+ 	 i915_3d.h \
 -	 i915_reg.h
++	 i915_reg.h \
++	 i915_video.c
  
  if DRI
  i810_drv_la_SOURCES += \
diff --cc src/i810_reg.h
index 0ed7ff6,e52375f..2c5e271
@@@ -869,624 -866,15 +866,12 @@@
  #define XY_MONO_SRC_BLT_WRITE_ALPHA	(1<<21)
  #define XY_MONO_SRC_BLT_WRITE_RGB	(1<<20)
  
--/* 3d state */
- #define STATE3D_ANTI_ALIASING		(CMD_3D | (0x06<<24))
- #define LINE_CAP_WIDTH_MODIFY		(1 << 16)
- #define LINE_CAP_WIDTH_1_0		(0x1 << 14)
- #define LINE_WIDTH_MODIFY		(1 << 8)
- #define LINE_WIDTH_1_0			(0x1 << 6)
- 
- #define STATE3D_RASTERIZATION_RULES	(CMD_3D | (0x07<<24))
- #define ENABLE_POINT_RASTER_RULE	(1<<15)
- #define OGL_POINT_RASTER_RULE		(1<<13)
- #define ENABLE_TEXKILL_3D_4D            (1<<10)
- #define TEXKILL_3D                      (0<<9)
- #define TEXKILL_4D                      (1<<9)
- #define ENABLE_LINE_STRIP_PROVOKE_VRTX	(1<<8)
- #define ENABLE_TRI_FAN_PROVOKE_VRTX	(1<<5)
- #define LINE_STRIP_PROVOKE_VRTX(x)	((x)<<6)
- #define TRI_FAN_PROVOKE_VRTX(x) 	((x)<<3)
- 
- #define STATE3D_INDEPENDENT_ALPHA_BLEND	(CMD_3D | (0x0b<<24))
- #define IAB_MODIFY_ENABLE	        (1<<23)
- #define IAB_ENABLE       	        (1<<22)
- #define IAB_MODIFY_FUNC         	(1<<21)
- #define IAB_FUNC_SHIFT          	16
- #define IAB_MODIFY_SRC_FACTOR   	(1<<11)
- #define IAB_SRC_FACTOR_SHIFT		6
- #define IAB_SRC_FACTOR_MASK		(BLENDFACT_MASK<<6)
- #define IAB_MODIFY_DST_FACTOR	        (1<<5)
- #define IAB_DST_FACTOR_SHIFT		0
- #define IAB_DST_FACTOR_MASK		(BLENDFACT_MASK<<0)
- 
- #define BLENDFUNC_ADD			0x0
- #define BLENDFUNC_SUBTRACT		0x1
- #define BLENDFUNC_REVERSE_SUBTRACT	0x2
- #define BLENDFUNC_MIN			0x3
- #define BLENDFUNC_MAX			0x4
- #define BLENDFUNC_MASK			0x7
- 
- #define BLENDFACT_ZERO			0x01
- #define BLENDFACT_ONE			0x02
- #define BLENDFACT_SRC_COLR		0x03
- #define BLENDFACT_INV_SRC_COLR 		0x04
- #define BLENDFACT_SRC_ALPHA		0x05
- #define BLENDFACT_INV_SRC_ALPHA 	0x06
- #define BLENDFACT_DST_ALPHA		0x07
- #define BLENDFACT_INV_DST_ALPHA 	0x08
- #define BLENDFACT_DST_COLR		0x09
- #define BLENDFACT_INV_DST_COLR		0x0a
- #define BLENDFACT_SRC_ALPHA_SATURATE	0x0b
- #define BLENDFACT_CONST_COLOR		0x0c
- #define BLENDFACT_INV_CONST_COLOR	0x0d
- #define BLENDFACT_CONST_ALPHA		0x0e
- #define BLENDFACT_INV_CONST_ALPHA	0x0f
- #define BLENDFACT_MASK          	0x0f
- 
- #define STATE3D_MODES_4			(CMD_3D | (0x0d<<24))
- #define ENABLE_LOGIC_OP_FUNC		(1<<23)
- #define LOGIC_OP_FUNC(x)		((x)<<18)
- #define LOGICOP_MASK			(0xf<<18)
- #define MODE4_ENABLE_STENCIL_TEST_MASK	((1<<17)|(0xff00))
- #define ENABLE_STENCIL_TEST_MASK	(1<<17)
- #define STENCIL_TEST_MASK(x)		((x)<<8)
- #define MODE4_ENABLE_STENCIL_WRITE_MASK	((1<<16)|(0x00ff))
- #define ENABLE_STENCIL_WRITE_MASK	(1<<16)
- #define STENCIL_WRITE_MASK(x)		((x)&0xff)
- 
- #define LOGICOP_CLEAR			0
- #define LOGICOP_NOR			0x1
- #define LOGICOP_AND_INV 		0x2
- #define LOGICOP_COPY_INV		0x3
- #define LOGICOP_AND_RVRSE		0x4
- #define LOGICOP_INV			0x5
- #define LOGICOP_XOR			0x6
- #define LOGICOP_NAND			0x7
- #define LOGICOP_AND			0x8
- #define LOGICOP_EQUIV			0x9
- #define LOGICOP_NOOP			0xa
- #define LOGICOP_OR_INV			0xb
- #define LOGICOP_COPY			0xc
- #define LOGICOP_OR_RVRSE		0xd
- #define LOGICOP_OR			0xe
- #define LOGICOP_SET			0xf
- 
- #define STATE3D_COORD_SET_BINDINGS	(CMD_3D | (0x16<<24))
- #define CSB_TCB(iunit,eunit)		((eunit) << ((iunit) * 3))
- 
- #define STATE3D_SCISSOR_ENABLE		(CMD_3D | (0x1c<<24)|(0x10<<19))
- #define ENABLE_SCISSOR_RECT		((1<<1) | 1)
- #define DISABLE_SCISSOR_RECT		((1<<1) | 0)
- 
- #define STATE3D_MAP_STATE		(CMD_3D | (0x1d<<24)|(0x00<<16))
- 
- #define MS1_MAPMASK_SHIFT               0
- #define MS1_MAPMASK_MASK                (0x8fff<<0)
- 
- #define MS2_UNTRUSTED_SURFACE           (1<<31)
- #define MS2_ADDRESS_MASK                0xfffffffc
- #define MS2_VERTICAL_LINE_STRIDE        (1<<1)
- #define MS2_VERTICAL_OFFSET             (1<<1)
- 
- #define MS3_HEIGHT_SHIFT              21
- #define MS3_WIDTH_SHIFT               10
- #define MS3_PALETTE_SELECT            (1<<9)
- #define MS3_MAPSURF_FORMAT_SHIFT      7
- #define MS3_MAPSURF_FORMAT_MASK       (0x7<<7)
- #define    MAPSURF_8BIT		 	   (1<<7)
- #define    MAPSURF_16BIT		   (2<<7)
- #define    MAPSURF_32BIT		   (3<<7)
- #define    MAPSURF_422			   (5<<7)
- #define    MAPSURF_COMPRESSED		   (6<<7)
- #define    MAPSURF_4BIT_INDEXED		   (7<<7)
- #define MS3_MT_FORMAT_MASK         (0x7 << 3)
- #define MS3_MT_FORMAT_SHIFT        3
- #define    MT_4BIT_IDX_ARGB8888	           (7<<3) /* SURFACE_4BIT_INDEXED */
- #define    MT_8BIT_I8		           (0<<3) /* SURFACE_8BIT */
- #define    MT_8BIT_L8		           (1<<3)
- #define    MT_8BIT_A8		           (4<<3)
- #define    MT_8BIT_MONO8	           (5<<3)
- #define    MT_16BIT_RGB565 		   (0<<3) /* SURFACE_16BIT */
- #define    MT_16BIT_ARGB1555		   (1<<3)
- #define    MT_16BIT_ARGB4444		   (2<<3)
- #define    MT_16BIT_AY88		   (3<<3)
- #define    MT_16BIT_88DVDU	           (5<<3)
- #define    MT_16BIT_BUMP_655LDVDU	   (6<<3)
- #define    MT_16BIT_I16	                   (7<<3)
- #define    MT_16BIT_L16	                   (8<<3)
- #define    MT_16BIT_A16	                   (9<<3)
- #define    MT_32BIT_ARGB8888		   (0<<3) /* SURFACE_32BIT */
- #define    MT_32BIT_ABGR8888		   (1<<3)
- #define    MT_32BIT_XRGB8888		   (2<<3)
- #define    MT_32BIT_XBGR8888		   (3<<3)
- #define    MT_32BIT_QWVU8888		   (4<<3)
- #define    MT_32BIT_AXVU8888		   (5<<3)
- #define    MT_32BIT_LXVU8888	           (6<<3)
- #define    MT_32BIT_XLVU8888	           (7<<3)
- #define    MT_32BIT_ARGB2101010	           (8<<3)
- #define    MT_32BIT_ABGR2101010	           (9<<3)
- #define    MT_32BIT_AWVU2101010	           (0xA<<3)
- #define    MT_32BIT_GR1616	           (0xB<<3)
- #define    MT_32BIT_VU1616	           (0xC<<3)
- #define    MT_32BIT_xI824	           (0xD<<3)
- #define    MT_32BIT_xA824	           (0xE<<3)
- #define    MT_32BIT_xL824	           (0xF<<3)
- #define    MT_422_YCRCB_SWAPY	           (0<<3) /* SURFACE_422 */
- #define    MT_422_YCRCB_NORMAL	           (1<<3)
- #define    MT_422_YCRCB_SWAPUV	           (2<<3)
- #define    MT_422_YCRCB_SWAPUVY	           (3<<3)
- #define    MT_COMPRESS_DXT1		   (0<<3) /* SURFACE_COMPRESSED */
- #define    MT_COMPRESS_DXT2_3	           (1<<3)
- #define    MT_COMPRESS_DXT4_5	           (2<<3)
- #define    MT_COMPRESS_FXT1		   (3<<3)
- #define    MT_COMPRESS_DXT1_RGB		   (4<<3)
- #define MS3_USE_FENCE_REGS              (1<<2)
- #define MS3_TILED_SURFACE             (1<<1)
- #define MS3_TILE_WALK                 (1<<0)
- 
- #define MS4_PITCH_SHIFT                 21
- #define MS4_CUBE_FACE_ENA_NEGX          (1<<20)
- #define MS4_CUBE_FACE_ENA_POSX          (1<<19)
- #define MS4_CUBE_FACE_ENA_NEGY          (1<<18)
- #define MS4_CUBE_FACE_ENA_POSY          (1<<17)
- #define MS4_CUBE_FACE_ENA_NEGZ          (1<<16)
- #define MS4_CUBE_FACE_ENA_POSZ          (1<<15)
- #define MS4_CUBE_FACE_ENA_MASK          (0x3f<<15)
- #define MS4_MAX_LOD_SHIFT		9
- #define MS4_MAX_LOD_MASK		(0x3f<<9)
- #define MS4_MIP_LAYOUT_LEGACY           (0<<8)
- #define MS4_MIP_LAYOUT_BELOW_LPT        (0<<8)
- #define MS4_MIP_LAYOUT_RIGHT_LPT        (1<<8)
- #define MS4_VOLUME_DEPTH_SHIFT          0    
- #define MS4_VOLUME_DEPTH_MASK           (0xff<<0)
- 
- #define STATE3D_SAMPLER_STATE		(CMD_3D | (0x1d<<24)|(0x01<<16))
- 
- #define SS1_MAPMASK_SHIFT               0
- #define SS1_MAPMASK_MASK                (0x8fff<<0)
- 
- #define SS2_REVERSE_GAMMA_ENABLE        (1<<31)
- #define SS2_PLANAR_TO_PACKED_ENABLE     (1<<30)
- #define SS2_COLORSPACE_CONVERSION       (1<<29)
- #define SS2_CHROMAKEY_SHIFT             27
- #define SS2_BASE_MIP_LEVEL_SHIFT        22
- #define SS2_BASE_MIP_LEVEL_MASK         (0x1f<<22)
- #define SS2_MIP_FILTER_SHIFT            20
- #define SS2_MIP_FILTER_MASK             (0x3<<20)
- #define   MIPFILTER_NONE       	0
- #define   MIPFILTER_NEAREST	1
- #define   MIPFILTER_LINEAR	3
- #define SS2_MAG_FILTER_SHIFT          17
- #define SS2_MAG_FILTER_MASK           (0x7<<17)
- #define   FILTER_NEAREST	0
- #define   FILTER_LINEAR		1
- #define   FILTER_ANISOTROPIC	2
- #define   FILTER_4X4_1    	3
- #define   FILTER_4X4_2    	4
- #define   FILTER_4X4_FLAT 	5
- #define   FILTER_6X5_MONO   	6 /* XXX - check */
- #define SS2_MIN_FILTER_SHIFT          14
- #define SS2_MIN_FILTER_MASK           (0x7<<14)
- #define SS2_LOD_BIAS_SHIFT            5
- #define SS2_LOD_BIAS_ONE              (0x10<<5)
- #define SS2_LOD_BIAS_MASK             (0x1ff<<5)
- /* Shadow requires:
-  *  MT_X8{I,L,A}24 or MT_{I,L,A}16 texture format
-  *  FILTER_4X4_x  MIN and MAG filters
-  */
- #define SS2_SHADOW_ENABLE             (1<<4)
- #define SS2_MAX_ANISO_MASK            (1<<3)
- #define SS2_MAX_ANISO_2               (0<<3)
- #define SS2_MAX_ANISO_4               (1<<3)
- #define SS2_SHADOW_FUNC_SHIFT         0
- #define SS2_SHADOW_FUNC_MASK          (0x7<<0)
- /* SS2_SHADOW_FUNC values: see COMPAREFUNC_* */
- 
- #define SS3_MIN_LOD_SHIFT            24
- #define SS3_MIN_LOD_ONE              (0x10<<24)
- #define SS3_MIN_LOD_MASK             (0xff<<24)
- #define SS3_KILL_PIXEL_ENABLE        (1<<17)
- #define SS3_TCX_ADDR_MODE_SHIFT      12
- #define SS3_TCX_ADDR_MODE_MASK       (0x7<<12)
- #define   TEXCOORDMODE_WRAP		0
- #define   TEXCOORDMODE_MIRROR		1
- #define   TEXCOORDMODE_CLAMP_EDGE	2
- #define   TEXCOORDMODE_CUBE       	3
- #define   TEXCOORDMODE_CLAMP_BORDER	4
- #define   TEXCOORDMODE_MIRROR_ONCE      5
- #define SS3_TCY_ADDR_MODE_SHIFT      9
- #define SS3_TCY_ADDR_MODE_MASK       (0x7<<9)
- #define SS3_TCZ_ADDR_MODE_SHIFT      6
- #define SS3_TCZ_ADDR_MODE_MASK       (0x7<<6)
- #define SS3_NORMALIZED_COORDS        (1<<5)
- #define SS3_TEXTUREMAP_INDEX_SHIFT   1
- #define SS3_TEXTUREMAP_INDEX_MASK    (0xf<<1)
- #define SS3_DEINTERLACER_ENABLE      (1<<0)
- 
- #define SS4_BORDER_COLOR_MASK        (~0)
- 
- #define STATE3D_LOAD_STATE_IMMEDIATE_1	(CMD_3D | (0x1d<<24)|(0x04<<16))
- #define I1_LOAD_S(n)				(1 << (4 + n))
- 
- #define S0_VB_OFFSET_MASK              0xffffffc
- #define S0_AUTO_CACHE_INV_DISABLE      (1<<0)
- 
- #define S1_VERTEX_WIDTH_SHIFT          24
- #define S1_VERTEX_WIDTH_MASK           (0x3f<<24)
- #define S1_VERTEX_PITCH_SHIFT          16
- #define S1_VERTEX_PITCH_MASK           (0x3f<<16)
- 
- #define TEXCOORDFMT_2D                 0x0
- #define TEXCOORDFMT_3D                 0x1
- #define TEXCOORDFMT_4D                 0x2
- #define TEXCOORDFMT_1D                 0x3
- #define TEXCOORDFMT_2D_16              0x4
- #define TEXCOORDFMT_4D_16              0x5
- #define TEXCOORDFMT_NOT_PRESENT        0xf
- #define S2_TEXCOORD_FMT0_MASK            0xf
- #define S2_TEXCOORD_FMT1_SHIFT           4
- #define S2_TEXCOORD_FMT(unit, type)    ((type)<<(unit*4))
- #define S2_TEXCOORD_NONE               (~0)
- 
- /* S3 not interesting */
- 
- #define S4_POINT_WIDTH_SHIFT           23
- #define S4_POINT_WIDTH_MASK            (0x1ff<<23)
- #define S4_LINE_WIDTH_SHIFT            19
- #define S4_LINE_WIDTH_ONE              (0x2<<19)
- #define S4_LINE_WIDTH_MASK             (0xf<<19)
- #define S4_FLATSHADE_ALPHA             (1<<18)
- #define S4_FLATSHADE_FOG               (1<<17)
- #define S4_FLATSHADE_SPECULAR          (1<<16)
- #define S4_FLATSHADE_COLOR             (1<<15)
- #define S4_CULLMODE_BOTH	       (0<<13)
- #define S4_CULLMODE_NONE	       (1<<13)
- #define S4_CULLMODE_CW		       (2<<13)
- #define S4_CULLMODE_CCW		       (3<<13)
- #define S4_CULLMODE_MASK	       (3<<13)
- #define S4_VFMT_POINT_WIDTH            (1<<12)
- #define S4_VFMT_SPEC_FOG               (1<<11)
- #define S4_VFMT_COLOR                  (1<<10)
- #define S4_VFMT_DEPTH_OFFSET           (1<<9)
- #define S4_VFMT_XYZ     	       (1<<6)
- #define S4_VFMT_XYZW     	       (2<<6)
- #define S4_VFMT_XY     		       (3<<6)
- #define S4_VFMT_XYW     	       (4<<6)
- #define S4_VFMT_XYZW_MASK              (7<<6)
- #define S4_FORCE_DEFAULT_DIFFUSE       (1<<5)
- #define S4_FORCE_DEFAULT_SPECULAR      (1<<4)
- #define S4_LOCAL_DEPTH_OFFSET_ENABLE   (1<<3)
- #define S4_VFMT_FOG_PARAM              (1<<2)
- #define S4_SPRITE_POINT_ENABLE         (1<<1)
- #define S4_LINE_ANTIALIAS_ENABLE       (1<<0)
- 
- #define S4_VFMT_MASK (S4_VFMT_POINT_WIDTH   | 	\
- 		      S4_VFMT_SPEC_FOG      |	\
- 		      S4_VFMT_COLOR         |	\
- 		      S4_VFMT_DEPTH_OFFSET  |	\
- 		      S4_VFMT_XYZW_MASK     |	\
- 		      S4_VFMT_FOG_PARAM)
- 
- 
- #define S5_WRITEDISABLE_ALPHA          (1<<31)
- #define S5_WRITEDISABLE_RED            (1<<30)
- #define S5_WRITEDISABLE_GREEN          (1<<29)
- #define S5_WRITEDISABLE_BLUE           (1<<28)
- #define S5_WRITEDISABLE_MASK           (0xf<<28)
- #define S5_FORCE_DEFAULT_POINT_SIZE    (1<<27)
- #define S5_LAST_PIXEL_ENABLE           (1<<26)
- #define S5_GLOBAL_DEPTH_OFFSET_ENABLE  (1<<25)
- #define S5_FOG_ENABLE                  (1<<24)
- #define S5_STENCIL_REF_SHIFT           16
- #define S5_STENCIL_REF_MASK            (0xff<<16)
- #define S5_STENCIL_TEST_FUNC_SHIFT     13
- #define S5_STENCIL_TEST_FUNC_MASK      (0x7<<13)
- #define S5_STENCIL_FAIL_SHIFT          10
- #define S5_STENCIL_FAIL_MASK           (0x7<<10)
- #define S5_STENCIL_PASS_Z_FAIL_SHIFT   7
- #define S5_STENCIL_PASS_Z_FAIL_MASK    (0x7<<7)
- #define S5_STENCIL_PASS_Z_PASS_SHIFT   4
- #define S5_STENCIL_PASS_Z_PASS_MASK    (0x7<<4)
- #define S5_STENCIL_WRITE_ENABLE        (1<<3)
- #define S5_STENCIL_TEST_ENABLE         (1<<2)
- #define S5_COLOR_DITHER_ENABLE         (1<<1)
- #define S5_LOGICOP_ENABLE              (1<<0)
- 
- 
- #define S6_ALPHA_TEST_ENABLE           (1<<31)
- #define S6_ALPHA_TEST_FUNC_SHIFT       28
- #define S6_ALPHA_TEST_FUNC_MASK        (0x7<<28)
- #define S6_ALPHA_REF_SHIFT             20
- #define S6_ALPHA_REF_MASK              (0xff<<20)
- #define S6_DEPTH_TEST_ENABLE           (1<<19)
- #define S6_DEPTH_TEST_FUNC_SHIFT       16
- #define S6_DEPTH_TEST_FUNC_MASK        (0x7<<16)
- #define S6_CBUF_BLEND_ENABLE           (1<<15)
- #define S6_CBUF_BLEND_FUNC_SHIFT       12
- #define S6_CBUF_BLEND_FUNC_MASK        (0x7<<12)
- #define S6_CBUF_SRC_BLEND_FACT_SHIFT   8
- #define S6_CBUF_SRC_BLEND_FACT_MASK    (0xf<<8)
- #define S6_CBUF_DST_BLEND_FACT_SHIFT   4
- #define S6_CBUF_DST_BLEND_FACT_MASK    (0xf<<4)
- #define S6_DEPTH_WRITE_ENABLE          (1<<3)
- #define S6_COLOR_WRITE_ENABLE          (1<<2)
- #define S6_TRISTRIP_PV_SHIFT           0
- #define S6_TRISTRIP_PV_MASK            (0x3<<0)
- 
- #define S7_DEPTH_OFFSET_CONST_MASK     ~0
- 
- #define STATE3D_PIXEL_SHADER_PROGRAM	(CMD_3D | (0x1d<<24)|(0x05<<16))
- 
- #define REG_TYPE_R                 0 /* temporary regs, no need to
- 				      * dcl, must be written before
- 				      * read -- Preserved between
- 				      * phases. 
- 				      */
- #define REG_TYPE_T                 1 /* Interpolated values, must be
- 				      * dcl'ed before use.
- 				      *
- 				      * 0..7: texture coord,
- 				      * 8: diffuse spec,
- 				      * 9: specular color,
- 				      * 10: fog parameter in w.
- 				      */
- #define REG_TYPE_CONST             2 /* Restriction: only one const
- 				      * can be referenced per
- 				      * instruction, though it may be
- 				      * selected for multiple inputs.
- 				      * Constants not initialized
- 				      * default to zero.
- 				      */
- #define REG_TYPE_S                 3 /* sampler */
- #define REG_TYPE_OC                4 /* output color (rgba) */
- #define REG_TYPE_OD                5 /* output depth (w), xyz are
- 				      * temporaries.  If not written,
- 				      * interpolated depth is used?
- 				      */
- #define REG_TYPE_U                 6 /* unpreserved temporaries */
- #define REG_TYPE_MASK              0x7
- #define REG_NR_MASK                0xf
- 
- 
- /* REG_TYPE_T:
-  */
- #define T_TEX0     0
- #define T_TEX1     1
- #define T_TEX2     2
- #define T_TEX3     3
- #define T_TEX4     4
- #define T_TEX5     5
- #define T_TEX6     6
- #define T_TEX7     7
- #define T_DIFFUSE  8
- #define T_SPECULAR 9
- #define T_FOG_W    10		/* interpolated fog is in W coord */
- 
- /* Arithmetic instructions */
- 
- /* .replicate_swizzle == selection and replication of a particular
-  * scalar channel, ie., .xxxx, .yyyy, .zzzz or .wwww 
-  */
- #define A0_NOP    (0x0<<24)		/* no operation */
- #define A0_ADD    (0x1<<24)		/* dst = src0 + src1 */
- #define A0_MOV    (0x2<<24)		/* dst = src0 */
- #define A0_MUL    (0x3<<24)		/* dst = src0 * src1 */
- #define A0_MAD    (0x4<<24)		/* dst = src0 * src1 + src2 */
- #define A0_DP2ADD (0x5<<24)		/* dst.xyzw = src0.xy dot src1.xy + src2.replicate_swizzle */
- #define A0_DP3    (0x6<<24)		/* dst.xyzw = src0.xyz dot src1.xyz */
- #define A0_DP4    (0x7<<24)		/* dst.xyzw = src0.xyzw dot src1.xyzw */
- #define A0_FRC    (0x8<<24)		/* dst = src0 - floor(src0) */
- #define A0_RCP    (0x9<<24)		/* dst.xyzw = 1/(src0.replicate_swizzle) */
- #define A0_RSQ    (0xa<<24)		/* dst.xyzw = 1/(sqrt(abs(src0.replicate_swizzle))) */
- #define A0_EXP    (0xb<<24)		/* dst.xyzw = exp2(src0.replicate_swizzle) */
- #define A0_LOG    (0xc<<24)		/* dst.xyzw = log2(abs(src0.replicate_swizzle)) */
- #define A0_CMP    (0xd<<24)		/* dst = (src0 >= 0.0) ? src1 : src2 */
- #define A0_MIN    (0xe<<24)		/* dst = (src0 < src1) ? src0 : src1 */
- #define A0_MAX    (0xf<<24)		/* dst = (src0 >= src1) ? src0 : src1 */
- #define A0_FLR    (0x10<<24)		/* dst = floor(src0) */
- #define A0_MOD    (0x11<<24)		/* dst = src0 fmod 1.0 */
- #define A0_TRC    (0x12<<24)		/* dst = int(src0) */
- #define A0_SGE    (0x13<<24)		/* dst = src0 >= src1 ? 1.0 : 0.0 */
- #define A0_SLT    (0x14<<24)		/* dst = src0 < src1 ? 1.0 : 0.0 */
- #define A0_DEST_SATURATE                 (1<<22)
- #define A0_DEST_TYPE_SHIFT                19
- /* Allow: R, OC, OD, U */
- #define A0_DEST_NR_SHIFT                 14
- /* Allow R: 0..15, OC,OD: 0..0, U: 0..2 */
- #define A0_DEST_CHANNEL_X                (1<<10)
- #define A0_DEST_CHANNEL_Y                (2<<10)
- #define A0_DEST_CHANNEL_Z                (4<<10)
- #define A0_DEST_CHANNEL_W                (8<<10)
- #define A0_DEST_CHANNEL_ALL              (0xf<<10)
- #define A0_DEST_CHANNEL_SHIFT            10
- #define A0_SRC0_TYPE_SHIFT               7
- #define A0_SRC0_NR_SHIFT                 2
- 
- #define A0_DEST_CHANNEL_XY              (A0_DEST_CHANNEL_X|A0_DEST_CHANNEL_Y)
- #define A0_DEST_CHANNEL_XYZ             (A0_DEST_CHANNEL_XY|A0_DEST_CHANNEL_Z)
- 
- 
- #define SRC_X        0
- #define SRC_Y        1
- #define SRC_Z        2
- #define SRC_W        3
- #define SRC_ZERO     4
- #define SRC_ONE      5
- 
- #define A1_SRC0_CHANNEL_X_NEGATE         (1<<31)
- #define A1_SRC0_CHANNEL_X_SHIFT          28
- #define A1_SRC0_CHANNEL_Y_NEGATE         (1<<27)
- #define A1_SRC0_CHANNEL_Y_SHIFT          24
- #define A1_SRC0_CHANNEL_Z_NEGATE         (1<<23)
- #define A1_SRC0_CHANNEL_Z_SHIFT          20
- #define A1_SRC0_CHANNEL_W_NEGATE         (1<<19)
- #define A1_SRC0_CHANNEL_W_SHIFT          16
- #define A1_SRC1_TYPE_SHIFT               13
- #define A1_SRC1_NR_SHIFT                 8
- #define A1_SRC1_CHANNEL_X_NEGATE         (1<<7)
- #define A1_SRC1_CHANNEL_X_SHIFT          4
- #define A1_SRC1_CHANNEL_Y_NEGATE         (1<<3)
- #define A1_SRC1_CHANNEL_Y_SHIFT          0
- 
- #define A2_SRC1_CHANNEL_Z_NEGATE         (1<<31)
- #define A2_SRC1_CHANNEL_Z_SHIFT          28
- #define A2_SRC1_CHANNEL_W_NEGATE         (1<<27)
- #define A2_SRC1_CHANNEL_W_SHIFT          24
- #define A2_SRC2_TYPE_SHIFT               21
- #define A2_SRC2_NR_SHIFT                 16
- #define A2_SRC2_CHANNEL_X_NEGATE         (1<<15)
- #define A2_SRC2_CHANNEL_X_SHIFT          12
- #define A2_SRC2_CHANNEL_Y_NEGATE         (1<<11)
- #define A2_SRC2_CHANNEL_Y_SHIFT          8
- #define A2_SRC2_CHANNEL_Z_NEGATE         (1<<7)
- #define A2_SRC2_CHANNEL_Z_SHIFT          4
- #define A2_SRC2_CHANNEL_W_NEGATE         (1<<3)
- #define A2_SRC2_CHANNEL_W_SHIFT          0
- 
- 
- 
- /* Texture instructions */
- #define T0_TEXLD     (0x15<<24)	/* Sample texture using predeclared
- 				 * sampler and address, and output
- 				 * filtered texel data to destination
- 				 * register */
- #define T0_TEXLDP    (0x16<<24)	/* Same as texld but performs a
- 				 * perspective divide of the texture
- 				 * coordinate .xyz values by .w before
- 				 * sampling. */
- #define T0_TEXLDB    (0x17<<24)	/* Same as texld but biases the
- 				 * computed LOD by w.  Only S4.6 two's
- 				 * comp is used.  This implies that a
- 				 * float to fixed conversion is
- 				 * done. */
- #define T0_TEXKILL   (0x18<<24)	/* Does not perform a sampling
- 				 * operation.  Simply kills the pixel
- 				 * if any channel of the address
- 				 * register is < 0.0. */
- #define T0_DEST_TYPE_SHIFT                19
- /* Allow: R, OC, OD, U */
- /* Note: U (unpreserved) regs do not retain their values between
-  * phases (cannot be used for feedback) 
-  *
-  * Note: oC and OD registers can only be used as the destination of a
-  * texture instruction once per phase (this is an implementation
-  * restriction). 
-  */
- #define T0_DEST_NR_SHIFT                 14
- /* Allow R: 0..15, OC,OD: 0..0, U: 0..2 */
- #define T0_SAMPLER_NR_SHIFT              0 /* This field ignored for TEXKILL */
- #define T0_SAMPLER_NR_MASK               (0xf<<0)
- 
- #define T1_ADDRESS_REG_TYPE_SHIFT        24 /* Reg to use as texture coord */
- /* Allow R, T, OC, OD -- R, OC, OD are 'dependent' reads, new program phase */
- #define T1_ADDRESS_REG_NR_SHIFT          17
- #define T2_MBZ                           0
- 
- /* Declaration instructions */
- #define D0_DCL       (0x19<<24)	/* Declare a t (interpolated attrib)
- 				 * register or an s (sampler)
- 				 * register. */
- #define D0_SAMPLE_TYPE_SHIFT              22
- #define D0_SAMPLE_TYPE_2D                 (0x0<<22)
- #define D0_SAMPLE_TYPE_CUBE               (0x1<<22)
- #define D0_SAMPLE_TYPE_VOLUME             (0x2<<22)
- #define D0_SAMPLE_TYPE_MASK               (0x3<<22)
- 
- #define D0_TYPE_SHIFT                19
- /* Allow: T, S */
- #define D0_NR_SHIFT                  14
- /* Allow T: 0..10, S: 0..15 */
- #define D0_CHANNEL_X                (1<<10)
- #define D0_CHANNEL_Y                (2<<10)
- #define D0_CHANNEL_Z                (4<<10)
- #define D0_CHANNEL_W                (8<<10)
- #define D0_CHANNEL_ALL              (0xf<<10)
- #define D0_CHANNEL_NONE             (0<<10)
- 
- #define D0_CHANNEL_XY               (D0_CHANNEL_X|D0_CHANNEL_Y)
- #define D0_CHANNEL_XYZ              (D0_CHANNEL_XY|D0_CHANNEL_Z)
- /* End description of STATE3D_PIXEL_SHADER_PROGRAM */
- 
- #define STATE3D_PIXEL_SHADER_CONSTANTS	(CMD_3D | (0x1d<<24)|(0x06<<16))
- 
- #define STATE3D_DRAWING_RECTANGLE	(CMD_3D | (0x1d<<24)|(0x80<<16)|3)
- 
- #define STATE3D_SCISSOR_RECTANGLE	(CMD_3D | (0x1d<<24)|(0x81<<16)|1)
- 
- #define STATE3D_STIPPLE			(CMD_3D | (0x1d<<24)|(0x83<<16))
- #define ST1_ENABLE               (1<<16)
- #define ST1_MASK                 (0xffff)
- 
- #define STATE3D_DEST_BUFFER_VARIABLES	(CMD_3D | (0x1d<<24)|(0x85<<16))
- #define TEX_DEFAULT_COLOR_OGL           (0<<30)
- #define TEX_DEFAULT_COLOR_D3D           (1<<30)
- #define ZR_EARLY_DEPTH                  (1<<29)
- #define LOD_PRECLAMP_OGL                (1<<28)
- #define LOD_PRECLAMP_D3D                (0<<28)
- #define DITHER_FULL_ALWAYS              (0<<26)
- #define DITHER_FULL_ON_FB_BLEND         (1<<26)
- #define DITHER_CLAMPED_ALWAYS           (2<<26)
- #define LINEAR_GAMMA_BLEND_32BPP        (1<<25)
- #define DEBUG_DISABLE_ENH_DITHER        (1<<24)
- #define DSTORG_HORIZ_BIAS(x)		((x)<<20)
- #define DSTORG_VERT_BIAS(x)		((x)<<16)
- #define COLOR_4_2_2_CHNL_WRT_ALL	0
- #define COLOR_4_2_2_CHNL_WRT_Y		(1<<12)
- #define COLOR_4_2_2_CHNL_WRT_CR		(2<<12)
- #define COLOR_4_2_2_CHNL_WRT_CB		(3<<12)
- #define COLOR_4_2_2_CHNL_WRT_CRCB	(4<<12)
- #define COLR_BUF_8BIT			0
- #define COLR_BUF_RGB555 		(1<<8)
- #define COLR_BUF_RGB565 		(2<<8)
- #define COLR_BUF_ARGB8888		(3<<8)
- #define DEPTH_FRMT_16_FIXED		0
- #define DEPTH_FRMT_16_FLOAT		(1<<2)
- #define DEPTH_FRMT_24_FIXED_8_OTHER	(2<<2)
- #define VERT_LINE_STRIDE_1		(1<<1)
- #define VERT_LINE_STRIDE_0		(0<<1)
- #define VERT_LINE_STRIDE_OFS_1		1
- #define VERT_LINE_STRIDE_OFS_0		0
- 
- #define STATE3D_CONST_BLEND_COLOR	(CMD_3D | (0x1d<<24)|(0x88<<16))
- 
  #define STATE3D_FOG_MODE		((3<<29)|(0x1d<<24)|(0x89<<16)|2)
  #define FOG_MODE_VERTEX 		(1<<31)
--#define STATE3D_MAP_COORD_TRANSFORM	((3<<29)|(0x1d<<24)|(0x8c<<16))
- 
- #define STATE3D_BUFFER_INFO		(CMD_3D | (0x1d<<24)|(0x8e<<16)|1)
- #define BUFFERID_COLOR_BACK		(3 << 24)
- #define BUFFERID_COLOR_AUX		(4 << 24)
- #define BUFFERID_MC_INTRA_CORR		(5 << 24)
- #define BUFFERID_DEPTH			(7 << 24)
- #define BUFFER_USE_FENCES		(1 << 23)
- 
- #define STATE3D_DFLT_Z_CMD		(CMD_3D | (0x1d<<24)|(0x98<<16))
- 
- #define STATE3D_DFLT_DIFFUSE_CMD	(CMD_3D | (0x1d<<24)|(0x99<<16))
- 
- #define STATE3D_DFLT_SPEC_CMD		(CMD_3D | (0x1d<<24)|(0x9a<<16))
- 
- #define PRIMITIVE3D			(CMD_3D | (0x1f<<24))
- #define PRIM3D_INLINE		(0<<23)
- #define PRIM3D_INDIRECT		(1<<23)
- #define PRIM3D_TRILIST		(0x0<<18)
- #define PRIM3D_TRISTRIP 	(0x1<<18)
- #define PRIM3D_TRISTRIP_RVRSE	(0x2<<18)
- #define PRIM3D_TRIFAN		(0x3<<18)
- #define PRIM3D_POLY		(0x4<<18)
- #define PRIM3D_LINELIST 	(0x5<<18)
- #define PRIM3D_LINESTRIP	(0x6<<18)
- #define PRIM3D_RECTLIST 	(0x7<<18)
- #define PRIM3D_POINTLIST	(0x8<<18)
- #define PRIM3D_DIB		(0x9<<18)
- #define PRIM3D_CLEAR_RECT	(0xa<<18)
- #define PRIM3D_ZONE_INIT	(0xd<<18)
- #define PRIM3D_MASK		(0x1f<<18)
- 
 +
  #define DISABLE_TEX_TRANSFORM		(1<<28)
  #define TEXTURE_SET(x)			(x<<29)
 -#define STATE3D_RASTERIZATION_RULES	((3<<29)|(0x07<<24))
 -#define POINT_RASTER_ENABLE		(1<<15)
 -#define POINT_RASTER_OGL		(1<<13)
 +
  #define STATE3D_VERTEX_TRANSFORM	((3<<29)|(0x1d<<24)|(0x8b<<16))
  #define DISABLE_VIEWPORT_TRANSFORM	(1<<31)
  #define DISABLE_PERSPECTIVE_DIVIDE	(1<<29)
diff --cc src/i830_video.c
index 37dcaa7,a608a7e..044d6c1
@@@ -77,6 -77,6 +77,7 @@@
  #include "regionstr.h"
  #include "randrstr.h"
  #include "i830.h"
++#include "i830_video.h"
  #include "xf86xv.h"
  #include <X11/extensions/Xv.h>
  #include "xaa.h"
@@@ -369,46 -360,45 +370,6 @@@
     CARD16 RESERVEDG[0x100 / 2 - N_HORIZ_UV_TAPS * N_PHASES];
  } I830OverlayRegRec, *I830OverlayRegPtr;
  
--typedef struct {
--   CARD32 YBuf0offset;
--   CARD32 UBuf0offset;
--   CARD32 VBuf0offset;
--
--   CARD32 YBuf1offset;
--   CARD32 UBuf1offset;
--   CARD32 VBuf1offset;
--
--   unsigned char currentBuf;
--
--   int brightness;
--   int contrast;
--   int pipe;
--   int doubleBuffer;
--
--   RegionRec clip;
--   CARD32 colorKey;
--
--   CARD32 gamma0;
--   CARD32 gamma1;
--   CARD32 gamma2;
--   CARD32 gamma3;
--   CARD32 gamma4;
--   CARD32 gamma5;
--
--   CARD32 videoStatus;
--   Time offTime;
--   Time freeTime;
--   FBLinearPtr linear;
--
--   Bool overlayOK;
--   int oneLineMode;
--   int scaleRatio;
-    Bool textured;
--} I830PortPrivRec, *I830PortPrivPtr;
--
--#define GET_PORT_PRIVATE(pScrn) \
--   (I830PortPrivPtr)((I830PTR(pScrn))->adaptor->pPortPrivates[0].ptr)
--
  #if VIDEO_DEBUG
  static void
  CompareOverlay(I830Ptr pI830, CARD32 * overlay, int size)
diff --cc src/i830_video.h
index 0000000,0000000..9e11641
new file mode 100644
@@@ -1,0 -1,0 +1,76 @@@
++/***************************************************************************
++ 
++Copyright 2000 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 INTEL, 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 "xf86.h"
++#include "xf86_OSproc.h"
++
++typedef struct {
++   CARD32 YBuf0offset;
++   CARD32 UBuf0offset;
++   CARD32 VBuf0offset;
++
++   CARD32 YBuf1offset;
++   CARD32 UBuf1offset;
++   CARD32 VBuf1offset;
++
++   unsigned char currentBuf;
++
++   int brightness;
++   int contrast;
++   int pipe;
++   int doubleBuffer;
++
++   RegionRec clip;
++   CARD32 colorKey;
++
++   CARD32 gamma0;
++   CARD32 gamma1;
++   CARD32 gamma2;
++   CARD32 gamma3;
++   CARD32 gamma4;
++   CARD32 gamma5;
++
++   CARD32 videoStatus;
++   Time offTime;
++   Time freeTime;
++   FBLinearPtr linear;
++
++   Bool overlayOK;
++   int oneLineMode;
++   int scaleRatio;
++   Bool textured;
++} I830PortPrivRec, *I830PortPrivPtr;
++
++#define GET_PORT_PRIVATE(pScrn) \
++   (I830PortPrivPtr)((I830PTR(pScrn))->adaptor->pPortPrivates[0].ptr)
++
++void I915DisplayVideoTextured(ScrnInfoPtr pScrn, I830PortPrivPtr pPriv,
++			      int id, RegionPtr dstRegion, short width,
++			      short height, int video_pitch,
++			      int x1, int y1, int x2, int y2,
++			      short src_w, short src_h,
++			      short drw_w, short drw_h,
++			      DrawablePtr pDraw);
diff --cc src/i915_video.c
index 0000000,0000000..8d687a1
new file mode 100644
@@@ -1,0 -1,0 +1,538 @@@
++/*
++ * Copyright © 2006 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 at anholt.net>
++ *
++ */
++
++#ifdef HAVE_CONFIG_H
++#include "config.h"
++#endif
++
++#include "xf86.h"
++#include "xf86_OSproc.h"
++#include "xf86xv.h"
++#include "fourcc.h"
++
++#include "i830.h"
++#include "i830_video.h"
++#include "i915_reg.h"
++
++union intfloat {
++   CARD32 ui;
++   float f;
++};
++
++#define OUT_RING_F(x) do {						\
++   union intfloat _tmp;							\
++   _tmp.f = x;								\
++   OUT_RING(_tmp.ui);							\
++} while (0)
++
++#define OUT_DCL(type, nr) do {						\
++   CARD32 chans = 0;							\
++   if (REG_TYPE_##type == REG_TYPE_T)					\
++      chans = D0_CHANNEL_ALL;						\
++   else if (REG_TYPE_##type != REG_TYPE_S)				\
++      FatalError("wrong reg type %d to declare\n", REG_TYPE_##type);	\
++   OUT_RING(D0_DCL |							\
++	    (REG_TYPE_##type << D0_TYPE_SHIFT) | (nr << D0_NR_SHIFT) |	\
++	    chans);							\
++   OUT_RING(0x00000000);						\
++   OUT_RING(0x00000000);						\
++} while (0)
++
++#define OUT_TEXLD(dest_type, dest_nr, sampler_nr, addr_type, addr_nr)	\
++do {									\
++      OUT_RING(T0_TEXLD |						\
++	       (REG_TYPE_##dest_type << T0_DEST_TYPE_SHIFT) |		\
++	       (dest_nr << T0_DEST_NR_SHIFT) |				\
++	       (sampler_nr << T0_SAMPLER_NR_SHIFT));			\
++      OUT_RING((REG_TYPE_##addr_type << T1_ADDRESS_REG_TYPE_SHIFT) |	\
++	       (addr_nr << T1_ADDRESS_REG_NR_SHIFT));			\
++      OUT_RING(0x00000000);						\
++} while (0)
++
++/* Move the dest_chan from src0 to dest, leaving the other channels alone */
++#define OUT_MOV_TO_CHANNEL(dest_type, dest_nr, src0_type, src0_nr,	\
++			   dest_chan)					\
++do {									\
++   OUT_RING(A0_MOV | A0_DEST_CHANNEL_##dest_chan |			\
++	    (REG_TYPE_##dest_type << A0_DEST_TYPE_SHIFT) |		\
++	    (dest_nr << A0_DEST_NR_SHIFT) |				\
++	    (REG_TYPE_##src0_type << A0_SRC0_TYPE_SHIFT) |		\
++	    (src0_nr << A0_SRC0_NR_SHIFT));				\
++   OUT_RING((SRC_X << A1_SRC0_CHANNEL_X_SHIFT) |			\
++	    (SRC_Y << A1_SRC0_CHANNEL_Y_SHIFT) |			\
++	    (SRC_Z << A1_SRC0_CHANNEL_Z_SHIFT) |			\
++	    (SRC_W << A1_SRC0_CHANNEL_W_SHIFT));			\
++   OUT_RING(0);								\
++} while (0)
++
++/* Dot3-product src0 and src1, storing the result in dest_chan of the dest.
++ * Saturates, in case we have out-of-range YUV values.
++ */
++#define OUT_DP3_TO_CHANNEL(dest_type, dest_nr, src0_type, src0_nr,	\
++			   src1_type, src1_nr, dest_chan)		\
++do {									\
++   OUT_RING(A0_DP3 | A0_DEST_CHANNEL_##dest_chan | A0_DEST_SATURATE |	\
++	    (REG_TYPE_##dest_type << A0_DEST_TYPE_SHIFT) |		\
++	    (dest_nr << A0_DEST_NR_SHIFT) |				\
++	    (REG_TYPE_##src0_type << A0_SRC0_TYPE_SHIFT) |		\
++	    (src0_nr << A0_SRC0_NR_SHIFT));				\
++   OUT_RING((SRC_X << A1_SRC0_CHANNEL_X_SHIFT) |			\
++	    (SRC_Y << A1_SRC0_CHANNEL_Y_SHIFT) |			\
++	    (SRC_Z << A1_SRC0_CHANNEL_Z_SHIFT) |			\
++	    (SRC_W << A1_SRC0_CHANNEL_W_SHIFT) |			\
++	    (REG_TYPE_##src1_type << A1_SRC1_TYPE_SHIFT) |		\
++	    (src1_nr << A1_SRC1_TYPE_SHIFT) |				\
++	    (SRC_X << A1_SRC1_CHANNEL_X_SHIFT) |			\
++	    (SRC_Y << A1_SRC1_CHANNEL_Y_SHIFT));			\
++   OUT_RING((SRC_Z << A2_SRC1_CHANNEL_Z_SHIFT) |			\
++	    (SRC_W << A2_SRC1_CHANNEL_W_SHIFT));			\
++} while (0)
++
++void
++I915DisplayVideoTextured(ScrnInfoPtr pScrn, I830PortPrivPtr pPriv, int id,
++			 RegionPtr dstRegion,
++			 short width, short height, int video_pitch,
++			 int x1, int y1, int x2, int y2,
++			 short src_w, short src_h, short drw_w, short drw_h,
++			 DrawablePtr pDraw)
++{
++   I830Ptr pI830 = I830PTR(pScrn);
++   CARD32 format, ms3, s2;
++   BoxPtr pbox;
++   int nbox, dxo, dyo;
++   Bool planar;
++
++   ErrorF("I915DisplayVideo: %dx%d (pitch %d)\n", width, height,
++	  video_pitch);
++
++   switch (id) {
++   case FOURCC_UYVY:
++   case FOURCC_YUY2:
++      planar = FALSE;
++      break;
++   case FOURCC_YV12:
++   case FOURCC_I420:
++      planar = TRUE;
++      break;
++   default:
++      ErrorF("Unknown format 0x%x\n", id);
++      planar = FALSE;
++      break;
++   }
++
++   /* Tell the rotation code that we have stomped its invariant state by
++    * setting a high bit.  We don't use any invariant 3D state for video, so we
++    * don't have to worry about it ourselves.
++    */
++   *pI830->used3D |= 1 << 30;
++
++   BEGIN_LP_RING(44);
++
++   /* invarient state */
++   OUT_RING(MI_NOOP);
++   OUT_RING(_3DSTATE_AA_CMD |
++	    AA_LINE_ECAAR_WIDTH_ENABLE | AA_LINE_ECAAR_WIDTH_1_0 |
++	    AA_LINE_REGION_WIDTH_ENABLE | AA_LINE_REGION_WIDTH_1_0);
++
++   OUT_RING(_3DSTATE_DFLT_DIFFUSE_CMD);
++   OUT_RING(0x00000000);
++
++   OUT_RING(_3DSTATE_DFLT_SPEC_CMD);
++   OUT_RING(0x00000000);
++
++   OUT_RING(_3DSTATE_DFLT_Z_CMD);
++   OUT_RING(0x00000000);
++
++   OUT_RING(_3DSTATE_COORD_SET_BINDINGS | CSB_TCB(0, 0) | CSB_TCB(1, 1) |
++	    CSB_TCB(2,2) | CSB_TCB(3,3) | CSB_TCB(4,4) | CSB_TCB(5,5) |
++	    CSB_TCB(6,6) | CSB_TCB(7,7));
++
++   OUT_RING(_3DSTATE_RASTER_RULES_CMD |
++	    ENABLE_TRI_FAN_PROVOKE_VRTX | TRI_FAN_PROVOKE_VRTX(2) |
++	    ENABLE_LINE_STRIP_PROVOKE_VRTX | LINE_STRIP_PROVOKE_VRTX(1) |
++	    ENABLE_TEXKILL_3D_4D | TEXKILL_4D |
++	    ENABLE_POINT_RASTER_RULE | OGL_POINT_RASTER_RULE);
++
++   OUT_RING(_3DSTATE_LOAD_STATE_IMMEDIATE_1 | I1_LOAD_S(3) | 1);
++   OUT_RING(0x00000000); /* texture coordinate wrap */
++
++   /* flush map & render cache */
++   OUT_RING(MI_FLUSH | MI_WRITE_DIRTY_STATE | MI_INVALIDATE_MAP_CACHE);
++   OUT_RING(0x00000000);
++
++   /* draw rect -- just clipping */
++   OUT_RING(_3DSTATE_DRAW_RECT_CMD);
++   OUT_RING(0x00000000);	/* flags */
++   OUT_RING(0x00000000);	/* ymin, xmin */
++   OUT_RING((pScrn->virtualX - 1) |
++	    (pScrn->virtualY - 1) << 16); /* ymax, xmax */
++   OUT_RING(0x00000000);	/* yorigin, xorigin */
++   OUT_RING(MI_NOOP);
++
++   /* scissor */
++   OUT_RING(_3DSTATE_SCISSOR_ENABLE_CMD | DISABLE_SCISSOR_RECT);
++   OUT_RING(_3DSTATE_SCISSOR_RECT_0_CMD);
++   OUT_RING(0x00000000);	/* ymin, xmin */
++   OUT_RING(0x00000000);	/* ymax, xmax */
++
++   OUT_RING(0x7c000003);	/* unknown command */
++   OUT_RING(0x7d070000);
++   OUT_RING(0x00000000);
++   OUT_RING(0x68000002);
++
++   /* context setup */
++   OUT_RING(_3DSTATE_MODES_4_CMD |
++	    ENABLE_LOGIC_OP_FUNC | LOGIC_OP_FUNC(LOGICOP_COPY) |
++	    ENABLE_STENCIL_WRITE_MASK | STENCIL_WRITE_MASK(0xff) |
++	    ENABLE_STENCIL_TEST_MASK | STENCIL_TEST_MASK(0xff));
++
++   OUT_RING(_3DSTATE_LOAD_STATE_IMMEDIATE_1 | I1_LOAD_S(2) |
++	    I1_LOAD_S(4) | I1_LOAD_S(5) | I1_LOAD_S(6) | 4);
++   s2 = S2_TEXCOORD_FMT(0, TEXCOORDFMT_2D);
++   if (planar)
++      s2 |= S2_TEXCOORD_FMT(1, TEXCOORDFMT_2D);
++   else
++      s2 |= S2_TEXCOORD_FMT(1, TEXCOORDFMT_NOT_PRESENT);
++   s2 |= S2_TEXCOORD_FMT(2, TEXCOORDFMT_NOT_PRESENT) |
++      S2_TEXCOORD_FMT(3, TEXCOORDFMT_NOT_PRESENT) |
++      S2_TEXCOORD_FMT(4, TEXCOORDFMT_NOT_PRESENT) |
++      S2_TEXCOORD_FMT(5, TEXCOORDFMT_NOT_PRESENT) |
++      S2_TEXCOORD_FMT(6, TEXCOORDFMT_NOT_PRESENT) |
++      S2_TEXCOORD_FMT(7, TEXCOORDFMT_NOT_PRESENT);
++   OUT_RING(s2);
++   OUT_RING((1 << S4_POINT_WIDTH_SHIFT) | S4_LINE_WIDTH_ONE |
++	    S4_CULLMODE_NONE | S4_VFMT_XY);
++   OUT_RING(0x00000000); /* S5 - enable bits */
++   OUT_RING((2 << S6_DEPTH_TEST_FUNC_SHIFT) |
++	    (2 << S6_CBUF_SRC_BLEND_FACT_SHIFT) |
++	    (1 << S6_CBUF_DST_BLEND_FACT_SHIFT) | S6_COLOR_WRITE_ENABLE |
++	    (2 << S6_TRISTRIP_PV_SHIFT));
++
++   OUT_RING(_3DSTATE_INDEPENDENT_ALPHA_BLEND_CMD |
++	    IAB_MODIFY_ENABLE |
++	    IAB_MODIFY_FUNC | (BLENDFUNC_ADD << IAB_FUNC_SHIFT) |
++	    IAB_MODIFY_SRC_FACTOR | (BLENDFACT_ONE << IAB_SRC_FACTOR_SHIFT) |
++	    IAB_MODIFY_DST_FACTOR | (BLENDFACT_ZERO << IAB_DST_FACTOR_SHIFT));
++
++   OUT_RING(_3DSTATE_CONST_BLEND_COLOR_CMD);
++   OUT_RING(0x00000000);
++
++   OUT_RING(_3DSTATE_DST_BUF_VARS_CMD);
++   if (pI830->cpp == 2)
++      format = COLR_BUF_RGB565;
++   else
++      format = COLR_BUF_ARGB8888 | DEPTH_FRMT_24_FIXED_8_OTHER;
++
++   OUT_RING(LOD_PRECLAMP_OGL |
++     DSTORG_HORT_BIAS(0x80) | DSTORG_VERT_BIAS(0x80) | format);
++
++   OUT_RING(_3DSTATE_STIPPLE);
++   OUT_RING(0x00000000);
++
++   /* front buffer, pitch, offset */
++   OUT_RING(_3DSTATE_BUF_INFO_CMD);
++   OUT_RING(BUF_3D_ID_COLOR_BACK | BUF_3D_USE_FENCE |
++	    (((pI830->displayWidth * pI830->cpp) / 4) << 2));
++   OUT_RING(pI830->bufferOffset);
++   ADVANCE_LP_RING();
++
++   if (!planar) {
++      BEGIN_LP_RING(20);
++      /* fragment program - texture blend replace. */
++      OUT_RING(_3DSTATE_PIXEL_SHADER_PROGRAM | 8);
++      OUT_DCL(S, 0);
++      OUT_DCL(T, 0);
++      OUT_TEXLD(OC, 0, 0, T, 0);
++      /* End fragment program */
++
++      OUT_RING(_3DSTATE_SAMPLER_STATE | 3);
++      OUT_RING(0x00000001);
++      OUT_RING(SS2_COLORSPACE_CONVERSION |
++	       (FILTER_LINEAR << SS2_MAG_FILTER_SHIFT) |
++	       (FILTER_LINEAR << SS2_MIN_FILTER_SHIFT));
++      OUT_RING((TEXCOORDMODE_CLAMP_EDGE << SS3_TCX_ADDR_MODE_SHIFT) |
++	       (TEXCOORDMODE_CLAMP_EDGE << SS3_TCY_ADDR_MODE_SHIFT));
++      OUT_RING(0x00000000);
++
++      OUT_RING(_3DSTATE_MAP_STATE | 3);
++      OUT_RING(0x00000001);	/* texture map #1 */
++      OUT_RING(pPriv->YBuf0offset);
++      ms3 = MAPSURF_422;
++      switch (id) {
++      case FOURCC_YUY2:
++	 ms3 |= MT_422_YCRCB_NORMAL;
++	 break;
++      case FOURCC_UYVY:
++	 ms3 |= MT_422_YCRCB_SWAPY;
++	 break;
++      }
++      ms3 |= (height - 1) << MS3_HEIGHT_SHIFT;
++      ms3 |= (width - 1) << MS3_WIDTH_SHIFT;
++      if (!pI830->disableTiling)
++	 ms3 |= MS3_USE_FENCE_REGS;
++      OUT_RING(ms3);
++      OUT_RING(((video_pitch / 4) - 1) << 21);
++      ADVANCE_LP_RING();
++   } else {
++      BEGIN_LP_RING(1 + 18 + (1 + 3*16) + 11 + 11);
++      OUT_RING(MI_NOOP);
++      /* For the planar formats, we set up three samplers -- one for each plane,
++       * in a Y8 format.  Because I couldn't get the special PLANAR_TO_PACKED
++       * shader setup to work, I did the manual pixel shader:
++       *
++       * y' = y - .0625
++       * u' = u - .5
++       * v' = v - .5;
++       *
++       * r = 1.1643 * y' + 0.0     * u' + 1.5958  * v'
++       * g = 1.1643 * y' - 0.39173 * u' - 0.81290 * v'
++       * b = 1.1643 * y' + 2.017   * u' + 0.0     * v'
++       *
++       * register assignment:
++       * r0 = (y',u',v',0)
++       * r1 = (y,y,y,y)
++       * r2 = (u,u,u,u)
++       * r3 = (v,v,v,v)
++       * OC = (r,g,b,1)
++       */
++      OUT_RING(_3DSTATE_PIXEL_SHADER_CONSTANTS | 16);
++      OUT_RING(0x000000f);	/* constants 0-3 */
++      /* constant 0: normalization offsets */
++      OUT_RING_F(-0.0625);
++      OUT_RING_F(-0.5);
++      OUT_RING_F(-0.5);
++      OUT_RING_F(0.0);
++      /* constant 1: r coefficients*/
++      OUT_RING_F(1.1643);
++      OUT_RING_F(0.0);
++      OUT_RING_F(1.5958);
++      OUT_RING_F(0.0);
++      /* constant 2: g coefficients */
++      OUT_RING_F(1.1643);
++      OUT_RING_F(-0.39173);
++      OUT_RING_F(-0.81290);
++      OUT_RING_F(0.0);
++      /* constant 3: b coefficients */
++      OUT_RING_F(1.1643);
++      OUT_RING_F(2.017);
++      OUT_RING_F(0.0);
++      OUT_RING_F(0.0);
++
++      OUT_RING(_3DSTATE_PIXEL_SHADER_PROGRAM | (3 * 16 - 1));
++      /* Declare samplers */
++      OUT_DCL(S, 0);
++      OUT_DCL(S, 1);
++      OUT_DCL(S, 2);
++      OUT_DCL(T, 0);
++      OUT_DCL(T, 1);
++
++      /* Load samplers to temporaries.  Y (sampler 0) gets the un-halved coords
++       * from t1.
++       */
++      OUT_TEXLD(R, 1, 0, T, 1);
++      OUT_TEXLD(R, 2, 1, T, 0);
++      OUT_TEXLD(R, 3, 2, T, 0);
++
++      /* Move the sampled YUV data in R[123] to the first 3 channels of R0. */
++      OUT_MOV_TO_CHANNEL(R, 0, R, 1, X);
++      OUT_MOV_TO_CHANNEL(R, 0, R, 2, Y);
++      OUT_MOV_TO_CHANNEL(R, 0, R, 3, Z);
++
++      /* Normalize the YUV data */
++      OUT_RING(A0_ADD | A0_DEST_CHANNEL_ALL |
++	       (REG_TYPE_R << A0_DEST_TYPE_SHIFT) | (0 << A0_DEST_NR_SHIFT) |				\
++	       (REG_TYPE_R << A0_SRC0_TYPE_SHIFT) | (0 << A0_SRC0_NR_SHIFT));
++      OUT_RING((SRC_X << A1_SRC0_CHANNEL_X_SHIFT) |
++	       (SRC_Y << A1_SRC0_CHANNEL_Y_SHIFT) |
++	       (SRC_Z << A1_SRC0_CHANNEL_Z_SHIFT) |
++	       (SRC_W << A1_SRC0_CHANNEL_W_SHIFT) |
++	       (REG_TYPE_CONST << A1_SRC1_TYPE_SHIFT) | (0 << A1_SRC1_NR_SHIFT) |
++	       (SRC_X << A1_SRC1_CHANNEL_X_SHIFT) |
++	       (SRC_Y << A1_SRC1_CHANNEL_Y_SHIFT));
++      OUT_RING((SRC_Z << A2_SRC1_CHANNEL_Z_SHIFT) |
++	       (SRC_W << A2_SRC1_CHANNEL_W_SHIFT));
++
++      /* dot-product the YUV data in R0 by the vectors of coefficients for
++       * calculating R, G, and B, storing the results in the R, G, or B channels
++       * of the output color.
++       */
++      OUT_DP3_TO_CHANNEL(OC, 0, R, 0, CONST, 1, X);
++      OUT_DP3_TO_CHANNEL(OC, 0, R, 0, CONST, 2, Y);
++      OUT_DP3_TO_CHANNEL(OC, 0, R, 0, CONST, 3, Z);
++
++      /* Set alpha of the output to 1.0, by wiring W to 1 and not actually using
++       * the source.
++       */
++      OUT_RING(A0_MOV | A0_DEST_CHANNEL_W |
++	       (REG_TYPE_OC << A0_DEST_TYPE_SHIFT) | (0 << A0_DEST_NR_SHIFT) |
++	       (REG_TYPE_OC << A0_SRC0_TYPE_SHIFT) | (0 << A0_SRC0_NR_SHIFT));
++      OUT_RING((SRC_X << A1_SRC0_CHANNEL_X_SHIFT) |
++	       (SRC_Y << A1_SRC0_CHANNEL_Y_SHIFT) |
++	       (SRC_Z << A1_SRC0_CHANNEL_Z_SHIFT) |
++	       (SRC_ONE << A1_SRC0_CHANNEL_W_SHIFT));
++      OUT_RING(0);
++      /* End fragment program */
++
++      OUT_RING(_3DSTATE_SAMPLER_STATE | 9);
++      OUT_RING(0x00000007);
++      /* sampler 0 */
++      OUT_RING(0x00000000);
++      OUT_RING((FILTER_LINEAR << SS2_MAG_FILTER_SHIFT) |
++	       (FILTER_LINEAR << SS2_MIN_FILTER_SHIFT));
++      OUT_RING((TEXCOORDMODE_CLAMP_EDGE << SS3_TCX_ADDR_MODE_SHIFT) |
++	       (TEXCOORDMODE_CLAMP_EDGE << SS3_TCY_ADDR_MODE_SHIFT));
++      /* sampler 1 */
++      OUT_RING(0x00000000);
++      OUT_RING((FILTER_LINEAR << SS2_MAG_FILTER_SHIFT) |
++	       (FILTER_LINEAR << SS2_MIN_FILTER_SHIFT));
++      OUT_RING((TEXCOORDMODE_CLAMP_EDGE << SS3_TCX_ADDR_MODE_SHIFT) |
++	       (TEXCOORDMODE_CLAMP_EDGE << SS3_TCY_ADDR_MODE_SHIFT));
++      /* sampler 2 */
++      OUT_RING(0x00000000);
++      OUT_RING((FILTER_LINEAR << SS2_MAG_FILTER_SHIFT) |
++	       (FILTER_LINEAR << SS2_MIN_FILTER_SHIFT));
++      OUT_RING((TEXCOORDMODE_CLAMP_EDGE << SS3_TCX_ADDR_MODE_SHIFT) |
++	       (TEXCOORDMODE_CLAMP_EDGE << SS3_TCY_ADDR_MODE_SHIFT));
++
++      OUT_RING(_3DSTATE_MAP_STATE | 9);
++      OUT_RING(0x00000007);
++
++      OUT_RING(pPriv->YBuf0offset);
++      ms3 = MAPSURF_8BIT | MT_8BIT_I8;
++      ms3 |= (height - 1) << MS3_HEIGHT_SHIFT;
++      ms3 |= (width - 1) << MS3_WIDTH_SHIFT;
++      OUT_RING(ms3);
++      OUT_RING(((video_pitch * 2 / 4) - 1) << 21);
++
++      OUT_RING(pPriv->UBuf0offset);
++      ms3 = MAPSURF_8BIT | MT_8BIT_I8;
++      ms3 |= (height / 2 - 1) << MS3_HEIGHT_SHIFT;
++      ms3 |= (width / 2 - 1) << MS3_WIDTH_SHIFT;
++      OUT_RING(ms3);
++      OUT_RING(((video_pitch / 4) - 1) << 21);
++
++      OUT_RING(pPriv->VBuf0offset);
++      ms3 = MAPSURF_8BIT | MT_8BIT_I8;
++      ms3 |= (height / 2 - 1) << MS3_HEIGHT_SHIFT;
++      ms3 |= (width / 2 - 1) << MS3_WIDTH_SHIFT;
++      OUT_RING(ms3);
++      OUT_RING(((video_pitch / 4) - 1) << 21);
++      ADVANCE_LP_RING();
++   }
++   
++   {
++      BEGIN_LP_RING(2);
++      OUT_RING(MI_FLUSH | MI_WRITE_DIRTY_STATE | MI_INVALIDATE_MAP_CACHE);
++      OUT_RING(0x00000000);
++      ADVANCE_LP_RING();
++   }
++
++   dxo = dstRegion->extents.x1;
++   dyo = dstRegion->extents.y1;
++
++   pbox = REGION_RECTS(dstRegion);
++   nbox = REGION_NUM_RECTS(dstRegion);
++   while (nbox--)
++   {
++      int box_x1 = pbox->x1;
++      int box_y1 = pbox->y1;
++      int box_x2 = pbox->x2;
++      int box_y2 = pbox->y2;
++      float src_scale_x, src_scale_y;
++      int vert_data_count;
++
++      pbox++;
++
++      src_scale_x = (float)src_w / (float)drw_w;
++      src_scale_y  = (float)src_h / (float)drw_h;
++
++      if (!planar)
++	 vert_data_count = 12;
++      else
++	 vert_data_count = 18;
++
++      BEGIN_LP_RING(vert_data_count + 8);
++      OUT_RING(MI_NOOP);
++      OUT_RING(MI_NOOP);
++      OUT_RING(MI_NOOP);
++      OUT_RING(MI_NOOP);
++      OUT_RING(MI_NOOP);
++      OUT_RING(MI_NOOP);
++      OUT_RING(MI_NOOP);
++
++      /* vertex data - rect list consists of bottom right, bottom left, and top
++       * left vertices.
++       */
++      OUT_RING(PRIM3D_INLINE | PRIM3D_RECTLIST |
++	       (vert_data_count - 1));
++
++      /* bottom right */
++      OUT_RING_F(box_x2);
++      OUT_RING_F(box_y2);
++      if (!planar) {
++	 OUT_RING_F((box_x2 - dxo) * src_scale_x);
++	 OUT_RING_F((box_y2 - dyo) * src_scale_y);
++      } else {
++	 OUT_RING_F((box_x2 - dxo) * src_scale_x / 2.0);
++	 OUT_RING_F((box_y2 - dyo) * src_scale_y / 2.0);
++	 OUT_RING_F((box_x2 - dxo) * src_scale_x);
++	 OUT_RING_F((box_y2 - dyo) * src_scale_y);
++      }
++
++      /* bottom left */
++      OUT_RING_F(box_x1);
++      OUT_RING_F(box_y2);
++      if (!planar) {
++	 OUT_RING_F((box_x1 - dxo) * src_scale_x);
++	 OUT_RING_F((box_y2 - dyo) * src_scale_y);
++      } else {
++	 OUT_RING_F((box_x1 - dxo) * src_scale_x / 2.0);
++	 OUT_RING_F((box_y2 - dyo) * src_scale_y / 2.0);
++	 OUT_RING_F((box_x1 - dxo) * src_scale_x);
++	 OUT_RING_F((box_y2 - dyo) * src_scale_y);
++      }
++
++      /* top left */
++      OUT_RING_F(box_x1);
++      OUT_RING_F(box_y1);
++      if (!planar) {
++	 OUT_RING_F((box_x1 - dxo) * src_scale_x);
++	 OUT_RING_F((box_y1 - dyo) * src_scale_y);
++      } else {
++	 OUT_RING_F((box_x1 - dxo) * src_scale_x / 2.0);
++	 OUT_RING_F((box_y1 - dyo) * src_scale_y / 2.0);
++	 OUT_RING_F((box_x1 - dxo) * src_scale_x);
++	 OUT_RING_F((box_y1 - dyo) * src_scale_y);
++      }
++
++      ADVANCE_LP_RING();
++   }
++
++   if (pI830->AccelInfoRec)
++      pI830->AccelInfoRec->NeedToSync = TRUE;
++}
++
diff-tree 84805167ab8a422966355b9753bfcb4dad802413 (from 5176d62ba58c100c87f75a4f333d00129d780c99)
Author: Eric Anholt <anholt at FreeBSD.org>
Date:   Tue Jul 18 18:27:10 2006 -0400

    Convert i915 rotate code to the new fragment program API.

diff --git a/src/i830_rotate.c b/src/i830_rotate.c
index 3192762..716f425 100644
--- a/src/i830_rotate.c
+++ b/src/i830_rotate.c
@@ -1,3 +1,4 @@
+/* -*- c-basic-offset: 3 -*- */
 /**************************************************************************
 
 Copyright 2005 Tungsten Graphics, Inc., Cedar Park, Texas.
@@ -58,6 +59,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN
 
 #include "i830.h"
 #include "i915_reg.h"
+#include "i915_3d.h"
 
 #ifdef XF86DRI
 #include "dri.h"
@@ -260,12 +262,13 @@ I915UpdateRotate (ScreenPtr      pScreen
 #endif
 
    if (updateInvarient) {
+      FS_LOCALS(3);
       *pI830->used3D = pScrn->scrnIndex;
 #ifdef XF86DRI
       if (sarea)
          sarea->ctxOwner = myContext;
 #endif
-      BEGIN_LP_RING(64);
+      BEGIN_LP_RING(54);
       /* invarient state */
       OUT_RING(MI_NOOP);
       OUT_RING(_3DSTATE_AA_CMD |
@@ -373,18 +376,6 @@ I915UpdateRotate (ScreenPtr      pScreen
       OUT_RING(_3DSTATE_STIPPLE);
       OUT_RING(0x00000000);
 
-      /* fragment program - texture blend replace*/
-      OUT_RING(0x7d050008);
-      OUT_RING(0x19180000);
-      OUT_RING(0x00000000);
-      OUT_RING(0x00000000);
-      OUT_RING(0x19083c00);
-      OUT_RING(0x00000000);
-      OUT_RING(0x00000000);
-      OUT_RING(0x15200000);
-      OUT_RING(0x01000000);
-      OUT_RING(0x00000000);
-
       /* texture sampler state */
       OUT_RING(_3DSTATE_SAMPLER_STATE | 3);
       OUT_RING(0x00000001);
@@ -425,6 +416,13 @@ I915UpdateRotate (ScreenPtr      pScreen
       OUT_RING(use_fence | (pScreen->height - 1) << 21 | (pScreen->width - 1) << 10);
       OUT_RING(((((pScrn->displayWidth * pI830->cpp) / 4) - 1) << 21));
       ADVANCE_LP_RING();
+
+      /* fragment program - texture blend replace*/
+      FS_BEGIN();
+      i915_fs_dcl(FS_S0);
+      i915_fs_dcl(FS_T0);
+      i915_fs_texld(FS_OC, FS_S0, FS_T0);
+      FS_END();
    }
    
    {
diff-tree 5176d62ba58c100c87f75a4f333d00129d780c99 (from 148ef9bdd9e0ef3e7ac86b56a8662b53a3ea9168)
Author: Eric Anholt <anholt at FreeBSD.org>
Date:   Tue Jul 18 16:18:18 2006 -0400

    Add an API for programming i915 fragment programs.

diff --git a/src/Makefile.am b/src/Makefile.am
index 2745e8c..f97dc52 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -58,6 +58,7 @@ i810_drv_la_SOURCES = \
 	 i830_3d.c \
 	 i830_reg.h \
 	 i915_3d.c \
+	 i915_3d.h \
 	 i915_reg.h
 
 if DRI
diff --git a/src/i915_3d.h b/src/i915_3d.h
new file mode 100644
index 0000000..fc4ca60
--- /dev/null
+++ b/src/i915_3d.h
@@ -0,0 +1,431 @@
+/* -*- c-basic-offset: 4 -*- */
+/*
+ * Copyright © 2006 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 at anholt.net>
+ *
+ */
+
+/* MASK_* are the unshifted bitmasks of the destination mask in arithmetic
+ * operations
+ */
+#define MASK_X			0x1
+#define MASK_Y			0x2
+#define MASK_Z			0x4
+#define MASK_W			0x8
+#define MASK_XYZ		(MASK_X | MASK_Y | MASK_W)
+#define MASK_XYZW		(MASK_XYZ | MASK_W)
+#define MASK_SATURATE		0x10
+
+/* Temporary, undeclared regs. Preserved between phases */
+#define FS_R0			((REG_TYPE_R << 8) | 0)
+#define FS_R1			((REG_TYPE_R << 8) | 1)
+#define FS_R2			((REG_TYPE_R << 8) | 2)
+#define FS_R3			((REG_TYPE_R << 8) | 3)
+
+/* Texture coordinate regs.  Must be declared. */
+#define FS_T0			((REG_TYPE_T << 8) | 0)
+#define FS_T1			((REG_TYPE_T << 8) | 1)
+#define FS_T2			((REG_TYPE_T << 8) | 2)
+#define FS_T3			((REG_TYPE_T << 8) | 3)
+#define FS_T4			((REG_TYPE_T << 8) | 4)
+#define FS_T5			((REG_TYPE_T << 8) | 5)
+#define FS_T6			((REG_TYPE_T << 8) | 6)
+#define FS_T7			((REG_TYPE_T << 8) | 7)
+#define FS_T8			((REG_TYPE_T << 8) | 8)
+#define FS_T9			((REG_TYPE_T << 8) | 9)
+#define FS_T10			((REG_TYPE_T << 8) | 10)
+
+/* Constant values */
+#define FS_C0			((REG_TYPE_CONST << 8) | 0)
+#define FS_C1			((REG_TYPE_CONST << 8) | 1)
+#define FS_C2			((REG_TYPE_CONST << 8) | 2)
+#define FS_C3			((REG_TYPE_CONST << 8) | 3)
+
+/* Sampler regs */
+#define FS_S0			((REG_TYPE_S << 8) | 0)
+#define FS_S1			((REG_TYPE_S << 8) | 1)
+#define FS_S2			((REG_TYPE_S << 8) | 2)
+#define FS_S3			((REG_TYPE_S << 8) | 3)
+
+/* Output color */
+#define FS_OC			((REG_TYPE_OC << 8) | 0)
+
+/* Output depth */
+#define FS_OD			((REG_TYPE_OD << 8) | 0)
+
+/* Unpreserved temporary regs */
+#define FS_U0			((REG_TYPE_U << 8) | 0)
+#define FS_U1			((REG_TYPE_U << 8) | 1)
+#define FS_U2			((REG_TYPE_U << 8) | 2)
+#define FS_U3			((REG_TYPE_U << 8) | 3)
+
+#define REG_TYPE(reg)		((reg) >> 8)
+#define REG_NR(reg)		((reg) & 0xff)
+
+struct i915_fs_op {
+    CARD32 ui[3];
+};
+
+#define X_CHANNEL_VAL		1
+#define Y_CHANNEL_VAL		2
+#define Z_CHANNEL_VAL		3
+#define W_CHANNEL_VAL		4
+#define ZERO_CHANNEL_VAL	5
+#define ONE_CHANNEL_VAL		6
+
+/**
+ * This structure represents the contents of an operand to an i915 fragment
+ * shader.
+ *
+ * It is not a hardware representation, though closely related.
+ */
+struct i915_fs_operand {
+    /**< REG_TYPE_* register type */
+    int reg;
+    /**< *_CHANNEL_VAL swizzle value, with optional negation */
+    int x;
+    /**< *_CHANNEL_VAL swizzle value, with optional negation */
+    int y;
+    /**< *_CHANNEL_VAL swizzle value, with optional negation */
+    int z;
+    /**< *_CHANNEL_VAL swizzle value, with optional negation */
+    int w;
+};
+
+/**
+ * Construct an operand description for the fragment shader.
+ *
+ * \param regtype FS_* register used as the source value for X/Y/Z/W sources.
+ * \param x *_CHANNEL_VAL swizzle value prefix for operand X channel, with
+ *          optional negation.
+ * \param y *_CHANNEL_VAL swizzle value prefix for operand Y channel, with
+ *          optional negation.
+ * \param z *_CHANNEL_VAL swizzle value prefix for operand Z channel, with
+ *          optional negation.
+ * \param w *_CHANNEL_VAL swizzle value prefix for operand W channel, with
+ *          optional negation.
+ */
+#define i915_fs_operand(reg, x, y, z, w)				\
+    _i915_fs_operand(reg,						\
+		     x##_CHANNEL_VAL, y##_CHANNEL_VAL,			\
+		     z##_CHANNEL_VAL, w##_CHANNEL_VAL)
+
+/**
+ * Construct an oeprand description for using a register with no swizzling
+ */
+#define i915_fs_operand_reg(reg)					\
+    i915_fs_operand(reg, X, Y, Z, W)
+
+static inline struct i915_fs_operand
+_i915_fs_operand(int reg, int x, int y, int z, int w)
+{
+    struct i915_fs_operand operand;
+
+    operand.reg = reg;
+    operand.x = x;
+    operand.y = y;
+    operand.z = z;
+    operand.w = w;
+
+    return operand;
+}
+
+/**
+ * Returns an operand containing (0.0, 0.0, 0.0, 0.0).
+ */
+static inline struct i915_fs_operand
+i915_fs_operand_zero(void)
+{
+    return i915_fs_operand(FS_R0, ZERO, ZERO, ZERO, ZERO);
+}
+
+/**
+ * Returns an unused operand
+ */
+#define i915_fs_operand_none() i915_fs_operand_zero()
+
+/**
+ * Returns an operand containing (1.0, 1.0, 1.0, 1.0).
+ */
+static inline struct i915_fs_operand
+i915_fs_operand_one(void)
+{
+    return i915_fs_operand(FS_R0, ONE, ONE, ONE, ONE);
+}
+
+static inline int
+i915_get_hardware_channel_val(int channel_val)
+{
+    if (channel_val < 0)
+	channel_val = -channel_val;
+
+    switch (channel_val) {
+    case X_CHANNEL_VAL:
+	return SRC_X;
+    case Y_CHANNEL_VAL:
+	return SRC_Y;
+    case Z_CHANNEL_VAL:
+	return SRC_Z;
+    case W_CHANNEL_VAL:
+	return SRC_W;
+    case ZERO_CHANNEL_VAL:
+	return SRC_ZERO;
+    case ONE_CHANNEL_VAL:
+	return SRC_ONE;
+    }
+    FatalError("Bad channel value %d\n", channel_val);
+}
+
+/**
+ * Outputs a fragment shader command to declare a sampler or texture register.
+ */
+#define i915_fs_dcl(reg)						\
+do {									\
+    FS_OUT(_i915_fs_dcl(reg));						\
+} while (0)
+
+/**
+ * Constructs a fragment shader command to declare a sampler or texture
+ * register.
+ */
+static inline struct i915_fs_op
+_i915_fs_dcl(int reg)
+{
+    struct i915_fs_op op;
+
+    op.ui[0] = D0_DCL | (REG_TYPE(reg) << D0_TYPE_SHIFT) |
+	(REG_NR(reg) << D0_NR_SHIFT);
+    op.ui[1] = 0;
+    op.ui[2] = 0;
+    if (REG_TYPE(reg) != REG_TYPE_S)
+	op.ui[0] |= D0_CHANNEL_ALL;
+
+    return op;
+}
+
+/**
+ * Constructs a fragment shader command to load from a texture sampler.
+ */
+#define i915_fs_texld(dest_reg, sampler_reg, address_reg)		\
+do {									\
+     FS_OUT(_i915_fs_texld(T0_TEXLD, dest_reg, sampler_reg, address_reg)); \
+} while (0)
+
+static inline struct i915_fs_op
+_i915_fs_texld(int load_op, int dest_reg, int sampler_reg, int address_reg)
+{
+    struct i915_fs_op op;
+
+    op.ui[0] = 0;
+    op.ui[1] = 0;
+    op.ui[2] = 0;
+
+    if (REG_TYPE(sampler_reg) != REG_TYPE_S)
+	FatalError("Bad sampler reg type\n");
+
+    op.ui[0] |= load_op;
+    op.ui[0] |= REG_TYPE(dest_reg) << T0_DEST_TYPE_SHIFT;
+    op.ui[0] |= REG_NR(dest_reg) << T0_DEST_NR_SHIFT;
+    op.ui[0] |= REG_NR(sampler_reg) << T0_SAMPLER_NR_SHIFT;
+    op.ui[1] |= REG_TYPE(address_reg) << T1_ADDRESS_REG_TYPE_SHIFT;
+    op.ui[1] |= REG_NR(address_reg) << T1_ADDRESS_REG_NR_SHIFT;
+
+    return op;
+}
+
+#define i915_fs_arith(op, dest_reg, operand0, operand1, operand2)	\
+    _i915_fs_arith(A0_##op, dest_reg, operand0, operand1, operand2)
+
+static inline struct i915_fs_op
+_i915_fs_arith(int cmd, int dest_reg,
+	       struct i915_fs_operand operand0,
+	       struct i915_fs_operand operand1,
+	       struct i915_fs_operand operand2)
+{
+    struct i915_fs_op op;
+
+    op.ui[0] = 0;
+    op.ui[1] = 0;
+    op.ui[2] = 0;
+
+    /* Set up destination register and write mask */
+    op.ui[0] |= cmd;
+    op.ui[0] |= REG_TYPE(dest_reg) << A0_DEST_TYPE_SHIFT;
+    op.ui[0] |= REG_NR(dest_reg) << A0_DEST_NR_SHIFT;
+    op.ui[0] |= A0_DEST_CHANNEL_ALL;
+
+    /* Set up operand 0 */
+    op.ui[0] |= REG_TYPE(operand0.reg) << A0_SRC0_TYPE_SHIFT;
+    op.ui[0] |= REG_NR(operand0.reg) << A0_SRC0_NR_SHIFT;
+
+    op.ui[1] |= i915_get_hardware_channel_val(operand0.x) <<
+	A1_SRC0_CHANNEL_X_SHIFT;
+    if (operand0.x < 0)
+	op.ui[1] |= A1_SRC0_CHANNEL_X_NEGATE;
+
+    op.ui[1] |= i915_get_hardware_channel_val(operand0.y) <<
+	A1_SRC0_CHANNEL_Y_SHIFT;
+    if (operand0.y < 0)
+	op.ui[1] |= A1_SRC0_CHANNEL_Y_NEGATE;
+
+    op.ui[1] |= i915_get_hardware_channel_val(operand0.z) <<
+	A1_SRC0_CHANNEL_Z_SHIFT;
+    if (operand0.z < 0)
+	op.ui[1] |= A1_SRC0_CHANNEL_Z_NEGATE;
+
+    op.ui[1] |= i915_get_hardware_channel_val(operand0.w) <<
+	A1_SRC0_CHANNEL_W_SHIFT;
+    if (operand0.w < 0)
+	op.ui[1] |= A1_SRC0_CHANNEL_W_NEGATE;
+
+    /* Set up operand 1 */
+    op.ui[1] |= REG_TYPE(operand1.reg) << A1_SRC1_TYPE_SHIFT;
+    op.ui[1] |= REG_NR(operand1.reg) << A1_SRC1_NR_SHIFT;
+
+    op.ui[1] |= i915_get_hardware_channel_val(operand1.x) <<
+	A1_SRC1_CHANNEL_X_SHIFT;
+    if (operand1.x < 0)
+	op.ui[1] |= A1_SRC1_CHANNEL_X_NEGATE;
+
+    op.ui[1] |= i915_get_hardware_channel_val(operand1.y) <<
+	A1_SRC1_CHANNEL_Y_SHIFT;
+    if (operand1.y < 0)
+	op.ui[1] |= A1_SRC1_CHANNEL_Y_NEGATE;
+
+    op.ui[2] |= i915_get_hardware_channel_val(operand1.z) <<
+	A2_SRC1_CHANNEL_Z_SHIFT;
+    if (operand1.z < 0)
+	op.ui[2] |= A2_SRC1_CHANNEL_Z_NEGATE;
+
+    op.ui[2] |= i915_get_hardware_channel_val(operand1.w) <<
+	A2_SRC1_CHANNEL_W_SHIFT;
+    if (operand1.w < 0)
+	op.ui[2] |= A2_SRC1_CHANNEL_W_NEGATE;
+
+    /* Set up operand 2 */
+    op.ui[2] |= REG_TYPE(operand2.reg) << A2_SRC2_TYPE_SHIFT;
+    op.ui[2] |= REG_NR(operand2.reg) << A2_SRC2_NR_SHIFT;
+
+    op.ui[2] |= i915_get_hardware_channel_val(operand2.x) <<
+	A2_SRC2_CHANNEL_X_SHIFT;
+    if (operand2.x < 0)
+	op.ui[2] |= A2_SRC2_CHANNEL_X_NEGATE;
+
+    op.ui[2] |= i915_get_hardware_channel_val(operand2.y) <<
+	A2_SRC2_CHANNEL_Y_SHIFT;
+    if (operand2.y < 0)
+	op.ui[2] |= A2_SRC2_CHANNEL_Y_NEGATE;
+
+    op.ui[2] |= i915_get_hardware_channel_val(operand2.z) <<
+	A2_SRC2_CHANNEL_Z_SHIFT;
+    if (operand2.z < 0)
+	op.ui[2] |= A2_SRC2_CHANNEL_Z_NEGATE;
+
+    op.ui[2] |= i915_get_hardware_channel_val(operand2.w) <<
+	A2_SRC2_CHANNEL_W_SHIFT;
+    if (operand2.w < 0)
+	op.ui[2] |= A2_SRC2_CHANNEL_W_NEGATE;
+
+    return op;
+}
+
+/**
+ * Move the values in operand0 to the dest reg with the masking/saturation
+ * specified.
+ */
+#define i915_fs_mov_masked(dest_reg, dest_mask, operand0)		\
+do {									\
+    struct i915_fs_op op;						\
+									\
+    op = i915_fs_arith(MOV, dest_reg, operand0, i915_fs_operand_none(),	\
+		       i915_fs_operand_none());				\
+    op.ui[0] &= ~A0_DEST_CHANNEL_ALL;					\
+    op.ui[0] |= ((dest_mask) & ~MASK_SATURATE) << A0_DEST_CHANNEL_SHIFT; \
+    if ((dest_mask) & MASK_SATURATE)					\
+	op.ui[0] |= A0_DEST_SATURATE;					\
+									\
+    FS_OUT(op);								\
+} while (0)
+
+/** Add operand0 and operand1 and put the result in dest_reg */
+#define i915_fs_add(dest_reg, operand0, operand1)			\
+do {									\
+    FS_OUT(i915_fs_arith(ADD, dest_reg, operand0, operand1,		\
+			 i915_fs_operand_none()));			\
+} while (0)
+
+/**
+ * Perform a 3-component dot-product of operand0 and operand1 and put the
+ * resulting scalar in the channels of dest_reg specified by the dest_mask.
+ */
+#define i915_fs_dp3_masked(dest_reg, dest_mask, operand0, operand1)	\
+do {									\
+    struct i915_fs_op op;						\
+									\
+    op = i915_fs_arith(DP3, dest_reg, operand0, i915_fs_operand_none(),	\
+		       i915_fs_operand_none());				\
+    op.ui[0] &= ~A0_DEST_CHANNEL_ALL;					\
+    op.ui[0] |= ((dest_mask) & ~MASK_SATURATE) << A0_DEST_CHANNEL_SHIFT; \
+    if ((dest_mask) & MASK_SATURATE)					\
+	op.ui[0] |= A0_DEST_SATURATE;					\
+									\
+    FS_OUT(op);								\
+} while (0)
+
+/**
+ * Sets up local state for accumulating a fragment shader buffer.
+ *
+ * \param x maximum number of shader commands that may be used between
+ *        a FS_START and FS_END
+ */
+#define FS_LOCALS(x)							\
+    CARD32 _shader_buf[(x) * 3];					\
+    int _max_shader_commands = x;					\
+    int _cur_shader_commands
+
+#define FS_BEGIN()							\
+do {									\
+    _cur_shader_commands = 0;						\
+} while (0)
+
+#define FS_OUT(_shaderop)						\
+do {									\
+    _shader_buf[_cur_shader_commands * 3 + 0] = _shaderop.ui[0];	\
+    _shader_buf[_cur_shader_commands * 3 + 1] = _shaderop.ui[1];	\
+    _shader_buf[_cur_shader_commands * 3 + 2] = _shaderop.ui[2];	\
+    if (++_cur_shader_commands > _max_shader_commands)			\
+	 FatalError("fragment shader command buffer exceeded (%d)\n",	\
+		    _cur_shader_commands);				\
+} while (0)
+
+#define FS_END()							\
+do {									\
+    int _i;								\
+    BEGIN_LP_RING(_cur_shader_commands * 3 + 1);			\
+    OUT_RING(_3DSTATE_PIXEL_SHADER_PROGRAM |				\
+	     (_cur_shader_commands * 3 - 1));				\
+    for (_i = 0; _i < _cur_shader_commands * 3; _i++)			\
+	OUT_RING(_shader_buf[_i]);					\
+    ADVANCE_LP_RING();							\
+} while (0);
diff-tree 148ef9bdd9e0ef3e7ac86b56a8662b53a3ea9168 (from 16d6263e6518a4a05562e2842ff2d0fdb4710304)
Author: Eric Anholt <anholt at FreeBSD.org>
Date:   Mon Jul 17 22:32:25 2006 -0700

    Convert magic numbers to symbolic names in i915 rotate code.
    
    This doesn't cover the fragment shader yet, which we need to make a sensible
    set of macros for (at least the basic bits).
    
    Reviewed by:	md5

diff --git a/src/i830_rotate.c b/src/i830_rotate.c
index 4d7237f..3192762 100644
--- a/src/i830_rotate.c
+++ b/src/i830_rotate.c
@@ -57,6 +57,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN
 #include "shadow.h"
 
 #include "i830.h"
+#include "i915_reg.h"
 
 #ifdef XF86DRI
 #include "dri.h"
@@ -267,58 +268,111 @@ I915UpdateRotate (ScreenPtr      pScreen
       BEGIN_LP_RING(64);
       /* invarient state */
       OUT_RING(MI_NOOP);
-      OUT_RING(0x66014140);
-      OUT_RING(0x7d990000);
+      OUT_RING(_3DSTATE_AA_CMD |
+	       AA_LINE_ECAAR_WIDTH_ENABLE | AA_LINE_ECAAR_WIDTH_1_0 |
+	       AA_LINE_REGION_WIDTH_ENABLE | AA_LINE_REGION_WIDTH_1_0);
+
+      OUT_RING(_3DSTATE_DFLT_DIFFUSE_CMD);
       OUT_RING(0x00000000);
-      OUT_RING(0x7d9a0000);
+
+      OUT_RING(_3DSTATE_DFLT_SPEC_CMD);
       OUT_RING(0x00000000);
-      OUT_RING(0x7d980000);
+
+      OUT_RING(_3DSTATE_DFLT_Z_CMD);
       OUT_RING(0x00000000);
-      OUT_RING(0x76fac688);
-      OUT_RING(0x6700a770);
-      OUT_RING(0x7d040081);
+
+      OUT_RING(_3DSTATE_COORD_SET_BINDINGS |
+	       CSB_TCB(0, 0) | CSB_TCB(1, 1) |
+	       CSB_TCB(2, 2) | CSB_TCB(3, 3) |
+	       CSB_TCB(4, 4) | CSB_TCB(5, 5) |
+	       CSB_TCB(6, 6) | CSB_TCB(7, 7));
+
+      OUT_RING(_3DSTATE_RASTER_RULES_CMD |
+	       ENABLE_TRI_FAN_PROVOKE_VRTX | TRI_FAN_PROVOKE_VRTX(2) |
+	       ENABLE_LINE_STRIP_PROVOKE_VRTX | LINE_STRIP_PROVOKE_VRTX(1) |
+	       ENABLE_TEXKILL_3D_4D | TEXKILL_4D |
+	       ENABLE_POINT_RASTER_RULE | OGL_POINT_RASTER_RULE);
+
+      OUT_RING(_3DSTATE_LOAD_STATE_IMMEDIATE_1 | I1_LOAD_S(3) | 1);
       OUT_RING(0x00000000);
+
       /* flush map & render cache */
       OUT_RING(MI_FLUSH | MI_WRITE_DIRTY_STATE | MI_INVALIDATE_MAP_CACHE);
       OUT_RING(0x00000000);
+
       /* draw rect */
-      OUT_RING(0x7d800003);
-      OUT_RING(0x00000000);
-      OUT_RING(0x00000000);
-      OUT_RING((pScrn->virtualX - 1) | (pScrn->virtualY - 1) << 16);
-      OUT_RING(0x00000000);
-      OUT_RING(0x00000000);
-      /* scissor */
-      OUT_RING(0x7c800002);
-      OUT_RING(0x7d810001);
-      OUT_RING(0x00000000);
-      OUT_RING(0x00000000);
-      OUT_RING(0x7c000003);
+      OUT_RING(_3DSTATE_DRAW_RECT_CMD);
+      OUT_RING(DRAW_DITHER_OFS_X(0) | DRAW_DITHER_OFS_Y(0));
+      OUT_RING(DRAW_XMIN(0) | DRAW_YMIN(0));
+      OUT_RING(DRAW_XMAX(pScrn->virtualX - 1) |
+	       DRAW_YMAX(pScrn->virtualY - 1));
+      OUT_RING(DRAW_XORG(0) | DRAW_YORG(0));
+
+      OUT_RING(MI_NOOP);
+
+      OUT_RING(_3DSTATE_SCISSOR_ENABLE_CMD | DISABLE_SCISSOR_RECT);
+      OUT_RING(_3DSTATE_SCISSOR_RECT_0_CMD);
+      OUT_RING(0x00000000); /* ymin, xmin */
+      OUT_RING(0x00000000); /* ymax, xmax */
+
+      OUT_RING(0x7c000003); /* XXX: magic numbers */
       OUT_RING(0x7d070000);
       OUT_RING(0x00000000);
       OUT_RING(0x68000002);
+
       /* context setup */
-      OUT_RING(0x6db3ffff);
-      OUT_RING(0x7d040744);
-      OUT_RING(0xfffffff0);
-      OUT_RING(0x00902c80);
-      OUT_RING(0x00000000);
-      OUT_RING(0x00020216);
-      OUT_RING(0x6ba008a1);
-      OUT_RING(0x7d880000);
-      OUT_RING(0x00000000);
-      /* dv0 */
-      OUT_RING(0x7d850000);
-      /* dv1 */
-      if (pI830->cpp == 1)
-         OUT_RING(0x10880000);
-      else if (pI830->cpp == 2)
-            OUT_RING(0x10880200);
-         else
-            OUT_RING(0x10880308);
-      /* stipple */
-      OUT_RING(0x7d830000);
+      OUT_RING(_3DSTATE_MODES_4_CMD |
+	       ENABLE_LOGIC_OP_FUNC | LOGIC_OP_FUNC(LOGICOP_COPY) |
+	       MODE4_ENABLE_STENCIL_WRITE_MASK |
+	       MODE4_ENABLE_STENCIL_TEST_MASK);
+
+      OUT_RING(_3DSTATE_LOAD_STATE_IMMEDIATE_1 |
+	       I1_LOAD_S(2) | I1_LOAD_S(4) | I1_LOAD_S(5) | I1_LOAD_S(6) | 4);
+
+      OUT_RING(S2_TEXCOORD_FMT(0, TEXCOORDFMT_2D) |
+	       S2_TEXCOORD_FMT(1, TEXCOORDFMT_NOT_PRESENT) |
+	       S2_TEXCOORD_FMT(2, TEXCOORDFMT_NOT_PRESENT) |
+	       S2_TEXCOORD_FMT(3, TEXCOORDFMT_NOT_PRESENT) |
+	       S2_TEXCOORD_FMT(4, TEXCOORDFMT_NOT_PRESENT) |
+	       S2_TEXCOORD_FMT(5, TEXCOORDFMT_NOT_PRESENT) |
+	       S2_TEXCOORD_FMT(6, TEXCOORDFMT_NOT_PRESENT) |
+	       S2_TEXCOORD_FMT(7, TEXCOORDFMT_NOT_PRESENT));
+      OUT_RING((1 << S4_POINT_WIDTH_SHIFT) | S4_LINE_WIDTH_ONE |
+	       S4_CULLMODE_NONE | S4_VFMT_SPEC_FOG | S4_VFMT_COLOR |
+	       S4_VFMT_XYZW);
+      OUT_RING(0x00000000); /* S5 -- enable bits */
+      OUT_RING((2 << S6_DEPTH_TEST_FUNC_SHIFT) |
+	       (2 << S6_CBUF_SRC_BLEND_FACT_SHIFT) |
+	       (1 << S6_CBUF_DST_BLEND_FACT_SHIFT) | S6_COLOR_WRITE_ENABLE |
+	       (2 << S6_TRISTRIP_PV_SHIFT));
+
+      OUT_RING(_3DSTATE_INDEPENDENT_ALPHA_BLEND_CMD |
+	       IAB_MODIFY_ENABLE |
+	       IAB_MODIFY_FUNC | (BLENDFUNC_ADD << IAB_FUNC_SHIFT) |
+	       IAB_MODIFY_SRC_FACTOR |
+	       (BLENDFACT_ONE << IAB_SRC_FACTOR_SHIFT) |
+	       IAB_MODIFY_DST_FACTOR |
+	       (BLENDFACT_ZERO << IAB_DST_FACTOR_SHIFT));
+
+      OUT_RING(_3DSTATE_CONST_BLEND_COLOR_CMD);
+      OUT_RING(0x00000000);
+
+      OUT_RING(_3DSTATE_DST_BUF_VARS_CMD);
+      if (pI830->cpp == 1) {
+	 OUT_RING(LOD_PRECLAMP_OGL | DSTORG_HORT_BIAS(0x8) |
+		  DSTORG_VERT_BIAS(0x8) | COLR_BUF_8BIT);
+      } else if (pI830->cpp == 2) {
+	 OUT_RING(LOD_PRECLAMP_OGL | DSTORG_HORT_BIAS(0x8) |
+		  DSTORG_VERT_BIAS(0x8) | COLR_BUF_RGB565);
+      } else {
+	 OUT_RING(LOD_PRECLAMP_OGL | DSTORG_HORT_BIAS(0x8) |
+		  DSTORG_VERT_BIAS(0x8) | COLR_BUF_ARGB8888 |
+		  DEPTH_FRMT_24_FIXED_8_OTHER);
+      }
+
+      OUT_RING(_3DSTATE_STIPPLE);
       OUT_RING(0x00000000);
+
       /* fragment program - texture blend replace*/
       OUT_RING(0x7d050008);
       OUT_RING(0x19180000);
@@ -330,22 +384,25 @@ I915UpdateRotate (ScreenPtr      pScreen
       OUT_RING(0x15200000);
       OUT_RING(0x01000000);
       OUT_RING(0x00000000);
+
       /* texture sampler state */
-      OUT_RING(0x7d010003);
+      OUT_RING(_3DSTATE_SAMPLER_STATE | 3);
       OUT_RING(0x00000001);
       OUT_RING(0x00000000);
       OUT_RING(0x00000000);
       OUT_RING(0x00000000);
+
       /* front buffer, pitch, offset */
-      OUT_RING(0x7d8e0001);
-      OUT_RING(0x03800000 | (((pI830->displayWidth * pI830->cpp) / 4) << 2));
+      OUT_RING(_3DSTATE_BUF_INFO_CMD);
+      OUT_RING(BUF_3D_ID_COLOR_BACK | BUF_3D_USE_FENCE |
+	       BUF_3D_PITCH(pI830->displayWidth * pI830->cpp));
       if (I830IsPrimary(pScrn))
          OUT_RING(pI830->FrontBuffer.Start);
       else 
          OUT_RING(pI8301->FrontBuffer2.Start);
 
       /* Set the entire frontbuffer up as a texture */
-      OUT_RING(0x7d000003);
+      OUT_RING(_3DSTATE_MAP_STATE | 3);
       OUT_RING(0x00000001);
 
       if (I830IsPrimary(pScrn)) 
@@ -359,12 +416,12 @@ I915UpdateRotate (ScreenPtr      pScreen
          use_fence = 4;
       
       if (pI830->cpp == 1)
-         use_fence |= 0x80; /* MAPSURF_8BIT */
+	 use_fence |= MAPSURF_8BIT;
       else
       if (pI830->cpp == 2)
-         use_fence |= 0x100; /* MAPSURF_16BIT */
+	 use_fence |= MAPSURF_16BIT;
       else
-         use_fence |= 0x180; /* MAPSURF_32BIT */
+	 use_fence |= MAPSURF_32BIT;
       OUT_RING(use_fence | (pScreen->height - 1) << 21 | (pScreen->width - 1) << 10);
       OUT_RING(((((pScrn->displayWidth * pI830->cpp) / 4) - 1) << 21));
       ADVANCE_LP_RING();
@@ -395,7 +452,7 @@ I915UpdateRotate (ScreenPtr      pScreen
       OUT_RING(MI_NOOP);
 
       /* vertex data */
-      OUT_RING(0x7f0c001f);
+      OUT_RING(PRIM3D_INLINE | PRIM3D_TRIFAN | (32 - 1));
       verts[0][0] = box_x1; verts[0][1] = box_y1;
       verts[1][0] = box_x2; verts[1][1] = box_y1;
       verts[2][0] = box_x2; verts[2][1] = box_y2;
diff --git a/src/i915_reg.h b/src/i915_reg.h
index 886ae81..6d4f8fc 100644
--- a/src/i915_reg.h
+++ b/src/i915_reg.h
@@ -233,6 +233,22 @@
 #define IAB_DST_FACTOR_SHIFT		0
 #define IAB_DST_FACTOR_MASK		(BLENDFACT_MASK<<0)
 
+#define BLENDFACT_ZERO			0x01
+#define BLENDFACT_ONE			0x02
+#define BLENDFACT_SRC_COLR		0x03
+#define BLENDFACT_INV_SRC_COLR 		0x04
+#define BLENDFACT_SRC_ALPHA		0x05
+#define BLENDFACT_INV_SRC_ALPHA 	0x06
+#define BLENDFACT_DST_ALPHA		0x07
+#define BLENDFACT_INV_DST_ALPHA 	0x08
+#define BLENDFACT_DST_COLR		0x09
+#define BLENDFACT_INV_DST_COLR		0x0a
+#define BLENDFACT_SRC_ALPHA_SATURATE	0x0b
+#define BLENDFACT_CONST_COLOR		0x0c
+#define BLENDFACT_INV_CONST_COLOR	0x0d
+#define BLENDFACT_CONST_ALPHA		0x0e
+#define BLENDFACT_INV_CONST_ALPHA	0x0f
+#define BLENDFACT_MASK          	0x0f
 
 #define BLENDFUNC_ADD			0x0
 #define BLENDFUNC_SUBTRACT		0x1
@@ -430,6 +446,7 @@
 #define ENABLE_LOGIC_OP_FUNC		(1<<23)
 #define LOGIC_OP_FUNC(x)		((x)<<18)
 #define LOGICOP_MASK			(0xf<<18)
+#define LOGICOP_COPY			0xc
 #define MODE4_ENABLE_STENCIL_TEST_MASK	((1<<17)|(0xff00))
 #define ENABLE_STENCIL_TEST_MASK	(1<<17)
 #define STENCIL_TEST_MASK(x)		((x)<<8)
diff-tree 16d6263e6518a4a05562e2842ff2d0fdb4710304 (from 2f50f6d1b1b3fa4fbec98bd8fa5818df890070e7)
Author: Alan Hourihane <alanh at fairlite.demon.co.uk>
Date:   Sun Jul 16 20:39:52 2006 +0100

    whoops, reverse part of that.

diff --git a/src/i830.h b/src/i830.h
index 2584e22..14e921d 100644
--- a/src/i830.h
+++ b/src/i830.h
@@ -141,7 +141,7 @@ typedef struct {
 } I830RingBuffer;
 
 typedef struct {
-   unsigned int Fence[FENCE_NEW_NR * 2]; /* i965 has more fence regs */
+   unsigned int Fence[8];
 } I830RegRec, *I830RegPtr;
 
 typedef struct {
@@ -238,12 +238,6 @@ typedef struct _I830Rec {
    int TexGranularity;
    int drmMinor;
    Bool have3DWindows;
-
-   unsigned int front_tiled;
-   unsigned int back_tiled;
-   unsigned int depth_tiled;
-   unsigned int rotated_tiled;
-   unsigned int rotated2_tiled;
 #endif
 
    Bool NeedRingBufferLow;
@@ -383,9 +377,6 @@ typedef struct _I830Rec {
    Bool devicePresence;
 
    OsTimerPtr devicesTimer;
-
-   CARD32 savedAsurf;
-   CARD32 savedBsurf;
 } I830Rec;
 
 #define I830PTR(p) ((I830Ptr)((p)->driverPrivate))
diff-tree 2f50f6d1b1b3fa4fbec98bd8fa5818df890070e7 (from b1c2ea653502dd8547079e7014b698f241433dff)
Author: Alan Hourihane <alanh at fairlite.demon.co.uk>
Date:   Sun Jul 16 20:17:38 2006 +0100

    move ContextMem out of XF86DRI

diff --git a/src/i830.h b/src/i830.h
index 79eb310..2584e22 100644
--- a/src/i830.h
+++ b/src/i830.h
@@ -141,7 +141,7 @@ typedef struct {
 } I830RingBuffer;
 
 typedef struct {
-   unsigned int Fence[8];
+   unsigned int Fence[FENCE_NEW_NR * 2]; /* i965 has more fence regs */
 } I830RegRec, *I830RegPtr;
 
 typedef struct {
@@ -230,14 +230,20 @@ typedef struct _I830Rec {
    CreateScreenResourcesProcPtr    CreateScreenResources;
    int *used3D;
 
+   I830MemRange ContextMem;
 #ifdef XF86DRI
    I830MemRange BackBuffer;
    I830MemRange DepthBuffer;
    I830MemRange TexMem;
    int TexGranularity;
-   I830MemRange ContextMem;
    int drmMinor;
    Bool have3DWindows;
+
+   unsigned int front_tiled;
+   unsigned int back_tiled;
+   unsigned int depth_tiled;
+   unsigned int rotated_tiled;
+   unsigned int rotated2_tiled;
 #endif
 
    Bool NeedRingBufferLow;
@@ -377,6 +383,9 @@ typedef struct _I830Rec {
    Bool devicePresence;
 
    OsTimerPtr devicesTimer;
+
+   CARD32 savedAsurf;
+   CARD32 savedBsurf;
 } I830Rec;
 
 #define I830PTR(p) ((I830Ptr)((p)->driverPrivate))
diff-tree b1c2ea653502dd8547079e7014b698f241433dff (from 8a44a7acfcadbba2410dca750afc9d32bc83706e)
Author: Alan Hourihane <alanh at fairlite.demon.co.uk>
Date:   Tue Jul 11 08:13:30 2006 +0100

    whoops, revert some unnecessary changes

diff --git a/src/i830_driver.c b/src/i830_driver.c
index e55e421..5ce88e1 100644
--- a/src/i830_driver.c
+++ b/src/i830_driver.c
@@ -955,8 +955,6 @@ I830Set640x480(ScrnInfoPtr pScrn)
    if (VBESetVBEMode(pI830->pVbe, m, NULL))
 	   return TRUE;
 
-   ErrorF("Set640x480 failed1\n");
-
    /* if the first failed, let's try the next - usually 800x600 */
    m = 0x32;
    switch (pScrn->depth) {
@@ -972,8 +970,6 @@ I830Set640x480(ScrnInfoPtr pScrn)
    if (VBESetVBEMode(pI830->pVbe, m, NULL))
 	   return TRUE;
 
-   ErrorF("Set640x480 failed2\n");
-
    return FALSE;
 }
 
@@ -5576,10 +5572,6 @@ I830BIOSEnterVT(int scrnIndex, int flags
 
    pI830->leaving = FALSE;
 
-   /* Detect monitor change and switch to suitable mode */
-   if (!pI830->starting)
-      I830DetectMonitorChange(pScrn);
-
 #if 1
    /* Clear the framebuffer */
    memset(pI830->FbBase + pScrn->fbOffset, 0,
@@ -5638,11 +5630,9 @@ I830BIOSEnterVT(int scrnIndex, int flags
    ResetState(pScrn, FALSE);
    SetHWOperatingState(pScrn);
 
-#if 0
    /* Detect monitor change and switch to suitable mode */
    if (!pI830->starting)
       I830DetectMonitorChange(pScrn);
-#endif
 	    
    if (!I830VESASetMode(pScrn, pScrn->currentMode))
       return FALSE;
diff-tree 8a44a7acfcadbba2410dca750afc9d32bc83706e (from parents)
Merge: 584b544987be5cf23dce29ddaf3130e59cfe6fa8 e7723a4e5725147d3bd9ba22c5a3314b0556e440
Author: Alan Hourihane <alanh at fairlite.demon.co.uk>
Date:   Tue Jul 11 07:41:27 2006 +0100

    Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/driver/xf86-video-intel

diff-tree 584b544987be5cf23dce29ddaf3130e59cfe6fa8 (from 5a1b68993f3a3a2e8dcd428a7118e29c36703cd6)
Author: Alan Hourihane <alanh at fairlite.demon.co.uk>
Date:   Tue Jul 11 07:40:40 2006 +0100

    Add an additional check before rotating

diff --git a/src/i830_driver.c b/src/i830_driver.c
index 80a46a4..e55e421 100644
--- a/src/i830_driver.c
+++ b/src/i830_driver.c
@@ -955,6 +955,8 @@ I830Set640x480(ScrnInfoPtr pScrn)
    if (VBESetVBEMode(pI830->pVbe, m, NULL))
 	   return TRUE;
 
+   ErrorF("Set640x480 failed1\n");
+
    /* if the first failed, let's try the next - usually 800x600 */
    m = 0x32;
    switch (pScrn->depth) {
@@ -970,6 +972,8 @@ I830Set640x480(ScrnInfoPtr pScrn)
    if (VBESetVBEMode(pI830->pVbe, m, NULL))
 	   return TRUE;
 
+   ErrorF("Set640x480 failed2\n");
+
    return FALSE;
 }
 
@@ -5572,6 +5576,10 @@ I830BIOSEnterVT(int scrnIndex, int flags
 
    pI830->leaving = FALSE;
 
+   /* Detect monitor change and switch to suitable mode */
+   if (!pI830->starting)
+      I830DetectMonitorChange(pScrn);
+
 #if 1
    /* Clear the framebuffer */
    memset(pI830->FbBase + pScrn->fbOffset, 0,
@@ -5630,9 +5638,11 @@ I830BIOSEnterVT(int scrnIndex, int flags
    ResetState(pScrn, FALSE);
    SetHWOperatingState(pScrn);
 
+#if 0
    /* Detect monitor change and switch to suitable mode */
    if (!pI830->starting)
       I830DetectMonitorChange(pScrn);
+#endif
 	    
    if (!I830VESASetMode(pScrn, pScrn->currentMode))
       return FALSE;
@@ -5718,7 +5728,7 @@ I830BIOSSwitchMode(int scrnIndex, Displa
     * The extra WindowTable check detects a rotation at startup.
     */
    if ( (!WindowTable[pScrn->scrnIndex] || pspix->devPrivate.ptr == NULL) &&
-         !pI830->DGAactive ) {
+         !pI830->DGAactive && (pScrn->PointerMoved == I830PointerMoved) ) {
       if (!I830Rotate(pScrn, mode))
          ret = FALSE;
    }
diff-tree e7723a4e5725147d3bd9ba22c5a3314b0556e440 (from parents)
Merge: 5111b883480a5a9cc82200f2684cba67b515aa73 dae9cb7712d5d8f88697ca83808c59af08364c0e
Author: Eric Anholt <anholt at FreeBSD.org>
Date:   Mon Jun 26 16:04:33 2006 +0200

    Merge branch 'origin'

diff-tree 5111b883480a5a9cc82200f2684cba67b515aa73 (from f2967a2f5f47b636b2445fa69dbc3ec79e065c90)
Author: Eric Anholt <anholt at FreeBSD.org>
Date:   Mon Jun 26 14:53:10 2006 +0200

    Turn on extra warning flags for GCC, and clean up the resulting fallout.

diff --git a/configure.ac b/configure.ac
index a5f8e77..82d3e55 100644
--- a/configure.ac
+++ b/configure.ac
@@ -89,6 +89,18 @@ if test x$DRI = xauto; then
 fi
 AC_MSG_RESULT([$DRI])
 
+dnl Use lots of warning flags with GCC
+
+WARN_CFLAGS=""
+
+if test "x$GCC" = "xyes"; then
+	WARN_CFLAGS="-Wall -Wpointer-arith -Wstrict-prototypes \
+	-Wmissing-prototypes -Wmissing-declarations \
+	-Wnested-externs -fno-strict-aliasing"
+fi
+
+CFLAGS="$CFLAGS $WARN_CFLAGS"
+
 AM_CONDITIONAL(DRI, test x$DRI = xyes)
 if test "$DRI" = yes; then
         PKG_CHECK_MODULES(DRI, [libdrm >= 2.0 xf86driproto])
diff --git a/src/i810_dri.c b/src/i810_dri.c
index 8c05980..a8c10ff 100644
--- a/src/i810_dri.c
+++ b/src/i810_dri.c
@@ -492,7 +492,7 @@ I810DRIScreenInit(ScreenPtr pScreen)
       return FALSE;
    }
    xf86DrvMsg(pScreen->myNum, X_INFO, "[drm] Registers = 0x%08x\n",
-	      pI810DRI->regs);
+	      (int)pI810DRI->regs);
 
    pI810->backHandle = DRM_AGP_NO_HANDLE;
    pI810->zHandle = DRM_AGP_NO_HANDLE;
@@ -532,7 +532,7 @@ I810DRIScreenInit(ScreenPtr pScreen)
    pI810->dcacheHandle = dcacheHandle;
 
    xf86DrvMsg(pScreen->myNum, X_INFO, "[agp] dcacheHandle : 0x%x\n",
-	      dcacheHandle);
+	      (int)dcacheHandle);
 
 #define Elements(x) sizeof(x)/sizeof(*x)
    for (pitch_idx = 0; pitch_idx < Elements(i810_pitches); pitch_idx++)
diff --git a/src/i830.h b/src/i830.h
index d227662..5315dff 100644
--- a/src/i830.h
+++ b/src/i830.h
@@ -471,6 +471,16 @@ extern Bool I830CheckModeSupport(ScrnInf
 extern Bool I830Rotate(ScrnInfoPtr pScrn, DisplayModePtr mode);
 extern Bool I830FixOffset(ScrnInfoPtr pScrn, I830MemRange *mem);
 
+/* i830_memory.c */
+Bool I830BindAGPMemory(ScrnInfoPtr pScrn);
+Bool I830UnbindAGPMemory(ScrnInfoPtr pScrn);
+
+/* i830_randr.c */
+Bool I830RandRInit(ScreenPtr pScreen, int rotation);
+Bool I830RandRSetConfig(ScreenPtr pScreen, Rotation rotation, int rate,
+			RRScreenSizePtr pSize);
+Rotation I830GetRotation(ScreenPtr pScreen);
+
 /*
  * 12288 is set as the maximum, chosen because it is enough for
  * 1920x1440 at 32bpp with a 2048 pixel line pitch with some to spare.
diff --git a/src/i830_dri.c b/src/i830_dri.c
index 13d2cfd..52c83cf 100644
--- a/src/i830_dri.c
+++ b/src/i830_dri.c
@@ -104,7 +104,9 @@ static void I830DRITransitionTo3d(Screen
 static void I830DRITransitionMultiToSingle3d(ScreenPtr pScreen);
 static void I830DRITransitionSingleToMulti3d(ScreenPtr pScreen);
 
+#if 0
 static void I830DRIShadowUpdate (ScreenPtr pScreen, shadowBufPtr pBuf);
+#endif
 
 extern void GlxSetVisualConfigs(int nconfigs,
 				__GLXvisualConfig * configs,
@@ -487,7 +489,7 @@ I830DRIScreenInit(ScreenPtr pScreen)
    pDRIInfo->ddxDriverMinorVersion = I830_MINOR_VERSION;
    pDRIInfo->ddxDriverPatchVersion = I830_PATCHLEVEL;
 #if 1 /* temporary until this gets removed from the libdri layer */
-   pDRIInfo->frameBufferPhysicalAddress = (pointer) pI830->LinearAddr +
+   pDRIInfo->frameBufferPhysicalAddress = (char *) pI830->LinearAddr +
 					  pI830->FrontBuffer.Start;
    pDRIInfo->frameBufferSize = ROUND_TO_PAGE(pScrn->displayWidth *
 					     pScrn->virtualY * pI830->cpp);
@@ -635,7 +637,7 @@ I830DRIMapScreenRegions(ScrnInfoPtr pScr
       return FALSE;
    }
    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "[drm] Front Buffer = 0x%08x\n",
-              sarea->front_handle);
+              (int)sarea->front_handle);
 
    if (drmAddMap(pI830->drmSubFD,
                  (drm_handle_t)(sarea->back_offset + pI830->LinearAddr),
@@ -647,7 +649,7 @@ I830DRIMapScreenRegions(ScrnInfoPtr pScr
       return FALSE;
    }
    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "[drm] Back Buffer = 0x%08x\n",
-              sarea->back_handle);
+              (int)sarea->back_handle);
 
    if (drmAddMap(pI830->drmSubFD,
                  (drm_handle_t)sarea->depth_offset + pI830->LinearAddr,
@@ -659,7 +661,7 @@ I830DRIMapScreenRegions(ScrnInfoPtr pScr
       return FALSE;
    }
    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "[drm] Depth Buffer = 0x%08x\n",
-              sarea->depth_handle);
+              (int)sarea->depth_handle);
 
    if (drmAddMap(pI830->drmSubFD,
 		 (drm_handle_t)sarea->tex_offset + pI830->LinearAddr,
@@ -671,7 +673,7 @@ I830DRIMapScreenRegions(ScrnInfoPtr pScr
       return FALSE;
    }
    xf86DrvMsg(pScrn->scrnIndex, X_INFO, "[drm] textures = 0x%08x\n",
-	      sarea->tex_handle);
+	      (int)sarea->tex_handle);
 
    return TRUE;
 }
@@ -746,7 +748,7 @@ I830DRIDoMappings(ScreenPtr pScreen)
       return FALSE;
    }
    xf86DrvMsg(pScreen->myNum, X_INFO, "[drm] Registers = 0x%08x\n",
-	      pI830DRI->regs);
+	      (int)pI830DRI->regs);
 
    if (drmAddMap(pI830->drmSubFD,
 		 (drm_handle_t)pI830->LpRing->mem.Start + pI830->LinearAddr,
@@ -758,7 +760,7 @@ I830DRIDoMappings(ScreenPtr pScreen)
       return FALSE;
    }
    xf86DrvMsg(pScreen->myNum, X_INFO, "[drm] ring buffer = 0x%08x\n",
-	      pI830->ring_map);
+	      (int)pI830->ring_map);
 
    if (!I830InitDma(pScrn)) {
       DRICloseScreen(pScreen);
diff --git a/src/i830_randr.c b/src/i830_randr.c
index be790c9..0311f2b 100644
--- a/src/i830_randr.c
+++ b/src/i830_randr.c
@@ -313,7 +313,6 @@ I830RandRInit (ScreenPtr    pScreen, int
 {
     rrScrPrivPtr	rp;
     XF86RandRInfoPtr	randrp;
-    ScrnInfoPtr		scrp = XF86SCRNINFO(pScreen);
     
 #ifdef PANORAMIX
     /* XXX disable RandR when using Xinerama */
diff-tree dae9cb7712d5d8f88697ca83808c59af08364c0e (from 5a1b68993f3a3a2e8dcd428a7118e29c36703cd6)
Author: Alan Coopersmith <alan.coopersmith at sun.com>
Date:   Thu Jun 22 15:07:16 2006 -0700

    Provide definitions of __FUNCTION__ for non-gcc compilers

diff --git a/src/common.h b/src/common.h
index a6e4ca3..31e67b9 100644
--- a/src/common.h
+++ b/src/common.h
@@ -39,13 +39,18 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN
 #ifndef _INTEL_COMMON_H_
 #define _INTEL_COMMON_H_
 
-#ifdef __GNUC__
+/* Provide substitutes for gcc's __FUNCTION__ on other compilers */
+#ifndef __GNUC__
+# if defined(__STDC__) && (__STDC_VERSION__>=199901L) /* C99 */
+#  define __FUNCTION__ __func__
+# else
+#  define __FUNCTION__ ""
+# endif
+#endif
+
+
 #define PFX __FILE__,__LINE__,__FUNCTION__
 #define FUNCTION_NAME __FUNCTION__
-#else
-#define PFX __FILE__,__LINE__,""
-#define FUNCTION_NAME ""
-#endif
 
 #ifdef I830DEBUG
 #define MARKER() ErrorF("\n### %s:%d: >>> %s <<< ###\n\n", \
diff-tree 5a1b68993f3a3a2e8dcd428a7118e29c36703cd6 (from 16b310823bacab6be4947da234b3a081b0a3cd62)
Author: Alan Hourihane <alanh at fairlite.demon.co.uk>
Date:   Wed Jun 21 08:41:16 2006 +0100

    Fix build without DRI

diff --git a/src/Makefile.am b/src/Makefile.am
index ef8fc64..2745e8c 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -55,16 +55,16 @@ i810_drv_la_SOURCES = \
          i830_video.c \
          i830_rotate.c \
 	 i830_randr.c \
+	 i830_3d.c \
 	 i830_reg.h \
+	 i915_3d.c \
 	 i915_reg.h
 
 if DRI
 i810_drv_la_SOURCES += \
-	 i830_3d.c \
          i810_dri.c \
          i810_dri.h \
          i830_dri.c \
          i810_hwmc.c \
-	 i915_3d.c \
          i830_dri.h 
 endif
diff --git a/src/i830.h b/src/i830.h
index 4fc3987..ac95e36 100644
--- a/src/i830.h
+++ b/src/i830.h
@@ -395,6 +395,8 @@ extern void I830Sync(ScrnInfoPtr pScrn);
 extern void I830InitHWCursor(ScrnInfoPtr pScrn);
 extern Bool I830CursorInit(ScreenPtr pScreen);
 extern void IntelEmitInvarientState(ScrnInfoPtr pScrn);
+extern void I830EmitInvarientState(ScrnInfoPtr pScrn);
+extern void I915EmitInvarientState(ScrnInfoPtr pScrn);
 extern void I830SelectBuffer(ScrnInfoPtr pScrn, int buffer);
 
 extern void I830RefreshRing(ScrnInfoPtr pScrn);
diff --git a/src/i830_3d.c b/src/i830_3d.c
index 547e556..0efd6e4 100644
--- a/src/i830_3d.c
+++ b/src/i830_3d.c
@@ -30,7 +30,6 @@
 #endif
 
 #include "i830.h"
-#include "i830_dri.h"
 
 #include "i830_reg.h"
 
diff --git a/src/i830_dri.c b/src/i830_dri.c
index 7c65f65..6f9a3ee 100644
--- a/src/i830_dri.c
+++ b/src/i830_dri.c
@@ -1182,35 +1182,6 @@ I830DRIMoveBuffers(WindowPtr pParent, DD
    pI830->AccelInfoRec->NeedToSync = TRUE;
 }
 
-extern I830EmitInvarientState(ScrnInfoPtr pScrn);
-extern I915EmitInvarientState(ScrnInfoPtr pScrn);
-
-/* Initialize the first context */
-void
-IntelEmitInvarientState(ScrnInfoPtr pScrn)
-{
-   I830Ptr pI830 = I830PTR(pScrn);
-   CARD32 ctx_addr;
-
-   ctx_addr = pI830->ContextMem.Start;
-   /* Align to a 2k boundry */
-   ctx_addr = ((ctx_addr + 2048 - 1) / 2048) * 2048;
-
-   {
-      BEGIN_LP_RING(2);
-      OUT_RING(MI_SET_CONTEXT);
-      OUT_RING(ctx_addr |
-	       CTXT_NO_RESTORE |
-	       CTXT_PALETTE_SAVE_DISABLE | CTXT_PALETTE_RESTORE_DISABLE);
-      ADVANCE_LP_RING();
-   }
-
-   if (IS_I9XX(pI830))
-      I915EmitInvarientState(pScrn);
-   else
-      I830EmitInvarientState(pScrn);
-}
-
 /* Use callbacks from dri.c to support pageflipping mode for a single
  * 3d context without need for any specific full-screen extension.
  *
diff --git a/src/i830_driver.c b/src/i830_driver.c
index 907b204..80a46a4 100644
--- a/src/i830_driver.c
+++ b/src/i830_driver.c
@@ -4755,6 +4755,32 @@ I830InitFBManager(
    return ret;
 }
 
+/* Initialize the first context */
+void
+IntelEmitInvarientState(ScrnInfoPtr pScrn)
+{
+   I830Ptr pI830 = I830PTR(pScrn);
+   CARD32 ctx_addr;
+
+   ctx_addr = pI830->ContextMem.Start;
+   /* Align to a 2k boundry */
+   ctx_addr = ((ctx_addr + 2048 - 1) / 2048) * 2048;
+
+   {
+      BEGIN_LP_RING(2);
+      OUT_RING(MI_SET_CONTEXT);
+      OUT_RING(ctx_addr |
+	       CTXT_NO_RESTORE |
+	       CTXT_PALETTE_SAVE_DISABLE | CTXT_PALETTE_RESTORE_DISABLE);
+      ADVANCE_LP_RING();
+   }
+
+   if (IS_I9XX(pI830))
+      I915EmitInvarientState(pScrn);
+   else
+      I830EmitInvarientState(pScrn);
+}
+
 static Bool
 I830BIOSScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
 {
diff --git a/src/i915_3d.c b/src/i915_3d.c
index f6e7219..d8edb18 100644
--- a/src/i915_3d.c
+++ b/src/i915_3d.c
@@ -30,7 +30,6 @@
 #endif
 
 #include "i830.h"
-#include "i830_dri.h"
 
 #include "i915_reg.h"
 
diff-tree 16b310823bacab6be4947da234b3a081b0a3cd62 (from 8a6edba33213911cc2210b5e903428b81d45862f)
Author: Matthieu Herrb <matthieu at deville.herrb.com>
Date:   Wed Jun 21 00:12:27 2006 +0200

    Fix build without DRI

diff --git a/src/Makefile.am b/src/Makefile.am
index 2745e8c..ef8fc64 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -55,16 +55,16 @@ i810_drv_la_SOURCES = \
          i830_video.c \
          i830_rotate.c \
 	 i830_randr.c \
-	 i830_3d.c \
 	 i830_reg.h \
-	 i915_3d.c \
 	 i915_reg.h
 
 if DRI
 i810_drv_la_SOURCES += \
+	 i830_3d.c \
          i810_dri.c \
          i810_dri.h \
          i830_dri.c \
          i810_hwmc.c \
+	 i915_3d.c \
          i830_dri.h 
 endif
diff-tree 8a6edba33213911cc2210b5e903428b81d45862f (from a73ab7f0e6e3b0462e05c0031ffd602ed3e2bcd4)
Author: Keith Packard <keithp at neko.keithp.com>
Date:   Mon Jun 19 13:47:28 2006 -0700

    Set vblank interrupt configuration to match pipe configuration
    
    New i915 drm ioctl (in version 1.5) allows the X server to select
    which pipe drives vblank interrupts. Use this to drive from the 'preferred'
    pipe. Yes, per-window vblanks would be nice in a shared fb environment.
    Maybe someday.
    (cherry picked from 2fb375b665f4802819b89f2277fd6154006c11ee commit)

diff --git a/src/i830.h b/src/i830.h
index 4fa3328..4fc3987 100644
--- a/src/i830.h
+++ b/src/i830.h
@@ -427,6 +427,7 @@ extern void I830DRIUnmapScreenRegions(Sc
 extern Bool I830DRIMapScreenRegions(ScrnInfoPtr pScrn, drmI830Sarea *sarea);
 extern void I830DRIUnlock(ScrnInfoPtr pScrn);
 extern Bool I830DRILock(ScrnInfoPtr pScrn);
+extern Bool I830DRISetVBlankInterrupt (ScrnInfoPtr pScrn, Bool on);
 #endif
 
 extern Bool I830AccelInit(ScreenPtr pScreen);
diff --git a/src/i830_common.h b/src/i830_common.h
index 41b5cc3..a27bc01 100644
--- a/src/i830_common.h
+++ b/src/i830_common.h
@@ -52,6 +52,9 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.
 #define DRM_I830_INIT_HEAP                0x0a
 #define DRM_I830_CMDBUFFER                0x0b
 #define DRM_I830_DESTROY_HEAP             0x0c
+#define DRM_I830_SET_VBLANK_PIPE	  0x0d
+#define DRM_I830_GET_VBLANK_PIPE	  0x0e
+
 
 typedef struct {
    enum {
@@ -193,5 +196,11 @@ typedef struct {
 	int region;
 } drmI830MemDestroyHeap;
 
+#define	DRM_I830_VBLANK_PIPE_A	1
+#define	DRM_I830_VBLANK_PIPE_B	2
+
+typedef struct {
+	int pipe;
+} drmI830VBlankPipe;
 
 #endif /* _I830_DRM_H_ */
diff --git a/src/i830_dri.c b/src/i830_dri.c
index ed5e685..7c65f65 100644
--- a/src/i830_dri.c
+++ b/src/i830_dri.c
@@ -1454,6 +1454,31 @@ I830UpdateDRIBuffers(ScrnInfoPtr pScrn, 
 }
 
 Bool
+I830DRISetVBlankInterrupt (ScrnInfoPtr pScrn, Bool on)
+{
+    I830Ptr pI830 = I830PTR(pScrn);
+    drmI830VBlankPipe pipe;
+
+    if (pI830->directRenderingEnabled && pI830->drmMinor >= 5) {
+	if (on) {
+	    if (pI830->planeEnabled[1])
+		pipe.pipe = DRM_I830_VBLANK_PIPE_B;
+	    else
+		pipe.pipe = DRM_I830_VBLANK_PIPE_A;
+	} else {
+	    pipe.pipe = 0;
+	}
+	if (drmCommandWrite(pI830->drmSubFD, DRM_I830_SET_VBLANK_PIPE,
+			    &pipe, sizeof (pipe))) {
+	    xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "I830 Vblank Pipe Setup Failed\n");
+	    return FALSE;
+	}
+    }
+
+    return TRUE;
+}
+
+Bool
 I830DRILock(ScrnInfoPtr pScrn)
 {
    I830Ptr pI830 = I830PTR(pScrn);
diff --git a/src/i830_driver.c b/src/i830_driver.c
index a4b891b..907b204 100644
--- a/src/i830_driver.c
+++ b/src/i830_driver.c
@@ -3826,6 +3826,9 @@ RestoreHWState(ScrnInfoPtr pScrn)
 
    DPRINTF(PFX, "RestoreHWState\n");
 
+#ifdef XF86DRI
+   I830DRISetVBlankInterrupt (pScrn, FALSE);
+#endif
    if (I830IsPrimary(pScrn) && pI830->pipe != pI830->origPipe)
       SetBIOSPipe(pScrn, pI830->origPipe);
    else
@@ -4411,6 +4414,9 @@ I830VESASetMode(ScrnInfoPtr pScrn, Displ
 #endif
 
 #ifdef XF86DRI
+   I830DRISetVBlankInterrupt (pScrn, TRUE);
+#endif
+#ifdef XF86DRI
    if (didLock)
       I830DRIUnlock(pScrn);
 #endif
diff-tree a73ab7f0e6e3b0462e05c0031ffd602ed3e2bcd4 (from 1fe3dd38eb613475d62140850e64767defed7d34)
Author: Alan Hourihane <alanh at fairlite.demon.co.uk>
Date:   Mon Jun 19 11:35:42 2006 +0100

    additions for rotation fixes

diff --git a/src/Makefile.am b/src/Makefile.am
index c64c203..2745e8c 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -54,7 +54,11 @@ i810_drv_la_SOURCES = \
          i830_modes.c \
          i830_video.c \
          i830_rotate.c \
-	 i830_randr.c
+	 i830_randr.c \
+	 i830_3d.c \
+	 i830_reg.h \
+	 i915_3d.c \
+	 i915_reg.h
 
 if DRI
 i810_drv_la_SOURCES += \
diff --git a/src/i830.h b/src/i830.h
index d227662..4fa3328 100644
--- a/src/i830.h
+++ b/src/i830.h
@@ -394,7 +394,7 @@ extern void I830PrintErrorState(ScrnInfo
 extern void I830Sync(ScrnInfoPtr pScrn);
 extern void I830InitHWCursor(ScrnInfoPtr pScrn);
 extern Bool I830CursorInit(ScreenPtr pScreen);
-extern void I830EmitInvarientState(ScrnInfoPtr pScrn);
+extern void IntelEmitInvarientState(ScrnInfoPtr pScrn);
 extern void I830SelectBuffer(ScrnInfoPtr pScrn, int buffer);
 
 extern void I830RefreshRing(ScrnInfoPtr pScrn);
diff --git a/src/i830_dri.c b/src/i830_dri.c
index 13d2cfd..ed5e685 100644
--- a/src/i830_dri.c
+++ b/src/i830_dri.c
@@ -1182,14 +1182,16 @@ I830DRIMoveBuffers(WindowPtr pParent, DD
    pI830->AccelInfoRec->NeedToSync = TRUE;
 }
 
+extern I830EmitInvarientState(ScrnInfoPtr pScrn);
+extern I915EmitInvarientState(ScrnInfoPtr pScrn);
+
 /* Initialize the first context */
 void
-I830EmitInvarientState(ScrnInfoPtr pScrn)
+IntelEmitInvarientState(ScrnInfoPtr pScrn)
 {
    I830Ptr pI830 = I830PTR(pScrn);
    CARD32 ctx_addr;
 
-
    ctx_addr = pI830->ContextMem.Start;
    /* Align to a 2k boundry */
    ctx_addr = ((ctx_addr + 2048 - 1) / 2048) * 2048;
@@ -1202,6 +1204,11 @@ I830EmitInvarientState(ScrnInfoPtr pScrn
 	       CTXT_PALETTE_SAVE_DISABLE | CTXT_PALETTE_RESTORE_DISABLE);
       ADVANCE_LP_RING();
    }
+
+   if (IS_I9XX(pI830))
+      I915EmitInvarientState(pScrn);
+   else
+      I830EmitInvarientState(pScrn);
 }
 
 /* Use callbacks from dri.c to support pageflipping mode for a single
diff --git a/src/i830_driver.c b/src/i830_driver.c
index e43e355..a4b891b 100644
--- a/src/i830_driver.c
+++ b/src/i830_driver.c
@@ -5107,12 +5107,13 @@ I830BIOSScreenInit(int scrnIndex, Screen
    }
 #endif
 
+   /* Setup 3D engine, needed for rotation too */
+   IntelEmitInvarientState(pScrn);
+
 #ifdef XF86DRI
    if (pI830->directRenderingEnabled) {
       pI830->directRenderingOpen = TRUE;
       xf86DrvMsg(pScrn->scrnIndex, X_INFO, "direct rendering: Enabled\n");
-      /* Setup 3D engine */
-      I830EmitInvarientState(pScrn);
    } else {
       if (driDisabled)
 	 xf86DrvMsg(pScrn->scrnIndex, X_INFO, "direct rendering: Disabled\n");
@@ -5622,7 +5623,6 @@ I830BIOSEnterVT(int scrnIndex, int flags
       if (!pI830->starting) {
 	 I830DRIResume(screenInfo.screens[scrnIndex]);
       
-	 I830EmitInvarientState(pScrn);
 	 I830RefreshRing(pScrn);
 	 I830Sync(pScrn);
 	 DO_RING_IDLE();
@@ -5634,6 +5634,9 @@ I830BIOSEnterVT(int scrnIndex, int flags
    }
 #endif
 
+   /* Needed for rotation */
+   IntelEmitInvarientState(pScrn);
+
    if (pI830->checkDevices)
       pI830->devicesTimer = TimerSet(NULL, 0, 1000, I830CheckDevicesTimer, pScrn);
 
diff-tree 1fe3dd38eb613475d62140850e64767defed7d34 (from 3592b432b48d51d2273c1e1064f85e656fbba130)
Author: Alan Hourihane <alanh at fairlite.demon.co.uk>
Date:   Mon Jun 19 11:27:28 2006 +0100

    Set some invarient state, cures some problems with
    rotation at startup.
    
    This mimicks the 3D drivers setup.

diff --git a/src/i830_3d.c b/src/i830_3d.c
new file mode 100644
index 0000000..547e556
--- /dev/null
+++ b/src/i830_3d.c
@@ -0,0 +1,131 @@
+/**************************************************************************
+ * 
+ * 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.
+ * 
+ **************************************************************************/
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "i830.h"
+#include "i830_dri.h"
+
+#include "i830_reg.h"
+
+#define CMD_3D (0x3<<29)
+
+void I830EmitInvarientState( ScrnInfoPtr pScrn )
+{
+   I830Ptr pI830 = I830PTR(pScrn);
+
+   BEGIN_LP_RING(38);
+
+   OUT_RING(_3DSTATE_MAP_CUBE | MAP_UNIT(0));
+   OUT_RING(_3DSTATE_MAP_CUBE | MAP_UNIT(1));
+   OUT_RING(_3DSTATE_MAP_CUBE | MAP_UNIT(2));
+   OUT_RING(_3DSTATE_MAP_CUBE | MAP_UNIT(3));
+
+   OUT_RING(_3DSTATE_DFLT_DIFFUSE_CMD);
+   OUT_RING(0);
+
+   OUT_RING(_3DSTATE_DFLT_SPEC_CMD);
+   OUT_RING(0);
+
+   OUT_RING(_3DSTATE_DFLT_Z_CMD);
+   OUT_RING(0);
+
+   OUT_RING(_3DSTATE_FOG_MODE_CMD);
+   OUT_RING(FOGFUNC_ENABLE |
+	     FOG_LINEAR_CONST | 
+	     FOGSRC_INDEX_Z | 
+	     ENABLE_FOG_DENSITY);
+   OUT_RING(0);
+   OUT_RING(0);
+
+
+   OUT_RING(_3DSTATE_MAP_TEX_STREAM_CMD |
+	     MAP_UNIT(0) |
+	     DISABLE_TEX_STREAM_BUMP |
+	     ENABLE_TEX_STREAM_COORD_SET |
+	     TEX_STREAM_COORD_SET(0) |
+	     ENABLE_TEX_STREAM_MAP_IDX | TEX_STREAM_MAP_IDX(0));
+   OUT_RING(_3DSTATE_MAP_TEX_STREAM_CMD |
+	     MAP_UNIT(1) |
+	     DISABLE_TEX_STREAM_BUMP |
+	     ENABLE_TEX_STREAM_COORD_SET |
+	     TEX_STREAM_COORD_SET(1) |
+	     ENABLE_TEX_STREAM_MAP_IDX | TEX_STREAM_MAP_IDX(1));
+   OUT_RING(_3DSTATE_MAP_TEX_STREAM_CMD |
+	     MAP_UNIT(2) |
+	     DISABLE_TEX_STREAM_BUMP |
+	     ENABLE_TEX_STREAM_COORD_SET |
+	     TEX_STREAM_COORD_SET(2) |
+	     ENABLE_TEX_STREAM_MAP_IDX | TEX_STREAM_MAP_IDX(2));
+   OUT_RING(_3DSTATE_MAP_TEX_STREAM_CMD |
+	     MAP_UNIT(3) |
+	     DISABLE_TEX_STREAM_BUMP |
+	     ENABLE_TEX_STREAM_COORD_SET |
+	     TEX_STREAM_COORD_SET(3) |
+	     ENABLE_TEX_STREAM_MAP_IDX | TEX_STREAM_MAP_IDX(3));
+
+   OUT_RING(_3DSTATE_MAP_COORD_TRANSFORM);
+   OUT_RING(DISABLE_TEX_TRANSFORM | TEXTURE_SET(0));
+   OUT_RING(_3DSTATE_MAP_COORD_TRANSFORM);
+   OUT_RING(DISABLE_TEX_TRANSFORM | TEXTURE_SET(1));
+   OUT_RING(_3DSTATE_MAP_COORD_TRANSFORM);
+   OUT_RING(DISABLE_TEX_TRANSFORM | TEXTURE_SET(2));
+   OUT_RING(_3DSTATE_MAP_COORD_TRANSFORM);
+   OUT_RING(DISABLE_TEX_TRANSFORM | TEXTURE_SET(3));
+
+   OUT_RING(_3DSTATE_RASTER_RULES_CMD |
+	     ENABLE_POINT_RASTER_RULE |
+	     OGL_POINT_RASTER_RULE |
+	     ENABLE_LINE_STRIP_PROVOKE_VRTX |
+	     ENABLE_TRI_FAN_PROVOKE_VRTX |
+	     ENABLE_TRI_STRIP_PROVOKE_VRTX |
+	     LINE_STRIP_PROVOKE_VRTX(1) |
+	     TRI_FAN_PROVOKE_VRTX(2) | 
+	     TRI_STRIP_PROVOKE_VRTX(2));
+
+   OUT_RING(_3DSTATE_SCISSOR_ENABLE_CMD | 
+	     DISABLE_SCISSOR_RECT);
+
+   OUT_RING(_3DSTATE_SCISSOR_RECT_0_CMD);
+   OUT_RING(0);
+   OUT_RING(0);
+
+   OUT_RING(_3DSTATE_VERTEX_TRANSFORM);
+   OUT_RING(DISABLE_VIEWPORT_TRANSFORM | DISABLE_PERSPECTIVE_DIVIDE);
+
+   OUT_RING(_3DSTATE_W_STATE_CMD);
+   OUT_RING(MAGIC_W_STATE_DWORD1);
+   OUT_RING(0x3f800000 /* 1.0 in IEEE float */ );
+
+
+   OUT_RING(_3DSTATE_COLOR_FACTOR_CMD);
+   OUT_RING(0x80808080);	/* .5 required in alpha for GL_DOT3_RGBA_EXT */
+
+   ADVANCE_LP_RING();
+}
diff --git a/src/i830_reg.h b/src/i830_reg.h
new file mode 100644
index 0000000..be12e76
--- /dev/null
+++ b/src/i830_reg.h
@@ -0,0 +1,637 @@
+/**************************************************************************
+ * 
+ * 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 _I830_REG_H_
+#define _I830_REG_H_
+
+#define I830_SET_FIELD( var, mask, value ) (var &= ~(mask), var |= value)
+
+#define _3DSTATE_AA_CMD			(CMD_3D | (0x06<<24))
+#define AA_LINE_ECAAR_WIDTH_ENABLE	(1<<16)
+#define AA_LINE_ECAAR_WIDTH_0_5 	0
+#define AA_LINE_ECAAR_WIDTH_1_0		(1<<14)
+#define AA_LINE_ECAAR_WIDTH_2_0 	(2<<14)
+#define AA_LINE_ECAAR_WIDTH_4_0 	(3<<14)
+#define AA_LINE_REGION_WIDTH_ENABLE	(1<<8)
+#define AA_LINE_REGION_WIDTH_0_5	0
+#define AA_LINE_REGION_WIDTH_1_0	(1<<6)
+#define AA_LINE_REGION_WIDTH_2_0	(2<<6)
+#define AA_LINE_REGION_WIDTH_4_0	(3<<6)
+#define AA_LINE_ENABLE			((1<<1) | 1)
+#define AA_LINE_DISABLE			(1<<1)
+
+#define _3DSTATE_BUF_INFO_CMD	(CMD_3D | (0x1d<<24) | (0x8e<<16) | 1)
+/* Dword 1 */
+#define BUF_3D_ID_COLOR_BACK	(0x3<<24)
+#define BUF_3D_ID_DEPTH 	(0x7<<24)
+#define BUF_3D_USE_FENCE	(1<<23)
+#define BUF_3D_TILED_SURFACE	(1<<22)
+#define BUF_3D_TILE_WALK_X	0
+#define BUF_3D_TILE_WALK_Y	(1<<21)
+#define BUF_3D_PITCH(x)         (((x)/4)<<2)
+/* Dword 2 */
+#define BUF_3D_ADDR(x)		((x) & ~0x3)
+
+
+#define _3DSTATE_COLOR_FACTOR_CMD	(CMD_3D | (0x1d<<24) | (0x1<<16))
+
+#define _3DSTATE_COLOR_FACTOR_N_CMD(stage)	(CMD_3D | (0x1d<<24) | \
+					         ((0x90+(stage))<<16))
+
+#define _3DSTATE_CONST_BLEND_COLOR_CMD	(CMD_3D | (0x1d<<24) | (0x88<<16))
+
+#define _3DSTATE_DFLT_DIFFUSE_CMD	(CMD_3D | (0x1d<<24) | (0x99<<16))
+
+#define _3DSTATE_DFLT_SPEC_CMD		(CMD_3D | (0x1d<<24) | (0x9a<<16))
+
+#define _3DSTATE_DFLT_Z_CMD		(CMD_3D | (0x1d<<24) | (0x98<<16))
+
+
+#define _3DSTATE_DST_BUF_VARS_CMD	(CMD_3D | (0x1d<<24) | (0x85<<16))
+/* Dword 1 */
+#define DSTORG_HORT_BIAS(x)		((x)<<20)
+#define DSTORG_VERT_BIAS(x)		((x)<<16)
+#define COLOR_4_2_2_CHNL_WRT_ALL	0
+#define COLOR_4_2_2_CHNL_WRT_Y		(1<<12)
+#define COLOR_4_2_2_CHNL_WRT_CR		(2<<12)
+#define COLOR_4_2_2_CHNL_WRT_CB		(3<<12)
+#define COLOR_4_2_2_CHNL_WRT_CRCB	(4<<12)
+#define COLR_BUF_8BIT			0
+#define COLR_BUF_RGB555 		(1<<8)
+#define COLR_BUF_RGB565 		(2<<8)
+#define COLR_BUF_ARGB8888		(3<<8)
+#define DEPTH_IS_Z			0
+#define DEPTH_IS_W			(1<<6)
+#define DEPTH_FRMT_16_FIXED		0
+#define DEPTH_FRMT_16_FLOAT		(1<<2)
+#define DEPTH_FRMT_24_FIXED_8_OTHER	(2<<2)
+#define DEPTH_FRMT_24_FLOAT_8_OTHER	(3<<2)
+#define VERT_LINE_STRIDE_1		(1<<1)
+#define VERT_LINE_STRIDE_0		0
+#define VERT_LINE_STRIDE_OFS_1		1
+#define VERT_LINE_STRIDE_OFS_0		0
+
+
+#define _3DSTATE_DRAW_RECT_CMD		(CMD_3D|(0x1d<<24)|(0x80<<16)|3)
+/* Dword 1 */
+#define DRAW_RECT_DIS_DEPTH_OFS 	(1<<30)
+#define DRAW_DITHER_OFS_X(x)		((x)<<26)
+#define DRAW_DITHER_OFS_Y(x)		((x)<<24)
+/* Dword 2 */
+#define DRAW_YMIN(x)			((x)<<16)
+#define DRAW_XMIN(x)			(x)
+/* Dword 3 */
+#define DRAW_YMAX(x)			((x)<<16)
+#define DRAW_XMAX(x)			(x)
+/* Dword 4 */
+#define DRAW_YORG(x)			((x)<<16)
+#define DRAW_XORG(x)			(x)
+
+
+#define _3DSTATE_ENABLES_1_CMD		(CMD_3D|(0x3<<24))
+#define ENABLE_LOGIC_OP_MASK		((1<<23)|(1<<22))
+#define ENABLE_LOGIC_OP 		((1<<23)|(1<<22))
+#define DISABLE_LOGIC_OP		(1<<23)
+#define ENABLE_STENCIL_TEST		((1<<21)|(1<<20))
+#define DISABLE_STENCIL_TEST		(1<<21)
+#define ENABLE_DEPTH_BIAS		((1<<11)|(1<<10))
+#define DISABLE_DEPTH_BIAS		(1<<11)
+#define ENABLE_SPEC_ADD_MASK		((1<<9)|(1<<8))
+#define ENABLE_SPEC_ADD 		((1<<9)|(1<<8))
+#define DISABLE_SPEC_ADD		(1<<9)
+#define ENABLE_DIS_FOG_MASK		((1<<7)|(1<<6))
+#define ENABLE_FOG			((1<<7)|(1<<6))
+#define DISABLE_FOG			(1<<7)
+#define ENABLE_DIS_ALPHA_TEST_MASK	((1<<5)|(1<<4))
+#define ENABLE_ALPHA_TEST		((1<<5)|(1<<4))
+#define DISABLE_ALPHA_TEST		(1<<5)
+#define ENABLE_DIS_CBLEND_MASK		((1<<3)|(1<<2))
+#define ENABLE_COLOR_BLEND		((1<<3)|(1<<2))
+#define DISABLE_COLOR_BLEND		(1<<3)
+#define ENABLE_DIS_DEPTH_TEST_MASK	((1<<1)|1)
+#define ENABLE_DEPTH_TEST		((1<<1)|1)
+#define DISABLE_DEPTH_TEST		(1<<1)
+
+/* _3DSTATE_ENABLES_2, p138 */
+#define _3DSTATE_ENABLES_2_CMD		(CMD_3D|(0x4<<24))
+#define ENABLE_STENCIL_WRITE		((1<<21)|(1<<20))
+#define DISABLE_STENCIL_WRITE		(1<<21)
+#define ENABLE_TEX_CACHE		((1<<17)|(1<<16))
+#define DISABLE_TEX_CACHE		(1<<17)
+#define ENABLE_DITHER			((1<<9)|(1<<8))
+#define DISABLE_DITHER			(1<<9)
+#define ENABLE_COLOR_MASK		(1<<10)
+#define WRITEMASK_ALPHA			(1<<7)
+#define WRITEMASK_ALPHA_SHIFT		7
+#define WRITEMASK_RED			(1<<6)
+#define WRITEMASK_RED_SHIFT		6
+#define WRITEMASK_GREEN 		(1<<5)
+#define WRITEMASK_GREEN_SHIFT		5
+#define WRITEMASK_BLUE			(1<<4)
+#define WRITEMASK_BLUE_SHIFT		4
+#define WRITEMASK_MASK			((1<<4)|(1<<5)|(1<<6)|(1<<7))
+#define ENABLE_COLOR_WRITE		((1<<3)|(1<<2))
+#define DISABLE_COLOR_WRITE		(1<<3)
+#define ENABLE_DIS_DEPTH_WRITE_MASK	0x3
+#define ENABLE_DEPTH_WRITE		((1<<1)|1)
+#define DISABLE_DEPTH_WRITE		(1<<1)
+
+/* _3DSTATE_FOG_COLOR, p139 */
+#define _3DSTATE_FOG_COLOR_CMD		(CMD_3D|(0x15<<24))
+#define FOG_COLOR_RED(x)		((x)<<16)
+#define FOG_COLOR_GREEN(x)		((x)<<8)
+#define FOG_COLOR_BLUE(x)		(x)
+
+/* _3DSTATE_FOG_MODE, p140 */
+#define _3DSTATE_FOG_MODE_CMD		(CMD_3D|(0x1d<<24)|(0x89<<16)|2)
+/* Dword 1 */
+#define FOGFUNC_ENABLE			(1<<31)
+#define FOGFUNC_VERTEX			0
+#define FOGFUNC_PIXEL_EXP		(1<<28)
+#define FOGFUNC_PIXEL_EXP2		(2<<28)
+#define FOGFUNC_PIXEL_LINEAR		(3<<28)
+#define FOGSRC_INDEX_Z			(1<<27)
+#define FOGSRC_INDEX_W			((1<<27)|(1<<25))
+#define FOG_LINEAR_CONST		(1<<24)
+#define FOG_CONST_1(x)			((x)<<4)
+#define ENABLE_FOG_DENSITY		(1<<23)
+/* Dword 2 */
+#define FOG_CONST_2(x)			(x)
+/* Dword 3 */
+#define FOG_DENSITY(x)			(x)
+
+/* _3DSTATE_INDEPENDENT_ALPHA_BLEND, p142 */
+#define _3DSTATE_INDPT_ALPHA_BLEND_CMD	(CMD_3D|(0x0b<<24))
+#define ENABLE_INDPT_ALPHA_BLEND	((1<<23)|(1<<22))
+#define DISABLE_INDPT_ALPHA_BLEND	(1<<23)
+#define ALPHA_BLENDFUNC_MASK		0x3f0000
+#define ENABLE_ALPHA_BLENDFUNC		(1<<21)
+#define ABLENDFUNC_ADD			0
+#define ABLENDFUNC_SUB			(1<<16)
+#define ABLENDFUNC_RVSE_SUB		(2<<16)
+#define ABLENDFUNC_MIN			(3<<16)
+#define ABLENDFUNC_MAX			(4<<16)
+#define SRC_DST_ABLEND_MASK		0xfff
+#define ENABLE_SRC_ABLEND_FACTOR	(1<<11)
+#define SRC_ABLEND_FACT(x)		((x)<<6)
+#define ENABLE_DST_ABLEND_FACTOR	(1<<5)
+#define DST_ABLEND_FACT(x)		(x)
+
+
+/* _3DSTATE_MAP_BLEND_ARG, p152 */
+#define _3DSTATE_MAP_BLEND_ARG_CMD(stage)	(CMD_3D|(0x0e<<24)|((stage)<<20))
+
+#define TEXPIPE_COLOR			0
+#define TEXPIPE_ALPHA			(1<<18)
+#define TEXPIPE_KILL			(2<<18)
+#define TEXBLEND_ARG0			0
+#define TEXBLEND_ARG1			(1<<15)
+#define TEXBLEND_ARG2			(2<<15)
+#define TEXBLEND_ARG3			(3<<15)
+#define TEXBLENDARG_MODIFY_PARMS	(1<<6)
+#define TEXBLENDARG_REPLICATE_ALPHA 	(1<<5)
+#define TEXBLENDARG_INV_ARG 		(1<<4)
+#define TEXBLENDARG_ONE 		0
+#define TEXBLENDARG_FACTOR		0x01
+#define TEXBLENDARG_ACCUM		0x02
+#define TEXBLENDARG_DIFFUSE		0x03
+#define TEXBLENDARG_SPEC		0x04
+#define TEXBLENDARG_CURRENT		0x05
+#define TEXBLENDARG_TEXEL0		0x06
+#define TEXBLENDARG_TEXEL1		0x07
+#define TEXBLENDARG_TEXEL2		0x08
+#define TEXBLENDARG_TEXEL3		0x09
+#define TEXBLENDARG_FACTOR_N		0x0e
+
+/* _3DSTATE_MAP_BLEND_OP, p155 */
+#define _3DSTATE_MAP_BLEND_OP_CMD(stage)	(CMD_3D|(0x0d<<24)|((stage)<<20))
+#if 0
+#   define TEXPIPE_COLOR		0
+#   define TEXPIPE_ALPHA		(1<<18)
+#   define TEXPIPE_KILL			(2<<18)
+#endif
+#define ENABLE_TEXOUTPUT_WRT_SEL	(1<<17)
+#define TEXOP_OUTPUT_CURRENT		0
+#define TEXOP_OUTPUT_ACCUM		(1<<15)
+#define ENABLE_TEX_CNTRL_STAGE		((1<<12)|(1<<11))
+#define DISABLE_TEX_CNTRL_STAGE		(1<<12)
+#define TEXOP_SCALE_SHIFT		9
+#define TEXOP_SCALE_1X			(0 << TEXOP_SCALE_SHIFT)
+#define TEXOP_SCALE_2X			(1 << TEXOP_SCALE_SHIFT)
+#define TEXOP_SCALE_4X			(2 << TEXOP_SCALE_SHIFT)
+#define TEXOP_MODIFY_PARMS		(1<<8)
+#define TEXOP_LAST_STAGE		(1<<7)
+#define TEXBLENDOP_KILLPIXEL		0x02
+#define TEXBLENDOP_ARG1 		0x01
+#define TEXBLENDOP_ARG2 		0x02
+#define TEXBLENDOP_MODULATE		0x03
+#define TEXBLENDOP_ADD			0x06
+#define TEXBLENDOP_ADDSIGNED		0x07
+#define TEXBLENDOP_BLEND		0x08
+#define TEXBLENDOP_BLEND_AND_ADD	0x09
+#define TEXBLENDOP_SUBTRACT		0x0a
+#define TEXBLENDOP_DOT3 		0x0b
+#define TEXBLENDOP_DOT4 		0x0c
+#define TEXBLENDOP_MODULATE_AND_ADD	0x0d
+#define TEXBLENDOP_MODULATE_2X_AND_ADD	0x0e
+#define TEXBLENDOP_MODULATE_4X_AND_ADD	0x0f
+
+/* _3DSTATE_MAP_BUMP_TABLE, p160 TODO */
+/* _3DSTATE_MAP_COLOR_CHROMA_KEY, p161 TODO */
+
+#define _3DSTATE_MAP_COORD_TRANSFORM	((3<<29)|(0x1d<<24)|(0x8c<<16))
+#define DISABLE_TEX_TRANSFORM		(1<<28)
+#define TEXTURE_SET(x)			(x<<29)
+
+#define _3DSTATE_VERTEX_TRANSFORM	((3<<29)|(0x1d<<24)|(0x8b<<16))
+#define DISABLE_VIEWPORT_TRANSFORM	(1<<31)
+#define DISABLE_PERSPECTIVE_DIVIDE	(1<<29)
+
+
+/* _3DSTATE_MAP_COORD_SET_BINDINGS, p162 */
+#define _3DSTATE_MAP_COORD_SETBIND_CMD	(CMD_3D|(0x1d<<24)|(0x02<<16))
+#define TEXBIND_MASK3			((1<<15)|(1<<14)|(1<<13)|(1<<12))
+#define TEXBIND_MASK2			((1<<11)|(1<<10)|(1<<9)|(1<<8))
+#define TEXBIND_MASK1			((1<<7)|(1<<6)|(1<<5)|(1<<4))
+#define TEXBIND_MASK0			((1<<3)|(1<<2)|(1<<1)|1)
+
+#define TEXBIND_SET3(x) 		((x)<<12)
+#define TEXBIND_SET2(x) 		((x)<<8)
+#define TEXBIND_SET1(x) 		((x)<<4)
+#define TEXBIND_SET0(x) 		(x)
+
+#define TEXCOORDSRC_KEEP		0
+#define TEXCOORDSRC_DEFAULT		0x01
+#define TEXCOORDSRC_VTXSET_0		0x08
+#define TEXCOORDSRC_VTXSET_1		0x09
+#define TEXCOORDSRC_VTXSET_2		0x0a
+#define TEXCOORDSRC_VTXSET_3		0x0b
+#define TEXCOORDSRC_VTXSET_4		0x0c
+#define TEXCOORDSRC_VTXSET_5		0x0d
+#define TEXCOORDSRC_VTXSET_6		0x0e
+#define TEXCOORDSRC_VTXSET_7		0x0f
+
+#define MAP_UNIT(unit)			((unit)<<16)
+#define MAP_UNIT_MASK			(0x7<<16)
+
+/* _3DSTATE_MAP_COORD_SETS, p164 */
+#define _3DSTATE_MAP_COORD_SET_CMD	(CMD_3D|(0x1c<<24)|(0x01<<19))
+#define ENABLE_TEXCOORD_PARAMS		(1<<15)
+#define TEXCOORDS_ARE_NORMAL		(1<<14)
+#define TEXCOORDS_ARE_IN_TEXELUNITS	0
+#define TEXCOORDTYPE_CARTESIAN		0
+#define TEXCOORDTYPE_HOMOGENEOUS	(1<<11)
+#define TEXCOORDTYPE_VECTOR		(2<<11)
+#define TEXCOORDTYPE_MASK	        (0x7<<11)
+#define ENABLE_ADDR_V_CNTL		(1<<7)
+#define ENABLE_ADDR_U_CNTL		(1<<3)
+#define TEXCOORD_ADDR_V_MODE(x) 	((x)<<4)
+#define TEXCOORD_ADDR_U_MODE(x) 	(x)
+#define TEXCOORDMODE_WRAP		0
+#define TEXCOORDMODE_MIRROR		1
+#define TEXCOORDMODE_CLAMP		2
+#define TEXCOORDMODE_WRAP_SHORTEST	3
+#define TEXCOORDMODE_CLAMP_BORDER	4
+#define TEXCOORD_ADDR_V_MASK		0x70
+#define TEXCOORD_ADDR_U_MASK		0x7
+
+/* _3DSTATE_MAP_CUBE, p168 TODO */
+#define _3DSTATE_MAP_CUBE		(CMD_3D|(0x1c<<24)|(0x0a<<19))
+#define CUBE_NEGX_ENABLE                (1<<5)
+#define CUBE_POSX_ENABLE                (1<<4)
+#define CUBE_NEGY_ENABLE                (1<<3)
+#define CUBE_POSY_ENABLE                (1<<2)
+#define CUBE_NEGZ_ENABLE                (1<<1)
+#define CUBE_POSZ_ENABLE                (1<<0)
+
+
+/* _3DSTATE_MODES_1, p190 */
+#define _3DSTATE_MODES_1_CMD		(CMD_3D|(0x08<<24))
+#define BLENDFUNC_MASK			0x3f0000
+#define ENABLE_COLR_BLND_FUNC		(1<<21)
+#define BLENDFUNC_ADD			0
+#define BLENDFUNC_SUB			(1<<16)
+#define BLENDFUNC_RVRSE_SUB		(2<<16)
+#define BLENDFUNC_MIN			(3<<16)
+#define BLENDFUNC_MAX			(4<<16)
+#define SRC_DST_BLND_MASK		0xfff
+#define ENABLE_SRC_BLND_FACTOR		(1<<11)
+#define ENABLE_DST_BLND_FACTOR		(1<<5)
+#define SRC_BLND_FACT(x)		((x)<<6)
+#define DST_BLND_FACT(x)		(x)
+
+
+/* _3DSTATE_MODES_2, p192 */
+#define _3DSTATE_MODES_2_CMD		(CMD_3D|(0x0f<<24))
+#define ENABLE_GLOBAL_DEPTH_BIAS	(1<<22)
+#define GLOBAL_DEPTH_BIAS(x)		((x)<<14)
+#define ENABLE_ALPHA_TEST_FUNC		(1<<13)
+#define ENABLE_ALPHA_REF_VALUE		(1<<8)
+#define ALPHA_TEST_FUNC(x)		((x)<<9)
+#define ALPHA_REF_VALUE(x)		(x)
+
+#define ALPHA_TEST_REF_MASK		0x3fff
+
+/* _3DSTATE_MODES_3, p193 */
+#define _3DSTATE_MODES_3_CMD		(CMD_3D|(0x02<<24))
+#define DEPTH_TEST_FUNC_MASK		0x1f0000
+#define ENABLE_DEPTH_TEST_FUNC		(1<<20)
+/* Uses COMPAREFUNC */
+#define DEPTH_TEST_FUNC(x)		((x)<<16)
+#define ENABLE_ALPHA_SHADE_MODE 	(1<<11)
+#define ENABLE_FOG_SHADE_MODE		(1<<9)
+#define ENABLE_SPEC_SHADE_MODE		(1<<7)
+#define ENABLE_COLOR_SHADE_MODE 	(1<<5)
+#define ALPHA_SHADE_MODE(x)		((x)<<10)
+#define FOG_SHADE_MODE(x)		((x)<<8)
+#define SPEC_SHADE_MODE(x)		((x)<<6)
+#define COLOR_SHADE_MODE(x)		((x)<<4)
+#define CULLMODE_MASK			0xf
+#define ENABLE_CULL_MODE		(1<<3)
+#define CULLMODE_BOTH			0
+#define CULLMODE_NONE			1
+#define CULLMODE_CW			2
+#define CULLMODE_CCW			3
+
+#define SHADE_MODE_LINEAR		0
+#define SHADE_MODE_FLAT 		0x1
+
+/* _3DSTATE_MODES_4, p195 */
+#define _3DSTATE_MODES_4_CMD		(CMD_3D|(0x16<<24))
+#define ENABLE_LOGIC_OP_FUNC		(1<<23)
+#define LOGIC_OP_FUNC(x)		((x)<<18)
+#define LOGICOP_MASK			((1<<18)|(1<<19)|(1<<20)|(1<<21))
+#define LOGICOP_CLEAR			0
+#define LOGICOP_NOR			0x1
+#define LOGICOP_AND_INV 		0x2
+#define LOGICOP_COPY_INV		0x3
+#define LOGICOP_AND_RVRSE		0x4
+#define LOGICOP_INV			0x5
+#define LOGICOP_XOR			0x6
+#define LOGICOP_NAND			0x7
+#define LOGICOP_AND			0x8
+#define LOGICOP_EQUIV			0x9
+#define LOGICOP_NOOP			0xa
+#define LOGICOP_OR_INV			0xb
+#define LOGICOP_COPY			0xc
+#define LOGICOP_OR_RVRSE		0xd
+#define LOGICOP_OR			0xe
+#define LOGICOP_SET			0xf
+#define MODE4_ENABLE_STENCIL_TEST_MASK	((1<<17)|(0xff00))
+#define ENABLE_STENCIL_TEST_MASK	(1<<17)
+#define STENCIL_TEST_MASK(x)		((x)<<8)
+#define MODE4_ENABLE_STENCIL_WRITE_MASK	((1<<16)|(0x00ff))
+#define ENABLE_STENCIL_WRITE_MASK	(1<<16)
+#define STENCIL_WRITE_MASK(x)		((x)&0xff)
+
+/* _3DSTATE_MODES_5, p196 */
+#define _3DSTATE_MODES_5_CMD		(CMD_3D|(0x0c<<24))
+#define ENABLE_SPRITE_POINT_TEX 	(1<<23)
+#define SPRITE_POINT_TEX_ON		(1<<22)
+#define SPRITE_POINT_TEX_OFF		0
+#define FLUSH_RENDER_CACHE		(1<<18)
+#define FLUSH_TEXTURE_CACHE		(1<<16)
+#define FIXED_LINE_WIDTH_MASK		0xfc00
+#define ENABLE_FIXED_LINE_WIDTH 	(1<<15)
+#define FIXED_LINE_WIDTH(x)		((x)<<10)
+#define FIXED_POINT_WIDTH_MASK		0x3ff
+#define ENABLE_FIXED_POINT_WIDTH	(1<<9)
+#define FIXED_POINT_WIDTH(x)		(x)
+
+/* _3DSTATE_RASTERIZATION_RULES, p198 */
+#define _3DSTATE_RASTER_RULES_CMD	(CMD_3D|(0x07<<24))
+#define ENABLE_POINT_RASTER_RULE	(1<<15)
+#define OGL_POINT_RASTER_RULE		(1<<13)
+#define ENABLE_LINE_STRIP_PROVOKE_VRTX	(1<<8)
+#define ENABLE_TRI_FAN_PROVOKE_VRTX	(1<<5)
+#define ENABLE_TRI_STRIP_PROVOKE_VRTX	(1<<2)
+#define LINE_STRIP_PROVOKE_VRTX(x)	((x)<<6)
+#define TRI_FAN_PROVOKE_VRTX(x) 	((x)<<3)
+#define TRI_STRIP_PROVOKE_VRTX(x)	(x)
+
+/* _3DSTATE_SCISSOR_ENABLE, p200 */
+#define _3DSTATE_SCISSOR_ENABLE_CMD	(CMD_3D|(0x1c<<24)|(0x10<<19))
+#define ENABLE_SCISSOR_RECT		((1<<1) | 1)
+#define DISABLE_SCISSOR_RECT		(1<<1)
+
+/* _3DSTATE_SCISSOR_RECTANGLE_0, p201 */
+#define _3DSTATE_SCISSOR_RECT_0_CMD	(CMD_3D|(0x1d<<24)|(0x81<<16)|1)
+/* Dword 1 */
+#define SCISSOR_RECT_0_YMIN(x)		((x)<<16)
+#define SCISSOR_RECT_0_XMIN(x)		(x)
+/* Dword 2 */
+#define SCISSOR_RECT_0_YMAX(x)		((x)<<16)
+#define SCISSOR_RECT_0_XMAX(x)		(x)
+
+/* _3DSTATE_STENCIL_TEST, p202 */
+#define _3DSTATE_STENCIL_TEST_CMD	(CMD_3D|(0x09<<24))
+#define ENABLE_STENCIL_PARMS		(1<<23)
+#define STENCIL_OPS_MASK		(0xffc000)
+#define STENCIL_FAIL_OP(x)		((x)<<20)
+#define STENCIL_PASS_DEPTH_FAIL_OP(x)	((x)<<17)
+#define STENCIL_PASS_DEPTH_PASS_OP(x)	((x)<<14)
+
+#define ENABLE_STENCIL_TEST_FUNC_MASK	((1<<13)|(1<<12)|(1<<11)|(1<<10)|(1<<9))
+#define ENABLE_STENCIL_TEST_FUNC	(1<<13)
+/* Uses COMPAREFUNC */
+#define STENCIL_TEST_FUNC(x)		((x)<<9)
+#define STENCIL_REF_VALUE_MASK		((1<<8)|0xff)
+#define ENABLE_STENCIL_REF_VALUE	(1<<8)
+#define STENCIL_REF_VALUE(x)		(x)
+
+/* _3DSTATE_VERTEX_FORMAT, p204 */
+#define _3DSTATE_VFT0_CMD	(CMD_3D|(0x05<<24))
+#define VFT0_POINT_WIDTH	(1<<12)
+#define VFT0_TEX_COUNT_MASK    	(7<<8)
+#define VFT0_TEX_COUNT_SHIFT    8
+#define VFT0_TEX_COUNT(x) 	((x)<<8)
+#define VFT0_SPEC		(1<<7)
+#define VFT0_DIFFUSE		(1<<6)
+#define VFT0_DEPTH_OFFSET  	(1<<5)
+#define VFT0_XYZ		(1<<1)
+#define VFT0_XYZW		(2<<1)
+#define VFT0_XY			(3<<1)
+#define VFT0_XYW		(4<<1)
+#define VFT0_XYZW_MASK          (7<<1)
+
+/* _3DSTATE_VERTEX_FORMAT_2, p206 */
+#define _3DSTATE_VFT1_CMD	(CMD_3D|(0x0a<<24))
+#define VFT1_TEX7_FMT(x)	((x)<<14)
+#define VFT1_TEX6_FMT(x)	((x)<<12)
+#define VFT1_TEX5_FMT(x)	((x)<<10)
+#define VFT1_TEX4_FMT(x)	((x)<<8)
+#define VFT1_TEX3_FMT(x)	((x)<<6)
+#define VFT1_TEX2_FMT(x)	((x)<<4)
+#define VFT1_TEX1_FMT(x)	((x)<<2)
+#define VFT1_TEX0_FMT(x)	(x)
+#define VFT1_TEX0_MASK          3
+#define VFT1_TEX1_SHIFT         2
+#define TEXCOORDFMT_2D		0
+#define TEXCOORDFMT_3D		1
+#define TEXCOORDFMT_4D		2
+#define TEXCOORDFMT_1D		3
+
+/*New stuff picked up along the way */
+
+#define MLC_LOD_BIAS_MASK ((1<<7)-1)
+
+
+/* _3DSTATE_VERTEX_TRANSFORM, p207 */
+#define _3DSTATE_VERTEX_TRANS_CMD	(CMD_3D|(0x1d<<24)|(0x8b<<16)|0)
+#define _3DSTATE_VERTEX_TRANS_MTX_CMD	(CMD_3D|(0x1d<<24)|(0x8b<<16)|6)
+/* Dword 1 */
+#define ENABLE_VIEWPORT_TRANSFORM	((1<<31)|(1<<30))
+#define DISABLE_VIEWPORT_TRANSFORM	(1<<31)
+#define ENABLE_PERSP_DIVIDE		((1<<29)|(1<<28))
+#define DISABLE_PERSP_DIVIDE		(1<<29)
+#define VRTX_TRANS_LOAD_MATRICES	0x7421
+#define VRTX_TRANS_NO_LOAD_MATRICES	0x0000
+/* Dword 2 -> 7  are matrix elements */
+
+/* _3DSTATE_W_STATE, p209 */
+#define _3DSTATE_W_STATE_CMD		(CMD_3D|(0x1d<<24)|(0x8d<<16)|1)
+/* Dword 1 */
+#define MAGIC_W_STATE_DWORD1		0x00000008
+/* Dword 2 */
+#define WFAR_VALUE(x)			(x)
+
+
+/* Stipple command, carried over from the i810, apparently:
+ */
+#define _3DSTATE_STIPPLE           ((0x3<<29)|(0x1d<<24)|(0x83<<16))
+#define ST1_ENABLE               (1<<16)
+#define ST1_MASK                 (0xffff)
+
+
+
+#define _3DSTATE_LOAD_STATE_IMMEDIATE_2      ((0x3<<29)|(0x1d<<24)|(0x03<<16))
+#define LOAD_TEXTURE_MAP0                   (1<<11)
+#define LOAD_GLOBAL_COLOR_FACTOR            (1<<6)
+
+#define TM0S0_ADDRESS_MASK              0xfffffffc
+#define TM0S0_USE_FENCE                 (1<<1)
+
+#define TM0S1_HEIGHT_SHIFT              21
+#define TM0S1_WIDTH_SHIFT               10
+#define TM0S1_PALETTE_SELECT            (1<<9)
+#define TM0S1_MAPSURF_FORMAT_MASK       (0x7 << 6)
+#define TM0S1_MAPSURF_FORMAT_SHIFT      6
+#define    MAPSURF_8BIT_INDEXED		   (0<<6)
+#define    MAPSURF_8BIT		 	   (1<<6)
+#define    MAPSURF_16BIT		   (2<<6)
+#define    MAPSURF_32BIT		   (3<<6)
+#define    MAPSURF_411			   (4<<6)
+#define    MAPSURF_422			   (5<<6)
+#define    MAPSURF_COMPRESSED		   (6<<6)
+#define    MAPSURF_4BIT_INDEXED		   (7<<6)
+#define TM0S1_MT_FORMAT_MASK         (0x7 << 3)
+#define TM0S1_MT_FORMAT_SHIFT        3
+#define    MT_4BIT_IDX_ARGB8888	           (7<<3) /* SURFACE_4BIT_INDEXED */
+#define    MT_8BIT_IDX_RGB565	           (0<<3) /* SURFACE_8BIT_INDEXED */
+#define    MT_8BIT_IDX_ARGB1555	           (1<<3)
+#define    MT_8BIT_IDX_ARGB4444	           (2<<3)
+#define    MT_8BIT_IDX_AY88		   (3<<3)
+#define    MT_8BIT_IDX_ABGR8888	           (4<<3)
+#define    MT_8BIT_IDX_BUMP_88DVDU 	   (5<<3)
+#define    MT_8BIT_IDX_BUMP_655LDVDU	   (6<<3)
+#define    MT_8BIT_IDX_ARGB8888	           (7<<3)
+#define    MT_8BIT_I8		           (0<<3) /* SURFACE_8BIT */
+#define    MT_8BIT_L8		           (1<<3)
+#define    MT_16BIT_RGB565 		   (0<<3) /* SURFACE_16BIT */
+#define    MT_16BIT_ARGB1555		   (1<<3)
+#define    MT_16BIT_ARGB4444		   (2<<3)
+#define    MT_16BIT_AY88		   (3<<3)
+#define    MT_16BIT_DIB_ARGB1555_8888      (4<<3)
+#define    MT_16BIT_BUMP_88DVDU	           (5<<3)
+#define    MT_16BIT_BUMP_655LDVDU	   (6<<3)
+#define    MT_16BIT_DIB_RGB565_8888	   (7<<3)
+#define    MT_32BIT_ARGB8888		   (0<<3) /* SURFACE_32BIT */
+#define    MT_32BIT_ABGR8888		   (1<<3)
+#define    MT_32BIT_BUMP_XLDVDU_8888	   (6<<3)
+#define    MT_32BIT_DIB_8888		   (7<<3)
+#define    MT_411_YUV411		   (0<<3) /* SURFACE_411 */
+#define    MT_422_YCRCB_SWAPY	           (0<<3) /* SURFACE_422 */
+#define    MT_422_YCRCB_NORMAL	           (1<<3)
+#define    MT_422_YCRCB_SWAPUV	           (2<<3)
+#define    MT_422_YCRCB_SWAPUVY	           (3<<3)
+#define    MT_COMPRESS_DXT1		   (0<<3) /* SURFACE_COMPRESSED */
+#define    MT_COMPRESS_DXT2_3	           (1<<3)
+#define    MT_COMPRESS_DXT4_5	           (2<<3)
+#define    MT_COMPRESS_FXT1		   (3<<3)
+#define TM0S1_COLORSPACE_CONVERSION     (1 << 2)
+#define TM0S1_TILED_SURFACE             (1 << 1)
+#define TM0S1_TILE_WALK                 (1 << 0)
+
+#define TM0S2_PITCH_SHIFT               21
+#define TM0S2_CUBE_FACE_ENA_SHIFT       15
+#define TM0S2_CUBE_FACE_ENA_MASK        (1<<15)
+#define TM0S2_MAP_FORMAT                (1<<14)
+#define TM0S2_VERTICAL_LINE_STRIDE      (1<<13)
+#define TM0S2_VERITCAL_LINE_STRIDE_OFF  (1<<12)
+#define TM0S2_OUTPUT_CHAN_SHIFT         10
+#define TM0S2_OUTPUT_CHAN_MASK          (3<<10)
+
+#define TM0S3_MIP_FILTER_MASK           (0x3<<30)
+#define TM0S3_MIP_FILTER_SHIFT          30
+#define MIPFILTER_NONE		0
+#define MIPFILTER_NEAREST	1
+#define MIPFILTER_LINEAR	3
+#define TM0S3_MAG_FILTER_MASK           (0x3<<28)
+#define TM0S3_MAG_FILTER_SHIFT          28
+#define TM0S3_MIN_FILTER_MASK           (0x3<<26)
+#define TM0S3_MIN_FILTER_SHIFT          26
+#define FILTER_NEAREST		0
+#define FILTER_LINEAR		1
+#define FILTER_ANISOTROPIC	2
+
+#define TM0S3_LOD_BIAS_SHIFT		17
+#define TM0S3_LOD_BIAS_MASK		(0x1ff<<17)
+#define TM0S3_MAX_MIP_SHIFT		9
+#define TM0S3_MAX_MIP_MASK		(0xff<<9)
+#define TM0S3_MIN_MIP_SHIFT		3
+#define TM0S3_MIN_MIP_MASK		(0x3f<<3)
+#define TM0S3_KILL_PIXEL		(1<<2)
+#define TM0S3_KEYED_FILTER		(1<<1)
+#define TM0S3_CHROMA_KEY		(1<<0)
+
+
+/* _3DSTATE_MAP_TEXEL_STREAM, p188 */
+#define _3DSTATE_MAP_TEX_STREAM_CMD	(CMD_3D|(0x1c<<24)|(0x05<<19))
+#define DISABLE_TEX_STREAM_BUMP 	(1<<12)
+#define ENABLE_TEX_STREAM_BUMP		((1<<12)|(1<<11))
+#define TEX_MODIFY_UNIT_0		0
+#define TEX_MODIFY_UNIT_1		(1<<8)
+#define ENABLE_TEX_STREAM_COORD_SET	(1<<7)
+#define TEX_STREAM_COORD_SET(x) 	((x)<<4)
+#define ENABLE_TEX_STREAM_MAP_IDX	(1<<3)
+#define TEX_STREAM_MAP_IDX(x)		(x)
+
+
+#define FLUSH_MAP_CACHE    (1<<0)
+
+#endif
diff --git a/src/i915_3d.c b/src/i915_3d.c
new file mode 100644
index 0000000..f6e7219
--- /dev/null
+++ b/src/i915_3d.c
@@ -0,0 +1,107 @@
+/**************************************************************************
+ * 
+ * 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.
+ * 
+ **************************************************************************/
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "i830.h"
+#include "i830_dri.h"
+
+#include "i915_reg.h"
+
+void I915EmitInvarientState( ScrnInfoPtr pScrn )
+{
+   I830Ptr pI830 = I830PTR(pScrn);
+
+   BEGIN_LP_RING(20);
+
+   OUT_RING(_3DSTATE_AA_CMD |
+	     AA_LINE_ECAAR_WIDTH_ENABLE |
+	     AA_LINE_ECAAR_WIDTH_1_0 |
+	     AA_LINE_REGION_WIDTH_ENABLE |
+	     AA_LINE_REGION_WIDTH_1_0);
+
+   OUT_RING(_3DSTATE_DFLT_DIFFUSE_CMD);
+   OUT_RING(0);
+
+   OUT_RING(_3DSTATE_DFLT_SPEC_CMD);
+   OUT_RING(0);
+
+   OUT_RING(_3DSTATE_DFLT_Z_CMD);
+   OUT_RING(0);
+
+   /* Don't support texture crossbar yet */
+   OUT_RING(_3DSTATE_COORD_SET_BINDINGS |
+	     CSB_TCB(0, 0) |
+	     CSB_TCB(1, 1) |
+	     CSB_TCB(2, 2) |
+	     CSB_TCB(3, 3) |
+	     CSB_TCB(4, 4) |
+	     CSB_TCB(5, 5) |
+	     CSB_TCB(6, 6) |
+	     CSB_TCB(7, 7));
+
+   OUT_RING(_3DSTATE_RASTER_RULES_CMD |
+	     ENABLE_POINT_RASTER_RULE |
+	     OGL_POINT_RASTER_RULE |
+	     ENABLE_LINE_STRIP_PROVOKE_VRTX |
+	     ENABLE_TRI_FAN_PROVOKE_VRTX |
+	     LINE_STRIP_PROVOKE_VRTX(1) |
+	     TRI_FAN_PROVOKE_VRTX(2) | 
+	     ENABLE_TEXKILL_3D_4D |
+	     TEXKILL_4D);
+
+   /* Need to initialize this to zero.
+    */
+   OUT_RING(_3DSTATE_LOAD_STATE_IMMEDIATE_1 | 
+	     I1_LOAD_S(3) |
+	     (1));
+   OUT_RING(0);
+ 
+   /* XXX: Use this */
+   OUT_RING(_3DSTATE_SCISSOR_ENABLE_CMD | 
+	     DISABLE_SCISSOR_RECT);
+
+   OUT_RING(_3DSTATE_SCISSOR_RECT_0_CMD);
+   OUT_RING(0);
+   OUT_RING(0);
+
+   OUT_RING(_3DSTATE_DEPTH_SUBRECT_DISABLE);
+
+   OUT_RING(_3DSTATE_LOAD_INDIRECT | 0); /* disable indirect state */
+   OUT_RING(0);
+
+   /* Don't support twosided stencil yet */
+   OUT_RING(_3DSTATE_BACKFACE_STENCIL_OPS |
+	     BFO_ENABLE_STENCIL_TWO_SIDE |
+	     0 );
+
+   OUT_RING(0);
+   
+   ADVANCE_LP_RING();
+}
diff --git a/src/i915_reg.h b/src/i915_reg.h
new file mode 100644
index 0000000..886ae81
--- /dev/null
+++ b/src/i915_reg.h
@@ -0,0 +1,831 @@
+/**************************************************************************
+ * 
+ * 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 _I915_REG_H_
+#define _I915_REG_H_
+
+#define I915_SET_FIELD( var, mask, value ) (var &= ~(mask), var |= value)
+
+#define CMD_3D (0x3<<29)
+
+#define PRIM3D_INLINE		(CMD_3D | (0x1f<<24))
+#define PRIM3D_TRILIST		(0x0<<18)
+#define PRIM3D_TRISTRIP 	(0x1<<18)
+#define PRIM3D_TRISTRIP_RVRSE	(0x2<<18)
+#define PRIM3D_TRIFAN		(0x3<<18)
+#define PRIM3D_POLY		(0x4<<18)
+#define PRIM3D_LINELIST 	(0x5<<18)
+#define PRIM3D_LINESTRIP	(0x6<<18)
+#define PRIM3D_RECTLIST 	(0x7<<18)
+#define PRIM3D_POINTLIST	(0x8<<18)
+#define PRIM3D_DIB		(0x9<<18)
+#define PRIM3D_CLEAR_RECT	(0xa<<18)
+#define PRIM3D_ZONE_INIT	(0xd<<18)
+#define PRIM3D_MASK		(0x1f<<18)
+
+/* p137 */
+#define _3DSTATE_AA_CMD			(CMD_3D | (0x06<<24))
+#define AA_LINE_ECAAR_WIDTH_ENABLE	(1<<16)
+#define AA_LINE_ECAAR_WIDTH_0_5 	0
+#define AA_LINE_ECAAR_WIDTH_1_0		(1<<14)
+#define AA_LINE_ECAAR_WIDTH_2_0 	(2<<14)
+#define AA_LINE_ECAAR_WIDTH_4_0 	(3<<14)
+#define AA_LINE_REGION_WIDTH_ENABLE	(1<<8)
+#define AA_LINE_REGION_WIDTH_0_5	0
+#define AA_LINE_REGION_WIDTH_1_0	(1<<6)
+#define AA_LINE_REGION_WIDTH_2_0	(2<<6)
+#define AA_LINE_REGION_WIDTH_4_0	(3<<6)
+
+/* 3DSTATE_BACKFACE_STENCIL_OPS, p138*/
+#define _3DSTATE_BACKFACE_STENCIL_OPS    (CMD_3D | (0x8<<24))
+#define BFO_ENABLE_STENCIL_REF          (1<<23)
+#define BFO_STENCIL_REF_SHIFT           15
+#define BFO_STENCIL_REF_MASK            (0xff<<15)
+#define BFO_ENABLE_STENCIL_FUNCS        (1<<14)
+#define BFO_STENCIL_TEST_SHIFT          11
+#define BFO_STENCIL_TEST_MASK           (0x7<<11)
+#define BFO_STENCIL_FAIL_SHIFT          8
+#define BFO_STENCIL_FAIL_MASK           (0x7<<8)
+#define BFO_STENCIL_PASS_Z_FAIL_SHIFT   5
+#define BFO_STENCIL_PASS_Z_FAIL_MASK    (0x7<<5)
+#define BFO_STENCIL_PASS_Z_PASS_SHIFT   2
+#define BFO_STENCIL_PASS_Z_PASS_MASK    (0x7<<2)
+#define BFO_ENABLE_STENCIL_TWO_SIDE     (1<<1)
+#define BFO_STENCIL_TWO_SIDE            (1<<0)
+
+
+/* 3DSTATE_BACKFACE_STENCIL_MASKS, p140 */
+#define _3DSTATE_BACKFACE_STENCIL_MASKS    (CMD_3D | (0x9<<24))
+#define BFM_ENABLE_STENCIL_TEST_MASK      (1<<17)
+#define BFM_ENABLE_STENCIL_WRITE_MASK     (1<<16)
+#define BFM_STENCIL_TEST_MASK_SHIFT       8
+#define BFM_STENCIL_TEST_MASK_MASK        (0xff<<8)
+#define BFM_STENCIL_WRITE_MASK_SHIFT      0
+#define BFM_STENCIL_WRITE_MASK_MASK       (0xff<<0)
+
+
+
+/* 3DSTATE_BIN_CONTROL p141 */
+
+/* p143 */
+#define _3DSTATE_BUF_INFO_CMD	(CMD_3D | (0x1d<<24) | (0x8e<<16) | 1)
+/* Dword 1 */
+#define BUF_3D_ID_COLOR_BACK	(0x3<<24)
+#define BUF_3D_ID_DEPTH 	(0x7<<24)
+#define BUF_3D_USE_FENCE	(1<<23)
+#define BUF_3D_TILED_SURFACE	(1<<22)
+#define BUF_3D_TILE_WALK_X	0
+#define BUF_3D_TILE_WALK_Y	(1<<21)
+#define BUF_3D_PITCH(x)         (((x)/4)<<2)
+/* Dword 2 */
+#define BUF_3D_ADDR(x)		((x) & ~0x3)
+
+
+/* 3DSTATE_CHROMA_KEY */
+
+/* 3DSTATE_CLEAR_PARAMETERS, p150 */
+
+/* 3DSTATE_CONSTANT_BLEND_COLOR, p153 */
+#define _3DSTATE_CONST_BLEND_COLOR_CMD	(CMD_3D | (0x1d<<24) | (0x88<<16))
+
+
+
+/* 3DSTATE_COORD_SET_BINDINGS, p154 */
+#define _3DSTATE_COORD_SET_BINDINGS      (CMD_3D | (0x16<<24))
+#define CSB_TCB(iunit, eunit)           ((eunit)<<(iunit*3))
+
+/* p156 */
+#define _3DSTATE_DFLT_DIFFUSE_CMD	(CMD_3D | (0x1d<<24) | (0x99<<16))
+
+/* p157 */
+#define _3DSTATE_DFLT_SPEC_CMD		(CMD_3D | (0x1d<<24) | (0x9a<<16))
+
+/* p158 */
+#define _3DSTATE_DFLT_Z_CMD		(CMD_3D | (0x1d<<24) | (0x98<<16))
+
+
+/* 3DSTATE_DEPTH_OFFSET_SCALE, p159 */
+#define _3DSTATE_DEPTH_OFFSET_SCALE       (CMD_3D | (0x1d<<24) | (0x97<<16))
+/* scale in dword 1 */
+
+
+/* 3DSTATE_DEPTH_SUBRECT_DISABLE, p160 */
+#define _3DSTATE_DEPTH_SUBRECT_DISABLE    (CMD_3D | (0x1c<<24) | (0x11<19) | 0x2)
+
+/* p161 */
+#define _3DSTATE_DST_BUF_VARS_CMD	(CMD_3D | (0x1d<<24) | (0x85<<16))
+/* Dword 1 */
+#define TEX_DEFAULT_COLOR_OGL           (0<<30)
+#define TEX_DEFAULT_COLOR_D3D           (1<<30)
+#define ZR_EARLY_DEPTH                  (1<<29)
+#define LOD_PRECLAMP_OGL                (1<<28)
+#define LOD_PRECLAMP_D3D                (0<<28)
+#define DITHER_FULL_ALWAYS              (0<<26)
+#define DITHER_FULL_ON_FB_BLEND         (1<<26)
+#define DITHER_CLAMPED_ALWAYS           (2<<26)
+#define LINEAR_GAMMA_BLEND_32BPP        (1<<25)
+#define DEBUG_DISABLE_ENH_DITHER        (1<<24)
+#define DSTORG_HORT_BIAS(x)		((x)<<20)
+#define DSTORG_VERT_BIAS(x)		((x)<<16)
+#define COLOR_4_2_2_CHNL_WRT_ALL	0
+#define COLOR_4_2_2_CHNL_WRT_Y		(1<<12)
+#define COLOR_4_2_2_CHNL_WRT_CR		(2<<12)
+#define COLOR_4_2_2_CHNL_WRT_CB		(3<<12)
+#define COLOR_4_2_2_CHNL_WRT_CRCB	(4<<12)
+#define COLR_BUF_8BIT			0
+#define COLR_BUF_RGB555 		(1<<8)
+#define COLR_BUF_RGB565 		(2<<8)
+#define COLR_BUF_ARGB8888		(3<<8)
+#define DEPTH_FRMT_16_FIXED		0
+#define DEPTH_FRMT_16_FLOAT		(1<<2)
+#define DEPTH_FRMT_24_FIXED_8_OTHER	(2<<2)
+#define VERT_LINE_STRIDE_1		(1<<1)
+#define VERT_LINE_STRIDE_0		(0<<1)
+#define VERT_LINE_STRIDE_OFS_1		1
+#define VERT_LINE_STRIDE_OFS_0		0
+
+/* p166 */
+#define _3DSTATE_DRAW_RECT_CMD		(CMD_3D|(0x1d<<24)|(0x80<<16)|3)
+/* Dword 1 */
+#define DRAW_RECT_DIS_DEPTH_OFS 	(1<<30)
+#define DRAW_DITHER_OFS_X(x)		((x)<<26)
+#define DRAW_DITHER_OFS_Y(x)		((x)<<24)
+/* Dword 2 */
+#define DRAW_YMIN(x)			((x)<<16)
+#define DRAW_XMIN(x)			(x)
+/* Dword 3 */
+#define DRAW_YMAX(x)			((x)<<16)
+#define DRAW_XMAX(x)			(x)
+/* Dword 4 */
+#define DRAW_YORG(x)			((x)<<16)
+#define DRAW_XORG(x)			(x)
+
+
+/* 3DSTATE_FILTER_COEFFICIENTS_4X4, p170 */
+
+/* 3DSTATE_FILTER_COEFFICIENTS_6X5, p172 */
+
+
+/* _3DSTATE_FOG_COLOR, p173 */
+#define _3DSTATE_FOG_COLOR_CMD		(CMD_3D|(0x15<<24))
+#define FOG_COLOR_RED(x)		((x)<<16)
+#define FOG_COLOR_GREEN(x)		((x)<<8)
+#define FOG_COLOR_BLUE(x)		(x)
+
+/* _3DSTATE_FOG_MODE, p174 */
+#define _3DSTATE_FOG_MODE_CMD		(CMD_3D|(0x1d<<24)|(0x89<<16)|2)
+/* Dword 1 */
+#define FMC1_FOGFUNC_MODIFY_ENABLE	(1<<31)
+#define FMC1_FOGFUNC_VERTEX		(0<<28)
+#define FMC1_FOGFUNC_PIXEL_EXP		(1<<28)
+#define FMC1_FOGFUNC_PIXEL_EXP2		(2<<28)
+#define FMC1_FOGFUNC_PIXEL_LINEAR	(3<<28)
+#define FMC1_FOGFUNC_MASK		(3<<28)
+#define FMC1_FOGINDEX_MODIFY_ENABLE     (1<<27)
+#define FMC1_FOGINDEX_Z		        (0<<25)
+#define FMC1_FOGINDEX_W   		(1<<25)
+#define FMC1_C1_C2_MODIFY_ENABLE	(1<<24)
+#define FMC1_DENSITY_MODIFY_ENABLE	(1<<23)
+#define FMC1_C1_ONE      	        (1<<13)
+#define FMC1_C1_MASK		        (0xffff<<4)
+/* Dword 2 */
+#define FMC2_C2_ONE		        (1<<16)
+/* Dword 3 */
+#define FMC3_D_ONE      		(1<<16)
+
+
+
+/* _3DSTATE_INDEPENDENT_ALPHA_BLEND, p177 */
+#define _3DSTATE_INDEPENDENT_ALPHA_BLEND_CMD	(CMD_3D|(0x0b<<24))
+#define IAB_MODIFY_ENABLE	        (1<<23)
+#define IAB_ENABLE       	        (1<<22)
+#define IAB_MODIFY_FUNC         	(1<<21)
+#define IAB_FUNC_SHIFT          	16
+#define IAB_MODIFY_SRC_FACTOR   	(1<<11)
+#define IAB_SRC_FACTOR_SHIFT		6
+#define IAB_SRC_FACTOR_MASK		(BLENDFACT_MASK<<6)
+#define IAB_MODIFY_DST_FACTOR	        (1<<5)
+#define IAB_DST_FACTOR_SHIFT		0
+#define IAB_DST_FACTOR_MASK		(BLENDFACT_MASK<<0)
+
+
+#define BLENDFUNC_ADD			0x0
+#define BLENDFUNC_SUBTRACT		0x1
+#define BLENDFUNC_REVERSE_SUBTRACT	0x2
+#define BLENDFUNC_MIN			0x3
+#define BLENDFUNC_MAX			0x4
+#define BLENDFUNC_MASK			0x7
+
+/* 3DSTATE_LOAD_INDIRECT, p180 */
+
+#define _3DSTATE_LOAD_INDIRECT	        (CMD_3D|(0x1d<<24)|(0x7<<16))
+#define LI0_STATE_STATIC_INDIRECT       (0x01<<8)
+#define LI0_STATE_DYNAMIC_INDIRECT      (0x02<<8)
+#define LI0_STATE_SAMPLER               (0x04<<8)
+#define LI0_STATE_MAP                   (0x08<<8)
+#define LI0_STATE_PROGRAM               (0x10<<8)
+#define LI0_STATE_CONSTANTS             (0x20<<8)
+
+#define SIS0_BUFFER_ADDRESS(x)          ((x)&~0x3)
+#define SIS0_FORCE_LOAD                 (1<<1)
+#define SIS0_BUFFER_VALID               (1<<0)
+#define SIS1_BUFFER_LENGTH(x)           ((x)&0xff)
+
+#define DIS0_BUFFER_ADDRESS(x)          ((x)&~0x3)
+#define DIS0_BUFFER_RESET               (1<<1)
+#define DIS0_BUFFER_VALID               (1<<0)
+
+#define SSB0_BUFFER_ADDRESS(x)          ((x)&~0x3)
+#define SSB0_FORCE_LOAD                 (1<<1)
+#define SSB0_BUFFER_VALID               (1<<0)
+#define SSB1_BUFFER_LENGTH(x)           ((x)&0xff)
+
+#define MSB0_BUFFER_ADDRESS(x)          ((x)&~0x3)
+#define MSB0_FORCE_LOAD                 (1<<1)
+#define MSB0_BUFFER_VALID               (1<<0)
+#define MSB1_BUFFER_LENGTH(x)           ((x)&0xff)
+
+#define PSP0_BUFFER_ADDRESS(x)          ((x)&~0x3)
+#define PSP0_FORCE_LOAD                 (1<<1)
+#define PSP0_BUFFER_VALID               (1<<0)
+#define PSP1_BUFFER_LENGTH(x)           ((x)&0xff)
+
+#define PSC0_BUFFER_ADDRESS(x)          ((x)&~0x3)
+#define PSC0_FORCE_LOAD                 (1<<1)
+#define PSC0_BUFFER_VALID               (1<<0)
+#define PSC1_BUFFER_LENGTH(x)           ((x)&0xff)
+
+
+
+
+
+/* _3DSTATE_RASTERIZATION_RULES */
+#define _3DSTATE_RASTER_RULES_CMD	(CMD_3D|(0x07<<24))
+#define ENABLE_POINT_RASTER_RULE	(1<<15)
+#define OGL_POINT_RASTER_RULE		(1<<13)
+#define ENABLE_TEXKILL_3D_4D            (1<<10)
+#define TEXKILL_3D                      (0<<9)
+#define TEXKILL_4D                      (1<<9)
+#define ENABLE_LINE_STRIP_PROVOKE_VRTX	(1<<8)
+#define ENABLE_TRI_FAN_PROVOKE_VRTX	(1<<5)
+#define LINE_STRIP_PROVOKE_VRTX(x)	((x)<<6)
+#define TRI_FAN_PROVOKE_VRTX(x) 	((x)<<3)
+
+/* _3DSTATE_SCISSOR_ENABLE, p256 */
+#define _3DSTATE_SCISSOR_ENABLE_CMD	(CMD_3D|(0x1c<<24)|(0x10<<19))
+#define ENABLE_SCISSOR_RECT		((1<<1) | 1)
+#define DISABLE_SCISSOR_RECT		(1<<1)
+
+/* _3DSTATE_SCISSOR_RECTANGLE_0, p257 */
+#define _3DSTATE_SCISSOR_RECT_0_CMD	(CMD_3D|(0x1d<<24)|(0x81<<16)|1)
+/* Dword 1 */
+#define SCISSOR_RECT_0_YMIN(x)		((x)<<16)
+#define SCISSOR_RECT_0_XMIN(x)		(x)
+/* Dword 2 */
+#define SCISSOR_RECT_0_YMAX(x)		((x)<<16)
+#define SCISSOR_RECT_0_XMAX(x)		(x)
+
+/* p189 */
+#define _3DSTATE_LOAD_STATE_IMMEDIATE_1   ((0x3<<29)|(0x1d<<24)|(0x04<<16))
+#define I1_LOAD_S(n)                      (1<<(4+n))
+
+#define S0_VB_OFFSET_MASK              0xffffffc
+#define S0_AUTO_CACHE_INV_DISABLE      (1<<0)
+
+#define S1_VERTEX_WIDTH_SHIFT          24
+#define S1_VERTEX_WIDTH_MASK           (0x3f<<24)
+#define S1_VERTEX_PITCH_SHIFT          16
+#define S1_VERTEX_PITCH_MASK           (0x3f<<16)
+
+#define TEXCOORDFMT_2D                 0x0
+#define TEXCOORDFMT_3D                 0x1
+#define TEXCOORDFMT_4D                 0x2
+#define TEXCOORDFMT_1D                 0x3
+#define TEXCOORDFMT_2D_16              0x4
+#define TEXCOORDFMT_4D_16              0x5
+#define TEXCOORDFMT_NOT_PRESENT        0xf
+#define S2_TEXCOORD_FMT0_MASK            0xf
+#define S2_TEXCOORD_FMT1_SHIFT           4
+#define S2_TEXCOORD_FMT(unit, type)    ((type)<<(unit*4))
+#define S2_TEXCOORD_NONE               (~0)
+
+/* S3 not interesting */
+
+#define S4_POINT_WIDTH_SHIFT           23
+#define S4_POINT_WIDTH_MASK            (0x1ff<<23)
+#define S4_LINE_WIDTH_SHIFT            19
+#define S4_LINE_WIDTH_ONE              (0x2<<19)
+#define S4_LINE_WIDTH_MASK             (0xf<<19)
+#define S4_FLATSHADE_ALPHA             (1<<18)
+#define S4_FLATSHADE_FOG               (1<<17)
+#define S4_FLATSHADE_SPECULAR          (1<<16)
+#define S4_FLATSHADE_COLOR             (1<<15)
+#define S4_CULLMODE_BOTH	       (0<<13)
+#define S4_CULLMODE_NONE	       (1<<13)
+#define S4_CULLMODE_CW		       (2<<13)
+#define S4_CULLMODE_CCW		       (3<<13)
+#define S4_CULLMODE_MASK	       (3<<13)
+#define S4_VFMT_POINT_WIDTH            (1<<12)
+#define S4_VFMT_SPEC_FOG               (1<<11)
+#define S4_VFMT_COLOR                  (1<<10)
+#define S4_VFMT_DEPTH_OFFSET           (1<<9)
+#define S4_VFMT_XYZ     	       (1<<6)
+#define S4_VFMT_XYZW     	       (2<<6)
+#define S4_VFMT_XY     		       (3<<6)
+#define S4_VFMT_XYW     	       (4<<6)
+#define S4_VFMT_XYZW_MASK              (7<<6)
+#define S4_FORCE_DEFAULT_DIFFUSE       (1<<5)
+#define S4_FORCE_DEFAULT_SPECULAR      (1<<4)
+#define S4_LOCAL_DEPTH_OFFSET_ENABLE   (1<<3)
+#define S4_VFMT_FOG_PARAM              (1<<2)
+#define S4_SPRITE_POINT_ENABLE         (1<<1)
+#define S4_LINE_ANTIALIAS_ENABLE       (1<<0)
+
+#define S4_VFMT_MASK (S4_VFMT_POINT_WIDTH   | 	\
+		      S4_VFMT_SPEC_FOG      |	\
+		      S4_VFMT_COLOR         |	\
+		      S4_VFMT_DEPTH_OFFSET  |	\
+		      S4_VFMT_XYZW_MASK     |	\
+		      S4_VFMT_FOG_PARAM)
+
+
+#define S5_WRITEDISABLE_ALPHA          (1<<31)
+#define S5_WRITEDISABLE_RED            (1<<30)
+#define S5_WRITEDISABLE_GREEN          (1<<29)
+#define S5_WRITEDISABLE_BLUE           (1<<28)
+#define S5_WRITEDISABLE_MASK           (0xf<<28)
+#define S5_FORCE_DEFAULT_POINT_SIZE    (1<<27)
+#define S5_LAST_PIXEL_ENABLE           (1<<26)
+#define S5_GLOBAL_DEPTH_OFFSET_ENABLE  (1<<25)
+#define S5_FOG_ENABLE                  (1<<24)
+#define S5_STENCIL_REF_SHIFT           16
+#define S5_STENCIL_REF_MASK            (0xff<<16)
+#define S5_STENCIL_TEST_FUNC_SHIFT     13
+#define S5_STENCIL_TEST_FUNC_MASK      (0x7<<13)
+#define S5_STENCIL_FAIL_SHIFT          10
+#define S5_STENCIL_FAIL_MASK           (0x7<<10)
+#define S5_STENCIL_PASS_Z_FAIL_SHIFT   7
+#define S5_STENCIL_PASS_Z_FAIL_MASK    (0x7<<7)
+#define S5_STENCIL_PASS_Z_PASS_SHIFT   4
+#define S5_STENCIL_PASS_Z_PASS_MASK    (0x7<<4)
+#define S5_STENCIL_WRITE_ENABLE        (1<<3)
+#define S5_STENCIL_TEST_ENABLE         (1<<2)
+#define S5_COLOR_DITHER_ENABLE         (1<<1)
+#define S5_LOGICOP_ENABLE              (1<<0)
+
+
+#define S6_ALPHA_TEST_ENABLE           (1<<31)
+#define S6_ALPHA_TEST_FUNC_SHIFT       28
+#define S6_ALPHA_TEST_FUNC_MASK        (0x7<<28)
+#define S6_ALPHA_REF_SHIFT             20
+#define S6_ALPHA_REF_MASK              (0xff<<20)
+#define S6_DEPTH_TEST_ENABLE           (1<<19)
+#define S6_DEPTH_TEST_FUNC_SHIFT       16
+#define S6_DEPTH_TEST_FUNC_MASK        (0x7<<16)
+#define S6_CBUF_BLEND_ENABLE           (1<<15)
+#define S6_CBUF_BLEND_FUNC_SHIFT       12
+#define S6_CBUF_BLEND_FUNC_MASK        (0x7<<12)
+#define S6_CBUF_SRC_BLEND_FACT_SHIFT   8
+#define S6_CBUF_SRC_BLEND_FACT_MASK    (0xf<<8)
+#define S6_CBUF_DST_BLEND_FACT_SHIFT   4
+#define S6_CBUF_DST_BLEND_FACT_MASK    (0xf<<4)
+#define S6_DEPTH_WRITE_ENABLE          (1<<3)
+#define S6_COLOR_WRITE_ENABLE          (1<<2)
+#define S6_TRISTRIP_PV_SHIFT           0
+#define S6_TRISTRIP_PV_MASK            (0x3<<0)
+
+#define S7_DEPTH_OFFSET_CONST_MASK     ~0
+
+/* 3DSTATE_MAP_DEINTERLACER_PARAMETERS */
+/* 3DSTATE_MAP_PALETTE_LOAD_32, p206 */
+
+
+/* _3DSTATE_MODES_4, p218 */
+#define _3DSTATE_MODES_4_CMD		(CMD_3D|(0x0d<<24))
+#define ENABLE_LOGIC_OP_FUNC		(1<<23)
+#define LOGIC_OP_FUNC(x)		((x)<<18)
+#define LOGICOP_MASK			(0xf<<18)
+#define MODE4_ENABLE_STENCIL_TEST_MASK	((1<<17)|(0xff00))
+#define ENABLE_STENCIL_TEST_MASK	(1<<17)
+#define STENCIL_TEST_MASK(x)		((x)<<8)
+#define MODE4_ENABLE_STENCIL_WRITE_MASK	((1<<16)|(0x00ff))
+#define ENABLE_STENCIL_WRITE_MASK	(1<<16)
+#define STENCIL_WRITE_MASK(x)		((x)&0xff)
+
+/* _3DSTATE_MODES_5, p220 */
+#define _3DSTATE_MODES_5_CMD		(CMD_3D|(0x0c<<24))
+#define PIPELINE_FLUSH_RENDER_CACHE	(1<<18)
+#define PIPELINE_FLUSH_TEXTURE_CACHE	(1<<16)
+
+
+/* p221 */
+#define _3DSTATE_PIXEL_SHADER_CONSTANTS  (CMD_3D|(0x1d<<24)|(0x6<<16))
+#define PS1_REG(n)                      (1<<(n))
+#define PS2_CONST_X(n)                  (n)
+#define PS3_CONST_Y(n)                  (n)
+#define PS4_CONST_Z(n)                  (n)
+#define PS5_CONST_W(n)                  (n)
+
+/* p222 */
+
+
+#define I915_MAX_TEX_INDIRECT 4
+#define I915_MAX_TEX_INSN     32     
+#define I915_MAX_ALU_INSN     64
+#define I915_MAX_DECL_INSN    27
+#define I915_MAX_TEMPORARY    16
+
+
+/* Each instruction is 3 dwords long, though most don't require all
+ * this space.  Maximum of 123 instructions.  Smaller maxes per insn
+ * type.
+ */
+#define _3DSTATE_PIXEL_SHADER_PROGRAM    (CMD_3D|(0x1d<<24)|(0x5<<16))
+
+#define REG_TYPE_R                 0 /* temporary regs, no need to
+				      * dcl, must be written before
+				      * read -- Preserved between
+				      * phases. 
+				      */
+#define REG_TYPE_T                 1 /* Interpolated values, must be
+				      * dcl'ed before use.
+				      *
+				      * 0..7: texture coord,
+				      * 8: diffuse spec,
+				      * 9: specular color,
+				      * 10: fog parameter in w.
+				      */
+#define REG_TYPE_CONST             2 /* Restriction: only one const
+				      * can be referenced per
+				      * instruction, though it may be
+				      * selected for multiple inputs.
+				      * Constants not initialized
+				      * default to zero.
+				      */
+#define REG_TYPE_S                 3 /* sampler */
+#define REG_TYPE_OC                4 /* output color (rgba) */
+#define REG_TYPE_OD                5 /* output depth (w), xyz are
+				      * temporaries.  If not written,
+				      * interpolated depth is used?
+				      */
+#define REG_TYPE_U                 6 /* unpreserved temporaries */
+#define REG_TYPE_MASK              0x7
+#define REG_NR_MASK                0xf
+
+
+/* REG_TYPE_T:
+ */
+#define T_TEX0     0
+#define T_TEX1     1
+#define T_TEX2     2
+#define T_TEX3     3
+#define T_TEX4     4
+#define T_TEX5     5
+#define T_TEX6     6
+#define T_TEX7     7
+#define T_DIFFUSE  8
+#define T_SPECULAR 9
+#define T_FOG_W    10		/* interpolated fog is in W coord */
+
+/* Arithmetic instructions */
+
+/* .replicate_swizzle == selection and replication of a particular
+ * scalar channel, ie., .xxxx, .yyyy, .zzzz or .wwww 
+ */
+#define A0_NOP    (0x0<<24)		/* no operation */
+#define A0_ADD    (0x1<<24)		/* dst = src0 + src1 */
+#define A0_MOV    (0x2<<24)		/* dst = src0 */
+#define A0_MUL    (0x3<<24)		/* dst = src0 * src1 */
+#define A0_MAD    (0x4<<24)		/* dst = src0 * src1 + src2 */
+#define A0_DP2ADD (0x5<<24)		/* dst.xyzw = src0.xy dot src1.xy + src2.replicate_swizzle */
+#define A0_DP3    (0x6<<24)		/* dst.xyzw = src0.xyz dot src1.xyz */
+#define A0_DP4    (0x7<<24)		/* dst.xyzw = src0.xyzw dot src1.xyzw */
+#define A0_FRC    (0x8<<24)		/* dst = src0 - floor(src0) */
+#define A0_RCP    (0x9<<24)		/* dst.xyzw = 1/(src0.replicate_swizzle) */
+#define A0_RSQ    (0xa<<24)		/* dst.xyzw = 1/(sqrt(abs(src0.replicate_swizzle))) */
+#define A0_EXP    (0xb<<24)		/* dst.xyzw = exp2(src0.replicate_swizzle) */
+#define A0_LOG    (0xc<<24)		/* dst.xyzw = log2(abs(src0.replicate_swizzle)) */
+#define A0_CMP    (0xd<<24)		/* dst = (src0 >= 0.0) ? src1 : src2 */
+#define A0_MIN    (0xe<<24)		/* dst = (src0 < src1) ? src0 : src1 */
+#define A0_MAX    (0xf<<24)		/* dst = (src0 >= src1) ? src0 : src1 */
+#define A0_FLR    (0x10<<24)		/* dst = floor(src0) */
+#define A0_MOD    (0x11<<24)		/* dst = src0 fmod 1.0 */
+#define A0_TRC    (0x12<<24)		/* dst = int(src0) */
+#define A0_SGE    (0x13<<24)		/* dst = src0 >= src1 ? 1.0 : 0.0 */
+#define A0_SLT    (0x14<<24)		/* dst = src0 < src1 ? 1.0 : 0.0 */
+#define A0_DEST_SATURATE                 (1<<22)
+#define A0_DEST_TYPE_SHIFT                19
+/* Allow: R, OC, OD, U */
+#define A0_DEST_NR_SHIFT                 14
+/* Allow R: 0..15, OC,OD: 0..0, U: 0..2 */
+#define A0_DEST_CHANNEL_X                (1<<10)
+#define A0_DEST_CHANNEL_Y                (2<<10)
+#define A0_DEST_CHANNEL_Z                (4<<10)
+#define A0_DEST_CHANNEL_W                (8<<10)
+#define A0_DEST_CHANNEL_ALL              (0xf<<10)
+#define A0_DEST_CHANNEL_SHIFT            10
+#define A0_SRC0_TYPE_SHIFT               7
+#define A0_SRC0_NR_SHIFT                 2
+
+#define A0_DEST_CHANNEL_XY              (A0_DEST_CHANNEL_X|A0_DEST_CHANNEL_Y)
+#define A0_DEST_CHANNEL_XYZ             (A0_DEST_CHANNEL_XY|A0_DEST_CHANNEL_Z)
+
+
+#define SRC_X        0
+#define SRC_Y        1
+#define SRC_Z        2
+#define SRC_W        3
+#define SRC_ZERO     4
+#define SRC_ONE      5
+
+#define A1_SRC0_CHANNEL_X_NEGATE         (1<<31)
+#define A1_SRC0_CHANNEL_X_SHIFT          28
+#define A1_SRC0_CHANNEL_Y_NEGATE         (1<<27)
+#define A1_SRC0_CHANNEL_Y_SHIFT          24
+#define A1_SRC0_CHANNEL_Z_NEGATE         (1<<23)
+#define A1_SRC0_CHANNEL_Z_SHIFT          20
+#define A1_SRC0_CHANNEL_W_NEGATE         (1<<19)
+#define A1_SRC0_CHANNEL_W_SHIFT          16
+#define A1_SRC1_TYPE_SHIFT               13
+#define A1_SRC1_NR_SHIFT                 8
+#define A1_SRC1_CHANNEL_X_NEGATE         (1<<7)
+#define A1_SRC1_CHANNEL_X_SHIFT          4
+#define A1_SRC1_CHANNEL_Y_NEGATE         (1<<3)
+#define A1_SRC1_CHANNEL_Y_SHIFT          0
+
+#define A2_SRC1_CHANNEL_Z_NEGATE         (1<<31)
+#define A2_SRC1_CHANNEL_Z_SHIFT          28
+#define A2_SRC1_CHANNEL_W_NEGATE         (1<<27)
+#define A2_SRC1_CHANNEL_W_SHIFT          24
+#define A2_SRC2_TYPE_SHIFT               21
+#define A2_SRC2_NR_SHIFT                 16
+#define A2_SRC2_CHANNEL_X_NEGATE         (1<<15)
+#define A2_SRC2_CHANNEL_X_SHIFT          12
+#define A2_SRC2_CHANNEL_Y_NEGATE         (1<<11)
+#define A2_SRC2_CHANNEL_Y_SHIFT          8
+#define A2_SRC2_CHANNEL_Z_NEGATE         (1<<7)
+#define A2_SRC2_CHANNEL_Z_SHIFT          4
+#define A2_SRC2_CHANNEL_W_NEGATE         (1<<3)
+#define A2_SRC2_CHANNEL_W_SHIFT          0
+
+
+
+/* Texture instructions */
+#define T0_TEXLD     (0x15<<24)	/* Sample texture using predeclared
+				 * sampler and address, and output
+				 * filtered texel data to destination
+				 * register */
+#define T0_TEXLDP    (0x16<<24)	/* Same as texld but performs a
+				 * perspective divide of the texture
+				 * coordinate .xyz values by .w before
+				 * sampling. */
+#define T0_TEXLDB    (0x17<<24)	/* Same as texld but biases the
+				 * computed LOD by w.  Only S4.6 two's
+				 * comp is used.  This implies that a
+				 * float to fixed conversion is
+				 * done. */
+#define T0_TEXKILL   (0x18<<24)	/* Does not perform a sampling
+				 * operation.  Simply kills the pixel
+				 * if any channel of the address
+				 * register is < 0.0. */
+#define T0_DEST_TYPE_SHIFT                19
+/* Allow: R, OC, OD, U */
+/* Note: U (unpreserved) regs do not retain their values between
+ * phases (cannot be used for feedback) 
+ *
+ * Note: oC and OD registers can only be used as the destination of a
+ * texture instruction once per phase (this is an implementation
+ * restriction). 
+ */
+#define T0_DEST_NR_SHIFT                 14
+/* Allow R: 0..15, OC,OD: 0..0, U: 0..2 */
+#define T0_SAMPLER_NR_SHIFT              0 /* This field ignored for TEXKILL */
+#define T0_SAMPLER_NR_MASK               (0xf<<0)
+
+#define T1_ADDRESS_REG_TYPE_SHIFT        24 /* Reg to use as texture coord */
+/* Allow R, T, OC, OD -- R, OC, OD are 'dependent' reads, new program phase */
+#define T1_ADDRESS_REG_NR_SHIFT          17
+#define T2_MBZ                           0
+
+/* Declaration instructions */
+#define D0_DCL       (0x19<<24)	/* Declare a t (interpolated attrib)
+				 * register or an s (sampler)
+				 * register. */
+#define D0_SAMPLE_TYPE_SHIFT              22
+#define D0_SAMPLE_TYPE_2D                 (0x0<<22)
+#define D0_SAMPLE_TYPE_CUBE               (0x1<<22)
+#define D0_SAMPLE_TYPE_VOLUME             (0x2<<22)
+#define D0_SAMPLE_TYPE_MASK               (0x3<<22)
+
+#define D0_TYPE_SHIFT                19
+/* Allow: T, S */
+#define D0_NR_SHIFT                  14
+/* Allow T: 0..10, S: 0..15 */
+#define D0_CHANNEL_X                (1<<10)
+#define D0_CHANNEL_Y                (2<<10)
+#define D0_CHANNEL_Z                (4<<10)
+#define D0_CHANNEL_W                (8<<10)
+#define D0_CHANNEL_ALL              (0xf<<10)
+#define D0_CHANNEL_NONE             (0<<10)
+
+#define D0_CHANNEL_XY               (D0_CHANNEL_X|D0_CHANNEL_Y)
+#define D0_CHANNEL_XYZ              (D0_CHANNEL_XY|D0_CHANNEL_Z)
+
+/* I915 Errata: Do not allow (xz), (xw), (xzw) combinations for diffuse
+ * or specular declarations. 
+ *
+ * For T dcls, only allow: (x), (xy), (xyz), (w), (xyzw) 
+ *
+ * Must be zero for S (sampler) dcls
+ */
+#define D1_MBZ                          0
+#define D2_MBZ                          0
+
+
+
+/* p207 */
+#define _3DSTATE_MAP_STATE               (CMD_3D|(0x1d<<24)|(0x0<<16))
+
+#define MS1_MAPMASK_SHIFT               0
+#define MS1_MAPMASK_MASK                (0x8fff<<0)
+
+#define MS2_UNTRUSTED_SURFACE           (1<<31)
+#define MS2_ADDRESS_MASK                0xfffffffc
+#define MS2_VERTICAL_LINE_STRIDE        (1<<1)
+#define MS2_VERTICAL_OFFSET             (1<<1)
+
+#define MS3_HEIGHT_SHIFT              21
+#define MS3_WIDTH_SHIFT               10
+#define MS3_PALETTE_SELECT            (1<<9)
+#define MS3_MAPSURF_FORMAT_SHIFT      7
+#define MS3_MAPSURF_FORMAT_MASK       (0x7<<7)
+#define    MAPSURF_8BIT		 	   (1<<7)
+#define    MAPSURF_16BIT		   (2<<7)
+#define    MAPSURF_32BIT		   (3<<7)
+#define    MAPSURF_422			   (5<<7)
+#define    MAPSURF_COMPRESSED		   (6<<7)
+#define    MAPSURF_4BIT_INDEXED		   (7<<7)
+#define MS3_MT_FORMAT_MASK         (0x7 << 3)
+#define MS3_MT_FORMAT_SHIFT        3
+#define    MT_4BIT_IDX_ARGB8888	           (7<<3) /* SURFACE_4BIT_INDEXED */
+#define    MT_8BIT_I8		           (0<<3) /* SURFACE_8BIT */
+#define    MT_8BIT_L8		           (1<<3)
+#define    MT_8BIT_A8		           (4<<3)
+#define    MT_8BIT_MONO8	           (5<<3)
+#define    MT_16BIT_RGB565 		   (0<<3) /* SURFACE_16BIT */
+#define    MT_16BIT_ARGB1555		   (1<<3)
+#define    MT_16BIT_ARGB4444		   (2<<3)
+#define    MT_16BIT_AY88		   (3<<3)
+#define    MT_16BIT_88DVDU	           (5<<3)
+#define    MT_16BIT_BUMP_655LDVDU	   (6<<3)
+#define    MT_16BIT_I16	                   (7<<3)
+#define    MT_16BIT_L16	                   (8<<3)
+#define    MT_16BIT_A16	                   (9<<3)
+#define    MT_32BIT_ARGB8888		   (0<<3) /* SURFACE_32BIT */
+#define    MT_32BIT_ABGR8888		   (1<<3)
+#define    MT_32BIT_XRGB8888		   (2<<3)
+#define    MT_32BIT_XBGR8888		   (3<<3)
+#define    MT_32BIT_QWVU8888		   (4<<3)
+#define    MT_32BIT_AXVU8888		   (5<<3)
+#define    MT_32BIT_LXVU8888	           (6<<3)
+#define    MT_32BIT_XLVU8888	           (7<<3)
+#define    MT_32BIT_ARGB2101010	           (8<<3)
+#define    MT_32BIT_ABGR2101010	           (9<<3)
+#define    MT_32BIT_AWVU2101010	           (0xA<<3)
+#define    MT_32BIT_GR1616	           (0xB<<3)
+#define    MT_32BIT_VU1616	           (0xC<<3)
+#define    MT_32BIT_xI824	           (0xD<<3)
+#define    MT_32BIT_xA824	           (0xE<<3)
+#define    MT_32BIT_xL824	           (0xF<<3)
+#define    MT_422_YCRCB_SWAPY	           (0<<3) /* SURFACE_422 */
+#define    MT_422_YCRCB_NORMAL	           (1<<3)
+#define    MT_422_YCRCB_SWAPUV	           (2<<3)
+#define    MT_422_YCRCB_SWAPUVY	           (3<<3)
+#define    MT_COMPRESS_DXT1		   (0<<3) /* SURFACE_COMPRESSED */
+#define    MT_COMPRESS_DXT2_3	           (1<<3)
+#define    MT_COMPRESS_DXT4_5	           (2<<3)
+#define    MT_COMPRESS_FXT1		   (3<<3)
+#define    MT_COMPRESS_DXT1_RGB		   (4<<3)
+#define MS3_USE_FENCE_REGS              (1<<2)
+#define MS3_TILED_SURFACE             (1<<1)
+#define MS3_TILE_WALK                 (1<<0)
+
+#define MS4_PITCH_SHIFT                 21
+#define MS4_CUBE_FACE_ENA_NEGX          (1<<20)
+#define MS4_CUBE_FACE_ENA_POSX          (1<<19)
+#define MS4_CUBE_FACE_ENA_NEGY          (1<<18)
+#define MS4_CUBE_FACE_ENA_POSY          (1<<17)
+#define MS4_CUBE_FACE_ENA_NEGZ          (1<<16)
+#define MS4_CUBE_FACE_ENA_POSZ          (1<<15)
+#define MS4_CUBE_FACE_ENA_MASK          (0x3f<<15)
+#define MS4_MAX_LOD_SHIFT		9
+#define MS4_MAX_LOD_MASK		(0x3f<<9)
+#define MS4_MIP_LAYOUT_LEGACY           (0<<8)
+#define MS4_MIP_LAYOUT_BELOW_LPT        (0<<8)
+#define MS4_MIP_LAYOUT_RIGHT_LPT        (1<<8)
+#define MS4_VOLUME_DEPTH_SHIFT          0    
+#define MS4_VOLUME_DEPTH_MASK           (0xff<<0)
+
+/* p244 */
+#define _3DSTATE_SAMPLER_STATE         (CMD_3D|(0x1d<<24)|(0x1<<16))
+
+#define SS1_MAPMASK_SHIFT               0
+#define SS1_MAPMASK_MASK                (0x8fff<<0)
+
+#define SS2_REVERSE_GAMMA_ENABLE        (1<<31)
+#define SS2_PACKED_TO_PLANAR_ENABLE     (1<<30)
+#define SS2_COLORSPACE_CONVERSION       (1<<29)
+#define SS2_CHROMAKEY_SHIFT             27
+#define SS2_BASE_MIP_LEVEL_SHIFT        22
+#define SS2_BASE_MIP_LEVEL_MASK         (0x1f<<22)
+#define SS2_MIP_FILTER_SHIFT            20
+#define SS2_MIP_FILTER_MASK             (0x3<<20)
+#define   MIPFILTER_NONE       	0
+#define   MIPFILTER_NEAREST	1
+#define   MIPFILTER_LINEAR	3
+#define SS2_MAG_FILTER_SHIFT          17
+#define SS2_MAG_FILTER_MASK           (0x7<<17)
+#define   FILTER_NEAREST	0
+#define   FILTER_LINEAR		1
+#define   FILTER_ANISOTROPIC	2
+#define   FILTER_4X4_1    	3
+#define   FILTER_4X4_2    	4
+#define   FILTER_4X4_FLAT 	5
+#define   FILTER_6X5_MONO   	6 /* XXX - check */
+#define SS2_MIN_FILTER_SHIFT          14
+#define SS2_MIN_FILTER_MASK           (0x7<<14)
+#define SS2_LOD_BIAS_SHIFT            5
+#define SS2_LOD_BIAS_ONE              (0x10<<5)
+#define SS2_LOD_BIAS_MASK             (0x1ff<<5)
+/* Shadow requires:
+ *  MT_X8{I,L,A}24 or MT_{I,L,A}16 texture format
+ *  FILTER_4X4_x  MIN and MAG filters
+ */
+#define SS2_SHADOW_ENABLE             (1<<4)
+#define SS2_MAX_ANISO_MASK            (1<<3)
+#define SS2_MAX_ANISO_2               (0<<3)
+#define SS2_MAX_ANISO_4               (1<<3)
+#define SS2_SHADOW_FUNC_SHIFT         0
+#define SS2_SHADOW_FUNC_MASK          (0x7<<0)
+/* SS2_SHADOW_FUNC values: see COMPAREFUNC_* */
+
+#define SS3_MIN_LOD_SHIFT            24
+#define SS3_MIN_LOD_ONE              (0x10<<24)
+#define SS3_MIN_LOD_MASK             (0xff<<24)
+#define SS3_KILL_PIXEL_ENABLE        (1<<17)
+#define SS3_TCX_ADDR_MODE_SHIFT      12
+#define SS3_TCX_ADDR_MODE_MASK       (0x7<<12)
+#define   TEXCOORDMODE_WRAP		0
+#define   TEXCOORDMODE_MIRROR		1
+#define   TEXCOORDMODE_CLAMP_EDGE	2
+#define   TEXCOORDMODE_CUBE       	3
+#define   TEXCOORDMODE_CLAMP_BORDER	4
+#define   TEXCOORDMODE_MIRROR_ONCE      5
+#define SS3_TCY_ADDR_MODE_SHIFT      9
+#define SS3_TCY_ADDR_MODE_MASK       (0x7<<9)
+#define SS3_TCZ_ADDR_MODE_SHIFT      6
+#define SS3_TCZ_ADDR_MODE_MASK       (0x7<<6)
+#define SS3_NORMALIZED_COORDS        (1<<5)
+#define SS3_TEXTUREMAP_INDEX_SHIFT   1
+#define SS3_TEXTUREMAP_INDEX_MASK    (0xf<<1)
+#define SS3_DEINTERLACER_ENABLE      (1<<0)
+
+#define SS4_BORDER_COLOR_MASK        (~0)
+
+/* 3DSTATE_SPAN_STIPPLE, p258
+ */
+#define _3DSTATE_STIPPLE           ((0x3<<29)|(0x1d<<24)|(0x83<<16))
+#define ST1_ENABLE               (1<<16)
+#define ST1_MASK                 (0xffff)
+
+
+#define FLUSH_MAP_CACHE    (1<<0)
+#define FLUSH_RENDER_CACHE (1<<1)
+
+
+#endif
diff-tree 3592b432b48d51d2273c1e1064f85e656fbba130 (from a50610b7719bfe800c3496c17d0ba77739167b35)
Author: Alan Hourihane <alanh at fairlite.demon.co.uk>
Date:   Tue Jun 13 21:42:53 2006 +0100

    fix 8bpp & 16bpp rotation modes for i8xx
    series chips

diff --git a/src/i830_rotate.c b/src/i830_rotate.c
index e4a8064..4d7237f 100644
--- a/src/i830_rotate.c
+++ b/src/i830_rotate.c
@@ -574,9 +574,9 @@ I830UpdateRotate (ScreenPtr      pScreen
 	 OUT_RING(pI8301->RotatedMem2.Start | use_fence);
 
       if (pI830->cpp == 1)
-         OUT_RING(0x00 | (pScreen->height - 1) << 21 | (pScreen->width - 1) << 10);
-      else if (pI830->cpp == 2)
          OUT_RING(0x40 | (pScreen->height - 1) << 21 | (pScreen->width - 1) << 10);
+      else if (pI830->cpp == 2)
+         OUT_RING(0x80 | (pScreen->height - 1) << 21 | (pScreen->width - 1) << 10);
       else
          OUT_RING(0xc0 | (pScreen->height - 1) << 21 | (pScreen->width - 1) << 10);
 
diff-tree a50610b7719bfe800c3496c17d0ba77739167b35 (from f02268b2091c9a785d26e82bcb35a8b713463072)
Author: Alan Hourihane <alanh at fairlite.demon.co.uk>
Date:   Mon Jun 12 13:53:20 2006 +0100

    Use 800x600 mode to double check

diff --git a/src/i830_driver.c b/src/i830_driver.c
index 2d02c48..e43e355 100644
--- a/src/i830_driver.c
+++ b/src/i830_driver.c
@@ -956,17 +956,14 @@ I830Set640x480(ScrnInfoPtr pScrn)
 	   return TRUE;
 
    /* if the first failed, let's try the next - usually 800x600 */
-   m = 0x31;
-
+   m = 0x32;
    switch (pScrn->depth) {
    case 15:
-	 m = 0x42;
-	 break;
    case 16:
-	 m = 0x43;
+	 m = 0x42;
 	 break;
    case 24:
-	 m = 0x51;
+	 m = 0x52;
 	 break;
    }
    m |= (1 << 15) | (1 << 14);
diff-tree f02268b2091c9a785d26e82bcb35a8b713463072 (from 672c3d18dbb405095e465126053ff887d891409e)
Author: Alan Hourihane <alanh at fairlite.demon.co.uk>
Date:   Mon Jun 12 12:16:58 2006 +0100

    Don't rely on register check to find out
    if we're resuming - it's not reliable.
    
    But then, neither is the BIOS, but it's
    the best we can hope for until Eric's work
    is complete.
    
    Try setting another mode to cater for some
    broken BIOS' too.

diff --git a/src/i830_driver.c b/src/i830_driver.c
index 062d035..2d02c48 100644
--- a/src/i830_driver.c
+++ b/src/i830_driver.c
@@ -952,7 +952,28 @@ I830Set640x480(ScrnInfoPtr pScrn)
 	 break;
    }
    m |= (1 << 15) | (1 << 14);
-   return VBESetVBEMode(pI830->pVbe, m, NULL);
+   if (VBESetVBEMode(pI830->pVbe, m, NULL))
+	   return TRUE;
+
+   /* if the first failed, let's try the next - usually 800x600 */
+   m = 0x31;
+
+   switch (pScrn->depth) {
+   case 15:
+	 m = 0x42;
+	 break;
+   case 16:
+	 m = 0x43;
+	 break;
+   case 24:
+	 m = 0x51;
+	 break;
+   }
+   m |= (1 << 15) | (1 << 14);
+   if (VBESetVBEMode(pI830->pVbe, m, NULL))
+	   return TRUE;
+
+   return FALSE;
 }
 
 /* This is needed for SetDisplayDevices to work correctly on I915G.
@@ -5535,9 +5556,7 @@ I830BIOSEnterVT(int scrnIndex, int flags
       * the Video BIOS with our saved devices, and only when that fails,
       * we'll warm boot it.
       */
-     /* Check Pipe conf registers or possibly HTOTAL/VTOTAL for 0x00000000)*/
-      CARD32 temp = pI830->pipe ? INREG(PIPEBCONF) : INREG(PIPEACONF);
-      if (!I830Set640x480(pScrn) || !(temp & 0x80000000)) {
+      if (!I830Set640x480(pScrn)) {
          xf86Int10InfoPtr pInt;
 
          xf86DrvMsg(pScrn->scrnIndex, X_INFO, 
diff-tree 672c3d18dbb405095e465126053ff887d891409e (from 6812b5382077e5d3f421aceeeb2f337e9b3f570e)
Author: Alan Hourihane <alanh at fairlite.demon.co.uk>
Date:   Mon Jun 12 10:02:06 2006 +0100

    Only mark rotation flags after initial screen setup.
    Fixes bug #7053

diff --git a/src/i830_dri.h b/src/i830_dri.h
index e511ac7..4f356d1 100644
--- a/src/i830_dri.h
+++ b/src/i830_dri.h
@@ -9,8 +9,8 @@
 #define I830_MAX_DRAWABLES 256
 
 #define I830_MAJOR_VERSION 1
-#define I830_MINOR_VERSION 5
-#define I830_PATCHLEVEL 1
+#define I830_MINOR_VERSION 6
+#define I830_PATCHLEVEL 0
 
 #define I830_REG_SIZE 0x80000
 
diff --git a/src/i830_driver.c b/src/i830_driver.c
index 0f5c66c..062d035 100644
--- a/src/i830_driver.c
+++ b/src/i830_driver.c
@@ -4748,28 +4748,6 @@ I830BIOSScreenInit(int scrnIndex, Screen
    hwp = VGAHWPTR(pScrn);
 
    pScrn->displayWidth = pI830->displayWidth;
-   switch (pI830->InitialRotation) {
-      case 0:
-         xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Rotating to 0 degrees\n");
-         pI830->rotation = RR_Rotate_0;
-         break;
-      case 90:
-         xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Rotating to 90 degrees\n");
-         pI830->rotation = RR_Rotate_90;
-         break;
-      case 180:
-         xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Rotating to 180 degrees\n");
-         pI830->rotation = RR_Rotate_180;
-         break;
-      case 270:
-         xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Rotating to 270 degrees\n");
-         pI830->rotation = RR_Rotate_270;
-         break;
-      default:
-         xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Bad rotation setting - defaulting to 0 degrees\n");
-         pI830->rotation = RR_Rotate_0;
-         break;
-   }
 
    if (I830IsPrimary(pScrn)) {
       /* Rotated Buffer */
@@ -5158,6 +5136,29 @@ I830BIOSScreenInit(int scrnIndex, Screen
    pI830->closing = FALSE;
    pI830->suspended = FALSE;
 
+   switch (pI830->InitialRotation) {
+      case 0:
+         xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Rotating to 0 degrees\n");
+         pI830->rotation = RR_Rotate_0;
+         break;
+      case 90:
+         xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Rotating to 90 degrees\n");
+         pI830->rotation = RR_Rotate_90;
+         break;
+      case 180:
+         xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Rotating to 180 degrees\n");
+         pI830->rotation = RR_Rotate_180;
+         break;
+      case 270:
+         xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Rotating to 270 degrees\n");
+         pI830->rotation = RR_Rotate_270;
+         break;
+      default:
+         xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Bad rotation setting - defaulting to 0 degrees\n");
+         pI830->rotation = RR_Rotate_0;
+         break;
+   }
+
    return TRUE;
 }
 
diff-tree 6812b5382077e5d3f421aceeeb2f337e9b3f570e (from f97895efd5532cca145b6f224f9615739b1e8f26)
Author: Dave Airlie <airlied at linux.ie>
Date:   Fri Jun 2 12:22:14 2006 +1000

    intel: fix VT switch DRI locking
    
    The DRI locking is incorrect at VT switch, due to reference counting
    inside the driver. Just call the DRI directly.

diff --git a/src/i830_driver.c b/src/i830_driver.c
index 5462d6c..0f5c66c 100644
--- a/src/i830_driver.c
+++ b/src/i830_driver.c
@@ -5279,7 +5279,7 @@ I830BIOSLeaveVT(int scrnIndex, int flags
 
 #ifdef XF86DRI
    if (pI830->directRenderingOpen) {
-      I830DRILock(pScrn);
+      DRILock(screenInfo.screens[pScrn->scrnIndex], 0);
       
       drmCtlUninstHandler(pI830->drmSubFD);
    }
@@ -5611,7 +5611,7 @@ I830BIOSEnterVT(int scrnIndex, int flags
 	 DO_RING_IDLE();
 
 	 DPRINTF(PFX, "calling dri unlock\n");
-	 I830DRIUnlock(pScrn);
+	 DRIUnlock(screenInfo.screens[pScrn->scrnIndex]);
       }
       pI830->LockHeld = 0;
    }
diff-tree f97895efd5532cca145b6f224f9615739b1e8f26 (from f2967a2f5f47b636b2445fa69dbc3ec79e065c90)
Author: Dave Airlie <airlied at linux.ie>
Date:   Wed May 17 14:46:37 2006 +1000

    fixup chipid override
    
    This makes the ChipID override work so that we actually override the pci id
    that gets used everywhere in the driver.

diff --git a/src/i830_driver.c b/src/i830_driver.c
index 053ccd1..5462d6c 100644
--- a/src/i830_driver.c
+++ b/src/i830_driver.c
@@ -2293,6 +2293,7 @@ I830BIOSPreInit(ScrnInfoPtr pScrn, int f
       from = X_CONFIG;
       xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "ChipID override: 0x%04X\n",
 		 pI830->pEnt->device->chipID);
+      pI830->PciInfo->chipType = pI830->pEnt->device->chipID;
    } else {
       from = X_PROBED;
       pScrn->chipset = (char *)xf86TokenToString(I830BIOSChipsets,



More information about the xorg-commit mailing list