#ifndef GEN6_RENDER_H
#define GEN6_RENDER_H

#include <stdint.h>
#include "surfaceformat.h"
#include "gen4_render.h"

/* GEN6_STATE_BASE_ADDRESS */
# define BUFFER_SIZE_MODIFY			       (1 << 0)

#define GEN6_3DSTATE_VF_STATISTICS		GEN4_3D(1, 0, 0xB)

#define GEN6_MEDIA_STATE_POINTERS		GEN4_3D(2, 0, 0)
#define GEN6_MEDIA_OBJECT			GEN4_3D(2, 1, 0)

/* GEN6_3DSTATE_BINDING_TABLE_POINTERS */
# define GEN6_3DSTATE_BINDING_TABLE_MODIFY_PS	       (1 << 12)/* for GEN6 */
# define GEN6_3DSTATE_BINDING_TABLE_MODIFY_GS	       (1 << 9) /* for GEN6 */
# define GEN6_3DSTATE_BINDING_TABLE_MODIFY_VS	       (1 << 8) /* for GEN6 */

#define GEN6_3DSTATE_SAMPLER_STATE_POINTERS	GEN4_3D(3, 0, 0x02)
# define GEN6_3DSTATE_SAMPLER_STATE_MODIFY_PS	       (1 << 12)
# define GEN6_3DSTATE_SAMPLER_STATE_MODIFY_GS	       (1 << 9)
# define GEN6_3DSTATE_SAMPLER_STATE_MODIFY_VS	       (1 << 8)

#define GEN6_3DSTATE_URB			GEN4_3D(3, 0, 0x05)
/* DW1 */
# define GEN6_3DSTATE_URB_VS_SIZE_SHIFT			16
# define GEN6_3DSTATE_URB_VS_ENTRIES_SHIFT		0
/* DW2 */
# define GEN6_3DSTATE_URB_GS_ENTRIES_SHIFT		8
# define GEN6_3DSTATE_URB_GS_SIZE_SHIFT			0

#define GEN6_3DSTATE_VERTEX_ELEMENTS		GEN4_3D(3, 0, 0x09)
#define GEN6_3DSTATE_INDEX_BUFFER		GEN4_3D(3, 0, 0x0A)
#define GEN6_3DSTATE_VIEWPORT_STATE_POINTERS	GEN4_3D(3, 0, 0x0D)
# define GEN6_3DSTATE_VIEWPORT_STATE_MODIFY_CC	       (1 << 12)
# define GEN6_3DSTATE_VIEWPORT_STATE_MODIFY_SF	       (1 << 11)
# define GEN6_3DSTATE_VIEWPORT_STATE_MODIFY_CLIP       (1 << 10)

#define GEN6_3DSTATE_CC_STATE_POINTERS		GEN4_3D(3, 0, 0x0E)

#define GEN6_3DSTATE_VS				GEN4_3D(3, 0, 0x10)

#define GEN6_3DSTATE_GS				GEN4_3D(3, 0, 0x11)
/* DW4 */
# define GEN6_3DSTATE_GS_DISPATCH_START_GRF_SHIFT	0

#define GEN6_3DSTATE_CLIP			GEN4_3D(3, 0, 0x12)

#define GEN6_3DSTATE_SF				GEN4_3D(3, 0, 0x13)
/* DW1 */
# define GEN6_3DSTATE_SF_NUM_OUTPUTS_SHIFT			22
# define GEN6_3DSTATE_SF_URB_ENTRY_READ_LENGTH_SHIFT		11
# define GEN6_3DSTATE_SF_URB_ENTRY_READ_OFFSET_SHIFT		4
/* DW2 */
/* DW3 */
# define GEN6_3DSTATE_SF_CULL_BOTH				(0 << 29)
# define GEN6_3DSTATE_SF_CULL_NONE				(1 << 29)
# define GEN6_3DSTATE_SF_CULL_FRONT				(2 << 29)
# define GEN6_3DSTATE_SF_CULL_BACK				(3 << 29)
/* DW4 */
# define GEN6_3DSTATE_SF_TRI_PROVOKE_SHIFT			29
# define GEN6_3DSTATE_SF_LINE_PROVOKE_SHIFT			27
# define GEN6_3DSTATE_SF_TRIFAN_PROVOKE_SHIFT			25
# define GEN6_3DSTATE_SF_VERTEX_SUB_PIXEL_PRECISION_SHIFT	12

#define GEN6_3DSTATE_WM				GEN4_3D(3, 0, 0x14)
/* DW2 */
# define GEN6_3DSTATE_WM_SAMPLER_COUNT_SHIFT			27
# define GEN6_3DSTATE_WM_BINDING_TABLE_ENTRY_COUNT_SHIFT	18
/* DW4 */
# define GEN6_3DSTATE_WM_DISPATCH_START_GRF_0_SHIFT		16
/* DW5 */
# define GEN6_3DSTATE_WM_MAX_THREADS_SHIFT			25
# define GEN6_3DSTATE_WM_DISPATCH_ENABLE			(1 << 19)
# define GEN6_3DSTATE_WM_16_DISPATCH_ENABLE			(1 << 1)
# define GEN6_3DSTATE_WM_8_DISPATCH_ENABLE			(1 << 0)
/* DW6 */
# define GEN6_3DSTATE_WM_NUM_SF_OUTPUTS_SHIFT			20
# define GEN6_3DSTATE_WM_NONPERSPECTIVE_SAMPLE_BARYCENTRIC	(1 << 15)
# define GEN6_3DSTATE_WM_NONPERSPECTIVE_CENTROID_BARYCENTRIC	(1 << 14)
# define GEN6_3DSTATE_WM_NONPERSPECTIVE_PIXEL_BARYCENTRIC	(1 << 13)
# define GEN6_3DSTATE_WM_PERSPECTIVE_SAMPLE_BARYCENTRIC		(1 << 12)
# define GEN6_3DSTATE_WM_PERSPECTIVE_CENTROID_BARYCENTRIC	(1 << 11)
# define GEN6_3DSTATE_WM_PERSPECTIVE_PIXEL_BARYCENTRIC		(1 << 10)

#define GEN6_3DSTATE_CONSTANT_VS		GEN4_3D(3, 0, 0x15)
#define GEN6_3DSTATE_CONSTANT_GS		GEN4_3D(3, 0, 0x16)
#define GEN6_3DSTATE_CONSTANT_PS		GEN4_3D(3, 0, 0x17)

#define GEN6_3DSTATE_SAMPLE_MASK		GEN4_3D(3, 0, 0x18)

#define GEN6_3DSTATE_CONSTANT_COLOR		GEN4_3D(3, 1, 0x01)
#define GEN6_3DSTATE_SAMPLER_PALETTE_LOAD	GEN4_3D(3, 1, 0x02)
#define GEN6_3DSTATE_CHROMA_KEY			GEN4_3D(3, 1, 0x04)

