2 Copyright (C) Intel Corp. 2006. All Rights Reserved.
3 Intel funded Tungsten Graphics to
4 develop this 3D driver.
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.
26 **********************************************************************/
29 * Keith Whitwell <keithw@vmware.com>
34 * This file defines struct brw_reg, which is our representation for EU
35 * registers. They're not a hardware specific format, just an abstraction
36 * that intends to capture the full flexibility of the hardware registers.
38 * The brw_eu_emit.c layer's brw_set_dest/brw_set_src[01] functions encode
39 * the abstract brw_reg type into the actual hardware instruction encoding.
46 #include "program/prog_instruction.h"
47 #include "brw_defines.h"
53 /** Number of general purpose registers (VS, WM, etc) */
54 #define BRW_MAX_GRF 128
57 * First GRF used for the MRF hack.
59 * On gen7, MRFs are no longer used, and contiguous GRFs are used instead. We
60 * haven't converted our compiler to be aware of this, so it asks for MRFs and
61 * brw_eu_emit.c quietly converts them to be accesses of the top GRFs. The
62 * register allocators have to be careful of this to avoid corrupting the "MRF"s
63 * with actual GRF allocations.
65 #define GEN7_MRF_HACK_START 112
67 /** Number of message register file registers */
68 #define BRW_MAX_MRF 16
70 #define BRW_SWIZZLE4(a,b,c,d) (((a)<<0) | ((b)<<2) | ((c)<<4) | ((d)<<6))
71 #define BRW_GET_SWZ(swz, idx) (((swz) >> ((idx)*2)) & 0x3)
73 #define BRW_SWIZZLE_NOOP BRW_SWIZZLE4(0,1,2,3)
74 #define BRW_SWIZZLE_XYZW BRW_SWIZZLE4(0,1,2,3)
75 #define BRW_SWIZZLE_XXXX BRW_SWIZZLE4(0,0,0,0)
76 #define BRW_SWIZZLE_YYYY BRW_SWIZZLE4(1,1,1,1)
77 #define BRW_SWIZZLE_ZZZZ BRW_SWIZZLE4(2,2,2,2)
78 #define BRW_SWIZZLE_WWWW BRW_SWIZZLE4(3,3,3,3)
79 #define BRW_SWIZZLE_XYXY BRW_SWIZZLE4(0,1,0,1)
80 #define BRW_SWIZZLE_YZXW BRW_SWIZZLE4(1,2,0,3)
81 #define BRW_SWIZZLE_ZXYW BRW_SWIZZLE4(2,0,1,3)
82 #define BRW_SWIZZLE_ZWZW BRW_SWIZZLE4(2,3,2,3)
85 brw_is_single_value_swizzle(int swiz
)
87 return (swiz
== BRW_SWIZZLE_XXXX
||
88 swiz
== BRW_SWIZZLE_YYYY
||
89 swiz
== BRW_SWIZZLE_ZZZZ
||
90 swiz
== BRW_SWIZZLE_WWWW
);
94 BRW_REGISTER_TYPE_UD
= 0,
100 /** Non-immediates only: @{ */
101 BRW_REGISTER_TYPE_UB
,
105 /** Immediates only: @{ */
106 BRW_REGISTER_TYPE_UV
,
108 BRW_REGISTER_TYPE_VF
,
111 BRW_REGISTER_TYPE_DF
, /* Gen7+ (no immediates until Gen8+) */
114 BRW_REGISTER_TYPE_HF
,
115 BRW_REGISTER_TYPE_UQ
,
119 unsigned brw_reg_type_to_hw_type(const struct brw_context
*brw
,
120 enum brw_reg_type type
, unsigned file
);
121 const char *brw_reg_type_letters(unsigned brw_reg_type
);
123 #define REG_SIZE (8*4)
125 /* These aren't hardware structs, just something useful for us to pass around:
127 * Align1 operation has a lot of control over input ranges. Used in
128 * WM programs to implement shaders decomposed into "channel serial"
129 * or "structure of array" form:
135 unsigned subnr
:5; /* :1 in align16 */
136 unsigned negate
:1; /* source only */
137 unsigned abs
:1; /* source only */
138 unsigned vstride
:4; /* source only */
139 unsigned width
:3; /* src only, align1 only */
140 unsigned hstride
:2; /* align1 only */
141 unsigned address_mode
:1; /* relative addressing, hopefully! */
146 unsigned swizzle
:8; /* src only, align16 only */
147 unsigned writemask
:4; /* dest only, align16 only */
148 int indirect_offset
:10; /* relative addressing offset */
149 unsigned pad1
:10; /* two dwords total */
159 struct brw_indirect
{
160 unsigned addr_subnr
:4;
167 type_sz(unsigned type
)
170 case BRW_REGISTER_TYPE_UD
:
171 case BRW_REGISTER_TYPE_D
:
172 case BRW_REGISTER_TYPE_F
:
174 case BRW_REGISTER_TYPE_UW
:
175 case BRW_REGISTER_TYPE_W
:
177 case BRW_REGISTER_TYPE_UB
:
178 case BRW_REGISTER_TYPE_B
:
186 type_is_signed(unsigned type
)
189 case BRW_REGISTER_TYPE_D
:
190 case BRW_REGISTER_TYPE_W
:
191 case BRW_REGISTER_TYPE_F
:
192 case BRW_REGISTER_TYPE_B
:
193 case BRW_REGISTER_TYPE_V
:
194 case BRW_REGISTER_TYPE_VF
:
195 case BRW_REGISTER_TYPE_DF
:
196 case BRW_REGISTER_TYPE_HF
:
197 case BRW_REGISTER_TYPE_Q
:
200 case BRW_REGISTER_TYPE_UD
:
201 case BRW_REGISTER_TYPE_UW
:
202 case BRW_REGISTER_TYPE_UB
:
203 case BRW_REGISTER_TYPE_UV
:
204 case BRW_REGISTER_TYPE_UQ
:
208 assert(!"Unreachable.");
214 * Construct a brw_reg.
215 * \param file one of the BRW_x_REGISTER_FILE values
216 * \param nr register number/index
217 * \param subnr register sub number
218 * \param type one of BRW_REGISTER_TYPE_x
219 * \param vstride one of BRW_VERTICAL_STRIDE_x
220 * \param width one of BRW_WIDTH_x
221 * \param hstride one of BRW_HORIZONTAL_STRIDE_x
222 * \param swizzle one of BRW_SWIZZLE_x
223 * \param writemask WRITEMASK_X/Y/Z/W bitfield
225 static inline struct brw_reg
226 brw_reg(unsigned file
,
237 if (file
== BRW_GENERAL_REGISTER_FILE
)
238 assert(nr
< BRW_MAX_GRF
);
239 else if (file
== BRW_MESSAGE_REGISTER_FILE
)
240 assert((nr
& ~(1 << 7)) < BRW_MAX_MRF
);
241 else if (file
== BRW_ARCHITECTURE_REGISTER_FILE
)
242 assert(nr
<= BRW_ARF_TIMESTAMP
);
247 reg
.subnr
= subnr
* type_sz(type
);
250 reg
.vstride
= vstride
;
252 reg
.hstride
= hstride
;
253 reg
.address_mode
= BRW_ADDRESS_DIRECT
;
256 /* Could do better: If the reg is r5.3<0;1,0>, we probably want to
257 * set swizzle and writemask to W, as the lower bits of subnr will
258 * be lost when converted to align16. This is probably too much to
259 * keep track of as you'd want it adjusted by suboffset(), etc.
260 * Perhaps fix up when converting to align16?
262 reg
.dw1
.bits
.swizzle
= swizzle
;
263 reg
.dw1
.bits
.writemask
= writemask
;
264 reg
.dw1
.bits
.indirect_offset
= 0;
265 reg
.dw1
.bits
.pad1
= 0;
269 /** Construct float[16] register */
270 static inline struct brw_reg
271 brw_vec16_reg(unsigned file
, unsigned nr
, unsigned subnr
)
277 BRW_VERTICAL_STRIDE_16
,
279 BRW_HORIZONTAL_STRIDE_1
,
284 /** Construct float[8] register */
285 static inline struct brw_reg
286 brw_vec8_reg(unsigned file
, unsigned nr
, unsigned subnr
)
292 BRW_VERTICAL_STRIDE_8
,
294 BRW_HORIZONTAL_STRIDE_1
,
299 /** Construct float[4] register */
300 static inline struct brw_reg
301 brw_vec4_reg(unsigned file
, unsigned nr
, unsigned subnr
)
307 BRW_VERTICAL_STRIDE_4
,
309 BRW_HORIZONTAL_STRIDE_1
,
314 /** Construct float[2] register */
315 static inline struct brw_reg
316 brw_vec2_reg(unsigned file
, unsigned nr
, unsigned subnr
)
322 BRW_VERTICAL_STRIDE_2
,
324 BRW_HORIZONTAL_STRIDE_1
,
329 /** Construct float[1] register */
330 static inline struct brw_reg
331 brw_vec1_reg(unsigned file
, unsigned nr
, unsigned subnr
)
337 BRW_VERTICAL_STRIDE_0
,
339 BRW_HORIZONTAL_STRIDE_0
,
344 static inline struct brw_reg
345 brw_vecn_reg(unsigned width
, unsigned file
, unsigned nr
, unsigned subnr
)
349 return brw_vec1_reg(file
, nr
, subnr
);
351 return brw_vec2_reg(file
, nr
, subnr
);
353 return brw_vec4_reg(file
, nr
, subnr
);
355 return brw_vec8_reg(file
, nr
, subnr
);
357 return brw_vec16_reg(file
, nr
, subnr
);
359 assert(!"Invalid register width");
364 static inline struct brw_reg
365 retype(struct brw_reg reg
, unsigned type
)
371 static inline struct brw_reg
372 sechalf(struct brw_reg reg
)
379 static inline struct brw_reg
380 suboffset(struct brw_reg reg
, unsigned delta
)
382 reg
.subnr
+= delta
* type_sz(reg
.type
);
387 static inline struct brw_reg
388 offset(struct brw_reg reg
, unsigned delta
)
395 static inline struct brw_reg
396 byte_offset(struct brw_reg reg
, unsigned bytes
)
398 unsigned newoffset
= reg
.nr
* REG_SIZE
+ reg
.subnr
+ bytes
;
399 reg
.nr
= newoffset
/ REG_SIZE
;
400 reg
.subnr
= newoffset
% REG_SIZE
;
405 /** Construct unsigned word[16] register */
406 static inline struct brw_reg
407 brw_uw16_reg(unsigned file
, unsigned nr
, unsigned subnr
)
409 return suboffset(retype(brw_vec16_reg(file
, nr
, 0), BRW_REGISTER_TYPE_UW
), subnr
);
412 /** Construct unsigned word[8] register */
413 static inline struct brw_reg
414 brw_uw8_reg(unsigned file
, unsigned nr
, unsigned subnr
)
416 return suboffset(retype(brw_vec8_reg(file
, nr
, 0), BRW_REGISTER_TYPE_UW
), subnr
);
419 /** Construct unsigned word[1] register */
420 static inline struct brw_reg
421 brw_uw1_reg(unsigned file
, unsigned nr
, unsigned subnr
)
423 return suboffset(retype(brw_vec1_reg(file
, nr
, 0), BRW_REGISTER_TYPE_UW
), subnr
);
426 static inline struct brw_reg
427 brw_imm_reg(unsigned type
)
429 return brw_reg(BRW_IMMEDIATE_VALUE
,
433 BRW_VERTICAL_STRIDE_0
,
435 BRW_HORIZONTAL_STRIDE_0
,
440 /** Construct float immediate register */
441 static inline struct brw_reg
444 struct brw_reg imm
= brw_imm_reg(BRW_REGISTER_TYPE_F
);
449 /** Construct integer immediate register */
450 static inline struct brw_reg
453 struct brw_reg imm
= brw_imm_reg(BRW_REGISTER_TYPE_D
);
458 /** Construct uint immediate register */
459 static inline struct brw_reg
460 brw_imm_ud(unsigned ud
)
462 struct brw_reg imm
= brw_imm_reg(BRW_REGISTER_TYPE_UD
);
467 /** Construct ushort immediate register */
468 static inline struct brw_reg
469 brw_imm_uw(uint16_t uw
)
471 struct brw_reg imm
= brw_imm_reg(BRW_REGISTER_TYPE_UW
);
472 imm
.dw1
.ud
= uw
| (uw
<< 16);
476 /** Construct short immediate register */
477 static inline struct brw_reg
480 struct brw_reg imm
= brw_imm_reg(BRW_REGISTER_TYPE_W
);
481 imm
.dw1
.d
= w
| (w
<< 16);
485 /* brw_imm_b and brw_imm_ub aren't supported by hardware - the type
486 * numbers alias with _V and _VF below:
489 /** Construct vector of eight signed half-byte values */
490 static inline struct brw_reg
491 brw_imm_v(unsigned v
)
493 struct brw_reg imm
= brw_imm_reg(BRW_REGISTER_TYPE_V
);
494 imm
.vstride
= BRW_VERTICAL_STRIDE_0
;
495 imm
.width
= BRW_WIDTH_8
;
496 imm
.hstride
= BRW_HORIZONTAL_STRIDE_1
;
501 /** Construct vector of four 8-bit float values */
502 static inline struct brw_reg
503 brw_imm_vf(unsigned v
)
505 struct brw_reg imm
= brw_imm_reg(BRW_REGISTER_TYPE_VF
);
506 imm
.vstride
= BRW_VERTICAL_STRIDE_0
;
507 imm
.width
= BRW_WIDTH_4
;
508 imm
.hstride
= BRW_HORIZONTAL_STRIDE_1
;
515 #define VF_NEG (1<<7)
517 static inline struct brw_reg
518 brw_imm_vf4(unsigned v0
, unsigned v1
, unsigned v2
, unsigned v3
)
520 struct brw_reg imm
= brw_imm_reg(BRW_REGISTER_TYPE_VF
);
521 imm
.vstride
= BRW_VERTICAL_STRIDE_0
;
522 imm
.width
= BRW_WIDTH_4
;
523 imm
.hstride
= BRW_HORIZONTAL_STRIDE_1
;
524 imm
.dw1
.ud
= ((v0
<< 0) | (v1
<< 8) | (v2
<< 16) | (v3
<< 24));
529 static inline struct brw_reg
530 brw_address(struct brw_reg reg
)
532 return brw_imm_uw(reg
.nr
* REG_SIZE
+ reg
.subnr
);
535 /** Construct float[1] general-purpose register */
536 static inline struct brw_reg
537 brw_vec1_grf(unsigned nr
, unsigned subnr
)
539 return brw_vec1_reg(BRW_GENERAL_REGISTER_FILE
, nr
, subnr
);
542 /** Construct float[2] general-purpose register */
543 static inline struct brw_reg
544 brw_vec2_grf(unsigned nr
, unsigned subnr
)
546 return brw_vec2_reg(BRW_GENERAL_REGISTER_FILE
, nr
, subnr
);
549 /** Construct float[4] general-purpose register */
550 static inline struct brw_reg
551 brw_vec4_grf(unsigned nr
, unsigned subnr
)
553 return brw_vec4_reg(BRW_GENERAL_REGISTER_FILE
, nr
, subnr
);
556 /** Construct float[8] general-purpose register */
557 static inline struct brw_reg
558 brw_vec8_grf(unsigned nr
, unsigned subnr
)
560 return brw_vec8_reg(BRW_GENERAL_REGISTER_FILE
, nr
, subnr
);
564 static inline struct brw_reg
565 brw_uw8_grf(unsigned nr
, unsigned subnr
)
567 return brw_uw8_reg(BRW_GENERAL_REGISTER_FILE
, nr
, subnr
);
570 static inline struct brw_reg
571 brw_uw16_grf(unsigned nr
, unsigned subnr
)
573 return brw_uw16_reg(BRW_GENERAL_REGISTER_FILE
, nr
, subnr
);
577 /** Construct null register (usually used for setting condition codes) */
578 static inline struct brw_reg
581 return brw_vec8_reg(BRW_ARCHITECTURE_REGISTER_FILE
, BRW_ARF_NULL
, 0);
584 static inline struct brw_reg
585 brw_address_reg(unsigned subnr
)
587 return brw_uw1_reg(BRW_ARCHITECTURE_REGISTER_FILE
, BRW_ARF_ADDRESS
, subnr
);
590 /* If/else instructions break in align16 mode if writemask & swizzle
591 * aren't xyzw. This goes against the convention for other scalar
594 static inline struct brw_reg
597 return brw_reg(BRW_ARCHITECTURE_REGISTER_FILE
,
600 BRW_REGISTER_TYPE_UD
,
601 BRW_VERTICAL_STRIDE_4
, /* ? */
603 BRW_HORIZONTAL_STRIDE_0
,
604 BRW_SWIZZLE_XYZW
, /* NOTE! */
605 WRITEMASK_XYZW
); /* NOTE! */
608 static inline struct brw_reg
611 return brw_vec8_reg(BRW_ARCHITECTURE_REGISTER_FILE
, BRW_ARF_ACCUMULATOR
, 0);
614 static inline struct brw_reg
615 brw_notification_1_reg(void)
618 return brw_reg(BRW_ARCHITECTURE_REGISTER_FILE
,
619 BRW_ARF_NOTIFICATION_COUNT
,
621 BRW_REGISTER_TYPE_UD
,
622 BRW_VERTICAL_STRIDE_0
,
624 BRW_HORIZONTAL_STRIDE_0
,
630 static inline struct brw_reg
631 brw_flag_reg(int reg
, int subreg
)
633 return brw_uw1_reg(BRW_ARCHITECTURE_REGISTER_FILE
,
634 BRW_ARF_FLAG
+ reg
, subreg
);
638 static inline struct brw_reg
639 brw_mask_reg(unsigned subnr
)
641 return brw_uw1_reg(BRW_ARCHITECTURE_REGISTER_FILE
, BRW_ARF_MASK
, subnr
);
644 static inline struct brw_reg
645 brw_message_reg(unsigned nr
)
647 assert((nr
& ~(1 << 7)) < BRW_MAX_MRF
);
648 return brw_vec8_reg(BRW_MESSAGE_REGISTER_FILE
, nr
, 0);
651 static inline struct brw_reg
652 brw_uvec_mrf(unsigned width
, unsigned nr
, unsigned subnr
)
654 return retype(brw_vecn_reg(width
, BRW_MESSAGE_REGISTER_FILE
, nr
, subnr
),
655 BRW_REGISTER_TYPE_UD
);
658 /* This is almost always called with a numeric constant argument, so
659 * make things easy to evaluate at compile time:
661 static inline unsigned cvt(unsigned val
)
675 static inline struct brw_reg
676 stride(struct brw_reg reg
, unsigned vstride
, unsigned width
, unsigned hstride
)
678 reg
.vstride
= cvt(vstride
);
679 reg
.width
= cvt(width
) - 1;
680 reg
.hstride
= cvt(hstride
);
685 static inline struct brw_reg
686 vec16(struct brw_reg reg
)
688 return stride(reg
, 16,16,1);
691 static inline struct brw_reg
692 vec8(struct brw_reg reg
)
694 return stride(reg
, 8,8,1);
697 static inline struct brw_reg
698 vec4(struct brw_reg reg
)
700 return stride(reg
, 4,4,1);
703 static inline struct brw_reg
704 vec2(struct brw_reg reg
)
706 return stride(reg
, 2,2,1);
709 static inline struct brw_reg
710 vec1(struct brw_reg reg
)
712 return stride(reg
, 0,1,0);
716 static inline struct brw_reg
717 get_element(struct brw_reg reg
, unsigned elt
)
719 return vec1(suboffset(reg
, elt
));
722 static inline struct brw_reg
723 get_element_ud(struct brw_reg reg
, unsigned elt
)
725 return vec1(suboffset(retype(reg
, BRW_REGISTER_TYPE_UD
), elt
));
728 static inline struct brw_reg
729 get_element_d(struct brw_reg reg
, unsigned elt
)
731 return vec1(suboffset(retype(reg
, BRW_REGISTER_TYPE_D
), elt
));
735 static inline struct brw_reg
736 brw_swizzle(struct brw_reg reg
, unsigned x
, unsigned y
, unsigned z
, unsigned w
)
738 assert(reg
.file
!= BRW_IMMEDIATE_VALUE
);
740 reg
.dw1
.bits
.swizzle
= BRW_SWIZZLE4(BRW_GET_SWZ(reg
.dw1
.bits
.swizzle
, x
),
741 BRW_GET_SWZ(reg
.dw1
.bits
.swizzle
, y
),
742 BRW_GET_SWZ(reg
.dw1
.bits
.swizzle
, z
),
743 BRW_GET_SWZ(reg
.dw1
.bits
.swizzle
, w
));
748 static inline struct brw_reg
749 brw_swizzle1(struct brw_reg reg
, unsigned x
)
751 return brw_swizzle(reg
, x
, x
, x
, x
);
754 static inline struct brw_reg
755 brw_writemask(struct brw_reg reg
, unsigned mask
)
757 assert(reg
.file
!= BRW_IMMEDIATE_VALUE
);
758 reg
.dw1
.bits
.writemask
&= mask
;
762 static inline struct brw_reg
763 brw_set_writemask(struct brw_reg reg
, unsigned mask
)
765 assert(reg
.file
!= BRW_IMMEDIATE_VALUE
);
766 reg
.dw1
.bits
.writemask
= mask
;
770 static inline struct brw_reg
771 negate(struct brw_reg reg
)
777 static inline struct brw_reg
778 brw_abs(struct brw_reg reg
)
785 /************************************************************************/
787 static inline struct brw_reg
788 brw_vec4_indirect(unsigned subnr
, int offset
)
790 struct brw_reg reg
= brw_vec4_grf(0, 0);
792 reg
.address_mode
= BRW_ADDRESS_REGISTER_INDIRECT_REGISTER
;
793 reg
.dw1
.bits
.indirect_offset
= offset
;
797 static inline struct brw_reg
798 brw_vec1_indirect(unsigned subnr
, int offset
)
800 struct brw_reg reg
= brw_vec1_grf(0, 0);
802 reg
.address_mode
= BRW_ADDRESS_REGISTER_INDIRECT_REGISTER
;
803 reg
.dw1
.bits
.indirect_offset
= offset
;
807 static inline struct brw_reg
808 deref_4f(struct brw_indirect ptr
, int offset
)
810 return brw_vec4_indirect(ptr
.addr_subnr
, ptr
.addr_offset
+ offset
);
813 static inline struct brw_reg
814 deref_1f(struct brw_indirect ptr
, int offset
)
816 return brw_vec1_indirect(ptr
.addr_subnr
, ptr
.addr_offset
+ offset
);
819 static inline struct brw_reg
820 deref_4b(struct brw_indirect ptr
, int offset
)
822 return retype(deref_4f(ptr
, offset
), BRW_REGISTER_TYPE_B
);
825 static inline struct brw_reg
826 deref_1uw(struct brw_indirect ptr
, int offset
)
828 return retype(deref_1f(ptr
, offset
), BRW_REGISTER_TYPE_UW
);
831 static inline struct brw_reg
832 deref_1d(struct brw_indirect ptr
, int offset
)
834 return retype(deref_1f(ptr
, offset
), BRW_REGISTER_TYPE_D
);
837 static inline struct brw_reg
838 deref_1ud(struct brw_indirect ptr
, int offset
)
840 return retype(deref_1f(ptr
, offset
), BRW_REGISTER_TYPE_UD
);
843 static inline struct brw_reg
844 get_addr_reg(struct brw_indirect ptr
)
846 return brw_address_reg(ptr
.addr_subnr
);
849 static inline struct brw_indirect
850 brw_indirect_offset(struct brw_indirect ptr
, int offset
)
852 ptr
.addr_offset
+= offset
;
856 static inline struct brw_indirect
857 brw_indirect(unsigned addr_subnr
, int offset
)
859 struct brw_indirect ptr
;
860 ptr
.addr_subnr
= addr_subnr
;
861 ptr
.addr_offset
= offset
;