1 /**************************************************************************
3 * Copyright 2009 VMware, Inc.
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * 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, sub license, 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 portions
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21 * IN NO EVENT SHALL VMWARE, INC AND/OR ITS SUPPLIERS BE LIABLE FOR
22 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
26 **************************************************************************/
31 #include "pipe/p_defines.h"
32 #include "pipe/p_format.h"
33 #include "pipe/p_compiler.h"
34 #include "pipe/p_shader_tokens.h"
35 #include "util/u_debug.h"
43 struct pipe_stream_output_info
;
45 /* Almost a tgsi_src_register, but we need to pull in the Absolute
46 * flag from the _ext token. Indirect flag always implies ADDR[0].
50 unsigned File
: 4; /* TGSI_FILE_ */
51 unsigned SwizzleX
: 2; /* TGSI_SWIZZLE_ */
52 unsigned SwizzleY
: 2; /* TGSI_SWIZZLE_ */
53 unsigned SwizzleZ
: 2; /* TGSI_SWIZZLE_ */
54 unsigned SwizzleW
: 2; /* TGSI_SWIZZLE_ */
55 unsigned Indirect
: 1; /* BOOL */
56 unsigned DimIndirect
: 1; /* BOOL */
57 unsigned Dimension
: 1; /* BOOL */
58 unsigned Absolute
: 1; /* BOOL */
59 unsigned Negate
: 1; /* BOOL */
60 unsigned IndirectFile
: 4; /* TGSI_FILE_ */
61 unsigned IndirectSwizzle
: 2; /* TGSI_SWIZZLE_ */
62 unsigned DimIndFile
: 4; /* TGSI_FILE_ */
63 unsigned DimIndSwizzle
: 2; /* TGSI_SWIZZLE_ */
64 int Index
: 16; /* SINT */
65 int IndirectIndex
: 16; /* SINT */
66 int DimensionIndex
: 16; /* SINT */
67 int DimIndIndex
: 16; /* SINT */
68 unsigned ArrayID
: 10; /* UINT */
71 /* Very similar to a tgsi_dst_register, removing unsupported fields
72 * and adding a Saturate flag. It's easier to push saturate into the
73 * destination register than to try and create a _SAT variant of each
74 * instruction function.
78 unsigned File
: 4; /* TGSI_FILE_ */
79 unsigned WriteMask
: 4; /* TGSI_WRITEMASK_ */
80 unsigned Indirect
: 1; /* BOOL */
81 unsigned DimIndirect
: 1; /* BOOL */
82 unsigned Dimension
: 1; /* BOOL */
83 unsigned Saturate
: 1; /* BOOL */
84 unsigned Invariant
: 1; /* BOOL */
85 int Index
: 16; /* SINT */
86 int IndirectIndex
: 16; /* SINT */
87 unsigned IndirectFile
: 4; /* TGSI_FILE_ */
88 int IndirectSwizzle
: 2; /* TGSI_SWIZZLE_ */
89 unsigned DimIndFile
: 4; /* TGSI_FILE_ */
90 unsigned DimIndSwizzle
: 2; /* TGSI_SWIZZLE_ */
91 int DimensionIndex
: 16; /* SINT */
92 int DimIndIndex
: 16; /* SINT */
93 unsigned ArrayID
: 10; /* UINT */
99 ureg_create(enum pipe_shader_type processor
);
101 struct ureg_program
*
102 ureg_create_with_screen(enum pipe_shader_type processor
,
103 struct pipe_screen
*screen
);
105 const struct tgsi_token
*
106 ureg_finalize( struct ureg_program
* );
108 /* Create and return a shader:
111 ureg_create_shader( struct ureg_program
*,
112 struct pipe_context
*pipe
,
113 const struct pipe_stream_output_info
*so
);
116 ureg_set_next_shader_processor(struct ureg_program
*ureg
, unsigned processor
);
118 /* Alternately, return the built token stream and hand ownership of
119 * that memory to the caller:
121 const struct tgsi_token
*
122 ureg_get_tokens( struct ureg_program
*ureg
,
123 unsigned *nr_tokens
);
126 * Returns the number of currently declared outputs.
129 ureg_get_nr_outputs( const struct ureg_program
*ureg
);
132 /* Free the tokens created by ureg_get_tokens() */
133 void ureg_free_tokens( const struct tgsi_token
*tokens
);
137 ureg_destroy( struct ureg_program
* );
140 /***********************************************************************
141 * Convenience routine:
144 ureg_create_shader_with_so_and_destroy( struct ureg_program
*p
,
145 struct pipe_context
*pipe
,
146 const struct pipe_stream_output_info
*so
)
148 void *result
= ureg_create_shader( p
, pipe
, so
);
154 ureg_create_shader_and_destroy( struct ureg_program
*p
,
155 struct pipe_context
*pipe
)
157 return ureg_create_shader_with_so_and_destroy(p
, pipe
, NULL
);
161 /***********************************************************************
162 * Build shader properties:
166 ureg_property(struct ureg_program
*ureg
, unsigned name
, unsigned value
);
169 /***********************************************************************
170 * Build shader declarations:
174 ureg_DECL_fs_input_cyl_centroid_layout(struct ureg_program
*,
175 enum tgsi_semantic semantic_name
,
176 unsigned semantic_index
,
177 enum tgsi_interpolate_mode interp_mode
,
178 unsigned cylindrical_wrap
,
179 enum tgsi_interpolate_loc interp_location
,
183 unsigned array_size
);
186 ureg_DECL_fs_input_cyl_centroid(struct ureg_program
*,
187 enum tgsi_semantic semantic_name
,
188 unsigned semantic_index
,
189 enum tgsi_interpolate_mode interp_mode
,
190 unsigned cylindrical_wrap
,
191 enum tgsi_interpolate_loc interp_location
,
193 unsigned array_size
);
195 static inline struct ureg_src
196 ureg_DECL_fs_input_cyl(struct ureg_program
*ureg
,
197 enum tgsi_semantic semantic_name
,
198 unsigned semantic_index
,
199 enum tgsi_interpolate_mode interp_mode
,
200 unsigned cylindrical_wrap
)
202 return ureg_DECL_fs_input_cyl_centroid(ureg
,
207 TGSI_INTERPOLATE_LOC_CENTER
, 0, 1);
210 static inline struct ureg_src
211 ureg_DECL_fs_input(struct ureg_program
*ureg
,
212 enum tgsi_semantic semantic_name
,
213 unsigned semantic_index
,
214 enum tgsi_interpolate_mode interp_mode
)
216 return ureg_DECL_fs_input_cyl_centroid(ureg
,
220 0, TGSI_INTERPOLATE_LOC_CENTER
, 0, 1);
224 ureg_DECL_vs_input( struct ureg_program
*,
228 ureg_DECL_input_layout(struct ureg_program
*,
229 enum tgsi_semantic semantic_name
,
230 unsigned semantic_index
,
234 unsigned array_size
);
237 ureg_DECL_input(struct ureg_program
*,
238 enum tgsi_semantic semantic_name
,
239 unsigned semantic_index
,
241 unsigned array_size
);
244 ureg_DECL_system_value(struct ureg_program
*,
245 enum tgsi_semantic semantic_name
,
246 unsigned semantic_index
);
249 ureg_DECL_output_layout(struct ureg_program
*,
250 enum tgsi_semantic semantic_name
,
251 unsigned semantic_index
,
260 ureg_DECL_output_masked(struct ureg_program
*,
261 enum tgsi_semantic semantic_name
,
262 unsigned semantic_index
,
265 unsigned array_size
);
268 ureg_DECL_output(struct ureg_program
*,
269 enum tgsi_semantic semantic_name
,
270 unsigned semantic_index
);
273 ureg_DECL_output_array(struct ureg_program
*ureg
,
274 enum tgsi_semantic semantic_name
,
275 unsigned semantic_index
,
277 unsigned array_size
);
280 ureg_DECL_immediate( struct ureg_program
*,
285 ureg_DECL_immediate_f64( struct ureg_program
*,
290 ureg_DECL_immediate_uint( struct ureg_program
*,
295 ureg_DECL_immediate_block_uint( struct ureg_program
*,
300 ureg_DECL_immediate_int( struct ureg_program
*,
305 ureg_DECL_immediate_uint64( struct ureg_program
*,
310 ureg_DECL_immediate_int64( struct ureg_program
*,
315 ureg_DECL_constant2D(struct ureg_program
*ureg
,
321 ureg_DECL_constant( struct ureg_program
*,
325 ureg_DECL_hw_atomic(struct ureg_program
*ureg
,
332 ureg_DECL_temporary( struct ureg_program
* );
335 * Emit a temporary with the LOCAL declaration flag set. For use when
336 * the register value is not required to be preserved across
337 * subroutine boundaries.
340 ureg_DECL_local_temporary( struct ureg_program
* );
343 * Declare "size" continuous temporary registers.
346 ureg_DECL_array_temporary( struct ureg_program
*,
351 ureg_release_temporary( struct ureg_program
*ureg
,
352 struct ureg_dst tmp
);
355 ureg_DECL_address( struct ureg_program
* );
357 /* Supply an index to the sampler declaration as this is the hook to
358 * the external pipe_sampler state. Users of this function probably
359 * don't want just any sampler, but a specific one which they've set
360 * up state for in the context.
363 ureg_DECL_sampler( struct ureg_program
*,
367 ureg_DECL_sampler_view(struct ureg_program
*,
369 enum tgsi_texture_type target
,
370 enum tgsi_return_type return_type_x
,
371 enum tgsi_return_type return_type_y
,
372 enum tgsi_return_type return_type_z
,
373 enum tgsi_return_type return_type_w
);
376 ureg_DECL_image(struct ureg_program
*ureg
,
378 enum tgsi_texture_type target
,
379 enum pipe_format format
,
384 ureg_DECL_buffer(struct ureg_program
*ureg
, unsigned nr
, bool atomic
);
387 ureg_DECL_memory(struct ureg_program
*ureg
, unsigned memory_type
);
389 static inline struct ureg_src
390 ureg_imm4f( struct ureg_program
*ureg
,
399 return ureg_DECL_immediate( ureg
, v
, 4 );
402 static inline struct ureg_src
403 ureg_imm3f( struct ureg_program
*ureg
,
411 return ureg_DECL_immediate( ureg
, v
, 3 );
414 static inline struct ureg_src
415 ureg_imm2f( struct ureg_program
*ureg
,
421 return ureg_DECL_immediate( ureg
, v
, 2 );
424 static inline struct ureg_src
425 ureg_imm1f( struct ureg_program
*ureg
,
430 return ureg_DECL_immediate( ureg
, v
, 1 );
433 static inline struct ureg_src
434 ureg_imm4u( struct ureg_program
*ureg
,
435 unsigned a
, unsigned b
,
436 unsigned c
, unsigned d
)
443 return ureg_DECL_immediate_uint( ureg
, v
, 4 );
446 static inline struct ureg_src
447 ureg_imm3u( struct ureg_program
*ureg
,
448 unsigned a
, unsigned b
,
455 return ureg_DECL_immediate_uint( ureg
, v
, 3 );
458 static inline struct ureg_src
459 ureg_imm2u( struct ureg_program
*ureg
,
460 unsigned a
, unsigned b
)
465 return ureg_DECL_immediate_uint( ureg
, v
, 2 );
468 static inline struct ureg_src
469 ureg_imm1u( struct ureg_program
*ureg
,
472 return ureg_DECL_immediate_uint( ureg
, &a
, 1 );
475 static inline struct ureg_src
476 ureg_imm4i( struct ureg_program
*ureg
,
485 return ureg_DECL_immediate_int( ureg
, v
, 4 );
488 static inline struct ureg_src
489 ureg_imm3i( struct ureg_program
*ureg
,
497 return ureg_DECL_immediate_int( ureg
, v
, 3 );
500 static inline struct ureg_src
501 ureg_imm2i( struct ureg_program
*ureg
,
507 return ureg_DECL_immediate_int( ureg
, v
, 2 );
510 static inline struct ureg_src
511 ureg_imm1i( struct ureg_program
*ureg
,
514 return ureg_DECL_immediate_int( ureg
, &a
, 1 );
517 /* Where the destination register has a valid file, but an empty
520 static inline boolean
521 ureg_dst_is_empty( struct ureg_dst dst
)
523 return dst
.File
!= TGSI_FILE_NULL
&&
527 /***********************************************************************
528 * Functions for patching up labels
532 /* Will return a number which can be used in a label to point to the
533 * next instruction to be emitted.
536 ureg_get_instruction_number( struct ureg_program
*ureg
);
539 /* Patch a given label (expressed as a token number) to point to a
540 * given instruction (expressed as an instruction number).
542 * Labels are obtained from instruction emitters, eg ureg_CAL().
543 * Instruction numbers are obtained from ureg_get_instruction_number(),
547 ureg_fixup_label(struct ureg_program
*ureg
,
548 unsigned label_token
,
549 unsigned instruction_number
);
552 /* Generic instruction emitter. Use if you need to pass the opcode as
553 * a parameter, rather than using the emit_OP() variants below.
556 ureg_insn(struct ureg_program
*ureg
,
557 enum tgsi_opcode opcode
,
558 const struct ureg_dst
*dst
,
560 const struct ureg_src
*src
,
566 ureg_tex_insn(struct ureg_program
*ureg
,
567 enum tgsi_opcode opcode
,
568 const struct ureg_dst
*dst
,
570 enum tgsi_texture_type target
,
571 enum tgsi_return_type return_type
,
572 const struct tgsi_texture_offset
*texoffsets
,
574 const struct ureg_src
*src
,
579 ureg_memory_insn(struct ureg_program
*ureg
,
580 enum tgsi_opcode opcode
,
581 const struct ureg_dst
*dst
,
583 const struct ureg_src
*src
,
586 enum tgsi_texture_type texture
,
587 enum pipe_format format
);
589 /***********************************************************************
590 * Internal instruction helpers, don't call these directly:
593 struct ureg_emit_insn_result
{
594 unsigned insn_token
; /*< Used to fixup insn size. */
595 unsigned extended_token
; /*< Used to set the Extended bit, usually the same as insn_token. */
598 struct ureg_emit_insn_result
599 ureg_emit_insn(struct ureg_program
*ureg
,
600 enum tgsi_opcode opcode
,
607 ureg_emit_label(struct ureg_program
*ureg
,
609 unsigned *label_token
);
612 ureg_emit_texture(struct ureg_program
*ureg
,
614 enum tgsi_texture_type target
,
615 enum tgsi_return_type return_type
,
616 unsigned num_offsets
);
619 ureg_emit_texture_offset(struct ureg_program
*ureg
,
620 const struct tgsi_texture_offset
*offset
);
623 ureg_emit_memory(struct ureg_program
*ureg
,
626 enum tgsi_texture_type texture
,
627 enum pipe_format format
);
630 ureg_emit_dst( struct ureg_program
*ureg
,
631 struct ureg_dst dst
);
634 ureg_emit_src( struct ureg_program
*ureg
,
635 struct ureg_src src
);
638 ureg_fixup_insn_size(struct ureg_program
*ureg
,
643 static inline void ureg_##op( struct ureg_program *ureg ) \
645 enum tgsi_opcode opcode = TGSI_OPCODE_##op; \
646 struct ureg_emit_insn_result insn; \
647 insn = ureg_emit_insn(ureg, \
653 ureg_fixup_insn_size( ureg, insn.insn_token ); \
657 static inline void ureg_##op( struct ureg_program *ureg, \
658 struct ureg_src src ) \
660 enum tgsi_opcode opcode = TGSI_OPCODE_##op; \
661 struct ureg_emit_insn_result insn; \
662 insn = ureg_emit_insn(ureg, \
668 ureg_emit_src( ureg, src ); \
669 ureg_fixup_insn_size( ureg, insn.insn_token ); \
672 #define OP00_LBL( op ) \
673 static inline void ureg_##op( struct ureg_program *ureg, \
674 unsigned *label_token ) \
676 enum tgsi_opcode opcode = TGSI_OPCODE_##op; \
677 struct ureg_emit_insn_result insn; \
678 insn = ureg_emit_insn(ureg, \
684 ureg_emit_label( ureg, insn.extended_token, label_token ); \
685 ureg_fixup_insn_size( ureg, insn.insn_token ); \
688 #define OP01_LBL( op ) \
689 static inline void ureg_##op( struct ureg_program *ureg, \
690 struct ureg_src src, \
691 unsigned *label_token ) \
693 enum tgsi_opcode opcode = TGSI_OPCODE_##op; \
694 struct ureg_emit_insn_result insn; \
695 insn = ureg_emit_insn(ureg, \
701 ureg_emit_label( ureg, insn.extended_token, label_token ); \
702 ureg_emit_src( ureg, src ); \
703 ureg_fixup_insn_size( ureg, insn.insn_token ); \
707 static inline void ureg_##op( struct ureg_program *ureg, \
708 struct ureg_dst dst ) \
710 enum tgsi_opcode opcode = TGSI_OPCODE_##op; \
711 struct ureg_emit_insn_result insn; \
712 if (ureg_dst_is_empty(dst)) \
714 insn = ureg_emit_insn(ureg, \
720 ureg_emit_dst( ureg, dst ); \
721 ureg_fixup_insn_size( ureg, insn.insn_token ); \
726 static inline void ureg_##op( struct ureg_program *ureg, \
727 struct ureg_dst dst, \
728 struct ureg_src src ) \
730 enum tgsi_opcode opcode = TGSI_OPCODE_##op; \
731 struct ureg_emit_insn_result insn; \
732 if (ureg_dst_is_empty(dst)) \
734 insn = ureg_emit_insn(ureg, \
740 ureg_emit_dst( ureg, dst ); \
741 ureg_emit_src( ureg, src ); \
742 ureg_fixup_insn_size( ureg, insn.insn_token ); \
746 static inline void ureg_##op( struct ureg_program *ureg, \
747 struct ureg_dst dst, \
748 struct ureg_src src0, \
749 struct ureg_src src1 ) \
751 enum tgsi_opcode opcode = TGSI_OPCODE_##op; \
752 struct ureg_emit_insn_result insn; \
753 if (ureg_dst_is_empty(dst)) \
755 insn = ureg_emit_insn(ureg, \
761 ureg_emit_dst( ureg, dst ); \
762 ureg_emit_src( ureg, src0 ); \
763 ureg_emit_src( ureg, src1 ); \
764 ureg_fixup_insn_size( ureg, insn.insn_token ); \
767 #define OP12_TEX( op ) \
768 static inline void ureg_##op( struct ureg_program *ureg, \
769 struct ureg_dst dst, \
770 enum tgsi_texture_type target, \
771 struct ureg_src src0, \
772 struct ureg_src src1 ) \
774 enum tgsi_opcode opcode = TGSI_OPCODE_##op; \
775 enum tgsi_return_type return_type = TGSI_RETURN_TYPE_UNKNOWN; \
776 struct ureg_emit_insn_result insn; \
777 if (ureg_dst_is_empty(dst)) \
779 insn = ureg_emit_insn(ureg, \
785 ureg_emit_texture( ureg, insn.extended_token, target, \
787 ureg_emit_dst( ureg, dst ); \
788 ureg_emit_src( ureg, src0 ); \
789 ureg_emit_src( ureg, src1 ); \
790 ureg_fixup_insn_size( ureg, insn.insn_token ); \
794 static inline void ureg_##op( struct ureg_program *ureg, \
795 struct ureg_dst dst, \
796 struct ureg_src src0, \
797 struct ureg_src src1, \
798 struct ureg_src src2 ) \
800 enum tgsi_opcode opcode = TGSI_OPCODE_##op; \
801 struct ureg_emit_insn_result insn; \
802 if (ureg_dst_is_empty(dst)) \
804 insn = ureg_emit_insn(ureg, \
810 ureg_emit_dst( ureg, dst ); \
811 ureg_emit_src( ureg, src0 ); \
812 ureg_emit_src( ureg, src1 ); \
813 ureg_emit_src( ureg, src2 ); \
814 ureg_fixup_insn_size( ureg, insn.insn_token ); \
817 #define OP14_TEX( op ) \
818 static inline void ureg_##op( struct ureg_program *ureg, \
819 struct ureg_dst dst, \
820 enum tgsi_texture_type target, \
821 struct ureg_src src0, \
822 struct ureg_src src1, \
823 struct ureg_src src2, \
824 struct ureg_src src3 ) \
826 enum tgsi_opcode opcode = TGSI_OPCODE_##op; \
827 enum tgsi_return_type return_type = TGSI_RETURN_TYPE_UNKNOWN; \
828 struct ureg_emit_insn_result insn; \
829 if (ureg_dst_is_empty(dst)) \
831 insn = ureg_emit_insn(ureg, \
837 ureg_emit_texture( ureg, insn.extended_token, target, \
839 ureg_emit_dst( ureg, dst ); \
840 ureg_emit_src( ureg, src0 ); \
841 ureg_emit_src( ureg, src1 ); \
842 ureg_emit_src( ureg, src2 ); \
843 ureg_emit_src( ureg, src3 ); \
844 ureg_fixup_insn_size( ureg, insn.insn_token ); \
847 /* Use a template include to generate a correctly-typed ureg_OP()
848 * function for each TGSI opcode:
850 #include "tgsi_opcode_tmp.h"
853 /***********************************************************************
854 * Inline helpers for manipulating register structs:
856 static inline struct ureg_src
857 ureg_negate( struct ureg_src reg
)
859 assert(reg
.File
!= TGSI_FILE_NULL
);
864 static inline struct ureg_src
865 ureg_abs( struct ureg_src reg
)
867 assert(reg
.File
!= TGSI_FILE_NULL
);
873 static inline struct ureg_src
874 ureg_swizzle( struct ureg_src reg
,
875 int x
, int y
, int z
, int w
)
877 unsigned swz
= ( (reg
.SwizzleX
<< 0) |
878 (reg
.SwizzleY
<< 2) |
879 (reg
.SwizzleZ
<< 4) |
880 (reg
.SwizzleW
<< 6));
882 assert(reg
.File
!= TGSI_FILE_NULL
);
888 reg
.SwizzleX
= (swz
>> (x
*2)) & 0x3;
889 reg
.SwizzleY
= (swz
>> (y
*2)) & 0x3;
890 reg
.SwizzleZ
= (swz
>> (z
*2)) & 0x3;
891 reg
.SwizzleW
= (swz
>> (w
*2)) & 0x3;
895 static inline struct ureg_src
896 ureg_scalar( struct ureg_src reg
, int x
)
898 return ureg_swizzle(reg
, x
, x
, x
, x
);
901 static inline struct ureg_dst
902 ureg_writemask( struct ureg_dst reg
,
905 assert(reg
.File
!= TGSI_FILE_NULL
);
906 reg
.WriteMask
&= writemask
;
910 static inline struct ureg_dst
911 ureg_saturate( struct ureg_dst reg
)
913 assert(reg
.File
!= TGSI_FILE_NULL
);
918 static inline struct ureg_dst
919 ureg_dst_indirect( struct ureg_dst reg
, struct ureg_src addr
)
921 assert(reg
.File
!= TGSI_FILE_NULL
);
923 reg
.IndirectFile
= addr
.File
;
924 reg
.IndirectIndex
= addr
.Index
;
925 reg
.IndirectSwizzle
= addr
.SwizzleX
;
929 static inline struct ureg_src
930 ureg_src_indirect( struct ureg_src reg
, struct ureg_src addr
)
932 assert(reg
.File
!= TGSI_FILE_NULL
);
934 reg
.IndirectFile
= addr
.File
;
935 reg
.IndirectIndex
= addr
.Index
;
936 reg
.IndirectSwizzle
= addr
.SwizzleX
;
940 static inline struct ureg_dst
941 ureg_dst_dimension( struct ureg_dst reg
, int index
)
943 assert(reg
.File
!= TGSI_FILE_NULL
);
946 reg
.DimensionIndex
= index
;
950 static inline struct ureg_src
951 ureg_src_dimension( struct ureg_src reg
, int index
)
953 assert(reg
.File
!= TGSI_FILE_NULL
);
956 reg
.DimensionIndex
= index
;
960 static inline struct ureg_dst
961 ureg_dst_dimension_indirect( struct ureg_dst reg
, struct ureg_src addr
,
964 assert(reg
.File
!= TGSI_FILE_NULL
);
967 reg
.DimensionIndex
= index
;
968 reg
.DimIndFile
= addr
.File
;
969 reg
.DimIndIndex
= addr
.Index
;
970 reg
.DimIndSwizzle
= addr
.SwizzleX
;
974 static inline struct ureg_src
975 ureg_src_dimension_indirect( struct ureg_src reg
, struct ureg_src addr
,
978 assert(reg
.File
!= TGSI_FILE_NULL
);
981 reg
.DimensionIndex
= index
;
982 reg
.DimIndFile
= addr
.File
;
983 reg
.DimIndIndex
= addr
.Index
;
984 reg
.DimIndSwizzle
= addr
.SwizzleX
;
988 static inline struct ureg_src
989 ureg_src_array_offset(struct ureg_src reg
, int offset
)
995 static inline struct ureg_dst
996 ureg_dst_array_offset( struct ureg_dst reg
, int offset
)
1002 static inline struct ureg_dst
1003 ureg_dst_array_register(unsigned file
,
1007 struct ureg_dst dst
;
1010 dst
.WriteMask
= TGSI_WRITEMASK_XYZW
;
1012 dst
.IndirectFile
= TGSI_FILE_NULL
;
1013 dst
.IndirectIndex
= 0;
1014 dst
.IndirectSwizzle
= 0;
1018 dst
.DimensionIndex
= 0;
1019 dst
.DimIndirect
= 0;
1020 dst
.DimIndFile
= TGSI_FILE_NULL
;
1021 dst
.DimIndIndex
= 0;
1022 dst
.DimIndSwizzle
= 0;
1023 dst
.ArrayID
= array_id
;
1029 static inline struct ureg_dst
1030 ureg_dst_register(unsigned file
,
1033 return ureg_dst_array_register(file
, index
, 0);
1036 static inline struct ureg_dst
1037 ureg_dst( struct ureg_src src
)
1039 struct ureg_dst dst
;
1041 dst
.File
= src
.File
;
1042 dst
.WriteMask
= TGSI_WRITEMASK_XYZW
;
1043 dst
.IndirectFile
= src
.IndirectFile
;
1044 dst
.Indirect
= src
.Indirect
;
1045 dst
.IndirectIndex
= src
.IndirectIndex
;
1046 dst
.IndirectSwizzle
= src
.IndirectSwizzle
;
1048 dst
.Index
= src
.Index
;
1049 dst
.Dimension
= src
.Dimension
;
1050 dst
.DimensionIndex
= src
.DimensionIndex
;
1051 dst
.DimIndirect
= src
.DimIndirect
;
1052 dst
.DimIndFile
= src
.DimIndFile
;
1053 dst
.DimIndIndex
= src
.DimIndIndex
;
1054 dst
.DimIndSwizzle
= src
.DimIndSwizzle
;
1055 dst
.ArrayID
= src
.ArrayID
;
1061 static inline struct ureg_src
1062 ureg_src_array_register(unsigned file
,
1066 struct ureg_src src
;
1069 src
.SwizzleX
= TGSI_SWIZZLE_X
;
1070 src
.SwizzleY
= TGSI_SWIZZLE_Y
;
1071 src
.SwizzleZ
= TGSI_SWIZZLE_Z
;
1072 src
.SwizzleW
= TGSI_SWIZZLE_W
;
1074 src
.IndirectFile
= TGSI_FILE_NULL
;
1075 src
.IndirectIndex
= 0;
1076 src
.IndirectSwizzle
= 0;
1081 src
.DimensionIndex
= 0;
1082 src
.DimIndirect
= 0;
1083 src
.DimIndFile
= TGSI_FILE_NULL
;
1084 src
.DimIndIndex
= 0;
1085 src
.DimIndSwizzle
= 0;
1086 src
.ArrayID
= array_id
;
1091 static inline struct ureg_src
1092 ureg_src_register(unsigned file
,
1095 return ureg_src_array_register(file
, index
, 0);
1098 static inline struct ureg_src
1099 ureg_src( struct ureg_dst dst
)
1101 struct ureg_src src
;
1103 src
.File
= dst
.File
;
1104 src
.SwizzleX
= TGSI_SWIZZLE_X
;
1105 src
.SwizzleY
= TGSI_SWIZZLE_Y
;
1106 src
.SwizzleZ
= TGSI_SWIZZLE_Z
;
1107 src
.SwizzleW
= TGSI_SWIZZLE_W
;
1108 src
.Indirect
= dst
.Indirect
;
1109 src
.IndirectFile
= dst
.IndirectFile
;
1110 src
.IndirectIndex
= dst
.IndirectIndex
;
1111 src
.IndirectSwizzle
= dst
.IndirectSwizzle
;
1113 src
.Index
= dst
.Index
;
1115 src
.Dimension
= dst
.Dimension
;
1116 src
.DimensionIndex
= dst
.DimensionIndex
;
1117 src
.DimIndirect
= dst
.DimIndirect
;
1118 src
.DimIndFile
= dst
.DimIndFile
;
1119 src
.DimIndIndex
= dst
.DimIndIndex
;
1120 src
.DimIndSwizzle
= dst
.DimIndSwizzle
;
1121 src
.ArrayID
= dst
.ArrayID
;
1128 static inline struct ureg_dst
1129 ureg_dst_undef( void )
1131 struct ureg_dst dst
;
1133 dst
.File
= TGSI_FILE_NULL
;
1136 dst
.IndirectFile
= TGSI_FILE_NULL
;
1137 dst
.IndirectIndex
= 0;
1138 dst
.IndirectSwizzle
= 0;
1142 dst
.DimensionIndex
= 0;
1143 dst
.DimIndirect
= 0;
1144 dst
.DimIndFile
= TGSI_FILE_NULL
;
1145 dst
.DimIndIndex
= 0;
1146 dst
.DimIndSwizzle
= 0;
1153 static inline struct ureg_src
1154 ureg_src_undef( void )
1156 struct ureg_src src
;
1158 src
.File
= TGSI_FILE_NULL
;
1164 src
.IndirectFile
= TGSI_FILE_NULL
;
1165 src
.IndirectIndex
= 0;
1166 src
.IndirectSwizzle
= 0;
1171 src
.DimensionIndex
= 0;
1172 src
.DimIndirect
= 0;
1173 src
.DimIndFile
= TGSI_FILE_NULL
;
1174 src
.DimIndIndex
= 0;
1175 src
.DimIndSwizzle
= 0;
1181 static inline boolean
1182 ureg_src_is_undef( struct ureg_src src
)
1184 return src
.File
== TGSI_FILE_NULL
;
1187 static inline boolean
1188 ureg_dst_is_undef( struct ureg_dst dst
)
1190 return dst
.File
== TGSI_FILE_NULL
;