#ifndef __R300_FIXED_PIPELINES_H__
#define __R300_FIXED_PIPELINES_H__

/******** Flat color pipeline **********/
static struct r300_vertex_shader_state FLAT_COLOR_VERTEX_SHADER={
		program: {
			length: 20,

			body:{ d: {
			        EASY_VSF_OP(MUL, 0, ALL, TMP),
			        VSF_PARAM(3),
			        VSF_ATTR_W(0),
			        EASY_VSF_SOURCE(0, W, W, W, W, NONE, NONE),

			        EASY_VSF_OP(MUL, 1, ALL, RESULT),
			        VSF_REG(1),
				VSF_ATTR_UNITY(1),
				VSF_UNITY(1),

				EASY_VSF_OP(MAD, 0, ALL, TMP),
				VSF_PARAM(2),
				VSF_ATTR_Z(0),
				VSF_TMP(0),

				EASY_VSF_OP(MAD, 0, ALL, TMP),
				VSF_PARAM(1),
				VSF_ATTR_Y(0),
				VSF_TMP(0),

				EASY_VSF_OP(MAD, 0, ALL, RESULT),
				VSF_PARAM(0),
				VSF_ATTR_X(0),
				VSF_TMP(0),
				} }
			},

		matrix:{
			 {
			length: 16,
			body: { f: {
				2.0,
				0,
				0.0,
				0.0,
				0,
				2.5,
				0,
				0,
				0.0,
				0,
				-1.00,
				-1.0,
				-3.0,
				0,
				6.0,
				6.0
				} }
			 },
			{
			length: 0,
			},
			{
			length: 0,
			}
			},

		vector: {
			{
			length: 0,
			},
			{
			length: 0,
			}
			},

		unknown1: {
			length: 0
			},

		unknown2: {
			length: 0
			},

		program_start: 0,
		unknown_ptr1: 4,
		program_end: 4,

		param_offset: 0,
		param_count: 4,

		unknown_ptr2: 0,
		unknown_ptr3: 4
		};

static struct r300_pixel_shader_state FLAT_COLOR_PIXEL_SHADER={
		program: {
			tex: {
				length: 0
				},
			alu: {
				length: 1,
					/* My understanding is that we need at least 1 instructions for pixel shader,
					   in particular because alu_end==0 means there is one instruction */
				inst: {
					PFS_NOP
					}
				},
			node: {
				{ 0, 0, 0, 0},
				{ 0, 0, 0, 0},
				{ 0, 0, 0, 0},
				{ 0, 0, 0, 0}
				},
			active_nodes: 1,
			first_node_has_tex: 0,
			temp_register_count: 0,

			tex_offset: 0,
			tex_end: 0,
			alu_offset: 0,
			alu_end: 0
			},

		param_length: 0
		};


/******** Single texture pipeline ***********/
static struct r300_vertex_shader_state SINGLE_TEXTURE_VERTEX_SHADER={
		program: {
			length: 24,

			body: { d: {
				EASY_VSF_OP(MUL, 0, ALL, TMP),
				VSF_PARAM(3),
				VSF_ATTR_W(0),
				EASY_VSF_SOURCE(0, W, W, W, W, NONE, NONE),

				EASY_VSF_OP(MUL, 2, ALL, RESULT),
				VSF_REG(2),
				VSF_ATTR_UNITY(2),
				VSF_UNITY(2),

				EASY_VSF_OP(MAD, 0, ALL, TMP),
				VSF_PARAM(2),
				VSF_ATTR_Z(0),
				VSF_TMP(0),

				EASY_VSF_OP(MUL, 1, ALL, RESULT),
				VSF_REG(1),
				VSF_ATTR_UNITY(1),
				VSF_UNITY(1),

				EASY_VSF_OP(MAD, 0, ALL, TMP),
				VSF_PARAM(1),
				VSF_ATTR_Y(0),
				VSF_TMP(0),

				EASY_VSF_OP(MAD, 0, ALL, RESULT),
				VSF_PARAM(0),
				VSF_ATTR_X(0),
				VSF_TMP(0),
				} }
			},

		matrix:{
			 {
			length: 16,
			body: { f: {
				2.0,
				0,
				0.0,
				0.0,
				0,
				2.5,
				0,
				0,
				0.0,
				0,
				-1.00,
				-1.0,
				-3.0,
				0,
				6.0,
				6.0
				} }
			 },
			{
			length: 0,
			},
			{
			length: 0,
			}
			},

		vector: {
			{
			length: 0,
			},
			{
			length: 0,
			}
			},

		unknown1: {
			length: 0
			},

		unknown2: {
			length: 4,
			body: { f: {
				0.0,
				0.0,
				1.0,
				0.0
				} }
			},

		program_start: 0,
		unknown_ptr1: 5,
		program_end: 5,

		param_offset: 0,
		param_count: 4,

		unknown_ptr2: 0,
		unknown_ptr3: 5
		};

static struct r300_pixel_shader_state SINGLE_TEXTURE_PIXEL_SHADER={
		program: {
			tex: {
				length: 1,
				inst: { 0x00018000 }
				},
			alu: {
				length: 2,
				inst:
					{
/* I get misc problems without this after doing cold-reboot.
   This would imply that alu programming is buggy. --aet */
#if 1
					PFS_NOP,
#endif

					/* What are 0's ORed with flags ? They are register numbers that
					   just happen to be 0 */
					{
					EASY_PFS_INSTR0(MAD, SRC0C_XYZ, SRC1C_XYZ, ZERO),
					EASY_PFS_INSTR1(0, 0, 1, 0 | PFS_FLAG_CONST, NONE, ALL),

#if 0
					/* no alpha in textures */
					EASY_PFS_INSTR2(MAD, SRC0A, ONE, ZERO),
					EASY_PFS_INSTR3(0, 1, 0 | PFS_FLAG_CONST, 0 | PFS_FLAG_CONST, OUTPUT)
#endif

					/* alpha in textures */
					EASY_PFS_INSTR2(MAD, SRC0A, SRC1A, ZERO),
					EASY_PFS_INSTR3(0, 0, 1, 0 | PFS_FLAG_CONST, OUTPUT)
					}
					}
				},
			node: {
				{ 0, 0, 0, 0},
				{ 0, 0, 0, 0},
				{ 0, 0, 0, 0},
				{ 0, 0, 0, 0}
				},

			active_nodes: 1,
			first_node_has_tex: 1,
			temp_register_count: 1,

			tex_offset: 0,
			tex_end: 0,
			alu_offset: 0,
			alu_end: 0
			},

		param_length: 8,
		param: {
			{ 0.0, 0.0, 0.0, 0.0},
			{ 0.0, 0.0, 0.0, 0.0},
			{ 0.0, 0.0, 0.0, 0.0},
			{ 0.0, 0.0, 0.0, 0.0},
			{ 0.0, 0.0, 0.0, 0.0},
			{ 0.0, 0.0, 0.0, 0.0},
			{ 0.0, 0.0, 0.0, 0.0},
			{ 0.0, 0.0, 0.0, 0.0}
			}
		};

#endif