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_compiler.h"
32 #include "pipe/p_shader_tokens.h"
33 #include "util/u_debug.h"
41 struct pipe_stream_output_info
;
43 /* Almost a tgsi_src_register, but we need to pull in the Absolute
44 * flag from the _ext token. Indirect flag always implies ADDR[0].
48 unsigned File
: 4; /* TGSI_FILE_ */
49 unsigned SwizzleX
: 2; /* TGSI_SWIZZLE_ */
50 unsigned SwizzleY
: 2; /* TGSI_SWIZZLE_ */
51 unsigned SwizzleZ
: 2; /* TGSI_SWIZZLE_ */
52 unsigned SwizzleW
: 2; /* TGSI_SWIZZLE_ */
53 unsigned Indirect
: 1; /* BOOL */
54 unsigned DimIndirect
: 1; /* BOOL */
55 unsigned Dimension
: 1; /* BOOL */
56 unsigned Absolute
: 1; /* BOOL */
57 unsigned Negate
: 1; /* BOOL */
58 unsigned IndirectFile
: 4; /* TGSI_FILE_ */
59 unsigned IndirectSwizzle
: 2; /* TGSI_SWIZZLE_ */
60 unsigned DimIndFile
: 4; /* TGSI_FILE_ */
61 unsigned DimIndSwizzle
: 2; /* TGSI_SWIZZLE_ */
62 int Index
: 16; /* SINT */
63 int IndirectIndex
: 16; /* SINT */
64 int DimensionIndex
: 16; /* SINT */
65 int DimIndIndex
: 16; /* SINT */
66 unsigned ArrayID
: 10; /* UINT */
69 /* Very similar to a tgsi_dst_register, removing unsupported fields
70 * and adding a Saturate flag. It's easier to push saturate into the
71 * destination register than to try and create a _SAT variant of each
72 * instruction function.
76 unsigned File
: 4; /* TGSI_FILE_ */
77 unsigned WriteMask
: 4; /* TGSI_WRITEMASK_ */
78 unsigned Indirect
: 1; /* BOOL */
79 unsigned DimIndirect
: 1; /* BOOL */
80 unsigned Dimension
: 1; /* BOOL */
81 unsigned Saturate
: 1; /* BOOL */
82 unsigned Invariant
: 1; /* BOOL */
83 int Index
: 16; /* SINT */
84 int IndirectIndex
: 16; /* SINT */
85 unsigned IndirectFile
: 4; /* TGSI_FILE_ */
86 int IndirectSwizzle
: 2; /* TGSI_SWIZZLE_ */
87 unsigned DimIndFile
: 4; /* TGSI_FILE_ */
88 unsigned DimIndSwizzle
: 2; /* TGSI_SWIZZLE_ */
89 int DimensionIndex
: 16; /* SINT */
90 int DimIndIndex
: 16; /* SINT */
91 unsigned ArrayID
: 10; /* UINT */
97 ureg_create(enum pipe_shader_type processor
);
100 ureg_create_with_screen(enum pipe_shader_type processor
,
101 struct pipe_screen
*screen
);
103 const struct tgsi_token
*
104 ureg_finalize( struct ureg_program
* );
106 /* Create and return a shader:
109 ureg_create_shader( struct ureg_program
*,
110 struct pipe_context
*pipe
,
111 const struct pipe_stream_output_info
*so
);
114 ureg_set_next_shader_processor(struct ureg_program
*ureg
, unsigned processor
);
116 /* Alternately, return the built token stream and hand ownership of
117 * that memory to the caller:
119 const struct tgsi_token
*
120 ureg_get_tokens( struct ureg_program
*ureg
,
121 unsigned *nr_tokens
);
124 * Returns the number of currently declared outputs.
127 ureg_get_nr_outputs( const struct ureg_program
*ureg
);
130 /* Free the tokens created by ureg_get_tokens() */
131 void ureg_free_tokens( const struct tgsi_token
*tokens
);
135 ureg_destroy( struct ureg_program
* );
138 /***********************************************************************
139 * Convenience routine:
142 ureg_create_shader_with_so_and_destroy( struct ureg_program
*p
,
143 struct pipe_context
*pipe
,
144 const struct pipe_stream_output_info
*so
)
146 void *result
= ureg_create_shader( p
, pipe
, so
);
152 ureg_create_shader_and_destroy( struct ureg_program
*p
,
153 struct pipe_context
*pipe
)
155 return ureg_create_shader_with_so_and_destroy(p
, pipe
, NULL
);
159 /***********************************************************************
160 * Build shader properties:
164 ureg_property(struct ureg_program
*ureg
, unsigned name
, unsigned value
);
167 /***********************************************************************
168 * Build shader declarations:
172 ureg_DECL_fs_input_cyl_centroid_layout(struct ureg_program
*,
173 enum tgsi_semantic semantic_name
,
174 unsigned semantic_index
,
175 enum tgsi_interpolate_mode interp_mode
,
176 unsigned cylindrical_wrap
,
177 enum tgsi_interpolate_loc interp_location
,
181 unsigned array_size
);
184 ureg_DECL_fs_input_cyl_centroid(struct ureg_program
*,
185 enum tgsi_semantic semantic_name
,
186 unsigned semantic_index
,
187 enum tgsi_interpolate_mode interp_mode
,
188 unsigned cylindrical_wrap
,
189 enum tgsi_interpolate_loc interp_location
,
191 unsigned array_size
);
193 static inline struct ureg_src
194 ureg_DECL_fs_input_cyl(struct ureg_program
*ureg
,
195 enum tgsi_semantic semantic_name
,
196 unsigned semantic_index
,
197 enum tgsi_interpolate_mode interp_mode
,
198 unsigned cylindrical_wrap
)
200 return ureg_DECL_fs_input_cyl_centroid(ureg
,
205 TGSI_INTERPOLATE_LOC_CENTER
, 0, 1);
208 static inline struct ureg_src
209 ureg_DECL_fs_input(struct ureg_program
*ureg
,
210 enum tgsi_semantic semantic_name
,
211 unsigned semantic_index
,
212 enum tgsi_interpolate_mode interp_mode
)
214 return ureg_DECL_fs_input_cyl_centroid(ureg
,
218 0, TGSI_INTERPOLATE_LOC_CENTER
, 0, 1);
222 ureg_DECL_vs_input( struct ureg_program
*,
226 ureg_DECL_input_layout(struct ureg_program
*,
227 enum tgsi_semantic semantic_name
,
228 unsigned semantic_index
,
232 unsigned array_size
);
235 ureg_DECL_input(struct ureg_program
*,
236 enum tgsi_semantic semantic_name
,
237 unsigned semantic_index
,
239 unsigned array_size
);
242 ureg_DECL_system_value(struct ureg_program
*,
243 enum tgsi_semantic semantic_name
,
244 unsigned semantic_index
);
247 ureg_DECL_output_layout(struct ureg_program
*,
248 enum tgsi_semantic semantic_name
,
249 unsigned semantic_index
,
258 ureg_DECL_output_masked(struct ureg_program
*,
259 enum tgsi_semantic semantic_name
,
260 unsigned semantic_index
,
263 unsigned array_size
);
266 ureg_DECL_output(struct ureg_program
*,
267 enum tgsi_semantic semantic_name
,
268 unsigned semantic_index
);
271 ureg_DECL_output_array(struct ureg_program
*ureg
,
272 enum tgsi_semantic semantic_name
,
273 unsigned semantic_index
,
275 unsigned array_size
);
278 ureg_DECL_immediate( struct ureg_program
*,
283 ureg_DECL_immediate_f64( struct ureg_program
*,
288 ureg_DECL_immediate_uint( struct ureg_program
*,
293 ureg_DECL_immediate_block_uint( struct ureg_program
*,
298 ureg_DECL_immediate_int( struct ureg_program
*,
303 ureg_DECL_immediate_uint64( struct ureg_program
*,
308 ureg_DECL_immediate_int64( struct ureg_program
*,
313 ureg_DECL_constant2D(struct ureg_program
*ureg
,
319 ureg_DECL_constant( struct ureg_program
*,
323 ureg_DECL_hw_atomic(struct ureg_program
*ureg
,
330 ureg_DECL_temporary( struct ureg_program
* );
333 * Emit a temporary with the LOCAL declaration flag set. For use when
334 * the register value is not required to be preserved across
335 * subroutine boundaries.
338 ureg_DECL_local_temporary( struct ureg_program
* );
341 * Declare "size" continuous temporary registers.
344 ureg_DECL_array_temporary( struct ureg_program
*,
349 ureg_release_temporary( struct ureg_program
*ureg
,
350 struct ureg_dst tmp
);
353 ureg_DECL_address( struct ureg_program
* );
355 /* Supply an index to the sampler declaration as this is the hook to
356 * the external pipe_sampler state. Users of this function probably
357 * don't want just any sampler, but a specific one which they've set
358 * up state for in the context.
361 ureg_DECL_sampler( struct ureg_program
*,
365 ureg_DECL_sampler_view(struct ureg_program
*,
367 enum tgsi_texture_type target
,
368 enum tgsi_return_type return_type_x
,
369 enum tgsi_return_type return_type_y
,
370 enum tgsi_return_type return_type_z
,
371 enum tgsi_return_type return_type_w
);
374 ureg_DECL_image(struct ureg_program
*ureg
,
376 enum tgsi_texture_type target
,
377 enum pipe_format format
,
382 ureg_DECL_buffer(struct ureg_program
*ureg
, unsigned nr
, bool atomic
);
385 ureg_DECL_memory(struct ureg_program
*ureg
, unsigned memory_type
);
387 static inline struct ureg_src
388 ureg_imm4f( struct ureg_program
*ureg
,
397 return ureg_DECL_immediate( ureg
, v
, 4 );
400 static inline struct ureg_src
401 ureg_imm3f( struct ureg_program
*ureg
,
409 return ureg_DECL_immediate( ureg
, v
, 3 );
412 static inline struct ureg_src
413 ureg_imm2f( struct ureg_program
*ureg
,
419 return ureg_DECL_immediate( ureg
, v
, 2 );
422 static inline struct ureg_src
423 ureg_imm1f( struct ureg_program
*ureg
,
428 return ureg_DECL_immediate( ureg
, v
, 1 );
431 static inline struct ureg_src
432 ureg_imm4u( struct ureg_program
*ureg
,
433 unsigned a
, unsigned b
,
434 unsigned c
, unsigned d
)
441 return ureg_DECL_immediate_uint( ureg
, v
, 4 );
444 static inline struct ureg_src
445 ureg_imm3u( struct ureg_program
*ureg
,
446 unsigned a
, unsigned b
,
453 return ureg_DECL_immediate_uint( ureg
, v
, 3 );
456 static inline struct ureg_src
457 ureg_imm2u( struct ureg_program
*ureg
,
458 unsigned a
, unsigned b
)
463 return ureg_DECL_immediate_uint( ureg
, v
, 2 );
466 static inline struct ureg_src
467 ureg_imm1u( struct ureg_program
*ureg
,
470 return ureg_DECL_immediate_uint( ureg
, &a
, 1 );
473 static inline struct ureg_src
474 ureg_imm4i( struct ureg_program
*ureg
,
483 return ureg_DECL_immediate_int( ureg
, v
, 4 );
486 static inline struct ureg_src
487 ureg_imm3i( struct ureg_program
*ureg
,
495 return ureg_DECL_immediate_int( ureg
, v
, 3 );
498 static inline struct ureg_src
499 ureg_imm2i( struct ureg_program
*ureg
,
505 return ureg_DECL_immediate_int( ureg
, v
, 2 );
508 static inline struct ureg_src
509 ureg_imm1i( struct ureg_program
*ureg
,
512 return ureg_DECL_immediate_int( ureg
, &a
, 1 );
515 /* Where the destination register has a valid file, but an empty
518 static inline boolean
519 ureg_dst_is_empty( struct ureg_dst dst
)
521 return dst
.File
!= TGSI_FILE_NULL
&&
525 /***********************************************************************
526 * Functions for patching up labels
530 /* Will return a number which can be used in a label to point to the
531 * next instruction to be emitted.
534 ureg_get_instruction_number( struct ureg_program
*ureg
);
537 /* Patch a given label (expressed as a token number) to point to a
538 * given instruction (expressed as an instruction number).
540 * Labels are obtained from instruction emitters, eg ureg_CAL().
541 * Instruction numbers are obtained from ureg_get_instruction_number(),
545 ureg_fixup_label(struct ureg_program
*ureg
,
546 unsigned label_token
,
547 unsigned instruction_number
);
550 /* Generic instruction emitter. Use if you need to pass the opcode as
551 * a parameter, rather than using the emit_OP() variants below.
554 ureg_insn(struct ureg_program
*ureg
,
555 enum tgsi_opcode opcode
,
556 const struct ureg_dst
*dst
,
558 const struct ureg_src
*src
,
564 ureg_tex_insn(struct ureg_program
*ureg
,
565 enum tgsi_opcode opcode
,
566 const struct ureg_dst
*dst
,
568 enum tgsi_texture_type target
,
569 enum tgsi_return_type return_type
,
570 const struct tgsi_texture_offset
*texoffsets
,
572 const struct ureg_src
*src
,
577 ureg_memory_insn(struct ureg_program
*ureg
,
578 enum tgsi_opcode opcode
,
579 const struct ureg_dst
*dst
,
581 const struct ureg_src
*src
,
584 enum tgsi_texture_type texture
,
585 enum pipe_format format
);
587 /***********************************************************************
588 * Internal instruction helpers, don't call these directly:
591 struct ureg_emit_insn_result
{
592 unsigned insn_token
; /*< Used to fixup insn size. */
593 unsigned extended_token
; /*< Used to set the Extended bit, usually the same as insn_token. */
596 struct ureg_emit_insn_result
597 ureg_emit_insn(struct ureg_program
*ureg
,
598 enum tgsi_opcode opcode
,
605 ureg_emit_label(struct ureg_program
*ureg
,
607 unsigned *label_token
);
610 ureg_emit_texture(struct ureg_program
*ureg
,
612 enum tgsi_texture_type target
,
613 enum tgsi_return_type return_type
,
614 unsigned num_offsets
);
617 ureg_emit_texture_offset(struct ureg_program
*ureg
,
618 const struct tgsi_texture_offset
*offset
);
621 ureg_emit_memory(struct ureg_program
*ureg
,
624 enum tgsi_texture_type texture
,
625 enum pipe_format format
);
628 ureg_emit_dst( struct ureg_program
*ureg
,
629 struct ureg_dst dst
);
632 ureg_emit_src( struct ureg_program
*ureg
,
633 struct ureg_src src
);
636 ureg_fixup_insn_size(struct ureg_program
*ureg
,
641 static inline void ureg_##op( struct ureg_program *ureg ) \
643 enum tgsi_opcode opcode = TGSI_OPCODE_##op; \
644 struct ureg_emit_insn_result insn; \
645 insn = ureg_emit_insn(ureg, \
651 ureg_fixup_insn_size( ureg, insn.insn_token ); \
655 static inline void ureg_##op( struct ureg_program *ureg, \
656 struct ureg_src src ) \
658 enum tgsi_opcode opcode = TGSI_OPCODE_##op; \
659 struct ureg_emit_insn_result insn; \
660 insn = ureg_emit_insn(ureg, \
666 ureg_emit_src( ureg, src ); \
667 ureg_fixup_insn_size( ureg, insn.insn_token ); \
670 #define OP00_LBL( op ) \
671 static inline void ureg_##op( struct ureg_program *ureg, \
672 unsigned *label_token ) \
674 enum tgsi_opcode opcode = TGSI_OPCODE_##op; \
675 struct ureg_emit_insn_result insn; \
676 insn = ureg_emit_insn(ureg, \
682 ureg_emit_label( ureg, insn.extended_token, label_token ); \
683 ureg_fixup_insn_size( ureg, insn.insn_token ); \
686 #define OP01_LBL( op ) \
687 static inline void ureg_##op( struct ureg_program *ureg, \
688 struct ureg_src src, \
689 unsigned *label_token ) \
691 enum tgsi_opcode opcode = TGSI_OPCODE_##op; \
692 struct ureg_emit_insn_result insn; \
693 insn = ureg_emit_insn(ureg, \
699 ureg_emit_label( ureg, insn.extended_token, label_token ); \
700 ureg_emit_src( ureg, src ); \
701 ureg_fixup_insn_size( ureg, insn.insn_token ); \
705 static inline void ureg_##op( struct ureg_program *ureg, \
706 struct ureg_dst dst ) \
708 enum tgsi_opcode opcode = TGSI_OPCODE_##op; \
709 struct ureg_emit_insn_result insn; \
710 if (ureg_dst_is_empty(dst)) \
712 insn = ureg_emit_insn(ureg, \
718 ureg_emit_dst( ureg, dst ); \
719 ureg_fixup_insn_size( ureg, insn.insn_token ); \
724 static inline void ureg_##op( struct ureg_program *ureg, \
725 struct ureg_dst dst, \
726 struct ureg_src src ) \
728 enum tgsi_opcode opcode = TGSI_OPCODE_##op; \
729 struct ureg_emit_insn_result insn; \
730 if (ureg_dst_is_empty(dst)) \
732 insn = ureg_emit_insn(ureg, \
738 ureg_emit_dst( ureg, dst ); \
739 ureg_emit_src( ureg, src ); \
740 ureg_fixup_insn_size( ureg, insn.insn_token ); \
744 static inline void ureg_##op( struct ureg_program *ureg, \
745 struct ureg_dst dst, \
746 struct ureg_src src0, \
747 struct ureg_src src1 ) \
749 enum tgsi_opcode opcode = TGSI_OPCODE_##op; \
750 struct ureg_emit_insn_result insn; \
751 if (ureg_dst_is_empty(dst)) \
753 insn = ureg_emit_insn(ureg, \
759 ureg_emit_dst( ureg, dst ); \
760 ureg_emit_src( ureg, src0 ); \
761 ureg_emit_src( ureg, src1 ); \
762 ureg_fixup_insn_size( ureg, insn.insn_token ); \
765 #define OP12_TEX( op ) \
766 static inline void ureg_##op( struct ureg_program *ureg, \
767 struct ureg_dst dst, \
768 enum tgsi_texture_type target, \
769 struct ureg_src src0, \
770 struct ureg_src src1 ) \
772 enum tgsi_opcode opcode = TGSI_OPCODE_##op; \
773 enum tgsi_return_type return_type = TGSI_RETURN_TYPE_UNKNOWN; \
774 struct ureg_emit_insn_result insn; \
775 if (ureg_dst_is_empty(dst)) \
777 insn = ureg_emit_insn(ureg, \
783 ureg_emit_texture( ureg, insn.extended_token, target, \
785 ureg_emit_dst( ureg, dst ); \
786 ureg_emit_src( ureg, src0 ); \
787 ureg_emit_src( ureg, src1 ); \
788 ureg_fixup_insn_size( ureg, insn.insn_token ); \
792 static inline void ureg_##op( struct ureg_program *ureg, \
793 struct ureg_dst dst, \
794 struct ureg_src src0, \
795 struct ureg_src src1, \
796 struct ureg_src src2 ) \
798 enum tgsi_opcode opcode = TGSI_OPCODE_##op; \
799 struct ureg_emit_insn_result insn; \
800 if (ureg_dst_is_empty(dst)) \
802 insn = ureg_emit_insn(ureg, \
808 ureg_emit_dst( ureg, dst ); \
809 ureg_emit_src( ureg, src0 ); \
810 ureg_emit_src( ureg, src1 ); \
811 ureg_emit_src( ureg, src2 ); \
812 ureg_fixup_insn_size( ureg, insn.insn_token ); \
815 #define OP14_TEX( op ) \
816 static inline void ureg_##op( struct ureg_program *ureg, \
817 struct ureg_dst dst, \
818 enum tgsi_texture_type target, \
819 struct ureg_src src0, \
820 struct ureg_src src1, \
821 struct ureg_src src2, \
822 struct ureg_src src3 ) \
824 enum tgsi_opcode opcode = TGSI_OPCODE_##op; \
825 enum tgsi_return_type return_type = TGSI_RETURN_TYPE_UNKNOWN; \
826 struct ureg_emit_insn_result insn; \
827 if (ureg_dst_is_empty(dst)) \
829 insn = ureg_emit_insn(ureg, \
835 ureg_emit_texture( ureg, insn.extended_token, target, \
837 ureg_emit_dst( ureg, dst ); \
838 ureg_emit_src( ureg, src0 ); \
839 ureg_emit_src( ureg, src1 ); \
840 ureg_emit_src( ureg, src2 ); \
841 ureg_emit_src( ureg, src3 ); \
842 ureg_fixup_insn_size( ureg, insn.insn_token ); \
845 /* Use a template include to generate a correctly-typed ureg_OP()
846 * function for each TGSI opcode:
848 #include "tgsi_opcode_tmp.h"
851 /***********************************************************************
852 * Inline helpers for manipulating register structs:
854 static inline struct ureg_src
855 ureg_negate( struct ureg_src reg
)
857 assert(reg
.File
!= TGSI_FILE_NULL
);
862 static inline struct ureg_src
863 ureg_abs( struct ureg_src reg
)
865 assert(reg
.File
!= TGSI_FILE_NULL
);
871 static inline struct ureg_src
872 ureg_swizzle( struct ureg_src reg
,
873 int x
, int y
, int z
, int w
)
875 unsigned swz
= ( (reg
.SwizzleX
<< 0) |
876 (reg
.SwizzleY
<< 2) |
877 (reg
.SwizzleZ
<< 4) |
878 (reg
.SwizzleW
<< 6));
880 assert(reg
.File
!= TGSI_FILE_NULL
);
886 reg
.SwizzleX
= (swz
>> (x
*2)) & 0x3;
887 reg
.SwizzleY
= (swz
>> (y
*2)) & 0x3;
888 reg
.SwizzleZ
= (swz
>> (z
*2)) & 0x3;
889 reg
.SwizzleW
= (swz
>> (w
*2)) & 0x3;
893 static inline struct ureg_src
894 ureg_scalar( struct ureg_src reg
, int x
)
896 return ureg_swizzle(reg
, x
, x
, x
, x
);
899 static inline struct ureg_dst
900 ureg_writemask( struct ureg_dst reg
,
903 assert(reg
.File
!= TGSI_FILE_NULL
);
904 reg
.WriteMask
&= writemask
;
908 static inline struct ureg_dst
909 ureg_saturate( struct ureg_dst reg
)
911 assert(reg
.File
!= TGSI_FILE_NULL
);
916 static inline struct ureg_dst
917 ureg_dst_indirect( struct ureg_dst reg
, struct ureg_src addr
)
919 assert(reg
.File
!= TGSI_FILE_NULL
);
921 reg
.IndirectFile
= addr
.File
;
922 reg
.IndirectIndex
= addr
.Index
;
923 reg
.IndirectSwizzle
= addr
.SwizzleX
;
927 static inline struct ureg_src
928 ureg_src_indirect( struct ureg_src reg
, struct ureg_src addr
)
930 assert(reg
.File
!= TGSI_FILE_NULL
);
932 reg
.IndirectFile
= addr
.File
;
933 reg
.IndirectIndex
= addr
.Index
;
934 reg
.IndirectSwizzle
= addr
.SwizzleX
;
938 static inline struct ureg_dst
939 ureg_dst_dimension( struct ureg_dst reg
, int index
)
941 assert(reg
.File
!= TGSI_FILE_NULL
);
944 reg
.DimensionIndex
= index
;
948 static inline struct ureg_src
949 ureg_src_dimension( struct ureg_src reg
, int index
)
951 assert(reg
.File
!= TGSI_FILE_NULL
);
954 reg
.DimensionIndex
= index
;
958 static inline struct ureg_dst
959 ureg_dst_dimension_indirect( struct ureg_dst reg
, struct ureg_src addr
,
962 assert(reg
.File
!= TGSI_FILE_NULL
);
965 reg
.DimensionIndex
= index
;
966 reg
.DimIndFile
= addr
.File
;
967 reg
.DimIndIndex
= addr
.Index
;
968 reg
.DimIndSwizzle
= addr
.SwizzleX
;
972 static inline struct ureg_src
973 ureg_src_dimension_indirect( struct ureg_src reg
, struct ureg_src addr
,
976 assert(reg
.File
!= TGSI_FILE_NULL
);
979 reg
.DimensionIndex
= index
;
980 reg
.DimIndFile
= addr
.File
;
981 reg
.DimIndIndex
= addr
.Index
;
982 reg
.DimIndSwizzle
= addr
.SwizzleX
;
986 static inline struct ureg_src
987 ureg_src_array_offset(struct ureg_src reg
, int offset
)
993 static inline struct ureg_dst
994 ureg_dst_array_offset( struct ureg_dst reg
, int offset
)
1000 static inline struct ureg_dst
1001 ureg_dst_array_register(unsigned file
,
1005 struct ureg_dst dst
;
1008 dst
.WriteMask
= TGSI_WRITEMASK_XYZW
;
1010 dst
.IndirectFile
= TGSI_FILE_NULL
;
1011 dst
.IndirectIndex
= 0;
1012 dst
.IndirectSwizzle
= 0;
1016 dst
.DimensionIndex
= 0;
1017 dst
.DimIndirect
= 0;
1018 dst
.DimIndFile
= TGSI_FILE_NULL
;
1019 dst
.DimIndIndex
= 0;
1020 dst
.DimIndSwizzle
= 0;
1021 dst
.ArrayID
= array_id
;
1027 static inline struct ureg_dst
1028 ureg_dst_register(unsigned file
,
1031 return ureg_dst_array_register(file
, index
, 0);
1034 static inline struct ureg_dst
1035 ureg_dst( struct ureg_src src
)
1037 struct ureg_dst dst
;
1039 dst
.File
= src
.File
;
1040 dst
.WriteMask
= TGSI_WRITEMASK_XYZW
;
1041 dst
.IndirectFile
= src
.IndirectFile
;
1042 dst
.Indirect
= src
.Indirect
;
1043 dst
.IndirectIndex
= src
.IndirectIndex
;
1044 dst
.IndirectSwizzle
= src
.IndirectSwizzle
;
1046 dst
.Index
= src
.Index
;
1047 dst
.Dimension
= src
.Dimension
;
1048 dst
.DimensionIndex
= src
.DimensionIndex
;
1049 dst
.DimIndirect
= src
.DimIndirect
;
1050 dst
.DimIndFile
= src
.DimIndFile
;
1051 dst
.DimIndIndex
= src
.DimIndIndex
;
1052 dst
.DimIndSwizzle
= src
.DimIndSwizzle
;
1053 dst
.ArrayID
= src
.ArrayID
;
1059 static inline struct ureg_src
1060 ureg_src_array_register(unsigned file
,
1064 struct ureg_src src
;
1067 src
.SwizzleX
= TGSI_SWIZZLE_X
;
1068 src
.SwizzleY
= TGSI_SWIZZLE_Y
;
1069 src
.SwizzleZ
= TGSI_SWIZZLE_Z
;
1070 src
.SwizzleW
= TGSI_SWIZZLE_W
;
1072 src
.IndirectFile
= TGSI_FILE_NULL
;
1073 src
.IndirectIndex
= 0;
1074 src
.IndirectSwizzle
= 0;
1079 src
.DimensionIndex
= 0;
1080 src
.DimIndirect
= 0;
1081 src
.DimIndFile
= TGSI_FILE_NULL
;
1082 src
.DimIndIndex
= 0;
1083 src
.DimIndSwizzle
= 0;
1084 src
.ArrayID
= array_id
;
1089 static inline struct ureg_src
1090 ureg_src_register(unsigned file
,
1093 return ureg_src_array_register(file
, index
, 0);
1096 static inline struct ureg_src
1097 ureg_src( struct ureg_dst dst
)
1099 struct ureg_src src
;
1101 src
.File
= dst
.File
;
1102 src
.SwizzleX
= TGSI_SWIZZLE_X
;
1103 src
.SwizzleY
= TGSI_SWIZZLE_Y
;
1104 src
.SwizzleZ
= TGSI_SWIZZLE_Z
;
1105 src
.SwizzleW
= TGSI_SWIZZLE_W
;
1106 src
.Indirect
= dst
.Indirect
;
1107 src
.IndirectFile
= dst
.IndirectFile
;
1108 src
.IndirectIndex
= dst
.IndirectIndex
;
1109 src
.IndirectSwizzle
= dst
.IndirectSwizzle
;
1111 src
.Index
= dst
.Index
;
1113 src
.Dimension
= dst
.Dimension
;
1114 src
.DimensionIndex
= dst
.DimensionIndex
;
1115 src
.DimIndirect
= dst
.DimIndirect
;
1116 src
.DimIndFile
= dst
.DimIndFile
;
1117 src
.DimIndIndex
= dst
.DimIndIndex
;
1118 src
.DimIndSwizzle
= dst
.DimIndSwizzle
;
1119 src
.ArrayID
= dst
.ArrayID
;
1126 static inline struct ureg_dst
1127 ureg_dst_undef( void )
1129 struct ureg_dst dst
;
1131 dst
.File
= TGSI_FILE_NULL
;
1134 dst
.IndirectFile
= TGSI_FILE_NULL
;
1135 dst
.IndirectIndex
= 0;
1136 dst
.IndirectSwizzle
= 0;
1140 dst
.DimensionIndex
= 0;
1141 dst
.DimIndirect
= 0;
1142 dst
.DimIndFile
= TGSI_FILE_NULL
;
1143 dst
.DimIndIndex
= 0;
1144 dst
.DimIndSwizzle
= 0;
1151 static inline struct ureg_src
1152 ureg_src_undef( void )
1154 struct ureg_src src
;
1156 src
.File
= TGSI_FILE_NULL
;
1162 src
.IndirectFile
= TGSI_FILE_NULL
;
1163 src
.IndirectIndex
= 0;
1164 src
.IndirectSwizzle
= 0;
1169 src
.DimensionIndex
= 0;
1170 src
.DimIndirect
= 0;
1171 src
.DimIndFile
= TGSI_FILE_NULL
;
1172 src
.DimIndIndex
= 0;
1173 src
.DimIndSwizzle
= 0;
1179 static inline boolean
1180 ureg_src_is_undef( struct ureg_src src
)
1182 return src
.File
== TGSI_FILE_NULL
;
1185 static inline boolean
1186 ureg_dst_is_undef( struct ureg_dst dst
)
1188 return dst
.File
== TGSI_FILE_NULL
;