#define GEN6_3DSTATE_POLY_STIPPLE_OFFSET	GEN4_3D(3, 1, 0x06)
#define GEN6_3DSTATE_POLY_STIPPLE_PATTERN	GEN4_3D(3, 1, 0x07)
#define GEN6_3DSTATE_LINE_STIPPLE		GEN4_3D(3, 1, 0x08)
#define GEN6_3DSTATE_GLOBAL_DEPTH_OFFSET_CLAMP	GEN4_3D(3, 1, 0x09)
/* These two are BLC and CTG only, not BW or CL */
#define GEN6_3DSTATE_AA_LINE_PARAMS		GEN4_3D(3, 1, 0x0A)
#define GEN6_3DSTATE_GS_SVB_INDEX		GEN4_3D(3, 1, 0x0B)
#define GEN6_3DSTATE_MULTISAMPLE		GEN4_3D(3, 1, 0x0D)
/* DW1 */
# define GEN6_3DSTATE_MULTISAMPLE_PIXEL_LOCATION_CENTER		(0 << 4)
# define GEN6_3DSTATE_MULTISAMPLE_PIXEL_LOCATION_UPPER_LEFT	(1 << 4)
# define GEN6_3DSTATE_MULTISAMPLE_NUMSAMPLES_1			(0 << 1)
# define GEN6_3DSTATE_MULTISAMPLE_NUMSAMPLES_4			(2 << 1)
# define GEN6_3DSTATE_MULTISAMPLE_NUMSAMPLES_8			(3 << 1)

/* DW1 */
# define GEN6_PIPE_CONTROL_NOWRITE		       (0 << 14)
# define GEN6_PIPE_CONTROL_WRITE_QWORD		       (1 << 14)
# define GEN6_PIPE_CONTROL_WRITE_DEPTH		       (2 << 14)
# define GEN6_PIPE_CONTROL_WRITE_TIME		       (3 << 14)
# define GEN6_PIPE_CONTROL_DEPTH_STALL		       (1 << 13)
# define GEN6_PIPE_CONTROL_WC_FLUSH		       (1 << 12)
# define GEN6_PIPE_CONTROL_IS_FLUSH		       (1 << 11)
# define GEN6_PIPE_CONTROL_TC_FLUSH		       (1 << 10)
# define GEN6_PIPE_CONTROL_NOTIFY_ENABLE	       (1 << 8)
# define GEN6_PIPE_CONTROL_GLOBAL_GTT		       (1 << 2)
# define GEN6_PIPE_CONTROL_LOCAL_PGTT		       (0 << 2)
# define GEN6_PIPE_CONTROL_DEPTH_CACHE_FLUSH	       (1 << 0)

#define GEN6_3DSTATE_MONOFILTER_SIZE		GEN4_3D(3, 1, 0x11)
#define GEN6_PIPE_CONTROL			GEN4_3D(3, 2, 0)

/* VERTEX_BUFFER_STATE Structure */
#define GEN6_VB0_BUFFER_INDEX_SHIFT	 26
#define GEN6_VB0_VERTEXDATA		(0 << 20)
#define GEN6_VB0_INSTANCEDATA	(1 << 20)
#define VB0_NULL_VERTEX_BUFFER	(1 << 13)

/* VERTEX_ELEMENT_STATE Structure */
#define GEN6_VE0_VERTEX_BUFFER_INDEX_SHIFT	 26 /* for GEN6 */
#define GEN6_VE0_VALID				(1 << 25) /* for GEN6 */

#define GEN6_SVG_CTL		0x7400
# define GEN6_SVG_CTL_GS_BA	(0 << 8)
# define GEN6_SVG_CTL_SS_BA	(1 << 8)
# define GEN6_SVG_CTL_IO_BA	(2 << 8)
# define GEN6_SVG_CTL_GS_AUB	(3 << 8)
# define GEN6_SVG_CTL_IO_AUB	(4 << 8)
# define GEN6_SVG_CTL_SIP	(5 << 8)

#define GEN6_SVG_RDATA		0x7404
#define GEN6_SVG_WORK_CTL	0x7408

#define GEN6_VF_CTL					0x7500
# define GEN6_VF_CTL_SNAPSHOT_COMPLETE			(1 << 31)
# define GEN6_VF_CTL_SNAPSHOT_MUX_SELECT_THREADID	(0 << 8)
# define GEN6_VF_CTL_SNAPSHOT_MUX_SELECT_VF_DEBUG	(1 << 8)
# define GEN6_VF_CTL_SNAPSHOT_TYPE_VERTEX_SEQUENCE	(0 << 4)
# define GEN6_VF_CTL_SNAPSHOT_TYPE_VERTEX_INDEX		(1 << 4)
# define GEN6_VF_CTL_SKIP_INITIAL_PRIMITIVES		(1 << 3)
# define GEN6_VF_CTL_MAX_PRIMITIVES_LIMIT_ENABLE	(1 << 2)
# define GEN6_VF_CTL_VERTEX_RANGE_LIMIT_ENABLE		(1 << 1)
# define GEN6_VF_CTL_SNAPSHOT_ENABLE			(1 << 0)

#define GEN6_VF_STRG_VAL	0x7504
#define GEN6_VF_STR_VL_OVR	0x7508
#define GEN6_VF_VC_OVR		0x750c
#define GEN6_VF_STR_PSKIP	0x7510
#define GEN6_VF_MAX_PRIM	0x7514
#define GEN6_VF_RDATA		0x7518

#define GEN6_VS_CTL					0x7600
# define GEN6_VS_CTL_SNAPSHOT_COMPLETE			(1 << 31)
# define GEN6_VS_CTL_SNAPSHOT_MUX_VERTEX_0		(0 << 8)
# define GEN6_VS_CTL_SNAPSHOT_MUX_VERTEX_1		(1 << 8)
# define GEN6_VS_CTL_SNAPSHOT_MUX_VALID_COUNT		(2 << 8)
# define GEN6_VS_CTL_SNAPSHOT_MUX_VS_KERNEL_POINTER	(3 << 8)
# define GEN6_VS_CTL_SNAPSHOT_ALL_THREADS		(1 << 2)
# define GEN6_VS_CTL_THREAD_SNAPSHOT_ENABLE		(1 << 1)
# define GEN6_VS_CTL_SNAPSHOT_ENABLE			 (1 << 0)

#define GEN6_VS_STRG_VAL	0x7604
#define GEN6_VS_RDATA		0x7608

