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"
29bdbe77f9c6f06cfaa155f27c2ade3c523d7fbea7Zack Rusin#include "pipe/p_format.h"
30abd5e8e41d54f7f491f91af9354f19c8d24d3572Michal Krol#include "pipe/p_shader_tokens.h"
31abd5e8e41d54f7f491f91af9354f19c8d24d3572Michal Krol#include "tgsi_build.h"
32abd5e8e41d54f7f491f91af9354f19c8d24d3572Michal Krol#include "tgsi_parse.h"
33ffe58739da9eee2e99682747cc8f26e412c87430michal
34ffe58739da9eee2e99682747cc8f26e412c87430michal
35ffe58739da9eee2e99682747cc8f26e412c87430michal/*
36ffe58739da9eee2e99682747cc8f26e412c87430michal * header
37ffe58739da9eee2e99682747cc8f26e412c87430michal */
38ffe58739da9eee2e99682747cc8f26e412c87430michal
39ffe58739da9eee2e99682747cc8f26e412c87430michalstruct tgsi_header
40ffe58739da9eee2e99682747cc8f26e412c87430michaltgsi_build_header( void )
41ffe58739da9eee2e99682747cc8f26e412c87430michal{
42ffe58739da9eee2e99682747cc8f26e412c87430michal   struct tgsi_header header;
43ffe58739da9eee2e99682747cc8f26e412c87430michal
44ffe58739da9eee2e99682747cc8f26e412c87430michal   header.HeaderSize = 1;
45ffe58739da9eee2e99682747cc8f26e412c87430michal   header.BodySize = 0;
46ffe58739da9eee2e99682747cc8f26e412c87430michal
47ffe58739da9eee2e99682747cc8f26e412c87430michal   return header;
48ffe58739da9eee2e99682747cc8f26e412c87430michal}
49ffe58739da9eee2e99682747cc8f26e412c87430michal
50ffe58739da9eee2e99682747cc8f26e412c87430michalstatic void
51ffe58739da9eee2e99682747cc8f26e412c87430michalheader_headersize_grow( struct tgsi_header *header )
52ffe58739da9eee2e99682747cc8f26e412c87430michal{
53b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michal   assert( header->HeaderSize < 0xFF );
54b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michal   assert( header->BodySize == 0 );
55ffe58739da9eee2e99682747cc8f26e412c87430michal
56ffe58739da9eee2e99682747cc8f26e412c87430michal   header->HeaderSize++;
57ffe58739da9eee2e99682747cc8f26e412c87430michal}
58ffe58739da9eee2e99682747cc8f26e412c87430michal
59ffe58739da9eee2e99682747cc8f26e412c87430michalstatic void
60ffe58739da9eee2e99682747cc8f26e412c87430michalheader_bodysize_grow( struct tgsi_header *header )
61ffe58739da9eee2e99682747cc8f26e412c87430michal{
62b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michal   assert( header->BodySize < 0xFFFFFF );
63ffe58739da9eee2e99682747cc8f26e412c87430michal
64ffe58739da9eee2e99682747cc8f26e412c87430michal   header->BodySize++;
65ffe58739da9eee2e99682747cc8f26e412c87430michal}
66ffe58739da9eee2e99682747cc8f26e412c87430michal
67ffe58739da9eee2e99682747cc8f26e412c87430michalstruct tgsi_processor
68ffe58739da9eee2e99682747cc8f26e412c87430michaltgsi_build_processor(
69b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michal   unsigned type,
70ffe58739da9eee2e99682747cc8f26e412c87430michal   struct tgsi_header *header )
71ffe58739da9eee2e99682747cc8f26e412c87430michal{
72ffe58739da9eee2e99682747cc8f26e412c87430michal   struct tgsi_processor processor;
73ffe58739da9eee2e99682747cc8f26e412c87430michal
74ffe58739da9eee2e99682747cc8f26e412c87430michal   processor.Processor = type;
75420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   processor.Padding = 0;
76ffe58739da9eee2e99682747cc8f26e412c87430michal
77ffe58739da9eee2e99682747cc8f26e412c87430michal   header_headersize_grow( header );
78ffe58739da9eee2e99682747cc8f26e412c87430michal
79ffe58739da9eee2e99682747cc8f26e412c87430michal   return processor;
80ffe58739da9eee2e99682747cc8f26e412c87430michal}
81ffe58739da9eee2e99682747cc8f26e412c87430michal
82ffe58739da9eee2e99682747cc8f26e412c87430michal/*
83ffe58739da9eee2e99682747cc8f26e412c87430michal * declaration
84ffe58739da9eee2e99682747cc8f26e412c87430michal */
85ffe58739da9eee2e99682747cc8f26e412c87430michal
86420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krolstatic void
87420400f67fce15512a8fcab770dde83a3eacc5ccMichal Kroldeclaration_grow(
88420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   struct tgsi_declaration *declaration,
89420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   struct tgsi_header *header )
90420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol{
91420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   assert( declaration->NrTokens < 0xFF );
92420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
93420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   declaration->NrTokens++;
94420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
95420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   header_bodysize_grow( header );
96420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol}
97420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
98420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krolstatic struct tgsi_declaration
99ffe58739da9eee2e99682747cc8f26e412c87430michaltgsi_default_declaration( void )
100ffe58739da9eee2e99682747cc8f26e412c87430michal{
101ffe58739da9eee2e99682747cc8f26e412c87430michal   struct tgsi_declaration declaration;
102ffe58739da9eee2e99682747cc8f26e412c87430michal
103ffe58739da9eee2e99682747cc8f26e412c87430michal   declaration.Type = TGSI_TOKEN_TYPE_DECLARATION;
1045ecd0b0890fd48656e46c017830a9f5d6b906aaeMichal Krol   declaration.NrTokens = 1;
105ffe58739da9eee2e99682747cc8f26e412c87430michal   declaration.File = TGSI_FILE_NULL;
106058b978a5ae2a56e09fed6335b686c654444f4acmichal   declaration.UsageMask = TGSI_WRITEMASK_XYZW;
1071279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez   declaration.Interpolate = 0;
108dcf8543ab375dd9c128d1ca772b1e587cebbdc7cMichal Krol   declaration.Dimension = 0;
109b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michal   declaration.Semantic = 0;
110434e255eae90b0f3d836d452b7d3b0c5aadf78b8Brian Paul   declaration.Invariant = 0;
1112644952bd4dfa3b75112dee8dfd287a12d770705Francisco Jerez   declaration.Local = 0;
1120f6a3a7de3b56a383061635016cdb10f0229bf02Vinson Lee   declaration.Padding = 0;
113ffe58739da9eee2e99682747cc8f26e412c87430michal
114ffe58739da9eee2e99682747cc8f26e412c87430michal   return declaration;
115ffe58739da9eee2e99682747cc8f26e412c87430michal}
116ffe58739da9eee2e99682747cc8f26e412c87430michal
117420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krolstatic struct tgsi_declaration
118ffe58739da9eee2e99682747cc8f26e412c87430michaltgsi_build_declaration(
119b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michal   unsigned file,
120058b978a5ae2a56e09fed6335b686c654444f4acmichal   unsigned usage_mask,
121b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michal   unsigned interpolate,
122dcf8543ab375dd9c128d1ca772b1e587cebbdc7cMichal Krol   unsigned dimension,
123b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michal   unsigned semantic,
1244de360e67d83cd6503fb8ad053bb8afe507db5faBrian Paul   unsigned invariant,
1252644952bd4dfa3b75112dee8dfd287a12d770705Francisco Jerez   unsigned local,
126ffe58739da9eee2e99682747cc8f26e412c87430michal   struct tgsi_header *header )
127ffe58739da9eee2e99682747cc8f26e412c87430michal{
128ffe58739da9eee2e99682747cc8f26e412c87430michal   struct tgsi_declaration declaration;
129ffe58739da9eee2e99682747cc8f26e412c87430michal
130cff2126f522bb511216f64427b3060467e266f8aBrian Paul   assert( file < TGSI_FILE_COUNT );
131cff2126f522bb511216f64427b3060467e266f8aBrian Paul   assert( interpolate < TGSI_INTERPOLATE_COUNT );
132ffe58739da9eee2e99682747cc8f26e412c87430michal
133ffe58739da9eee2e99682747cc8f26e412c87430michal   declaration = tgsi_default_declaration();
134ffe58739da9eee2e99682747cc8f26e412c87430michal   declaration.File = file;
135058b978a5ae2a56e09fed6335b686c654444f4acmichal   declaration.UsageMask = usage_mask;
136ffe58739da9eee2e99682747cc8f26e412c87430michal   declaration.Interpolate = interpolate;
137dcf8543ab375dd9c128d1ca772b1e587cebbdc7cMichal Krol   declaration.Dimension = dimension;
138b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michal   declaration.Semantic = semantic;
1394de360e67d83cd6503fb8ad053bb8afe507db5faBrian Paul   declaration.Invariant = invariant;
1402644952bd4dfa3b75112dee8dfd287a12d770705Francisco Jerez   declaration.Local = local;
141ffe58739da9eee2e99682747cc8f26e412c87430michal
142ffe58739da9eee2e99682747cc8f26e412c87430michal   header_bodysize_grow( header );
143ffe58739da9eee2e99682747cc8f26e412c87430michal
144ffe58739da9eee2e99682747cc8f26e412c87430michal   return declaration;
145ffe58739da9eee2e99682747cc8f26e412c87430michal}
146ffe58739da9eee2e99682747cc8f26e412c87430michal
147420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krolstatic struct tgsi_declaration_range
148420400f67fce15512a8fcab770dde83a3eacc5ccMichal Kroltgsi_default_declaration_range( void )
149420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol{
150420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   struct tgsi_declaration_range dr;
151420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
152420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   dr.First = 0;
153420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   dr.Last = 0;
154420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
155420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   return dr;
156420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol}
157420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
158420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krolstatic struct tgsi_declaration_range
159420400f67fce15512a8fcab770dde83a3eacc5ccMichal Kroltgsi_build_declaration_range(
160420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   unsigned first,
161420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   unsigned last,
162ffe58739da9eee2e99682747cc8f26e412c87430michal   struct tgsi_declaration *declaration,
163ffe58739da9eee2e99682747cc8f26e412c87430michal   struct tgsi_header *header )
164ffe58739da9eee2e99682747cc8f26e412c87430michal{
165420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   struct tgsi_declaration_range declaration_range;
166ffe58739da9eee2e99682747cc8f26e412c87430michal
167420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   assert( last >= first );
168420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   assert( last <= 0xFFFF );
169ffe58739da9eee2e99682747cc8f26e412c87430michal
170420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   declaration_range.First = first;
171420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   declaration_range.Last = last;
172420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
173420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   declaration_grow( declaration, header );
174420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
175420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   return declaration_range;
176420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol}
177420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
178420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krolstatic struct tgsi_declaration_dimension
179420400f67fce15512a8fcab770dde83a3eacc5ccMichal Kroltgsi_build_declaration_dimension(unsigned index_2d,
180420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol                                 struct tgsi_declaration *declaration,
181420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol                                 struct tgsi_header *header)
182420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol{
183420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   struct tgsi_declaration_dimension dd;
184420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
185420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   assert(index_2d <= 0xFFFF);
186420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
187420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   dd.Index2D = index_2d;
188420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   dd.Padding = 0;
189420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
190420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   declaration_grow(declaration, header);
191420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
192420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   return dd;
193420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol}
194420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
1951279923d72942ee201fcc6ad40d552143f651f03Francisco Jerezstatic struct tgsi_declaration_interp
1961279923d72942ee201fcc6ad40d552143f651f03Francisco Jereztgsi_default_declaration_interp( void )
1971279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez{
1981279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez   struct tgsi_declaration_interp di;
1991279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez
2001279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez   di.Interpolate = TGSI_INTERPOLATE_CONSTANT;
2011279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez   di.Centroid = 0;
2021279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez   di.CylindricalWrap = 0;
2030f6a3a7de3b56a383061635016cdb10f0229bf02Vinson Lee   di.Padding = 0;
2041279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez
2051279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez   return di;
2061279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez}
2071279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez
2081279923d72942ee201fcc6ad40d552143f651f03Francisco Jerezstatic struct tgsi_declaration_interp
2091279923d72942ee201fcc6ad40d552143f651f03Francisco Jereztgsi_build_declaration_interp(unsigned interpolate,
2101279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez                              unsigned centroid,
2111279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez                              unsigned cylindrical_wrap,
2121279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez                              struct tgsi_declaration *declaration,
2131279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez                              struct tgsi_header *header)
2141279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez{
2151279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez   struct tgsi_declaration_interp di;
2161279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez
2171279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez   di.Interpolate = interpolate;
2181279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez   di.Centroid = centroid;
2191279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez   di.CylindricalWrap = cylindrical_wrap;
2200f6a3a7de3b56a383061635016cdb10f0229bf02Vinson Lee   di.Padding = 0;
2211279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez
2221279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez   declaration_grow(declaration, header);
2231279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez
2241279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez   return di;
2251279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez}
2261279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez
227420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krolstatic struct tgsi_declaration_semantic
228420400f67fce15512a8fcab770dde83a3eacc5ccMichal Kroltgsi_default_declaration_semantic( void )
229420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol{
230420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   struct tgsi_declaration_semantic ds;
231420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
232420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   ds.Name = TGSI_SEMANTIC_POSITION;
233420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   ds.Index = 0;
234420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   ds.Padding = 0;
235420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
236420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   return ds;
237420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol}
238420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
239420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krolstatic struct tgsi_declaration_semantic
240420400f67fce15512a8fcab770dde83a3eacc5ccMichal Kroltgsi_build_declaration_semantic(
241420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   unsigned semantic_name,
242420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   unsigned semantic_index,
243420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   struct tgsi_declaration *declaration,
244420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   struct tgsi_header *header )
245420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol{
246420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   struct tgsi_declaration_semantic ds;
247420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
248420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   assert( semantic_name <= TGSI_SEMANTIC_COUNT );
249420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   assert( semantic_index <= 0xFFFF );
250420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
251420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   ds.Name = semantic_name;
252420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   ds.Index = semantic_index;
253420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   ds.Padding = 0;
254420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
255420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   declaration_grow( declaration, header );
256420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
257420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   return ds;
258ffe58739da9eee2e99682747cc8f26e412c87430michal}
259ffe58739da9eee2e99682747cc8f26e412c87430michal
260bdbe77f9c6f06cfaa155f27c2ade3c523d7fbea7Zack Rusinstatic struct tgsi_declaration_resource
261bdbe77f9c6f06cfaa155f27c2ade3c523d7fbea7Zack Rusintgsi_default_declaration_resource(void)
262bdbe77f9c6f06cfaa155f27c2ade3c523d7fbea7Zack Rusin{
263a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez   struct tgsi_declaration_resource dr;
264bdbe77f9c6f06cfaa155f27c2ade3c523d7fbea7Zack Rusin
26596956dc5076fc03b9290368ca90e3f3b870ee613José Fonseca   dr.Resource = TGSI_TEXTURE_BUFFER;
26682c90b2da8e236bc134cb2bd0ec4e09551b12164Francisco Jerez   dr.Raw = 0;
267b8e808f1ef9462af8545999df514fddbbff34345Francisco Jerez   dr.Writable = 0;
2680f6a3a7de3b56a383061635016cdb10f0229bf02Vinson Lee   dr.Padding = 0;
269bdbe77f9c6f06cfaa155f27c2ade3c523d7fbea7Zack Rusin
270a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez   return dr;
271bdbe77f9c6f06cfaa155f27c2ade3c523d7fbea7Zack Rusin}
272bdbe77f9c6f06cfaa155f27c2ade3c523d7fbea7Zack Rusin
273bdbe77f9c6f06cfaa155f27c2ade3c523d7fbea7Zack Rusinstatic struct tgsi_declaration_resource
274bdbe77f9c6f06cfaa155f27c2ade3c523d7fbea7Zack Rusintgsi_build_declaration_resource(unsigned texture,
27582c90b2da8e236bc134cb2bd0ec4e09551b12164Francisco Jerez                                unsigned raw,
276b8e808f1ef9462af8545999df514fddbbff34345Francisco Jerez                                unsigned writable,
277bdbe77f9c6f06cfaa155f27c2ade3c523d7fbea7Zack Rusin                                struct tgsi_declaration *declaration,
278bdbe77f9c6f06cfaa155f27c2ade3c523d7fbea7Zack Rusin                                struct tgsi_header *header)
279bdbe77f9c6f06cfaa155f27c2ade3c523d7fbea7Zack Rusin{
280a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez   struct tgsi_declaration_resource dr;
281a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez
282a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez   dr = tgsi_default_declaration_resource();
283a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez   dr.Resource = texture;
28482c90b2da8e236bc134cb2bd0ec4e09551b12164Francisco Jerez   dr.Raw = raw;
285b8e808f1ef9462af8545999df514fddbbff34345Francisco Jerez   dr.Writable = writable;
286a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez
287a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez   declaration_grow(declaration, header);
288a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez
289a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez   return dr;
290a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez}
291a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez
292a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerezstatic struct tgsi_declaration_sampler_view
293a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jereztgsi_default_declaration_sampler_view(void)
294a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez{
295a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez   struct tgsi_declaration_sampler_view dsv;
296a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez
29796956dc5076fc03b9290368ca90e3f3b870ee613José Fonseca   dsv.Resource = TGSI_TEXTURE_BUFFER;
298a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez   dsv.ReturnTypeX = PIPE_TYPE_UNORM;
299a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez   dsv.ReturnTypeY = PIPE_TYPE_UNORM;
300a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez   dsv.ReturnTypeZ = PIPE_TYPE_UNORM;
301a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez   dsv.ReturnTypeW = PIPE_TYPE_UNORM;
302a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez
303a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez   return dsv;
304a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez}
305a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez
306a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerezstatic struct tgsi_declaration_sampler_view
307a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jereztgsi_build_declaration_sampler_view(unsigned texture,
308a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez                                    unsigned return_type_x,
309a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez                                    unsigned return_type_y,
310a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez                                    unsigned return_type_z,
311a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez                                    unsigned return_type_w,
312a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez                                    struct tgsi_declaration *declaration,
313a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez                                    struct tgsi_header *header)
314a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez{
315a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez   struct tgsi_declaration_sampler_view dsv;
316bdbe77f9c6f06cfaa155f27c2ade3c523d7fbea7Zack Rusin
317a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez   dsv = tgsi_default_declaration_sampler_view();
318a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez   dsv.Resource = texture;
319a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez   dsv.ReturnTypeX = return_type_x;
320a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez   dsv.ReturnTypeY = return_type_y;
321a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez   dsv.ReturnTypeZ = return_type_z;
322a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez   dsv.ReturnTypeW = return_type_w;
323bdbe77f9c6f06cfaa155f27c2ade3c523d7fbea7Zack Rusin
324bdbe77f9c6f06cfaa155f27c2ade3c523d7fbea7Zack Rusin   declaration_grow(declaration, header);
325bdbe77f9c6f06cfaa155f27c2ade3c523d7fbea7Zack Rusin
326a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez   return dsv;
327bdbe77f9c6f06cfaa155f27c2ade3c523d7fbea7Zack Rusin}
328bdbe77f9c6f06cfaa155f27c2ade3c523d7fbea7Zack Rusin
329bdbe77f9c6f06cfaa155f27c2ade3c523d7fbea7Zack Rusin
330ffe58739da9eee2e99682747cc8f26e412c87430michalstruct tgsi_full_declaration
331ffe58739da9eee2e99682747cc8f26e412c87430michaltgsi_default_full_declaration( void )
332ffe58739da9eee2e99682747cc8f26e412c87430michal{
333ffe58739da9eee2e99682747cc8f26e412c87430michal   struct tgsi_full_declaration  full_declaration;
334ffe58739da9eee2e99682747cc8f26e412c87430michal
335ffe58739da9eee2e99682747cc8f26e412c87430michal   full_declaration.Declaration  = tgsi_default_declaration();
336fe2b31e4a896167a33d267822b36eb2de0ceecbaKeith Whitwell   full_declaration.Range = tgsi_default_declaration_range();
337b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michal   full_declaration.Semantic = tgsi_default_declaration_semantic();
3381279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez   full_declaration.Interp = tgsi_default_declaration_interp();
3392b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin   full_declaration.ImmediateData.u = NULL;
340bdbe77f9c6f06cfaa155f27c2ade3c523d7fbea7Zack Rusin   full_declaration.Resource = tgsi_default_declaration_resource();
341a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez   full_declaration.SamplerView = tgsi_default_declaration_sampler_view();
342ffe58739da9eee2e99682747cc8f26e412c87430michal
343ffe58739da9eee2e99682747cc8f26e412c87430michal   return full_declaration;
344ffe58739da9eee2e99682747cc8f26e412c87430michal}
345ffe58739da9eee2e99682747cc8f26e412c87430michal
346b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michalunsigned
347ffe58739da9eee2e99682747cc8f26e412c87430michaltgsi_build_full_declaration(
348b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michal   const struct tgsi_full_declaration *full_decl,
349ffe58739da9eee2e99682747cc8f26e412c87430michal   struct tgsi_token *tokens,
350ffe58739da9eee2e99682747cc8f26e412c87430michal   struct tgsi_header *header,
351b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michal   unsigned maxsize )
352ffe58739da9eee2e99682747cc8f26e412c87430michal{
353b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michal   unsigned size = 0;
354ffe58739da9eee2e99682747cc8f26e412c87430michal   struct tgsi_declaration *declaration;
355a49381587f73c67469ec7546419cfc41387f938cMichal Krol   struct tgsi_declaration_range *dr;
356ffe58739da9eee2e99682747cc8f26e412c87430michal
357ffe58739da9eee2e99682747cc8f26e412c87430michal   if( maxsize <= size )
3582b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin      return 0;
359ffe58739da9eee2e99682747cc8f26e412c87430michal   declaration = (struct tgsi_declaration *) &tokens[size];
360ffe58739da9eee2e99682747cc8f26e412c87430michal   size++;
361ffe58739da9eee2e99682747cc8f26e412c87430michal
362ffe58739da9eee2e99682747cc8f26e412c87430michal   *declaration = tgsi_build_declaration(
363ffe58739da9eee2e99682747cc8f26e412c87430michal      full_decl->Declaration.File,
364058b978a5ae2a56e09fed6335b686c654444f4acmichal      full_decl->Declaration.UsageMask,
365ffe58739da9eee2e99682747cc8f26e412c87430michal      full_decl->Declaration.Interpolate,
366dcf8543ab375dd9c128d1ca772b1e587cebbdc7cMichal Krol      full_decl->Declaration.Dimension,
367b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michal      full_decl->Declaration.Semantic,
3684de360e67d83cd6503fb8ad053bb8afe507db5faBrian Paul      full_decl->Declaration.Invariant,
3692644952bd4dfa3b75112dee8dfd287a12d770705Francisco Jerez      full_decl->Declaration.Local,
370ffe58739da9eee2e99682747cc8f26e412c87430michal      header );
371ffe58739da9eee2e99682747cc8f26e412c87430michal
372a49381587f73c67469ec7546419cfc41387f938cMichal Krol   if (maxsize <= size)
373a49381587f73c67469ec7546419cfc41387f938cMichal Krol      return 0;
374a49381587f73c67469ec7546419cfc41387f938cMichal Krol   dr = (struct tgsi_declaration_range *) &tokens[size];
375a49381587f73c67469ec7546419cfc41387f938cMichal Krol   size++;
376ffe58739da9eee2e99682747cc8f26e412c87430michal
377a49381587f73c67469ec7546419cfc41387f938cMichal Krol   *dr = tgsi_build_declaration_range(
378fe2b31e4a896167a33d267822b36eb2de0ceecbaKeith Whitwell      full_decl->Range.First,
379fe2b31e4a896167a33d267822b36eb2de0ceecbaKeith Whitwell      full_decl->Range.Last,
380a49381587f73c67469ec7546419cfc41387f938cMichal Krol      declaration,
381a49381587f73c67469ec7546419cfc41387f938cMichal Krol      header );
382ffe58739da9eee2e99682747cc8f26e412c87430michal
383dcf8543ab375dd9c128d1ca772b1e587cebbdc7cMichal Krol   if (full_decl->Declaration.Dimension) {
384dcf8543ab375dd9c128d1ca772b1e587cebbdc7cMichal Krol      struct tgsi_declaration_dimension *dd;
385dcf8543ab375dd9c128d1ca772b1e587cebbdc7cMichal Krol
386dcf8543ab375dd9c128d1ca772b1e587cebbdc7cMichal Krol      if (maxsize <= size) {
387dcf8543ab375dd9c128d1ca772b1e587cebbdc7cMichal Krol         return 0;
388dcf8543ab375dd9c128d1ca772b1e587cebbdc7cMichal Krol      }
389dcf8543ab375dd9c128d1ca772b1e587cebbdc7cMichal Krol      dd = (struct tgsi_declaration_dimension *)&tokens[size];
390dcf8543ab375dd9c128d1ca772b1e587cebbdc7cMichal Krol      size++;
391dcf8543ab375dd9c128d1ca772b1e587cebbdc7cMichal Krol
392dcf8543ab375dd9c128d1ca772b1e587cebbdc7cMichal Krol      *dd = tgsi_build_declaration_dimension(full_decl->Dim.Index2D,
393dcf8543ab375dd9c128d1ca772b1e587cebbdc7cMichal Krol                                             declaration,
394dcf8543ab375dd9c128d1ca772b1e587cebbdc7cMichal Krol                                             header);
395dcf8543ab375dd9c128d1ca772b1e587cebbdc7cMichal Krol   }
396dcf8543ab375dd9c128d1ca772b1e587cebbdc7cMichal Krol
3971279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez   if (full_decl->Declaration.Interpolate) {
3981279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez      struct tgsi_declaration_interp *di;
3991279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez
4001279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez      if (maxsize <= size) {
4011279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez         return 0;
4021279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez      }
4031279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez      di = (struct tgsi_declaration_interp *)&tokens[size];
4041279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez      size++;
4051279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez
4061279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez      *di = tgsi_build_declaration_interp(full_decl->Interp.Interpolate,
4071279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez                                          full_decl->Interp.Centroid,
4081279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez                                          full_decl->Interp.CylindricalWrap,
4091279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez                                          declaration,
4101279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez                                          header);
4111279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez   }
4121279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez
413b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michal   if( full_decl->Declaration.Semantic ) {
414b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michal      struct tgsi_declaration_semantic *ds;
415b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michal
416b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michal      if( maxsize <= size )
417b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michal         return  0;
418b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michal      ds = (struct tgsi_declaration_semantic *) &tokens[size];
419b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michal      size++;
420b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michal
421b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michal      *ds = tgsi_build_declaration_semantic(
422763426a0256f0ab06f8af53947bd630f8600183aKeith Whitwell         full_decl->Semantic.Name,
423763426a0256f0ab06f8af53947bd630f8600183aKeith Whitwell         full_decl->Semantic.Index,
424b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michal         declaration,
425b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michal         header );
426b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michal   }
427b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michal
4282b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin   if (full_decl->Declaration.File == TGSI_FILE_IMMEDIATE_ARRAY) {
4292b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin      unsigned i, j;
4302b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin      union tgsi_immediate_data *data;
4312b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin
4322b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin      for (i = 0; i <= dr->Last; ++i) {
4332b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin         for (j = 0; j < 4; ++j) {
4342b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin            unsigned idx = i*4 + j;
4352b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin            if (maxsize <= size)
4362b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin               return 0;
4372b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin            data = (union tgsi_immediate_data *) &tokens[size];
4382b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin            ++size;
4392b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin
4402b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin            *data = full_decl->ImmediateData.u[idx];
4412b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin            declaration_grow( declaration, header );
4422b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin         }
4432b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin      }
4442b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin   }
4452b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin
446bdbe77f9c6f06cfaa155f27c2ade3c523d7fbea7Zack Rusin   if (full_decl->Declaration.File == TGSI_FILE_RESOURCE) {
447bdbe77f9c6f06cfaa155f27c2ade3c523d7fbea7Zack Rusin      struct tgsi_declaration_resource *dr;
448bdbe77f9c6f06cfaa155f27c2ade3c523d7fbea7Zack Rusin
449bdbe77f9c6f06cfaa155f27c2ade3c523d7fbea7Zack Rusin      if (maxsize <= size) {
450bdbe77f9c6f06cfaa155f27c2ade3c523d7fbea7Zack Rusin         return  0;
451bdbe77f9c6f06cfaa155f27c2ade3c523d7fbea7Zack Rusin      }
452bdbe77f9c6f06cfaa155f27c2ade3c523d7fbea7Zack Rusin      dr = (struct tgsi_declaration_resource *)&tokens[size];
453bdbe77f9c6f06cfaa155f27c2ade3c523d7fbea7Zack Rusin      size++;
454bdbe77f9c6f06cfaa155f27c2ade3c523d7fbea7Zack Rusin
455bdbe77f9c6f06cfaa155f27c2ade3c523d7fbea7Zack Rusin      *dr = tgsi_build_declaration_resource(full_decl->Resource.Resource,
45682c90b2da8e236bc134cb2bd0ec4e09551b12164Francisco Jerez                                            full_decl->Resource.Raw,
457b8e808f1ef9462af8545999df514fddbbff34345Francisco Jerez                                            full_decl->Resource.Writable,
458bdbe77f9c6f06cfaa155f27c2ade3c523d7fbea7Zack Rusin                                            declaration,
459bdbe77f9c6f06cfaa155f27c2ade3c523d7fbea7Zack Rusin                                            header);
460bdbe77f9c6f06cfaa155f27c2ade3c523d7fbea7Zack Rusin   }
461bdbe77f9c6f06cfaa155f27c2ade3c523d7fbea7Zack Rusin
462a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez   if (full_decl->Declaration.File == TGSI_FILE_SAMPLER_VIEW) {
463a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez      struct tgsi_declaration_sampler_view *dsv;
464a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez
465a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez      if (maxsize <= size) {
466a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez         return  0;
467a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez      }
468a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez      dsv = (struct tgsi_declaration_sampler_view *)&tokens[size];
469a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez      size++;
470a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez
471a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez      *dsv = tgsi_build_declaration_sampler_view(
472a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez         full_decl->SamplerView.Resource,
473a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez         full_decl->SamplerView.ReturnTypeX,
474a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez         full_decl->SamplerView.ReturnTypeY,
475a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez         full_decl->SamplerView.ReturnTypeZ,
476a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez         full_decl->SamplerView.ReturnTypeW,
477a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez         declaration,
478a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez         header);
479a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez   }
480a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez
481ffe58739da9eee2e99682747cc8f26e412c87430michal   return size;
482ffe58739da9eee2e99682747cc8f26e412c87430michal}
483ffe58739da9eee2e99682747cc8f26e412c87430michal
484ffe58739da9eee2e99682747cc8f26e412c87430michal/*
485ffe58739da9eee2e99682747cc8f26e412c87430michal * immediate
486ffe58739da9eee2e99682747cc8f26e412c87430michal */
487ffe58739da9eee2e99682747cc8f26e412c87430michal
488420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krolstatic struct tgsi_immediate
489ffe58739da9eee2e99682747cc8f26e412c87430michaltgsi_default_immediate( void )
490ffe58739da9eee2e99682747cc8f26e412c87430michal{
491ffe58739da9eee2e99682747cc8f26e412c87430michal   struct tgsi_immediate immediate;
492ffe58739da9eee2e99682747cc8f26e412c87430michal
493ffe58739da9eee2e99682747cc8f26e412c87430michal   immediate.Type = TGSI_TOKEN_TYPE_IMMEDIATE;
4945ecd0b0890fd48656e46c017830a9f5d6b906aaeMichal Krol   immediate.NrTokens = 1;
495ffe58739da9eee2e99682747cc8f26e412c87430michal   immediate.DataType = TGSI_IMM_FLOAT32;
496ffe58739da9eee2e99682747cc8f26e412c87430michal   immediate.Padding = 0;
497ffe58739da9eee2e99682747cc8f26e412c87430michal
498ffe58739da9eee2e99682747cc8f26e412c87430michal   return immediate;
499ffe58739da9eee2e99682747cc8f26e412c87430michal}
500ffe58739da9eee2e99682747cc8f26e412c87430michal
501420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krolstatic struct tgsi_immediate
502ffe58739da9eee2e99682747cc8f26e412c87430michaltgsi_build_immediate(
503e9072863b18e4a8cf78e72bf25abbb433de1b486Francisco Jerez   struct tgsi_header *header,
504e9072863b18e4a8cf78e72bf25abbb433de1b486Francisco Jerez   unsigned type )
505ffe58739da9eee2e99682747cc8f26e412c87430michal{
506ffe58739da9eee2e99682747cc8f26e412c87430michal   struct tgsi_immediate immediate;
507ffe58739da9eee2e99682747cc8f26e412c87430michal
508ffe58739da9eee2e99682747cc8f26e412c87430michal   immediate = tgsi_default_immediate();
509e9072863b18e4a8cf78e72bf25abbb433de1b486Francisco Jerez   immediate.DataType = type;
510ffe58739da9eee2e99682747cc8f26e412c87430michal
511271f9dac79a9247de9a57f4d248e404bf1652a13José Fonseca   header_bodysize_grow( header );
512ffe58739da9eee2e99682747cc8f26e412c87430michal
513ffe58739da9eee2e99682747cc8f26e412c87430michal   return immediate;
514ffe58739da9eee2e99682747cc8f26e412c87430michal}
515ffe58739da9eee2e99682747cc8f26e412c87430michal
516ffe58739da9eee2e99682747cc8f26e412c87430michalstruct tgsi_full_immediate
517ffe58739da9eee2e99682747cc8f26e412c87430michaltgsi_default_full_immediate( void )
518ffe58739da9eee2e99682747cc8f26e412c87430michal{
519ffe58739da9eee2e99682747cc8f26e412c87430michal   struct tgsi_full_immediate fullimm;
520ffe58739da9eee2e99682747cc8f26e412c87430michal
521ffe58739da9eee2e99682747cc8f26e412c87430michal   fullimm.Immediate = tgsi_default_immediate();
522fd31f92cea0ce8613a22d8f4b3c75b340bcc5689Keith Whitwell   fullimm.u[0].Float = 0.0f;
523fd31f92cea0ce8613a22d8f4b3c75b340bcc5689Keith Whitwell   fullimm.u[1].Float = 0.0f;
524fd31f92cea0ce8613a22d8f4b3c75b340bcc5689Keith Whitwell   fullimm.u[2].Float = 0.0f;
525fd31f92cea0ce8613a22d8f4b3c75b340bcc5689Keith Whitwell   fullimm.u[3].Float = 0.0f;
526ffe58739da9eee2e99682747cc8f26e412c87430michal
527ffe58739da9eee2e99682747cc8f26e412c87430michal   return fullimm;
528ffe58739da9eee2e99682747cc8f26e412c87430michal}
529ffe58739da9eee2e99682747cc8f26e412c87430michal
530ffe58739da9eee2e99682747cc8f26e412c87430michalstatic void
531ffe58739da9eee2e99682747cc8f26e412c87430michalimmediate_grow(
532ffe58739da9eee2e99682747cc8f26e412c87430michal   struct tgsi_immediate *immediate,
533ffe58739da9eee2e99682747cc8f26e412c87430michal   struct tgsi_header *header )
534ffe58739da9eee2e99682747cc8f26e412c87430michal{
5355ecd0b0890fd48656e46c017830a9f5d6b906aaeMichal Krol   assert( immediate->NrTokens < 0xFF );
536ffe58739da9eee2e99682747cc8f26e412c87430michal
5375ecd0b0890fd48656e46c017830a9f5d6b906aaeMichal Krol   immediate->NrTokens++;
538ffe58739da9eee2e99682747cc8f26e412c87430michal
539ffe58739da9eee2e99682747cc8f26e412c87430michal   header_bodysize_grow( header );
540ffe58739da9eee2e99682747cc8f26e412c87430michal}
541ffe58739da9eee2e99682747cc8f26e412c87430michal
542529c411e4095eeb9be501a6fe657a3a196c3e448michalunsigned
543ffe58739da9eee2e99682747cc8f26e412c87430michaltgsi_build_full_immediate(
544ffe58739da9eee2e99682747cc8f26e412c87430michal   const struct tgsi_full_immediate *full_imm,
545ffe58739da9eee2e99682747cc8f26e412c87430michal   struct tgsi_token *tokens,
546ffe58739da9eee2e99682747cc8f26e412c87430michal   struct tgsi_header *header,
547529c411e4095eeb9be501a6fe657a3a196c3e448michal   unsigned maxsize )
548ffe58739da9eee2e99682747cc8f26e412c87430michal{
549271f9dac79a9247de9a57f4d248e404bf1652a13José Fonseca   unsigned size = 0, i;
550ffe58739da9eee2e99682747cc8f26e412c87430michal   struct tgsi_immediate *immediate;
551ffe58739da9eee2e99682747cc8f26e412c87430michal
552ffe58739da9eee2e99682747cc8f26e412c87430michal   if( maxsize <= size )
553ffe58739da9eee2e99682747cc8f26e412c87430michal      return 0;
554ffe58739da9eee2e99682747cc8f26e412c87430michal   immediate = (struct tgsi_immediate *) &tokens[size];
555ffe58739da9eee2e99682747cc8f26e412c87430michal   size++;
556ffe58739da9eee2e99682747cc8f26e412c87430michal
557e9072863b18e4a8cf78e72bf25abbb433de1b486Francisco Jerez   *immediate = tgsi_build_immediate( header, full_imm->Immediate.DataType );
558ffe58739da9eee2e99682747cc8f26e412c87430michal
559fd31f92cea0ce8613a22d8f4b3c75b340bcc5689Keith Whitwell   assert( full_imm->Immediate.NrTokens <= 4 + 1 );
560fd31f92cea0ce8613a22d8f4b3c75b340bcc5689Keith Whitwell
5615ecd0b0890fd48656e46c017830a9f5d6b906aaeMichal Krol   for( i = 0; i < full_imm->Immediate.NrTokens - 1; i++ ) {
562fd31f92cea0ce8613a22d8f4b3c75b340bcc5689Keith Whitwell      union tgsi_immediate_data *data;
563ffe58739da9eee2e99682747cc8f26e412c87430michal
564ffe58739da9eee2e99682747cc8f26e412c87430michal      if( maxsize <= size )
565ffe58739da9eee2e99682747cc8f26e412c87430michal         return  0;
566e9072863b18e4a8cf78e72bf25abbb433de1b486Francisco Jerez
567fd31f92cea0ce8613a22d8f4b3c75b340bcc5689Keith Whitwell      data = (union tgsi_immediate_data *) &tokens[size];
568e9072863b18e4a8cf78e72bf25abbb433de1b486Francisco Jerez      *data = full_imm->u[i];
569ffe58739da9eee2e99682747cc8f26e412c87430michal
570e9072863b18e4a8cf78e72bf25abbb433de1b486Francisco Jerez      immediate_grow( immediate, header );
571e9072863b18e4a8cf78e72bf25abbb433de1b486Francisco Jerez      size++;
572ffe58739da9eee2e99682747cc8f26e412c87430michal   }
573ffe58739da9eee2e99682747cc8f26e412c87430michal
574ffe58739da9eee2e99682747cc8f26e412c87430michal   return size;
575ffe58739da9eee2e99682747cc8f26e412c87430michal}
576ffe58739da9eee2e99682747cc8f26e412c87430michal
577ffe58739da9eee2e99682747cc8f26e412c87430michal/*
578ffe58739da9eee2e99682747cc8f26e412c87430michal * instruction
579ffe58739da9eee2e99682747cc8f26e412c87430michal */
580ffe58739da9eee2e99682747cc8f26e412c87430michal
581ffe58739da9eee2e99682747cc8f26e412c87430michalstruct tgsi_instruction
582ffe58739da9eee2e99682747cc8f26e412c87430michaltgsi_default_instruction( void )
583ffe58739da9eee2e99682747cc8f26e412c87430michal{
584ffe58739da9eee2e99682747cc8f26e412c87430michal   struct tgsi_instruction instruction;
585ffe58739da9eee2e99682747cc8f26e412c87430michal
586ffe58739da9eee2e99682747cc8f26e412c87430michal   instruction.Type = TGSI_TOKEN_TYPE_INSTRUCTION;
587bc7567d9665924650c43c661d07ae9a922554beeBrian Paul   instruction.NrTokens = 0;
588ffe58739da9eee2e99682747cc8f26e412c87430michal   instruction.Opcode = TGSI_OPCODE_MOV;
589ffe58739da9eee2e99682747cc8f26e412c87430michal   instruction.Saturate = TGSI_SAT_NONE;
5905ee0d9f632383339088cc33005b7794b0915d4e0Michal Krol   instruction.Predicate = 0;
591ffe58739da9eee2e99682747cc8f26e412c87430michal   instruction.NumDstRegs = 1;
592ffe58739da9eee2e99682747cc8f26e412c87430michal   instruction.NumSrcRegs = 1;
593ba1ca28cc62fed71c77902b95ae4ed36c6bf25f8Keith Whitwell   instruction.Label = 0;
594ba1ca28cc62fed71c77902b95ae4ed36c6bf25f8Keith Whitwell   instruction.Texture = 0;
595ffe58739da9eee2e99682747cc8f26e412c87430michal   instruction.Padding  = 0;
596ffe58739da9eee2e99682747cc8f26e412c87430michal
597ffe58739da9eee2e99682747cc8f26e412c87430michal   return instruction;
598ffe58739da9eee2e99682747cc8f26e412c87430michal}
599ffe58739da9eee2e99682747cc8f26e412c87430michal
600420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krolstatic struct tgsi_instruction
6015ee0d9f632383339088cc33005b7794b0915d4e0Michal Kroltgsi_build_instruction(unsigned opcode,
6025ee0d9f632383339088cc33005b7794b0915d4e0Michal Krol                       unsigned saturate,
6035ee0d9f632383339088cc33005b7794b0915d4e0Michal Krol                       unsigned predicate,
6045ee0d9f632383339088cc33005b7794b0915d4e0Michal Krol                       unsigned num_dst_regs,
6055ee0d9f632383339088cc33005b7794b0915d4e0Michal Krol                       unsigned num_src_regs,
6065ee0d9f632383339088cc33005b7794b0915d4e0Michal Krol                       struct tgsi_header *header)
607ffe58739da9eee2e99682747cc8f26e412c87430michal{
608ffe58739da9eee2e99682747cc8f26e412c87430michal   struct tgsi_instruction instruction;
609ffe58739da9eee2e99682747cc8f26e412c87430michal
610ffe58739da9eee2e99682747cc8f26e412c87430michal   assert (opcode <= TGSI_OPCODE_LAST);
611ffe58739da9eee2e99682747cc8f26e412c87430michal   assert (saturate <= TGSI_SAT_MINUS_PLUS_ONE);
612ffe58739da9eee2e99682747cc8f26e412c87430michal   assert (num_dst_regs <= 3);
613ffe58739da9eee2e99682747cc8f26e412c87430michal   assert (num_src_regs <= 15);
614ffe58739da9eee2e99682747cc8f26e412c87430michal
615ffe58739da9eee2e99682747cc8f26e412c87430michal   instruction = tgsi_default_instruction();
616ffe58739da9eee2e99682747cc8f26e412c87430michal   instruction.Opcode = opcode;
617ffe58739da9eee2e99682747cc8f26e412c87430michal   instruction.Saturate = saturate;
6185ee0d9f632383339088cc33005b7794b0915d4e0Michal Krol   instruction.Predicate = predicate;
619ffe58739da9eee2e99682747cc8f26e412c87430michal   instruction.NumDstRegs = num_dst_regs;
620ffe58739da9eee2e99682747cc8f26e412c87430michal   instruction.NumSrcRegs = num_src_regs;
621ffe58739da9eee2e99682747cc8f26e412c87430michal
622ffe58739da9eee2e99682747cc8f26e412c87430michal   header_bodysize_grow( header );
623ffe58739da9eee2e99682747cc8f26e412c87430michal
624ffe58739da9eee2e99682747cc8f26e412c87430michal   return instruction;
625ffe58739da9eee2e99682747cc8f26e412c87430michal}
626ffe58739da9eee2e99682747cc8f26e412c87430michal
627ffe58739da9eee2e99682747cc8f26e412c87430michalstatic void
628ffe58739da9eee2e99682747cc8f26e412c87430michalinstruction_grow(
629ffe58739da9eee2e99682747cc8f26e412c87430michal   struct tgsi_instruction *instruction,
630ffe58739da9eee2e99682747cc8f26e412c87430michal   struct tgsi_header *header )
631ffe58739da9eee2e99682747cc8f26e412c87430michal{
6325ecd0b0890fd48656e46c017830a9f5d6b906aaeMichal Krol   assert (instruction->NrTokens <   0xFF);
633ffe58739da9eee2e99682747cc8f26e412c87430michal
6345ecd0b0890fd48656e46c017830a9f5d6b906aaeMichal Krol   instruction->NrTokens++;
635ffe58739da9eee2e99682747cc8f26e412c87430michal
636ffe58739da9eee2e99682747cc8f26e412c87430michal   header_bodysize_grow( header );
637ffe58739da9eee2e99682747cc8f26e412c87430michal}
638ffe58739da9eee2e99682747cc8f26e412c87430michal
639420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krolstruct tgsi_instruction_predicate
640420400f67fce15512a8fcab770dde83a3eacc5ccMichal Kroltgsi_default_instruction_predicate(void)
641ffe58739da9eee2e99682747cc8f26e412c87430michal{
642420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   struct tgsi_instruction_predicate instruction_predicate;
643ffe58739da9eee2e99682747cc8f26e412c87430michal
644420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   instruction_predicate.SwizzleX = TGSI_SWIZZLE_X;
645420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   instruction_predicate.SwizzleY = TGSI_SWIZZLE_Y;
646420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   instruction_predicate.SwizzleZ = TGSI_SWIZZLE_Z;
647420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   instruction_predicate.SwizzleW = TGSI_SWIZZLE_W;
648420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   instruction_predicate.Negate = 0;
649420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   instruction_predicate.Index = 0;
650420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   instruction_predicate.Padding = 0;
651ffe58739da9eee2e99682747cc8f26e412c87430michal
652420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   return instruction_predicate;
653ffe58739da9eee2e99682747cc8f26e412c87430michal}
654ffe58739da9eee2e99682747cc8f26e412c87430michal
655420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krolstatic struct tgsi_instruction_predicate
656420400f67fce15512a8fcab770dde83a3eacc5ccMichal Kroltgsi_build_instruction_predicate(int index,
657420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol                                 unsigned negate,
658420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol                                 unsigned swizzleX,
659420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol                                 unsigned swizzleY,
660420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol                                 unsigned swizzleZ,
661420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol                                 unsigned swizzleW,
662420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol                                 struct tgsi_instruction *instruction,
663420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol                                 struct tgsi_header *header)
664ffe58739da9eee2e99682747cc8f26e412c87430michal{
665420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   struct tgsi_instruction_predicate instruction_predicate;
666ffe58739da9eee2e99682747cc8f26e412c87430michal
667420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   instruction_predicate = tgsi_default_instruction_predicate();
668420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   instruction_predicate.SwizzleX = swizzleX;
669420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   instruction_predicate.SwizzleY = swizzleY;
670420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   instruction_predicate.SwizzleZ = swizzleZ;
671420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   instruction_predicate.SwizzleW = swizzleW;
672420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   instruction_predicate.Negate = negate;
673420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   instruction_predicate.Index = index;
674ffe58739da9eee2e99682747cc8f26e412c87430michal
675420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   instruction_grow(instruction, header);
676ffe58739da9eee2e99682747cc8f26e412c87430michal
677420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   return instruction_predicate;
678420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol}
679420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
680420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krolstatic struct tgsi_instruction_label
681420400f67fce15512a8fcab770dde83a3eacc5ccMichal Kroltgsi_default_instruction_label( void )
682420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol{
683420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   struct tgsi_instruction_label instruction_label;
684420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
685420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   instruction_label.Label = 0;
686420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   instruction_label.Padding = 0;
687420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
688420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   return instruction_label;
689420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol}
690420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
691420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krolstatic struct tgsi_instruction_label
692420400f67fce15512a8fcab770dde83a3eacc5ccMichal Kroltgsi_build_instruction_label(
693420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   unsigned label,
694420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   struct tgsi_token  *prev_token,
695420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   struct tgsi_instruction *instruction,
696420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   struct tgsi_header *header )
697420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol{
698420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   struct tgsi_instruction_label instruction_label;
699420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
700420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   instruction_label.Label = label;
701420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   instruction_label.Padding = 0;
702420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   instruction->Label = 1;
703420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
704420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   instruction_grow( instruction, header );
705420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
706420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   return instruction_label;
707420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol}
708420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
709420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krolstatic struct tgsi_instruction_texture
710420400f67fce15512a8fcab770dde83a3eacc5ccMichal Kroltgsi_default_instruction_texture( void )
711420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol{
712420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   struct tgsi_instruction_texture instruction_texture;
713420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
714223831ca146bc3aca615542794a7c3800ccbcc6fJosé Fonseca   instruction_texture.Texture = TGSI_TEXTURE_UNKNOWN;
7152083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie   instruction_texture.NumOffsets = 0;
716420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   instruction_texture.Padding = 0;
717420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
718420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   return instruction_texture;
719420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol}
720420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
721420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krolstatic struct tgsi_instruction_texture
722420400f67fce15512a8fcab770dde83a3eacc5ccMichal Kroltgsi_build_instruction_texture(
723420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   unsigned texture,
7242083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie   unsigned num_offsets,
725420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   struct tgsi_token *prev_token,
726420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   struct tgsi_instruction *instruction,
727420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   struct tgsi_header *header )
728420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol{
729420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   struct tgsi_instruction_texture instruction_texture;
730420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
731420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   instruction_texture.Texture = texture;
7322083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie   instruction_texture.NumOffsets = num_offsets;
733420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   instruction_texture.Padding = 0;
734420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   instruction->Texture = 1;
735420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
736420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   instruction_grow( instruction, header );
737420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
738420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   return instruction_texture;
739420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol}
740420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
7412083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie
7422083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airliestatic struct tgsi_texture_offset
7432083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlietgsi_default_texture_offset( void )
7442083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie{
7452083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie   struct tgsi_texture_offset texture_offset;
7462083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie
7472083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie   texture_offset.Index = 0;
7482083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie   texture_offset.File = 0;
7492083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie   texture_offset.SwizzleX = 0;
7502083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie   texture_offset.SwizzleY = 0;
7512083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie   texture_offset.SwizzleZ = 0;
7522083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie   texture_offset.Padding = 0;
7532083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie
7542083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie   return texture_offset;
7552083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie}
7562083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie
7572083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airliestatic struct tgsi_texture_offset
7582083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlietgsi_build_texture_offset(
7592083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie   int index, int file, int swizzle_x, int swizzle_y, int swizzle_z,
7602083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie   struct tgsi_token *prev_token,
7612083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie   struct tgsi_instruction *instruction,
7622083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie   struct tgsi_header *header )
7632083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie{
7642083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie   struct tgsi_texture_offset texture_offset;
7652083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie
7662083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie   texture_offset.Index = index;
7672083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie   texture_offset.File = file;
7682083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie   texture_offset.SwizzleX = swizzle_x;
7692083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie   texture_offset.SwizzleY = swizzle_y;
7702083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie   texture_offset.SwizzleZ = swizzle_z;
7712083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie   texture_offset.Padding = 0;
7722083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie
7732083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie   instruction_grow( instruction, header );
7742083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie
7752083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie   return texture_offset;
7762083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie}
7772083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie
778420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krolstatic struct tgsi_src_register
779420400f67fce15512a8fcab770dde83a3eacc5ccMichal Kroltgsi_default_src_register( void )
780420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol{
781420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   struct tgsi_src_register src_register;
782420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
783420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   src_register.File = TGSI_FILE_NULL;
784420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   src_register.SwizzleX = TGSI_SWIZZLE_X;
785420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   src_register.SwizzleY = TGSI_SWIZZLE_Y;
786420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   src_register.SwizzleZ = TGSI_SWIZZLE_Z;
787420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   src_register.SwizzleW = TGSI_SWIZZLE_W;
788420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   src_register.Negate = 0;
789420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   src_register.Absolute = 0;
790420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   src_register.Indirect = 0;
791420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   src_register.Dimension = 0;
792420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   src_register.Index = 0;
793420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
794420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   return src_register;
795420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol}
796420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
797420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krolstatic struct tgsi_src_register
798420400f67fce15512a8fcab770dde83a3eacc5ccMichal Kroltgsi_build_src_register(
799420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   unsigned file,
800420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   unsigned swizzle_x,
801420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   unsigned swizzle_y,
802420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   unsigned swizzle_z,
803420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   unsigned swizzle_w,
804420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   unsigned negate,
805420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   unsigned absolute,
806420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   unsigned indirect,
807420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   unsigned dimension,
808420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   int index,
809420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   struct tgsi_instruction *instruction,
810420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   struct tgsi_header *header )
811420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol{
812420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   struct tgsi_src_register   src_register;
813420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
814420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   assert( file < TGSI_FILE_COUNT );
815420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   assert( swizzle_x <= TGSI_SWIZZLE_W );
816420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   assert( swizzle_y <= TGSI_SWIZZLE_W );
817420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   assert( swizzle_z <= TGSI_SWIZZLE_W );
818420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   assert( swizzle_w <= TGSI_SWIZZLE_W );
819420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   assert( negate <= 1 );
820420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   assert( index >= -0x8000 && index <= 0x7FFF );
821420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
822420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   src_register.File = file;
823420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   src_register.SwizzleX = swizzle_x;
824420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   src_register.SwizzleY = swizzle_y;
825420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   src_register.SwizzleZ = swizzle_z;
826420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   src_register.SwizzleW = swizzle_w;
827420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   src_register.Negate = negate;
828420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   src_register.Absolute = absolute;
829420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   src_register.Indirect = indirect;
830420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   src_register.Dimension = dimension;
831420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   src_register.Index = index;
832420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
833420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   instruction_grow( instruction, header );
834420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
835420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   return src_register;
836420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol}
837420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
838420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krolstatic struct tgsi_dimension
839420400f67fce15512a8fcab770dde83a3eacc5ccMichal Kroltgsi_default_dimension( void )
840420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol{
841420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   struct tgsi_dimension dimension;
842420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
843420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   dimension.Indirect = 0;
844420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   dimension.Dimension = 0;
845420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   dimension.Padding = 0;
846420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   dimension.Index = 0;
847420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
848420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   return dimension;
849420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol}
850420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
851420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krolstatic struct tgsi_full_src_register
852420400f67fce15512a8fcab770dde83a3eacc5ccMichal Kroltgsi_default_full_src_register( void )
853420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol{
854420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   struct tgsi_full_src_register full_src_register;
855420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
856420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   full_src_register.Register = tgsi_default_src_register();
857420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   full_src_register.Indirect = tgsi_default_src_register();
858420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   full_src_register.Dimension = tgsi_default_dimension();
859420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   full_src_register.DimIndirect = tgsi_default_src_register();
860420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
861420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   return full_src_register;
862420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol}
863420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
864420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krolstatic struct tgsi_dimension
865420400f67fce15512a8fcab770dde83a3eacc5ccMichal Kroltgsi_build_dimension(
866420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   unsigned indirect,
867420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   unsigned index,
868420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   struct tgsi_instruction *instruction,
869420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   struct tgsi_header *header )
870420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol{
871420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   struct tgsi_dimension dimension;
872420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
873420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   dimension.Indirect = indirect;
874420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   dimension.Dimension = 0;
875420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   dimension.Padding = 0;
876420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   dimension.Index = index;
877420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
878420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   instruction_grow( instruction, header );
879420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
880420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   return dimension;
881420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol}
882420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
883420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krolstatic struct tgsi_dst_register
884420400f67fce15512a8fcab770dde83a3eacc5ccMichal Kroltgsi_default_dst_register( void )
885420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol{
886420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   struct tgsi_dst_register dst_register;
887420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
888420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   dst_register.File = TGSI_FILE_NULL;
889420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   dst_register.WriteMask = TGSI_WRITEMASK_XYZW;
890420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   dst_register.Indirect = 0;
891420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   dst_register.Dimension = 0;
892420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   dst_register.Index = 0;
893420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   dst_register.Padding = 0;
894420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
895420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   return dst_register;
896420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol}
897420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
898420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krolstatic struct tgsi_dst_register
899420400f67fce15512a8fcab770dde83a3eacc5ccMichal Kroltgsi_build_dst_register(
900420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   unsigned file,
901420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   unsigned mask,
902420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   unsigned indirect,
903420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   unsigned dimension,
904420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   int index,
905420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   struct tgsi_instruction *instruction,
906420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   struct tgsi_header *header )
907420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol{
908420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   struct tgsi_dst_register dst_register;
909420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
910420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   assert( file < TGSI_FILE_COUNT );
911420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   assert( mask <= TGSI_WRITEMASK_XYZW );
912420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   assert( index >= -32768 && index <= 32767 );
913420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
914420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   dst_register.File = file;
915420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   dst_register.WriteMask = mask;
916420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   dst_register.Indirect = indirect;
917420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   dst_register.Dimension = dimension;
918420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   dst_register.Index = index;
919420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   dst_register.Padding = 0;
920420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
921420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   instruction_grow( instruction, header );
922420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
923420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   return dst_register;
924420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol}
925420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
926420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krolstatic struct tgsi_full_dst_register
927420400f67fce15512a8fcab770dde83a3eacc5ccMichal Kroltgsi_default_full_dst_register( void )
928420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol{
929420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   struct tgsi_full_dst_register full_dst_register;
930420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
931420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   full_dst_register.Register = tgsi_default_dst_register();
932420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   full_dst_register.Indirect = tgsi_default_src_register();
933420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   full_dst_register.Dimension = tgsi_default_dimension();
934420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   full_dst_register.DimIndirect = tgsi_default_src_register();
935420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
936420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   return full_dst_register;
937420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol}
938420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
939420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krolstruct tgsi_full_instruction
940420400f67fce15512a8fcab770dde83a3eacc5ccMichal Kroltgsi_default_full_instruction( void )
941420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol{
942420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   struct tgsi_full_instruction full_instruction;
943420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   unsigned i;
944420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
945420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   full_instruction.Instruction = tgsi_default_instruction();
946420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   full_instruction.Predicate = tgsi_default_instruction_predicate();
947420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   full_instruction.Label = tgsi_default_instruction_label();
948420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   full_instruction.Texture = tgsi_default_instruction_texture();
9492083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie   for( i = 0;  i < TGSI_FULL_MAX_TEX_OFFSETS; i++ ) {
9502083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie      full_instruction.TexOffsets[i] = tgsi_default_texture_offset();
9512083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie   }
952420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   for( i = 0;  i < TGSI_FULL_MAX_DST_REGISTERS; i++ ) {
953420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol      full_instruction.Dst[i] = tgsi_default_full_dst_register();
954420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   }
955420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   for( i = 0;  i < TGSI_FULL_MAX_SRC_REGISTERS; i++ ) {
956420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol      full_instruction.Src[i] = tgsi_default_full_src_register();
957420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   }
958420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
959420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   return full_instruction;
960420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol}
961420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
962420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krolunsigned
963420400f67fce15512a8fcab770dde83a3eacc5ccMichal Kroltgsi_build_full_instruction(
964420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   const struct tgsi_full_instruction *full_inst,
965420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   struct  tgsi_token *tokens,
966420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   struct  tgsi_header *header,
967420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   unsigned  maxsize )
968420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol{
969420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   unsigned size = 0;
970420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   unsigned i;
971420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   struct tgsi_instruction *instruction;
972420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   struct tgsi_token *prev_token;
973420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
974420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   if( maxsize <= size )
975420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol      return 0;
976420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   instruction = (struct tgsi_instruction *) &tokens[size];
977420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   size++;
978420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
979420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   *instruction = tgsi_build_instruction(full_inst->Instruction.Opcode,
980420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol                                         full_inst->Instruction.Saturate,
981420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol                                         full_inst->Instruction.Predicate,
982420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol                                         full_inst->Instruction.NumDstRegs,
983420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol                                         full_inst->Instruction.NumSrcRegs,
984420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol                                         header);
985420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   prev_token = (struct tgsi_token  *) instruction;
986420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
987420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   if (full_inst->Instruction.Predicate) {
9885ee0d9f632383339088cc33005b7794b0915d4e0Michal Krol      struct tgsi_instruction_predicate *instruction_predicate;
9895ee0d9f632383339088cc33005b7794b0915d4e0Michal Krol
9905ee0d9f632383339088cc33005b7794b0915d4e0Michal Krol      if (maxsize <= size) {
9915ee0d9f632383339088cc33005b7794b0915d4e0Michal Krol         return 0;
9925ee0d9f632383339088cc33005b7794b0915d4e0Michal Krol      }
9935ee0d9f632383339088cc33005b7794b0915d4e0Michal Krol      instruction_predicate = (struct tgsi_instruction_predicate *)&tokens[size];
9945ee0d9f632383339088cc33005b7794b0915d4e0Michal Krol      size++;
9955ee0d9f632383339088cc33005b7794b0915d4e0Michal Krol
9965ee0d9f632383339088cc33005b7794b0915d4e0Michal Krol      *instruction_predicate =
9977d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell         tgsi_build_instruction_predicate(full_inst->Predicate.Index,
9987d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell                                          full_inst->Predicate.Negate,
9997d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell                                          full_inst->Predicate.SwizzleX,
10007d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell                                          full_inst->Predicate.SwizzleY,
10017d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell                                          full_inst->Predicate.SwizzleZ,
10027d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell                                          full_inst->Predicate.SwizzleW,
10035ee0d9f632383339088cc33005b7794b0915d4e0Michal Krol                                          instruction,
10045ee0d9f632383339088cc33005b7794b0915d4e0Michal Krol                                          header);
10055ee0d9f632383339088cc33005b7794b0915d4e0Michal Krol   }
10065ee0d9f632383339088cc33005b7794b0915d4e0Michal Krol
1007e13add8cae4637d9cd2f6c40c68de30701736abfMichal Krol   if (full_inst->Instruction.Label) {
1008ba1ca28cc62fed71c77902b95ae4ed36c6bf25f8Keith Whitwell      struct tgsi_instruction_label *instruction_label;
1009ffe58739da9eee2e99682747cc8f26e412c87430michal
1010ffe58739da9eee2e99682747cc8f26e412c87430michal      if( maxsize <= size )
1011ffe58739da9eee2e99682747cc8f26e412c87430michal         return 0;
1012ba1ca28cc62fed71c77902b95ae4ed36c6bf25f8Keith Whitwell      instruction_label =
1013ba1ca28cc62fed71c77902b95ae4ed36c6bf25f8Keith Whitwell         (struct  tgsi_instruction_label *) &tokens[size];
1014ffe58739da9eee2e99682747cc8f26e412c87430michal      size++;
1015ffe58739da9eee2e99682747cc8f26e412c87430michal
1016ba1ca28cc62fed71c77902b95ae4ed36c6bf25f8Keith Whitwell      *instruction_label = tgsi_build_instruction_label(
10177d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell         full_inst->Label.Label,
1018ffe58739da9eee2e99682747cc8f26e412c87430michal         prev_token,
1019ffe58739da9eee2e99682747cc8f26e412c87430michal         instruction,
1020ffe58739da9eee2e99682747cc8f26e412c87430michal         header );
1021ba1ca28cc62fed71c77902b95ae4ed36c6bf25f8Keith Whitwell      prev_token = (struct tgsi_token  *) instruction_label;
1022ffe58739da9eee2e99682747cc8f26e412c87430michal   }
1023ffe58739da9eee2e99682747cc8f26e412c87430michal
1024e13add8cae4637d9cd2f6c40c68de30701736abfMichal Krol   if (full_inst->Instruction.Texture) {
1025ba1ca28cc62fed71c77902b95ae4ed36c6bf25f8Keith Whitwell      struct tgsi_instruction_texture *instruction_texture;
1026ffe58739da9eee2e99682747cc8f26e412c87430michal
1027ffe58739da9eee2e99682747cc8f26e412c87430michal      if( maxsize <= size )
1028ffe58739da9eee2e99682747cc8f26e412c87430michal         return 0;
1029ba1ca28cc62fed71c77902b95ae4ed36c6bf25f8Keith Whitwell      instruction_texture =
1030ba1ca28cc62fed71c77902b95ae4ed36c6bf25f8Keith Whitwell         (struct  tgsi_instruction_texture *) &tokens[size];
1031ffe58739da9eee2e99682747cc8f26e412c87430michal      size++;
1032ffe58739da9eee2e99682747cc8f26e412c87430michal
1033ba1ca28cc62fed71c77902b95ae4ed36c6bf25f8Keith Whitwell      *instruction_texture = tgsi_build_instruction_texture(
10347d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell         full_inst->Texture.Texture,
10352083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie	 full_inst->Texture.NumOffsets,
1036ffe58739da9eee2e99682747cc8f26e412c87430michal         prev_token,
1037ffe58739da9eee2e99682747cc8f26e412c87430michal         instruction,
1038ffe58739da9eee2e99682747cc8f26e412c87430michal         header   );
1039ba1ca28cc62fed71c77902b95ae4ed36c6bf25f8Keith Whitwell      prev_token = (struct tgsi_token  *) instruction_texture;
1040ffe58739da9eee2e99682747cc8f26e412c87430michal
10412083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie      for (i = 0; i < full_inst->Texture.NumOffsets; i++) {
10422083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie         struct tgsi_texture_offset *texture_offset;
10432083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie
10442083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie         if ( maxsize <= size )
10452083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie            return 0;
10462083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie	 texture_offset = (struct tgsi_texture_offset *)&tokens[size];
10472083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie         size++;
10482083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie         *texture_offset = tgsi_build_texture_offset(
10492083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie            full_inst->TexOffsets[i].Index,
10502083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie            full_inst->TexOffsets[i].File,
10512083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie            full_inst->TexOffsets[i].SwizzleX,
10522083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie            full_inst->TexOffsets[i].SwizzleY,
10532083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie            full_inst->TexOffsets[i].SwizzleZ,
10542083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie            prev_token,
10552083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie            instruction,
10562083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie            header);
10572083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie         prev_token = (struct tgsi_token *) texture_offset;
10582083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie      }
10592083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie   }
1060ffe58739da9eee2e99682747cc8f26e412c87430michal   for( i = 0;  i <   full_inst->Instruction.NumDstRegs; i++ ) {
10617d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell      const struct tgsi_full_dst_register *reg = &full_inst->Dst[i];
1062ffe58739da9eee2e99682747cc8f26e412c87430michal      struct tgsi_dst_register *dst_register;
1063ffe58739da9eee2e99682747cc8f26e412c87430michal
1064ffe58739da9eee2e99682747cc8f26e412c87430michal      if( maxsize <= size )
1065ffe58739da9eee2e99682747cc8f26e412c87430michal         return 0;
1066ffe58739da9eee2e99682747cc8f26e412c87430michal      dst_register = (struct tgsi_dst_register *) &tokens[size];
1067ffe58739da9eee2e99682747cc8f26e412c87430michal      size++;
1068ffe58739da9eee2e99682747cc8f26e412c87430michal
1069ffe58739da9eee2e99682747cc8f26e412c87430michal      *dst_register = tgsi_build_dst_register(
10705b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell         reg->Register.File,
10715b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell         reg->Register.WriteMask,
10725b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell         reg->Register.Indirect,
1073101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin         reg->Register.Dimension,
10745b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell         reg->Register.Index,
1075ffe58739da9eee2e99682747cc8f26e412c87430michal         instruction,
1076ffe58739da9eee2e99682747cc8f26e412c87430michal         header );
1077ffe58739da9eee2e99682747cc8f26e412c87430michal
10785b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell      if( reg->Register.Indirect ) {
1079baa7ff47d548cdcc1ea68657ee1b0500f78041beBrian Paul         struct tgsi_src_register *ind;
1080baa7ff47d548cdcc1ea68657ee1b0500f78041beBrian Paul
1081baa7ff47d548cdcc1ea68657ee1b0500f78041beBrian Paul         if( maxsize <= size )
1082baa7ff47d548cdcc1ea68657ee1b0500f78041beBrian Paul            return 0;
1083baa7ff47d548cdcc1ea68657ee1b0500f78041beBrian Paul         ind = (struct tgsi_src_register *) &tokens[size];
1084baa7ff47d548cdcc1ea68657ee1b0500f78041beBrian Paul         size++;
1085baa7ff47d548cdcc1ea68657ee1b0500f78041beBrian Paul
1086baa7ff47d548cdcc1ea68657ee1b0500f78041beBrian Paul         *ind = tgsi_build_src_register(
10875b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell            reg->Indirect.File,
10885b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell            reg->Indirect.SwizzleX,
10895b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell            reg->Indirect.SwizzleY,
10905b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell            reg->Indirect.SwizzleZ,
10915b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell            reg->Indirect.SwizzleW,
10925b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell            reg->Indirect.Negate,
10935b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell            reg->Indirect.Absolute,
10945b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell            reg->Indirect.Indirect,
10955b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell            reg->Indirect.Dimension,
10965b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell            reg->Indirect.Index,
1097baa7ff47d548cdcc1ea68657ee1b0500f78041beBrian Paul            instruction,
1098baa7ff47d548cdcc1ea68657ee1b0500f78041beBrian Paul            header );
1099baa7ff47d548cdcc1ea68657ee1b0500f78041beBrian Paul      }
1100101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin
1101101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin      if( reg->Register.Dimension ) {
1102101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin         struct  tgsi_dimension *dim;
1103101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin
1104101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin         assert( !reg->Dimension.Dimension );
1105101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin
1106101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin         if( maxsize <= size )
1107101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin            return 0;
1108101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin         dim = (struct tgsi_dimension *) &tokens[size];
1109101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin         size++;
1110101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin
1111101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin         *dim = tgsi_build_dimension(
1112101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin            reg->Dimension.Indirect,
1113101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin            reg->Dimension.Index,
1114101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin            instruction,
1115101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin            header );
1116101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin
1117101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin         if( reg->Dimension.Indirect ) {
1118101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin            struct tgsi_src_register *ind;
1119101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin
1120101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin            if( maxsize <= size )
1121101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin               return 0;
1122101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin            ind = (struct tgsi_src_register *) &tokens[size];
1123101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin            size++;
1124101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin
1125101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin            *ind = tgsi_build_src_register(
1126101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin               reg->DimIndirect.File,
1127101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin               reg->DimIndirect.SwizzleX,
1128101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin               reg->DimIndirect.SwizzleY,
1129101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin               reg->DimIndirect.SwizzleZ,
1130101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin               reg->DimIndirect.SwizzleW,
1131101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin               reg->DimIndirect.Negate,
1132101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin               reg->DimIndirect.Absolute,
1133101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin               reg->DimIndirect.Indirect,
1134101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin               reg->DimIndirect.Dimension,
1135101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin               reg->DimIndirect.Index,
1136101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin               instruction,
1137101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin               header );
1138101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin         }
1139101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin      }
1140ffe58739da9eee2e99682747cc8f26e412c87430michal   }
1141ffe58739da9eee2e99682747cc8f26e412c87430michal
1142ffe58739da9eee2e99682747cc8f26e412c87430michal   for( i = 0;  i < full_inst->Instruction.NumSrcRegs; i++ ) {
11437d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell      const struct tgsi_full_src_register *reg = &full_inst->Src[i];
1144ffe58739da9eee2e99682747cc8f26e412c87430michal      struct tgsi_src_register *src_register;
1145ffe58739da9eee2e99682747cc8f26e412c87430michal
1146ffe58739da9eee2e99682747cc8f26e412c87430michal      if( maxsize <= size )
1147ffe58739da9eee2e99682747cc8f26e412c87430michal         return 0;
1148ffe58739da9eee2e99682747cc8f26e412c87430michal      src_register = (struct tgsi_src_register *)  &tokens[size];
1149ffe58739da9eee2e99682747cc8f26e412c87430michal      size++;
1150ffe58739da9eee2e99682747cc8f26e412c87430michal
1151ffe58739da9eee2e99682747cc8f26e412c87430michal      *src_register = tgsi_build_src_register(
115291a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell         reg->Register.File,
115391a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell         reg->Register.SwizzleX,
115491a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell         reg->Register.SwizzleY,
115591a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell         reg->Register.SwizzleZ,
115691a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell         reg->Register.SwizzleW,
115791a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell         reg->Register.Negate,
115891a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell         reg->Register.Absolute,
115991a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell         reg->Register.Indirect,
116091a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell         reg->Register.Dimension,
116191a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell         reg->Register.Index,
1162ffe58739da9eee2e99682747cc8f26e412c87430michal         instruction,
1163ffe58739da9eee2e99682747cc8f26e412c87430michal         header );
1164ffe58739da9eee2e99682747cc8f26e412c87430michal
116591a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell      if( reg->Register.Indirect ) {
1166ffe58739da9eee2e99682747cc8f26e412c87430michal         struct  tgsi_src_register *ind;
1167ffe58739da9eee2e99682747cc8f26e412c87430michal
1168ffe58739da9eee2e99682747cc8f26e412c87430michal         if( maxsize <= size )
1169ffe58739da9eee2e99682747cc8f26e412c87430michal            return 0;
1170ffe58739da9eee2e99682747cc8f26e412c87430michal         ind = (struct tgsi_src_register *) &tokens[size];
1171ffe58739da9eee2e99682747cc8f26e412c87430michal         size++;
1172ffe58739da9eee2e99682747cc8f26e412c87430michal
1173ffe58739da9eee2e99682747cc8f26e412c87430michal         *ind = tgsi_build_src_register(
117491a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell            reg->Indirect.File,
117591a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell            reg->Indirect.SwizzleX,
117691a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell            reg->Indirect.SwizzleY,
117791a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell            reg->Indirect.SwizzleZ,
117891a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell            reg->Indirect.SwizzleW,
117991a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell            reg->Indirect.Negate,
118091a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell            reg->Indirect.Absolute,
118191a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell            reg->Indirect.Indirect,
118291a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell            reg->Indirect.Dimension,
118391a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell            reg->Indirect.Index,
1184ffe58739da9eee2e99682747cc8f26e412c87430michal            instruction,
1185ffe58739da9eee2e99682747cc8f26e412c87430michal            header );
1186ffe58739da9eee2e99682747cc8f26e412c87430michal      }
1187ffe58739da9eee2e99682747cc8f26e412c87430michal
118891a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell      if( reg->Register.Dimension ) {
1189ffe58739da9eee2e99682747cc8f26e412c87430michal         struct  tgsi_dimension *dim;
1190ffe58739da9eee2e99682747cc8f26e412c87430michal
119191a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell         assert( !reg->Dimension.Dimension );
1192ffe58739da9eee2e99682747cc8f26e412c87430michal
1193ffe58739da9eee2e99682747cc8f26e412c87430michal         if( maxsize <= size )
1194ffe58739da9eee2e99682747cc8f26e412c87430michal            return 0;
1195ffe58739da9eee2e99682747cc8f26e412c87430michal         dim = (struct tgsi_dimension *) &tokens[size];
1196ffe58739da9eee2e99682747cc8f26e412c87430michal         size++;
1197ffe58739da9eee2e99682747cc8f26e412c87430michal
1198ffe58739da9eee2e99682747cc8f26e412c87430michal         *dim = tgsi_build_dimension(
119991a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell            reg->Dimension.Indirect,
120091a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell            reg->Dimension.Index,
1201ffe58739da9eee2e99682747cc8f26e412c87430michal            instruction,
1202ffe58739da9eee2e99682747cc8f26e412c87430michal            header );
1203ffe58739da9eee2e99682747cc8f26e412c87430michal
120491a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell         if( reg->Dimension.Indirect ) {
1205ffe58739da9eee2e99682747cc8f26e412c87430michal            struct tgsi_src_register *ind;
1206ffe58739da9eee2e99682747cc8f26e412c87430michal
1207ffe58739da9eee2e99682747cc8f26e412c87430michal            if( maxsize <= size )
1208ffe58739da9eee2e99682747cc8f26e412c87430michal               return 0;
1209ffe58739da9eee2e99682747cc8f26e412c87430michal            ind = (struct tgsi_src_register *) &tokens[size];
1210ffe58739da9eee2e99682747cc8f26e412c87430michal            size++;
1211ffe58739da9eee2e99682747cc8f26e412c87430michal
1212ffe58739da9eee2e99682747cc8f26e412c87430michal            *ind = tgsi_build_src_register(
121391a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell               reg->DimIndirect.File,
121491a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell               reg->DimIndirect.SwizzleX,
121591a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell               reg->DimIndirect.SwizzleY,
121691a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell               reg->DimIndirect.SwizzleZ,
121791a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell               reg->DimIndirect.SwizzleW,
121891a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell               reg->DimIndirect.Negate,
121991a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell               reg->DimIndirect.Absolute,
122091a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell               reg->DimIndirect.Indirect,
122191a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell               reg->DimIndirect.Dimension,
122291a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell               reg->DimIndirect.Index,
1223ffe58739da9eee2e99682747cc8f26e412c87430michal               instruction,
1224ffe58739da9eee2e99682747cc8f26e412c87430michal               header );
1225ffe58739da9eee2e99682747cc8f26e412c87430michal         }
1226ffe58739da9eee2e99682747cc8f26e412c87430michal      }
1227ffe58739da9eee2e99682747cc8f26e412c87430michal   }
1228ffe58739da9eee2e99682747cc8f26e412c87430michal
1229ffe58739da9eee2e99682747cc8f26e412c87430michal   return size;
1230ffe58739da9eee2e99682747cc8f26e412c87430michal}
1231ffe58739da9eee2e99682747cc8f26e412c87430michal
1232420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krolstatic struct tgsi_property
12333ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusintgsi_default_property( void )
12343ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin{
12353ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   struct tgsi_property property;
12363ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin
12373ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   property.Type = TGSI_TOKEN_TYPE_PROPERTY;
12383ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   property.NrTokens = 1;
12393ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   property.PropertyName = TGSI_PROPERTY_GS_INPUT_PRIM;
12403ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   property.Padding = 0;
12413ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin
12423ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   return property;
12433ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin}
12443ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin
1245420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krolstatic struct tgsi_property
12463ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusintgsi_build_property(unsigned property_name,
12473ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin                    struct tgsi_header *header)
12483ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin{
12493ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   struct tgsi_property property;
12503ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin
12513ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   property = tgsi_default_property();
12523ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   property.PropertyName = property_name;
12533ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin
12543ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   header_bodysize_grow( header );
12553ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin
12563ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   return property;
12573ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin}
12583ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin
12593ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin
12603ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusinstruct tgsi_full_property
12613ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusintgsi_default_full_property( void )
12623ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin{
12633ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   struct tgsi_full_property  full_property;
12643ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin
12653ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   full_property.Property  = tgsi_default_property();
12663ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   memset(full_property.u, 0,
12673ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin          sizeof(struct tgsi_property_data) * 8);
12683ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin
12693ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   return full_property;
12703ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin}
12713ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin
12723ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusinstatic void
12733ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusinproperty_grow(
12743ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   struct tgsi_property *property,
12753ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   struct tgsi_header *header )
12763ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin{
12773ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   assert( property->NrTokens < 0xFF );
12783ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin
12793ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   property->NrTokens++;
12803ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin
12813ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   header_bodysize_grow( header );
12823ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin}
12833ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin
1284420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krolstatic struct tgsi_property_data
12853ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusintgsi_build_property_data(
12863ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   unsigned value,
12873ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   struct tgsi_property *property,
12883ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   struct tgsi_header *header )
12893ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin{
12903ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   struct tgsi_property_data property_data;
12913ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin
12923ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   property_data.Data = value;
12933ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin
12943ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   property_grow( property, header );
12953ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin
12963ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   return property_data;
12973ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin}
12983ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin
12993ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusinunsigned
13003ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusintgsi_build_full_property(
13013ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   const struct tgsi_full_property *full_prop,
13023ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   struct tgsi_token *tokens,
13033ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   struct tgsi_header *header,
13043ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   unsigned maxsize )
13053ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin{
13063ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   unsigned size = 0, i;
13073ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   struct tgsi_property *property;
13083ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin
13093ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   if( maxsize <= size )
13103ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin      return 0;
13113ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   property = (struct tgsi_property *) &tokens[size];
13123ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   size++;
13133ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin
13143ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   *property = tgsi_build_property(
1315960be012a9d185c80bfcb9ff5c3781314dfb7b25Zack Rusin      full_prop->Property.PropertyName,
13163ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin      header );
13173ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin
13183ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   assert( full_prop->Property.NrTokens <= 8 + 1 );
13193ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin
13203ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   for( i = 0; i < full_prop->Property.NrTokens - 1; i++ ) {
13213ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin      struct tgsi_property_data *data;
13223ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin
13233ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin      if( maxsize <= size )
13243ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin         return  0;
13253ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin      data = (struct tgsi_property_data *) &tokens[size];
13263ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin      size++;
13273ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin
13283ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin      *data = tgsi_build_property_data(
13293ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin         full_prop->u[i].Data,
13303ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin         property,
13313ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin         header );
13323ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   }
13333ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin
13343ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   return size;
13353ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin}
1336