1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright 2009 Nicolai Hähnle <nhaehnle@gmail.com>
3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a
5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the "Software"),
6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to deal in the Software without restriction, including without limitation
7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * on the rights to use, copy, modify, merge, publish, distribute, sub
8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * license, and/or sell copies of the Software, and to permit persons to whom
9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the Software is furnished to do so, subject to the following conditions:
10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice (including the next
12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * paragraph) shall be included in all copies or substantial portions of the
13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Software.
14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * USE OR OTHER DEALINGS IN THE SOFTWARE. */
22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifndef RADEON_CODE_H
24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define RADEON_CODE_H
25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <stdint.h>
27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define R300_PFS_MAX_ALU_INST     64
29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define R300_PFS_MAX_TEX_INST     32
30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define R300_PFS_MAX_TEX_INDIRECT 4
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define R300_PFS_NUM_TEMP_REGS    32
32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define R300_PFS_NUM_CONST_REGS   32
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define R400_PFS_MAX_ALU_INST     512
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define R400_PFS_MAX_TEX_INST     512
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define R500_PFS_MAX_INST         512
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define R500_PFS_NUM_TEMP_REGS    128
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define R500_PFS_NUM_CONST_REGS   256
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define R500_PFS_MAX_BRANCH_DEPTH_FULL 32
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define R500_PFS_MAX_BRANCH_DEPTH_PARTIAL 4
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* The r500 maximum depth is not just for loops, but any combination of loops
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and subroutine jumps. */
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define R500_PVS_MAX_LOOP_DEPTH 8
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define STATE_R300_WINDOW_DIMENSION (STATE_INTERNAL_DRIVER+0)
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgenum {
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/**
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 * External constants are constants whose meaning is unknown to this
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 * compiler. For example, a Mesa gl_program's constants are turned
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 * into external constants.
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 */
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	RC_CONSTANT_EXTERNAL = 0,
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	RC_CONSTANT_IMMEDIATE,
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/**
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 * Constant referring to state that is known by this compiler,
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 * see RC_STATE_xxx, i.e. *not* arbitrary Mesa (or other) state.
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 */
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	RC_CONSTANT_STATE
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgenum {
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	RC_STATE_SHADOW_AMBIENT = 0,
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	RC_STATE_R300_WINDOW_DIMENSION,
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	RC_STATE_R300_TEXRECT_FACTOR,
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	RC_STATE_R300_TEXSCALE_FACTOR,
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	RC_STATE_R300_VIEWPORT_SCALE,
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	RC_STATE_R300_VIEWPORT_OFFSET
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct rc_constant {
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned Type:2; /**< RC_CONSTANT_xxx */
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned Size:3;
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	union {
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		unsigned External;
82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		float Immediate[4];
83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		unsigned State[2];
84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	} u;
85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct rc_constant_list {
88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct rc_constant * Constants;
89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned Count;
90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned _Reserved;
92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid rc_constants_init(struct rc_constant_list * c);
95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid rc_constants_copy(struct rc_constant_list * dst, struct rc_constant_list * src);
96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid rc_constants_destroy(struct rc_constant_list * c);
97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgunsigned rc_constants_add(struct rc_constant_list * c, struct rc_constant * constant);
98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgunsigned rc_constants_add_state(struct rc_constant_list * c, unsigned state1, unsigned state2);
99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgunsigned rc_constants_add_immediate_vec4(struct rc_constant_list * c, const float * data);
100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgunsigned rc_constants_add_immediate_scalar(struct rc_constant_list * c, float data, unsigned * swizzle);
101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid rc_constants_print(struct rc_constant_list * c);
102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Compare functions.
105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \note By design, RC_COMPARE_FUNC_xxx + GL_NEVER gives you
107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the correct GL compare function.
108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtypedef enum {
110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	RC_COMPARE_FUNC_NEVER = 0,
111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	RC_COMPARE_FUNC_LESS,
112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	RC_COMPARE_FUNC_EQUAL,
113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	RC_COMPARE_FUNC_LEQUAL,
114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	RC_COMPARE_FUNC_GREATER,
115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	RC_COMPARE_FUNC_NOTEQUAL,
116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	RC_COMPARE_FUNC_GEQUAL,
117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	RC_COMPARE_FUNC_ALWAYS
118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} rc_compare_func;
119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Coordinate wrapping modes.
122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * These are not quite the same as their GL counterparts yet.
124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtypedef enum {
126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	RC_WRAP_NONE = 0,
127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	RC_WRAP_REPEAT,
128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	RC_WRAP_MIRRORED_REPEAT,
129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	RC_WRAP_MIRRORED_CLAMP
130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} rc_wrap_mode;
131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Stores state that influences the compilation of a fragment program.
134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct r300_fragment_program_external_state {
136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct {
137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		/**
138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		 * This field contains swizzle for some lowering passes
139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		 * (shadow comparison, unorm->snorm conversion)
140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		 */
141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		unsigned texture_swizzle:12;
142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		/**
144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		 * If the sampler is used as a shadow sampler,
145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		 * this field specifies the compare function.
146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		 *
147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		 * Otherwise, this field is \ref RC_COMPARE_FUNC_NEVER (aka 0).
148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		 * \sa rc_compare_func
149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		 */
150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		unsigned texture_compare_func : 3;
151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		/**
153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		 * No matter what the sampler type is,
154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		 * this field turns it into a shadow sampler.
155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		 */
156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		unsigned compare_mode_enabled : 1;
157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		/**
159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		 * If the sampler will receive non-normalized coords,
160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		 * this field is set. The scaling factor is given by
161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		 * RC_STATE_R300_TEXRECT_FACTOR.
162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		 */
163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		unsigned non_normalized_coords : 1;
164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		/**
166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		 * This field specifies wrapping modes for the sampler.
167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		 *
168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		 * If this field is \ref RC_WRAP_NONE (aka 0), no wrapping maths
169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		 * will be performed on the coordinates.
170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		 */
171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		unsigned wrap_mode : 3;
172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		/**
174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		 * The coords are scaled after applying the wrap mode emulation
175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		 * and right before texture fetch. The scaling factor is given by
176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		 * RC_STATE_R300_TEXSCALE_FACTOR. */
177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		unsigned clamp_and_scale_before_fetch : 1;
178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		/**
180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		 * Fetch RGTC1_SNORM or LATC1_SNORM as UNORM and convert UNORM -> SNORM
181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		 * in the shader.
182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		 */
183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		unsigned convert_unorm_to_snorm:1;
184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	} unit[16];
185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct r300_fragment_program_node {
190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int tex_offset; /**< first tex instruction */
191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int tex_end; /**< last tex instruction, relative to tex_offset */
192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int alu_offset; /**< first ALU instruction */
193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int alu_end; /**< last ALU instruction, relative to alu_offset */
194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int flags;
195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Stores an R300 fragment program in its compiled-to-hardware form.
199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct r300_fragment_program_code {
201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct {
202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		unsigned int length; /**< total # of texture instructions used */
203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		uint32_t inst[R400_PFS_MAX_TEX_INST];
204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	} tex;
205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct {
207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		unsigned int length; /**< total # of ALU instructions used */
208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		struct {
209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			uint32_t rgb_inst;
210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			uint32_t rgb_addr;
211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			uint32_t alpha_inst;
212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			uint32_t alpha_addr;
213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			uint32_t r400_ext_addr;
214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		} inst[R400_PFS_MAX_ALU_INST];
215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	} alu;
216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	uint32_t config; /* US_CONFIG */
218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	uint32_t pixsize; /* US_PIXSIZE */
219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	uint32_t code_offset; /* US_CODE_OFFSET */
220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	uint32_t r400_code_offset_ext; /* US_CODE_EXT */
221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	uint32_t code_addr[4]; /* US_CODE_ADDR */
222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/*US_CODE_BANK.R390_MODE: Enables 512 instructions and 64 temporaries
223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 * for r400 cards */
224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned int r390_mode:1;
225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct r500_fragment_program_code {
229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct {
230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		uint32_t inst0;
231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		uint32_t inst1;
232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		uint32_t inst2;
233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		uint32_t inst3;
234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		uint32_t inst4;
235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		uint32_t inst5;
236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	} inst[R500_PFS_MAX_INST];
237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int inst_end; /* Number of instructions - 1; also, last instruction to be executed */
239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int max_temp_idx;
241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	uint32_t us_fc_ctrl;
243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	uint32_t int_constants[32];
245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	uint32_t int_constant_count;
246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct rX00_fragment_program_code {
249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	union {
250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		struct r300_fragment_program_code r300;
251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		struct r500_fragment_program_code r500;
252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	} code;
253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned writes_depth:1;
255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct rc_constant_list constants;
257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned *constants_remap_table;
258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define R300_VS_MAX_ALU		256
262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define R300_VS_MAX_ALU_DWORDS  (R300_VS_MAX_ALU * 4)
263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define R500_VS_MAX_ALU	        1024
264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define R500_VS_MAX_ALU_DWORDS  (R500_VS_MAX_ALU * 4)
265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define R300_VS_MAX_TEMPS	32
266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* This is the max for all chipsets (r300-r500) */
267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define R300_VS_MAX_FC_OPS 16
268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define R300_VS_MAX_LOOP_DEPTH 1
269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define VSF_MAX_INPUTS 32
271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define VSF_MAX_OUTPUTS 32
272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct r300_vertex_program_code {
274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int length;
275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	union {
276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		uint32_t d[R500_VS_MAX_ALU_DWORDS];
277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		float f[R500_VS_MAX_ALU_DWORDS];
278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	} body;
279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int pos_end;
281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int num_temporaries;	/* Number of temp vars used by program */
282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int inputs[VSF_MAX_INPUTS];
283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int outputs[VSF_MAX_OUTPUTS];
284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	struct rc_constant_list constants;
286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned *constants_remap_table;
287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	uint32_t InputsRead;
289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	uint32_t OutputsWritten;
290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned int num_fc_ops;
292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	uint32_t fc_ops;
293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	union {
294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	        uint32_t r300[R300_VS_MAX_FC_OPS];
295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		struct {
296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			uint32_t lw;
297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			uint32_t uw;
298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		} r500[R300_VS_MAX_FC_OPS];
299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	} fc_op_addrs;
300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int32_t fc_loop_index[R300_VS_MAX_FC_OPS];
301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif /* RADEON_CODE_H */
304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
305