#define GEN6_SF_CTL					0x7b00
# define GEN6_SF_CTL_SNAPSHOT_COMPLETE			(1 << 31)
# define GEN6_SF_CTL_SNAPSHOT_MUX_VERTEX_0_FF_ID	(0 << 8)
# define GEN6_SF_CTL_SNAPSHOT_MUX_VERTEX_0_REL_COUNT	(1 << 8)
# define GEN6_SF_CTL_SNAPSHOT_MUX_VERTEX_1_FF_ID	(2 << 8)
# define GEN6_SF_CTL_SNAPSHOT_MUX_VERTEX_1_REL_COUNT	(3 << 8)
# define GEN6_SF_CTL_SNAPSHOT_MUX_VERTEX_2_FF_ID	(4 << 8)
# define GEN6_SF_CTL_SNAPSHOT_MUX_VERTEX_2_REL_COUNT	(5 << 8)
# define GEN6_SF_CTL_SNAPSHOT_MUX_VERTEX_COUNT		(6 << 8)
# define GEN6_SF_CTL_SNAPSHOT_MUX_SF_KERNEL_POINTER	(7 << 8)
# define GEN6_SF_CTL_MIN_MAX_PRIMITIVE_RANGE_ENABLE	(1 << 4)
# define GEN6_SF_CTL_DEBUG_CLIP_RECTANGLE_ENABLE	(1 << 3)
# define GEN6_SF_CTL_SNAPSHOT_ALL_THREADS		(1 << 2)
# define GEN6_SF_CTL_THREAD_SNAPSHOT_ENABLE		(1 << 1)
# define GEN6_SF_CTL_SNAPSHOT_ENABLE			(1 << 0)

#define GEN6_SF_STRG_VAL	0x7b04
#define GEN6_SF_RDATA		0x7b18

#define GEN6_WIZ_CTL					0x7c00
# define GEN6_WIZ_CTL_SNAPSHOT_COMPLETE			(1 << 31)
# define GEN6_WIZ_CTL_SUBSPAN_INSTANCE_SHIFT		 16
# define GEN6_WIZ_CTL_SNAPSHOT_MUX_WIZ_KERNEL_POINTER	(0 << 8)
# define GEN6_WIZ_CTL_SNAPSHOT_MUX_SUBSPAN_INSTANCE	(1 << 8)
# define GEN6_WIZ_CTL_SNAPSHOT_MUX_PRIMITIVE_SEQUENCE	(2 << 8)
# define GEN6_WIZ_CTL_SINGLE_SUBSPAN_DISPATCH		(1 << 6)
# define GEN6_WIZ_CTL_IGNORE_COLOR_SCOREBOARD_STALLS	(1 << 5)
# define GEN6_WIZ_CTL_ENABLE_SUBSPAN_INSTANCE_COMPARE	(1 << 4)
# define GEN6_WIZ_CTL_USE_UPSTREAM_SNAPSHOT_FLAG	(1 << 3)
# define GEN6_WIZ_CTL_SNAPSHOT_ALL_THREADS		(1 << 2)
# define GEN6_WIZ_CTL_THREAD_SNAPSHOT_ENABLE		(1 << 1)
# define GEN6_WIZ_CTL_SNAPSHOT_ENABLE			(1 << 0)

#define GEN6_WIZ_STRG_VAL	0x7c04
#define GEN6_WIZ_RDATA	0x7c18

#define GEN6_TS_CTL					0x7e00
# define GEN6_TS_CTL_SNAPSHOT_COMPLETE			(1 << 31)
# define GEN6_TS_CTL_SNAPSHOT_MESSAGE_ERROR		(0 << 8)
# define GEN6_TS_CTL_SNAPSHOT_INTERFACE_DESCRIPTOR	(3 << 8)
# define GEN6_TS_CTL_SNAPSHOT_ALL_CHILD_THREADS		(1 << 2)
# define GEN6_TS_CTL_SNAPSHOT_ALL_ROOT_THREADS		(1 << 1)
# define GEN6_TS_CTL_SNAPSHOT_ENABLE			(1 << 0)

#define GEN6_TS_STRG_VAL	0x7e04
#define GEN6_TS_RDATA		0x7e08

#define GEN6_TD_CTL_MUX_SHIFT				 8
#define GEN6_TD_CTL_EXTERNAL_HALT_R0_DEBUG_MATCH	(1 << 7)
#define GEN6_TD_CTL_FORCE_EXTERNAL_HALT			(1 << 6)
#define GEN6_TD_CTL_EXCEPTION_MASK_OVERRIDE		(1 << 5)
#define GEN6_TD_CTL_FORCE_THREAD_BREAKPOINT_ENABLE	(1 << 4)
#define GEN6_TD_CTL_BREAKPOINT_ENABLE			(1 << 2)

#define GEN6_TD_CTL2						0x8004
# define GEN6_TD_CTL2_ILLEGAL_OPCODE_EXCEPTION_OVERRIDE		(1 << 28)
# define GEN6_TD_CTL2_MASKSTACK_EXCEPTION_OVERRIDE		(1 << 26)
# define GEN6_TD_CTL2_SOFTWARE_EXCEPTION_OVERRIDE		(1 << 25)
# define GEN6_TD_CTL2_ACTIVE_THREAD_LIMIT_SHIFT			 16
# define GEN6_TD_CTL2_ACTIVE_THREAD_LIMIT_ENABLE		(1 << 8)
# define GEN6_TD_CTL2_THREAD_SPAWNER_EXECUTION_MASK_ENABLE	(1 << 7)
# define GEN6_TD_CTL2_WIZ_EXECUTION_MASK_ENABLE			(1 << 6)
# define GEN6_TD_CTL2_SF_EXECUTION_MASK_ENABLE			(1 << 5)
# define GEN6_TD_CTL2_CLIPPER_EXECUTION_MASK_ENABLE		(1 << 4)
# define GEN6_TD_CTL2_GS_EXECUTION_MASK_ENABLE			(1 << 3)
# define GEN6_TD_CTL2_VS_EXECUTION_MASK_ENABLE			(1 << 0)

#define GEN6_TD_VF_VS_EMSK	0x8008
#define GEN6_TD_GS_EMSK		0x800c
#define GEN6_TD_CLIP_EMSK	0x8010
#define GEN6_TD_SF_EMSK		0x8014
#define GEN6_TD_WIZ_EMSK	0x8018
#define GEN6_TD_0_6_EHTRG_VAL	0x801c
#define GEN6_TD_0_7_EHTRG_VAL	0x8020
#define GEN6_TD_0_6_EHTRG_MSK	0x8024
#define GEN6_TD_0_7_EHTRG_MSK	0x8028
#define GEN6_TD_RDATA		0x802c
#define GEN6_TD_TS_EMSK		0x8030

