2 * Copyright 2010 Jerome Glisse <glisse@freedesktop.org>
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * on the rights to use, copy, modify, merge, publish, distribute, sub
8 * license, and/or sell copies of the Software, and to permit persons to whom
9 * the Software is furnished to do so, subject to the following conditions:
11 * The above copyright notice and this permission notice (including the next
12 * paragraph) shall be included in all copies or substantial portions of the
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
18 * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
19 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
20 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
21 * USE OR OTHER DEALINGS IN THE SOFTWARE.
26 #include "r600_compiler.h"
31 struct r600_shader_operand
{
32 struct c_vector
*vector
;
39 struct r600_shader_vfetch
{
40 struct r600_shader_vfetch
*next
;
41 struct r600_shader_vfetch
*prev
;
43 struct r600_shader_operand src
[2];
44 struct r600_shader_operand dst
[4];
47 struct r600_shader_inst
{
51 struct r600_shader_operand src
[3];
52 struct r600_shader_operand dst
;
56 struct r600_shader_alu
{
57 struct r600_shader_alu
*next
;
58 struct r600_shader_alu
*prev
;
62 struct r600_shader_inst alu
[5];
66 struct r600_shader_node
{
67 struct r600_shader_node
*next
;
68 struct r600_shader_node
*prev
;
69 unsigned cf_id
; /**< cf index (in dw) in byte code */
70 unsigned cf_addr
; /**< instructions index (in dw) in byte code */
71 unsigned nslot
; /**< number of slot (2 dw) needed by this node */
73 struct c_node
*node
; /**< compiler node from which this node originate */
74 struct r600_shader_vfetch vfetch
; /**< list of vfetch instructions */
75 struct r600_shader_alu alu
; /**< list of alu instructions */
78 struct r600_shader_io
{
85 unsigned stack_size
; /**< stack size needed by this shader */
86 unsigned ngpr
; /**< number of GPR needed by this shader */
87 unsigned nconstant
; /**< number of constants used by this shader */
88 unsigned nresource
; /**< number of resources used by this shader */
92 unsigned ncf
; /**< total number of cf clauses */
93 unsigned nslot
; /**< total number of slots (2 dw) */
94 unsigned flat_shade
; /**< are we flat shading */
95 struct r600_shader_node nodes
; /**< list of node */
96 struct r600_shader_io input
[32];
97 struct r600_shader_io output
[32];
98 /* TODO replace GPR by some better register allocator */
99 struct c_vector
**gpr
;
100 unsigned ndw
; /**< bytes code size in dw */
101 u32
*bcode
; /**< bytes code */
102 enum pipe_format resource_format
[160]; /**< format of resource */
103 struct c_shader cshader
;
106 void r600_shader_cleanup(struct r600_shader
*rshader
);
107 int r600_shader_register(struct r600_shader
*rshader
);
108 int r600_shader_node(struct r600_shader
*shader
);
109 void r600_shader_node_place(struct r600_shader
*rshader
);
110 int r600_shader_find_gpr(struct r600_shader
*rshader
, struct c_vector
*v
, unsigned swizzle
,
111 struct r600_shader_operand
*operand
);
112 int r600_shader_vfetch_bytecode(struct r600_shader
*rshader
,
113 struct r600_shader_node
*rnode
,
114 struct r600_shader_vfetch
*vfetch
,
116 int r600_shader_update(struct r600_shader
*rshader
,
117 enum pipe_format
*resource_format
);
118 int r600_shader_legalize(struct r600_shader
*rshader
);
120 int r700_shader_translate(struct r600_shader
*rshader
);
122 int c_shader_from_tgsi(struct c_shader
*shader
, unsigned type
,
123 const struct tgsi_token
*tokens
);
124 int r600_shader_register(struct r600_shader
*rshader
);
125 int r600_shader_translate_rec(struct r600_shader
*rshader
, struct c_node
*node
);
126 int r700_shader_translate(struct r600_shader
*rshader
);
127 int r600_shader_insert_fetch(struct c_shader
*shader
);
129 enum r600_instruction
{
142 INST_SETGT_DX10
= 12,
143 INST_SETGE_DX10
= 13,
144 INST_SETNE_DX10
= 14,
151 INST_MOVA_FLOOR
= 21,
155 INST_PRED_SETGT_UINT
= 25,
156 INST_PRED_SETGE_UINT
= 26,
158 INST_PRED_SETGT
= 28,
159 INST_PRED_SETGE
= 29,
160 INST_PRED_SETNE
= 30,
161 INST_PRED_SET_INV
= 31,
162 INST_PRED_SET_POP
= 32,
163 INST_PRED_SET_CLR
= 33,
164 INST_PRED_SET_RESTORE
= 34,
165 INST_PRED_SETE_PUSH
= 35,
166 INST_PRED_SETGT_PUSH
= 36,
167 INST_PRED_SETGE_PUSH
= 37,
168 INST_PRED_SETNE_PUSH
= 38,
187 INST_SETGT_UINT
= 57,
188 INST_SETGE_UINT
= 58,
189 INST_KILLGT_UINT
= 59,
190 INST_KILLGE_UINT
= 60,
191 INST_PRED_SETE_INT
= 61,
192 INST_PRED_SETGT_INT
= 62,
193 INST_PRED_SETGE_INT
= 63,
194 INST_PRED_SETNE_INT
= 64,
196 INST_KILLGT_INT
= 66,
197 INST_KILLGE_INT
= 67,
198 INST_KILLNE_INT
= 68,
199 INST_PRED_SETE_PUSH_INT
= 69,
200 INST_PRED_SETGT_PUSH_INT
= 70,
201 INST_PRED_SETGE_PUSH_INT
= 71,
202 INST_PRED_SETNE_PUSH_INT
= 72,
203 INST_PRED_SETLT_PUSH_INT
= 73,
204 INST_PRED_SETLE_PUSH_INT
= 74,
209 INST_MOVA_GPR_INT
= 79,
211 INST_LOG_CLAMPED
= 81,
213 INST_RECIP_CLAMPED
= 83,
215 INST_RECIP_IEEE
= 85,
216 INST_RECIPSQRT_CLAMPED
= 86,
217 INST_RECIPSQRT_FF
= 87,
218 INST_RECIPSQRT_IEEE
= 88,
220 INST_FLT_TO_INT
= 90,
221 INST_INT_TO_FLT
= 91,
222 INST_UINT_TO_FLT
= 92,
230 INST_MULLO_UINT
= 100,
231 INST_MULHI_UINT
= 101,
232 INST_RECIP_INT
= 102,
233 INST_RECIP_UINT
= 103,
234 INST_FLT_TO_UINT
= 104,
236 INST_MUL_LIT_M2
= 106,
237 INST_MUL_LIT_M4
= 107,
238 INST_MUL_LIT_D2
= 108,
240 INST_MULADD_M2
= 110,
241 INST_MULADD_M4
= 111,
242 INST_MULADD_D2
= 112,
243 INST_MULADD_IEEE
= 113,
244 INST_MULADD_IEEE_M2
= 114,
245 INST_MULADD_IEEE_M4
= 115,
246 INST_MULADD_IEEE_D2
= 116,
251 INST_CNDGT_INT
= 121,
252 INST_CNDGE_INT
= 122,
256 struct r600_instruction_info
{
257 enum r600_instruction instruction
;