1848b8605Smrg/**************************************************************************
2848b8605Smrg *
3848b8605Smrg * Copyright 2007 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 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#include "util/u_debug.h"
29848b8605Smrg#include "pipe/p_format.h"
30848b8605Smrg#include "pipe/p_shader_tokens.h"
31848b8605Smrg#include "tgsi_build.h"
32848b8605Smrg#include "tgsi_parse.h"
33848b8605Smrg
34848b8605Smrg
35848b8605Smrg/*
36848b8605Smrg * header
37848b8605Smrg */
38848b8605Smrg
39848b8605Smrgstruct tgsi_header
40848b8605Smrgtgsi_build_header( void )
41848b8605Smrg{
42848b8605Smrg   struct tgsi_header header;
43848b8605Smrg
44848b8605Smrg   header.HeaderSize = 1;
45848b8605Smrg   header.BodySize = 0;
46848b8605Smrg
47848b8605Smrg   return header;
48848b8605Smrg}
49848b8605Smrg
50848b8605Smrgstatic void
51848b8605Smrgheader_headersize_grow( struct tgsi_header *header )
52848b8605Smrg{
53848b8605Smrg   assert( header->HeaderSize < 0xFF );
54848b8605Smrg   assert( header->BodySize == 0 );
55848b8605Smrg
56848b8605Smrg   header->HeaderSize++;
57848b8605Smrg}
58848b8605Smrg
59848b8605Smrgstatic void
60848b8605Smrgheader_bodysize_grow( struct tgsi_header *header )
61848b8605Smrg{
62848b8605Smrg   assert( header->BodySize < 0xFFFFFF );
63848b8605Smrg
64848b8605Smrg   header->BodySize++;
65848b8605Smrg}
66848b8605Smrg
67848b8605Smrgstruct tgsi_processor
68848b8605Smrgtgsi_build_processor(
69848b8605Smrg   unsigned type,
70848b8605Smrg   struct tgsi_header *header )
71848b8605Smrg{
72848b8605Smrg   struct tgsi_processor processor;
73848b8605Smrg
74848b8605Smrg   processor.Processor = type;
75848b8605Smrg   processor.Padding = 0;
76848b8605Smrg
77848b8605Smrg   header_headersize_grow( header );
78848b8605Smrg
79848b8605Smrg   return processor;
80848b8605Smrg}
81848b8605Smrg
82848b8605Smrg/*
83848b8605Smrg * declaration
84848b8605Smrg */
85848b8605Smrg
86848b8605Smrgstatic void
87848b8605Smrgdeclaration_grow(
88848b8605Smrg   struct tgsi_declaration *declaration,
89848b8605Smrg   struct tgsi_header *header )
90848b8605Smrg{
91848b8605Smrg   assert( declaration->NrTokens < 0xFF );
92848b8605Smrg
93848b8605Smrg   declaration->NrTokens++;
94848b8605Smrg
95848b8605Smrg   header_bodysize_grow( header );
96848b8605Smrg}
97848b8605Smrg
98848b8605Smrgstatic struct tgsi_declaration
99848b8605Smrgtgsi_default_declaration( void )
100848b8605Smrg{
101848b8605Smrg   struct tgsi_declaration declaration;
102848b8605Smrg
103848b8605Smrg   declaration.Type = TGSI_TOKEN_TYPE_DECLARATION;
104848b8605Smrg   declaration.NrTokens = 1;
105848b8605Smrg   declaration.File = TGSI_FILE_NULL;
106848b8605Smrg   declaration.UsageMask = TGSI_WRITEMASK_XYZW;
107848b8605Smrg   declaration.Interpolate = 0;
108848b8605Smrg   declaration.Dimension = 0;
109848b8605Smrg   declaration.Semantic = 0;
110848b8605Smrg   declaration.Invariant = 0;
111848b8605Smrg   declaration.Local = 0;
112848b8605Smrg   declaration.Array = 0;
113b8e80941Smrg   declaration.Atomic = 0;
114b8e80941Smrg   declaration.MemType = TGSI_MEMORY_TYPE_GLOBAL;
115848b8605Smrg   declaration.Padding = 0;
116848b8605Smrg
117848b8605Smrg   return declaration;
118848b8605Smrg}
119848b8605Smrg
120848b8605Smrgstatic struct tgsi_declaration
121848b8605Smrgtgsi_build_declaration(
122848b8605Smrg   unsigned file,
123848b8605Smrg   unsigned usage_mask,
124848b8605Smrg   unsigned interpolate,
125848b8605Smrg   unsigned dimension,
126848b8605Smrg   unsigned semantic,
127848b8605Smrg   unsigned invariant,
128848b8605Smrg   unsigned local,
129848b8605Smrg   unsigned array,
130b8e80941Smrg   unsigned atomic,
131b8e80941Smrg   unsigned mem_type,
132848b8605Smrg   struct tgsi_header *header )
133848b8605Smrg{
134848b8605Smrg   struct tgsi_declaration declaration;
135848b8605Smrg
136848b8605Smrg   assert( file < TGSI_FILE_COUNT );
137848b8605Smrg   assert( interpolate < TGSI_INTERPOLATE_COUNT );
138848b8605Smrg
139848b8605Smrg   declaration = tgsi_default_declaration();
140848b8605Smrg   declaration.File = file;
141848b8605Smrg   declaration.UsageMask = usage_mask;
142848b8605Smrg   declaration.Interpolate = interpolate;
143848b8605Smrg   declaration.Dimension = dimension;
144848b8605Smrg   declaration.Semantic = semantic;
145848b8605Smrg   declaration.Invariant = invariant;
146848b8605Smrg   declaration.Local = local;
147848b8605Smrg   declaration.Array = array;
148b8e80941Smrg   declaration.Atomic = atomic;
149b8e80941Smrg   declaration.MemType = mem_type;
150848b8605Smrg   header_bodysize_grow( header );
151848b8605Smrg
152848b8605Smrg   return declaration;
153848b8605Smrg}
154848b8605Smrg
155848b8605Smrgstatic struct tgsi_declaration_range
156848b8605Smrgtgsi_default_declaration_range( void )
157848b8605Smrg{
158848b8605Smrg   struct tgsi_declaration_range dr;
159848b8605Smrg
160848b8605Smrg   dr.First = 0;
161848b8605Smrg   dr.Last = 0;
162848b8605Smrg
163848b8605Smrg   return dr;
164848b8605Smrg}
165848b8605Smrg
166b8e80941Smrgstatic struct tgsi_declaration_dimension
167b8e80941Smrgtgsi_default_declaration_dimension()
168b8e80941Smrg{
169b8e80941Smrg   struct tgsi_declaration_dimension dim;
170b8e80941Smrg
171b8e80941Smrg   dim.Index2D = 0;
172b8e80941Smrg
173b8e80941Smrg   return dim;
174b8e80941Smrg}
175b8e80941Smrg
176848b8605Smrgstatic struct tgsi_declaration_range
177848b8605Smrgtgsi_build_declaration_range(
178848b8605Smrg   unsigned first,
179848b8605Smrg   unsigned last,
180848b8605Smrg   struct tgsi_declaration *declaration,
181848b8605Smrg   struct tgsi_header *header )
182848b8605Smrg{
183848b8605Smrg   struct tgsi_declaration_range declaration_range;
184848b8605Smrg
185848b8605Smrg   assert( last >= first );
186848b8605Smrg   assert( last <= 0xFFFF );
187848b8605Smrg
188848b8605Smrg   declaration_range.First = first;
189848b8605Smrg   declaration_range.Last = last;
190848b8605Smrg
191848b8605Smrg   declaration_grow( declaration, header );
192848b8605Smrg
193848b8605Smrg   return declaration_range;
194848b8605Smrg}
195848b8605Smrg
196848b8605Smrgstatic struct tgsi_declaration_dimension
197848b8605Smrgtgsi_build_declaration_dimension(unsigned index_2d,
198848b8605Smrg                                 struct tgsi_declaration *declaration,
199848b8605Smrg                                 struct tgsi_header *header)
200848b8605Smrg{
201848b8605Smrg   struct tgsi_declaration_dimension dd;
202848b8605Smrg
203848b8605Smrg   assert(index_2d <= 0xFFFF);
204848b8605Smrg
205848b8605Smrg   dd.Index2D = index_2d;
206848b8605Smrg   dd.Padding = 0;
207848b8605Smrg
208848b8605Smrg   declaration_grow(declaration, header);
209848b8605Smrg
210848b8605Smrg   return dd;
211848b8605Smrg}
212848b8605Smrg
213848b8605Smrgstatic struct tgsi_declaration_interp
214848b8605Smrgtgsi_default_declaration_interp( void )
215848b8605Smrg{
216848b8605Smrg   struct tgsi_declaration_interp di;
217848b8605Smrg
218848b8605Smrg   di.Interpolate = TGSI_INTERPOLATE_CONSTANT;
219848b8605Smrg   di.Location = TGSI_INTERPOLATE_LOC_CENTER;
220848b8605Smrg   di.CylindricalWrap = 0;
221848b8605Smrg   di.Padding = 0;
222848b8605Smrg
223848b8605Smrg   return di;
224848b8605Smrg}
225848b8605Smrg
226848b8605Smrgstatic struct tgsi_declaration_interp
227848b8605Smrgtgsi_build_declaration_interp(unsigned interpolate,
228848b8605Smrg                              unsigned interpolate_location,
229848b8605Smrg                              unsigned cylindrical_wrap,
230848b8605Smrg                              struct tgsi_declaration *declaration,
231848b8605Smrg                              struct tgsi_header *header)
232848b8605Smrg{
233848b8605Smrg   struct tgsi_declaration_interp di;
234848b8605Smrg
235848b8605Smrg   di.Interpolate = interpolate;
236848b8605Smrg   di.Location = interpolate_location;
237848b8605Smrg   di.CylindricalWrap = cylindrical_wrap;
238848b8605Smrg   di.Padding = 0;
239848b8605Smrg
240848b8605Smrg   declaration_grow(declaration, header);
241848b8605Smrg
242848b8605Smrg   return di;
243848b8605Smrg}
244848b8605Smrg
245848b8605Smrgstatic struct tgsi_declaration_semantic
246848b8605Smrgtgsi_default_declaration_semantic( void )
247848b8605Smrg{
248848b8605Smrg   struct tgsi_declaration_semantic ds;
249848b8605Smrg
250848b8605Smrg   ds.Name = TGSI_SEMANTIC_POSITION;
251848b8605Smrg   ds.Index = 0;
252b8e80941Smrg   ds.StreamX = 0;
253b8e80941Smrg   ds.StreamY = 0;
254b8e80941Smrg   ds.StreamZ = 0;
255b8e80941Smrg   ds.StreamW = 0;
256848b8605Smrg
257848b8605Smrg   return ds;
258848b8605Smrg}
259848b8605Smrg
260848b8605Smrgstatic struct tgsi_declaration_semantic
261848b8605Smrgtgsi_build_declaration_semantic(
262848b8605Smrg   unsigned semantic_name,
263848b8605Smrg   unsigned semantic_index,
264b8e80941Smrg   unsigned streamx,
265b8e80941Smrg   unsigned streamy,
266b8e80941Smrg   unsigned streamz,
267b8e80941Smrg   unsigned streamw,
268848b8605Smrg   struct tgsi_declaration *declaration,
269848b8605Smrg   struct tgsi_header *header )
270848b8605Smrg{
271848b8605Smrg   struct tgsi_declaration_semantic ds;
272848b8605Smrg
273848b8605Smrg   assert( semantic_name <= TGSI_SEMANTIC_COUNT );
274848b8605Smrg   assert( semantic_index <= 0xFFFF );
275848b8605Smrg
276848b8605Smrg   ds.Name = semantic_name;
277848b8605Smrg   ds.Index = semantic_index;
278b8e80941Smrg   ds.StreamX = streamx;
279b8e80941Smrg   ds.StreamY = streamy;
280b8e80941Smrg   ds.StreamZ = streamz;
281b8e80941Smrg   ds.StreamW = streamw;
282848b8605Smrg
283848b8605Smrg   declaration_grow( declaration, header );
284848b8605Smrg
285848b8605Smrg   return ds;
286848b8605Smrg}
287848b8605Smrg
288b8e80941Smrgstatic struct tgsi_declaration_image
289b8e80941Smrgtgsi_default_declaration_image(void)
290848b8605Smrg{
291b8e80941Smrg   struct tgsi_declaration_image di;
292848b8605Smrg
293b8e80941Smrg   di.Resource = TGSI_TEXTURE_BUFFER;
294b8e80941Smrg   di.Raw = 0;
295b8e80941Smrg   di.Writable = 0;
296b8e80941Smrg   di.Format = 0;
297b8e80941Smrg   di.Padding = 0;
298848b8605Smrg
299b8e80941Smrg   return di;
300848b8605Smrg}
301848b8605Smrg
302b8e80941Smrgstatic struct tgsi_declaration_image
303b8e80941Smrgtgsi_build_declaration_image(unsigned texture,
304b8e80941Smrg                             unsigned format,
305b8e80941Smrg                             unsigned raw,
306b8e80941Smrg                             unsigned writable,
307b8e80941Smrg                             struct tgsi_declaration *declaration,
308b8e80941Smrg                             struct tgsi_header *header)
309848b8605Smrg{
310b8e80941Smrg   struct tgsi_declaration_image di;
311848b8605Smrg
312b8e80941Smrg   di = tgsi_default_declaration_image();
313b8e80941Smrg   di.Resource = texture;
314b8e80941Smrg   di.Format = format;
315b8e80941Smrg   di.Raw = raw;
316b8e80941Smrg   di.Writable = writable;
317848b8605Smrg
318848b8605Smrg   declaration_grow(declaration, header);
319848b8605Smrg
320b8e80941Smrg   return di;
321848b8605Smrg}
322848b8605Smrg
323848b8605Smrgstatic struct tgsi_declaration_sampler_view
324848b8605Smrgtgsi_default_declaration_sampler_view(void)
325848b8605Smrg{
326848b8605Smrg   struct tgsi_declaration_sampler_view dsv;
327848b8605Smrg
328848b8605Smrg   dsv.Resource = TGSI_TEXTURE_BUFFER;
329b8e80941Smrg   dsv.ReturnTypeX = TGSI_RETURN_TYPE_UNORM;
330b8e80941Smrg   dsv.ReturnTypeY = TGSI_RETURN_TYPE_UNORM;
331b8e80941Smrg   dsv.ReturnTypeZ = TGSI_RETURN_TYPE_UNORM;
332b8e80941Smrg   dsv.ReturnTypeW = TGSI_RETURN_TYPE_UNORM;
333848b8605Smrg
334848b8605Smrg   return dsv;
335848b8605Smrg}
336848b8605Smrg
337848b8605Smrgstatic struct tgsi_declaration_sampler_view
338848b8605Smrgtgsi_build_declaration_sampler_view(unsigned texture,
339848b8605Smrg                                    unsigned return_type_x,
340848b8605Smrg                                    unsigned return_type_y,
341848b8605Smrg                                    unsigned return_type_z,
342848b8605Smrg                                    unsigned return_type_w,
343848b8605Smrg                                    struct tgsi_declaration *declaration,
344848b8605Smrg                                    struct tgsi_header *header)
345848b8605Smrg{
346848b8605Smrg   struct tgsi_declaration_sampler_view dsv;
347848b8605Smrg
348848b8605Smrg   dsv = tgsi_default_declaration_sampler_view();
349848b8605Smrg   dsv.Resource = texture;
350848b8605Smrg   dsv.ReturnTypeX = return_type_x;
351848b8605Smrg   dsv.ReturnTypeY = return_type_y;
352848b8605Smrg   dsv.ReturnTypeZ = return_type_z;
353848b8605Smrg   dsv.ReturnTypeW = return_type_w;
354848b8605Smrg
355848b8605Smrg   declaration_grow(declaration, header);
356848b8605Smrg
357848b8605Smrg   return dsv;
358848b8605Smrg}
359848b8605Smrg
360848b8605Smrg
361848b8605Smrgstatic struct tgsi_declaration_array
362848b8605Smrgtgsi_default_declaration_array( void )
363848b8605Smrg{
364848b8605Smrg   struct tgsi_declaration_array a;
365848b8605Smrg
366848b8605Smrg   a.ArrayID = 0;
367848b8605Smrg   a.Padding = 0;
368848b8605Smrg
369848b8605Smrg   return a;
370848b8605Smrg}
371848b8605Smrg
372848b8605Smrgstatic struct tgsi_declaration_array
373848b8605Smrgtgsi_build_declaration_array(unsigned arrayid,
374848b8605Smrg                             struct tgsi_declaration *declaration,
375848b8605Smrg                             struct tgsi_header *header)
376848b8605Smrg{
377848b8605Smrg   struct tgsi_declaration_array da;
378848b8605Smrg
379848b8605Smrg   da = tgsi_default_declaration_array();
380848b8605Smrg   da.ArrayID = arrayid;
381848b8605Smrg
382848b8605Smrg   declaration_grow(declaration, header);
383848b8605Smrg
384848b8605Smrg   return da;
385848b8605Smrg}
386848b8605Smrg
387848b8605Smrgstruct tgsi_full_declaration
388848b8605Smrgtgsi_default_full_declaration( void )
389848b8605Smrg{
390848b8605Smrg   struct tgsi_full_declaration  full_declaration;
391848b8605Smrg
392848b8605Smrg   full_declaration.Declaration  = tgsi_default_declaration();
393848b8605Smrg   full_declaration.Range = tgsi_default_declaration_range();
394b8e80941Smrg   full_declaration.Dim = tgsi_default_declaration_dimension();
395848b8605Smrg   full_declaration.Semantic = tgsi_default_declaration_semantic();
396848b8605Smrg   full_declaration.Interp = tgsi_default_declaration_interp();
397b8e80941Smrg   full_declaration.Image = tgsi_default_declaration_image();
398848b8605Smrg   full_declaration.SamplerView = tgsi_default_declaration_sampler_view();
399848b8605Smrg   full_declaration.Array = tgsi_default_declaration_array();
400848b8605Smrg
401848b8605Smrg   return full_declaration;
402848b8605Smrg}
403848b8605Smrg
404848b8605Smrgunsigned
405848b8605Smrgtgsi_build_full_declaration(
406848b8605Smrg   const struct tgsi_full_declaration *full_decl,
407848b8605Smrg   struct tgsi_token *tokens,
408848b8605Smrg   struct tgsi_header *header,
409848b8605Smrg   unsigned maxsize )
410848b8605Smrg{
411848b8605Smrg   unsigned size = 0;
412848b8605Smrg   struct tgsi_declaration *declaration;
413848b8605Smrg   struct tgsi_declaration_range *dr;
414848b8605Smrg
415848b8605Smrg   if( maxsize <= size )
416848b8605Smrg      return 0;
417848b8605Smrg   declaration = (struct tgsi_declaration *) &tokens[size];
418848b8605Smrg   size++;
419848b8605Smrg
420848b8605Smrg   *declaration = tgsi_build_declaration(
421848b8605Smrg      full_decl->Declaration.File,
422848b8605Smrg      full_decl->Declaration.UsageMask,
423848b8605Smrg      full_decl->Declaration.Interpolate,
424848b8605Smrg      full_decl->Declaration.Dimension,
425848b8605Smrg      full_decl->Declaration.Semantic,
426848b8605Smrg      full_decl->Declaration.Invariant,
427848b8605Smrg      full_decl->Declaration.Local,
428848b8605Smrg      full_decl->Declaration.Array,
429b8e80941Smrg      full_decl->Declaration.Atomic,
430b8e80941Smrg      full_decl->Declaration.MemType,
431848b8605Smrg      header );
432848b8605Smrg
433848b8605Smrg   if (maxsize <= size)
434848b8605Smrg      return 0;
435848b8605Smrg   dr = (struct tgsi_declaration_range *) &tokens[size];
436848b8605Smrg   size++;
437848b8605Smrg
438848b8605Smrg   *dr = tgsi_build_declaration_range(
439848b8605Smrg      full_decl->Range.First,
440848b8605Smrg      full_decl->Range.Last,
441848b8605Smrg      declaration,
442848b8605Smrg      header );
443848b8605Smrg
444848b8605Smrg   if (full_decl->Declaration.Dimension) {
445848b8605Smrg      struct tgsi_declaration_dimension *dd;
446848b8605Smrg
447848b8605Smrg      if (maxsize <= size) {
448848b8605Smrg         return 0;
449848b8605Smrg      }
450848b8605Smrg      dd = (struct tgsi_declaration_dimension *)&tokens[size];
451848b8605Smrg      size++;
452848b8605Smrg
453848b8605Smrg      *dd = tgsi_build_declaration_dimension(full_decl->Dim.Index2D,
454848b8605Smrg                                             declaration,
455848b8605Smrg                                             header);
456848b8605Smrg   }
457848b8605Smrg
458848b8605Smrg   if (full_decl->Declaration.Interpolate) {
459848b8605Smrg      struct tgsi_declaration_interp *di;
460848b8605Smrg
461848b8605Smrg      if (maxsize <= size) {
462848b8605Smrg         return 0;
463848b8605Smrg      }
464848b8605Smrg      di = (struct tgsi_declaration_interp *)&tokens[size];
465848b8605Smrg      size++;
466848b8605Smrg
467848b8605Smrg      *di = tgsi_build_declaration_interp(full_decl->Interp.Interpolate,
468848b8605Smrg                                          full_decl->Interp.Location,
469848b8605Smrg                                          full_decl->Interp.CylindricalWrap,
470848b8605Smrg                                          declaration,
471848b8605Smrg                                          header);
472848b8605Smrg   }
473848b8605Smrg
474848b8605Smrg   if( full_decl->Declaration.Semantic ) {
475848b8605Smrg      struct tgsi_declaration_semantic *ds;
476848b8605Smrg
477848b8605Smrg      if( maxsize <= size )
478848b8605Smrg         return  0;
479848b8605Smrg      ds = (struct tgsi_declaration_semantic *) &tokens[size];
480848b8605Smrg      size++;
481848b8605Smrg
482848b8605Smrg      *ds = tgsi_build_declaration_semantic(
483848b8605Smrg         full_decl->Semantic.Name,
484848b8605Smrg         full_decl->Semantic.Index,
485b8e80941Smrg         full_decl->Semantic.StreamX,
486b8e80941Smrg         full_decl->Semantic.StreamY,
487b8e80941Smrg         full_decl->Semantic.StreamZ,
488b8e80941Smrg         full_decl->Semantic.StreamW,
489848b8605Smrg         declaration,
490848b8605Smrg         header );
491848b8605Smrg   }
492848b8605Smrg
493b8e80941Smrg   if (full_decl->Declaration.File == TGSI_FILE_IMAGE) {
494b8e80941Smrg      struct tgsi_declaration_image *di;
495848b8605Smrg
496848b8605Smrg      if (maxsize <= size) {
497848b8605Smrg         return  0;
498848b8605Smrg      }
499b8e80941Smrg      di = (struct tgsi_declaration_image *)&tokens[size];
500848b8605Smrg      size++;
501848b8605Smrg
502b8e80941Smrg      *di = tgsi_build_declaration_image(full_decl->Image.Resource,
503b8e80941Smrg                                         full_decl->Image.Format,
504b8e80941Smrg                                         full_decl->Image.Raw,
505b8e80941Smrg                                         full_decl->Image.Writable,
506b8e80941Smrg                                         declaration,
507b8e80941Smrg                                         header);
508848b8605Smrg   }
509848b8605Smrg
510848b8605Smrg   if (full_decl->Declaration.File == TGSI_FILE_SAMPLER_VIEW) {
511848b8605Smrg      struct tgsi_declaration_sampler_view *dsv;
512848b8605Smrg
513848b8605Smrg      if (maxsize <= size) {
514848b8605Smrg         return  0;
515848b8605Smrg      }
516848b8605Smrg      dsv = (struct tgsi_declaration_sampler_view *)&tokens[size];
517848b8605Smrg      size++;
518848b8605Smrg
519848b8605Smrg      *dsv = tgsi_build_declaration_sampler_view(
520848b8605Smrg         full_decl->SamplerView.Resource,
521848b8605Smrg         full_decl->SamplerView.ReturnTypeX,
522848b8605Smrg         full_decl->SamplerView.ReturnTypeY,
523848b8605Smrg         full_decl->SamplerView.ReturnTypeZ,
524848b8605Smrg         full_decl->SamplerView.ReturnTypeW,
525848b8605Smrg         declaration,
526848b8605Smrg         header);
527848b8605Smrg   }
528848b8605Smrg
529848b8605Smrg   if (full_decl->Declaration.Array) {
530848b8605Smrg      struct tgsi_declaration_array *da;
531848b8605Smrg
532848b8605Smrg      if (maxsize <= size) {
533848b8605Smrg         return 0;
534848b8605Smrg      }
535848b8605Smrg      da = (struct tgsi_declaration_array *)&tokens[size];
536848b8605Smrg      size++;
537848b8605Smrg      *da = tgsi_build_declaration_array(
538848b8605Smrg         full_decl->Array.ArrayID,
539848b8605Smrg         declaration,
540848b8605Smrg         header);
541848b8605Smrg   }
542848b8605Smrg   return size;
543848b8605Smrg}
544848b8605Smrg
545848b8605Smrg/*
546848b8605Smrg * immediate
547848b8605Smrg */
548848b8605Smrg
549848b8605Smrgstatic struct tgsi_immediate
550848b8605Smrgtgsi_default_immediate( void )
551848b8605Smrg{
552848b8605Smrg   struct tgsi_immediate immediate;
553848b8605Smrg
554848b8605Smrg   immediate.Type = TGSI_TOKEN_TYPE_IMMEDIATE;
555848b8605Smrg   immediate.NrTokens = 1;
556848b8605Smrg   immediate.DataType = TGSI_IMM_FLOAT32;
557848b8605Smrg   immediate.Padding = 0;
558848b8605Smrg
559848b8605Smrg   return immediate;
560848b8605Smrg}
561848b8605Smrg
562848b8605Smrgstatic struct tgsi_immediate
563848b8605Smrgtgsi_build_immediate(
564848b8605Smrg   struct tgsi_header *header,
565848b8605Smrg   unsigned type )
566848b8605Smrg{
567848b8605Smrg   struct tgsi_immediate immediate;
568848b8605Smrg
569848b8605Smrg   immediate = tgsi_default_immediate();
570848b8605Smrg   immediate.DataType = type;
571848b8605Smrg
572848b8605Smrg   header_bodysize_grow( header );
573848b8605Smrg
574848b8605Smrg   return immediate;
575848b8605Smrg}
576848b8605Smrg
577848b8605Smrgstruct tgsi_full_immediate
578848b8605Smrgtgsi_default_full_immediate( void )
579848b8605Smrg{
580848b8605Smrg   struct tgsi_full_immediate fullimm;
581848b8605Smrg
582848b8605Smrg   fullimm.Immediate = tgsi_default_immediate();
583848b8605Smrg   fullimm.u[0].Float = 0.0f;
584848b8605Smrg   fullimm.u[1].Float = 0.0f;
585848b8605Smrg   fullimm.u[2].Float = 0.0f;
586848b8605Smrg   fullimm.u[3].Float = 0.0f;
587848b8605Smrg
588848b8605Smrg   return fullimm;
589848b8605Smrg}
590848b8605Smrg
591848b8605Smrgstatic void
592848b8605Smrgimmediate_grow(
593848b8605Smrg   struct tgsi_immediate *immediate,
594848b8605Smrg   struct tgsi_header *header )
595848b8605Smrg{
596848b8605Smrg   assert( immediate->NrTokens < 0xFF );
597848b8605Smrg
598848b8605Smrg   immediate->NrTokens++;
599848b8605Smrg
600848b8605Smrg   header_bodysize_grow( header );
601848b8605Smrg}
602848b8605Smrg
603848b8605Smrgunsigned
604848b8605Smrgtgsi_build_full_immediate(
605848b8605Smrg   const struct tgsi_full_immediate *full_imm,
606848b8605Smrg   struct tgsi_token *tokens,
607848b8605Smrg   struct tgsi_header *header,
608848b8605Smrg   unsigned maxsize )
609848b8605Smrg{
610b8e80941Smrg   unsigned size = 0;
611b8e80941Smrg   int i;
612848b8605Smrg   struct tgsi_immediate *immediate;
613848b8605Smrg
614848b8605Smrg   if( maxsize <= size )
615848b8605Smrg      return 0;
616848b8605Smrg   immediate = (struct tgsi_immediate *) &tokens[size];
617848b8605Smrg   size++;
618848b8605Smrg
619848b8605Smrg   *immediate = tgsi_build_immediate( header, full_imm->Immediate.DataType );
620848b8605Smrg
621848b8605Smrg   assert( full_imm->Immediate.NrTokens <= 4 + 1 );
622848b8605Smrg
623848b8605Smrg   for( i = 0; i < full_imm->Immediate.NrTokens - 1; i++ ) {
624848b8605Smrg      union tgsi_immediate_data *data;
625848b8605Smrg
626848b8605Smrg      if( maxsize <= size )
627848b8605Smrg         return  0;
628848b8605Smrg
629848b8605Smrg      data = (union tgsi_immediate_data *) &tokens[size];
630848b8605Smrg      *data = full_imm->u[i];
631848b8605Smrg
632848b8605Smrg      immediate_grow( immediate, header );
633848b8605Smrg      size++;
634848b8605Smrg   }
635848b8605Smrg
636848b8605Smrg   return size;
637848b8605Smrg}
638848b8605Smrg
639848b8605Smrg/*
640848b8605Smrg * instruction
641848b8605Smrg */
642848b8605Smrg
643848b8605Smrgstruct tgsi_instruction
644848b8605Smrgtgsi_default_instruction( void )
645848b8605Smrg{
646848b8605Smrg   struct tgsi_instruction instruction;
647848b8605Smrg
648848b8605Smrg   instruction.Type = TGSI_TOKEN_TYPE_INSTRUCTION;
649848b8605Smrg   instruction.NrTokens = 0;
650848b8605Smrg   instruction.Opcode = TGSI_OPCODE_MOV;
651b8e80941Smrg   instruction.Saturate = 0;
652848b8605Smrg   instruction.NumDstRegs = 1;
653848b8605Smrg   instruction.NumSrcRegs = 1;
654848b8605Smrg   instruction.Label = 0;
655848b8605Smrg   instruction.Texture = 0;
656b8e80941Smrg   instruction.Memory = 0;
657b8e80941Smrg   instruction.Precise = 0;
658b8e80941Smrg   instruction.Padding = 0;
659848b8605Smrg
660848b8605Smrg   return instruction;
661848b8605Smrg}
662848b8605Smrg
663848b8605Smrgstatic struct tgsi_instruction
664b8e80941Smrgtgsi_build_instruction(enum tgsi_opcode opcode,
665848b8605Smrg                       unsigned saturate,
666b8e80941Smrg                       unsigned precise,
667848b8605Smrg                       unsigned num_dst_regs,
668848b8605Smrg                       unsigned num_src_regs,
669848b8605Smrg                       struct tgsi_header *header)
670848b8605Smrg{
671848b8605Smrg   struct tgsi_instruction instruction;
672848b8605Smrg
673848b8605Smrg   assert (opcode <= TGSI_OPCODE_LAST);
674b8e80941Smrg   assert (saturate <= 1);
675848b8605Smrg   assert (num_dst_regs <= 3);
676848b8605Smrg   assert (num_src_regs <= 15);
677848b8605Smrg
678848b8605Smrg   instruction = tgsi_default_instruction();
679848b8605Smrg   instruction.Opcode = opcode;
680848b8605Smrg   instruction.Saturate = saturate;
681b8e80941Smrg   instruction.Precise = precise;
682848b8605Smrg   instruction.NumDstRegs = num_dst_regs;
683848b8605Smrg   instruction.NumSrcRegs = num_src_regs;
684848b8605Smrg
685848b8605Smrg   header_bodysize_grow( header );
686848b8605Smrg
687848b8605Smrg   return instruction;
688848b8605Smrg}
689848b8605Smrg
690848b8605Smrgstatic void
691848b8605Smrginstruction_grow(
692848b8605Smrg   struct tgsi_instruction *instruction,
693848b8605Smrg   struct tgsi_header *header )
694848b8605Smrg{
695848b8605Smrg   assert (instruction->NrTokens <   0xFF);
696848b8605Smrg
697848b8605Smrg   instruction->NrTokens++;
698848b8605Smrg
699848b8605Smrg   header_bodysize_grow( header );
700848b8605Smrg}
701848b8605Smrg
702848b8605Smrgstatic struct tgsi_instruction_label
703848b8605Smrgtgsi_default_instruction_label( void )
704848b8605Smrg{
705848b8605Smrg   struct tgsi_instruction_label instruction_label;
706848b8605Smrg
707848b8605Smrg   instruction_label.Label = 0;
708848b8605Smrg   instruction_label.Padding = 0;
709848b8605Smrg
710848b8605Smrg   return instruction_label;
711848b8605Smrg}
712848b8605Smrg
713848b8605Smrgstatic struct tgsi_instruction_label
714848b8605Smrgtgsi_build_instruction_label(
715848b8605Smrg   unsigned label,
716848b8605Smrg   struct tgsi_instruction *instruction,
717848b8605Smrg   struct tgsi_header *header )
718848b8605Smrg{
719848b8605Smrg   struct tgsi_instruction_label instruction_label;
720848b8605Smrg
721848b8605Smrg   instruction_label.Label = label;
722848b8605Smrg   instruction_label.Padding = 0;
723848b8605Smrg   instruction->Label = 1;
724848b8605Smrg
725848b8605Smrg   instruction_grow( instruction, header );
726848b8605Smrg
727848b8605Smrg   return instruction_label;
728848b8605Smrg}
729848b8605Smrg
730848b8605Smrgstatic struct tgsi_instruction_texture
731848b8605Smrgtgsi_default_instruction_texture( void )
732848b8605Smrg{
733848b8605Smrg   struct tgsi_instruction_texture instruction_texture;
734848b8605Smrg
735848b8605Smrg   instruction_texture.Texture = TGSI_TEXTURE_UNKNOWN;
736848b8605Smrg   instruction_texture.NumOffsets = 0;
737b8e80941Smrg   instruction_texture.ReturnType = TGSI_RETURN_TYPE_UNKNOWN;
738848b8605Smrg   instruction_texture.Padding = 0;
739848b8605Smrg
740848b8605Smrg   return instruction_texture;
741848b8605Smrg}
742848b8605Smrg
743848b8605Smrgstatic struct tgsi_instruction_texture
744848b8605Smrgtgsi_build_instruction_texture(
745848b8605Smrg   unsigned texture,
746848b8605Smrg   unsigned num_offsets,
747b8e80941Smrg   unsigned return_type,
748848b8605Smrg   struct tgsi_instruction *instruction,
749848b8605Smrg   struct tgsi_header *header )
750848b8605Smrg{
751848b8605Smrg   struct tgsi_instruction_texture instruction_texture;
752848b8605Smrg
753848b8605Smrg   instruction_texture.Texture = texture;
754848b8605Smrg   instruction_texture.NumOffsets = num_offsets;
755b8e80941Smrg   instruction_texture.ReturnType = return_type;
756848b8605Smrg   instruction_texture.Padding = 0;
757848b8605Smrg   instruction->Texture = 1;
758848b8605Smrg
759848b8605Smrg   instruction_grow( instruction, header );
760848b8605Smrg
761848b8605Smrg   return instruction_texture;
762848b8605Smrg}
763848b8605Smrg
764b8e80941Smrgstatic struct tgsi_instruction_memory
765b8e80941Smrgtgsi_default_instruction_memory( void )
766b8e80941Smrg{
767b8e80941Smrg   struct tgsi_instruction_memory instruction_memory;
768b8e80941Smrg
769b8e80941Smrg   instruction_memory.Qualifier = 0;
770b8e80941Smrg   instruction_memory.Texture = 0;
771b8e80941Smrg   instruction_memory.Format = 0;
772b8e80941Smrg   instruction_memory.Padding = 0;
773b8e80941Smrg
774b8e80941Smrg   return instruction_memory;
775b8e80941Smrg}
776b8e80941Smrg
777b8e80941Smrgstatic struct tgsi_instruction_memory
778b8e80941Smrgtgsi_build_instruction_memory(
779b8e80941Smrg   unsigned qualifier,
780b8e80941Smrg   unsigned texture,
781b8e80941Smrg   unsigned format,
782b8e80941Smrg   struct tgsi_instruction *instruction,
783b8e80941Smrg   struct tgsi_header *header )
784b8e80941Smrg{
785b8e80941Smrg   struct tgsi_instruction_memory instruction_memory;
786b8e80941Smrg
787b8e80941Smrg   instruction_memory.Qualifier = qualifier;
788b8e80941Smrg   instruction_memory.Texture = texture;
789b8e80941Smrg   instruction_memory.Format = format;
790b8e80941Smrg   instruction_memory.Padding = 0;
791b8e80941Smrg   instruction->Memory = 1;
792b8e80941Smrg
793b8e80941Smrg   instruction_grow( instruction, header );
794b8e80941Smrg
795b8e80941Smrg   return instruction_memory;
796b8e80941Smrg}
797848b8605Smrg
798848b8605Smrgstatic struct tgsi_texture_offset
799848b8605Smrgtgsi_default_texture_offset( void )
800848b8605Smrg{
801848b8605Smrg   struct tgsi_texture_offset texture_offset;
802848b8605Smrg
803848b8605Smrg   texture_offset.Index = 0;
804848b8605Smrg   texture_offset.File = 0;
805848b8605Smrg   texture_offset.SwizzleX = 0;
806848b8605Smrg   texture_offset.SwizzleY = 0;
807848b8605Smrg   texture_offset.SwizzleZ = 0;
808848b8605Smrg   texture_offset.Padding = 0;
809848b8605Smrg
810848b8605Smrg   return texture_offset;
811848b8605Smrg}
812848b8605Smrg
813848b8605Smrgstatic struct tgsi_texture_offset
814848b8605Smrgtgsi_build_texture_offset(
815848b8605Smrg   int index, int file, int swizzle_x, int swizzle_y, int swizzle_z,
816848b8605Smrg   struct tgsi_instruction *instruction,
817848b8605Smrg   struct tgsi_header *header )
818848b8605Smrg{
819848b8605Smrg   struct tgsi_texture_offset texture_offset;
820848b8605Smrg
821848b8605Smrg   texture_offset.Index = index;
822848b8605Smrg   texture_offset.File = file;
823848b8605Smrg   texture_offset.SwizzleX = swizzle_x;
824848b8605Smrg   texture_offset.SwizzleY = swizzle_y;
825848b8605Smrg   texture_offset.SwizzleZ = swizzle_z;
826848b8605Smrg   texture_offset.Padding = 0;
827848b8605Smrg
828848b8605Smrg   instruction_grow( instruction, header );
829848b8605Smrg
830848b8605Smrg   return texture_offset;
831848b8605Smrg}
832848b8605Smrg
833848b8605Smrgstatic struct tgsi_src_register
834848b8605Smrgtgsi_default_src_register( void )
835848b8605Smrg{
836848b8605Smrg   struct tgsi_src_register src_register;
837848b8605Smrg
838848b8605Smrg   src_register.File = TGSI_FILE_NULL;
839848b8605Smrg   src_register.SwizzleX = TGSI_SWIZZLE_X;
840848b8605Smrg   src_register.SwizzleY = TGSI_SWIZZLE_Y;
841848b8605Smrg   src_register.SwizzleZ = TGSI_SWIZZLE_Z;
842848b8605Smrg   src_register.SwizzleW = TGSI_SWIZZLE_W;
843848b8605Smrg   src_register.Negate = 0;
844848b8605Smrg   src_register.Absolute = 0;
845848b8605Smrg   src_register.Indirect = 0;
846848b8605Smrg   src_register.Dimension = 0;
847848b8605Smrg   src_register.Index = 0;
848848b8605Smrg
849848b8605Smrg   return src_register;
850848b8605Smrg}
851848b8605Smrg
852848b8605Smrgstatic struct tgsi_src_register
853848b8605Smrgtgsi_build_src_register(
854848b8605Smrg   unsigned file,
855848b8605Smrg   unsigned swizzle_x,
856848b8605Smrg   unsigned swizzle_y,
857848b8605Smrg   unsigned swizzle_z,
858848b8605Smrg   unsigned swizzle_w,
859848b8605Smrg   unsigned negate,
860848b8605Smrg   unsigned absolute,
861848b8605Smrg   unsigned indirect,
862848b8605Smrg   unsigned dimension,
863848b8605Smrg   int index,
864848b8605Smrg   struct tgsi_instruction *instruction,
865848b8605Smrg   struct tgsi_header *header )
866848b8605Smrg{
867848b8605Smrg   struct tgsi_src_register   src_register;
868848b8605Smrg
869848b8605Smrg   assert( file < TGSI_FILE_COUNT );
870848b8605Smrg   assert( swizzle_x <= TGSI_SWIZZLE_W );
871848b8605Smrg   assert( swizzle_y <= TGSI_SWIZZLE_W );
872848b8605Smrg   assert( swizzle_z <= TGSI_SWIZZLE_W );
873848b8605Smrg   assert( swizzle_w <= TGSI_SWIZZLE_W );
874848b8605Smrg   assert( negate <= 1 );
875848b8605Smrg   assert( index >= -0x8000 && index <= 0x7FFF );
876848b8605Smrg
877848b8605Smrg   src_register.File = file;
878848b8605Smrg   src_register.SwizzleX = swizzle_x;
879848b8605Smrg   src_register.SwizzleY = swizzle_y;
880848b8605Smrg   src_register.SwizzleZ = swizzle_z;
881848b8605Smrg   src_register.SwizzleW = swizzle_w;
882848b8605Smrg   src_register.Negate = negate;
883848b8605Smrg   src_register.Absolute = absolute;
884848b8605Smrg   src_register.Indirect = indirect;
885848b8605Smrg   src_register.Dimension = dimension;
886848b8605Smrg   src_register.Index = index;
887848b8605Smrg
888848b8605Smrg   instruction_grow( instruction, header );
889848b8605Smrg
890848b8605Smrg   return src_register;
891848b8605Smrg}
892848b8605Smrg
893848b8605Smrgstatic struct tgsi_ind_register
894848b8605Smrgtgsi_default_ind_register( void )
895848b8605Smrg{
896848b8605Smrg   struct tgsi_ind_register ind_register;
897848b8605Smrg
898848b8605Smrg   ind_register.File = TGSI_FILE_NULL;
899848b8605Smrg   ind_register.Index = 0;
900848b8605Smrg   ind_register.Swizzle = TGSI_SWIZZLE_X;
901848b8605Smrg   ind_register.ArrayID = 0;
902848b8605Smrg
903848b8605Smrg   return ind_register;
904848b8605Smrg}
905848b8605Smrg
906848b8605Smrgstatic struct tgsi_ind_register
907848b8605Smrgtgsi_build_ind_register(
908848b8605Smrg   unsigned file,
909848b8605Smrg   unsigned swizzle,
910848b8605Smrg   int index,
911848b8605Smrg   unsigned arrayid,
912848b8605Smrg   struct tgsi_instruction *instruction,
913848b8605Smrg   struct tgsi_header *header )
914848b8605Smrg{
915848b8605Smrg   struct tgsi_ind_register   ind_register;
916848b8605Smrg
917848b8605Smrg   assert( file < TGSI_FILE_COUNT );
918848b8605Smrg   assert( swizzle <= TGSI_SWIZZLE_W );
919848b8605Smrg   assert( index >= -0x8000 && index <= 0x7FFF );
920848b8605Smrg
921848b8605Smrg   ind_register.File = file;
922848b8605Smrg   ind_register.Swizzle = swizzle;
923848b8605Smrg   ind_register.Index = index;
924848b8605Smrg   ind_register.ArrayID = arrayid;
925848b8605Smrg
926848b8605Smrg   instruction_grow( instruction, header );
927848b8605Smrg
928848b8605Smrg   return ind_register;
929848b8605Smrg}
930848b8605Smrg
931848b8605Smrgstatic struct tgsi_dimension
932848b8605Smrgtgsi_default_dimension( void )
933848b8605Smrg{
934848b8605Smrg   struct tgsi_dimension dimension;
935848b8605Smrg
936848b8605Smrg   dimension.Indirect = 0;
937848b8605Smrg   dimension.Dimension = 0;
938848b8605Smrg   dimension.Padding = 0;
939848b8605Smrg   dimension.Index = 0;
940848b8605Smrg
941848b8605Smrg   return dimension;
942848b8605Smrg}
943848b8605Smrg
944848b8605Smrgstatic struct tgsi_full_src_register
945848b8605Smrgtgsi_default_full_src_register( void )
946848b8605Smrg{
947848b8605Smrg   struct tgsi_full_src_register full_src_register;
948848b8605Smrg
949848b8605Smrg   full_src_register.Register = tgsi_default_src_register();
950848b8605Smrg   full_src_register.Indirect = tgsi_default_ind_register();
951848b8605Smrg   full_src_register.Dimension = tgsi_default_dimension();
952848b8605Smrg   full_src_register.DimIndirect = tgsi_default_ind_register();
953848b8605Smrg
954848b8605Smrg   return full_src_register;
955848b8605Smrg}
956848b8605Smrg
957848b8605Smrgstatic struct tgsi_dimension
958848b8605Smrgtgsi_build_dimension(
959848b8605Smrg   unsigned indirect,
960848b8605Smrg   unsigned index,
961848b8605Smrg   struct tgsi_instruction *instruction,
962848b8605Smrg   struct tgsi_header *header )
963848b8605Smrg{
964848b8605Smrg   struct tgsi_dimension dimension;
965848b8605Smrg
966848b8605Smrg   dimension.Indirect = indirect;
967848b8605Smrg   dimension.Dimension = 0;
968848b8605Smrg   dimension.Padding = 0;
969848b8605Smrg   dimension.Index = index;
970848b8605Smrg
971848b8605Smrg   instruction_grow( instruction, header );
972848b8605Smrg
973848b8605Smrg   return dimension;
974848b8605Smrg}
975848b8605Smrg
976848b8605Smrgstatic struct tgsi_dst_register
977848b8605Smrgtgsi_default_dst_register( void )
978848b8605Smrg{
979848b8605Smrg   struct tgsi_dst_register dst_register;
980848b8605Smrg
981848b8605Smrg   dst_register.File = TGSI_FILE_NULL;
982848b8605Smrg   dst_register.WriteMask = TGSI_WRITEMASK_XYZW;
983848b8605Smrg   dst_register.Indirect = 0;
984848b8605Smrg   dst_register.Dimension = 0;
985848b8605Smrg   dst_register.Index = 0;
986848b8605Smrg   dst_register.Padding = 0;
987848b8605Smrg
988848b8605Smrg   return dst_register;
989848b8605Smrg}
990848b8605Smrg
991848b8605Smrgstatic struct tgsi_dst_register
992848b8605Smrgtgsi_build_dst_register(
993848b8605Smrg   unsigned file,
994848b8605Smrg   unsigned mask,
995848b8605Smrg   unsigned indirect,
996848b8605Smrg   unsigned dimension,
997848b8605Smrg   int index,
998848b8605Smrg   struct tgsi_instruction *instruction,
999848b8605Smrg   struct tgsi_header *header )
1000848b8605Smrg{
1001848b8605Smrg   struct tgsi_dst_register dst_register;
1002848b8605Smrg
1003848b8605Smrg   assert( file < TGSI_FILE_COUNT );
1004848b8605Smrg   assert( mask <= TGSI_WRITEMASK_XYZW );
1005848b8605Smrg   assert( index >= -32768 && index <= 32767 );
1006848b8605Smrg
1007848b8605Smrg   dst_register.File = file;
1008848b8605Smrg   dst_register.WriteMask = mask;
1009848b8605Smrg   dst_register.Indirect = indirect;
1010848b8605Smrg   dst_register.Dimension = dimension;
1011848b8605Smrg   dst_register.Index = index;
1012848b8605Smrg   dst_register.Padding = 0;
1013848b8605Smrg
1014848b8605Smrg   instruction_grow( instruction, header );
1015848b8605Smrg
1016848b8605Smrg   return dst_register;
1017848b8605Smrg}
1018848b8605Smrg
1019848b8605Smrgstatic struct tgsi_full_dst_register
1020848b8605Smrgtgsi_default_full_dst_register( void )
1021848b8605Smrg{
1022848b8605Smrg   struct tgsi_full_dst_register full_dst_register;
1023848b8605Smrg
1024848b8605Smrg   full_dst_register.Register = tgsi_default_dst_register();
1025848b8605Smrg   full_dst_register.Indirect = tgsi_default_ind_register();
1026848b8605Smrg   full_dst_register.Dimension = tgsi_default_dimension();
1027848b8605Smrg   full_dst_register.DimIndirect = tgsi_default_ind_register();
1028848b8605Smrg
1029848b8605Smrg   return full_dst_register;
1030848b8605Smrg}
1031848b8605Smrg
1032848b8605Smrgstruct tgsi_full_instruction
1033848b8605Smrgtgsi_default_full_instruction( void )
1034848b8605Smrg{
1035848b8605Smrg   struct tgsi_full_instruction full_instruction;
1036848b8605Smrg   unsigned i;
1037848b8605Smrg
1038848b8605Smrg   full_instruction.Instruction = tgsi_default_instruction();
1039848b8605Smrg   full_instruction.Label = tgsi_default_instruction_label();
1040848b8605Smrg   full_instruction.Texture = tgsi_default_instruction_texture();
1041b8e80941Smrg   full_instruction.Memory = tgsi_default_instruction_memory();
1042848b8605Smrg   for( i = 0;  i < TGSI_FULL_MAX_TEX_OFFSETS; i++ ) {
1043848b8605Smrg      full_instruction.TexOffsets[i] = tgsi_default_texture_offset();
1044848b8605Smrg   }
1045848b8605Smrg   for( i = 0;  i < TGSI_FULL_MAX_DST_REGISTERS; i++ ) {
1046848b8605Smrg      full_instruction.Dst[i] = tgsi_default_full_dst_register();
1047848b8605Smrg   }
1048848b8605Smrg   for( i = 0;  i < TGSI_FULL_MAX_SRC_REGISTERS; i++ ) {
1049848b8605Smrg      full_instruction.Src[i] = tgsi_default_full_src_register();
1050848b8605Smrg   }
1051848b8605Smrg
1052848b8605Smrg   return full_instruction;
1053848b8605Smrg}
1054848b8605Smrg
1055848b8605Smrgunsigned
1056848b8605Smrgtgsi_build_full_instruction(
1057848b8605Smrg   const struct tgsi_full_instruction *full_inst,
1058848b8605Smrg   struct  tgsi_token *tokens,
1059848b8605Smrg   struct  tgsi_header *header,
1060848b8605Smrg   unsigned  maxsize )
1061848b8605Smrg{
1062848b8605Smrg   unsigned size = 0;
1063848b8605Smrg   unsigned i;
1064848b8605Smrg   struct tgsi_instruction *instruction;
1065848b8605Smrg
1066848b8605Smrg   if( maxsize <= size )
1067848b8605Smrg      return 0;
1068848b8605Smrg   instruction = (struct tgsi_instruction *) &tokens[size];
1069848b8605Smrg   size++;
1070848b8605Smrg
1071848b8605Smrg   *instruction = tgsi_build_instruction(full_inst->Instruction.Opcode,
1072848b8605Smrg                                         full_inst->Instruction.Saturate,
1073b8e80941Smrg                                         full_inst->Instruction.Precise,
1074848b8605Smrg                                         full_inst->Instruction.NumDstRegs,
1075848b8605Smrg                                         full_inst->Instruction.NumSrcRegs,
1076848b8605Smrg                                         header);
1077848b8605Smrg
1078848b8605Smrg   if (full_inst->Instruction.Label) {
1079848b8605Smrg      struct tgsi_instruction_label *instruction_label;
1080848b8605Smrg
1081848b8605Smrg      if( maxsize <= size )
1082848b8605Smrg         return 0;
1083848b8605Smrg      instruction_label =
1084848b8605Smrg         (struct  tgsi_instruction_label *) &tokens[size];
1085848b8605Smrg      size++;
1086848b8605Smrg
1087848b8605Smrg      *instruction_label = tgsi_build_instruction_label(
1088848b8605Smrg         full_inst->Label.Label,
1089848b8605Smrg         instruction,
1090b8e80941Smrg	 header );
1091848b8605Smrg   }
1092848b8605Smrg
1093848b8605Smrg   if (full_inst->Instruction.Texture) {
1094848b8605Smrg      struct tgsi_instruction_texture *instruction_texture;
1095848b8605Smrg
1096848b8605Smrg      if( maxsize <= size )
1097848b8605Smrg         return 0;
1098848b8605Smrg      instruction_texture =
1099848b8605Smrg         (struct  tgsi_instruction_texture *) &tokens[size];
1100848b8605Smrg      size++;
1101848b8605Smrg
1102848b8605Smrg      *instruction_texture = tgsi_build_instruction_texture(
1103848b8605Smrg         full_inst->Texture.Texture,
1104b8e80941Smrg         full_inst->Texture.NumOffsets,
1105b8e80941Smrg         full_inst->Texture.ReturnType,
1106848b8605Smrg         instruction,
1107848b8605Smrg         header   );
1108848b8605Smrg
1109848b8605Smrg      for (i = 0; i < full_inst->Texture.NumOffsets; i++) {
1110848b8605Smrg         struct tgsi_texture_offset *texture_offset;
1111848b8605Smrg
1112848b8605Smrg         if ( maxsize <= size )
1113848b8605Smrg            return 0;
1114848b8605Smrg	 texture_offset = (struct tgsi_texture_offset *)&tokens[size];
1115848b8605Smrg         size++;
1116848b8605Smrg         *texture_offset = tgsi_build_texture_offset(
1117848b8605Smrg            full_inst->TexOffsets[i].Index,
1118848b8605Smrg            full_inst->TexOffsets[i].File,
1119848b8605Smrg            full_inst->TexOffsets[i].SwizzleX,
1120848b8605Smrg            full_inst->TexOffsets[i].SwizzleY,
1121848b8605Smrg            full_inst->TexOffsets[i].SwizzleZ,
1122848b8605Smrg            instruction,
1123848b8605Smrg            header);
1124848b8605Smrg      }
1125848b8605Smrg   }
1126b8e80941Smrg
1127b8e80941Smrg   if (full_inst->Instruction.Memory) {
1128b8e80941Smrg      struct tgsi_instruction_memory *instruction_memory;
1129b8e80941Smrg
1130b8e80941Smrg      if( maxsize <= size )
1131b8e80941Smrg         return 0;
1132b8e80941Smrg      instruction_memory =
1133b8e80941Smrg         (struct  tgsi_instruction_memory *) &tokens[size];
1134b8e80941Smrg      size++;
1135b8e80941Smrg
1136b8e80941Smrg      *instruction_memory = tgsi_build_instruction_memory(
1137b8e80941Smrg         full_inst->Memory.Qualifier,
1138b8e80941Smrg         full_inst->Memory.Texture,
1139b8e80941Smrg         full_inst->Memory.Format,
1140b8e80941Smrg         instruction,
1141b8e80941Smrg         header );
1142b8e80941Smrg   }
1143b8e80941Smrg
1144848b8605Smrg   for( i = 0;  i <   full_inst->Instruction.NumDstRegs; i++ ) {
1145848b8605Smrg      const struct tgsi_full_dst_register *reg = &full_inst->Dst[i];
1146848b8605Smrg      struct tgsi_dst_register *dst_register;
1147848b8605Smrg
1148848b8605Smrg      if( maxsize <= size )
1149848b8605Smrg         return 0;
1150848b8605Smrg      dst_register = (struct tgsi_dst_register *) &tokens[size];
1151848b8605Smrg      size++;
1152848b8605Smrg
1153848b8605Smrg      *dst_register = tgsi_build_dst_register(
1154848b8605Smrg         reg->Register.File,
1155848b8605Smrg         reg->Register.WriteMask,
1156848b8605Smrg         reg->Register.Indirect,
1157848b8605Smrg         reg->Register.Dimension,
1158848b8605Smrg         reg->Register.Index,
1159848b8605Smrg         instruction,
1160848b8605Smrg         header );
1161848b8605Smrg
1162848b8605Smrg      if( reg->Register.Indirect ) {
1163848b8605Smrg         struct tgsi_ind_register *ind;
1164848b8605Smrg
1165848b8605Smrg         if( maxsize <= size )
1166848b8605Smrg            return 0;
1167848b8605Smrg         ind = (struct tgsi_ind_register *) &tokens[size];
1168848b8605Smrg         size++;
1169848b8605Smrg
1170848b8605Smrg         *ind = tgsi_build_ind_register(
1171848b8605Smrg            reg->Indirect.File,
1172848b8605Smrg            reg->Indirect.Swizzle,
1173848b8605Smrg            reg->Indirect.Index,
1174848b8605Smrg            reg->Indirect.ArrayID,
1175848b8605Smrg            instruction,
1176848b8605Smrg            header );
1177848b8605Smrg      }
1178848b8605Smrg
1179848b8605Smrg      if( reg->Register.Dimension ) {
1180848b8605Smrg         struct  tgsi_dimension *dim;
1181848b8605Smrg
1182848b8605Smrg         assert( !reg->Dimension.Dimension );
1183848b8605Smrg
1184848b8605Smrg         if( maxsize <= size )
1185848b8605Smrg            return 0;
1186848b8605Smrg         dim = (struct tgsi_dimension *) &tokens[size];
1187848b8605Smrg         size++;
1188848b8605Smrg
1189848b8605Smrg         *dim = tgsi_build_dimension(
1190848b8605Smrg            reg->Dimension.Indirect,
1191848b8605Smrg            reg->Dimension.Index,
1192848b8605Smrg            instruction,
1193848b8605Smrg            header );
1194848b8605Smrg
1195848b8605Smrg         if( reg->Dimension.Indirect ) {
1196848b8605Smrg            struct tgsi_ind_register *ind;
1197848b8605Smrg
1198848b8605Smrg            if( maxsize <= size )
1199848b8605Smrg               return 0;
1200848b8605Smrg            ind = (struct tgsi_ind_register *) &tokens[size];
1201848b8605Smrg            size++;
1202848b8605Smrg
1203848b8605Smrg            *ind = tgsi_build_ind_register(
1204848b8605Smrg               reg->DimIndirect.File,
1205848b8605Smrg               reg->DimIndirect.Swizzle,
1206848b8605Smrg               reg->DimIndirect.Index,
1207848b8605Smrg               reg->DimIndirect.ArrayID,
1208848b8605Smrg               instruction,
1209848b8605Smrg               header );
1210848b8605Smrg         }
1211848b8605Smrg      }
1212848b8605Smrg   }
1213848b8605Smrg
1214848b8605Smrg   for( i = 0;  i < full_inst->Instruction.NumSrcRegs; i++ ) {
1215848b8605Smrg      const struct tgsi_full_src_register *reg = &full_inst->Src[i];
1216848b8605Smrg      struct tgsi_src_register *src_register;
1217848b8605Smrg
1218848b8605Smrg      if( maxsize <= size )
1219848b8605Smrg         return 0;
1220848b8605Smrg      src_register = (struct tgsi_src_register *)  &tokens[size];
1221848b8605Smrg      size++;
1222848b8605Smrg
1223848b8605Smrg      *src_register = tgsi_build_src_register(
1224848b8605Smrg         reg->Register.File,
1225848b8605Smrg         reg->Register.SwizzleX,
1226848b8605Smrg         reg->Register.SwizzleY,
1227848b8605Smrg         reg->Register.SwizzleZ,
1228848b8605Smrg         reg->Register.SwizzleW,
1229848b8605Smrg         reg->Register.Negate,
1230848b8605Smrg         reg->Register.Absolute,
1231848b8605Smrg         reg->Register.Indirect,
1232848b8605Smrg         reg->Register.Dimension,
1233848b8605Smrg         reg->Register.Index,
1234848b8605Smrg         instruction,
1235848b8605Smrg         header );
1236848b8605Smrg
1237848b8605Smrg      if( reg->Register.Indirect ) {
1238848b8605Smrg         struct  tgsi_ind_register *ind;
1239848b8605Smrg
1240848b8605Smrg         if( maxsize <= size )
1241848b8605Smrg            return 0;
1242848b8605Smrg         ind = (struct tgsi_ind_register *) &tokens[size];
1243848b8605Smrg         size++;
1244848b8605Smrg
1245848b8605Smrg         *ind = tgsi_build_ind_register(
1246848b8605Smrg            reg->Indirect.File,
1247848b8605Smrg            reg->Indirect.Swizzle,
1248848b8605Smrg            reg->Indirect.Index,
1249848b8605Smrg            reg->Indirect.ArrayID,
1250848b8605Smrg            instruction,
1251848b8605Smrg            header );
1252848b8605Smrg      }
1253848b8605Smrg
1254848b8605Smrg      if( reg->Register.Dimension ) {
1255848b8605Smrg         struct  tgsi_dimension *dim;
1256848b8605Smrg
1257848b8605Smrg         assert( !reg->Dimension.Dimension );
1258848b8605Smrg
1259848b8605Smrg         if( maxsize <= size )
1260848b8605Smrg            return 0;
1261848b8605Smrg         dim = (struct tgsi_dimension *) &tokens[size];
1262848b8605Smrg         size++;
1263848b8605Smrg
1264848b8605Smrg         *dim = tgsi_build_dimension(
1265848b8605Smrg            reg->Dimension.Indirect,
1266848b8605Smrg            reg->Dimension.Index,
1267848b8605Smrg            instruction,
1268848b8605Smrg            header );
1269848b8605Smrg
1270848b8605Smrg         if( reg->Dimension.Indirect ) {
1271848b8605Smrg            struct tgsi_ind_register *ind;
1272848b8605Smrg
1273848b8605Smrg            if( maxsize <= size )
1274848b8605Smrg               return 0;
1275848b8605Smrg            ind = (struct tgsi_ind_register *) &tokens[size];
1276848b8605Smrg            size++;
1277848b8605Smrg
1278848b8605Smrg            *ind = tgsi_build_ind_register(
1279848b8605Smrg               reg->DimIndirect.File,
1280848b8605Smrg               reg->DimIndirect.Swizzle,
1281848b8605Smrg               reg->DimIndirect.Index,
1282848b8605Smrg               reg->DimIndirect.ArrayID,
1283848b8605Smrg               instruction,
1284848b8605Smrg               header );
1285848b8605Smrg         }
1286848b8605Smrg      }
1287848b8605Smrg   }
1288848b8605Smrg
1289848b8605Smrg   return size;
1290848b8605Smrg}
1291848b8605Smrg
1292848b8605Smrgstatic struct tgsi_property
1293848b8605Smrgtgsi_default_property( void )
1294848b8605Smrg{
1295848b8605Smrg   struct tgsi_property property;
1296848b8605Smrg
1297848b8605Smrg   property.Type = TGSI_TOKEN_TYPE_PROPERTY;
1298848b8605Smrg   property.NrTokens = 1;
1299848b8605Smrg   property.PropertyName = TGSI_PROPERTY_GS_INPUT_PRIM;
1300848b8605Smrg   property.Padding = 0;
1301848b8605Smrg
1302848b8605Smrg   return property;
1303848b8605Smrg}
1304848b8605Smrg
1305848b8605Smrgstatic struct tgsi_property
1306848b8605Smrgtgsi_build_property(unsigned property_name,
1307848b8605Smrg                    struct tgsi_header *header)
1308848b8605Smrg{
1309848b8605Smrg   struct tgsi_property property;
1310848b8605Smrg
1311848b8605Smrg   property = tgsi_default_property();
1312848b8605Smrg   property.PropertyName = property_name;
1313848b8605Smrg
1314848b8605Smrg   header_bodysize_grow( header );
1315848b8605Smrg
1316848b8605Smrg   return property;
1317848b8605Smrg}
1318848b8605Smrg
1319848b8605Smrg
1320848b8605Smrgstruct tgsi_full_property
1321848b8605Smrgtgsi_default_full_property( void )
1322848b8605Smrg{
1323848b8605Smrg   struct tgsi_full_property  full_property;
1324848b8605Smrg
1325848b8605Smrg   full_property.Property  = tgsi_default_property();
1326848b8605Smrg   memset(full_property.u, 0,
1327848b8605Smrg          sizeof(struct tgsi_property_data) * 8);
1328848b8605Smrg
1329848b8605Smrg   return full_property;
1330848b8605Smrg}
1331848b8605Smrg
1332848b8605Smrgstatic void
1333848b8605Smrgproperty_grow(
1334848b8605Smrg   struct tgsi_property *property,
1335848b8605Smrg   struct tgsi_header *header )
1336848b8605Smrg{
1337848b8605Smrg   assert( property->NrTokens < 0xFF );
1338848b8605Smrg
1339848b8605Smrg   property->NrTokens++;
1340848b8605Smrg
1341848b8605Smrg   header_bodysize_grow( header );
1342848b8605Smrg}
1343848b8605Smrg
1344848b8605Smrgstatic struct tgsi_property_data
1345848b8605Smrgtgsi_build_property_data(
1346848b8605Smrg   unsigned value,
1347848b8605Smrg   struct tgsi_property *property,
1348848b8605Smrg   struct tgsi_header *header )
1349848b8605Smrg{
1350848b8605Smrg   struct tgsi_property_data property_data;
1351848b8605Smrg
1352848b8605Smrg   property_data.Data = value;
1353848b8605Smrg
1354848b8605Smrg   property_grow( property, header );
1355848b8605Smrg
1356848b8605Smrg   return property_data;
1357848b8605Smrg}
1358848b8605Smrg
1359848b8605Smrgunsigned
1360848b8605Smrgtgsi_build_full_property(
1361848b8605Smrg   const struct tgsi_full_property *full_prop,
1362848b8605Smrg   struct tgsi_token *tokens,
1363848b8605Smrg   struct tgsi_header *header,
1364848b8605Smrg   unsigned maxsize )
1365848b8605Smrg{
1366b8e80941Smrg   unsigned size = 0;
1367b8e80941Smrg   int i;
1368848b8605Smrg   struct tgsi_property *property;
1369848b8605Smrg
1370848b8605Smrg   if( maxsize <= size )
1371848b8605Smrg      return 0;
1372848b8605Smrg   property = (struct tgsi_property *) &tokens[size];
1373848b8605Smrg   size++;
1374848b8605Smrg
1375848b8605Smrg   *property = tgsi_build_property(
1376848b8605Smrg      full_prop->Property.PropertyName,
1377848b8605Smrg      header );
1378848b8605Smrg
1379848b8605Smrg   assert( full_prop->Property.NrTokens <= 8 + 1 );
1380848b8605Smrg
1381848b8605Smrg   for( i = 0; i < full_prop->Property.NrTokens - 1; i++ ) {
1382848b8605Smrg      struct tgsi_property_data *data;
1383848b8605Smrg
1384848b8605Smrg      if( maxsize <= size )
1385848b8605Smrg         return  0;
1386848b8605Smrg      data = (struct tgsi_property_data *) &tokens[size];
1387848b8605Smrg      size++;
1388848b8605Smrg
1389848b8605Smrg      *data = tgsi_build_property_data(
1390848b8605Smrg         full_prop->u[i].Data,
1391848b8605Smrg         property,
1392848b8605Smrg         header );
1393848b8605Smrg   }
1394848b8605Smrg
1395848b8605Smrg   return size;
1396848b8605Smrg}
1397b8e80941Smrg
1398b8e80941Smrgstruct tgsi_full_src_register
1399b8e80941Smrgtgsi_full_src_register_from_dst(const struct tgsi_full_dst_register *dst)
1400b8e80941Smrg{
1401b8e80941Smrg   struct tgsi_full_src_register src;
1402b8e80941Smrg   src.Register = tgsi_default_src_register();
1403b8e80941Smrg   src.Register.File = dst->Register.File;
1404b8e80941Smrg   src.Register.Indirect = dst->Register.Indirect;
1405b8e80941Smrg   src.Register.Dimension = dst->Register.Dimension;
1406b8e80941Smrg   src.Register.Index = dst->Register.Index;
1407b8e80941Smrg   src.Indirect = dst->Indirect;
1408b8e80941Smrg   src.Dimension = dst->Dimension;
1409b8e80941Smrg   src.DimIndirect = dst->DimIndirect;
1410b8e80941Smrg   return src;
1411b8e80941Smrg}
1412