#define GEN6_EU_CTL			0x8800
# define GEN6_EU_CTL_SELECT_SHIFT	16
# define GEN6_EU_CTL_DATA_MUX_SHIFT	8

#define GEN6_EU_ATT_0		0x8810
#define GEN6_EU_ATT_1		0x8814
#define GEN6_EU_ATT_DATA_0	0x8820
#define GEN6_EU_ATT_DATA_1	0x8824
#define GEN6_EU_ATT_CLR_0	0x8830
#define GEN6_EU_ATT_CLR_1	0x8834
#define GEN6_EU_RDATA		0x8840

/* 3D state */
#define _3DOP_3DSTATE_PIPELINED			0x0
#define _3DOP_3DSTATE_NONPIPELINED		0x1
#define _3DOP_3DCONTROL				0x2
#define _3DOP_3DPRIMITIVE			0x3

#define _3DSTATE_PIPELINED_POINTERS		0x00
#define _3DSTATE_BINDING_TABLE_POINTERS		0x01
#define _3DSTATE_VERTEX_BUFFERS			0x08
#define _3DSTATE_VERTEX_ELEMENTS		0x09
#define _3DSTATE_INDEX_BUFFER			0x0A
#define _3DSTATE_VF_STATISTICS			0x0B
#define _3DSTATE_DRAWING_RECTANGLE		0x00
#define _3DSTATE_CONSTANT_COLOR			0x01
#define _3DSTATE_SAMPLER_PALETTE_LOAD		0x02
#define _3DSTATE_CHROMA_KEY			0x04
#define _3DSTATE_DEPTH_BUFFER			0x05
#define _3DSTATE_POLY_STIPPLE_OFFSET		0x06
#define _3DSTATE_POLY_STIPPLE_PATTERN		0x07
#define _3DSTATE_LINE_STIPPLE			0x08
#define _3DSTATE_GLOBAL_DEPTH_OFFSET_CLAMP	0x09
#define _3DCONTROL				0x00
#define _3DPRIMITIVE				0x00

#define _3DPRIM_VERTEXBUFFER_ACCESS_SEQUENTIAL	0
#define _3DPRIM_VERTEXBUFFER_ACCESS_RANDOM	1

#define GEN6_ANISORATIO_2	0
#define GEN6_ANISORATIO_4	1
#define GEN6_ANISORATIO_6	2
#define GEN6_ANISORATIO_8	3
#define GEN6_ANISORATIO_10	4
#define GEN6_ANISORATIO_12	5
#define GEN6_ANISORATIO_14	6
#define GEN6_ANISORATIO_16	7

#define GEN6_BLENDFACTOR_ONE			0x01
#define GEN6_BLENDFACTOR_SRC_COLOR		0x02
#define GEN6_BLENDFACTOR_SRC_ALPHA		0x03
#define GEN6_BLENDFACTOR_DST_ALPHA		0x04
#define GEN6_BLENDFACTOR_DST_COLOR		0x05
#define GEN6_BLENDFACTOR_SRC_ALPHA_SATURATE	0x06
#define GEN6_BLENDFACTOR_CONST_COLOR		0x07
#define GEN6_BLENDFACTOR_CONST_ALPHA		0x08
#define GEN6_BLENDFACTOR_SRC1_COLOR		0x09
#define GEN6_BLENDFACTOR_SRC1_ALPHA		0x0A
#define GEN6_BLENDFACTOR_ZERO			0x11
#define GEN6_BLENDFACTOR_INV_SRC_COLOR		0x12
#define GEN6_BLENDFACTOR_INV_SRC_ALPHA		0x13
#define GEN6_BLENDFACTOR_INV_DST_ALPHA		0x14
#define GEN6_BLENDFACTOR_INV_DST_COLOR		0x15
#define GEN6_BLENDFACTOR_INV_CONST_COLOR	0x17
#define GEN6_BLENDFACTOR_INV_CONST_ALPHA	0x18
#define GEN6_BLENDFACTOR_INV_SRC1_COLOR		0x19
#define GEN6_BLENDFACTOR_INV_SRC1_ALPHA		0x1A

#define GEN6_BLENDFUNCTION_ADD			0
#define GEN6_BLENDFUNCTION_SUBTRACT		1
#define GEN6_BLENDFUNCTION_REVERSE_SUBTRACT	2
#define GEN6_BLENDFUNCTION_MIN			3
#define GEN6_BLENDFUNCTION_MAX			4

#define GEN6_ALPHATEST_FORMAT_UNORM8	0
#define GEN6_ALPHATEST_FORMAT_FLOAT32	1

#define GEN6_CHROMAKEY_KILL_ON_ANY_MATCH	0
#define GEN6_CHROMAKEY_REPLACE_BLACK		1

#define GEN6_CLIP_API_OGL	0
#define GEN6_CLIP_API_DX	1

#define GEN6_CLIPMODE_NORMAL		0
#define GEN6_CLIPMODE_CLIP_ALL		1
#define GEN6_CLIPMODE_CLIP_NON_REJECTED	2
#define GEN6_CLIPMODE_REJECT_ALL	3
#define GEN6_CLIPMODE_ACCEPT_ALL	4

#define GEN6_CLIP_NDCSPACE	0
#define GEN6_CLIP_SCREENSPACE	1

#define GEN6_COMPAREFUNCTION_ALWAYS	0
#define GEN6_COMPAREFUNCTION_NEVER	1
#define GEN6_COMPAREFUNCTION_LESS	2
#define GEN6_COMPAREFUNCTION_EQUAL	3
#define GEN6_COMPAREFUNCTION_LEQUAL	4
#define GEN6_COMPAREFUNCTION_GREATER	5
#define GEN6_COMPAREFUNCTION_NOTEQUAL	6
#define GEN6_COMPAREFUNCTION_GEQUAL	7

#define GEN6_COVERAGE_PIXELS_HALF	0
#define GEN6_COVERAGE_PIXELS_1		1
#define GEN6_COVERAGE_PIXELS_2		2
#define GEN6_COVERAGE_PIXELS_4		3

#define GEN6_DEFAULTCOLOR_R8G8B8A8_UNORM	0
#define GEN6_DEFAULTCOLOR_R32G32B32A32_FLOAT	1

#define GEN6_FLOATING_POINT_IEEE_754		0
#define GEN6_FLOATING_POINT_NON_IEEE_754	1

#define GEN6_FRONTWINDING_CW	0
#define GEN6_FRONTWINDING_CCW	1

#define GEN6_INDEX_BYTE		0
#define GEN6_INDEX_WORD		1
#define GEN6_INDEX_DWORD	2

