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
;
46 /* Almost a tgsi_src_register, but we need to pull in the Absolute
47 * flag from the _ext token. Indirect flag always implies ADDR[0].
51 unsigned File
: 4; /* TGSI_FILE_ */
52 unsigned SwizzleX
: 2; /* TGSI_SWIZZLE_ */
53 unsigned SwizzleY
: 2; /* TGSI_SWIZZLE_ */
54 unsigned SwizzleZ
: 2; /* TGSI_SWIZZLE_ */
55 unsigned SwizzleW
: 2; /* TGSI_SWIZZLE_ */
56 unsigned Indirect
: 1; /* BOOL */
57 unsigned DimIndirect
: 1; /* BOOL */
58 unsigned Dimension
: 1; /* BOOL */
59 unsigned Absolute
: 1; /* BOOL */
60 unsigned Negate
: 1; /* BOOL */
61 unsigned IndirectFile
: 4; /* TGSI_FILE_ */
62 unsigned IndirectSwizzle
: 2; /* TGSI_SWIZZLE_ */
63 unsigned DimIndFile
: 4; /* TGSI_FILE_ */
64 unsigned DimIndSwizzle
: 2; /* TGSI_SWIZZLE_ */
65 int Index
: 16; /* SINT */
66 int IndirectIndex
: 16; /* SINT */
67 int DimensionIndex
: 16; /* SINT */
68 int DimIndIndex
: 16; /* SINT */
69 unsigned ArrayID
: 10; /* UINT */
72 /* Very similar to a tgsi_dst_register, removing unsupported fields
73 * and adding a Saturate flag. It's easier to push saturate into the
74 * destination register than to try and create a _SAT variant of each
75 * instruction function.
79 unsigned File
: 4; /* TGSI_FILE_ */
80 unsigned WriteMask
: 4; /* TGSI_WRITEMASK_ */
81 unsigned Indirect
: 1; /* BOOL */
82 unsigned DimIndirect
: 1; /* BOOL */
83 unsigned Dimension
: 1; /* BOOL */
84 unsigned Saturate
: 1; /* BOOL */
85 unsigned Invariant
: 1; /* BOOL */
86 int Index
: 16; /* SINT */
87 int IndirectIndex
: 16; /* SINT */
88 unsigned IndirectFile
: 4; /* TGSI_FILE_ */
89 int IndirectSwizzle
: 2; /* TGSI_SWIZZLE_ */
90 unsigned DimIndFile
: 4; /* TGSI_FILE_ */
91 unsigned DimIndSwizzle
: 2; /* TGSI_SWIZZLE_ */
92 int DimensionIndex
: 16; /* SINT */
93 int DimIndIndex
: 16; /* SINT */
94 unsigned ArrayID
: 10; /* UINT */
100 ureg_create(enum pipe_shader_type processor
);
102 struct ureg_program
*
103 ureg_create_with_screen(enum pipe_shader_type processor
,
104 struct pipe_screen
*screen
);
106 const struct tgsi_token
*
107 ureg_finalize( struct ureg_program
* );
109 /* Create and return a shader:
112 ureg_create_shader( struct ureg_program
*,
113 struct pipe_context
*pipe
,
114 const struct pipe_stream_output_info
*so
);
117 ureg_set_next_shader_processor(struct ureg_program
*ureg
, unsigned processor
);
119 /* Alternately, return the built token stream and hand ownership of
120 * that memory to the caller:
122 const struct tgsi_token
*
123 ureg_get_tokens( struct ureg_program
*ureg
,
124 unsigned *nr_tokens
);
127 * Returns the number of currently declared outputs.
130 ureg_get_nr_outputs( const struct ureg_program
*ureg
);
133 /* Free the tokens created by ureg_get_tokens() */
134 void ureg_free_tokens( const struct tgsi_token
*tokens
);
138 ureg_destroy( struct ureg_program
* );
141 /***********************************************************************
142 * Convenience routine:
145 ureg_create_shader_with_so_and_destroy( struct ureg_program
*p
,
146 struct pipe_context
*pipe
,
147 const struct pipe_stream_output_info
*so
)
149 void *result
= ureg_create_shader( p
, pipe
, so
);
155 ureg_create_shader_and_destroy( struct ureg_program
*p
,
156 struct pipe_context
*pipe
)
158 return ureg_create_shader_with_so_and_destroy(p
, pipe
, NULL
);
162 /***********************************************************************
163 * Build shader properties:
167 ureg_property(struct ureg_program
*ureg
, unsigned name
, unsigned value
);
170 /***********************************************************************
171 * Build shader declarations:
175 ureg_DECL_fs_input_cyl_centroid_layout(struct ureg_program
*,
176 enum tgsi_semantic semantic_name
,
177 unsigned semantic_index
,
178 enum tgsi_interpolate_mode interp_mode
,
179 unsigned cylindrical_wrap
,
180 enum tgsi_interpolate_loc interp_location
,
184 unsigned array_size
);
187 ureg_DECL_fs_input_cyl_centroid(struct ureg_program
*,
188 enum tgsi_semantic semantic_name
,
189 unsigned semantic_index
,
190 enum tgsi_interpolate_mode interp_mode
,
191 unsigned cylindrical_wrap
,
192 enum tgsi_interpolate_loc interp_location
,
194 unsigned array_size
);
196 static inline struct ureg_src
197 ureg_DECL_fs_input_cyl(struct ureg_program
*ureg
,
198 enum tgsi_semantic semantic_name
,
199 unsigned semantic_index
,
200 enum tgsi_interpolate_mode interp_mode
,
201 unsigned cylindrical_wrap
)
203 return ureg_DECL_fs_input_cyl_centroid(ureg
,
208 TGSI_INTERPOLATE_LOC_CENTER
, 0, 1);
211 static inline struct ureg_src
212 ureg_DECL_fs_input(struct ureg_program
*ureg
,
213 enum tgsi_semantic semantic_name
,
214 unsigned semantic_index
,
215 enum tgsi_interpolate_mode interp_mode
)
217 return ureg_DECL_fs_input_cyl_centroid(ureg
,
221 0, TGSI_INTERPOLATE_LOC_CENTER
, 0, 1);
225 ureg_DECL_vs_input( struct ureg_program
*,
229 ureg_DECL_input_layout(struct ureg_program
*,
230 enum tgsi_semantic semantic_name
,
231 unsigned semantic_index
,
235 unsigned array_size
);
238 ureg_DECL_input(struct ureg_program
*,
239 enum tgsi_semantic semantic_name
,
240 unsigned semantic_index
,
242 unsigned array_size
);
245 ureg_DECL_system_value(struct ureg_program
*,
246 enum tgsi_semantic semantic_name
,
247 unsigned semantic_index
);
250 ureg_DECL_output_layout(struct ureg_program
*,
251 enum tgsi_semantic semantic_name
,
252 unsigned semantic_index
,
261 ureg_DECL_output_masked(struct ureg_program
*,
262 enum tgsi_semantic semantic_name
,
263 unsigned semantic_index
,
266 unsigned array_size
);
269 ureg_DECL_output(struct ureg_program
*,
270 enum tgsi_semantic semantic_name
,
271 unsigned semantic_index
);
274 ureg_DECL_output_array(struct ureg_program
*ureg
,
275 enum tgsi_semantic semantic_name
,
276 unsigned semantic_index
,
278 unsigned array_size
);
281 ureg_DECL_immediate( struct ureg_program
*,
286 ureg_DECL_immediate_f64( struct ureg_program
*,
291 ureg_DECL_immediate_uint( struct ureg_program
*,
296 ureg_DECL_immediate_block_uint( struct ureg_program
*,
301 ureg_DECL_immediate_int( struct ureg_program
*,
306 ureg_DECL_immediate_uint64( struct ureg_program
*,
311 ureg_DECL_immediate_int64( struct ureg_program
*,
316 ureg_DECL_constant2D(struct ureg_program
*ureg
,
322 ureg_DECL_constant( struct ureg_program
*,
326 ureg_DECL_hw_atomic(struct ureg_program
*ureg
,
333 ureg_DECL_temporary( struct ureg_program
* );
336 * Emit a temporary with the LOCAL declaration flag set. For use when
337 * the register value is not required to be preserved across
338 * subroutine boundaries.
341 ureg_DECL_local_temporary( struct ureg_program
* );
344 * Declare "size" continuous temporary registers.
347 ureg_DECL_array_temporary( struct ureg_program
*,
352 ureg_release_temporary( struct ureg_program
*ureg
,
353 struct ureg_dst tmp
);
356 ureg_DECL_address( struct ureg_program
* );
358 /* Supply an index to the sampler declaration as this is the hook to
359 * the external pipe_sampler state. Users of this function probably
360 * don't want just any sampler, but a specific one which they've set
361 * up state for in the context.
364 ureg_DECL_sampler( struct ureg_program
*,
368 ureg_DECL_sampler_view(struct ureg_program
*,
370 enum tgsi_texture_type target
,
371 enum tgsi_return_type return_type_x
,
372 enum tgsi_return_type return_type_y
,
373 enum tgsi_return_type return_type_z
,
374 enum tgsi_return_type return_type_w
);
377 ureg_DECL_image(struct ureg_program
*ureg
,
379 enum tgsi_texture_type target
,
380 enum pipe_format format
,
385 ureg_DECL_buffer(struct ureg_program
*ureg
, unsigned nr
, bool atomic
);
388 ureg_DECL_memory(struct ureg_program
*ureg
, unsigned memory_type
);
390 static inline struct ureg_src
391 ureg_imm4f( struct ureg_program
*ureg
,
400 return ureg_DECL_immediate( ureg
, v
, 4 );
403 static inline struct ureg_src
404 ureg_imm3f( struct ureg_program
*ureg
,
412 return ureg_DECL_immediate( ureg
, v
, 3 );
415 static inline struct ureg_src
416 ureg_imm2f( struct ureg_program
*ureg
,
422 return ureg_DECL_immediate( ureg
, v
, 2 );
425 static inline struct ureg_src
426 ureg_imm1f( struct ureg_program
*ureg
,
431 return ureg_DECL_immediate( ureg
, v
, 1 );
434 static inline struct ureg_src
435 ureg_imm4u( struct ureg_program
*ureg
,
436 unsigned a
, unsigned b
,
437 unsigned c
, unsigned d
)
444 return ureg_DECL_immediate_uint( ureg
, v
, 4 );
447 static inline struct ureg_src
448 ureg_imm3u( struct ureg_program
*ureg
,
449 unsigned a
, unsigned b
,
456 return ureg_DECL_immediate_uint( ureg
, v
, 3 );
459 static inline struct ureg_src
460 ureg_imm2u( struct ureg_program
*ureg
,
461 unsigned a
, unsigned b
)
466 return ureg_DECL_immediate_uint( ureg
, v
, 2 );
469 static inline struct ureg_src
470 ureg_imm1u( struct ureg_program
*ureg
,
473 return ureg_DECL_immediate_uint( ureg
, &a
, 1 );
476 static inline struct ureg_src
477 ureg_imm4i( struct ureg_program
*ureg
,
486 return ureg_DECL_immediate_int( ureg
, v
, 4 );
489 static inline struct ureg_src
490 ureg_imm3i( struct ureg_program
*ureg
,
498 return ureg_DECL_immediate_int( ureg
, v
, 3 );
501 static inline struct ureg_src
502 ureg_imm2i( struct ureg_program
*ureg
,
508 return ureg_DECL_immediate_int( ureg
, v
, 2 );
511 static inline struct ureg_src
512 ureg_imm1i( struct ureg_program
*ureg
,
515 return ureg_DECL_immediate_int( ureg
, &a
, 1 );
518 /* Where the destination register has a valid file, but an empty
521 static inline boolean
522 ureg_dst_is_empty( struct ureg_dst dst
)
524 return dst
.File
!= TGSI_FILE_NULL
&&
528 /***********************************************************************
529 * Functions for patching up labels
533 /* Will return a number which can be used in a label to point to the
534 * next instruction to be emitted.
537 ureg_get_instruction_number( struct ureg_program
*ureg
);
540 /* Patch a given label (expressed as a token number) to point to a
541 * given instruction (expressed as an instruction number).
543 * Labels are obtained from instruction emitters, eg ureg_CAL().
544 * Instruction numbers are obtained from ureg_get_instruction_number(),
548 ureg_fixup_label(struct ureg_program
*ureg
,
549 unsigned label_token
,
550 unsigned instruction_number
);
553 /* Generic instruction emitter. Use if you need to pass the opcode as
554 * a parameter, rather than using the emit_OP() variants below.
557 ureg_insn(struct ureg_program
*ureg
,
558 enum tgsi_opcode opcode
,
559 const struct ureg_dst
*dst
,
561 const struct ureg_src
*src
,
567 ureg_tex_insn(struct ureg_program
*ureg
,
568 enum tgsi_opcode opcode
,
569 const struct ureg_dst
*dst
,
571 enum tgsi_texture_type target
,
572 enum tgsi_return_type return_type
,
573 const struct tgsi_texture_offset
*texoffsets
,
575 const struct ureg_src
*src
,
580 ureg_memory_insn(struct ureg_program
*ureg
,
581 enum tgsi_opcode opcode
,
582 const struct ureg_dst
*dst
,
584 const struct ureg_src
*src
,
587 enum tgsi_texture_type texture
,
588 enum pipe_format format
);
590 /***********************************************************************
591 * Internal instruction helpers, don't call these directly:
594 struct ureg_emit_insn_result
{
595 unsigned insn_token
; /*< Used to fixup insn size. */
596 unsigned extended_token
; /*< Used to set the Extended bit, usually the same as insn_token. */
599 struct ureg_emit_insn_result
600 ureg_emit_insn(struct ureg_program
*ureg
,
601 enum tgsi_opcode opcode
,
608 ureg_emit_label(struct ureg_program
*ureg
,
610 unsigned *label_token
);
613 ureg_emit_texture(struct ureg_program
*ureg
,
615 enum tgsi_texture_type target
,
616 enum tgsi_return_type return_type
,
617 unsigned num_offsets
);
620 ureg_emit_texture_offset(struct ureg_program
*ureg
,
621 const struct tgsi_texture_offset
*offset
);
624 ureg_emit_memory(struct ureg_program
*ureg
,
627 enum tgsi_texture_type texture
,
628 enum pipe_format format
);
631 ureg_emit_dst( struct ureg_program
*ureg
,
632 struct ureg_dst dst
);
635 ureg_emit_src( struct ureg_program
*ureg
,
636 struct ureg_src src
);
639 ureg_fixup_insn_size(struct ureg_program
*ureg
,
644 static inline void ureg_##op( struct ureg_program *ureg ) \
646 enum tgsi_opcode opcode = TGSI_OPCODE_##op; \
647 struct ureg_emit_insn_result insn; \
648 insn = ureg_emit_insn(ureg, \
654 ureg_fixup_insn_size( ureg, insn.insn_token ); \
658 static inline void ureg_##op( struct ureg_program *ureg, \
659 struct ureg_src src ) \
661 enum tgsi_opcode opcode = TGSI_OPCODE_##op; \
662 struct ureg_emit_insn_result insn; \
663 insn = ureg_emit_insn(ureg, \
669 ureg_emit_src( ureg, src ); \
670 ureg_fixup_insn_size( ureg, insn.insn_token ); \
673 #define OP00_LBL( op ) \
674 static inline void ureg_##op( struct ureg_program *ureg, \
675 unsigned *label_token ) \
677 enum tgsi_opcode opcode = TGSI_OPCODE_##op; \
678 struct ureg_emit_insn_result insn; \
679 insn = ureg_emit_insn(ureg, \
685 ureg_emit_label( ureg, insn.extended_token, label_token ); \
686 ureg_fixup_insn_size( ureg, insn.insn_token ); \
689 #define OP01_LBL( op ) \
690 static inline void ureg_##op( struct ureg_program *ureg, \
691 struct ureg_src src, \
692 unsigned *label_token ) \
694 enum tgsi_opcode opcode = TGSI_OPCODE_##op; \
695 struct ureg_emit_insn_result insn; \
696 insn = ureg_emit_insn(ureg, \
702 ureg_emit_label( ureg, insn.extended_token, label_token ); \
703 ureg_emit_src( ureg, src ); \
704 ureg_fixup_insn_size( ureg, insn.insn_token ); \
708 static inline void ureg_##op( struct ureg_program *ureg, \
709 struct ureg_dst dst ) \
711 enum tgsi_opcode opcode = TGSI_OPCODE_##op; \
712 struct ureg_emit_insn_result insn; \
713 if (ureg_dst_is_empty(dst)) \
715 insn = ureg_emit_insn(ureg, \
721 ureg_emit_dst( ureg, dst ); \
722 ureg_fixup_insn_size( ureg, insn.insn_token ); \
727 static inline void ureg_##op( struct ureg_program *ureg, \
728 struct ureg_dst dst, \
729 struct ureg_src src ) \
731 enum tgsi_opcode opcode = TGSI_OPCODE_##op; \
732 struct ureg_emit_insn_result insn; \
733 if (ureg_dst_is_empty(dst)) \
735 insn = ureg_emit_insn(ureg, \
741 ureg_emit_dst( ureg, dst ); \
742 ureg_emit_src( ureg, src ); \
743 ureg_fixup_insn_size( ureg, insn.insn_token ); \
747 static inline void ureg_##op( struct ureg_program *ureg, \
748 struct ureg_dst dst, \
749 struct ureg_src src0, \
750 struct ureg_src src1 ) \
752 enum tgsi_opcode opcode = TGSI_OPCODE_##op; \
753 struct ureg_emit_insn_result insn; \
754 if (ureg_dst_is_empty(dst)) \
756 insn = ureg_emit_insn(ureg, \
762 ureg_emit_dst( ureg, dst ); \
763 ureg_emit_src( ureg, src0 ); \
764 ureg_emit_src( ureg, src1 ); \
765 ureg_fixup_insn_size( ureg, insn.insn_token ); \
768 #define OP12_TEX( op ) \
769 static inline void ureg_##op( struct ureg_program *ureg, \
770 struct ureg_dst dst, \
771 enum tgsi_texture_type target, \
772 struct ureg_src src0, \
773 struct ureg_src src1 ) \
775 enum tgsi_opcode opcode = TGSI_OPCODE_##op; \
776 enum tgsi_return_type return_type = TGSI_RETURN_TYPE_UNKNOWN; \
777 struct ureg_emit_insn_result insn; \
778 if (ureg_dst_is_empty(dst)) \
780 insn = ureg_emit_insn(ureg, \
786 ureg_emit_texture( ureg, insn.extended_token, target, \
788 ureg_emit_dst( ureg, dst ); \
789 ureg_emit_src( ureg, src0 ); \
790 ureg_emit_src( ureg, src1 ); \
791 ureg_fixup_insn_size( ureg, insn.insn_token ); \
795 static inline void ureg_##op( struct ureg_program *ureg, \
796 struct ureg_dst dst, \
797 struct ureg_src src0, \
798 struct ureg_src src1, \
799 struct ureg_src src2 ) \
801 enum tgsi_opcode opcode = TGSI_OPCODE_##op; \
802 struct ureg_emit_insn_result insn; \
803 if (ureg_dst_is_empty(dst)) \
805 insn = ureg_emit_insn(ureg, \
811 ureg_emit_dst( ureg, dst ); \
812 ureg_emit_src( ureg, src0 ); \
813 ureg_emit_src( ureg, src1 ); \
814 ureg_emit_src( ureg, src2 ); \
815 ureg_fixup_insn_size( ureg, insn.insn_token ); \
819 static inline void ureg_##op( struct ureg_program *ureg, \
820 struct ureg_dst dst, \
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 struct ureg_emit_insn_result insn; \
828 if (ureg_dst_is_empty(dst)) \
830 insn = ureg_emit_insn(ureg, \
836 ureg_emit_dst( ureg, dst ); \
837 ureg_emit_src( ureg, src0 ); \
838 ureg_emit_src( ureg, src1 ); \
839 ureg_emit_src( ureg, src2 ); \
840 ureg_emit_src( ureg, src3 ); \
841 ureg_fixup_insn_size( ureg, insn.insn_token ); \
844 #define OP14_TEX( op ) \
845 static inline void ureg_##op( struct ureg_program *ureg, \
846 struct ureg_dst dst, \
847 enum tgsi_texture_type target, \
848 struct ureg_src src0, \
849 struct ureg_src src1, \
850 struct ureg_src src2, \
851 struct ureg_src src3 ) \
853 enum tgsi_opcode opcode = TGSI_OPCODE_##op; \
854 enum tgsi_return_type return_type = TGSI_RETURN_TYPE_UNKNOWN; \
855 struct ureg_emit_insn_result insn; \
856 if (ureg_dst_is_empty(dst)) \
858 insn = ureg_emit_insn(ureg, \
864 ureg_emit_texture( ureg, insn.extended_token, target, \
866 ureg_emit_dst( ureg, dst ); \
867 ureg_emit_src( ureg, src0 ); \
868 ureg_emit_src( ureg, src1 ); \
869 ureg_emit_src( ureg, src2 ); \
870 ureg_emit_src( ureg, src3 ); \
871 ureg_fixup_insn_size( ureg, insn.insn_token ); \
874 /* Use a template include to generate a correctly-typed ureg_OP()
875 * function for each TGSI opcode:
877 #include "tgsi_opcode_tmp.h"
880 /***********************************************************************
881 * Inline helpers for manipulating register structs:
883 static inline struct ureg_src
884 ureg_negate( struct ureg_src reg
)
886 assert(reg
.File
!= TGSI_FILE_NULL
);
891 static inline struct ureg_src
892 ureg_abs( struct ureg_src reg
)
894 assert(reg
.File
!= TGSI_FILE_NULL
);
900 static inline struct ureg_src
901 ureg_swizzle( struct ureg_src reg
,
902 int x
, int y
, int z
, int w
)
904 unsigned swz
= ( (reg
.SwizzleX
<< 0) |
905 (reg
.SwizzleY
<< 2) |
906 (reg
.SwizzleZ
<< 4) |
907 (reg
.SwizzleW
<< 6));
909 assert(reg
.File
!= TGSI_FILE_NULL
);
915 reg
.SwizzleX
= (swz
>> (x
*2)) & 0x3;
916 reg
.SwizzleY
= (swz
>> (y
*2)) & 0x3;
917 reg
.SwizzleZ
= (swz
>> (z
*2)) & 0x3;
918 reg
.SwizzleW
= (swz
>> (w
*2)) & 0x3;
922 static inline struct ureg_src
923 ureg_scalar( struct ureg_src reg
, int x
)
925 return ureg_swizzle(reg
, x
, x
, x
, x
);
928 static inline struct ureg_dst
929 ureg_writemask( struct ureg_dst reg
,
932 assert(reg
.File
!= TGSI_FILE_NULL
);
933 reg
.WriteMask
&= writemask
;
937 static inline struct ureg_dst
938 ureg_saturate( struct ureg_dst reg
)
940 assert(reg
.File
!= TGSI_FILE_NULL
);
945 static inline struct ureg_dst
946 ureg_dst_indirect( struct ureg_dst reg
, struct ureg_src addr
)
948 assert(reg
.File
!= TGSI_FILE_NULL
);
950 reg
.IndirectFile
= addr
.File
;
951 reg
.IndirectIndex
= addr
.Index
;
952 reg
.IndirectSwizzle
= addr
.SwizzleX
;
956 static inline struct ureg_src
957 ureg_src_indirect( struct ureg_src reg
, struct ureg_src addr
)
959 assert(reg
.File
!= TGSI_FILE_NULL
);
961 reg
.IndirectFile
= addr
.File
;
962 reg
.IndirectIndex
= addr
.Index
;
963 reg
.IndirectSwizzle
= addr
.SwizzleX
;
967 static inline struct ureg_dst
968 ureg_dst_dimension( struct ureg_dst reg
, int index
)
970 assert(reg
.File
!= TGSI_FILE_NULL
);
973 reg
.DimensionIndex
= index
;
977 static inline struct ureg_src
978 ureg_src_dimension( struct ureg_src reg
, int index
)
980 assert(reg
.File
!= TGSI_FILE_NULL
);
983 reg
.DimensionIndex
= index
;
987 static inline struct ureg_dst
988 ureg_dst_dimension_indirect( struct ureg_dst reg
, struct ureg_src addr
,
991 assert(reg
.File
!= TGSI_FILE_NULL
);
994 reg
.DimensionIndex
= index
;
995 reg
.DimIndFile
= addr
.File
;
996 reg
.DimIndIndex
= addr
.Index
;
997 reg
.DimIndSwizzle
= addr
.SwizzleX
;
1001 static inline struct ureg_src
1002 ureg_src_dimension_indirect( struct ureg_src reg
, struct ureg_src addr
,
1005 assert(reg
.File
!= TGSI_FILE_NULL
);
1007 reg
.DimIndirect
= 1;
1008 reg
.DimensionIndex
= index
;
1009 reg
.DimIndFile
= addr
.File
;
1010 reg
.DimIndIndex
= addr
.Index
;
1011 reg
.DimIndSwizzle
= addr
.SwizzleX
;
1015 static inline struct ureg_src
1016 ureg_src_array_offset(struct ureg_src reg
, int offset
)
1018 reg
.Index
+= offset
;
1022 static inline struct ureg_dst
1023 ureg_dst_array_offset( struct ureg_dst reg
, int offset
)
1025 reg
.Index
+= offset
;
1029 static inline struct ureg_dst
1030 ureg_dst_array_register(unsigned file
,
1034 struct ureg_dst dst
;
1037 dst
.WriteMask
= TGSI_WRITEMASK_XYZW
;
1039 dst
.IndirectFile
= TGSI_FILE_NULL
;
1040 dst
.IndirectIndex
= 0;
1041 dst
.IndirectSwizzle
= 0;
1045 dst
.DimensionIndex
= 0;
1046 dst
.DimIndirect
= 0;
1047 dst
.DimIndFile
= TGSI_FILE_NULL
;
1048 dst
.DimIndIndex
= 0;
1049 dst
.DimIndSwizzle
= 0;
1050 dst
.ArrayID
= array_id
;
1056 static inline struct ureg_dst
1057 ureg_dst_register(unsigned file
,
1060 return ureg_dst_array_register(file
, index
, 0);
1063 static inline struct ureg_dst
1064 ureg_dst( struct ureg_src src
)
1066 struct ureg_dst dst
;
1068 dst
.File
= src
.File
;
1069 dst
.WriteMask
= TGSI_WRITEMASK_XYZW
;
1070 dst
.IndirectFile
= src
.IndirectFile
;
1071 dst
.Indirect
= src
.Indirect
;
1072 dst
.IndirectIndex
= src
.IndirectIndex
;
1073 dst
.IndirectSwizzle
= src
.IndirectSwizzle
;
1075 dst
.Index
= src
.Index
;
1076 dst
.Dimension
= src
.Dimension
;
1077 dst
.DimensionIndex
= src
.DimensionIndex
;
1078 dst
.DimIndirect
= src
.DimIndirect
;
1079 dst
.DimIndFile
= src
.DimIndFile
;
1080 dst
.DimIndIndex
= src
.DimIndIndex
;
1081 dst
.DimIndSwizzle
= src
.DimIndSwizzle
;
1082 dst
.ArrayID
= src
.ArrayID
;
1088 static inline struct ureg_src
1089 ureg_src_array_register(unsigned file
,
1093 struct ureg_src src
;
1096 src
.SwizzleX
= TGSI_SWIZZLE_X
;
1097 src
.SwizzleY
= TGSI_SWIZZLE_Y
;
1098 src
.SwizzleZ
= TGSI_SWIZZLE_Z
;
1099 src
.SwizzleW
= TGSI_SWIZZLE_W
;
1101 src
.IndirectFile
= TGSI_FILE_NULL
;
1102 src
.IndirectIndex
= 0;
1103 src
.IndirectSwizzle
= 0;
1108 src
.DimensionIndex
= 0;
1109 src
.DimIndirect
= 0;
1110 src
.DimIndFile
= TGSI_FILE_NULL
;
1111 src
.DimIndIndex
= 0;
1112 src
.DimIndSwizzle
= 0;
1113 src
.ArrayID
= array_id
;
1118 static inline struct ureg_src
1119 ureg_src_register(unsigned file
,
1122 return ureg_src_array_register(file
, index
, 0);
1125 static inline struct ureg_src
1126 ureg_src( struct ureg_dst dst
)
1128 struct ureg_src src
;
1130 src
.File
= dst
.File
;
1131 src
.SwizzleX
= TGSI_SWIZZLE_X
;
1132 src
.SwizzleY
= TGSI_SWIZZLE_Y
;
1133 src
.SwizzleZ
= TGSI_SWIZZLE_Z
;
1134 src
.SwizzleW
= TGSI_SWIZZLE_W
;
1135 src
.Indirect
= dst
.Indirect
;
1136 src
.IndirectFile
= dst
.IndirectFile
;
1137 src
.IndirectIndex
= dst
.IndirectIndex
;
1138 src
.IndirectSwizzle
= dst
.IndirectSwizzle
;
1140 src
.Index
= dst
.Index
;
1142 src
.Dimension
= dst
.Dimension
;
1143 src
.DimensionIndex
= dst
.DimensionIndex
;
1144 src
.DimIndirect
= dst
.DimIndirect
;
1145 src
.DimIndFile
= dst
.DimIndFile
;
1146 src
.DimIndIndex
= dst
.DimIndIndex
;
1147 src
.DimIndSwizzle
= dst
.DimIndSwizzle
;
1148 src
.ArrayID
= dst
.ArrayID
;
1155 static inline struct ureg_dst
1156 ureg_dst_undef( void )
1158 struct ureg_dst dst
;
1160 dst
.File
= TGSI_FILE_NULL
;
1163 dst
.IndirectFile
= TGSI_FILE_NULL
;
1164 dst
.IndirectIndex
= 0;
1165 dst
.IndirectSwizzle
= 0;
1169 dst
.DimensionIndex
= 0;
1170 dst
.DimIndirect
= 0;
1171 dst
.DimIndFile
= TGSI_FILE_NULL
;
1172 dst
.DimIndIndex
= 0;
1173 dst
.DimIndSwizzle
= 0;
1180 static inline struct ureg_src
1181 ureg_src_undef( void )
1183 struct ureg_src src
;
1185 src
.File
= TGSI_FILE_NULL
;
1191 src
.IndirectFile
= TGSI_FILE_NULL
;
1192 src
.IndirectIndex
= 0;
1193 src
.IndirectSwizzle
= 0;
1198 src
.DimensionIndex
= 0;
1199 src
.DimIndirect
= 0;
1200 src
.DimIndFile
= TGSI_FILE_NULL
;
1201 src
.DimIndIndex
= 0;
1202 src
.DimIndSwizzle
= 0;
1208 static inline boolean
1209 ureg_src_is_undef( struct ureg_src src
)
1211 return src
.File
== TGSI_FILE_NULL
;
1214 static inline boolean
1215 ureg_dst_is_undef( struct ureg_dst dst
)
1217 return dst
.File
== TGSI_FILE_NULL
;
1221 ureg_setup_shader_info(struct ureg_program
*ureg
,
1222 const struct shader_info
*info
);