tgsi_build.c revision dcf8543ab375dd9c128d1ca772b1e587cebbdc7c
17279d663e984ae8a243f56c010f175fee9ffccb3Michal Krol/**************************************************************************
27279d663e984ae8a243f56c010f175fee9ffccb3Michal Krol *
37279d663e984ae8a243f56c010f175fee9ffccb3Michal Krol * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
47279d663e984ae8a243f56c010f175fee9ffccb3Michal Krol * All Rights Reserved.
57279d663e984ae8a243f56c010f175fee9ffccb3Michal Krol *
67279d663e984ae8a243f56c010f175fee9ffccb3Michal Krol * Permission is hereby granted, free of charge, to any person obtaining a
77279d663e984ae8a243f56c010f175fee9ffccb3Michal Krol * copy of this software and associated documentation files (the
87279d663e984ae8a243f56c010f175fee9ffccb3Michal Krol * "Software"), to deal in the Software without restriction, including
97279d663e984ae8a243f56c010f175fee9ffccb3Michal Krol * without limitation the rights to use, copy, modify, merge, publish,
107279d663e984ae8a243f56c010f175fee9ffccb3Michal Krol * distribute, sub license, and/or sell copies of the Software, and to
117279d663e984ae8a243f56c010f175fee9ffccb3Michal Krol * permit persons to whom the Software is furnished to do so, subject to
127279d663e984ae8a243f56c010f175fee9ffccb3Michal Krol * the following conditions:
137279d663e984ae8a243f56c010f175fee9ffccb3Michal Krol *
147279d663e984ae8a243f56c010f175fee9ffccb3Michal Krol * The above copyright notice and this permission notice (including the
157279d663e984ae8a243f56c010f175fee9ffccb3Michal Krol * next paragraph) shall be included in all copies or substantial portions
167279d663e984ae8a243f56c010f175fee9ffccb3Michal Krol * of the Software.
177279d663e984ae8a243f56c010f175fee9ffccb3Michal Krol *
187279d663e984ae8a243f56c010f175fee9ffccb3Michal Krol * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
197279d663e984ae8a243f56c010f175fee9ffccb3Michal Krol * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
207279d663e984ae8a243f56c010f175fee9ffccb3Michal Krol * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
217279d663e984ae8a243f56c010f175fee9ffccb3Michal Krol * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
227279d663e984ae8a243f56c010f175fee9ffccb3Michal Krol * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
237279d663e984ae8a243f56c010f175fee9ffccb3Michal Krol * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
247279d663e984ae8a243f56c010f175fee9ffccb3Michal Krol * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
257279d663e984ae8a243f56c010f175fee9ffccb3Michal Krol *
267279d663e984ae8a243f56c010f175fee9ffccb3Michal Krol **************************************************************************/
277279d663e984ae8a243f56c010f175fee9ffccb3Michal Krol
28ea4bf267e4b023b08043f91ac44592fed1736e7fJosé Fonseca#include "util/u_debug.h"
29abd5e8e41d54f7f491f91af9354f19c8d24d3572Michal Krol#include "pipe/p_shader_tokens.h"
30abd5e8e41d54f7f491f91af9354f19c8d24d3572Michal Krol#include "tgsi_build.h"
31abd5e8e41d54f7f491f91af9354f19c8d24d3572Michal Krol#include "tgsi_parse.h"
32ffe58739da9eee2e99682747cc8f26e412c87430michal
33ffe58739da9eee2e99682747cc8f26e412c87430michal
34ffe58739da9eee2e99682747cc8f26e412c87430michal/*
35ffe58739da9eee2e99682747cc8f26e412c87430michal * header
36ffe58739da9eee2e99682747cc8f26e412c87430michal */
37ffe58739da9eee2e99682747cc8f26e412c87430michal
38ffe58739da9eee2e99682747cc8f26e412c87430michalstruct tgsi_header
39ffe58739da9eee2e99682747cc8f26e412c87430michaltgsi_build_header( void )
40ffe58739da9eee2e99682747cc8f26e412c87430michal{
41ffe58739da9eee2e99682747cc8f26e412c87430michal   struct tgsi_header header;
42ffe58739da9eee2e99682747cc8f26e412c87430michal
43ffe58739da9eee2e99682747cc8f26e412c87430michal   header.HeaderSize = 1;
44ffe58739da9eee2e99682747cc8f26e412c87430michal   header.BodySize = 0;
45ffe58739da9eee2e99682747cc8f26e412c87430michal
46ffe58739da9eee2e99682747cc8f26e412c87430michal   return header;
47ffe58739da9eee2e99682747cc8f26e412c87430michal}
48ffe58739da9eee2e99682747cc8f26e412c87430michal
49ffe58739da9eee2e99682747cc8f26e412c87430michalstatic void
50ffe58739da9eee2e99682747cc8f26e412c87430michalheader_headersize_grow( struct tgsi_header *header )
51ffe58739da9eee2e99682747cc8f26e412c87430michal{
52b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michal   assert( header->HeaderSize < 0xFF );
53b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michal   assert( header->BodySize == 0 );
54ffe58739da9eee2e99682747cc8f26e412c87430michal
55ffe58739da9eee2e99682747cc8f26e412c87430michal   header->HeaderSize++;
56ffe58739da9eee2e99682747cc8f26e412c87430michal}
57ffe58739da9eee2e99682747cc8f26e412c87430michal
58ffe58739da9eee2e99682747cc8f26e412c87430michalstatic void
59ffe58739da9eee2e99682747cc8f26e412c87430michalheader_bodysize_grow( struct tgsi_header *header )
60ffe58739da9eee2e99682747cc8f26e412c87430michal{
61b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michal   assert( header->BodySize < 0xFFFFFF );
62ffe58739da9eee2e99682747cc8f26e412c87430michal
63ffe58739da9eee2e99682747cc8f26e412c87430michal   header->BodySize++;
64ffe58739da9eee2e99682747cc8f26e412c87430michal}
65ffe58739da9eee2e99682747cc8f26e412c87430michal
66ffe58739da9eee2e99682747cc8f26e412c87430michalstruct tgsi_processor
67ffe58739da9eee2e99682747cc8f26e412c87430michaltgsi_default_processor( void )
68ffe58739da9eee2e99682747cc8f26e412c87430michal{
69ffe58739da9eee2e99682747cc8f26e412c87430michal   struct tgsi_processor processor;
70ffe58739da9eee2e99682747cc8f26e412c87430michal
71ffe58739da9eee2e99682747cc8f26e412c87430michal   processor.Processor = TGSI_PROCESSOR_FRAGMENT;
72ffe58739da9eee2e99682747cc8f26e412c87430michal   processor.Padding = 0;
73ffe58739da9eee2e99682747cc8f26e412c87430michal
74ffe58739da9eee2e99682747cc8f26e412c87430michal   return processor;
75ffe58739da9eee2e99682747cc8f26e412c87430michal}
76ffe58739da9eee2e99682747cc8f26e412c87430michal
77ffe58739da9eee2e99682747cc8f26e412c87430michalstruct tgsi_processor
78ffe58739da9eee2e99682747cc8f26e412c87430michaltgsi_build_processor(
79b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michal   unsigned type,
80ffe58739da9eee2e99682747cc8f26e412c87430michal   struct tgsi_header *header )
81ffe58739da9eee2e99682747cc8f26e412c87430michal{
82ffe58739da9eee2e99682747cc8f26e412c87430michal   struct tgsi_processor processor;
83ffe58739da9eee2e99682747cc8f26e412c87430michal
84ffe58739da9eee2e99682747cc8f26e412c87430michal   processor = tgsi_default_processor();
85ffe58739da9eee2e99682747cc8f26e412c87430michal   processor.Processor = type;
86ffe58739da9eee2e99682747cc8f26e412c87430michal
87ffe58739da9eee2e99682747cc8f26e412c87430michal   header_headersize_grow( header );
88ffe58739da9eee2e99682747cc8f26e412c87430michal
89ffe58739da9eee2e99682747cc8f26e412c87430michal   return processor;
90ffe58739da9eee2e99682747cc8f26e412c87430michal}
91ffe58739da9eee2e99682747cc8f26e412c87430michal
92ffe58739da9eee2e99682747cc8f26e412c87430michal/*
93ffe58739da9eee2e99682747cc8f26e412c87430michal * declaration
94ffe58739da9eee2e99682747cc8f26e412c87430michal */
95ffe58739da9eee2e99682747cc8f26e412c87430michal
96ffe58739da9eee2e99682747cc8f26e412c87430michalstruct tgsi_declaration
97ffe58739da9eee2e99682747cc8f26e412c87430michaltgsi_default_declaration( void )
98ffe58739da9eee2e99682747cc8f26e412c87430michal{
99ffe58739da9eee2e99682747cc8f26e412c87430michal   struct tgsi_declaration declaration;
100ffe58739da9eee2e99682747cc8f26e412c87430michal
101ffe58739da9eee2e99682747cc8f26e412c87430michal   declaration.Type = TGSI_TOKEN_TYPE_DECLARATION;
1025ecd0b0890fd48656e46c017830a9f5d6b906aaeMichal Krol   declaration.NrTokens = 1;
103ffe58739da9eee2e99682747cc8f26e412c87430michal   declaration.File = TGSI_FILE_NULL;
104058b978a5ae2a56e09fed6335b686c654444f4acmichal   declaration.UsageMask = TGSI_WRITEMASK_XYZW;
105a49381587f73c67469ec7546419cfc41387f938cMichal Krol   declaration.Interpolate = TGSI_INTERPOLATE_CONSTANT;
106dcf8543ab375dd9c128d1ca772b1e587cebbdc7cMichal Krol   declaration.Dimension = 0;
107b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michal   declaration.Semantic = 0;
108434e255eae90b0f3d836d452b7d3b0c5aadf78b8Brian Paul   declaration.Centroid = 0;
109434e255eae90b0f3d836d452b7d3b0c5aadf78b8Brian Paul   declaration.Invariant = 0;
110ffe58739da9eee2e99682747cc8f26e412c87430michal   declaration.Padding = 0;
111ffe58739da9eee2e99682747cc8f26e412c87430michal
112ffe58739da9eee2e99682747cc8f26e412c87430michal   return declaration;
113ffe58739da9eee2e99682747cc8f26e412c87430michal}
114ffe58739da9eee2e99682747cc8f26e412c87430michal
115ffe58739da9eee2e99682747cc8f26e412c87430michalstruct tgsi_declaration
116ffe58739da9eee2e99682747cc8f26e412c87430michaltgsi_build_declaration(
117b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michal   unsigned file,
118058b978a5ae2a56e09fed6335b686c654444f4acmichal   unsigned usage_mask,
119b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michal   unsigned interpolate,
120dcf8543ab375dd9c128d1ca772b1e587cebbdc7cMichal Krol   unsigned dimension,
121b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michal   unsigned semantic,
1224de360e67d83cd6503fb8ad053bb8afe507db5faBrian Paul   unsigned centroid,
1234de360e67d83cd6503fb8ad053bb8afe507db5faBrian Paul   unsigned invariant,
124ffe58739da9eee2e99682747cc8f26e412c87430michal   struct tgsi_header *header )
125ffe58739da9eee2e99682747cc8f26e412c87430michal{
126ffe58739da9eee2e99682747cc8f26e412c87430michal   struct tgsi_declaration declaration;
127ffe58739da9eee2e99682747cc8f26e412c87430michal
128cff2126f522bb511216f64427b3060467e266f8aBrian Paul   assert( file < TGSI_FILE_COUNT );
129cff2126f522bb511216f64427b3060467e266f8aBrian Paul   assert( interpolate < TGSI_INTERPOLATE_COUNT );
130ffe58739da9eee2e99682747cc8f26e412c87430michal
131ffe58739da9eee2e99682747cc8f26e412c87430michal   declaration = tgsi_default_declaration();
132ffe58739da9eee2e99682747cc8f26e412c87430michal   declaration.File = file;
133058b978a5ae2a56e09fed6335b686c654444f4acmichal   declaration.UsageMask = usage_mask;
134ffe58739da9eee2e99682747cc8f26e412c87430michal   declaration.Interpolate = interpolate;
135dcf8543ab375dd9c128d1ca772b1e587cebbdc7cMichal Krol   declaration.Dimension = dimension;
136b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michal   declaration.Semantic = semantic;
1374de360e67d83cd6503fb8ad053bb8afe507db5faBrian Paul   declaration.Centroid = centroid;
1384de360e67d83cd6503fb8ad053bb8afe507db5faBrian Paul   declaration.Invariant = invariant;
139ffe58739da9eee2e99682747cc8f26e412c87430michal
140ffe58739da9eee2e99682747cc8f26e412c87430michal   header_bodysize_grow( header );
141ffe58739da9eee2e99682747cc8f26e412c87430michal
142ffe58739da9eee2e99682747cc8f26e412c87430michal   return declaration;
143ffe58739da9eee2e99682747cc8f26e412c87430michal}
144ffe58739da9eee2e99682747cc8f26e412c87430michal
145ffe58739da9eee2e99682747cc8f26e412c87430michalstatic void
146ffe58739da9eee2e99682747cc8f26e412c87430michaldeclaration_grow(
147ffe58739da9eee2e99682747cc8f26e412c87430michal   struct tgsi_declaration *declaration,
148ffe58739da9eee2e99682747cc8f26e412c87430michal   struct tgsi_header *header )
149ffe58739da9eee2e99682747cc8f26e412c87430michal{
1505ecd0b0890fd48656e46c017830a9f5d6b906aaeMichal Krol   assert( declaration->NrTokens < 0xFF );
151ffe58739da9eee2e99682747cc8f26e412c87430michal
1525ecd0b0890fd48656e46c017830a9f5d6b906aaeMichal Krol   declaration->NrTokens++;
153ffe58739da9eee2e99682747cc8f26e412c87430michal
154ffe58739da9eee2e99682747cc8f26e412c87430michal   header_bodysize_grow( header );
155ffe58739da9eee2e99682747cc8f26e412c87430michal}
156ffe58739da9eee2e99682747cc8f26e412c87430michal
157ffe58739da9eee2e99682747cc8f26e412c87430michalstruct tgsi_full_declaration
158ffe58739da9eee2e99682747cc8f26e412c87430michaltgsi_default_full_declaration( void )
159ffe58739da9eee2e99682747cc8f26e412c87430michal{
160ffe58739da9eee2e99682747cc8f26e412c87430michal   struct tgsi_full_declaration  full_declaration;
161ffe58739da9eee2e99682747cc8f26e412c87430michal
162ffe58739da9eee2e99682747cc8f26e412c87430michal   full_declaration.Declaration  = tgsi_default_declaration();
163fe2b31e4a896167a33d267822b36eb2de0ceecbaKeith Whitwell   full_declaration.Range = tgsi_default_declaration_range();
164b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michal   full_declaration.Semantic = tgsi_default_declaration_semantic();
165ffe58739da9eee2e99682747cc8f26e412c87430michal
166ffe58739da9eee2e99682747cc8f26e412c87430michal   return full_declaration;
167ffe58739da9eee2e99682747cc8f26e412c87430michal}
168ffe58739da9eee2e99682747cc8f26e412c87430michal
169b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michalunsigned
170ffe58739da9eee2e99682747cc8f26e412c87430michaltgsi_build_full_declaration(
171b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michal   const struct tgsi_full_declaration *full_decl,
172ffe58739da9eee2e99682747cc8f26e412c87430michal   struct tgsi_token *tokens,
173ffe58739da9eee2e99682747cc8f26e412c87430michal   struct tgsi_header *header,
174b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michal   unsigned maxsize )
175ffe58739da9eee2e99682747cc8f26e412c87430michal{
176b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michal   unsigned size = 0;
177ffe58739da9eee2e99682747cc8f26e412c87430michal   struct tgsi_declaration *declaration;
178a49381587f73c67469ec7546419cfc41387f938cMichal Krol   struct tgsi_declaration_range *dr;
179ffe58739da9eee2e99682747cc8f26e412c87430michal
180ffe58739da9eee2e99682747cc8f26e412c87430michal   if( maxsize <= size )
181ffe58739da9eee2e99682747cc8f26e412c87430michal     return 0;
182ffe58739da9eee2e99682747cc8f26e412c87430michal   declaration = (struct tgsi_declaration *) &tokens[size];
183ffe58739da9eee2e99682747cc8f26e412c87430michal   size++;
184ffe58739da9eee2e99682747cc8f26e412c87430michal
185ffe58739da9eee2e99682747cc8f26e412c87430michal   *declaration = tgsi_build_declaration(
186ffe58739da9eee2e99682747cc8f26e412c87430michal      full_decl->Declaration.File,
187058b978a5ae2a56e09fed6335b686c654444f4acmichal      full_decl->Declaration.UsageMask,
188ffe58739da9eee2e99682747cc8f26e412c87430michal      full_decl->Declaration.Interpolate,
189dcf8543ab375dd9c128d1ca772b1e587cebbdc7cMichal Krol      full_decl->Declaration.Dimension,
190b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michal      full_decl->Declaration.Semantic,
1914de360e67d83cd6503fb8ad053bb8afe507db5faBrian Paul      full_decl->Declaration.Centroid,
1924de360e67d83cd6503fb8ad053bb8afe507db5faBrian Paul      full_decl->Declaration.Invariant,
193ffe58739da9eee2e99682747cc8f26e412c87430michal      header );
194ffe58739da9eee2e99682747cc8f26e412c87430michal
195a49381587f73c67469ec7546419cfc41387f938cMichal Krol   if (maxsize <= size)
196a49381587f73c67469ec7546419cfc41387f938cMichal Krol      return 0;
197a49381587f73c67469ec7546419cfc41387f938cMichal Krol   dr = (struct tgsi_declaration_range *) &tokens[size];
198a49381587f73c67469ec7546419cfc41387f938cMichal Krol   size++;
199ffe58739da9eee2e99682747cc8f26e412c87430michal
200a49381587f73c67469ec7546419cfc41387f938cMichal Krol   *dr = tgsi_build_declaration_range(
201fe2b31e4a896167a33d267822b36eb2de0ceecbaKeith Whitwell      full_decl->Range.First,
202fe2b31e4a896167a33d267822b36eb2de0ceecbaKeith Whitwell      full_decl->Range.Last,
203a49381587f73c67469ec7546419cfc41387f938cMichal Krol      declaration,
204a49381587f73c67469ec7546419cfc41387f938cMichal Krol      header );
205ffe58739da9eee2e99682747cc8f26e412c87430michal
206dcf8543ab375dd9c128d1ca772b1e587cebbdc7cMichal Krol   if (full_decl->Declaration.Dimension) {
207dcf8543ab375dd9c128d1ca772b1e587cebbdc7cMichal Krol      struct tgsi_declaration_dimension *dd;
208dcf8543ab375dd9c128d1ca772b1e587cebbdc7cMichal Krol
209dcf8543ab375dd9c128d1ca772b1e587cebbdc7cMichal Krol      if (maxsize <= size) {
210dcf8543ab375dd9c128d1ca772b1e587cebbdc7cMichal Krol         return 0;
211dcf8543ab375dd9c128d1ca772b1e587cebbdc7cMichal Krol      }
212dcf8543ab375dd9c128d1ca772b1e587cebbdc7cMichal Krol      dd = (struct tgsi_declaration_dimension *)&tokens[size];
213dcf8543ab375dd9c128d1ca772b1e587cebbdc7cMichal Krol      size++;
214dcf8543ab375dd9c128d1ca772b1e587cebbdc7cMichal Krol
215dcf8543ab375dd9c128d1ca772b1e587cebbdc7cMichal Krol      *dd = tgsi_build_declaration_dimension(full_decl->Dim.Index2D,
216dcf8543ab375dd9c128d1ca772b1e587cebbdc7cMichal Krol                                             declaration,
217dcf8543ab375dd9c128d1ca772b1e587cebbdc7cMichal Krol                                             header);
218dcf8543ab375dd9c128d1ca772b1e587cebbdc7cMichal Krol   }
219dcf8543ab375dd9c128d1ca772b1e587cebbdc7cMichal Krol
220b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michal   if( full_decl->Declaration.Semantic ) {
221b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michal      struct tgsi_declaration_semantic *ds;
222b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michal
223b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michal      if( maxsize <= size )
224b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michal         return  0;
225b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michal      ds = (struct tgsi_declaration_semantic *) &tokens[size];
226b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michal      size++;
227b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michal
228b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michal      *ds = tgsi_build_declaration_semantic(
229763426a0256f0ab06f8af53947bd630f8600183aKeith Whitwell         full_decl->Semantic.Name,
230763426a0256f0ab06f8af53947bd630f8600183aKeith Whitwell         full_decl->Semantic.Index,
231b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michal         declaration,
232b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michal         header );
233b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michal   }
234b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michal
235ffe58739da9eee2e99682747cc8f26e412c87430michal   return size;
236ffe58739da9eee2e99682747cc8f26e412c87430michal}
237ffe58739da9eee2e99682747cc8f26e412c87430michal
238ffe58739da9eee2e99682747cc8f26e412c87430michalstruct tgsi_declaration_range
239a49381587f73c67469ec7546419cfc41387f938cMichal Kroltgsi_default_declaration_range( void )
240a49381587f73c67469ec7546419cfc41387f938cMichal Krol{
241a49381587f73c67469ec7546419cfc41387f938cMichal Krol   struct tgsi_declaration_range dr;
242a49381587f73c67469ec7546419cfc41387f938cMichal Krol
243a49381587f73c67469ec7546419cfc41387f938cMichal Krol   dr.First = 0;
244a49381587f73c67469ec7546419cfc41387f938cMichal Krol   dr.Last = 0;
245a49381587f73c67469ec7546419cfc41387f938cMichal Krol
246a49381587f73c67469ec7546419cfc41387f938cMichal Krol   return dr;
247a49381587f73c67469ec7546419cfc41387f938cMichal Krol}
248a49381587f73c67469ec7546419cfc41387f938cMichal Krol
249a49381587f73c67469ec7546419cfc41387f938cMichal Krolstruct tgsi_declaration_range
250ffe58739da9eee2e99682747cc8f26e412c87430michaltgsi_build_declaration_range(
251b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michal   unsigned first,
252b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michal   unsigned last,
253ffe58739da9eee2e99682747cc8f26e412c87430michal   struct tgsi_declaration *declaration,
254ffe58739da9eee2e99682747cc8f26e412c87430michal   struct tgsi_header *header )
255ffe58739da9eee2e99682747cc8f26e412c87430michal{
256ffe58739da9eee2e99682747cc8f26e412c87430michal   struct tgsi_declaration_range declaration_range;
257ffe58739da9eee2e99682747cc8f26e412c87430michal
258b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michal   assert( last >= first );
259b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michal   assert( last <= 0xFFFF );
260ffe58739da9eee2e99682747cc8f26e412c87430michal
261a49381587f73c67469ec7546419cfc41387f938cMichal Krol   declaration_range = tgsi_default_declaration_range();
262ffe58739da9eee2e99682747cc8f26e412c87430michal   declaration_range.First = first;
263ffe58739da9eee2e99682747cc8f26e412c87430michal   declaration_range.Last = last;
264ffe58739da9eee2e99682747cc8f26e412c87430michal
265ffe58739da9eee2e99682747cc8f26e412c87430michal   declaration_grow( declaration, header );
266ffe58739da9eee2e99682747cc8f26e412c87430michal
267ffe58739da9eee2e99682747cc8f26e412c87430michal   return declaration_range;
268ffe58739da9eee2e99682747cc8f26e412c87430michal}
269ffe58739da9eee2e99682747cc8f26e412c87430michal
270dcf8543ab375dd9c128d1ca772b1e587cebbdc7cMichal Krolstruct tgsi_declaration_dimension
271dcf8543ab375dd9c128d1ca772b1e587cebbdc7cMichal Kroltgsi_default_declaration_dimension(void)
272dcf8543ab375dd9c128d1ca772b1e587cebbdc7cMichal Krol{
273dcf8543ab375dd9c128d1ca772b1e587cebbdc7cMichal Krol   struct tgsi_declaration_dimension dd;
274dcf8543ab375dd9c128d1ca772b1e587cebbdc7cMichal Krol
275dcf8543ab375dd9c128d1ca772b1e587cebbdc7cMichal Krol   dd.Index2D = 0;
276dcf8543ab375dd9c128d1ca772b1e587cebbdc7cMichal Krol   dd.Padding = 0;
277dcf8543ab375dd9c128d1ca772b1e587cebbdc7cMichal Krol
278dcf8543ab375dd9c128d1ca772b1e587cebbdc7cMichal Krol   return dd;
279dcf8543ab375dd9c128d1ca772b1e587cebbdc7cMichal Krol}
280dcf8543ab375dd9c128d1ca772b1e587cebbdc7cMichal Krol
281dcf8543ab375dd9c128d1ca772b1e587cebbdc7cMichal Krolstruct tgsi_declaration_dimension
282dcf8543ab375dd9c128d1ca772b1e587cebbdc7cMichal Kroltgsi_build_declaration_dimension(unsigned index_2d,
283dcf8543ab375dd9c128d1ca772b1e587cebbdc7cMichal Krol                                 struct tgsi_declaration *declaration,
284dcf8543ab375dd9c128d1ca772b1e587cebbdc7cMichal Krol                                 struct tgsi_header *header)
285dcf8543ab375dd9c128d1ca772b1e587cebbdc7cMichal Krol{
286dcf8543ab375dd9c128d1ca772b1e587cebbdc7cMichal Krol   struct tgsi_declaration_dimension dd;
287dcf8543ab375dd9c128d1ca772b1e587cebbdc7cMichal Krol
288dcf8543ab375dd9c128d1ca772b1e587cebbdc7cMichal Krol   assert(index_2d <= 0xFFFF);
289dcf8543ab375dd9c128d1ca772b1e587cebbdc7cMichal Krol
290dcf8543ab375dd9c128d1ca772b1e587cebbdc7cMichal Krol   dd = tgsi_default_declaration_dimension();
291dcf8543ab375dd9c128d1ca772b1e587cebbdc7cMichal Krol   dd.Index2D = index_2d;
292dcf8543ab375dd9c128d1ca772b1e587cebbdc7cMichal Krol
293dcf8543ab375dd9c128d1ca772b1e587cebbdc7cMichal Krol   declaration_grow(declaration, header);
294dcf8543ab375dd9c128d1ca772b1e587cebbdc7cMichal Krol
295dcf8543ab375dd9c128d1ca772b1e587cebbdc7cMichal Krol   return dd;
296dcf8543ab375dd9c128d1ca772b1e587cebbdc7cMichal Krol}
297dcf8543ab375dd9c128d1ca772b1e587cebbdc7cMichal Krol
298b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michalstruct tgsi_declaration_semantic
299b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michaltgsi_default_declaration_semantic( void )
300b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michal{
301b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michal   struct tgsi_declaration_semantic ds;
302b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michal
303763426a0256f0ab06f8af53947bd630f8600183aKeith Whitwell   ds.Name = TGSI_SEMANTIC_POSITION;
304763426a0256f0ab06f8af53947bd630f8600183aKeith Whitwell   ds.Index = 0;
305b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michal   ds.Padding = 0;
306b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michal
307b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michal   return ds;
308b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michal}
309b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michal
310b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michalstruct tgsi_declaration_semantic
311b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michaltgsi_build_declaration_semantic(
312b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michal   unsigned semantic_name,
313b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michal   unsigned semantic_index,
314b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michal   struct tgsi_declaration *declaration,
315b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michal   struct tgsi_header *header )
316b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michal{
317b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michal   struct tgsi_declaration_semantic ds;
318b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michal
31937cf13ed9a429c755f121daa1776b1b30a985ab3Brian   assert( semantic_name <= TGSI_SEMANTIC_COUNT );
320b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michal   assert( semantic_index <= 0xFFFF );
321b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michal
322b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michal   ds = tgsi_default_declaration_semantic();
323763426a0256f0ab06f8af53947bd630f8600183aKeith Whitwell   ds.Name = semantic_name;
324763426a0256f0ab06f8af53947bd630f8600183aKeith Whitwell   ds.Index = semantic_index;
325b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michal
326b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michal   declaration_grow( declaration, header );
327b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michal
328b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michal   return ds;
329b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michal}
330b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michal
331ffe58739da9eee2e99682747cc8f26e412c87430michal/*
332ffe58739da9eee2e99682747cc8f26e412c87430michal * immediate
333ffe58739da9eee2e99682747cc8f26e412c87430michal */
334ffe58739da9eee2e99682747cc8f26e412c87430michal
335ffe58739da9eee2e99682747cc8f26e412c87430michalstruct tgsi_immediate
336ffe58739da9eee2e99682747cc8f26e412c87430michaltgsi_default_immediate( void )
337ffe58739da9eee2e99682747cc8f26e412c87430michal{
338ffe58739da9eee2e99682747cc8f26e412c87430michal   struct tgsi_immediate immediate;
339ffe58739da9eee2e99682747cc8f26e412c87430michal
340ffe58739da9eee2e99682747cc8f26e412c87430michal   immediate.Type = TGSI_TOKEN_TYPE_IMMEDIATE;
3415ecd0b0890fd48656e46c017830a9f5d6b906aaeMichal Krol   immediate.NrTokens = 1;
342ffe58739da9eee2e99682747cc8f26e412c87430michal   immediate.DataType = TGSI_IMM_FLOAT32;
343ffe58739da9eee2e99682747cc8f26e412c87430michal   immediate.Padding = 0;
344ffe58739da9eee2e99682747cc8f26e412c87430michal
345ffe58739da9eee2e99682747cc8f26e412c87430michal   return immediate;
346ffe58739da9eee2e99682747cc8f26e412c87430michal}
347ffe58739da9eee2e99682747cc8f26e412c87430michal
348ffe58739da9eee2e99682747cc8f26e412c87430michalstruct tgsi_immediate
349ffe58739da9eee2e99682747cc8f26e412c87430michaltgsi_build_immediate(
350ffe58739da9eee2e99682747cc8f26e412c87430michal   struct tgsi_header *header )
351ffe58739da9eee2e99682747cc8f26e412c87430michal{
352ffe58739da9eee2e99682747cc8f26e412c87430michal   struct tgsi_immediate immediate;
353ffe58739da9eee2e99682747cc8f26e412c87430michal
354ffe58739da9eee2e99682747cc8f26e412c87430michal   immediate = tgsi_default_immediate();
355ffe58739da9eee2e99682747cc8f26e412c87430michal
356271f9dac79a9247de9a57f4d248e404bf1652a13José Fonseca   header_bodysize_grow( header );
357ffe58739da9eee2e99682747cc8f26e412c87430michal
358ffe58739da9eee2e99682747cc8f26e412c87430michal   return immediate;
359ffe58739da9eee2e99682747cc8f26e412c87430michal}
360ffe58739da9eee2e99682747cc8f26e412c87430michal
361ffe58739da9eee2e99682747cc8f26e412c87430michalstruct tgsi_full_immediate
362ffe58739da9eee2e99682747cc8f26e412c87430michaltgsi_default_full_immediate( void )
363ffe58739da9eee2e99682747cc8f26e412c87430michal{
364ffe58739da9eee2e99682747cc8f26e412c87430michal   struct tgsi_full_immediate fullimm;
365ffe58739da9eee2e99682747cc8f26e412c87430michal
366ffe58739da9eee2e99682747cc8f26e412c87430michal   fullimm.Immediate = tgsi_default_immediate();
367fd31f92cea0ce8613a22d8f4b3c75b340bcc5689Keith Whitwell   fullimm.u[0].Float = 0.0f;
368fd31f92cea0ce8613a22d8f4b3c75b340bcc5689Keith Whitwell   fullimm.u[1].Float = 0.0f;
369fd31f92cea0ce8613a22d8f4b3c75b340bcc5689Keith Whitwell   fullimm.u[2].Float = 0.0f;
370fd31f92cea0ce8613a22d8f4b3c75b340bcc5689Keith Whitwell   fullimm.u[3].Float = 0.0f;
371ffe58739da9eee2e99682747cc8f26e412c87430michal
372ffe58739da9eee2e99682747cc8f26e412c87430michal   return fullimm;
373ffe58739da9eee2e99682747cc8f26e412c87430michal}
374ffe58739da9eee2e99682747cc8f26e412c87430michal
375ffe58739da9eee2e99682747cc8f26e412c87430michalstatic void
376ffe58739da9eee2e99682747cc8f26e412c87430michalimmediate_grow(
377ffe58739da9eee2e99682747cc8f26e412c87430michal   struct tgsi_immediate *immediate,
378ffe58739da9eee2e99682747cc8f26e412c87430michal   struct tgsi_header *header )
379ffe58739da9eee2e99682747cc8f26e412c87430michal{
3805ecd0b0890fd48656e46c017830a9f5d6b906aaeMichal Krol   assert( immediate->NrTokens < 0xFF );
381ffe58739da9eee2e99682747cc8f26e412c87430michal
3825ecd0b0890fd48656e46c017830a9f5d6b906aaeMichal Krol   immediate->NrTokens++;
383ffe58739da9eee2e99682747cc8f26e412c87430michal
384ffe58739da9eee2e99682747cc8f26e412c87430michal   header_bodysize_grow( header );
385ffe58739da9eee2e99682747cc8f26e412c87430michal}
386ffe58739da9eee2e99682747cc8f26e412c87430michal
387fd31f92cea0ce8613a22d8f4b3c75b340bcc5689Keith Whitwellunion tgsi_immediate_data
388ffe58739da9eee2e99682747cc8f26e412c87430michaltgsi_build_immediate_float32(
389529c411e4095eeb9be501a6fe657a3a196c3e448michal   float value,
390ffe58739da9eee2e99682747cc8f26e412c87430michal   struct tgsi_immediate *immediate,
391ffe58739da9eee2e99682747cc8f26e412c87430michal   struct tgsi_header *header )
392ffe58739da9eee2e99682747cc8f26e412c87430michal{
393fd31f92cea0ce8613a22d8f4b3c75b340bcc5689Keith Whitwell   union tgsi_immediate_data immediate_data;
394ffe58739da9eee2e99682747cc8f26e412c87430michal
395fd31f92cea0ce8613a22d8f4b3c75b340bcc5689Keith Whitwell   immediate_data.Float = value;
396ffe58739da9eee2e99682747cc8f26e412c87430michal
397ffe58739da9eee2e99682747cc8f26e412c87430michal   immediate_grow( immediate, header );
398ffe58739da9eee2e99682747cc8f26e412c87430michal
399fd31f92cea0ce8613a22d8f4b3c75b340bcc5689Keith Whitwell   return immediate_data;
400ffe58739da9eee2e99682747cc8f26e412c87430michal}
401ffe58739da9eee2e99682747cc8f26e412c87430michal
402529c411e4095eeb9be501a6fe657a3a196c3e448michalunsigned
403ffe58739da9eee2e99682747cc8f26e412c87430michaltgsi_build_full_immediate(
404ffe58739da9eee2e99682747cc8f26e412c87430michal   const struct tgsi_full_immediate *full_imm,
405ffe58739da9eee2e99682747cc8f26e412c87430michal   struct tgsi_token *tokens,
406ffe58739da9eee2e99682747cc8f26e412c87430michal   struct tgsi_header *header,
407529c411e4095eeb9be501a6fe657a3a196c3e448michal   unsigned maxsize )
408ffe58739da9eee2e99682747cc8f26e412c87430michal{
409271f9dac79a9247de9a57f4d248e404bf1652a13José Fonseca   unsigned size = 0, i;
410ffe58739da9eee2e99682747cc8f26e412c87430michal   struct tgsi_immediate *immediate;
411ffe58739da9eee2e99682747cc8f26e412c87430michal
412ffe58739da9eee2e99682747cc8f26e412c87430michal   if( maxsize <= size )
413ffe58739da9eee2e99682747cc8f26e412c87430michal      return 0;
414ffe58739da9eee2e99682747cc8f26e412c87430michal   immediate = (struct tgsi_immediate *) &tokens[size];
415ffe58739da9eee2e99682747cc8f26e412c87430michal   size++;
416ffe58739da9eee2e99682747cc8f26e412c87430michal
417ffe58739da9eee2e99682747cc8f26e412c87430michal   *immediate = tgsi_build_immediate( header );
418ffe58739da9eee2e99682747cc8f26e412c87430michal
419fd31f92cea0ce8613a22d8f4b3c75b340bcc5689Keith Whitwell   assert( full_imm->Immediate.NrTokens <= 4 + 1 );
420fd31f92cea0ce8613a22d8f4b3c75b340bcc5689Keith Whitwell
4215ecd0b0890fd48656e46c017830a9f5d6b906aaeMichal Krol   for( i = 0; i < full_imm->Immediate.NrTokens - 1; i++ ) {
422fd31f92cea0ce8613a22d8f4b3c75b340bcc5689Keith Whitwell      union tgsi_immediate_data *data;
423ffe58739da9eee2e99682747cc8f26e412c87430michal
424ffe58739da9eee2e99682747cc8f26e412c87430michal      if( maxsize <= size )
425ffe58739da9eee2e99682747cc8f26e412c87430michal         return  0;
426fd31f92cea0ce8613a22d8f4b3c75b340bcc5689Keith Whitwell      data = (union tgsi_immediate_data *) &tokens[size];
427ffe58739da9eee2e99682747cc8f26e412c87430michal      size++;
428ffe58739da9eee2e99682747cc8f26e412c87430michal
429fd31f92cea0ce8613a22d8f4b3c75b340bcc5689Keith Whitwell      *data = tgsi_build_immediate_float32(
430fd31f92cea0ce8613a22d8f4b3c75b340bcc5689Keith Whitwell         full_imm->u[i].Float,
431ffe58739da9eee2e99682747cc8f26e412c87430michal         immediate,
432ffe58739da9eee2e99682747cc8f26e412c87430michal         header );
433ffe58739da9eee2e99682747cc8f26e412c87430michal   }
434ffe58739da9eee2e99682747cc8f26e412c87430michal
435ffe58739da9eee2e99682747cc8f26e412c87430michal   return size;
436ffe58739da9eee2e99682747cc8f26e412c87430michal}
437ffe58739da9eee2e99682747cc8f26e412c87430michal
438ffe58739da9eee2e99682747cc8f26e412c87430michal/*
439ffe58739da9eee2e99682747cc8f26e412c87430michal * instruction
440ffe58739da9eee2e99682747cc8f26e412c87430michal */
441ffe58739da9eee2e99682747cc8f26e412c87430michal
442ffe58739da9eee2e99682747cc8f26e412c87430michalstruct tgsi_instruction
443ffe58739da9eee2e99682747cc8f26e412c87430michaltgsi_default_instruction( void )
444ffe58739da9eee2e99682747cc8f26e412c87430michal{
445ffe58739da9eee2e99682747cc8f26e412c87430michal   struct tgsi_instruction instruction;
446ffe58739da9eee2e99682747cc8f26e412c87430michal
447ffe58739da9eee2e99682747cc8f26e412c87430michal   instruction.Type = TGSI_TOKEN_TYPE_INSTRUCTION;
448bc7567d9665924650c43c661d07ae9a922554beeBrian Paul   instruction.NrTokens = 0;
449ffe58739da9eee2e99682747cc8f26e412c87430michal   instruction.Opcode = TGSI_OPCODE_MOV;
450ffe58739da9eee2e99682747cc8f26e412c87430michal   instruction.Saturate = TGSI_SAT_NONE;
4515ee0d9f632383339088cc33005b7794b0915d4e0Michal Krol   instruction.Predicate = 0;
452ffe58739da9eee2e99682747cc8f26e412c87430michal   instruction.NumDstRegs = 1;
453ffe58739da9eee2e99682747cc8f26e412c87430michal   instruction.NumSrcRegs = 1;
454ba1ca28cc62fed71c77902b95ae4ed36c6bf25f8Keith Whitwell   instruction.Label = 0;
455ba1ca28cc62fed71c77902b95ae4ed36c6bf25f8Keith Whitwell   instruction.Texture = 0;
456ffe58739da9eee2e99682747cc8f26e412c87430michal   instruction.Padding  = 0;
457ffe58739da9eee2e99682747cc8f26e412c87430michal
458ffe58739da9eee2e99682747cc8f26e412c87430michal   return instruction;
459ffe58739da9eee2e99682747cc8f26e412c87430michal}
460ffe58739da9eee2e99682747cc8f26e412c87430michal
461ffe58739da9eee2e99682747cc8f26e412c87430michalstruct tgsi_instruction
4625ee0d9f632383339088cc33005b7794b0915d4e0Michal Kroltgsi_build_instruction(unsigned opcode,
4635ee0d9f632383339088cc33005b7794b0915d4e0Michal Krol                       unsigned saturate,
4645ee0d9f632383339088cc33005b7794b0915d4e0Michal Krol                       unsigned predicate,
4655ee0d9f632383339088cc33005b7794b0915d4e0Michal Krol                       unsigned num_dst_regs,
4665ee0d9f632383339088cc33005b7794b0915d4e0Michal Krol                       unsigned num_src_regs,
4675ee0d9f632383339088cc33005b7794b0915d4e0Michal Krol                       struct tgsi_header *header)
468ffe58739da9eee2e99682747cc8f26e412c87430michal{
469ffe58739da9eee2e99682747cc8f26e412c87430michal   struct tgsi_instruction instruction;
470ffe58739da9eee2e99682747cc8f26e412c87430michal
471ffe58739da9eee2e99682747cc8f26e412c87430michal   assert (opcode <= TGSI_OPCODE_LAST);
472ffe58739da9eee2e99682747cc8f26e412c87430michal   assert (saturate <= TGSI_SAT_MINUS_PLUS_ONE);
473ffe58739da9eee2e99682747cc8f26e412c87430michal   assert (num_dst_regs <= 3);
474ffe58739da9eee2e99682747cc8f26e412c87430michal   assert (num_src_regs <= 15);
475ffe58739da9eee2e99682747cc8f26e412c87430michal
476ffe58739da9eee2e99682747cc8f26e412c87430michal   instruction = tgsi_default_instruction();
477ffe58739da9eee2e99682747cc8f26e412c87430michal   instruction.Opcode = opcode;
478ffe58739da9eee2e99682747cc8f26e412c87430michal   instruction.Saturate = saturate;
4795ee0d9f632383339088cc33005b7794b0915d4e0Michal Krol   instruction.Predicate = predicate;
480ffe58739da9eee2e99682747cc8f26e412c87430michal   instruction.NumDstRegs = num_dst_regs;
481ffe58739da9eee2e99682747cc8f26e412c87430michal   instruction.NumSrcRegs = num_src_regs;
482ffe58739da9eee2e99682747cc8f26e412c87430michal
483ffe58739da9eee2e99682747cc8f26e412c87430michal   header_bodysize_grow( header );
484ffe58739da9eee2e99682747cc8f26e412c87430michal
485ffe58739da9eee2e99682747cc8f26e412c87430michal   return instruction;
486ffe58739da9eee2e99682747cc8f26e412c87430michal}
487ffe58739da9eee2e99682747cc8f26e412c87430michal
488ffe58739da9eee2e99682747cc8f26e412c87430michalstatic void
489ffe58739da9eee2e99682747cc8f26e412c87430michalinstruction_grow(
490ffe58739da9eee2e99682747cc8f26e412c87430michal   struct tgsi_instruction *instruction,
491ffe58739da9eee2e99682747cc8f26e412c87430michal   struct tgsi_header *header )
492ffe58739da9eee2e99682747cc8f26e412c87430michal{
4935ecd0b0890fd48656e46c017830a9f5d6b906aaeMichal Krol   assert (instruction->NrTokens <   0xFF);
494ffe58739da9eee2e99682747cc8f26e412c87430michal
4955ecd0b0890fd48656e46c017830a9f5d6b906aaeMichal Krol   instruction->NrTokens++;
496ffe58739da9eee2e99682747cc8f26e412c87430michal
497ffe58739da9eee2e99682747cc8f26e412c87430michal   header_bodysize_grow( header );
498ffe58739da9eee2e99682747cc8f26e412c87430michal}
499ffe58739da9eee2e99682747cc8f26e412c87430michal
500ffe58739da9eee2e99682747cc8f26e412c87430michalstruct tgsi_full_instruction
501ffe58739da9eee2e99682747cc8f26e412c87430michaltgsi_default_full_instruction( void )
502ffe58739da9eee2e99682747cc8f26e412c87430michal{
503ffe58739da9eee2e99682747cc8f26e412c87430michal   struct tgsi_full_instruction full_instruction;
504529c411e4095eeb9be501a6fe657a3a196c3e448michal   unsigned i;
505ffe58739da9eee2e99682747cc8f26e412c87430michal
506ffe58739da9eee2e99682747cc8f26e412c87430michal   full_instruction.Instruction = tgsi_default_instruction();
5077d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell   full_instruction.Predicate = tgsi_default_instruction_predicate();
5087d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell   full_instruction.Label = tgsi_default_instruction_label();
5097d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell   full_instruction.Texture = tgsi_default_instruction_texture();
510ffe58739da9eee2e99682747cc8f26e412c87430michal   for( i = 0;  i < TGSI_FULL_MAX_DST_REGISTERS; i++ ) {
5117d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell      full_instruction.Dst[i] = tgsi_default_full_dst_register();
512ffe58739da9eee2e99682747cc8f26e412c87430michal   }
513ffe58739da9eee2e99682747cc8f26e412c87430michal   for( i = 0;  i < TGSI_FULL_MAX_SRC_REGISTERS; i++ ) {
5147d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell      full_instruction.Src[i] = tgsi_default_full_src_register();
515ffe58739da9eee2e99682747cc8f26e412c87430michal   }
516ffe58739da9eee2e99682747cc8f26e412c87430michal
517ffe58739da9eee2e99682747cc8f26e412c87430michal   return full_instruction;
518ffe58739da9eee2e99682747cc8f26e412c87430michal}
519ffe58739da9eee2e99682747cc8f26e412c87430michal
520529c411e4095eeb9be501a6fe657a3a196c3e448michalunsigned
521ffe58739da9eee2e99682747cc8f26e412c87430michaltgsi_build_full_instruction(
522ffe58739da9eee2e99682747cc8f26e412c87430michal   const struct tgsi_full_instruction *full_inst,
523ffe58739da9eee2e99682747cc8f26e412c87430michal   struct  tgsi_token *tokens,
524ffe58739da9eee2e99682747cc8f26e412c87430michal   struct  tgsi_header *header,
525529c411e4095eeb9be501a6fe657a3a196c3e448michal   unsigned  maxsize )
526ffe58739da9eee2e99682747cc8f26e412c87430michal{
527529c411e4095eeb9be501a6fe657a3a196c3e448michal   unsigned size = 0;
528529c411e4095eeb9be501a6fe657a3a196c3e448michal   unsigned i;
529ffe58739da9eee2e99682747cc8f26e412c87430michal   struct tgsi_instruction *instruction;
530ffe58739da9eee2e99682747cc8f26e412c87430michal   struct tgsi_token *prev_token;
531ffe58739da9eee2e99682747cc8f26e412c87430michal
532ffe58739da9eee2e99682747cc8f26e412c87430michal   if( maxsize <= size )
533ffe58739da9eee2e99682747cc8f26e412c87430michal      return 0;
534ffe58739da9eee2e99682747cc8f26e412c87430michal   instruction = (struct tgsi_instruction *) &tokens[size];
535ffe58739da9eee2e99682747cc8f26e412c87430michal   size++;
536ffe58739da9eee2e99682747cc8f26e412c87430michal
5375ee0d9f632383339088cc33005b7794b0915d4e0Michal Krol   *instruction = tgsi_build_instruction(full_inst->Instruction.Opcode,
5385ee0d9f632383339088cc33005b7794b0915d4e0Michal Krol                                         full_inst->Instruction.Saturate,
5395ee0d9f632383339088cc33005b7794b0915d4e0Michal Krol                                         full_inst->Instruction.Predicate,
5405ee0d9f632383339088cc33005b7794b0915d4e0Michal Krol                                         full_inst->Instruction.NumDstRegs,
5415ee0d9f632383339088cc33005b7794b0915d4e0Michal Krol                                         full_inst->Instruction.NumSrcRegs,
5425ee0d9f632383339088cc33005b7794b0915d4e0Michal Krol                                         header);
543ffe58739da9eee2e99682747cc8f26e412c87430michal   prev_token = (struct tgsi_token  *) instruction;
544ffe58739da9eee2e99682747cc8f26e412c87430michal
5455ee0d9f632383339088cc33005b7794b0915d4e0Michal Krol   if (full_inst->Instruction.Predicate) {
5465ee0d9f632383339088cc33005b7794b0915d4e0Michal Krol      struct tgsi_instruction_predicate *instruction_predicate;
5475ee0d9f632383339088cc33005b7794b0915d4e0Michal Krol
5485ee0d9f632383339088cc33005b7794b0915d4e0Michal Krol      if (maxsize <= size) {
5495ee0d9f632383339088cc33005b7794b0915d4e0Michal Krol         return 0;
5505ee0d9f632383339088cc33005b7794b0915d4e0Michal Krol      }
5515ee0d9f632383339088cc33005b7794b0915d4e0Michal Krol      instruction_predicate = (struct tgsi_instruction_predicate *)&tokens[size];
5525ee0d9f632383339088cc33005b7794b0915d4e0Michal Krol      size++;
5535ee0d9f632383339088cc33005b7794b0915d4e0Michal Krol
5545ee0d9f632383339088cc33005b7794b0915d4e0Michal Krol      *instruction_predicate =
5557d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell         tgsi_build_instruction_predicate(full_inst->Predicate.Index,
5567d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell                                          full_inst->Predicate.Negate,
5577d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell                                          full_inst->Predicate.SwizzleX,
5587d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell                                          full_inst->Predicate.SwizzleY,
5597d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell                                          full_inst->Predicate.SwizzleZ,
5607d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell                                          full_inst->Predicate.SwizzleW,
5615ee0d9f632383339088cc33005b7794b0915d4e0Michal Krol                                          instruction,
5625ee0d9f632383339088cc33005b7794b0915d4e0Michal Krol                                          header);
5635ee0d9f632383339088cc33005b7794b0915d4e0Michal Krol   }
5645ee0d9f632383339088cc33005b7794b0915d4e0Michal Krol
565e13add8cae4637d9cd2f6c40c68de30701736abfMichal Krol   if (full_inst->Instruction.Label) {
566ba1ca28cc62fed71c77902b95ae4ed36c6bf25f8Keith Whitwell      struct tgsi_instruction_label *instruction_label;
567ffe58739da9eee2e99682747cc8f26e412c87430michal
568ffe58739da9eee2e99682747cc8f26e412c87430michal      if( maxsize <= size )
569ffe58739da9eee2e99682747cc8f26e412c87430michal         return 0;
570ba1ca28cc62fed71c77902b95ae4ed36c6bf25f8Keith Whitwell      instruction_label =
571ba1ca28cc62fed71c77902b95ae4ed36c6bf25f8Keith Whitwell         (struct  tgsi_instruction_label *) &tokens[size];
572ffe58739da9eee2e99682747cc8f26e412c87430michal      size++;
573ffe58739da9eee2e99682747cc8f26e412c87430michal
574ba1ca28cc62fed71c77902b95ae4ed36c6bf25f8Keith Whitwell      *instruction_label = tgsi_build_instruction_label(
5757d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell         full_inst->Label.Label,
576ffe58739da9eee2e99682747cc8f26e412c87430michal         prev_token,
577ffe58739da9eee2e99682747cc8f26e412c87430michal         instruction,
578ffe58739da9eee2e99682747cc8f26e412c87430michal         header );
579ba1ca28cc62fed71c77902b95ae4ed36c6bf25f8Keith Whitwell      prev_token = (struct tgsi_token  *) instruction_label;
580ffe58739da9eee2e99682747cc8f26e412c87430michal   }
581ffe58739da9eee2e99682747cc8f26e412c87430michal
582e13add8cae4637d9cd2f6c40c68de30701736abfMichal Krol   if (full_inst->Instruction.Texture) {
583ba1ca28cc62fed71c77902b95ae4ed36c6bf25f8Keith Whitwell      struct tgsi_instruction_texture *instruction_texture;
584ffe58739da9eee2e99682747cc8f26e412c87430michal
585ffe58739da9eee2e99682747cc8f26e412c87430michal      if( maxsize <= size )
586ffe58739da9eee2e99682747cc8f26e412c87430michal         return 0;
587ba1ca28cc62fed71c77902b95ae4ed36c6bf25f8Keith Whitwell      instruction_texture =
588ba1ca28cc62fed71c77902b95ae4ed36c6bf25f8Keith Whitwell         (struct  tgsi_instruction_texture *) &tokens[size];
589ffe58739da9eee2e99682747cc8f26e412c87430michal      size++;
590ffe58739da9eee2e99682747cc8f26e412c87430michal
591ba1ca28cc62fed71c77902b95ae4ed36c6bf25f8Keith Whitwell      *instruction_texture = tgsi_build_instruction_texture(
5927d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell         full_inst->Texture.Texture,
593ffe58739da9eee2e99682747cc8f26e412c87430michal         prev_token,
594ffe58739da9eee2e99682747cc8f26e412c87430michal         instruction,
595ffe58739da9eee2e99682747cc8f26e412c87430michal         header   );
596ba1ca28cc62fed71c77902b95ae4ed36c6bf25f8Keith Whitwell      prev_token = (struct tgsi_token  *) instruction_texture;
597ffe58739da9eee2e99682747cc8f26e412c87430michal   }
598ffe58739da9eee2e99682747cc8f26e412c87430michal
599ffe58739da9eee2e99682747cc8f26e412c87430michal   for( i = 0;  i <   full_inst->Instruction.NumDstRegs; i++ ) {
6007d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell      const struct tgsi_full_dst_register *reg = &full_inst->Dst[i];
601ffe58739da9eee2e99682747cc8f26e412c87430michal      struct tgsi_dst_register *dst_register;
602ffe58739da9eee2e99682747cc8f26e412c87430michal      struct tgsi_token *prev_token;
603ffe58739da9eee2e99682747cc8f26e412c87430michal
604ffe58739da9eee2e99682747cc8f26e412c87430michal      if( maxsize <= size )
605ffe58739da9eee2e99682747cc8f26e412c87430michal         return 0;
606ffe58739da9eee2e99682747cc8f26e412c87430michal      dst_register = (struct tgsi_dst_register *) &tokens[size];
607ffe58739da9eee2e99682747cc8f26e412c87430michal      size++;
608ffe58739da9eee2e99682747cc8f26e412c87430michal
609ffe58739da9eee2e99682747cc8f26e412c87430michal      *dst_register = tgsi_build_dst_register(
6105b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell         reg->Register.File,
6115b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell         reg->Register.WriteMask,
6125b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell         reg->Register.Indirect,
6135b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell         reg->Register.Index,
614ffe58739da9eee2e99682747cc8f26e412c87430michal         instruction,
615ffe58739da9eee2e99682747cc8f26e412c87430michal         header );
616ffe58739da9eee2e99682747cc8f26e412c87430michal      prev_token = (struct tgsi_token  *) dst_register;
617ffe58739da9eee2e99682747cc8f26e412c87430michal
6185b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell      if( reg->Register.Indirect ) {
619baa7ff47d548cdcc1ea68657ee1b0500f78041beBrian Paul         struct tgsi_src_register *ind;
620baa7ff47d548cdcc1ea68657ee1b0500f78041beBrian Paul
621baa7ff47d548cdcc1ea68657ee1b0500f78041beBrian Paul         if( maxsize <= size )
622baa7ff47d548cdcc1ea68657ee1b0500f78041beBrian Paul            return 0;
623baa7ff47d548cdcc1ea68657ee1b0500f78041beBrian Paul         ind = (struct tgsi_src_register *) &tokens[size];
624baa7ff47d548cdcc1ea68657ee1b0500f78041beBrian Paul         size++;
625baa7ff47d548cdcc1ea68657ee1b0500f78041beBrian Paul
626baa7ff47d548cdcc1ea68657ee1b0500f78041beBrian Paul         *ind = tgsi_build_src_register(
6275b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell            reg->Indirect.File,
6285b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell            reg->Indirect.SwizzleX,
6295b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell            reg->Indirect.SwizzleY,
6305b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell            reg->Indirect.SwizzleZ,
6315b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell            reg->Indirect.SwizzleW,
6325b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell            reg->Indirect.Negate,
6335b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell            reg->Indirect.Absolute,
6345b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell            reg->Indirect.Indirect,
6355b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell            reg->Indirect.Dimension,
6365b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell            reg->Indirect.Index,
637baa7ff47d548cdcc1ea68657ee1b0500f78041beBrian Paul            instruction,
638baa7ff47d548cdcc1ea68657ee1b0500f78041beBrian Paul            header );
639baa7ff47d548cdcc1ea68657ee1b0500f78041beBrian Paul      }
640ffe58739da9eee2e99682747cc8f26e412c87430michal   }
641ffe58739da9eee2e99682747cc8f26e412c87430michal
642ffe58739da9eee2e99682747cc8f26e412c87430michal   for( i = 0;  i < full_inst->Instruction.NumSrcRegs; i++ ) {
6437d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell      const struct tgsi_full_src_register *reg = &full_inst->Src[i];
644ffe58739da9eee2e99682747cc8f26e412c87430michal      struct tgsi_src_register *src_register;
645ffe58739da9eee2e99682747cc8f26e412c87430michal      struct tgsi_token *prev_token;
646ffe58739da9eee2e99682747cc8f26e412c87430michal
647ffe58739da9eee2e99682747cc8f26e412c87430michal      if( maxsize <= size )
648ffe58739da9eee2e99682747cc8f26e412c87430michal         return 0;
649ffe58739da9eee2e99682747cc8f26e412c87430michal      src_register = (struct tgsi_src_register *)  &tokens[size];
650ffe58739da9eee2e99682747cc8f26e412c87430michal      size++;
651ffe58739da9eee2e99682747cc8f26e412c87430michal
652ffe58739da9eee2e99682747cc8f26e412c87430michal      *src_register = tgsi_build_src_register(
65391a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell         reg->Register.File,
65491a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell         reg->Register.SwizzleX,
65591a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell         reg->Register.SwizzleY,
65691a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell         reg->Register.SwizzleZ,
65791a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell         reg->Register.SwizzleW,
65891a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell         reg->Register.Negate,
65991a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell         reg->Register.Absolute,
66091a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell         reg->Register.Indirect,
66191a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell         reg->Register.Dimension,
66291a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell         reg->Register.Index,
663ffe58739da9eee2e99682747cc8f26e412c87430michal         instruction,
664ffe58739da9eee2e99682747cc8f26e412c87430michal         header );
665ffe58739da9eee2e99682747cc8f26e412c87430michal      prev_token = (struct tgsi_token  *) src_register;
666ffe58739da9eee2e99682747cc8f26e412c87430michal
66791a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell      if( reg->Register.Indirect ) {
668ffe58739da9eee2e99682747cc8f26e412c87430michal         struct  tgsi_src_register *ind;
669ffe58739da9eee2e99682747cc8f26e412c87430michal
670ffe58739da9eee2e99682747cc8f26e412c87430michal         if( maxsize <= size )
671ffe58739da9eee2e99682747cc8f26e412c87430michal            return 0;
672ffe58739da9eee2e99682747cc8f26e412c87430michal         ind = (struct tgsi_src_register *) &tokens[size];
673ffe58739da9eee2e99682747cc8f26e412c87430michal         size++;
674ffe58739da9eee2e99682747cc8f26e412c87430michal
675ffe58739da9eee2e99682747cc8f26e412c87430michal         *ind = tgsi_build_src_register(
67691a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell            reg->Indirect.File,
67791a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell            reg->Indirect.SwizzleX,
67891a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell            reg->Indirect.SwizzleY,
67991a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell            reg->Indirect.SwizzleZ,
68091a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell            reg->Indirect.SwizzleW,
68191a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell            reg->Indirect.Negate,
68291a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell            reg->Indirect.Absolute,
68391a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell            reg->Indirect.Indirect,
68491a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell            reg->Indirect.Dimension,
68591a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell            reg->Indirect.Index,
686ffe58739da9eee2e99682747cc8f26e412c87430michal            instruction,
687ffe58739da9eee2e99682747cc8f26e412c87430michal            header );
688ffe58739da9eee2e99682747cc8f26e412c87430michal      }
689ffe58739da9eee2e99682747cc8f26e412c87430michal
69091a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell      if( reg->Register.Dimension ) {
691ffe58739da9eee2e99682747cc8f26e412c87430michal         struct  tgsi_dimension *dim;
692ffe58739da9eee2e99682747cc8f26e412c87430michal
69391a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell         assert( !reg->Dimension.Dimension );
694ffe58739da9eee2e99682747cc8f26e412c87430michal
695ffe58739da9eee2e99682747cc8f26e412c87430michal         if( maxsize <= size )
696ffe58739da9eee2e99682747cc8f26e412c87430michal            return 0;
697ffe58739da9eee2e99682747cc8f26e412c87430michal         dim = (struct tgsi_dimension *) &tokens[size];
698ffe58739da9eee2e99682747cc8f26e412c87430michal         size++;
699ffe58739da9eee2e99682747cc8f26e412c87430michal
700ffe58739da9eee2e99682747cc8f26e412c87430michal         *dim = tgsi_build_dimension(
70191a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell            reg->Dimension.Indirect,
70291a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell            reg->Dimension.Index,
703ffe58739da9eee2e99682747cc8f26e412c87430michal            instruction,
704ffe58739da9eee2e99682747cc8f26e412c87430michal            header );
705ffe58739da9eee2e99682747cc8f26e412c87430michal
70691a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell         if( reg->Dimension.Indirect ) {
707ffe58739da9eee2e99682747cc8f26e412c87430michal            struct tgsi_src_register *ind;
708ffe58739da9eee2e99682747cc8f26e412c87430michal
709ffe58739da9eee2e99682747cc8f26e412c87430michal            if( maxsize <= size )
710ffe58739da9eee2e99682747cc8f26e412c87430michal               return 0;
711ffe58739da9eee2e99682747cc8f26e412c87430michal            ind = (struct tgsi_src_register *) &tokens[size];
712ffe58739da9eee2e99682747cc8f26e412c87430michal            size++;
713ffe58739da9eee2e99682747cc8f26e412c87430michal
714ffe58739da9eee2e99682747cc8f26e412c87430michal            *ind = tgsi_build_src_register(
71591a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell               reg->DimIndirect.File,
71691a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell               reg->DimIndirect.SwizzleX,
71791a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell               reg->DimIndirect.SwizzleY,
71891a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell               reg->DimIndirect.SwizzleZ,
71991a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell               reg->DimIndirect.SwizzleW,
72091a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell               reg->DimIndirect.Negate,
72191a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell               reg->DimIndirect.Absolute,
72291a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell               reg->DimIndirect.Indirect,
72391a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell               reg->DimIndirect.Dimension,
72491a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell               reg->DimIndirect.Index,
725ffe58739da9eee2e99682747cc8f26e412c87430michal               instruction,
726ffe58739da9eee2e99682747cc8f26e412c87430michal               header );
727ffe58739da9eee2e99682747cc8f26e412c87430michal         }
728ffe58739da9eee2e99682747cc8f26e412c87430michal      }
729ffe58739da9eee2e99682747cc8f26e412c87430michal   }
730ffe58739da9eee2e99682747cc8f26e412c87430michal
731ffe58739da9eee2e99682747cc8f26e412c87430michal   return size;
732ffe58739da9eee2e99682747cc8f26e412c87430michal}
733ffe58739da9eee2e99682747cc8f26e412c87430michal
7345ee0d9f632383339088cc33005b7794b0915d4e0Michal Krolstruct tgsi_instruction_predicate
7355ee0d9f632383339088cc33005b7794b0915d4e0Michal Kroltgsi_default_instruction_predicate(void)
7365ee0d9f632383339088cc33005b7794b0915d4e0Michal Krol{
7375ee0d9f632383339088cc33005b7794b0915d4e0Michal Krol   struct tgsi_instruction_predicate instruction_predicate;
7385ee0d9f632383339088cc33005b7794b0915d4e0Michal Krol
7395ee0d9f632383339088cc33005b7794b0915d4e0Michal Krol   instruction_predicate.SwizzleX = TGSI_SWIZZLE_X;
7405ee0d9f632383339088cc33005b7794b0915d4e0Michal Krol   instruction_predicate.SwizzleY = TGSI_SWIZZLE_Y;
7415ee0d9f632383339088cc33005b7794b0915d4e0Michal Krol   instruction_predicate.SwizzleZ = TGSI_SWIZZLE_Z;
7425ee0d9f632383339088cc33005b7794b0915d4e0Michal Krol   instruction_predicate.SwizzleW = TGSI_SWIZZLE_W;
7435ee0d9f632383339088cc33005b7794b0915d4e0Michal Krol   instruction_predicate.Negate = 0;
7445ee0d9f632383339088cc33005b7794b0915d4e0Michal Krol   instruction_predicate.Index = 0;
7455ee0d9f632383339088cc33005b7794b0915d4e0Michal Krol   instruction_predicate.Padding = 0;
7465ee0d9f632383339088cc33005b7794b0915d4e0Michal Krol
7475ee0d9f632383339088cc33005b7794b0915d4e0Michal Krol   return instruction_predicate;
7485ee0d9f632383339088cc33005b7794b0915d4e0Michal Krol}
7495ee0d9f632383339088cc33005b7794b0915d4e0Michal Krol
7505ee0d9f632383339088cc33005b7794b0915d4e0Michal Krolstruct tgsi_instruction_predicate
7515ee0d9f632383339088cc33005b7794b0915d4e0Michal Kroltgsi_build_instruction_predicate(int index,
7525ee0d9f632383339088cc33005b7794b0915d4e0Michal Krol                                 unsigned negate,
7535ee0d9f632383339088cc33005b7794b0915d4e0Michal Krol                                 unsigned swizzleX,
7545ee0d9f632383339088cc33005b7794b0915d4e0Michal Krol                                 unsigned swizzleY,
7555ee0d9f632383339088cc33005b7794b0915d4e0Michal Krol                                 unsigned swizzleZ,
7565ee0d9f632383339088cc33005b7794b0915d4e0Michal Krol                                 unsigned swizzleW,
7575ee0d9f632383339088cc33005b7794b0915d4e0Michal Krol                                 struct tgsi_instruction *instruction,
7585ee0d9f632383339088cc33005b7794b0915d4e0Michal Krol                                 struct tgsi_header *header)
7595ee0d9f632383339088cc33005b7794b0915d4e0Michal Krol{
7605ee0d9f632383339088cc33005b7794b0915d4e0Michal Krol   struct tgsi_instruction_predicate instruction_predicate;
7615ee0d9f632383339088cc33005b7794b0915d4e0Michal Krol
7625ee0d9f632383339088cc33005b7794b0915d4e0Michal Krol   instruction_predicate = tgsi_default_instruction_predicate();
7635ee0d9f632383339088cc33005b7794b0915d4e0Michal Krol   instruction_predicate.SwizzleX = swizzleX;
7645ee0d9f632383339088cc33005b7794b0915d4e0Michal Krol   instruction_predicate.SwizzleY = swizzleY;
7655ee0d9f632383339088cc33005b7794b0915d4e0Michal Krol   instruction_predicate.SwizzleZ = swizzleZ;
7665ee0d9f632383339088cc33005b7794b0915d4e0Michal Krol   instruction_predicate.SwizzleW = swizzleW;
7675ee0d9f632383339088cc33005b7794b0915d4e0Michal Krol   instruction_predicate.Negate = negate;
7685ee0d9f632383339088cc33005b7794b0915d4e0Michal Krol   instruction_predicate.Index = index;
7695ee0d9f632383339088cc33005b7794b0915d4e0Michal Krol
7705ee0d9f632383339088cc33005b7794b0915d4e0Michal Krol   instruction_grow(instruction, header);
7715ee0d9f632383339088cc33005b7794b0915d4e0Michal Krol
7725ee0d9f632383339088cc33005b7794b0915d4e0Michal Krol   return instruction_predicate;
7735ee0d9f632383339088cc33005b7794b0915d4e0Michal Krol}
7745ee0d9f632383339088cc33005b7794b0915d4e0Michal Krol
775ba1ca28cc62fed71c77902b95ae4ed36c6bf25f8Keith Whitwellstruct tgsi_instruction_label
776ba1ca28cc62fed71c77902b95ae4ed36c6bf25f8Keith Whitwelltgsi_default_instruction_label( void )
777ffe58739da9eee2e99682747cc8f26e412c87430michal{
778ba1ca28cc62fed71c77902b95ae4ed36c6bf25f8Keith Whitwell   struct tgsi_instruction_label instruction_label;
779ffe58739da9eee2e99682747cc8f26e412c87430michal
780ba1ca28cc62fed71c77902b95ae4ed36c6bf25f8Keith Whitwell   instruction_label.Label = 0;
781ba1ca28cc62fed71c77902b95ae4ed36c6bf25f8Keith Whitwell   instruction_label.Padding = 0;
782ffe58739da9eee2e99682747cc8f26e412c87430michal
783ba1ca28cc62fed71c77902b95ae4ed36c6bf25f8Keith Whitwell   return instruction_label;
784ffe58739da9eee2e99682747cc8f26e412c87430michal}
785ffe58739da9eee2e99682747cc8f26e412c87430michal
786ba1ca28cc62fed71c77902b95ae4ed36c6bf25f8Keith Whitwellstruct tgsi_instruction_label
787ba1ca28cc62fed71c77902b95ae4ed36c6bf25f8Keith Whitwelltgsi_build_instruction_label(
788529c411e4095eeb9be501a6fe657a3a196c3e448michal   unsigned label,
789ffe58739da9eee2e99682747cc8f26e412c87430michal   struct tgsi_token  *prev_token,
790ffe58739da9eee2e99682747cc8f26e412c87430michal   struct tgsi_instruction *instruction,
791ffe58739da9eee2e99682747cc8f26e412c87430michal   struct tgsi_header *header )
792ffe58739da9eee2e99682747cc8f26e412c87430michal{
793ba1ca28cc62fed71c77902b95ae4ed36c6bf25f8Keith Whitwell   struct tgsi_instruction_label instruction_label;
794ffe58739da9eee2e99682747cc8f26e412c87430michal
795ba1ca28cc62fed71c77902b95ae4ed36c6bf25f8Keith Whitwell   instruction_label = tgsi_default_instruction_label();
796ba1ca28cc62fed71c77902b95ae4ed36c6bf25f8Keith Whitwell   instruction_label.Label = label;
797ba1ca28cc62fed71c77902b95ae4ed36c6bf25f8Keith Whitwell   instruction->Label = 1;
798ffe58739da9eee2e99682747cc8f26e412c87430michal
799ffe58739da9eee2e99682747cc8f26e412c87430michal   instruction_grow( instruction, header );
800ffe58739da9eee2e99682747cc8f26e412c87430michal
801ba1ca28cc62fed71c77902b95ae4ed36c6bf25f8Keith Whitwell   return instruction_label;
802ffe58739da9eee2e99682747cc8f26e412c87430michal}
803ffe58739da9eee2e99682747cc8f26e412c87430michal
804ba1ca28cc62fed71c77902b95ae4ed36c6bf25f8Keith Whitwellstruct tgsi_instruction_texture
805ba1ca28cc62fed71c77902b95ae4ed36c6bf25f8Keith Whitwelltgsi_default_instruction_texture( void )
806ffe58739da9eee2e99682747cc8f26e412c87430michal{
807ba1ca28cc62fed71c77902b95ae4ed36c6bf25f8Keith Whitwell   struct tgsi_instruction_texture instruction_texture;
808ffe58739da9eee2e99682747cc8f26e412c87430michal
809ba1ca28cc62fed71c77902b95ae4ed36c6bf25f8Keith Whitwell   instruction_texture.Texture = TGSI_TEXTURE_UNKNOWN;
810ba1ca28cc62fed71c77902b95ae4ed36c6bf25f8Keith Whitwell   instruction_texture.Padding = 0;
811ffe58739da9eee2e99682747cc8f26e412c87430michal
812ba1ca28cc62fed71c77902b95ae4ed36c6bf25f8Keith Whitwell   return instruction_texture;
813ffe58739da9eee2e99682747cc8f26e412c87430michal}
814ffe58739da9eee2e99682747cc8f26e412c87430michal
815ba1ca28cc62fed71c77902b95ae4ed36c6bf25f8Keith Whitwellstruct tgsi_instruction_texture
816ba1ca28cc62fed71c77902b95ae4ed36c6bf25f8Keith Whitwelltgsi_build_instruction_texture(
817529c411e4095eeb9be501a6fe657a3a196c3e448michal   unsigned texture,
818ffe58739da9eee2e99682747cc8f26e412c87430michal   struct tgsi_token *prev_token,
819ffe58739da9eee2e99682747cc8f26e412c87430michal   struct tgsi_instruction *instruction,
820ffe58739da9eee2e99682747cc8f26e412c87430michal   struct tgsi_header *header )
821ffe58739da9eee2e99682747cc8f26e412c87430michal{
822ba1ca28cc62fed71c77902b95ae4ed36c6bf25f8Keith Whitwell   struct tgsi_instruction_texture instruction_texture;
823ffe58739da9eee2e99682747cc8f26e412c87430michal
824ba1ca28cc62fed71c77902b95ae4ed36c6bf25f8Keith Whitwell   instruction_texture = tgsi_default_instruction_texture();
825ba1ca28cc62fed71c77902b95ae4ed36c6bf25f8Keith Whitwell   instruction_texture.Texture = texture;
826ba1ca28cc62fed71c77902b95ae4ed36c6bf25f8Keith Whitwell   instruction->Texture = 1;
827ffe58739da9eee2e99682747cc8f26e412c87430michal
828ffe58739da9eee2e99682747cc8f26e412c87430michal   instruction_grow( instruction, header );
829ffe58739da9eee2e99682747cc8f26e412c87430michal
830ba1ca28cc62fed71c77902b95ae4ed36c6bf25f8Keith Whitwell   return instruction_texture;
831ffe58739da9eee2e99682747cc8f26e412c87430michal}
832ffe58739da9eee2e99682747cc8f26e412c87430michal
833ffe58739da9eee2e99682747cc8f26e412c87430michalstruct tgsi_src_register
834ffe58739da9eee2e99682747cc8f26e412c87430michaltgsi_default_src_register( void )
835ffe58739da9eee2e99682747cc8f26e412c87430michal{
836ffe58739da9eee2e99682747cc8f26e412c87430michal   struct tgsi_src_register src_register;
837ffe58739da9eee2e99682747cc8f26e412c87430michal
838ffe58739da9eee2e99682747cc8f26e412c87430michal   src_register.File = TGSI_FILE_NULL;
839ffe58739da9eee2e99682747cc8f26e412c87430michal   src_register.SwizzleX = TGSI_SWIZZLE_X;
840ffe58739da9eee2e99682747cc8f26e412c87430michal   src_register.SwizzleY = TGSI_SWIZZLE_Y;
841ffe58739da9eee2e99682747cc8f26e412c87430michal   src_register.SwizzleZ = TGSI_SWIZZLE_Z;
842ffe58739da9eee2e99682747cc8f26e412c87430michal   src_register.SwizzleW = TGSI_SWIZZLE_W;
843ffe58739da9eee2e99682747cc8f26e412c87430michal   src_register.Negate = 0;
844ba1ca28cc62fed71c77902b95ae4ed36c6bf25f8Keith Whitwell   src_register.Absolute = 0;
845ffe58739da9eee2e99682747cc8f26e412c87430michal   src_register.Indirect = 0;
846ffe58739da9eee2e99682747cc8f26e412c87430michal   src_register.Dimension = 0;
847ffe58739da9eee2e99682747cc8f26e412c87430michal   src_register.Index = 0;
848ffe58739da9eee2e99682747cc8f26e412c87430michal
849ffe58739da9eee2e99682747cc8f26e412c87430michal   return src_register;
850ffe58739da9eee2e99682747cc8f26e412c87430michal}
851ffe58739da9eee2e99682747cc8f26e412c87430michal
852ffe58739da9eee2e99682747cc8f26e412c87430michalstruct tgsi_src_register
853ffe58739da9eee2e99682747cc8f26e412c87430michaltgsi_build_src_register(
854529c411e4095eeb9be501a6fe657a3a196c3e448michal   unsigned file,
855529c411e4095eeb9be501a6fe657a3a196c3e448michal   unsigned swizzle_x,
856529c411e4095eeb9be501a6fe657a3a196c3e448michal   unsigned swizzle_y,
857529c411e4095eeb9be501a6fe657a3a196c3e448michal   unsigned swizzle_z,
858529c411e4095eeb9be501a6fe657a3a196c3e448michal   unsigned swizzle_w,
859529c411e4095eeb9be501a6fe657a3a196c3e448michal   unsigned negate,
860ba1ca28cc62fed71c77902b95ae4ed36c6bf25f8Keith Whitwell   unsigned absolute,
861529c411e4095eeb9be501a6fe657a3a196c3e448michal   unsigned indirect,
862529c411e4095eeb9be501a6fe657a3a196c3e448michal   unsigned dimension,
863529c411e4095eeb9be501a6fe657a3a196c3e448michal   int index,
864ffe58739da9eee2e99682747cc8f26e412c87430michal   struct tgsi_instruction *instruction,
865ffe58739da9eee2e99682747cc8f26e412c87430michal   struct tgsi_header *header )
866ffe58739da9eee2e99682747cc8f26e412c87430michal{
867ffe58739da9eee2e99682747cc8f26e412c87430michal   struct tgsi_src_register   src_register;
868ffe58739da9eee2e99682747cc8f26e412c87430michal
869cff2126f522bb511216f64427b3060467e266f8aBrian Paul   assert( file < TGSI_FILE_COUNT );
870ffe58739da9eee2e99682747cc8f26e412c87430michal   assert( swizzle_x <= TGSI_SWIZZLE_W );
871ffe58739da9eee2e99682747cc8f26e412c87430michal   assert( swizzle_y <= TGSI_SWIZZLE_W );
872ffe58739da9eee2e99682747cc8f26e412c87430michal   assert( swizzle_z <= TGSI_SWIZZLE_W );
873ffe58739da9eee2e99682747cc8f26e412c87430michal   assert( swizzle_w <= TGSI_SWIZZLE_W );
874ffe58739da9eee2e99682747cc8f26e412c87430michal   assert( negate <= 1 );
875ffe58739da9eee2e99682747cc8f26e412c87430michal   assert( index >= -0x8000 && index <= 0x7FFF );
876ffe58739da9eee2e99682747cc8f26e412c87430michal
877ffe58739da9eee2e99682747cc8f26e412c87430michal   src_register = tgsi_default_src_register();
878ffe58739da9eee2e99682747cc8f26e412c87430michal   src_register.File = file;
879ffe58739da9eee2e99682747cc8f26e412c87430michal   src_register.SwizzleX = swizzle_x;
880ffe58739da9eee2e99682747cc8f26e412c87430michal   src_register.SwizzleY = swizzle_y;
881ffe58739da9eee2e99682747cc8f26e412c87430michal   src_register.SwizzleZ = swizzle_z;
882ffe58739da9eee2e99682747cc8f26e412c87430michal   src_register.SwizzleW = swizzle_w;
883ffe58739da9eee2e99682747cc8f26e412c87430michal   src_register.Negate = negate;
884ba1ca28cc62fed71c77902b95ae4ed36c6bf25f8Keith Whitwell   src_register.Absolute = absolute;
885ffe58739da9eee2e99682747cc8f26e412c87430michal   src_register.Indirect = indirect;
886ffe58739da9eee2e99682747cc8f26e412c87430michal   src_register.Dimension = dimension;
887ffe58739da9eee2e99682747cc8f26e412c87430michal   src_register.Index = index;
888ffe58739da9eee2e99682747cc8f26e412c87430michal
889ffe58739da9eee2e99682747cc8f26e412c87430michal   instruction_grow( instruction, header );
890ffe58739da9eee2e99682747cc8f26e412c87430michal
891ffe58739da9eee2e99682747cc8f26e412c87430michal   return src_register;
892ffe58739da9eee2e99682747cc8f26e412c87430michal}
893ffe58739da9eee2e99682747cc8f26e412c87430michal
894ffe58739da9eee2e99682747cc8f26e412c87430michalstruct tgsi_full_src_register
895ffe58739da9eee2e99682747cc8f26e412c87430michaltgsi_default_full_src_register( void )
896ffe58739da9eee2e99682747cc8f26e412c87430michal{
897ffe58739da9eee2e99682747cc8f26e412c87430michal   struct tgsi_full_src_register full_src_register;
898ffe58739da9eee2e99682747cc8f26e412c87430michal
89991a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell   full_src_register.Register = tgsi_default_src_register();
90091a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell   full_src_register.Indirect = tgsi_default_src_register();
90191a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell   full_src_register.Dimension = tgsi_default_dimension();
90291a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell   full_src_register.DimIndirect = tgsi_default_src_register();
903ffe58739da9eee2e99682747cc8f26e412c87430michal
904ffe58739da9eee2e99682747cc8f26e412c87430michal   return full_src_register;
905ffe58739da9eee2e99682747cc8f26e412c87430michal}
906ffe58739da9eee2e99682747cc8f26e412c87430michal
907ffe58739da9eee2e99682747cc8f26e412c87430michal
908ffe58739da9eee2e99682747cc8f26e412c87430michalstruct tgsi_dimension
909ffe58739da9eee2e99682747cc8f26e412c87430michaltgsi_default_dimension( void )
910ffe58739da9eee2e99682747cc8f26e412c87430michal{
911ffe58739da9eee2e99682747cc8f26e412c87430michal   struct tgsi_dimension dimension;
912ffe58739da9eee2e99682747cc8f26e412c87430michal
913ffe58739da9eee2e99682747cc8f26e412c87430michal   dimension.Indirect = 0;
914ffe58739da9eee2e99682747cc8f26e412c87430michal   dimension.Dimension = 0;
915ffe58739da9eee2e99682747cc8f26e412c87430michal   dimension.Padding = 0;
916ffe58739da9eee2e99682747cc8f26e412c87430michal   dimension.Index = 0;
917ffe58739da9eee2e99682747cc8f26e412c87430michal
918ffe58739da9eee2e99682747cc8f26e412c87430michal   return dimension;
919ffe58739da9eee2e99682747cc8f26e412c87430michal}
920ffe58739da9eee2e99682747cc8f26e412c87430michal
921ffe58739da9eee2e99682747cc8f26e412c87430michalstruct tgsi_dimension
922ffe58739da9eee2e99682747cc8f26e412c87430michaltgsi_build_dimension(
923529c411e4095eeb9be501a6fe657a3a196c3e448michal   unsigned indirect,
924529c411e4095eeb9be501a6fe657a3a196c3e448michal   unsigned index,
925ffe58739da9eee2e99682747cc8f26e412c87430michal   struct tgsi_instruction *instruction,
926ffe58739da9eee2e99682747cc8f26e412c87430michal   struct tgsi_header *header )
927ffe58739da9eee2e99682747cc8f26e412c87430michal{
928ffe58739da9eee2e99682747cc8f26e412c87430michal   struct tgsi_dimension dimension;
929ffe58739da9eee2e99682747cc8f26e412c87430michal
930ffe58739da9eee2e99682747cc8f26e412c87430michal   dimension = tgsi_default_dimension();
931ffe58739da9eee2e99682747cc8f26e412c87430michal   dimension.Indirect = indirect;
932ffe58739da9eee2e99682747cc8f26e412c87430michal   dimension.Index = index;
933ffe58739da9eee2e99682747cc8f26e412c87430michal
934ffe58739da9eee2e99682747cc8f26e412c87430michal   instruction_grow( instruction, header );
935ffe58739da9eee2e99682747cc8f26e412c87430michal
936ffe58739da9eee2e99682747cc8f26e412c87430michal   return dimension;
937ffe58739da9eee2e99682747cc8f26e412c87430michal}
938ffe58739da9eee2e99682747cc8f26e412c87430michal
939ffe58739da9eee2e99682747cc8f26e412c87430michalstruct tgsi_dst_register
940ffe58739da9eee2e99682747cc8f26e412c87430michaltgsi_default_dst_register( void )
941ffe58739da9eee2e99682747cc8f26e412c87430michal{
942ffe58739da9eee2e99682747cc8f26e412c87430michal   struct tgsi_dst_register dst_register;
943ffe58739da9eee2e99682747cc8f26e412c87430michal
944ffe58739da9eee2e99682747cc8f26e412c87430michal   dst_register.File = TGSI_FILE_NULL;
945ffe58739da9eee2e99682747cc8f26e412c87430michal   dst_register.WriteMask = TGSI_WRITEMASK_XYZW;
946ffe58739da9eee2e99682747cc8f26e412c87430michal   dst_register.Indirect = 0;
947ffe58739da9eee2e99682747cc8f26e412c87430michal   dst_register.Dimension = 0;
948ffe58739da9eee2e99682747cc8f26e412c87430michal   dst_register.Index = 0;
949ffe58739da9eee2e99682747cc8f26e412c87430michal   dst_register.Padding = 0;
950ffe58739da9eee2e99682747cc8f26e412c87430michal
951ffe58739da9eee2e99682747cc8f26e412c87430michal   return dst_register;
952ffe58739da9eee2e99682747cc8f26e412c87430michal}
953ffe58739da9eee2e99682747cc8f26e412c87430michal
954ffe58739da9eee2e99682747cc8f26e412c87430michalstruct tgsi_dst_register
955ffe58739da9eee2e99682747cc8f26e412c87430michaltgsi_build_dst_register(
956529c411e4095eeb9be501a6fe657a3a196c3e448michal   unsigned file,
957529c411e4095eeb9be501a6fe657a3a196c3e448michal   unsigned mask,
958baa7ff47d548cdcc1ea68657ee1b0500f78041beBrian Paul   unsigned indirect,
959529c411e4095eeb9be501a6fe657a3a196c3e448michal   int index,
960ffe58739da9eee2e99682747cc8f26e412c87430michal   struct tgsi_instruction *instruction,
961ffe58739da9eee2e99682747cc8f26e412c87430michal   struct tgsi_header *header )
962ffe58739da9eee2e99682747cc8f26e412c87430michal{
963ffe58739da9eee2e99682747cc8f26e412c87430michal   struct tgsi_dst_register dst_register;
964ffe58739da9eee2e99682747cc8f26e412c87430michal
965cff2126f522bb511216f64427b3060467e266f8aBrian Paul   assert( file < TGSI_FILE_COUNT );
966529c411e4095eeb9be501a6fe657a3a196c3e448michal   assert( mask <= TGSI_WRITEMASK_XYZW );
967529c411e4095eeb9be501a6fe657a3a196c3e448michal   assert( index >= -32768 && index <= 32767 );
968ffe58739da9eee2e99682747cc8f26e412c87430michal
969ffe58739da9eee2e99682747cc8f26e412c87430michal   dst_register = tgsi_default_dst_register();
970ffe58739da9eee2e99682747cc8f26e412c87430michal   dst_register.File = file;
971ffe58739da9eee2e99682747cc8f26e412c87430michal   dst_register.WriteMask = mask;
972ffe58739da9eee2e99682747cc8f26e412c87430michal   dst_register.Index = index;
973baa7ff47d548cdcc1ea68657ee1b0500f78041beBrian Paul   dst_register.Indirect = indirect;
974ffe58739da9eee2e99682747cc8f26e412c87430michal
975ffe58739da9eee2e99682747cc8f26e412c87430michal   instruction_grow( instruction, header );
976ffe58739da9eee2e99682747cc8f26e412c87430michal
977ffe58739da9eee2e99682747cc8f26e412c87430michal   return dst_register;
978ffe58739da9eee2e99682747cc8f26e412c87430michal}
979ffe58739da9eee2e99682747cc8f26e412c87430michal
980ffe58739da9eee2e99682747cc8f26e412c87430michalstruct tgsi_full_dst_register
981ffe58739da9eee2e99682747cc8f26e412c87430michaltgsi_default_full_dst_register( void )
982ffe58739da9eee2e99682747cc8f26e412c87430michal{
983ffe58739da9eee2e99682747cc8f26e412c87430michal   struct tgsi_full_dst_register full_dst_register;
984ffe58739da9eee2e99682747cc8f26e412c87430michal
9855b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell   full_dst_register.Register = tgsi_default_dst_register();
9865b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell   full_dst_register.Indirect = tgsi_default_src_register();
987ffe58739da9eee2e99682747cc8f26e412c87430michal
988ffe58739da9eee2e99682747cc8f26e412c87430michal   return full_dst_register;
989ffe58739da9eee2e99682747cc8f26e412c87430michal}
990ffe58739da9eee2e99682747cc8f26e412c87430michal
9913ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusinstruct tgsi_property
9923ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusintgsi_default_property( void )
9933ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin{
9943ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   struct tgsi_property property;
9953ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin
9963ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   property.Type = TGSI_TOKEN_TYPE_PROPERTY;
9973ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   property.NrTokens = 1;
9983ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   property.PropertyName = TGSI_PROPERTY_GS_INPUT_PRIM;
9993ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   property.Padding = 0;
10003ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin
10013ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   return property;
10023ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin}
10033ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin
10043ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusinstruct tgsi_property
10053ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusintgsi_build_property(unsigned property_name,
10063ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin                    struct tgsi_header *header)
10073ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin{
10083ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   struct tgsi_property property;
10093ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin
10103ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   property = tgsi_default_property();
10113ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   property.PropertyName = property_name;
10123ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin
10133ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   header_bodysize_grow( header );
10143ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin
10153ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   return property;
10163ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin}
10173ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin
10183ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin
10193ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusinstruct tgsi_full_property
10203ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusintgsi_default_full_property( void )
10213ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin{
10223ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   struct tgsi_full_property  full_property;
10233ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin
10243ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   full_property.Property  = tgsi_default_property();
10253ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   memset(full_property.u, 0,
10263ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin          sizeof(struct tgsi_property_data) * 8);
10273ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin
10283ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   return full_property;
10293ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin}
10303ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin
10313ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusinstatic void
10323ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusinproperty_grow(
10333ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   struct tgsi_property *property,
10343ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   struct tgsi_header *header )
10353ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin{
10363ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   assert( property->NrTokens < 0xFF );
10373ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin
10383ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   property->NrTokens++;
10393ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin
10403ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   header_bodysize_grow( header );
10413ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin}
10423ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin
10433ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusinstruct tgsi_property_data
10443ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusintgsi_build_property_data(
10453ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   unsigned value,
10463ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   struct tgsi_property *property,
10473ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   struct tgsi_header *header )
10483ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin{
10493ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   struct tgsi_property_data property_data;
10503ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin
10513ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   property_data.Data = value;
10523ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin
10533ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   property_grow( property, header );
10543ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin
10553ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   return property_data;
10563ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin}
10573ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin
10583ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusinunsigned
10593ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusintgsi_build_full_property(
10603ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   const struct tgsi_full_property *full_prop,
10613ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   struct tgsi_token *tokens,
10623ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   struct tgsi_header *header,
10633ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   unsigned maxsize )
10643ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin{
10653ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   unsigned size = 0, i;
10663ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   struct tgsi_property *property;
10673ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin
10683ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   if( maxsize <= size )
10693ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin      return 0;
10703ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   property = (struct tgsi_property *) &tokens[size];
10713ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   size++;
10723ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin
10733ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   *property = tgsi_build_property(
1074960be012a9d185c80bfcb9ff5c3781314dfb7b25Zack Rusin      full_prop->Property.PropertyName,
10753ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin      header );
10763ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin
10773ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   assert( full_prop->Property.NrTokens <= 8 + 1 );
10783ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin
10793ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   for( i = 0; i < full_prop->Property.NrTokens - 1; i++ ) {
10803ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin      struct tgsi_property_data *data;
10813ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin
10823ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin      if( maxsize <= size )
10833ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin         return  0;
10843ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin      data = (struct tgsi_property_data *) &tokens[size];
10853ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin      size++;
10863ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin
10873ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin      *data = tgsi_build_property_data(
10883ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin         full_prop->u[i].Data,
10893ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin         property,
10903ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin         header );
10913ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   }
10923ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin
10933ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   return size;
10943ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin}
1095