#define GEN6_LOGICOPFUNCTION_CLEAR		0
#define GEN6_LOGICOPFUNCTION_NOR		1
#define GEN6_LOGICOPFUNCTION_AND_INVERTED	2
#define GEN6_LOGICOPFUNCTION_COPY_INVERTED	3
#define GEN6_LOGICOPFUNCTION_AND_REVERSE	4
#define GEN6_LOGICOPFUNCTION_INVERT		5
#define GEN6_LOGICOPFUNCTION_XOR		6
#define GEN6_LOGICOPFUNCTION_NAND		7
#define GEN6_LOGICOPFUNCTION_AND		8
#define GEN6_LOGICOPFUNCTION_EQUIV		9
#define GEN6_LOGICOPFUNCTION_NOOP		10
#define GEN6_LOGICOPFUNCTION_OR_INVERTED	11
#define GEN6_LOGICOPFUNCTION_COPY		12
#define GEN6_LOGICOPFUNCTION_OR_REVERSE		13
#define GEN6_LOGICOPFUNCTION_OR			14
#define GEN6_LOGICOPFUNCTION_SET		15

#define GEN6_POLYGON_FRONT_FACING	0
#define GEN6_POLYGON_BACK_FACING	1

#define GEN6_PROVOKING_VERTEX_0		0
#define GEN6_PROVOKING_VERTEX_1		1
#define GEN6_PROVOKING_VERTEX_2		2

#define GEN6_RASTRULE_UPPER_LEFT	0
#define GEN6_RASTRULE_UPPER_RIGHT	1

#define GEN6_RENDERTARGET_CLAMPRANGE_UNORM	0
#define GEN6_RENDERTARGET_CLAMPRANGE_SNORM	1
#define GEN6_RENDERTARGET_CLAMPRANGE_FORMAT	2

#define GEN6_STENCILOP_KEEP	0
#define GEN6_STENCILOP_ZERO	1
#define GEN6_STENCILOP_REPLACE	2
#define GEN6_STENCILOP_INCRSAT	3
#define GEN6_STENCILOP_DECRSAT	4
#define GEN6_STENCILOP_INCR	5
#define GEN6_STENCILOP_DECR	6
#define GEN6_STENCILOP_INVERT	7

#define GEN6_THREAD_PRIORITY_NORMAL	0
#define GEN6_THREAD_PRIORITY_HIGH	1

#define GEN6_TILEWALK_XMAJOR		0
#define GEN6_TILEWALK_YMAJOR		1

#define GEN6_VERTEX_SUBPIXEL_PRECISION_8BITS	0
#define GEN6_VERTEX_SUBPIXEL_PRECISION_4BITS	1

#define GEN6_VERTEXBUFFER_ACCESS_VERTEXDATA	0
#define GEN6_VERTEXBUFFER_ACCESS_INSTANCEDATA	1

/* Execution Unit (EU) defines */

#define GEN6_ALIGN_1	0
#define GEN6_ALIGN_16	1

#define GEN6_ADDRESS_DIRECT			0
#define GEN6_ADDRESS_REGISTER_INDIRECT_REGISTER	1

#define GEN6_CHANNEL_X	0
#define GEN6_CHANNEL_Y	1
#define GEN6_CHANNEL_Z	2
#define GEN6_CHANNEL_W	3

#define GEN6_COMPRESSION_NONE	0
#define GEN6_COMPRESSION_2NDHALF	1
#define GEN6_COMPRESSION_COMPRESSED	2

#define GEN6_CONDITIONAL_NONE	0
#define GEN6_CONDITIONAL_Z	1
#define GEN6_CONDITIONAL_NZ	2
#define GEN6_CONDITIONAL_EQ	1	/* Z */
#define GEN6_CONDITIONAL_NEQ	2	/* NZ */
#define GEN6_CONDITIONAL_G	3
#define GEN6_CONDITIONAL_GE	4
#define GEN6_CONDITIONAL_L	5
#define GEN6_CONDITIONAL_LE	6
#define GEN6_CONDITIONAL_C	7
#define GEN6_CONDITIONAL_O	8

#define GEN6_DEBUG_NONE		0
#define GEN6_DEBUG_BREAKPOINT	1

#define GEN6_DEPENDENCY_NORMAL		0
#define GEN6_DEPENDENCY_NOTCLEARED	1
#define GEN6_DEPENDENCY_NOTCHECKED	2
#define GEN6_DEPENDENCY_DISABLE		3

#define GEN6_EXECUTE_1		0
#define GEN6_EXECUTE_2		1
#define GEN6_EXECUTE_4		2
#define GEN6_EXECUTE_8		3
#define GEN6_EXECUTE_16		4
#define GEN6_EXECUTE_32		5

#define GEN6_HORIZONTAL_STRIDE_0	0
#define GEN6_HORIZONTAL_STRIDE_1	1
#define GEN6_HORIZONTAL_STRIDE_2	2
#define GEN6_HORIZONTAL_STRIDE_4	3

#define GEN6_INSTRUCTION_NORMAL		0
#define GEN6_INSTRUCTION_SATURATE	1

#define GEN6_MASK_ENABLE	0
#define GEN6_MASK_DISABLE	1

#define GEN6_OPCODE_MOV		1
#define GEN6_OPCODE_SEL		2
#define GEN6_OPCODE_NOT		4
#define GEN6_OPCODE_AND		5
#define GEN6_OPCODE_OR		6
#define GEN6_OPCODE_XOR		7
#define GEN6_OPCODE_SHR		8
#define GEN6_OPCODE_SHL		9
#define GEN6_OPCODE_RSR		10
#define GEN6_OPCODE_RSL		11
#define GEN6_OPCODE_ASR		12
#define GEN6_OPCODE_CMP		16
#define GEN6_OPCODE_JMPI	32
#define GEN6_OPCODE_IF		34
#define GEN6_OPCODE_IFF		35
#define GEN6_OPCODE_ELSE	36
#define GEN6_OPCODE_ENDIF	37
#define GEN6_OPCODE_DO		38
#define GEN6_OPCODE_WHILE	39
#define GEN6_OPCODE_BREAK	40
#define GEN6_OPCODE_CONTINUE	41
#define GEN6_OPCODE_HALT	42
#define GEN6_OPCODE_MSAVE	44
#define GEN6_OPCODE_MRESTORE	45
#define GEN6_OPCODE_PUSH	46
#define GEN6_OPCODE_POP		47
#define GEN6_OPCODE_WAIT	48
#define GEN6_OPCODE_SEND	49
#define GEN6_OPCODE_ADD		64
#define GEN6_OPCODE_MUL		65
#define GEN6_OPCODE_AVG		66
#define GEN6_OPCODE_FRC		67
#define GEN6_OPCODE_RNDU	68
#define GEN6_OPCODE_RNDD	69
#define GEN6_OPCODE_RNDE	70
#define GEN6_OPCODE_RNDZ	71
#define GEN6_OPCODE_MAC		72
#define GEN6_OPCODE_MACH	73
#define GEN6_OPCODE_LZD		74
#define GEN6_OPCODE_SAD2	80
#define GEN6_OPCODE_SADA2	81
#define GEN6_OPCODE_DP4		84
#define GEN6_OPCODE_DPH		85
#define GEN6_OPCODE_DP3		86
#define GEN6_OPCODE_DP2		87
#define GEN6_OPCODE_DPA2	88
#define GEN6_OPCODE_LINE	89
#define GEN6_OPCODE_NOP		126

