1 #include "main/macros.h"
2 #include "shader/prog_parameter.h"
3 #include "brw_context.h"
7 /* Only guess, need a flag in gl_fragment_program later */
8 GLboolean
brw_wm_is_glsl(const struct gl_fragment_program
*fp
)
11 for (i
= 0; i
< fp
->Base
.NumInstructions
; i
++) {
12 struct prog_instruction
*inst
= &fp
->Base
.Instructions
[i
];
13 switch (inst
->Opcode
) {
31 static void set_reg(struct brw_wm_compile
*c
, int file
, int index
,
32 int component
, struct brw_reg reg
)
34 c
->wm_regs
[file
][index
][component
].reg
= reg
;
35 c
->wm_regs
[file
][index
][component
].inited
= GL_TRUE
;
38 static int get_scalar_dst_index(struct prog_instruction
*inst
)
41 for (i
= 0; i
< 4; i
++)
42 if (inst
->DstReg
.WriteMask
& (1<<i
))
47 static struct brw_reg
alloc_tmp(struct brw_wm_compile
*c
)
50 if(c
->tmp_index
== c
->tmp_max
)
51 c
->tmp_regs
[ c
->tmp_max
++ ] = c
->reg_index
++;
53 reg
= brw_vec8_grf(c
->tmp_regs
[ c
->tmp_index
++ ], 0);
57 static void release_tmps(struct brw_wm_compile
*c
)
63 get_reg(struct brw_wm_compile
*c
, int file
, int index
, int component
, int nr
, GLuint neg
, GLuint abs
)
67 case PROGRAM_STATE_VAR
:
68 case PROGRAM_CONSTANT
:
70 file
= PROGRAM_STATE_VAR
;
72 case PROGRAM_UNDEFINED
:
73 return brw_null_reg();
78 if(c
->wm_regs
[file
][index
][component
].inited
)
79 reg
= c
->wm_regs
[file
][index
][component
].reg
;
81 reg
= brw_vec8_grf(c
->reg_index
, 0);
83 if(!c
->wm_regs
[file
][index
][component
].inited
) {
84 set_reg(c
, file
, index
, component
, reg
);
88 if (neg
& (1<< component
)) {
96 static void prealloc_reg(struct brw_wm_compile
*c
)
100 int nr_interp_regs
= 0;
101 GLuint inputs
= FRAG_BIT_WPOS
| c
->fp_interp_emitted
| c
->fp_deriv_emitted
;
103 for (i
= 0; i
< 4; i
++) {
104 reg
= (i
< c
->key
.nr_depth_regs
)
105 ? brw_vec8_grf(i
*2, 0) : brw_vec8_grf(0, 0);
106 set_reg(c
, PROGRAM_PAYLOAD
, PAYLOAD_DEPTH
, i
, reg
);
108 c
->reg_index
+= 2*c
->key
.nr_depth_regs
;
110 int nr_params
= c
->fp
->program
.Base
.Parameters
->NumParameters
;
111 struct gl_program_parameter_list
*plist
=
112 c
->fp
->program
.Base
.Parameters
;
114 c
->prog_data
.nr_params
= 4*nr_params
;
115 for (i
= 0; i
< nr_params
; i
++) {
116 for (j
= 0; j
< 4; j
++, index
++) {
117 reg
= brw_vec1_grf(c
->reg_index
+ index
/8,
119 c
->prog_data
.param
[index
] =
120 &plist
->ParameterValues
[i
][j
];
121 set_reg(c
, PROGRAM_STATE_VAR
, i
, j
, reg
);
124 c
->nr_creg
= 2*((4*nr_params
+15)/16);
125 c
->reg_index
+= c
->nr_creg
;
127 for (i
= 0; i
< FRAG_ATTRIB_MAX
; i
++) {
128 if (inputs
& (1<<i
)) {
130 reg
= brw_vec8_grf(c
->reg_index
, 0);
131 for (j
= 0; j
< 4; j
++)
132 set_reg(c
, PROGRAM_PAYLOAD
, i
, j
, reg
);
137 c
->prog_data
.first_curbe_grf
= c
->key
.nr_depth_regs
* 2;
138 c
->prog_data
.urb_read_length
= nr_interp_regs
* 2;
139 c
->prog_data
.curb_read_length
= c
->nr_creg
;
140 c
->emit_mask_reg
= brw_uw1_reg(BRW_GENERAL_REGISTER_FILE
, c
->reg_index
, 0);
142 c
->stack
= brw_uw16_reg(BRW_GENERAL_REGISTER_FILE
, c
->reg_index
, 0);
146 static struct brw_reg
get_dst_reg(struct brw_wm_compile
*c
,
147 struct prog_instruction
*inst
, int component
, int nr
)
149 return get_reg(c
, inst
->DstReg
.File
, inst
->DstReg
.Index
, component
, nr
,
153 static struct brw_reg
get_src_reg(struct brw_wm_compile
*c
,
154 struct prog_src_register
*src
, int index
, int nr
)
156 int component
= GET_SWZ(src
->Swizzle
, index
);
157 return get_reg(c
, src
->File
, src
->Index
, component
, nr
,
158 src
->NegateBase
, src
->Abs
);
161 static void emit_abs( struct brw_wm_compile
*c
,
162 struct prog_instruction
*inst
)
165 struct brw_compile
*p
= &c
->func
;
166 brw_set_saturate(p
, inst
->SaturateMode
!= SATURATE_OFF
);
167 for (i
= 0; i
< 4; i
++) {
168 if (inst
->DstReg
.WriteMask
& (1<<i
)) {
169 struct brw_reg src
, dst
;
170 dst
= get_dst_reg(c
, inst
, i
, 1);
171 src
= get_src_reg(c
, &inst
->SrcReg
[0], i
, 1);
172 brw_MOV(p
, dst
, brw_abs(src
));
175 brw_set_saturate(p
, 0);
178 static void emit_int( struct brw_wm_compile
*c
,
179 struct prog_instruction
*inst
)
182 struct brw_compile
*p
= &c
->func
;
183 GLuint mask
= inst
->DstReg
.WriteMask
;
184 brw_set_saturate(p
, inst
->SaturateMode
!= SATURATE_OFF
);
185 for (i
= 0; i
< 4; i
++) {
187 struct brw_reg src
, dst
;
188 dst
= get_dst_reg(c
, inst
, i
, 1) ;
189 src
= get_src_reg(c
, &inst
->SrcReg
[0], i
, 1);
190 brw_RNDD(p
, dst
, src
);
193 brw_set_saturate(p
, 0);
196 static void emit_mov( struct brw_wm_compile
*c
,
197 struct prog_instruction
*inst
)
200 struct brw_compile
*p
= &c
->func
;
201 GLuint mask
= inst
->DstReg
.WriteMask
;
202 brw_set_saturate(p
, inst
->SaturateMode
!= SATURATE_OFF
);
203 for (i
= 0; i
< 4; i
++) {
205 struct brw_reg src
, dst
;
206 dst
= get_dst_reg(c
, inst
, i
, 1);
207 src
= get_src_reg(c
, &inst
->SrcReg
[0], i
, 1);
208 brw_MOV(p
, dst
, src
);
211 brw_set_saturate(p
, 0);
214 static void emit_pixel_xy(struct brw_wm_compile
*c
,
215 struct prog_instruction
*inst
)
217 struct brw_reg r1
= brw_vec1_grf(1, 0);
218 struct brw_reg r1_uw
= retype(r1
, BRW_REGISTER_TYPE_UW
);
220 struct brw_reg dst0
, dst1
;
221 struct brw_compile
*p
= &c
->func
;
222 GLuint mask
= inst
->DstReg
.WriteMask
;
224 dst0
= get_dst_reg(c
, inst
, 0, 1);
225 dst1
= get_dst_reg(c
, inst
, 1, 1);
226 /* Calculate pixel centers by adding 1 or 0 to each of the
227 * micro-tile coordinates passed in r1.
229 if (mask
& WRITEMASK_X
) {
231 vec8(retype(dst0
, BRW_REGISTER_TYPE_UW
)),
232 stride(suboffset(r1_uw
, 4), 2, 4, 0),
233 brw_imm_v(0x10101010));
236 if (mask
& WRITEMASK_Y
) {
238 vec8(retype(dst1
, BRW_REGISTER_TYPE_UW
)),
239 stride(suboffset(r1_uw
, 5), 2, 4, 0),
240 brw_imm_v(0x11001100));
245 static void emit_delta_xy(struct brw_wm_compile
*c
,
246 struct prog_instruction
*inst
)
248 struct brw_reg r1
= brw_vec1_grf(1, 0);
249 struct brw_reg dst0
, dst1
, src0
, src1
;
250 struct brw_compile
*p
= &c
->func
;
251 GLuint mask
= inst
->DstReg
.WriteMask
;
253 dst0
= get_dst_reg(c
, inst
, 0, 1);
254 dst1
= get_dst_reg(c
, inst
, 1, 1);
255 src0
= get_src_reg(c
, &inst
->SrcReg
[0], 0, 1);
256 src1
= get_src_reg(c
, &inst
->SrcReg
[0], 1, 1);
257 /* Calc delta X,Y by subtracting origin in r1 from the pixel
260 if (mask
& WRITEMASK_X
) {
263 retype(src0
, BRW_REGISTER_TYPE_UW
),
267 if (mask
& WRITEMASK_Y
) {
270 retype(src1
, BRW_REGISTER_TYPE_UW
),
271 negate(suboffset(r1
,1)));
278 static void fire_fb_write( struct brw_wm_compile
*c
,
284 struct brw_compile
*p
= &c
->func
;
285 /* Pass through control information:
287 /* mov (8) m1.0<1>:ud r1.0<8;8,1>:ud { Align1 NoMask } */
289 brw_push_insn_state(p
);
290 brw_set_mask_control(p
, BRW_MASK_DISABLE
); /* ? */
292 brw_message_reg(base_reg
+ 1),
294 brw_pop_insn_state(p
);
296 /* Send framebuffer write message: */
298 retype(vec8(brw_null_reg()), BRW_REGISTER_TYPE_UW
),
300 retype(brw_vec8_grf(0, 0), BRW_REGISTER_TYPE_UW
),
307 static void emit_fb_write(struct brw_wm_compile
*c
,
308 struct prog_instruction
*inst
)
310 struct brw_compile
*p
= &c
->func
;
316 /* Reserve a space for AA - may not be needed:
318 if (c
->key
.aa_dest_stencil_reg
)
321 brw_push_insn_state(p
);
322 for (channel
= 0; channel
< 4; channel
++) {
323 src0
= get_src_reg(c
, &inst
->SrcReg
[0], channel
, 1);
324 /* mov (8) m2.0<1>:ud r28.0<8;8,1>:ud { Align1 } */
325 /* mov (8) m6.0<1>:ud r29.0<8;8,1>:ud { Align1 SecHalf } */
326 brw_MOV(p
, brw_message_reg(nr
+ channel
), src0
);
328 /* skip over the regs populated above: */
330 brw_pop_insn_state(p
);
333 if (c
->key
.source_depth_to_render_target
)
335 if (c
->key
.computes_depth
) {
336 src0
= get_src_reg(c
, &inst
->SrcReg
[2], 2, 1);
337 brw_MOV(p
, brw_message_reg(nr
), src0
);
339 src0
= get_src_reg(c
, &inst
->SrcReg
[1], 1, 1);
340 brw_MOV(p
, brw_message_reg(nr
), src0
);
345 target
= inst
->Sampler
>> 1;
346 eot
= inst
->Sampler
& 1;
347 fire_fb_write(c
, 0, nr
, target
, eot
);
350 static void emit_pixel_w( struct brw_wm_compile
*c
,
351 struct prog_instruction
*inst
)
353 struct brw_compile
*p
= &c
->func
;
354 GLuint mask
= inst
->DstReg
.WriteMask
;
355 if (mask
& WRITEMASK_W
) {
356 struct brw_reg dst
, src0
, delta0
, delta1
;
357 struct brw_reg interp3
;
359 dst
= get_dst_reg(c
, inst
, 3, 1);
360 src0
= get_src_reg(c
, &inst
->SrcReg
[0], 0, 1);
361 delta0
= get_src_reg(c
, &inst
->SrcReg
[1], 0, 1);
362 delta1
= get_src_reg(c
, &inst
->SrcReg
[1], 1, 1);
364 interp3
= brw_vec1_grf(src0
.nr
+1, 4);
365 /* Calc 1/w - just linterp wpos[3] optimized by putting the
366 * result straight into a message reg.
368 brw_LINE(p
, brw_null_reg(), interp3
, delta0
);
369 brw_MAC(p
, brw_message_reg(2), suboffset(interp3
, 1), delta1
);
373 BRW_MATH_FUNCTION_INV
,
374 BRW_MATH_SATURATE_NONE
,
376 BRW_MATH_PRECISION_FULL
);
380 static void emit_linterp(struct brw_wm_compile
*c
,
381 struct prog_instruction
*inst
)
383 struct brw_compile
*p
= &c
->func
;
384 GLuint mask
= inst
->DstReg
.WriteMask
;
385 struct brw_reg interp
[4];
386 struct brw_reg dst
, delta0
, delta1
;
389 src0
= get_src_reg(c
, &inst
->SrcReg
[0], 0, 1);
390 delta0
= get_src_reg(c
, &inst
->SrcReg
[1], 0, 1);
391 delta1
= get_src_reg(c
, &inst
->SrcReg
[1], 1, 1);
395 interp
[0] = brw_vec1_grf(nr
, 0);
396 interp
[1] = brw_vec1_grf(nr
, 4);
397 interp
[2] = brw_vec1_grf(nr
+1, 0);
398 interp
[3] = brw_vec1_grf(nr
+1, 4);
400 for(i
= 0; i
< 4; i
++ ) {
402 dst
= get_dst_reg(c
, inst
, i
, 1);
403 brw_LINE(p
, brw_null_reg(), interp
[i
], delta0
);
404 brw_MAC(p
, dst
, suboffset(interp
[i
],1), delta1
);
409 static void emit_cinterp(struct brw_wm_compile
*c
,
410 struct prog_instruction
*inst
)
412 struct brw_compile
*p
= &c
->func
;
413 GLuint mask
= inst
->DstReg
.WriteMask
;
415 struct brw_reg interp
[4];
416 struct brw_reg dst
, src0
;
418 src0
= get_src_reg(c
, &inst
->SrcReg
[0], 0, 1);
422 interp
[0] = brw_vec1_grf(nr
, 0);
423 interp
[1] = brw_vec1_grf(nr
, 4);
424 interp
[2] = brw_vec1_grf(nr
+1, 0);
425 interp
[3] = brw_vec1_grf(nr
+1, 4);
427 for(i
= 0; i
< 4; i
++ ) {
429 dst
= get_dst_reg(c
, inst
, i
, 1);
430 brw_MOV(p
, dst
, suboffset(interp
[i
],3));
435 static void emit_pinterp(struct brw_wm_compile
*c
,
436 struct prog_instruction
*inst
)
438 struct brw_compile
*p
= &c
->func
;
439 GLuint mask
= inst
->DstReg
.WriteMask
;
441 struct brw_reg interp
[4];
442 struct brw_reg dst
, delta0
, delta1
;
443 struct brw_reg src0
, w
;
445 src0
= get_src_reg(c
, &inst
->SrcReg
[0], 0, 1);
446 delta0
= get_src_reg(c
, &inst
->SrcReg
[1], 0, 1);
447 delta1
= get_src_reg(c
, &inst
->SrcReg
[1], 1, 1);
448 w
= get_src_reg(c
, &inst
->SrcReg
[2], 3, 1);
452 interp
[0] = brw_vec1_grf(nr
, 0);
453 interp
[1] = brw_vec1_grf(nr
, 4);
454 interp
[2] = brw_vec1_grf(nr
+1, 0);
455 interp
[3] = brw_vec1_grf(nr
+1, 4);
457 for(i
= 0; i
< 4; i
++ ) {
459 dst
= get_dst_reg(c
, inst
, i
, 1);
460 brw_LINE(p
, brw_null_reg(), interp
[i
], delta0
);
461 brw_MAC(p
, dst
, suboffset(interp
[i
],1),
463 brw_MUL(p
, dst
, dst
, w
);
468 static void emit_xpd(struct brw_wm_compile
*c
,
469 struct prog_instruction
*inst
)
472 struct brw_compile
*p
= &c
->func
;
473 GLuint mask
= inst
->DstReg
.WriteMask
;
474 for (i
= 0; i
< 4; i
++) {
478 struct brw_reg src0
, src1
, dst
;
479 dst
= get_dst_reg(c
, inst
, i
, 1);
480 src0
= negate(get_src_reg(c
, &inst
->SrcReg
[0], i2
, 1));
481 src1
= get_src_reg(c
, &inst
->SrcReg
[1], i1
, 1);
482 brw_MUL(p
, brw_null_reg(), src0
, src1
);
483 src0
= get_src_reg(c
, &inst
->SrcReg
[0], i1
, 1);
484 src1
= get_src_reg(c
, &inst
->SrcReg
[1], i2
, 1);
485 brw_set_saturate(p
, inst
->SaturateMode
!= SATURATE_OFF
);
486 brw_MAC(p
, dst
, src0
, src1
);
487 brw_set_saturate(p
, 0);
490 brw_set_saturate(p
, 0);
493 static void emit_dp3(struct brw_wm_compile
*c
,
494 struct prog_instruction
*inst
)
496 struct brw_reg src0
[3], src1
[3], dst
;
498 struct brw_compile
*p
= &c
->func
;
499 for (i
= 0; i
< 3; i
++) {
500 src0
[i
] = get_src_reg(c
, &inst
->SrcReg
[0], i
, 1);
501 src1
[i
] = get_src_reg(c
, &inst
->SrcReg
[1], i
, 1);
504 dst
= get_dst_reg(c
, inst
, get_scalar_dst_index(inst
), 1);
505 brw_MUL(p
, brw_null_reg(), src0
[0], src1
[0]);
506 brw_MAC(p
, brw_null_reg(), src0
[1], src1
[1]);
507 brw_set_saturate(p
, (inst
->SaturateMode
!= SATURATE_OFF
) ? 1 : 0);
508 brw_MAC(p
, dst
, src0
[2], src1
[2]);
509 brw_set_saturate(p
, 0);
512 static void emit_dp4(struct brw_wm_compile
*c
,
513 struct prog_instruction
*inst
)
515 struct brw_reg src0
[4], src1
[4], dst
;
517 struct brw_compile
*p
= &c
->func
;
518 for (i
= 0; i
< 4; i
++) {
519 src0
[i
] = get_src_reg(c
, &inst
->SrcReg
[0], i
, 1);
520 src1
[i
] = get_src_reg(c
, &inst
->SrcReg
[1], i
, 1);
522 dst
= get_dst_reg(c
, inst
, get_scalar_dst_index(inst
), 1);
523 brw_MUL(p
, brw_null_reg(), src0
[0], src1
[0]);
524 brw_MAC(p
, brw_null_reg(), src0
[1], src1
[1]);
525 brw_MAC(p
, brw_null_reg(), src0
[2], src1
[2]);
526 brw_set_saturate(p
, (inst
->SaturateMode
!= SATURATE_OFF
) ? 1 : 0);
527 brw_MAC(p
, dst
, src0
[3], src1
[3]);
528 brw_set_saturate(p
, 0);
531 static void emit_dph(struct brw_wm_compile
*c
,
532 struct prog_instruction
*inst
)
534 struct brw_reg src0
[4], src1
[4], dst
;
536 struct brw_compile
*p
= &c
->func
;
537 for (i
= 0; i
< 4; i
++) {
538 src0
[i
] = get_src_reg(c
, &inst
->SrcReg
[0], i
, 1);
539 src1
[i
] = get_src_reg(c
, &inst
->SrcReg
[1], i
, 1);
541 dst
= get_dst_reg(c
, inst
, get_scalar_dst_index(inst
), 1);
542 brw_MUL(p
, brw_null_reg(), src0
[0], src1
[0]);
543 brw_MAC(p
, brw_null_reg(), src0
[1], src1
[1]);
544 brw_MAC(p
, dst
, src0
[2], src1
[2]);
545 brw_set_saturate(p
, (inst
->SaturateMode
!= SATURATE_OFF
) ? 1 : 0);
546 brw_ADD(p
, dst
, src0
[3], src1
[3]);
547 brw_set_saturate(p
, 0);
550 static void emit_math1(struct brw_wm_compile
*c
,
551 struct prog_instruction
*inst
, GLuint func
)
553 struct brw_compile
*p
= &c
->func
;
554 struct brw_reg src0
, dst
;
556 src0
= get_src_reg(c
, &inst
->SrcReg
[0], 0, 1);
557 dst
= get_dst_reg(c
, inst
, get_scalar_dst_index(inst
), 1);
558 brw_MOV(p
, brw_message_reg(2), src0
);
562 (inst
->SaturateMode
!= SATURATE_OFF
) ? BRW_MATH_SATURATE_SATURATE
: BRW_MATH_SATURATE_NONE
,
565 BRW_MATH_DATA_VECTOR
,
566 BRW_MATH_PRECISION_FULL
);
569 static void emit_rcp(struct brw_wm_compile
*c
,
570 struct prog_instruction
*inst
)
572 emit_math1(c
, inst
, BRW_MATH_FUNCTION_INV
);
575 static void emit_rsq(struct brw_wm_compile
*c
,
576 struct prog_instruction
*inst
)
578 emit_math1(c
, inst
, BRW_MATH_FUNCTION_RSQ
);
581 static void emit_sin(struct brw_wm_compile
*c
,
582 struct prog_instruction
*inst
)
584 emit_math1(c
, inst
, BRW_MATH_FUNCTION_SIN
);
587 static void emit_cos(struct brw_wm_compile
*c
,
588 struct prog_instruction
*inst
)
590 emit_math1(c
, inst
, BRW_MATH_FUNCTION_COS
);
593 static void emit_ex2(struct brw_wm_compile
*c
,
594 struct prog_instruction
*inst
)
596 emit_math1(c
, inst
, BRW_MATH_FUNCTION_EXP
);
599 static void emit_lg2(struct brw_wm_compile
*c
,
600 struct prog_instruction
*inst
)
602 emit_math1(c
, inst
, BRW_MATH_FUNCTION_LOG
);
605 static void emit_add(struct brw_wm_compile
*c
,
606 struct prog_instruction
*inst
)
608 struct brw_compile
*p
= &c
->func
;
609 struct brw_reg src0
, src1
, dst
;
610 GLuint mask
= inst
->DstReg
.WriteMask
;
612 brw_set_saturate(p
, (inst
->SaturateMode
!= SATURATE_OFF
) ? 1 : 0);
613 for (i
= 0 ; i
< 4; i
++) {
615 dst
= get_dst_reg(c
, inst
, i
, 1);
616 src0
= get_src_reg(c
, &inst
->SrcReg
[0], i
, 1);
617 src1
= get_src_reg(c
, &inst
->SrcReg
[1], i
, 1);
618 brw_ADD(p
, dst
, src0
, src1
);
621 brw_set_saturate(p
, 0);
624 static void emit_sub(struct brw_wm_compile
*c
,
625 struct prog_instruction
*inst
)
627 struct brw_compile
*p
= &c
->func
;
628 struct brw_reg src0
, src1
, dst
;
629 GLuint mask
= inst
->DstReg
.WriteMask
;
631 brw_set_saturate(p
, (inst
->SaturateMode
!= SATURATE_OFF
) ? 1 : 0);
632 for (i
= 0 ; i
< 4; i
++) {
634 dst
= get_dst_reg(c
, inst
, i
, 1);
635 src0
= get_src_reg(c
, &inst
->SrcReg
[0], i
, 1);
636 src1
= get_src_reg(c
, &inst
->SrcReg
[1], i
, 1);
637 brw_ADD(p
, dst
, src0
, negate(src1
));
640 brw_set_saturate(p
, 0);
643 static void emit_mul(struct brw_wm_compile
*c
,
644 struct prog_instruction
*inst
)
646 struct brw_compile
*p
= &c
->func
;
647 struct brw_reg src0
, src1
, dst
;
648 GLuint mask
= inst
->DstReg
.WriteMask
;
650 brw_set_saturate(p
, (inst
->SaturateMode
!= SATURATE_OFF
) ? 1 : 0);
651 for (i
= 0 ; i
< 4; i
++) {
653 dst
= get_dst_reg(c
, inst
, i
, 1);
654 src0
= get_src_reg(c
, &inst
->SrcReg
[0], i
, 1);
655 src1
= get_src_reg(c
, &inst
->SrcReg
[1], i
, 1);
656 brw_MUL(p
, dst
, src0
, src1
);
659 brw_set_saturate(p
, 0);
662 static void emit_frc(struct brw_wm_compile
*c
,
663 struct prog_instruction
*inst
)
665 struct brw_compile
*p
= &c
->func
;
666 struct brw_reg src0
, dst
;
667 GLuint mask
= inst
->DstReg
.WriteMask
;
669 brw_set_saturate(p
, (inst
->SaturateMode
!= SATURATE_OFF
) ? 1 : 0);
670 for (i
= 0 ; i
< 4; i
++) {
672 dst
= get_dst_reg(c
, inst
, i
, 1);
673 src0
= get_src_reg(c
, &inst
->SrcReg
[0], i
, 1);
674 brw_FRC(p
, dst
, src0
);
677 if (inst
->SaturateMode
!= SATURATE_OFF
)
678 brw_set_saturate(p
, 0);
681 static void emit_flr(struct brw_wm_compile
*c
,
682 struct prog_instruction
*inst
)
684 struct brw_compile
*p
= &c
->func
;
685 struct brw_reg src0
, dst
;
686 GLuint mask
= inst
->DstReg
.WriteMask
;
688 brw_set_saturate(p
, (inst
->SaturateMode
!= SATURATE_OFF
) ? 1 : 0);
689 for (i
= 0 ; i
< 4; i
++) {
691 dst
= get_dst_reg(c
, inst
, i
, 1);
692 src0
= get_src_reg(c
, &inst
->SrcReg
[0], i
, 1);
693 brw_RNDD(p
, dst
, src0
);
696 brw_set_saturate(p
, 0);
699 static void emit_max(struct brw_wm_compile
*c
,
700 struct prog_instruction
*inst
)
702 struct brw_compile
*p
= &c
->func
;
703 GLuint mask
= inst
->DstReg
.WriteMask
;
704 struct brw_reg src0
, src1
, dst
;
706 brw_push_insn_state(p
);
707 for (i
= 0; i
< 4; i
++) {
709 dst
= get_dst_reg(c
, inst
, i
, 1);
710 src0
= get_src_reg(c
, &inst
->SrcReg
[0], i
, 1);
711 src1
= get_src_reg(c
, &inst
->SrcReg
[1], i
, 1);
712 brw_set_saturate(p
, (inst
->SaturateMode
!= SATURATE_OFF
) ? 1 : 0);
713 brw_MOV(p
, dst
, src0
);
714 brw_set_saturate(p
, 0);
716 brw_CMP(p
, brw_null_reg(), BRW_CONDITIONAL_L
, src0
, src1
);
717 brw_set_saturate(p
, (inst
->SaturateMode
!= SATURATE_OFF
) ? 1 : 0);
718 brw_set_predicate_control(p
, BRW_PREDICATE_NORMAL
);
719 brw_MOV(p
, dst
, src1
);
720 brw_set_saturate(p
, 0);
721 brw_set_predicate_control_flag_value(p
, 0xff);
724 brw_pop_insn_state(p
);
727 static void emit_min(struct brw_wm_compile
*c
,
728 struct prog_instruction
*inst
)
730 struct brw_compile
*p
= &c
->func
;
731 GLuint mask
= inst
->DstReg
.WriteMask
;
732 struct brw_reg src0
, src1
, dst
;
734 brw_push_insn_state(p
);
735 for (i
= 0; i
< 4; i
++) {
737 dst
= get_dst_reg(c
, inst
, i
, 1);
738 src0
= get_src_reg(c
, &inst
->SrcReg
[0], i
, 1);
739 src1
= get_src_reg(c
, &inst
->SrcReg
[1], i
, 1);
740 brw_set_saturate(p
, (inst
->SaturateMode
!= SATURATE_OFF
) ? 1 : 0);
741 brw_MOV(p
, dst
, src0
);
742 brw_set_saturate(p
, 0);
744 brw_CMP(p
, brw_null_reg(), BRW_CONDITIONAL_L
, src1
, src0
);
745 brw_set_saturate(p
, (inst
->SaturateMode
!= SATURATE_OFF
) ? 1 : 0);
746 brw_set_predicate_control(p
, BRW_PREDICATE_NORMAL
);
747 brw_MOV(p
, dst
, src1
);
748 brw_set_saturate(p
, 0);
749 brw_set_predicate_control_flag_value(p
, 0xff);
752 brw_pop_insn_state(p
);
755 static void emit_pow(struct brw_wm_compile
*c
,
756 struct prog_instruction
*inst
)
758 struct brw_compile
*p
= &c
->func
;
759 struct brw_reg dst
, src0
, src1
;
760 dst
= get_dst_reg(c
, inst
, get_scalar_dst_index(inst
), 1);
761 src0
= get_src_reg(c
, &inst
->SrcReg
[0], 0, 1);
762 src1
= get_src_reg(c
, &inst
->SrcReg
[1], 0, 1);
764 brw_MOV(p
, brw_message_reg(2), src0
);
765 brw_MOV(p
, brw_message_reg(3), src1
);
769 BRW_MATH_FUNCTION_POW
,
770 (inst
->SaturateMode
!= SATURATE_OFF
) ? BRW_MATH_SATURATE_SATURATE
: BRW_MATH_SATURATE_NONE
,
773 BRW_MATH_DATA_VECTOR
,
774 BRW_MATH_PRECISION_FULL
);
777 static void emit_lrp(struct brw_wm_compile
*c
,
778 struct prog_instruction
*inst
)
780 struct brw_compile
*p
= &c
->func
;
781 GLuint mask
= inst
->DstReg
.WriteMask
;
782 struct brw_reg dst
, tmp1
, tmp2
, src0
, src1
, src2
;
784 for (i
= 0; i
< 4; i
++) {
786 dst
= get_dst_reg(c
, inst
, i
, 1);
787 src0
= get_src_reg(c
, &inst
->SrcReg
[0], i
, 1);
789 src1
= get_src_reg(c
, &inst
->SrcReg
[1], i
, 1);
791 if (src1
.nr
== dst
.nr
) {
793 brw_MOV(p
, tmp1
, src1
);
797 src2
= get_src_reg(c
, &inst
->SrcReg
[2], i
, 1);
798 if (src2
.nr
== dst
.nr
) {
800 brw_MOV(p
, tmp2
, src2
);
804 brw_ADD(p
, dst
, negate(src0
), brw_imm_f(1.0));
805 brw_MUL(p
, brw_null_reg(), dst
, tmp2
);
806 brw_set_saturate(p
, (inst
->SaturateMode
!= SATURATE_OFF
) ? 1 : 0);
807 brw_MAC(p
, dst
, src0
, tmp1
);
808 brw_set_saturate(p
, 0);
814 static void emit_kil(struct brw_wm_compile
*c
)
816 struct brw_compile
*p
= &c
->func
;
817 struct brw_reg depth
= retype(brw_vec1_grf(0, 0), BRW_REGISTER_TYPE_UW
);
818 brw_push_insn_state(p
);
819 brw_set_mask_control(p
, BRW_MASK_DISABLE
);
820 brw_NOT(p
, c
->emit_mask_reg
, brw_mask_reg(1)); //IMASK
821 brw_AND(p
, depth
, c
->emit_mask_reg
, depth
);
822 brw_pop_insn_state(p
);
825 static void emit_mad(struct brw_wm_compile
*c
,
826 struct prog_instruction
*inst
)
828 struct brw_compile
*p
= &c
->func
;
829 GLuint mask
= inst
->DstReg
.WriteMask
;
830 struct brw_reg dst
, src0
, src1
, src2
;
833 for (i
= 0; i
< 4; i
++) {
835 dst
= get_dst_reg(c
, inst
, i
, 1);
836 src0
= get_src_reg(c
, &inst
->SrcReg
[0], i
, 1);
837 src1
= get_src_reg(c
, &inst
->SrcReg
[1], i
, 1);
838 src2
= get_src_reg(c
, &inst
->SrcReg
[2], i
, 1);
839 brw_MUL(p
, dst
, src0
, src1
);
841 brw_set_saturate(p
, (inst
->SaturateMode
!= SATURATE_OFF
) ? 1 : 0);
842 brw_ADD(p
, dst
, dst
, src2
);
843 brw_set_saturate(p
, 0);
848 static void emit_sop(struct brw_wm_compile
*c
,
849 struct prog_instruction
*inst
, GLuint cond
)
851 struct brw_compile
*p
= &c
->func
;
852 GLuint mask
= inst
->DstReg
.WriteMask
;
853 struct brw_reg dst
, src0
, src1
;
856 for (i
= 0; i
< 4; i
++) {
858 dst
= get_dst_reg(c
, inst
, i
, 1);
859 src0
= get_src_reg(c
, &inst
->SrcReg
[0], i
, 1);
860 src1
= get_src_reg(c
, &inst
->SrcReg
[1], i
, 1);
861 brw_push_insn_state(p
);
862 brw_CMP(p
, brw_null_reg(), cond
, src0
, src1
);
863 brw_set_predicate_control(p
, BRW_PREDICATE_NONE
);
864 brw_MOV(p
, dst
, brw_imm_f(0.0));
865 brw_set_predicate_control(p
, BRW_PREDICATE_NORMAL
);
866 brw_MOV(p
, dst
, brw_imm_f(1.0));
867 brw_pop_insn_state(p
);
872 static void emit_slt(struct brw_wm_compile
*c
,
873 struct prog_instruction
*inst
)
875 emit_sop(c
, inst
, BRW_CONDITIONAL_L
);
878 static void emit_sle(struct brw_wm_compile
*c
,
879 struct prog_instruction
*inst
)
881 emit_sop(c
, inst
, BRW_CONDITIONAL_LE
);
884 static void emit_sgt(struct brw_wm_compile
*c
,
885 struct prog_instruction
*inst
)
887 emit_sop(c
, inst
, BRW_CONDITIONAL_G
);
890 static void emit_sge(struct brw_wm_compile
*c
,
891 struct prog_instruction
*inst
)
893 emit_sop(c
, inst
, BRW_CONDITIONAL_GE
);
896 static void emit_seq(struct brw_wm_compile
*c
,
897 struct prog_instruction
*inst
)
899 emit_sop(c
, inst
, BRW_CONDITIONAL_EQ
);
902 static void emit_sne(struct brw_wm_compile
*c
,
903 struct prog_instruction
*inst
)
905 emit_sop(c
, inst
, BRW_CONDITIONAL_NEQ
);
908 static void emit_ddx(struct brw_wm_compile
*c
,
909 struct prog_instruction
*inst
)
911 struct brw_compile
*p
= &c
->func
;
912 GLuint mask
= inst
->DstReg
.WriteMask
;
913 struct brw_reg interp
[4];
915 struct brw_reg src0
, w
;
917 src0
= get_src_reg(c
, &inst
->SrcReg
[0], 0, 1);
918 w
= get_src_reg(c
, &inst
->SrcReg
[1], 3, 1);
920 interp
[0] = brw_vec1_grf(nr
, 0);
921 interp
[1] = brw_vec1_grf(nr
, 4);
922 interp
[2] = brw_vec1_grf(nr
+1, 0);
923 interp
[3] = brw_vec1_grf(nr
+1, 4);
924 brw_set_saturate(p
, inst
->SaturateMode
!= SATURATE_OFF
);
925 for(i
= 0; i
< 4; i
++ ) {
927 dst
= get_dst_reg(c
, inst
, i
, 1);
928 brw_MOV(p
, dst
, interp
[i
]);
929 brw_MUL(p
, dst
, dst
, w
);
932 brw_set_saturate(p
, 0);
935 static void emit_ddy(struct brw_wm_compile
*c
,
936 struct prog_instruction
*inst
)
938 struct brw_compile
*p
= &c
->func
;
939 GLuint mask
= inst
->DstReg
.WriteMask
;
940 struct brw_reg interp
[4];
942 struct brw_reg src0
, w
;
945 src0
= get_src_reg(c
, &inst
->SrcReg
[0], 0, 1);
947 w
= get_src_reg(c
, &inst
->SrcReg
[1], 3, 1);
948 interp
[0] = brw_vec1_grf(nr
, 0);
949 interp
[1] = brw_vec1_grf(nr
, 4);
950 interp
[2] = brw_vec1_grf(nr
+1, 0);
951 interp
[3] = brw_vec1_grf(nr
+1, 4);
952 brw_set_saturate(p
, inst
->SaturateMode
!= SATURATE_OFF
);
953 for(i
= 0; i
< 4; i
++ ) {
955 dst
= get_dst_reg(c
, inst
, i
, 1);
956 brw_MOV(p
, dst
, suboffset(interp
[i
], 1));
957 brw_MUL(p
, dst
, dst
, w
);
960 brw_set_saturate(p
, 0);
963 static void emit_wpos_xy(struct brw_wm_compile
*c
,
964 struct prog_instruction
*inst
)
966 struct brw_compile
*p
= &c
->func
;
967 GLuint mask
= inst
->DstReg
.WriteMask
;
968 struct brw_reg src0
[2], dst
[2];
970 dst
[0] = get_dst_reg(c
, inst
, 0, 1);
971 dst
[1] = get_dst_reg(c
, inst
, 1, 1);
973 src0
[0] = get_src_reg(c
, &inst
->SrcReg
[0], 0, 1);
974 src0
[1] = get_src_reg(c
, &inst
->SrcReg
[0], 1, 1);
976 /* Calculate the pixel offset from window bottom left into destination
979 if (mask
& WRITEMASK_X
) {
980 /* X' = X - origin_x */
983 retype(src0
[0], BRW_REGISTER_TYPE_W
),
984 brw_imm_d(0 - c
->key
.origin_x
));
987 if (mask
& WRITEMASK_Y
) {
988 /* Y' = height - (Y - origin_y) = height + origin_y - Y */
991 negate(retype(src0
[1], BRW_REGISTER_TYPE_W
)),
992 brw_imm_d(c
->key
.origin_y
+ c
->key
.drawable_height
- 1));
997 BIAS on SIMD8 not workind yet...
999 static void emit_txb(struct brw_wm_compile
*c
,
1000 struct prog_instruction
*inst
)
1002 struct brw_compile
*p
= &c
->func
;
1003 struct brw_reg dst
[4], src
[4], payload_reg
;
1004 GLuint unit
= c
->fp
->program
.Base
.SamplerUnits
[inst
->TexSrcUnit
];
1007 payload_reg
= get_reg(c
, PROGRAM_PAYLOAD
, PAYLOAD_DEPTH
, 0, 1, 0, 0);
1008 for (i
= 0; i
< 4; i
++)
1009 dst
[i
] = get_dst_reg(c
, inst
, i
, 1);
1010 for (i
= 0; i
< 4; i
++)
1011 src
[i
] = get_src_reg(c
, &inst
->SrcReg
[0], i
, 1);
1013 switch (inst
->TexSrcTarget
) {
1014 case TEXTURE_1D_INDEX
:
1015 brw_MOV(p
, brw_message_reg(2), src
[0]);
1016 brw_MOV(p
, brw_message_reg(3), brw_imm_f(0));
1017 brw_MOV(p
, brw_message_reg(4), brw_imm_f(0));
1019 case TEXTURE_2D_INDEX
:
1020 case TEXTURE_RECT_INDEX
:
1021 brw_MOV(p
, brw_message_reg(2), src
[0]);
1022 brw_MOV(p
, brw_message_reg(3), src
[1]);
1023 brw_MOV(p
, brw_message_reg(4), brw_imm_f(0));
1026 brw_MOV(p
, brw_message_reg(2), src
[0]);
1027 brw_MOV(p
, brw_message_reg(3), src
[1]);
1028 brw_MOV(p
, brw_message_reg(4), src
[2]);
1031 brw_MOV(p
, brw_message_reg(5), src
[3]);
1032 brw_MOV(p
, brw_message_reg(6), brw_imm_f(0));
1034 retype(vec8(dst
[0]), BRW_REGISTER_TYPE_UW
),
1036 retype(payload_reg
, BRW_REGISTER_TYPE_UW
),
1037 unit
+ MAX_DRAW_BUFFERS
, /* surface */
1039 inst
->DstReg
.WriteMask
,
1040 BRW_SAMPLER_MESSAGE_SIMD16_SAMPLE_BIAS
,
1046 static void emit_tex(struct brw_wm_compile
*c
,
1047 struct prog_instruction
*inst
)
1049 struct brw_compile
*p
= &c
->func
;
1050 struct brw_reg dst
[4], src
[4], payload_reg
;
1051 GLuint unit
= c
->fp
->program
.Base
.SamplerUnits
[inst
->TexSrcUnit
];
1056 GLboolean shadow
= (c
->key
.shadowtex_mask
& (1<<unit
)) ? 1 : 0;
1058 payload_reg
= get_reg(c
, PROGRAM_PAYLOAD
, PAYLOAD_DEPTH
, 0, 1, 0, 0);
1060 for (i
= 0; i
< 4; i
++)
1061 dst
[i
] = get_dst_reg(c
, inst
, i
, 1);
1062 for (i
= 0; i
< 4; i
++)
1063 src
[i
] = get_src_reg(c
, &inst
->SrcReg
[0], i
, 1);
1066 switch (inst
->TexSrcTarget
) {
1067 case TEXTURE_1D_INDEX
:
1071 case TEXTURE_2D_INDEX
:
1072 case TEXTURE_RECT_INDEX
:
1073 emit
= WRITEMASK_XY
;
1077 emit
= WRITEMASK_XYZ
;
1083 for (i
= 0; i
< nr
; i
++) {
1084 static const GLuint swz
[4] = {0,1,2,2};
1086 brw_MOV(p
, brw_message_reg(msg_len
+1), src
[swz
[i
]]);
1088 brw_MOV(p
, brw_message_reg(msg_len
+1), brw_imm_f(0));
1093 brw_MOV(p
, brw_message_reg(5), brw_imm_f(0));
1094 brw_MOV(p
, brw_message_reg(6), src
[2]);
1098 retype(vec8(dst
[0]), BRW_REGISTER_TYPE_UW
),
1100 retype(payload_reg
, BRW_REGISTER_TYPE_UW
),
1101 unit
+ MAX_DRAW_BUFFERS
, /* surface */
1103 inst
->DstReg
.WriteMask
,
1104 BRW_SAMPLER_MESSAGE_SIMD8_SAMPLE
,
1110 brw_MOV(p
, dst
[3], brw_imm_f(1.0));
1113 static void post_wm_emit( struct brw_wm_compile
*c
)
1115 GLuint nr_insns
= c
->fp
->program
.Base
.NumInstructions
;
1116 GLuint insn
, target_insn
;
1117 struct prog_instruction
*inst1
, *inst2
;
1118 struct brw_instruction
*brw_inst1
, *brw_inst2
;
1120 for (insn
= 0; insn
< nr_insns
; insn
++) {
1121 inst1
= &c
->fp
->program
.Base
.Instructions
[insn
];
1122 brw_inst1
= inst1
->Data
;
1123 switch (inst1
->Opcode
) {
1125 target_insn
= inst1
->BranchTarget
;
1126 inst2
= &c
->fp
->program
.Base
.Instructions
[target_insn
];
1127 brw_inst2
= inst2
->Data
;
1128 offset
= brw_inst2
- brw_inst1
;
1129 brw_set_src1(brw_inst1
, brw_imm_d(offset
*16));
1137 static void brw_wm_emit_glsl(struct brw_context
*brw
, struct brw_wm_compile
*c
)
1140 #define MAX_LOOP_DEPTH 32
1141 struct brw_instruction
*if_inst
[MAX_IFSN
], *loop_inst
[MAX_LOOP_DEPTH
];
1142 struct brw_instruction
*inst0
, *inst1
;
1143 int i
, if_insn
= 0, loop_insn
= 0;
1144 struct brw_compile
*p
= &c
->func
;
1145 struct brw_indirect stack_index
= brw_indirect(0, 0);
1149 brw_set_compression_control(p
, BRW_COMPRESSION_NONE
);
1150 brw_MOV(p
, get_addr_reg(stack_index
), brw_address(c
->stack
));
1152 for (i
= 0; i
< c
->nr_fp_insns
; i
++) {
1153 struct prog_instruction
*inst
= &c
->prog_instructions
[i
];
1154 struct prog_instruction
*orig_inst
;
1156 if ((orig_inst
= inst
->Data
) != 0)
1157 orig_inst
->Data
= current_insn(p
);
1159 if (inst
->CondUpdate
)
1160 brw_set_conditionalmod(p
, BRW_CONDITIONAL_NZ
);
1162 brw_set_conditionalmod(p
, BRW_CONDITIONAL_NONE
);
1164 switch (inst
->Opcode
) {
1166 emit_pixel_xy(c
, inst
);
1169 emit_delta_xy(c
, inst
);
1172 emit_pixel_w(c
, inst
);
1175 emit_linterp(c
, inst
);
1178 emit_pinterp(c
, inst
);
1181 emit_cinterp(c
, inst
);
1184 emit_wpos_xy(c
, inst
);
1187 emit_fb_write(c
, inst
);
1292 assert(if_insn
< MAX_IFSN
);
1293 if_inst
[if_insn
++] = brw_IF(p
, BRW_EXECUTE_8
);
1296 if_inst
[if_insn
-1] = brw_ELSE(p
, if_inst
[if_insn
-1]);
1299 assert(if_insn
> 0);
1300 brw_ENDIF(p
, if_inst
[--if_insn
]);
1306 brw_push_insn_state(p
);
1307 brw_set_mask_control(p
, BRW_MASK_DISABLE
);
1308 brw_set_access_mode(p
, BRW_ALIGN_1
);
1309 brw_ADD(p
, deref_1ud(stack_index
, 0), brw_ip_reg(), brw_imm_d(3*16));
1310 brw_set_access_mode(p
, BRW_ALIGN_16
);
1311 brw_ADD(p
, get_addr_reg(stack_index
),
1312 get_addr_reg(stack_index
), brw_imm_d(4));
1313 orig_inst
= inst
->Data
;
1314 orig_inst
->Data
= &p
->store
[p
->nr_insn
];
1315 brw_ADD(p
, brw_ip_reg(), brw_ip_reg(), brw_imm_d(1*16));
1316 brw_pop_insn_state(p
);
1320 brw_push_insn_state(p
);
1321 brw_set_mask_control(p
, BRW_MASK_DISABLE
);
1322 brw_ADD(p
, get_addr_reg(stack_index
),
1323 get_addr_reg(stack_index
), brw_imm_d(-4));
1324 brw_set_access_mode(p
, BRW_ALIGN_1
);
1325 brw_MOV(p
, brw_ip_reg(), deref_1ud(stack_index
, 0));
1326 brw_set_access_mode(p
, BRW_ALIGN_16
);
1327 brw_pop_insn_state(p
);
1330 case OPCODE_BGNLOOP
:
1331 loop_inst
[loop_insn
++] = brw_DO(p
, BRW_EXECUTE_8
);
1335 brw_set_predicate_control(p
, BRW_PREDICATE_NONE
);
1339 brw_set_predicate_control(p
, BRW_PREDICATE_NONE
);
1341 case OPCODE_ENDLOOP
:
1343 inst0
= inst1
= brw_WHILE(p
, loop_inst
[loop_insn
]);
1344 /* patch all the BREAK instructions from
1346 while (inst0
> loop_inst
[loop_insn
]) {
1348 if (inst0
->header
.opcode
== BRW_OPCODE_BREAK
) {
1349 inst0
->bits3
.if_else
.jump_count
= inst1
- inst0
+ 1;
1350 inst0
->bits3
.if_else
.pop_count
= 0;
1351 } else if (inst0
->header
.opcode
== BRW_OPCODE_CONTINUE
) {
1352 inst0
->bits3
.if_else
.jump_count
= inst1
- inst0
;
1353 inst0
->bits3
.if_else
.pop_count
= 0;
1358 _mesa_printf("unsupported IR in fragment shader %d\n",
1361 if (inst
->CondUpdate
)
1362 brw_set_predicate_control(p
, BRW_PREDICATE_NORMAL
);
1364 brw_set_predicate_control(p
, BRW_PREDICATE_NONE
);
1367 for (i
= 0; i
< c
->fp
->program
.Base
.NumInstructions
; i
++)
1368 c
->fp
->program
.Base
.Instructions
[i
].Data
= NULL
;
1371 void brw_wm_glsl_emit(struct brw_context
*brw
, struct brw_wm_compile
*c
)
1374 brw_wm_emit_glsl(brw
, c
);
1375 c
->prog_data
.total_grf
= c
->reg_index
;
1376 c
->prog_data
.total_scratch
= 0;