2 * Copyright (C) 2008 Nicolai Haehnle.
6 * Permission is hereby granted, free of charge, to any person obtaining
7 * a copy of this software and associated documentation files (the
8 * "Software"), to deal in the Software without restriction, including
9 * without limitation the rights to use, copy, modify, merge, publish,
10 * distribute, sublicense, and/or sell copies of the Software, and to
11 * permit persons to whom the Software is furnished to do so, subject to
12 * the following conditions:
14 * The above copyright notice and this permission notice (including the
15 * next paragraph) shall be included in all copies or substantial
16 * portions of the Software.
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
19 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
21 * IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
22 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
23 * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
24 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
28 #ifndef __RADEON_PROGRAM_H_
29 #define __RADEON_PROGRAM_H_
34 #include "radeon_opcodes.h"
35 #include "radeon_code.h"
36 #include "radeon_program_constants.h"
37 #include "radeon_program_pair.h"
39 struct radeon_compiler
;
41 struct rc_src_register
{
44 /** Negative values may be used for relative addressing. */
45 signed int Index
:(RC_REGISTER_INDEX_BITS
+1);
46 unsigned int RelAddr
:1;
48 unsigned int Swizzle
:12;
50 /** Take the component-wise absolute value */
53 /** Post-Abs negation. */
54 unsigned int Negate
:4;
57 struct rc_dst_register
{
59 unsigned int Index
:RC_REGISTER_INDEX_BITS
;
60 unsigned int WriteMask
:4;
64 struct rc_presub_instruction
{
65 rc_presubtract_op Opcode
;
66 struct rc_src_register SrcReg
[2];
70 * Instructions are maintained by the compiler in a doubly linked list
71 * of these structures.
73 * This instruction format is intended to be expanded for hardware-specific
74 * trickery. At different stages of compilation, a different set of
75 * instruction types may be valid.
77 struct rc_sub_instruction
{
78 struct rc_src_register SrcReg
[3];
79 struct rc_dst_register DstReg
;
82 * Opcode of this instruction, according to \ref rc_opcode enums.
84 unsigned int Opcode
:8;
87 * Saturate each value of the result to the range [0,1] or [-1,1],
88 * according to \ref rc_saturate_mode enums.
90 unsigned int SaturateMode
:2;
93 * Writing to the special register RC_SPECIAL_ALU_RESULT
96 unsigned int WriteALUResult
:2;
97 unsigned int ALUResultCompare
:3;
101 * \name Extra fields for TEX, TXB, TXD, TXL, TXP instructions.
104 /** Source texture unit. */
105 unsigned int TexSrcUnit
:5;
107 /** Source texture target, one of the \ref rc_texture_target enums */
108 unsigned int TexSrcTarget
:3;
110 /** True if tex instruction should do shadow comparison */
111 unsigned int TexShadow
:1;
114 unsigned int TexSemWait
:1;
115 unsigned int TexSemAcquire
:1;
117 /**R500 Only. How to swizzle the result of a TEX lookup*/
118 unsigned int TexSwizzle
:12;
121 /** This holds information about the presubtract operation used by
122 * this instruction. */
123 struct rc_presub_instruction PreSub
;
129 RC_INSTRUCTION_NORMAL
= 0,
131 } rc_instruction_type
;
133 struct rc_instruction
{
134 struct rc_instruction
* Prev
;
135 struct rc_instruction
* Next
;
137 rc_instruction_type Type
;
139 struct rc_sub_instruction I
;
140 struct rc_pair_instruction P
;
144 * Warning: IPs are not stable. If you want to use them,
145 * you need to recompute them at the beginning of each pass
146 * using \ref rc_recompute_ips
153 * Instructions.Next points to the first instruction,
154 * Instructions.Prev points to the last instruction.
156 struct rc_instruction Instructions
;
158 /* Long term, we should probably remove InputsRead & OutputsWritten,
159 * since updating dependent state can be fragile, and they aren't
160 * actually used very often. */
162 uint32_t OutputsWritten
;
163 uint32_t ShadowSamplers
; /**< Texture units used for shadow sampling. */
165 struct rc_constant_list Constants
;
169 * A transformation that can be passed to \ref rc_local_transform.
171 * The function will be called once for each instruction.
172 * It has to either emit the appropriate transformed code for the instruction
173 * and return true, or return false if it doesn't understand the
176 * The function gets passed the userData as last parameter.
178 struct radeon_program_transformation
{
180 struct radeon_compiler
*,
181 struct rc_instruction
*,
186 void rc_local_transform(
187 struct radeon_compiler
*c
,
190 void rc_get_used_temporaries(
191 struct radeon_compiler
* c
,
192 unsigned char * used
,
193 unsigned int used_length
);
195 int rc_find_free_temporary_list(
196 struct radeon_compiler
* c
,
197 unsigned char * used
,
198 unsigned int used_length
,
201 unsigned int rc_find_free_temporary(struct radeon_compiler
* c
);
203 struct rc_instruction
*rc_alloc_instruction(struct radeon_compiler
* c
);
204 struct rc_instruction
*rc_insert_new_instruction(struct radeon_compiler
* c
, struct rc_instruction
* after
);
205 void rc_insert_instruction(struct rc_instruction
* after
, struct rc_instruction
* inst
);
206 void rc_remove_instruction(struct rc_instruction
* inst
);
208 unsigned int rc_recompute_ips(struct radeon_compiler
* c
);
210 void rc_print_program(const struct rc_program
*prog
);
212 rc_swizzle
rc_mask_to_swizzle(unsigned int mask
);