#define GEN6_PREDICATE_NONE			0
#define GEN6_PREDICATE_NORMAL			1
#define GEN6_PREDICATE_ALIGN1_ANYV		2
#define GEN6_PREDICATE_ALIGN1_ALLV		3
#define GEN6_PREDICATE_ALIGN1_ANY2H		4
#define GEN6_PREDICATE_ALIGN1_ALL2H		5
#define GEN6_PREDICATE_ALIGN1_ANY4H		6
#define GEN6_PREDICATE_ALIGN1_ALL4H		7
#define GEN6_PREDICATE_ALIGN1_ANY8H		8
#define GEN6_PREDICATE_ALIGN1_ALL8H		9
#define GEN6_PREDICATE_ALIGN1_ANY16H		10
#define GEN6_PREDICATE_ALIGN1_ALL16H		11
#define GEN6_PREDICATE_ALIGN16_REPLICATE_X	2
#define GEN6_PREDICATE_ALIGN16_REPLICATE_Y	3
#define GEN6_PREDICATE_ALIGN16_REPLICATE_Z	4
#define GEN6_PREDICATE_ALIGN16_REPLICATE_W	5
#define GEN6_PREDICATE_ALIGN16_ANY4H		6
#define GEN6_PREDICATE_ALIGN16_ALL4H		7

#define GEN6_ARCHITECTURE_REGISTER_FILE		0
#define GEN6_GENERAL_REGISTER_FILE		1
#define GEN6_MESSAGE_REGISTER_FILE		2
#define GEN6_IMMEDIATE_VALUE			3

#define GEN6_REGISTER_TYPE_UD	0
#define GEN6_REGISTER_TYPE_D	1
#define GEN6_REGISTER_TYPE_UW	2
#define GEN6_REGISTER_TYPE_W	3
#define GEN6_REGISTER_TYPE_UB	4
#define GEN6_REGISTER_TYPE_B	5
/* packed float vector, immediates only? */
#define GEN6_REGISTER_TYPE_VF	5
#define GEN6_REGISTER_TYPE_HF	6
/* packed int vector, immediates only, uword dest only */
#define GEN6_REGISTER_TYPE_V	6
#define GEN6_REGISTER_TYPE_F	7

#define GEN6_ARF_NULL			0x00
#define GEN6_ARF_ADDRESS		0x10
#define GEN6_ARF_ACCUMULATOR		0x20
#define GEN6_ARF_FLAG			0x30
#define GEN6_ARF_MASK			0x40
#define GEN6_ARF_MASK_STACK		0x50
#define GEN6_ARF_MASK_STACK_DEPTH	0x60
#define GEN6_ARF_STATE			0x70
#define GEN6_ARF_CONTROL		0x80
#define GEN6_ARF_NOTIFICATION_COUNT	0x90
#define GEN6_ARF_I			0xA0

#define GEN6_AMASK	0
#define GEN6_IMASK	1
#define GEN6_LMASK	2
#define GEN6_CMASK	3

#define GEN6_THREAD_NORMAL	0
#define GEN6_THREAD_ATOMIC	1
#define GEN6_THREAD_SWITCH	2

#define GEN6_VERTICAL_STRIDE_0			0
#define GEN6_VERTICAL_STRIDE_1			1
#define GEN6_VERTICAL_STRIDE_2			2
#define GEN6_VERTICAL_STRIDE_4			3
#define GEN6_VERTICAL_STRIDE_8			4
#define GEN6_VERTICAL_STRIDE_16			5
#define GEN6_VERTICAL_STRIDE_32			6
#define GEN6_VERTICAL_STRIDE_64			7
#define GEN6_VERTICAL_STRIDE_128		8
#define GEN6_VERTICAL_STRIDE_256		9
#define GEN6_VERTICAL_STRIDE_ONE_DIMENSIONAL	0xF

#define GEN6_WIDTH_1	0
#define GEN6_WIDTH_2	1
#define GEN6_WIDTH_4	2
#define GEN6_WIDTH_8	3
#define GEN6_WIDTH_16	4

#define GEN6_STATELESS_BUFFER_BOUNDARY_1K	0
#define GEN6_STATELESS_BUFFER_BOUNDARY_2K	1
#define GEN6_STATELESS_BUFFER_BOUNDARY_4K	2
#define GEN6_STATELESS_BUFFER_BOUNDARY_8K	3
#define GEN6_STATELESS_BUFFER_BOUNDARY_16K	4
#define GEN6_STATELESS_BUFFER_BOUNDARY_32K	5
#define GEN6_STATELESS_BUFFER_BOUNDARY_64K	6
#define GEN6_STATELESS_BUFFER_BOUNDARY_128K	7
#define GEN6_STATELESS_BUFFER_BOUNDARY_256K	8
#define GEN6_STATELESS_BUFFER_BOUNDARY_512K	9
#define GEN6_STATELESS_BUFFER_BOUNDARY_1M	10
#define GEN6_STATELESS_BUFFER_BOUNDARY_2M	11

#define GEN6_POLYGON_FACING_FRONT	0
#define GEN6_POLYGON_FACING_BACK	1

#define GEN6_MESSAGE_TARGET_NULL		0
#define GEN6_MESSAGE_TARGET_MATH		1
#define GEN6_MESSAGE_TARGET_SAMPLER		2
#define GEN6_MESSAGE_TARGET_GATEWAY		3
#define GEN6_MESSAGE_TARGET_DATAPORT_READ	4
#define GEN6_MESSAGE_TARGET_DATAPORT_WRITE	5
#define GEN6_MESSAGE_TARGET_URB			6
#define GEN6_MESSAGE_TARGET_THREAD_SPAWNER	7

#define GEN6_SAMPLER_RETURN_FORMAT_FLOAT32	0
#define GEN6_SAMPLER_RETURN_FORMAT_UINT32	2
#define GEN6_SAMPLER_RETURN_FORMAT_SINT32	3

