Tizen 2.1 base
[sdk/emulator/qemu.git] / gl / mesa / src / gallium / drivers / r300 / compiler / radeon_program.h
1 /*
2  * Copyright (C) 2008 Nicolai Haehnle.
3  *
4  * All Rights Reserved.
5  *
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:
13  *
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.
17  *
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.
25  *
26  */
27
28 #ifndef __RADEON_PROGRAM_H_
29 #define __RADEON_PROGRAM_H_
30
31 #include <stdint.h>
32 #include <string.h>
33
34 #include "radeon_opcodes.h"
35 #include "radeon_code.h"
36 #include "radeon_program_constants.h"
37 #include "radeon_program_pair.h"
38
39 struct radeon_compiler;
40
41 struct rc_src_register {
42         unsigned int File:4;
43
44         /** Negative values may be used for relative addressing. */
45         signed int Index:(RC_REGISTER_INDEX_BITS+1);
46         unsigned int RelAddr:1;
47
48         unsigned int Swizzle:12;
49
50         /** Take the component-wise absolute value */
51         unsigned int Abs:1;
52
53         /** Post-Abs negation. */
54         unsigned int Negate:4;
55 };
56
57 struct rc_dst_register {
58         unsigned int File:3;
59         unsigned int Index:RC_REGISTER_INDEX_BITS;
60         unsigned int WriteMask:4;
61 };
62
63 struct rc_presub_instruction {
64         rc_presubtract_op Opcode;
65         struct rc_src_register SrcReg[2];
66 };
67
68 /**
69  * Instructions are maintained by the compiler in a doubly linked list
70  * of these structures.
71  *
72  * This instruction format is intended to be expanded for hardware-specific
73  * trickery. At different stages of compilation, a different set of
74  * instruction types may be valid.
75  */
76 struct rc_sub_instruction {
77         struct rc_src_register SrcReg[3];
78         struct rc_dst_register DstReg;
79
80         /**
81          * Opcode of this instruction, according to \ref rc_opcode enums.
82          */
83         unsigned int Opcode:8;
84
85         /**
86          * Saturate each value of the result to the range [0,1] or [-1,1],
87          * according to \ref rc_saturate_mode enums.
88          */
89         unsigned int SaturateMode:2;
90
91         /**
92          * Writing to the special register RC_SPECIAL_ALU_RESULT
93          */
94         /*@{*/
95         unsigned int WriteALUResult:2;
96         unsigned int ALUResultCompare:3;
97         /*@}*/
98
99         /**
100          * \name Extra fields for TEX, TXB, TXD, TXL, TXP instructions.
101          */
102         /*@{*/
103         /** Source texture unit. */
104         unsigned int TexSrcUnit:5;
105
106         /** Source texture target, one of the \ref rc_texture_target enums */
107         unsigned int TexSrcTarget:3;
108
109         /** True if tex instruction should do shadow comparison */
110         unsigned int TexShadow:1;
111
112         /**/
113         unsigned int TexSemWait:1;
114         unsigned int TexSemAcquire:1;
115
116         /**R500 Only.  How to swizzle the result of a TEX lookup*/
117         unsigned int TexSwizzle:12;
118         /*@}*/
119
120         /** This holds information about the presubtract operation used by
121          * this instruction. */
122         struct rc_presub_instruction PreSub;
123
124         rc_omod_op Omod;
125 };
126
127 typedef enum {
128         RC_INSTRUCTION_NORMAL = 0,
129         RC_INSTRUCTION_PAIR
130 } rc_instruction_type;
131
132 struct rc_instruction {
133         struct rc_instruction * Prev;
134         struct rc_instruction * Next;
135
136         rc_instruction_type Type;
137         union {
138                 struct rc_sub_instruction I;
139                 struct rc_pair_instruction P;
140         } U;
141
142         /**
143          * Warning: IPs are not stable. If you want to use them,
144          * you need to recompute them at the beginning of each pass
145          * using \ref rc_recompute_ips
146          */
147         unsigned int IP;
148 };
149
150 struct rc_program {
151         /**
152          * Instructions.Next points to the first instruction,
153          * Instructions.Prev points to the last instruction.
154          */
155         struct rc_instruction Instructions;
156
157         /* Long term, we should probably remove InputsRead & OutputsWritten,
158          * since updating dependent state can be fragile, and they aren't
159          * actually used very often. */
160         uint32_t InputsRead;
161         uint32_t OutputsWritten;
162         uint32_t ShadowSamplers; /**< Texture units used for shadow sampling. */
163
164         struct rc_constant_list Constants;
165 };
166
167 /**
168  * A transformation that can be passed to \ref rc_local_transform.
169  *
170  * The function will be called once for each instruction.
171  * It has to either emit the appropriate transformed code for the instruction
172  * and return true, or return false if it doesn't understand the
173  * instruction.
174  *
175  * The function gets passed the userData as last parameter.
176  */
177 struct radeon_program_transformation {
178         int (*function)(
179                 struct radeon_compiler*,
180                 struct rc_instruction*,
181                 void*);
182         void *userData;
183 };
184
185 void rc_local_transform(
186         struct radeon_compiler *c,
187         void *user);
188
189 void rc_get_used_temporaries(
190         struct radeon_compiler * c,
191         unsigned char * used,
192         unsigned int used_length);
193
194 int rc_find_free_temporary_list(
195         struct radeon_compiler * c,
196         unsigned char * used,
197         unsigned int used_length,
198         unsigned int mask);
199
200 unsigned int rc_find_free_temporary(struct radeon_compiler * c);
201
202 struct rc_instruction *rc_alloc_instruction(struct radeon_compiler * c);
203 struct rc_instruction *rc_insert_new_instruction(struct radeon_compiler * c, struct rc_instruction * after);
204 void rc_insert_instruction(struct rc_instruction * after, struct rc_instruction * inst);
205 void rc_remove_instruction(struct rc_instruction * inst);
206
207 unsigned int rc_recompute_ips(struct radeon_compiler * c);
208
209 void rc_print_program(const struct rc_program *prog);
210
211 rc_swizzle rc_mask_to_swizzle(unsigned int mask);
212 #endif