1848b8605Smrg/**************************************************************************
2848b8605Smrg *
3848b8605Smrg * Copyright 2009 VMware, Inc.
4848b8605Smrg * All Rights Reserved.
5848b8605Smrg *
6848b8605Smrg * Permission is hereby granted, free of charge, to any person obtaining a
7848b8605Smrg * copy of this software and associated documentation files (the
8848b8605Smrg * "Software"), to deal in the Software without restriction, including
9848b8605Smrg * without limitation the rights to use, copy, modify, merge, publish,
10848b8605Smrg * distribute, sub license, and/or sell copies of the Software, and to
11848b8605Smrg * permit persons to whom the Software is furnished to do so, subject to
12848b8605Smrg * the following conditions:
13848b8605Smrg *
14848b8605Smrg * The above copyright notice and this permission notice (including the
15848b8605Smrg * next paragraph) shall be included in all copies or substantial portions
16848b8605Smrg * of the Software.
17848b8605Smrg *
18848b8605Smrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19848b8605Smrg * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20848b8605Smrg * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21848b8605Smrg * IN NO EVENT SHALL VMWARE, INC AND/OR ITS SUPPLIERS BE LIABLE FOR
22848b8605Smrg * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23848b8605Smrg * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24848b8605Smrg * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25848b8605Smrg *
26848b8605Smrg **************************************************************************/
27848b8605Smrg
28848b8605Smrg#ifndef TGSI_UREG_H
29848b8605Smrg#define TGSI_UREG_H
30848b8605Smrg
31b8e80941Smrg#include "pipe/p_format.h"
32848b8605Smrg#include "pipe/p_compiler.h"
33848b8605Smrg#include "pipe/p_shader_tokens.h"
34848b8605Smrg#include "util/u_debug.h"
35848b8605Smrg
36848b8605Smrg#ifdef __cplusplus
37848b8605Smrgextern "C" {
38848b8605Smrg#endif
39848b8605Smrg
40b8e80941Smrgstruct pipe_screen;
41848b8605Smrgstruct ureg_program;
42848b8605Smrgstruct pipe_stream_output_info;
43848b8605Smrg
44848b8605Smrg/* Almost a tgsi_src_register, but we need to pull in the Absolute
45848b8605Smrg * flag from the _ext token.  Indirect flag always implies ADDR[0].
46848b8605Smrg */
47848b8605Smrgstruct ureg_src
48848b8605Smrg{
49848b8605Smrg   unsigned File             : 4;  /* TGSI_FILE_ */
50848b8605Smrg   unsigned SwizzleX         : 2;  /* TGSI_SWIZZLE_ */
51848b8605Smrg   unsigned SwizzleY         : 2;  /* TGSI_SWIZZLE_ */
52848b8605Smrg   unsigned SwizzleZ         : 2;  /* TGSI_SWIZZLE_ */
53848b8605Smrg   unsigned SwizzleW         : 2;  /* TGSI_SWIZZLE_ */
54848b8605Smrg   unsigned Indirect         : 1;  /* BOOL */
55848b8605Smrg   unsigned DimIndirect      : 1;  /* BOOL */
56848b8605Smrg   unsigned Dimension        : 1;  /* BOOL */
57848b8605Smrg   unsigned Absolute         : 1;  /* BOOL */
58848b8605Smrg   unsigned Negate           : 1;  /* BOOL */
59848b8605Smrg   unsigned IndirectFile     : 4;  /* TGSI_FILE_ */
60848b8605Smrg   unsigned IndirectSwizzle  : 2;  /* TGSI_SWIZZLE_ */
61848b8605Smrg   unsigned DimIndFile       : 4;  /* TGSI_FILE_ */
62848b8605Smrg   unsigned DimIndSwizzle    : 2;  /* TGSI_SWIZZLE_ */
63848b8605Smrg   int      Index            : 16; /* SINT */
64848b8605Smrg   int      IndirectIndex    : 16; /* SINT */
65848b8605Smrg   int      DimensionIndex   : 16; /* SINT */
66848b8605Smrg   int      DimIndIndex      : 16; /* SINT */
67848b8605Smrg   unsigned ArrayID          : 10; /* UINT */
68848b8605Smrg};
69848b8605Smrg
70848b8605Smrg/* Very similar to a tgsi_dst_register, removing unsupported fields
71848b8605Smrg * and adding a Saturate flag.  It's easier to push saturate into the
72848b8605Smrg * destination register than to try and create a _SAT variant of each
73848b8605Smrg * instruction function.
74848b8605Smrg */
75848b8605Smrgstruct ureg_dst
76848b8605Smrg{
77848b8605Smrg   unsigned File            : 4;  /* TGSI_FILE_ */
78848b8605Smrg   unsigned WriteMask       : 4;  /* TGSI_WRITEMASK_ */
79848b8605Smrg   unsigned Indirect        : 1;  /* BOOL */
80b8e80941Smrg   unsigned DimIndirect     : 1;  /* BOOL */
81b8e80941Smrg   unsigned Dimension       : 1;  /* BOOL */
82848b8605Smrg   unsigned Saturate        : 1;  /* BOOL */
83b8e80941Smrg   unsigned Invariant       : 1;  /* BOOL */
84848b8605Smrg   int      Index           : 16; /* SINT */
85848b8605Smrg   int      IndirectIndex   : 16; /* SINT */
86848b8605Smrg   unsigned IndirectFile    : 4;  /* TGSI_FILE_ */
87848b8605Smrg   int      IndirectSwizzle : 2;  /* TGSI_SWIZZLE_ */
88b8e80941Smrg   unsigned DimIndFile      : 4;  /* TGSI_FILE_ */
89b8e80941Smrg   unsigned DimIndSwizzle   : 2;  /* TGSI_SWIZZLE_ */
90b8e80941Smrg   int      DimensionIndex  : 16; /* SINT */
91b8e80941Smrg   int      DimIndIndex     : 16; /* SINT */
92848b8605Smrg   unsigned ArrayID         : 10; /* UINT */
93848b8605Smrg};
94848b8605Smrg
95848b8605Smrgstruct pipe_context;
96848b8605Smrg
97848b8605Smrgstruct ureg_program *
98b8e80941Smrgureg_create(enum pipe_shader_type processor);
99b8e80941Smrg
100b8e80941Smrgstruct ureg_program *
101b8e80941Smrgureg_create_with_screen(enum pipe_shader_type processor,
102b8e80941Smrg                        struct pipe_screen *screen);
103848b8605Smrg
104848b8605Smrgconst struct tgsi_token *
105848b8605Smrgureg_finalize( struct ureg_program * );
106848b8605Smrg
107848b8605Smrg/* Create and return a shader:
108848b8605Smrg */
109848b8605Smrgvoid *
110848b8605Smrgureg_create_shader( struct ureg_program *,
111848b8605Smrg                    struct pipe_context *pipe,
112848b8605Smrg		    const struct pipe_stream_output_info *so );
113848b8605Smrg
114b8e80941Smrgvoid
115b8e80941Smrgureg_set_next_shader_processor(struct ureg_program *ureg, unsigned processor);
116848b8605Smrg
117848b8605Smrg/* Alternately, return the built token stream and hand ownership of
118848b8605Smrg * that memory to the caller:
119848b8605Smrg */
120848b8605Smrgconst struct tgsi_token *
121848b8605Smrgureg_get_tokens( struct ureg_program *ureg,
122848b8605Smrg                 unsigned *nr_tokens );
123848b8605Smrg
124848b8605Smrg/*
125848b8605Smrg * Returns the number of currently declared outputs.
126848b8605Smrg */
127848b8605Smrgunsigned
128848b8605Smrgureg_get_nr_outputs( const struct ureg_program *ureg );
129848b8605Smrg
130848b8605Smrg
131848b8605Smrg/* Free the tokens created by ureg_get_tokens() */
132848b8605Smrgvoid ureg_free_tokens( const struct tgsi_token *tokens );
133848b8605Smrg
134848b8605Smrg
135848b8605Smrgvoid
136848b8605Smrgureg_destroy( struct ureg_program * );
137848b8605Smrg
138848b8605Smrg
139848b8605Smrg/***********************************************************************
140848b8605Smrg * Convenience routine:
141848b8605Smrg */
142b8e80941Smrgstatic inline void *
143848b8605Smrgureg_create_shader_with_so_and_destroy( struct ureg_program *p,
144848b8605Smrg			struct pipe_context *pipe,
145848b8605Smrg			const struct pipe_stream_output_info *so )
146848b8605Smrg{
147848b8605Smrg   void *result = ureg_create_shader( p, pipe, so );
148848b8605Smrg   ureg_destroy( p );
149848b8605Smrg   return result;
150848b8605Smrg}
151848b8605Smrg
152b8e80941Smrgstatic inline void *
153848b8605Smrgureg_create_shader_and_destroy( struct ureg_program *p,
154848b8605Smrg                                struct pipe_context *pipe )
155848b8605Smrg{
156848b8605Smrg   return ureg_create_shader_with_so_and_destroy(p, pipe, NULL);
157848b8605Smrg}
158848b8605Smrg
159848b8605Smrg
160848b8605Smrg/***********************************************************************
161848b8605Smrg * Build shader properties:
162848b8605Smrg */
163848b8605Smrg
164848b8605Smrgvoid
165b8e80941Smrgureg_property(struct ureg_program *ureg, unsigned name, unsigned value);
166848b8605Smrg
167848b8605Smrg
168848b8605Smrg/***********************************************************************
169848b8605Smrg * Build shader declarations:
170848b8605Smrg */
171848b8605Smrg
172b8e80941Smrgstruct ureg_src
173b8e80941Smrgureg_DECL_fs_input_cyl_centroid_layout(struct ureg_program *,
174b8e80941Smrg                       enum tgsi_semantic semantic_name,
175b8e80941Smrg                       unsigned semantic_index,
176b8e80941Smrg                       enum tgsi_interpolate_mode interp_mode,
177b8e80941Smrg                       unsigned cylindrical_wrap,
178b8e80941Smrg                       enum tgsi_interpolate_loc interp_location,
179b8e80941Smrg                       unsigned index,
180b8e80941Smrg                       unsigned usage_mask,
181b8e80941Smrg                       unsigned array_id,
182b8e80941Smrg                       unsigned array_size);
183b8e80941Smrg
184848b8605Smrgstruct ureg_src
185848b8605Smrgureg_DECL_fs_input_cyl_centroid(struct ureg_program *,
186b8e80941Smrg                       enum tgsi_semantic semantic_name,
187848b8605Smrg                       unsigned semantic_index,
188b8e80941Smrg                       enum tgsi_interpolate_mode interp_mode,
189848b8605Smrg                       unsigned cylindrical_wrap,
190b8e80941Smrg                       enum tgsi_interpolate_loc interp_location,
191b8e80941Smrg                       unsigned array_id,
192b8e80941Smrg                       unsigned array_size);
193848b8605Smrg
194b8e80941Smrgstatic inline struct ureg_src
195848b8605Smrgureg_DECL_fs_input_cyl(struct ureg_program *ureg,
196b8e80941Smrg                       enum tgsi_semantic semantic_name,
197848b8605Smrg                       unsigned semantic_index,
198b8e80941Smrg                       enum tgsi_interpolate_mode interp_mode,
199848b8605Smrg                       unsigned cylindrical_wrap)
200848b8605Smrg{
201848b8605Smrg   return ureg_DECL_fs_input_cyl_centroid(ureg,
202848b8605Smrg                                 semantic_name,
203848b8605Smrg                                 semantic_index,
204848b8605Smrg                                 interp_mode,
205848b8605Smrg                                 cylindrical_wrap,
206b8e80941Smrg                                 TGSI_INTERPOLATE_LOC_CENTER, 0, 1);
207848b8605Smrg}
208848b8605Smrg
209b8e80941Smrgstatic inline struct ureg_src
210848b8605Smrgureg_DECL_fs_input(struct ureg_program *ureg,
211b8e80941Smrg                   enum tgsi_semantic semantic_name,
212848b8605Smrg                   unsigned semantic_index,
213b8e80941Smrg                   enum tgsi_interpolate_mode interp_mode)
214848b8605Smrg{
215848b8605Smrg   return ureg_DECL_fs_input_cyl_centroid(ureg,
216848b8605Smrg                                 semantic_name,
217848b8605Smrg                                 semantic_index,
218848b8605Smrg                                 interp_mode,
219b8e80941Smrg                                 0, TGSI_INTERPOLATE_LOC_CENTER, 0, 1);
220848b8605Smrg}
221848b8605Smrg
222848b8605Smrgstruct ureg_src
223848b8605Smrgureg_DECL_vs_input( struct ureg_program *,
224848b8605Smrg                    unsigned index );
225848b8605Smrg
226848b8605Smrgstruct ureg_src
227b8e80941Smrgureg_DECL_input_layout(struct ureg_program *,
228b8e80941Smrg                enum tgsi_semantic semantic_name,
229b8e80941Smrg                unsigned semantic_index,
230b8e80941Smrg                unsigned index,
231b8e80941Smrg                unsigned usage_mask,
232b8e80941Smrg                unsigned array_id,
233b8e80941Smrg                unsigned array_size);
234b8e80941Smrg
235b8e80941Smrgstruct ureg_src
236b8e80941Smrgureg_DECL_input(struct ureg_program *,
237b8e80941Smrg                enum tgsi_semantic semantic_name,
238b8e80941Smrg                unsigned semantic_index,
239b8e80941Smrg                unsigned array_id,
240b8e80941Smrg                unsigned array_size);
241848b8605Smrg
242848b8605Smrgstruct ureg_src
243848b8605Smrgureg_DECL_system_value(struct ureg_program *,
244b8e80941Smrg                       enum tgsi_semantic semantic_name,
245848b8605Smrg                       unsigned semantic_index);
246848b8605Smrg
247848b8605Smrgstruct ureg_dst
248b8e80941Smrgureg_DECL_output_layout(struct ureg_program *,
249b8e80941Smrg                        enum tgsi_semantic semantic_name,
250b8e80941Smrg                        unsigned semantic_index,
251b8e80941Smrg                        unsigned streams,
252b8e80941Smrg                        unsigned index,
253b8e80941Smrg                        unsigned usage_mask,
254b8e80941Smrg                        unsigned array_id,
255b8e80941Smrg                        unsigned array_size,
256b8e80941Smrg                        boolean invariant);
257b8e80941Smrg
258b8e80941Smrgstruct ureg_dst
259b8e80941Smrgureg_DECL_output_masked(struct ureg_program *,
260b8e80941Smrg                        enum tgsi_semantic semantic_name,
261b8e80941Smrg                        unsigned semantic_index,
262b8e80941Smrg                        unsigned usage_mask,
263b8e80941Smrg                        unsigned array_id,
264b8e80941Smrg                        unsigned array_size);
265b8e80941Smrg
266b8e80941Smrgstruct ureg_dst
267b8e80941Smrgureg_DECL_output(struct ureg_program *,
268b8e80941Smrg                 enum tgsi_semantic semantic_name,
269b8e80941Smrg                 unsigned semantic_index);
270848b8605Smrg
271848b8605Smrgstruct ureg_dst
272b8e80941Smrgureg_DECL_output_array(struct ureg_program *ureg,
273b8e80941Smrg                       enum tgsi_semantic semantic_name,
274b8e80941Smrg                       unsigned semantic_index,
275b8e80941Smrg                       unsigned array_id,
276b8e80941Smrg                       unsigned array_size);
277848b8605Smrg
278848b8605Smrgstruct ureg_src
279848b8605Smrgureg_DECL_immediate( struct ureg_program *,
280848b8605Smrg                     const float *v,
281848b8605Smrg                     unsigned nr );
282848b8605Smrg
283b8e80941Smrgstruct ureg_src
284b8e80941Smrgureg_DECL_immediate_f64( struct ureg_program *,
285b8e80941Smrg                         const double *v,
286b8e80941Smrg                         unsigned nr );
287b8e80941Smrg
288848b8605Smrgstruct ureg_src
289848b8605Smrgureg_DECL_immediate_uint( struct ureg_program *,
290848b8605Smrg                          const unsigned *v,
291848b8605Smrg                          unsigned nr );
292848b8605Smrg
293848b8605Smrgstruct ureg_src
294848b8605Smrgureg_DECL_immediate_block_uint( struct ureg_program *,
295848b8605Smrg                                const unsigned *v,
296848b8605Smrg                                unsigned nr );
297848b8605Smrg
298848b8605Smrgstruct ureg_src
299848b8605Smrgureg_DECL_immediate_int( struct ureg_program *,
300848b8605Smrg                         const int *v,
301848b8605Smrg                         unsigned nr );
302848b8605Smrg
303b8e80941Smrgstruct ureg_src
304b8e80941Smrgureg_DECL_immediate_uint64( struct ureg_program *,
305b8e80941Smrg                            const uint64_t *v,
306b8e80941Smrg                            unsigned nr );
307b8e80941Smrg
308b8e80941Smrgstruct ureg_src
309b8e80941Smrgureg_DECL_immediate_int64( struct ureg_program *,
310b8e80941Smrg                           const int64_t *v,
311b8e80941Smrg                           unsigned nr );
312b8e80941Smrg
313848b8605Smrgvoid
314848b8605Smrgureg_DECL_constant2D(struct ureg_program *ureg,
315848b8605Smrg                     unsigned first,
316848b8605Smrg                     unsigned last,
317848b8605Smrg                     unsigned index2D);
318848b8605Smrg
319848b8605Smrgstruct ureg_src
320848b8605Smrgureg_DECL_constant( struct ureg_program *,
321848b8605Smrg                    unsigned index );
322848b8605Smrg
323b8e80941Smrgvoid
324b8e80941Smrgureg_DECL_hw_atomic(struct ureg_program *ureg,
325b8e80941Smrg                    unsigned first,
326b8e80941Smrg                    unsigned last,
327b8e80941Smrg                    unsigned buffer_id,
328b8e80941Smrg                    unsigned array_id);
329b8e80941Smrg
330848b8605Smrgstruct ureg_dst
331848b8605Smrgureg_DECL_temporary( struct ureg_program * );
332848b8605Smrg
333848b8605Smrg/**
334848b8605Smrg * Emit a temporary with the LOCAL declaration flag set.  For use when
335848b8605Smrg * the register value is not required to be preserved across
336848b8605Smrg * subroutine boundaries.
337848b8605Smrg */
338848b8605Smrgstruct ureg_dst
339848b8605Smrgureg_DECL_local_temporary( struct ureg_program * );
340848b8605Smrg
341848b8605Smrg/**
342848b8605Smrg * Declare "size" continuous temporary registers.
343848b8605Smrg */
344848b8605Smrgstruct ureg_dst
345848b8605Smrgureg_DECL_array_temporary( struct ureg_program *,
346848b8605Smrg                           unsigned size,
347848b8605Smrg                           boolean local );
348848b8605Smrg
349848b8605Smrgvoid
350848b8605Smrgureg_release_temporary( struct ureg_program *ureg,
351848b8605Smrg                        struct ureg_dst tmp );
352848b8605Smrg
353848b8605Smrgstruct ureg_dst
354848b8605Smrgureg_DECL_address( struct ureg_program * );
355848b8605Smrg
356848b8605Smrg/* Supply an index to the sampler declaration as this is the hook to
357848b8605Smrg * the external pipe_sampler state.  Users of this function probably
358848b8605Smrg * don't want just any sampler, but a specific one which they've set
359848b8605Smrg * up state for in the context.
360848b8605Smrg */
361848b8605Smrgstruct ureg_src
362848b8605Smrgureg_DECL_sampler( struct ureg_program *,
363848b8605Smrg                   unsigned index );
364848b8605Smrg
365848b8605Smrgstruct ureg_src
366848b8605Smrgureg_DECL_sampler_view(struct ureg_program *,
367848b8605Smrg                       unsigned index,
368b8e80941Smrg                       enum tgsi_texture_type target,
369b8e80941Smrg                       enum tgsi_return_type return_type_x,
370b8e80941Smrg                       enum tgsi_return_type return_type_y,
371b8e80941Smrg                       enum tgsi_return_type return_type_z,
372b8e80941Smrg                       enum tgsi_return_type return_type_w );
373848b8605Smrg
374b8e80941Smrgstruct ureg_src
375b8e80941Smrgureg_DECL_image(struct ureg_program *ureg,
376b8e80941Smrg                unsigned index,
377b8e80941Smrg                enum tgsi_texture_type target,
378b8e80941Smrg                enum pipe_format format,
379b8e80941Smrg                boolean wr,
380b8e80941Smrg                boolean raw);
381b8e80941Smrg
382b8e80941Smrgstruct ureg_src
383b8e80941Smrgureg_DECL_buffer(struct ureg_program *ureg, unsigned nr, bool atomic);
384848b8605Smrg
385b8e80941Smrgstruct ureg_src
386b8e80941Smrgureg_DECL_memory(struct ureg_program *ureg, unsigned memory_type);
387b8e80941Smrg
388b8e80941Smrgstatic inline struct ureg_src
389848b8605Smrgureg_imm4f( struct ureg_program *ureg,
390848b8605Smrg                       float a, float b,
391848b8605Smrg                       float c, float d)
392848b8605Smrg{
393848b8605Smrg   float v[4];
394848b8605Smrg   v[0] = a;
395848b8605Smrg   v[1] = b;
396848b8605Smrg   v[2] = c;
397848b8605Smrg   v[3] = d;
398848b8605Smrg   return ureg_DECL_immediate( ureg, v, 4 );
399848b8605Smrg}
400848b8605Smrg
401b8e80941Smrgstatic inline struct ureg_src
402848b8605Smrgureg_imm3f( struct ureg_program *ureg,
403848b8605Smrg                       float a, float b,
404848b8605Smrg                       float c)
405848b8605Smrg{
406848b8605Smrg   float v[3];
407848b8605Smrg   v[0] = a;
408848b8605Smrg   v[1] = b;
409848b8605Smrg   v[2] = c;
410848b8605Smrg   return ureg_DECL_immediate( ureg, v, 3 );
411848b8605Smrg}
412848b8605Smrg
413b8e80941Smrgstatic inline struct ureg_src
414848b8605Smrgureg_imm2f( struct ureg_program *ureg,
415848b8605Smrg                       float a, float b)
416848b8605Smrg{
417848b8605Smrg   float v[2];
418848b8605Smrg   v[0] = a;
419848b8605Smrg   v[1] = b;
420848b8605Smrg   return ureg_DECL_immediate( ureg, v, 2 );
421848b8605Smrg}
422848b8605Smrg
423b8e80941Smrgstatic inline struct ureg_src
424848b8605Smrgureg_imm1f( struct ureg_program *ureg,
425848b8605Smrg                       float a)
426848b8605Smrg{
427848b8605Smrg   float v[1];
428848b8605Smrg   v[0] = a;
429848b8605Smrg   return ureg_DECL_immediate( ureg, v, 1 );
430848b8605Smrg}
431848b8605Smrg
432b8e80941Smrgstatic inline struct ureg_src
433848b8605Smrgureg_imm4u( struct ureg_program *ureg,
434848b8605Smrg            unsigned a, unsigned b,
435848b8605Smrg            unsigned c, unsigned d)
436848b8605Smrg{
437848b8605Smrg   unsigned v[4];
438848b8605Smrg   v[0] = a;
439848b8605Smrg   v[1] = b;
440848b8605Smrg   v[2] = c;
441848b8605Smrg   v[3] = d;
442848b8605Smrg   return ureg_DECL_immediate_uint( ureg, v, 4 );
443848b8605Smrg}
444848b8605Smrg
445b8e80941Smrgstatic inline struct ureg_src
446848b8605Smrgureg_imm3u( struct ureg_program *ureg,
447848b8605Smrg            unsigned a, unsigned b,
448848b8605Smrg            unsigned c)
449848b8605Smrg{
450848b8605Smrg   unsigned v[3];
451848b8605Smrg   v[0] = a;
452848b8605Smrg   v[1] = b;
453848b8605Smrg   v[2] = c;
454848b8605Smrg   return ureg_DECL_immediate_uint( ureg, v, 3 );
455848b8605Smrg}
456848b8605Smrg
457b8e80941Smrgstatic inline struct ureg_src
458848b8605Smrgureg_imm2u( struct ureg_program *ureg,
459848b8605Smrg            unsigned a, unsigned b)
460848b8605Smrg{
461848b8605Smrg   unsigned v[2];
462848b8605Smrg   v[0] = a;
463848b8605Smrg   v[1] = b;
464848b8605Smrg   return ureg_DECL_immediate_uint( ureg, v, 2 );
465848b8605Smrg}
466848b8605Smrg
467b8e80941Smrgstatic inline struct ureg_src
468848b8605Smrgureg_imm1u( struct ureg_program *ureg,
469848b8605Smrg            unsigned a)
470848b8605Smrg{
471848b8605Smrg   return ureg_DECL_immediate_uint( ureg, &a, 1 );
472848b8605Smrg}
473848b8605Smrg
474b8e80941Smrgstatic inline struct ureg_src
475848b8605Smrgureg_imm4i( struct ureg_program *ureg,
476848b8605Smrg            int a, int b,
477848b8605Smrg            int c, int d)
478848b8605Smrg{
479848b8605Smrg   int v[4];
480848b8605Smrg   v[0] = a;
481848b8605Smrg   v[1] = b;
482848b8605Smrg   v[2] = c;
483848b8605Smrg   v[3] = d;
484848b8605Smrg   return ureg_DECL_immediate_int( ureg, v, 4 );
485848b8605Smrg}
486848b8605Smrg
487b8e80941Smrgstatic inline struct ureg_src
488848b8605Smrgureg_imm3i( struct ureg_program *ureg,
489848b8605Smrg            int a, int b,
490848b8605Smrg            int c)
491848b8605Smrg{
492848b8605Smrg   int v[3];
493848b8605Smrg   v[0] = a;
494848b8605Smrg   v[1] = b;
495848b8605Smrg   v[2] = c;
496848b8605Smrg   return ureg_DECL_immediate_int( ureg, v, 3 );
497848b8605Smrg}
498848b8605Smrg
499b8e80941Smrgstatic inline struct ureg_src
500848b8605Smrgureg_imm2i( struct ureg_program *ureg,
501848b8605Smrg            int a, int b)
502848b8605Smrg{
503848b8605Smrg   int v[2];
504848b8605Smrg   v[0] = a;
505848b8605Smrg   v[1] = b;
506848b8605Smrg   return ureg_DECL_immediate_int( ureg, v, 2 );
507848b8605Smrg}
508848b8605Smrg
509b8e80941Smrgstatic inline struct ureg_src
510848b8605Smrgureg_imm1i( struct ureg_program *ureg,
511848b8605Smrg            int a)
512848b8605Smrg{
513848b8605Smrg   return ureg_DECL_immediate_int( ureg, &a, 1 );
514848b8605Smrg}
515848b8605Smrg
516848b8605Smrg/* Where the destination register has a valid file, but an empty
517848b8605Smrg * writemask.
518848b8605Smrg */
519b8e80941Smrgstatic inline boolean
520848b8605Smrgureg_dst_is_empty( struct ureg_dst dst )
521848b8605Smrg{
522848b8605Smrg   return dst.File != TGSI_FILE_NULL &&
523848b8605Smrg          dst.WriteMask == 0;
524848b8605Smrg}
525848b8605Smrg
526848b8605Smrg/***********************************************************************
527848b8605Smrg * Functions for patching up labels
528848b8605Smrg */
529848b8605Smrg
530848b8605Smrg
531848b8605Smrg/* Will return a number which can be used in a label to point to the
532848b8605Smrg * next instruction to be emitted.
533848b8605Smrg */
534848b8605Smrgunsigned
535848b8605Smrgureg_get_instruction_number( struct ureg_program *ureg );
536848b8605Smrg
537848b8605Smrg
538848b8605Smrg/* Patch a given label (expressed as a token number) to point to a
539848b8605Smrg * given instruction (expressed as an instruction number).
540848b8605Smrg *
541848b8605Smrg * Labels are obtained from instruction emitters, eg ureg_CAL().
542848b8605Smrg * Instruction numbers are obtained from ureg_get_instruction_number(),
543848b8605Smrg * above.
544848b8605Smrg */
545848b8605Smrgvoid
546848b8605Smrgureg_fixup_label(struct ureg_program *ureg,
547848b8605Smrg                 unsigned label_token,
548848b8605Smrg                 unsigned instruction_number );
549848b8605Smrg
550848b8605Smrg
551848b8605Smrg/* Generic instruction emitter.  Use if you need to pass the opcode as
552848b8605Smrg * a parameter, rather than using the emit_OP() variants below.
553848b8605Smrg */
554848b8605Smrgvoid
555848b8605Smrgureg_insn(struct ureg_program *ureg,
556b8e80941Smrg          enum tgsi_opcode opcode,
557848b8605Smrg          const struct ureg_dst *dst,
558848b8605Smrg          unsigned nr_dst,
559848b8605Smrg          const struct ureg_src *src,
560b8e80941Smrg          unsigned nr_src,
561b8e80941Smrg          unsigned precise );
562848b8605Smrg
563848b8605Smrg
564848b8605Smrgvoid
565848b8605Smrgureg_tex_insn(struct ureg_program *ureg,
566b8e80941Smrg              enum tgsi_opcode opcode,
567848b8605Smrg              const struct ureg_dst *dst,
568848b8605Smrg              unsigned nr_dst,
569b8e80941Smrg              enum tgsi_texture_type target,
570b8e80941Smrg              enum tgsi_return_type return_type,
571848b8605Smrg              const struct tgsi_texture_offset *texoffsets,
572848b8605Smrg              unsigned nr_offset,
573848b8605Smrg              const struct ureg_src *src,
574848b8605Smrg              unsigned nr_src );
575848b8605Smrg
576848b8605Smrg
577848b8605Smrgvoid
578b8e80941Smrgureg_memory_insn(struct ureg_program *ureg,
579b8e80941Smrg                 enum tgsi_opcode opcode,
580b8e80941Smrg                 const struct ureg_dst *dst,
581b8e80941Smrg                 unsigned nr_dst,
582b8e80941Smrg                 const struct ureg_src *src,
583b8e80941Smrg                 unsigned nr_src,
584b8e80941Smrg                 unsigned qualifier,
585b8e80941Smrg                 enum tgsi_texture_type texture,
586b8e80941Smrg                 enum pipe_format format);
587848b8605Smrg
588848b8605Smrg/***********************************************************************
589848b8605Smrg * Internal instruction helpers, don't call these directly:
590848b8605Smrg */
591848b8605Smrg
592848b8605Smrgstruct ureg_emit_insn_result {
593848b8605Smrg   unsigned insn_token;       /*< Used to fixup insn size. */
594848b8605Smrg   unsigned extended_token;   /*< Used to set the Extended bit, usually the same as insn_token. */
595848b8605Smrg};
596848b8605Smrg
597848b8605Smrgstruct ureg_emit_insn_result
598848b8605Smrgureg_emit_insn(struct ureg_program *ureg,
599b8e80941Smrg               enum tgsi_opcode opcode,
600848b8605Smrg               boolean saturate,
601b8e80941Smrg               unsigned precise,
602848b8605Smrg               unsigned num_dst,
603b8e80941Smrg               unsigned num_src);
604848b8605Smrg
605848b8605Smrgvoid
606848b8605Smrgureg_emit_label(struct ureg_program *ureg,
607848b8605Smrg                unsigned insn_token,
608848b8605Smrg                unsigned *label_token );
609848b8605Smrg
610848b8605Smrgvoid
611848b8605Smrgureg_emit_texture(struct ureg_program *ureg,
612848b8605Smrg                  unsigned insn_token,
613b8e80941Smrg                  enum tgsi_texture_type target,
614b8e80941Smrg                  enum tgsi_return_type return_type,
615b8e80941Smrg                  unsigned num_offsets);
616848b8605Smrg
617848b8605Smrgvoid
618848b8605Smrgureg_emit_texture_offset(struct ureg_program *ureg,
619848b8605Smrg                         const struct tgsi_texture_offset *offset);
620848b8605Smrg
621b8e80941Smrgvoid
622b8e80941Smrgureg_emit_memory(struct ureg_program *ureg,
623b8e80941Smrg                 unsigned insn_token,
624b8e80941Smrg                 unsigned qualifier,
625b8e80941Smrg                 enum tgsi_texture_type texture,
626b8e80941Smrg                 enum pipe_format format);
627b8e80941Smrg
628848b8605Smrgvoid
629848b8605Smrgureg_emit_dst( struct ureg_program *ureg,
630848b8605Smrg               struct ureg_dst dst );
631848b8605Smrg
632848b8605Smrgvoid
633848b8605Smrgureg_emit_src( struct ureg_program *ureg,
634848b8605Smrg               struct ureg_src src );
635848b8605Smrg
636848b8605Smrgvoid
637848b8605Smrgureg_fixup_insn_size(struct ureg_program *ureg,
638848b8605Smrg                     unsigned insn );
639848b8605Smrg
640848b8605Smrg
641848b8605Smrg#define OP00( op )                                              \
642b8e80941Smrgstatic inline void ureg_##op( struct ureg_program *ureg )       \
643848b8605Smrg{                                                               \
644b8e80941Smrg   enum tgsi_opcode opcode = TGSI_OPCODE_##op;                  \
645848b8605Smrg   struct ureg_emit_insn_result insn;                           \
646848b8605Smrg   insn = ureg_emit_insn(ureg,                                  \
647848b8605Smrg                         opcode,                                \
648848b8605Smrg                         FALSE,                                 \
649b8e80941Smrg                         0,                                     \
650848b8605Smrg                         0,                                     \
651848b8605Smrg                         0);                                    \
652848b8605Smrg   ureg_fixup_insn_size( ureg, insn.insn_token );               \
653848b8605Smrg}
654848b8605Smrg
655848b8605Smrg#define OP01( op )                                              \
656b8e80941Smrgstatic inline void ureg_##op( struct ureg_program *ureg,        \
657848b8605Smrg                              struct ureg_src src )             \
658848b8605Smrg{                                                               \
659b8e80941Smrg   enum tgsi_opcode opcode = TGSI_OPCODE_##op;                  \
660848b8605Smrg   struct ureg_emit_insn_result insn;                           \
661848b8605Smrg   insn = ureg_emit_insn(ureg,                                  \
662848b8605Smrg                         opcode,                                \
663848b8605Smrg                         FALSE,                                 \
664b8e80941Smrg                         0,                                     \
665848b8605Smrg                         0,                                     \
666848b8605Smrg                         1);                                    \
667848b8605Smrg   ureg_emit_src( ureg, src );                                  \
668848b8605Smrg   ureg_fixup_insn_size( ureg, insn.insn_token );               \
669848b8605Smrg}
670848b8605Smrg
671848b8605Smrg#define OP00_LBL( op )                                          \
672b8e80941Smrgstatic inline void ureg_##op( struct ureg_program *ureg,        \
673848b8605Smrg                              unsigned *label_token )           \
674848b8605Smrg{                                                               \
675b8e80941Smrg   enum tgsi_opcode opcode = TGSI_OPCODE_##op;                  \
676848b8605Smrg   struct ureg_emit_insn_result insn;                           \
677848b8605Smrg   insn = ureg_emit_insn(ureg,                                  \
678848b8605Smrg                         opcode,                                \
679848b8605Smrg                         FALSE,                                 \
680b8e80941Smrg                         0,                                     \
681848b8605Smrg                         0,                                     \
682848b8605Smrg                         0);                                    \
683848b8605Smrg   ureg_emit_label( ureg, insn.extended_token, label_token );   \
684848b8605Smrg   ureg_fixup_insn_size( ureg, insn.insn_token );               \
685848b8605Smrg}
686848b8605Smrg
687848b8605Smrg#define OP01_LBL( op )                                          \
688b8e80941Smrgstatic inline void ureg_##op( struct ureg_program *ureg,        \
689848b8605Smrg                              struct ureg_src src,              \
690848b8605Smrg                              unsigned *label_token )          \
691848b8605Smrg{                                                               \
692b8e80941Smrg   enum tgsi_opcode opcode = TGSI_OPCODE_##op;                  \
693848b8605Smrg   struct ureg_emit_insn_result insn;                           \
694848b8605Smrg   insn = ureg_emit_insn(ureg,                                  \
695848b8605Smrg                         opcode,                                \
696848b8605Smrg                         FALSE,                                 \
697b8e80941Smrg                         0,                                     \
698848b8605Smrg                         0,                                     \
699848b8605Smrg                         1);                                    \
700848b8605Smrg   ureg_emit_label( ureg, insn.extended_token, label_token );   \
701848b8605Smrg   ureg_emit_src( ureg, src );                                  \
702848b8605Smrg   ureg_fixup_insn_size( ureg, insn.insn_token );               \
703848b8605Smrg}
704848b8605Smrg
705848b8605Smrg#define OP10( op )                                                      \
706b8e80941Smrgstatic inline void ureg_##op( struct ureg_program *ureg,                \
707848b8605Smrg                              struct ureg_dst dst )                     \
708848b8605Smrg{                                                                       \
709b8e80941Smrg   enum tgsi_opcode opcode = TGSI_OPCODE_##op;                          \
710848b8605Smrg   struct ureg_emit_insn_result insn;                                   \
711848b8605Smrg   if (ureg_dst_is_empty(dst))                                          \
712848b8605Smrg      return;                                                           \
713848b8605Smrg   insn = ureg_emit_insn(ureg,                                          \
714848b8605Smrg                         opcode,                                        \
715848b8605Smrg                         dst.Saturate,                                  \
716b8e80941Smrg                         0,                                             \
717848b8605Smrg                         1,                                             \
718848b8605Smrg                         0);                                            \
719848b8605Smrg   ureg_emit_dst( ureg, dst );                                          \
720848b8605Smrg   ureg_fixup_insn_size( ureg, insn.insn_token );                       \
721848b8605Smrg}
722848b8605Smrg
723848b8605Smrg
724848b8605Smrg#define OP11( op )                                                      \
725b8e80941Smrgstatic inline void ureg_##op( struct ureg_program *ureg,                \
726848b8605Smrg                              struct ureg_dst dst,                      \
727848b8605Smrg                              struct ureg_src src )                     \
728848b8605Smrg{                                                                       \
729b8e80941Smrg   enum tgsi_opcode opcode = TGSI_OPCODE_##op;                          \
730848b8605Smrg   struct ureg_emit_insn_result insn;                                   \
731848b8605Smrg   if (ureg_dst_is_empty(dst))                                          \
732848b8605Smrg      return;                                                           \
733848b8605Smrg   insn = ureg_emit_insn(ureg,                                          \
734848b8605Smrg                         opcode,                                        \
735848b8605Smrg                         dst.Saturate,                                  \
736b8e80941Smrg                         0,                                             \
737848b8605Smrg                         1,                                             \
738848b8605Smrg                         1);                                            \
739848b8605Smrg   ureg_emit_dst( ureg, dst );                                          \
740848b8605Smrg   ureg_emit_src( ureg, src );                                          \
741848b8605Smrg   ureg_fixup_insn_size( ureg, insn.insn_token );                       \
742848b8605Smrg}
743848b8605Smrg
744848b8605Smrg#define OP12( op )                                                      \
745b8e80941Smrgstatic inline void ureg_##op( struct ureg_program *ureg,                \
746848b8605Smrg                              struct ureg_dst dst,                      \
747848b8605Smrg                              struct ureg_src src0,                     \
748848b8605Smrg                              struct ureg_src src1 )                    \
749848b8605Smrg{                                                                       \
750b8e80941Smrg   enum tgsi_opcode opcode = TGSI_OPCODE_##op;                          \
751848b8605Smrg   struct ureg_emit_insn_result insn;                                   \
752848b8605Smrg   if (ureg_dst_is_empty(dst))                                          \
753848b8605Smrg      return;                                                           \
754848b8605Smrg   insn = ureg_emit_insn(ureg,                                          \
755848b8605Smrg                         opcode,                                        \
756848b8605Smrg                         dst.Saturate,                                  \
757b8e80941Smrg                         0,                                             \
758848b8605Smrg                         1,                                             \
759848b8605Smrg                         2);                                            \
760848b8605Smrg   ureg_emit_dst( ureg, dst );                                          \
761848b8605Smrg   ureg_emit_src( ureg, src0 );                                         \
762848b8605Smrg   ureg_emit_src( ureg, src1 );                                         \
763848b8605Smrg   ureg_fixup_insn_size( ureg, insn.insn_token );                       \
764848b8605Smrg}
765848b8605Smrg
766848b8605Smrg#define OP12_TEX( op )                                                  \
767b8e80941Smrgstatic inline void ureg_##op( struct ureg_program *ureg,                \
768848b8605Smrg                              struct ureg_dst dst,                      \
769b8e80941Smrg                              enum tgsi_texture_type target,            \
770848b8605Smrg                              struct ureg_src src0,                     \
771848b8605Smrg                              struct ureg_src src1 )                    \
772848b8605Smrg{                                                                       \
773b8e80941Smrg   enum tgsi_opcode opcode = TGSI_OPCODE_##op;                          \
774b8e80941Smrg   enum tgsi_return_type return_type = TGSI_RETURN_TYPE_UNKNOWN;        \
775848b8605Smrg   struct ureg_emit_insn_result insn;                                   \
776848b8605Smrg   if (ureg_dst_is_empty(dst))                                          \
777848b8605Smrg      return;                                                           \
778848b8605Smrg   insn = ureg_emit_insn(ureg,                                          \
779848b8605Smrg                         opcode,                                        \
780848b8605Smrg                         dst.Saturate,                                  \
781b8e80941Smrg                         0,                                             \
782848b8605Smrg                         1,                                             \
783848b8605Smrg                         2);                                            \
784b8e80941Smrg   ureg_emit_texture( ureg, insn.extended_token, target,                \
785b8e80941Smrg                      return_type, 0 );                                 \
786848b8605Smrg   ureg_emit_dst( ureg, dst );                                          \
787848b8605Smrg   ureg_emit_src( ureg, src0 );                                         \
788848b8605Smrg   ureg_emit_src( ureg, src1 );                                         \
789848b8605Smrg   ureg_fixup_insn_size( ureg, insn.insn_token );                       \
790848b8605Smrg}
791848b8605Smrg
792848b8605Smrg#define OP13( op )                                                      \
793b8e80941Smrgstatic inline void ureg_##op( struct ureg_program *ureg,                \
794848b8605Smrg                              struct ureg_dst dst,                      \
795848b8605Smrg                              struct ureg_src src0,                     \
796848b8605Smrg                              struct ureg_src src1,                     \
797848b8605Smrg                              struct ureg_src src2 )                    \
798848b8605Smrg{                                                                       \
799b8e80941Smrg   enum tgsi_opcode opcode = TGSI_OPCODE_##op;                          \
800848b8605Smrg   struct ureg_emit_insn_result insn;                                   \
801848b8605Smrg   if (ureg_dst_is_empty(dst))                                          \
802848b8605Smrg      return;                                                           \
803848b8605Smrg   insn = ureg_emit_insn(ureg,                                          \
804848b8605Smrg                         opcode,                                        \
805848b8605Smrg                         dst.Saturate,                                  \
806b8e80941Smrg                         0,                                             \
807848b8605Smrg                         1,                                             \
808848b8605Smrg                         3);                                            \
809848b8605Smrg   ureg_emit_dst( ureg, dst );                                          \
810848b8605Smrg   ureg_emit_src( ureg, src0 );                                         \
811848b8605Smrg   ureg_emit_src( ureg, src1 );                                         \
812848b8605Smrg   ureg_emit_src( ureg, src2 );                                         \
813848b8605Smrg   ureg_fixup_insn_size( ureg, insn.insn_token );                       \
814848b8605Smrg}
815848b8605Smrg
816848b8605Smrg#define OP14_TEX( op )                                                  \
817b8e80941Smrgstatic inline void ureg_##op( struct ureg_program *ureg,                \
818848b8605Smrg                              struct ureg_dst dst,                      \
819b8e80941Smrg                              enum tgsi_texture_type target,            \
820848b8605Smrg                              struct ureg_src src0,                     \
821848b8605Smrg                              struct ureg_src src1,                     \
822848b8605Smrg                              struct ureg_src src2,                     \
823848b8605Smrg                              struct ureg_src src3 )                    \
824848b8605Smrg{                                                                       \
825b8e80941Smrg   enum tgsi_opcode opcode = TGSI_OPCODE_##op;                          \
826b8e80941Smrg   enum tgsi_return_type return_type = TGSI_RETURN_TYPE_UNKNOWN;        \
827848b8605Smrg   struct ureg_emit_insn_result insn;                                   \
828848b8605Smrg   if (ureg_dst_is_empty(dst))                                          \
829848b8605Smrg      return;                                                           \
830848b8605Smrg   insn = ureg_emit_insn(ureg,                                          \
831848b8605Smrg                         opcode,                                        \
832848b8605Smrg                         dst.Saturate,                                  \
833b8e80941Smrg                         0,                                             \
834848b8605Smrg                         1,                                             \
835848b8605Smrg                         4);                                            \
836b8e80941Smrg   ureg_emit_texture( ureg, insn.extended_token, target,                \
837b8e80941Smrg                      return_type, 0 );                                 \
838848b8605Smrg   ureg_emit_dst( ureg, dst );                                          \
839848b8605Smrg   ureg_emit_src( ureg, src0 );                                         \
840848b8605Smrg   ureg_emit_src( ureg, src1 );                                         \
841848b8605Smrg   ureg_emit_src( ureg, src2 );                                         \
842848b8605Smrg   ureg_emit_src( ureg, src3 );                                         \
843848b8605Smrg   ureg_fixup_insn_size( ureg, insn.insn_token );                       \
844848b8605Smrg}
845848b8605Smrg
846848b8605Smrg/* Use a template include to generate a correctly-typed ureg_OP()
847848b8605Smrg * function for each TGSI opcode:
848848b8605Smrg */
849848b8605Smrg#include "tgsi_opcode_tmp.h"
850848b8605Smrg
851848b8605Smrg
852848b8605Smrg/***********************************************************************
853848b8605Smrg * Inline helpers for manipulating register structs:
854848b8605Smrg */
855b8e80941Smrgstatic inline struct ureg_src
856848b8605Smrgureg_negate( struct ureg_src reg )
857848b8605Smrg{
858848b8605Smrg   assert(reg.File != TGSI_FILE_NULL);
859848b8605Smrg   reg.Negate ^= 1;
860848b8605Smrg   return reg;
861848b8605Smrg}
862848b8605Smrg
863b8e80941Smrgstatic inline struct ureg_src
864848b8605Smrgureg_abs( struct ureg_src reg )
865848b8605Smrg{
866848b8605Smrg   assert(reg.File != TGSI_FILE_NULL);
867848b8605Smrg   reg.Absolute = 1;
868848b8605Smrg   reg.Negate = 0;
869848b8605Smrg   return reg;
870848b8605Smrg}
871848b8605Smrg
872b8e80941Smrgstatic inline struct ureg_src
873848b8605Smrgureg_swizzle( struct ureg_src reg,
874848b8605Smrg              int x, int y, int z, int w )
875848b8605Smrg{
876848b8605Smrg   unsigned swz = ( (reg.SwizzleX << 0) |
877848b8605Smrg                    (reg.SwizzleY << 2) |
878848b8605Smrg                    (reg.SwizzleZ << 4) |
879848b8605Smrg                    (reg.SwizzleW << 6));
880848b8605Smrg
881848b8605Smrg   assert(reg.File != TGSI_FILE_NULL);
882848b8605Smrg   assert(x < 4);
883848b8605Smrg   assert(y < 4);
884848b8605Smrg   assert(z < 4);
885848b8605Smrg   assert(w < 4);
886848b8605Smrg
887848b8605Smrg   reg.SwizzleX = (swz >> (x*2)) & 0x3;
888848b8605Smrg   reg.SwizzleY = (swz >> (y*2)) & 0x3;
889848b8605Smrg   reg.SwizzleZ = (swz >> (z*2)) & 0x3;
890848b8605Smrg   reg.SwizzleW = (swz >> (w*2)) & 0x3;
891848b8605Smrg   return reg;
892848b8605Smrg}
893848b8605Smrg
894b8e80941Smrgstatic inline struct ureg_src
895848b8605Smrgureg_scalar( struct ureg_src reg, int x )
896848b8605Smrg{
897848b8605Smrg   return ureg_swizzle(reg, x, x, x, x);
898848b8605Smrg}
899848b8605Smrg
900b8e80941Smrgstatic inline struct ureg_dst
901848b8605Smrgureg_writemask( struct ureg_dst reg,
902848b8605Smrg                unsigned writemask )
903848b8605Smrg{
904848b8605Smrg   assert(reg.File != TGSI_FILE_NULL);
905848b8605Smrg   reg.WriteMask &= writemask;
906848b8605Smrg   return reg;
907848b8605Smrg}
908848b8605Smrg
909b8e80941Smrgstatic inline struct ureg_dst
910848b8605Smrgureg_saturate( struct ureg_dst reg )
911848b8605Smrg{
912848b8605Smrg   assert(reg.File != TGSI_FILE_NULL);
913848b8605Smrg   reg.Saturate = 1;
914848b8605Smrg   return reg;
915848b8605Smrg}
916848b8605Smrg
917b8e80941Smrgstatic inline struct ureg_dst
918848b8605Smrgureg_dst_indirect( struct ureg_dst reg, struct ureg_src addr )
919848b8605Smrg{
920848b8605Smrg   assert(reg.File != TGSI_FILE_NULL);
921848b8605Smrg   reg.Indirect = 1;
922848b8605Smrg   reg.IndirectFile = addr.File;
923848b8605Smrg   reg.IndirectIndex = addr.Index;
924848b8605Smrg   reg.IndirectSwizzle = addr.SwizzleX;
925848b8605Smrg   return reg;
926848b8605Smrg}
927848b8605Smrg
928b8e80941Smrgstatic inline struct ureg_src
929848b8605Smrgureg_src_indirect( struct ureg_src reg, struct ureg_src addr )
930848b8605Smrg{
931848b8605Smrg   assert(reg.File != TGSI_FILE_NULL);
932848b8605Smrg   reg.Indirect = 1;
933848b8605Smrg   reg.IndirectFile = addr.File;
934848b8605Smrg   reg.IndirectIndex = addr.Index;
935848b8605Smrg   reg.IndirectSwizzle = addr.SwizzleX;
936848b8605Smrg   return reg;
937848b8605Smrg}
938848b8605Smrg
939b8e80941Smrgstatic inline struct ureg_dst
940b8e80941Smrgureg_dst_dimension( struct ureg_dst reg, int index )
941b8e80941Smrg{
942b8e80941Smrg   assert(reg.File != TGSI_FILE_NULL);
943b8e80941Smrg   reg.Dimension = 1;
944b8e80941Smrg   reg.DimIndirect = 0;
945b8e80941Smrg   reg.DimensionIndex = index;
946b8e80941Smrg   return reg;
947b8e80941Smrg}
948b8e80941Smrg
949b8e80941Smrgstatic inline struct ureg_src
950848b8605Smrgureg_src_dimension( struct ureg_src reg, int index )
951848b8605Smrg{
952848b8605Smrg   assert(reg.File != TGSI_FILE_NULL);
953848b8605Smrg   reg.Dimension = 1;
954848b8605Smrg   reg.DimIndirect = 0;
955848b8605Smrg   reg.DimensionIndex = index;
956848b8605Smrg   return reg;
957848b8605Smrg}
958848b8605Smrg
959b8e80941Smrgstatic inline struct ureg_dst
960b8e80941Smrgureg_dst_dimension_indirect( struct ureg_dst reg, struct ureg_src addr,
961b8e80941Smrg                             int index )
962b8e80941Smrg{
963b8e80941Smrg   assert(reg.File != TGSI_FILE_NULL);
964b8e80941Smrg   reg.Dimension = 1;
965b8e80941Smrg   reg.DimIndirect = 1;
966b8e80941Smrg   reg.DimensionIndex = index;
967b8e80941Smrg   reg.DimIndFile = addr.File;
968b8e80941Smrg   reg.DimIndIndex = addr.Index;
969b8e80941Smrg   reg.DimIndSwizzle = addr.SwizzleX;
970b8e80941Smrg   return reg;
971b8e80941Smrg}
972848b8605Smrg
973b8e80941Smrgstatic inline struct ureg_src
974848b8605Smrgureg_src_dimension_indirect( struct ureg_src reg, struct ureg_src addr,
975848b8605Smrg                             int index )
976848b8605Smrg{
977848b8605Smrg   assert(reg.File != TGSI_FILE_NULL);
978848b8605Smrg   reg.Dimension = 1;
979848b8605Smrg   reg.DimIndirect = 1;
980848b8605Smrg   reg.DimensionIndex = index;
981848b8605Smrg   reg.DimIndFile = addr.File;
982848b8605Smrg   reg.DimIndIndex = addr.Index;
983848b8605Smrg   reg.DimIndSwizzle = addr.SwizzleX;
984848b8605Smrg   return reg;
985848b8605Smrg}
986848b8605Smrg
987b8e80941Smrgstatic inline struct ureg_src
988b8e80941Smrgureg_src_array_offset(struct ureg_src reg, int offset)
989b8e80941Smrg{
990b8e80941Smrg   reg.Index += offset;
991b8e80941Smrg   return reg;
992b8e80941Smrg}
993b8e80941Smrg
994b8e80941Smrgstatic inline struct ureg_dst
995848b8605Smrgureg_dst_array_offset( struct ureg_dst reg, int offset )
996848b8605Smrg{
997848b8605Smrg   reg.Index += offset;
998848b8605Smrg   return reg;
999848b8605Smrg}
1000848b8605Smrg
1001b8e80941Smrgstatic inline struct ureg_dst
1002b8e80941Smrgureg_dst_array_register(unsigned file,
1003b8e80941Smrg                        unsigned index,
1004b8e80941Smrg                        unsigned array_id)
1005848b8605Smrg{
1006848b8605Smrg   struct ureg_dst dst;
1007848b8605Smrg
1008b8e80941Smrg   dst.File      = file;
1009b8e80941Smrg   dst.WriteMask = TGSI_WRITEMASK_XYZW;
1010b8e80941Smrg   dst.Indirect  = 0;
1011b8e80941Smrg   dst.IndirectFile = TGSI_FILE_NULL;
1012b8e80941Smrg   dst.IndirectIndex = 0;
1013b8e80941Smrg   dst.IndirectSwizzle = 0;
1014b8e80941Smrg   dst.Saturate  = 0;
1015b8e80941Smrg   dst.Index     = index;
1016b8e80941Smrg   dst.Dimension = 0;
1017b8e80941Smrg   dst.DimensionIndex = 0;
1018b8e80941Smrg   dst.DimIndirect = 0;
1019b8e80941Smrg   dst.DimIndFile = TGSI_FILE_NULL;
1020b8e80941Smrg   dst.DimIndIndex = 0;
1021b8e80941Smrg   dst.DimIndSwizzle = 0;
1022b8e80941Smrg   dst.ArrayID = array_id;
1023b8e80941Smrg   dst.Invariant = 0;
1024b8e80941Smrg
1025b8e80941Smrg   return dst;
1026b8e80941Smrg}
1027b8e80941Smrg
1028b8e80941Smrgstatic inline struct ureg_dst
1029b8e80941Smrgureg_dst_register(unsigned file,
1030b8e80941Smrg                  unsigned index)
1031b8e80941Smrg{
1032b8e80941Smrg   return ureg_dst_array_register(file, index, 0);
1033b8e80941Smrg}
1034b8e80941Smrg
1035b8e80941Smrgstatic inline struct ureg_dst
1036b8e80941Smrgureg_dst( struct ureg_src src )
1037b8e80941Smrg{
1038b8e80941Smrg   struct ureg_dst dst;
1039848b8605Smrg
1040848b8605Smrg   dst.File      = src.File;
1041848b8605Smrg   dst.WriteMask = TGSI_WRITEMASK_XYZW;
1042848b8605Smrg   dst.IndirectFile = src.IndirectFile;
1043848b8605Smrg   dst.Indirect  = src.Indirect;
1044848b8605Smrg   dst.IndirectIndex = src.IndirectIndex;
1045848b8605Smrg   dst.IndirectSwizzle = src.IndirectSwizzle;
1046848b8605Smrg   dst.Saturate  = 0;
1047848b8605Smrg   dst.Index     = src.Index;
1048b8e80941Smrg   dst.Dimension = src.Dimension;
1049b8e80941Smrg   dst.DimensionIndex = src.DimensionIndex;
1050b8e80941Smrg   dst.DimIndirect = src.DimIndirect;
1051b8e80941Smrg   dst.DimIndFile = src.DimIndFile;
1052b8e80941Smrg   dst.DimIndIndex = src.DimIndIndex;
1053b8e80941Smrg   dst.DimIndSwizzle = src.DimIndSwizzle;
1054848b8605Smrg   dst.ArrayID = src.ArrayID;
1055b8e80941Smrg   dst.Invariant = 0;
1056848b8605Smrg
1057848b8605Smrg   return dst;
1058848b8605Smrg}
1059848b8605Smrg
1060b8e80941Smrgstatic inline struct ureg_src
1061b8e80941Smrgureg_src_array_register(unsigned file,
1062b8e80941Smrg                        unsigned index,
1063b8e80941Smrg                        unsigned array_id)
1064848b8605Smrg{
1065848b8605Smrg   struct ureg_src src;
1066848b8605Smrg
1067848b8605Smrg   src.File = file;
1068848b8605Smrg   src.SwizzleX = TGSI_SWIZZLE_X;
1069848b8605Smrg   src.SwizzleY = TGSI_SWIZZLE_Y;
1070848b8605Smrg   src.SwizzleZ = TGSI_SWIZZLE_Z;
1071848b8605Smrg   src.SwizzleW = TGSI_SWIZZLE_W;
1072848b8605Smrg   src.Indirect = 0;
1073848b8605Smrg   src.IndirectFile = TGSI_FILE_NULL;
1074848b8605Smrg   src.IndirectIndex = 0;
1075848b8605Smrg   src.IndirectSwizzle = 0;
1076848b8605Smrg   src.Absolute = 0;
1077848b8605Smrg   src.Index = index;
1078848b8605Smrg   src.Negate = 0;
1079848b8605Smrg   src.Dimension = 0;
1080848b8605Smrg   src.DimensionIndex = 0;
1081848b8605Smrg   src.DimIndirect = 0;
1082848b8605Smrg   src.DimIndFile = TGSI_FILE_NULL;
1083848b8605Smrg   src.DimIndIndex = 0;
1084848b8605Smrg   src.DimIndSwizzle = 0;
1085b8e80941Smrg   src.ArrayID = array_id;
1086848b8605Smrg
1087848b8605Smrg   return src;
1088848b8605Smrg}
1089848b8605Smrg
1090b8e80941Smrgstatic inline struct ureg_src
1091b8e80941Smrgureg_src_register(unsigned file,
1092b8e80941Smrg                  unsigned index)
1093b8e80941Smrg{
1094b8e80941Smrg   return ureg_src_array_register(file, index, 0);
1095b8e80941Smrg}
1096b8e80941Smrg
1097b8e80941Smrgstatic inline struct ureg_src
1098848b8605Smrgureg_src( struct ureg_dst dst )
1099848b8605Smrg{
1100848b8605Smrg   struct ureg_src src;
1101848b8605Smrg
1102848b8605Smrg   src.File      = dst.File;
1103848b8605Smrg   src.SwizzleX  = TGSI_SWIZZLE_X;
1104848b8605Smrg   src.SwizzleY  = TGSI_SWIZZLE_Y;
1105848b8605Smrg   src.SwizzleZ  = TGSI_SWIZZLE_Z;
1106848b8605Smrg   src.SwizzleW  = TGSI_SWIZZLE_W;
1107848b8605Smrg   src.Indirect  = dst.Indirect;
1108848b8605Smrg   src.IndirectFile = dst.IndirectFile;
1109848b8605Smrg   src.IndirectIndex = dst.IndirectIndex;
1110848b8605Smrg   src.IndirectSwizzle = dst.IndirectSwizzle;
1111848b8605Smrg   src.Absolute  = 0;
1112848b8605Smrg   src.Index     = dst.Index;
1113848b8605Smrg   src.Negate    = 0;
1114b8e80941Smrg   src.Dimension = dst.Dimension;
1115b8e80941Smrg   src.DimensionIndex = dst.DimensionIndex;
1116b8e80941Smrg   src.DimIndirect = dst.DimIndirect;
1117b8e80941Smrg   src.DimIndFile = dst.DimIndFile;
1118b8e80941Smrg   src.DimIndIndex = dst.DimIndIndex;
1119b8e80941Smrg   src.DimIndSwizzle = dst.DimIndSwizzle;
1120848b8605Smrg   src.ArrayID = dst.ArrayID;
1121848b8605Smrg
1122848b8605Smrg   return src;
1123848b8605Smrg}
1124848b8605Smrg
1125848b8605Smrg
1126848b8605Smrg
1127b8e80941Smrgstatic inline struct ureg_dst
1128848b8605Smrgureg_dst_undef( void )
1129848b8605Smrg{
1130848b8605Smrg   struct ureg_dst dst;
1131848b8605Smrg
1132848b8605Smrg   dst.File      = TGSI_FILE_NULL;
1133848b8605Smrg   dst.WriteMask = 0;
1134848b8605Smrg   dst.Indirect  = 0;
1135848b8605Smrg   dst.IndirectFile = TGSI_FILE_NULL;
1136848b8605Smrg   dst.IndirectIndex = 0;
1137848b8605Smrg   dst.IndirectSwizzle = 0;
1138848b8605Smrg   dst.Saturate  = 0;
1139848b8605Smrg   dst.Index     = 0;
1140b8e80941Smrg   dst.Dimension = 0;
1141b8e80941Smrg   dst.DimensionIndex = 0;
1142b8e80941Smrg   dst.DimIndirect = 0;
1143b8e80941Smrg   dst.DimIndFile = TGSI_FILE_NULL;
1144b8e80941Smrg   dst.DimIndIndex = 0;
1145b8e80941Smrg   dst.DimIndSwizzle = 0;
1146848b8605Smrg   dst.ArrayID = 0;
1147b8e80941Smrg   dst.Invariant = 0;
1148848b8605Smrg
1149848b8605Smrg   return dst;
1150848b8605Smrg}
1151848b8605Smrg
1152b8e80941Smrgstatic inline struct ureg_src
1153848b8605Smrgureg_src_undef( void )
1154848b8605Smrg{
1155848b8605Smrg   struct ureg_src src;
1156848b8605Smrg
1157848b8605Smrg   src.File      = TGSI_FILE_NULL;
1158848b8605Smrg   src.SwizzleX  = 0;
1159848b8605Smrg   src.SwizzleY  = 0;
1160848b8605Smrg   src.SwizzleZ  = 0;
1161848b8605Smrg   src.SwizzleW  = 0;
1162848b8605Smrg   src.Indirect  = 0;
1163848b8605Smrg   src.IndirectFile = TGSI_FILE_NULL;
1164848b8605Smrg   src.IndirectIndex = 0;
1165848b8605Smrg   src.IndirectSwizzle = 0;
1166848b8605Smrg   src.Absolute  = 0;
1167848b8605Smrg   src.Index     = 0;
1168848b8605Smrg   src.Negate    = 0;
1169848b8605Smrg   src.Dimension = 0;
1170848b8605Smrg   src.DimensionIndex = 0;
1171848b8605Smrg   src.DimIndirect = 0;
1172848b8605Smrg   src.DimIndFile = TGSI_FILE_NULL;
1173848b8605Smrg   src.DimIndIndex = 0;
1174848b8605Smrg   src.DimIndSwizzle = 0;
1175848b8605Smrg   src.ArrayID = 0;
1176848b8605Smrg
1177848b8605Smrg   return src;
1178848b8605Smrg}
1179848b8605Smrg
1180b8e80941Smrgstatic inline boolean
1181848b8605Smrgureg_src_is_undef( struct ureg_src src )
1182848b8605Smrg{
1183848b8605Smrg   return src.File == TGSI_FILE_NULL;
1184848b8605Smrg}
1185848b8605Smrg
1186b8e80941Smrgstatic inline boolean
1187848b8605Smrgureg_dst_is_undef( struct ureg_dst dst )
1188848b8605Smrg{
1189848b8605Smrg   return dst.File == TGSI_FILE_NULL;
1190848b8605Smrg}
1191848b8605Smrg
1192848b8605Smrg
1193848b8605Smrg#ifdef __cplusplus
1194848b8605Smrg}
1195848b8605Smrg#endif
1196848b8605Smrg
1197848b8605Smrg#endif
1198