#define GEN6_SAMPLER_MESSAGE_SIMD8_SAMPLE		0
#define GEN6_SAMPLER_MESSAGE_SIMD16_SAMPLE		0
#define GEN6_SAMPLER_MESSAGE_SIMD16_SAMPLE_BIAS		0
#define GEN6_SAMPLER_MESSAGE_SIMD8_KILLPIX		1
#define GEN6_SAMPLER_MESSAGE_SIMD4X2_SAMPLE_LOD		1
#define GEN6_SAMPLER_MESSAGE_SIMD16_SAMPLE_LOD		1
#define GEN6_SAMPLER_MESSAGE_SIMD4X2_SAMPLE_GRADIENTS	2
#define GEN6_SAMPLER_MESSAGE_SIMD8_SAMPLE_GRADIENTS	2
#define GEN6_SAMPLER_MESSAGE_SIMD4X2_SAMPLE_COMPARE	0
#define GEN6_SAMPLER_MESSAGE_SIMD16_SAMPLE_COMPARE	2
#define GEN6_SAMPLER_MESSAGE_SIMD4X2_RESINFO		2
#define GEN6_SAMPLER_MESSAGE_SIMD8_RESINFO		2
#define GEN6_SAMPLER_MESSAGE_SIMD16_RESINFO		2
#define GEN6_SAMPLER_MESSAGE_SIMD4X2_LD			3
#define GEN6_SAMPLER_MESSAGE_SIMD8_LD			3
#define GEN6_SAMPLER_MESSAGE_SIMD16_LD			3

#define GEN6_DATAPORT_OWORD_BLOCK_1_OWORDLOW	0
#define GEN6_DATAPORT_OWORD_BLOCK_1_OWORDHIGH	1
#define GEN6_DATAPORT_OWORD_BLOCK_2_OWORDS	2
#define GEN6_DATAPORT_OWORD_BLOCK_4_OWORDS	3
#define GEN6_DATAPORT_OWORD_BLOCK_8_OWORDS	4

#define GEN6_DATAPORT_OWORD_DUAL_BLOCK_1OWORD	0
#define GEN6_DATAPORT_OWORD_DUAL_BLOCK_4OWORDS	2

#define GEN6_DATAPORT_DWORD_SCATTERED_BLOCK_8DWORDS	2
#define GEN6_DATAPORT_DWORD_SCATTERED_BLOCK_16DWORDS	3

#define GEN6_DATAPORT_READ_MESSAGE_OWORD_BLOCK_READ		0
#define GEN6_DATAPORT_READ_MESSAGE_OWORD_DUAL_BLOCK_READ	1
#define GEN6_DATAPORT_READ_MESSAGE_DWORD_BLOCK_READ		2
#define GEN6_DATAPORT_READ_MESSAGE_DWORD_SCATTERED_READ		3

#define GEN6_DATAPORT_READ_TARGET_DATA_CACHE	0
#define GEN6_DATAPORT_READ_TARGET_RENDER_CACHE	1
#define GEN6_DATAPORT_READ_TARGET_SAMPLER_CACHE	2

#define GEN6_DATAPORT_RENDER_TARGET_WRITE_SIMD16_SINGLE_SOURCE		   0
#define GEN6_DATAPORT_RENDER_TARGET_WRITE_SIMD16_SINGLE_SOURCE_REPLICATED  1
#define GEN6_DATAPORT_RENDER_TARGET_WRITE_SIMD8_DUAL_SOURCE_SUBSPAN01	   2
#define GEN6_DATAPORT_RENDER_TARGET_WRITE_SIMD8_DUAL_SOURCE_SUBSPAN23	   3
#define GEN6_DATAPORT_RENDER_TARGET_WRITE_SIMD8_SINGLE_SOURCE_SUBSPAN01    4

#define GEN6_DATAPORT_WRITE_MESSAGE_OWORD_BLOCK_WRITE			0
#define GEN6_DATAPORT_WRITE_MESSAGE_OWORD_DUAL_BLOCK_WRITE		1
#define GEN6_DATAPORT_WRITE_MESSAGE_DWORD_BLOCK_WRITE			2
#define GEN6_DATAPORT_WRITE_MESSAGE_DWORD_SCATTERED_WRITE		3
#define GEN6_DATAPORT_WRITE_MESSAGE_RENDER_TARGET_WRITE			4
#define GEN6_DATAPORT_WRITE_MESSAGE_STREAMED_VERTEX_BUFFER_WRITE	5
#define GEN6_DATAPORT_WRITE_MESSAGE_FLUSH_RENDER_CACHE			7

#define GEN6_MATH_FUNCTION_INV					1
#define GEN6_MATH_FUNCTION_LOG					2
#define GEN6_MATH_FUNCTION_EXP					3
#define GEN6_MATH_FUNCTION_SQRT					4
#define GEN6_MATH_FUNCTION_RSQ					5
#define GEN6_MATH_FUNCTION_SIN					6 /* was 7 */
#define GEN6_MATH_FUNCTION_COS					7 /* was 8 */
#define GEN6_MATH_FUNCTION_SINCOS				8 /* was 6 */
#define GEN6_MATH_FUNCTION_TAN					9
#define GEN6_MATH_FUNCTION_POW					10
#define GEN6_MATH_FUNCTION_INT_DIV_QUOTIENT_AND_REMAINDER	11
#define GEN6_MATH_FUNCTION_INT_DIV_QUOTIENT			12
#define GEN6_MATH_FUNCTION_INT_DIV_REMAINDER			13

#define GEN6_MATH_INTEGER_UNSIGNED	0
#define GEN6_MATH_INTEGER_SIGNED	1

#define GEN6_MATH_PRECISION_FULL	0
#define GEN6_MATH_PRECISION_PARTIAL	1

#define GEN6_MATH_SATURATE_NONE		0
#define GEN6_MATH_SATURATE_SATURATE	1

#define GEN6_MATH_DATA_VECTOR	0
#define GEN6_MATH_DATA_SCALAR	1

#define GEN6_URB_OPCODE_WRITE	0

#define GEN6_URB_SWIZZLE_NONE		0
#define GEN6_URB_SWIZZLE_INTERLEAVE	1
#define GEN6_URB_SWIZZLE_TRANSPOSE	2

#define GEN6_SCRATCH_SPACE_SIZE_1K	0
#define GEN6_SCRATCH_SPACE_SIZE_2K	1
#define GEN6_SCRATCH_SPACE_SIZE_4K	2
#define GEN6_SCRATCH_SPACE_SIZE_8K	3
#define GEN6_SCRATCH_SPACE_SIZE_16K	4
#define GEN6_SCRATCH_SPACE_SIZE_32K	5
#define GEN6_SCRATCH_SPACE_SIZE_64K	6
#define GEN6_SCRATCH_SPACE_SIZE_128K	7
#define GEN6_SCRATCH_SPACE_SIZE_256K	8
#define GEN6_SCRATCH_SPACE_SIZE_512K	9
#define GEN6_SCRATCH_SPACE_SIZE_1M	10
#define GEN6_SCRATCH_SPACE_SIZE_2M	11

#define GEN6_MOCS_GFDT		(1 << 2)
#define GEN6_MOCS_PTE		(0 << 0)
#define GEN6_MOCS_UC		(1 << 0)
#define GEN6_MOCS_LLC		(2 << 0)
#define GEN6_MOCS_LLC_MLC	(3 << 0)

/* The hardware supports two different modes for border color. The
 * default (OpenGL) mode uses floating-point color channels, while the
 * legacy mode uses 4 bytes.
 *
 * More significantly, the legacy mode respects the components of the
 * border color for channels not present in the source, (whereas the
 * default mode will ignore the border color's alpha channel and use
 * alpha==1 for an RGB source, for example).
 *
 * The legacy mode matches the semantics specified by the Render
 * extension.
 */
struct gen6_sampler_state {
   struct {
      uint32_t shadow_function:3;
      uint32_t lod_bias:11;
      uint32_t min_filter:3;
      uint32_t mag_filter:3;
      uint32_t mip_filter:2;
      uint32_t base_level:5;
      uint32_t pad:1;
      uint32_t lod_preclamp:1;
      uint32_t border_color_mode:1;
      uint32_t pad0:1;
      uint32_t disable:1;
   } ss0;

   struct {
      uint32_t r_wrap_mode:3;
      uint32_t t_wrap_mode:3;
      uint32_t s_wrap_mode:3;
      uint32_t pad:3;
      uint32_t max_lod:10;
      uint32_t min_lod:10;
   } ss1;

   struct {
      uint32_t border_color;
   } ss2;

   struct {
      uint32_t pad:19;
      uint32_t max_aniso:3;
      uint32_t chroma_key_mode:1;
      uint32_t chroma_key_index:2;
      uint32_t chroma_key_enable:1;
      uint32_t monochrome_filter_width:3;
      uint32_t monochrome_filter_height:3;
   } ss3;
};

struct gen6_blend_state {
	struct {
		uint32_t dest_blend_factor:5;
		uint32_t source_blend_factor:5;
		uint32_t pad3:1;
		uint32_t blend_func:3;
		uint32_t pad2:1;
		uint32_t ia_dest_blend_factor:5;
		uint32_t ia_source_blend_factor:5;
		uint32_t pad1:1;
		uint32_t ia_blend_func:3;
		uint32_t pad0:1;
		uint32_t ia_blend_enable:1;
		uint32_t blend_enable:1;
	} blend0;

	struct {
		uint32_t post_blend_clamp_enable:1;
		uint32_t pre_blend_clamp_enable:1;
		uint32_t clamp_range:2;
		uint32_t pad0:4;
		uint32_t x_dither_offset:2;
		uint32_t y_dither_offset:2;
		uint32_t dither_enable:1;
		uint32_t alpha_test_func:3;
		uint32_t alpha_test_enable:1;
		uint32_t pad1:1;
		uint32_t logic_op_func:4;
		uint32_t logic_op_enable:1;
		uint32_t pad2:1;
		uint32_t write_disable_b:1;
		uint32_t write_disable_g:1;
		uint32_t write_disable_r:1;
		uint32_t write_disable_a:1;
		uint32_t pad3:1;
		uint32_t alpha_to_coverage_dither:1;
		uint32_t alpha_to_one:1;
		uint32_t alpha_to_coverage:1;
	} blend1;
};

struct gen6_color_calc_state {
	struct {
		uint32_t alpha_test_format:1;
		uint32_t pad0:14;
		uint32_t round_disable:1;
		uint32_t bf_stencil_ref:8;
		uint32_t stencil_ref:8;
	} cc0;

	union {
		float alpha_ref_f;
		struct {
			uint32_t ui:8;
			uint32_t pad0:24;
		} alpha_ref_fi;
	} cc1;

	float constant_r;
	float constant_g;
	float constant_b;
	float constant_a;
};

struct gen6_depth_stencil_state {
	struct {
		uint32_t pad0:3;
		uint32_t bf_stencil_pass_depth_pass_op:3;
		uint32_t bf_stencil_pass_depth_fail_op:3;
		uint32_t bf_stencil_fail_op:3;
		uint32_t bf_stencil_func:3;
		uint32_t bf_stencil_enable:1;
		uint32_t pad1:2;
		uint32_t stencil_write_enable:1;
		uint32_t stencil_pass_depth_pass_op:3;
		uint32_t stencil_pass_depth_fail_op:3;
		uint32_t stencil_fail_op:3;
		uint32_t stencil_func:3;
		uint32_t stencil_enable:1;
	} ds0;

	struct {
		uint32_t bf_stencil_write_mask:8;
		uint32_t bf_stencil_test_mask:8;
		uint32_t stencil_write_mask:8;
		uint32_t stencil_test_mask:8;
	} ds1;

	struct {
		uint32_t pad0:26;
		uint32_t depth_write_enable:1;
		uint32_t depth_test_func:3;
		uint32_t pad1:1;
		uint32_t depth_test_enable:1;
	} ds2;
};

struct gen6_surface_state {
	struct {
		uint32_t cube_pos_z:1;
		uint32_t cube_neg_z:1;
		uint32_t cube_pos_y:1;
		uint32_t cube_neg_y:1;
		uint32_t cube_pos_x:1;
		uint32_t cube_neg_x:1;
		uint32_t pad:3;
		uint32_t render_cache_read_mode:1;
		uint32_t mipmap_layout_mode:1;
		uint32_t vert_line_stride_ofs:1;
		uint32_t vert_line_stride:1;
		uint32_t color_blend:1;
		uint32_t writedisable_blue:1;
		uint32_t writedisable_green:1;
		uint32_t writedisable_red:1;
		uint32_t writedisable_alpha:1;
		uint32_t surface_format:9;
		uint32_t data_return_format:1;
		uint32_t pad0:1;
		uint32_t surface_type:3;
	} ss0;

	struct {
		uint32_t base_addr;
	} ss1;

	struct {
		uint32_t render_target_rotation:2;
		uint32_t mip_count:4;
		uint32_t width:13;
		uint32_t height:13;
	} ss2;

	struct {
		uint32_t tile_walk:1;
		uint32_t tiled_surface:1;
		uint32_t pad:1;
		uint32_t pitch:18;
		uint32_t depth:11;
	} ss3;

	struct {
		uint32_t pad:19;
		uint32_t min_array_elt:9;
		uint32_t min_lod:4;
	} ss4;

	struct {
		uint32_t pad:16;
		uint32_t memory_object_control:4;
		uint32_t y_offset:4;
		uint32_t pad2:1;
		uint32_t x_offset:7;
	} ss5;
};

#endif
