tgsi_build.c revision 1279923d72942ee201fcc6ad40d552143f651f03
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;
111ffe58739da9eee2e99682747cc8f26e412c87430michal
112ffe58739da9eee2e99682747cc8f26e412c87430michal   return declaration;
113ffe58739da9eee2e99682747cc8f26e412c87430michal}
114ffe58739da9eee2e99682747cc8f26e412c87430michal
115420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krolstatic struct tgsi_declaration
116ffe58739da9eee2e99682747cc8f26e412c87430michaltgsi_build_declaration(
117b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michal   unsigned file,
118058b978a5ae2a56e09fed6335b686c654444f4acmichal   unsigned usage_mask,
119b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michal   unsigned interpolate,
120dcf8543ab375dd9c128d1ca772b1e587cebbdc7cMichal Krol   unsigned dimension,
121b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michal   unsigned semantic,
1224de360e67d83cd6503fb8ad053bb8afe507db5faBrian Paul   unsigned invariant,
123ffe58739da9eee2e99682747cc8f26e412c87430michal   struct tgsi_header *header )
124ffe58739da9eee2e99682747cc8f26e412c87430michal{
125ffe58739da9eee2e99682747cc8f26e412c87430michal   struct tgsi_declaration declaration;
126ffe58739da9eee2e99682747cc8f26e412c87430michal
127cff2126f522bb511216f64427b3060467e266f8aBrian Paul   assert( file < TGSI_FILE_COUNT );
128cff2126f522bb511216f64427b3060467e266f8aBrian Paul   assert( interpolate < TGSI_INTERPOLATE_COUNT );
129ffe58739da9eee2e99682747cc8f26e412c87430michal
130ffe58739da9eee2e99682747cc8f26e412c87430michal   declaration = tgsi_default_declaration();
131ffe58739da9eee2e99682747cc8f26e412c87430michal   declaration.File = file;
132058b978a5ae2a56e09fed6335b686c654444f4acmichal   declaration.UsageMask = usage_mask;
133ffe58739da9eee2e99682747cc8f26e412c87430michal   declaration.Interpolate = interpolate;
134dcf8543ab375dd9c128d1ca772b1e587cebbdc7cMichal Krol   declaration.Dimension = dimension;
135b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michal   declaration.Semantic = semantic;
1364de360e67d83cd6503fb8ad053bb8afe507db5faBrian Paul   declaration.Invariant = invariant;
137ffe58739da9eee2e99682747cc8f26e412c87430michal
138ffe58739da9eee2e99682747cc8f26e412c87430michal   header_bodysize_grow( header );
139ffe58739da9eee2e99682747cc8f26e412c87430michal
140ffe58739da9eee2e99682747cc8f26e412c87430michal   return declaration;
141ffe58739da9eee2e99682747cc8f26e412c87430michal}
142ffe58739da9eee2e99682747cc8f26e412c87430michal
143420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krolstatic struct tgsi_declaration_range
144420400f67fce15512a8fcab770dde83a3eacc5ccMichal Kroltgsi_default_declaration_range( void )
145420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol{
146420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   struct tgsi_declaration_range dr;
147420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
148420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   dr.First = 0;
149420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   dr.Last = 0;
150420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
151420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   return dr;
152420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol}
153420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
154420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krolstatic struct tgsi_declaration_range
155420400f67fce15512a8fcab770dde83a3eacc5ccMichal Kroltgsi_build_declaration_range(
156420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   unsigned first,
157420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   unsigned last,
158ffe58739da9eee2e99682747cc8f26e412c87430michal   struct tgsi_declaration *declaration,
159ffe58739da9eee2e99682747cc8f26e412c87430michal   struct tgsi_header *header )
160ffe58739da9eee2e99682747cc8f26e412c87430michal{
161420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   struct tgsi_declaration_range declaration_range;
162ffe58739da9eee2e99682747cc8f26e412c87430michal
163420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   assert( last >= first );
164420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   assert( last <= 0xFFFF );
165ffe58739da9eee2e99682747cc8f26e412c87430michal
166420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   declaration_range.First = first;
167420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   declaration_range.Last = last;
168420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
169420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   declaration_grow( declaration, header );
170420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
171420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   return declaration_range;
172420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol}
173420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
174420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krolstatic struct tgsi_declaration_dimension
175420400f67fce15512a8fcab770dde83a3eacc5ccMichal Kroltgsi_build_declaration_dimension(unsigned index_2d,
176420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol                                 struct tgsi_declaration *declaration,
177420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol                                 struct tgsi_header *header)
178420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol{
179420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   struct tgsi_declaration_dimension dd;
180420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
181420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   assert(index_2d <= 0xFFFF);
182420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
183420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   dd.Index2D = index_2d;
184420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   dd.Padding = 0;
185420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
186420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   declaration_grow(declaration, header);
187420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
188420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   return dd;
189420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol}
190420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
1911279923d72942ee201fcc6ad40d552143f651f03Francisco Jerezstatic struct tgsi_declaration_interp
1921279923d72942ee201fcc6ad40d552143f651f03Francisco Jereztgsi_default_declaration_interp( void )
1931279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez{
1941279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez   struct tgsi_declaration_interp di;
1951279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez
1961279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez   di.Interpolate = TGSI_INTERPOLATE_CONSTANT;
1971279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez   di.Centroid = 0;
1981279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez   di.CylindricalWrap = 0;
1991279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez
2001279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez   return di;
2011279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez}
2021279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez
2031279923d72942ee201fcc6ad40d552143f651f03Francisco Jerezstatic struct tgsi_declaration_interp
2041279923d72942ee201fcc6ad40d552143f651f03Francisco Jereztgsi_build_declaration_interp(unsigned interpolate,
2051279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez                              unsigned centroid,
2061279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez                              unsigned cylindrical_wrap,
2071279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez                              struct tgsi_declaration *declaration,
2081279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez                              struct tgsi_header *header)
2091279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez{
2101279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez   struct tgsi_declaration_interp di;
2111279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez
2121279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez   di.Interpolate = interpolate;
2131279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez   di.Centroid = centroid;
2141279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez   di.CylindricalWrap = cylindrical_wrap;
2151279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez
2161279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez   declaration_grow(declaration, header);
2171279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez
2181279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez   return di;
2191279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez}
2201279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez
221420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krolstatic struct tgsi_declaration_semantic
222420400f67fce15512a8fcab770dde83a3eacc5ccMichal Kroltgsi_default_declaration_semantic( void )
223420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol{
224420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   struct tgsi_declaration_semantic ds;
225420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
226420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   ds.Name = TGSI_SEMANTIC_POSITION;
227420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   ds.Index = 0;
228420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   ds.Padding = 0;
229420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
230420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   return ds;
231420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol}
232420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
233420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krolstatic struct tgsi_declaration_semantic
234420400f67fce15512a8fcab770dde83a3eacc5ccMichal Kroltgsi_build_declaration_semantic(
235420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   unsigned semantic_name,
236420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   unsigned semantic_index,
237420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   struct tgsi_declaration *declaration,
238420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   struct tgsi_header *header )
239420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol{
240420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   struct tgsi_declaration_semantic ds;
241420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
242420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   assert( semantic_name <= TGSI_SEMANTIC_COUNT );
243420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   assert( semantic_index <= 0xFFFF );
244420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
245420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   ds.Name = semantic_name;
246420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   ds.Index = semantic_index;
247420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   ds.Padding = 0;
248420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
249420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   declaration_grow( declaration, header );
250420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
251420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   return ds;
252ffe58739da9eee2e99682747cc8f26e412c87430michal}
253ffe58739da9eee2e99682747cc8f26e412c87430michal
254bdbe77f9c6f06cfaa155f27c2ade3c523d7fbea7Zack Rusinstatic struct tgsi_declaration_resource
255bdbe77f9c6f06cfaa155f27c2ade3c523d7fbea7Zack Rusintgsi_default_declaration_resource(void)
256bdbe77f9c6f06cfaa155f27c2ade3c523d7fbea7Zack Rusin{
257a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez   struct tgsi_declaration_resource dr;
258bdbe77f9c6f06cfaa155f27c2ade3c523d7fbea7Zack Rusin
259a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez   dr.Resource = TGSI_BUFFER;
260bdbe77f9c6f06cfaa155f27c2ade3c523d7fbea7Zack Rusin
261a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez   return dr;
262bdbe77f9c6f06cfaa155f27c2ade3c523d7fbea7Zack Rusin}
263bdbe77f9c6f06cfaa155f27c2ade3c523d7fbea7Zack Rusin
264bdbe77f9c6f06cfaa155f27c2ade3c523d7fbea7Zack Rusinstatic struct tgsi_declaration_resource
265bdbe77f9c6f06cfaa155f27c2ade3c523d7fbea7Zack Rusintgsi_build_declaration_resource(unsigned texture,
266bdbe77f9c6f06cfaa155f27c2ade3c523d7fbea7Zack Rusin                                struct tgsi_declaration *declaration,
267bdbe77f9c6f06cfaa155f27c2ade3c523d7fbea7Zack Rusin                                struct tgsi_header *header)
268bdbe77f9c6f06cfaa155f27c2ade3c523d7fbea7Zack Rusin{
269a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez   struct tgsi_declaration_resource dr;
270a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez
271a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez   dr = tgsi_default_declaration_resource();
272a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez   dr.Resource = texture;
273a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez
274a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez   declaration_grow(declaration, header);
275a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez
276a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez   return dr;
277a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez}
278a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez
279a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerezstatic struct tgsi_declaration_sampler_view
280a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jereztgsi_default_declaration_sampler_view(void)
281a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez{
282a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez   struct tgsi_declaration_sampler_view dsv;
283a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez
284a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez   dsv.Resource = TGSI_BUFFER;
285a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez   dsv.ReturnTypeX = PIPE_TYPE_UNORM;
286a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez   dsv.ReturnTypeY = PIPE_TYPE_UNORM;
287a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez   dsv.ReturnTypeZ = PIPE_TYPE_UNORM;
288a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez   dsv.ReturnTypeW = PIPE_TYPE_UNORM;
289a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez
290a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez   return dsv;
291a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez}
292a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez
293a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerezstatic struct tgsi_declaration_sampler_view
294a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jereztgsi_build_declaration_sampler_view(unsigned texture,
295a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez                                    unsigned return_type_x,
296a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez                                    unsigned return_type_y,
297a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez                                    unsigned return_type_z,
298a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez                                    unsigned return_type_w,
299a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez                                    struct tgsi_declaration *declaration,
300a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez                                    struct tgsi_header *header)
301a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez{
302a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez   struct tgsi_declaration_sampler_view dsv;
303bdbe77f9c6f06cfaa155f27c2ade3c523d7fbea7Zack Rusin
304a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez   dsv = tgsi_default_declaration_sampler_view();
305a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez   dsv.Resource = texture;
306a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez   dsv.ReturnTypeX = return_type_x;
307a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez   dsv.ReturnTypeY = return_type_y;
308a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez   dsv.ReturnTypeZ = return_type_z;
309a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez   dsv.ReturnTypeW = return_type_w;
310bdbe77f9c6f06cfaa155f27c2ade3c523d7fbea7Zack Rusin
311bdbe77f9c6f06cfaa155f27c2ade3c523d7fbea7Zack Rusin   declaration_grow(declaration, header);
312bdbe77f9c6f06cfaa155f27c2ade3c523d7fbea7Zack Rusin
313a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez   return dsv;
314bdbe77f9c6f06cfaa155f27c2ade3c523d7fbea7Zack Rusin}
315bdbe77f9c6f06cfaa155f27c2ade3c523d7fbea7Zack Rusin
316bdbe77f9c6f06cfaa155f27c2ade3c523d7fbea7Zack Rusin
317ffe58739da9eee2e99682747cc8f26e412c87430michalstruct tgsi_full_declaration
318ffe58739da9eee2e99682747cc8f26e412c87430michaltgsi_default_full_declaration( void )
319ffe58739da9eee2e99682747cc8f26e412c87430michal{
320ffe58739da9eee2e99682747cc8f26e412c87430michal   struct tgsi_full_declaration  full_declaration;
321ffe58739da9eee2e99682747cc8f26e412c87430michal
322ffe58739da9eee2e99682747cc8f26e412c87430michal   full_declaration.Declaration  = tgsi_default_declaration();
323fe2b31e4a896167a33d267822b36eb2de0ceecbaKeith Whitwell   full_declaration.Range = tgsi_default_declaration_range();
324b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michal   full_declaration.Semantic = tgsi_default_declaration_semantic();
3251279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez   full_declaration.Interp = tgsi_default_declaration_interp();
3262b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin   full_declaration.ImmediateData.u = NULL;
327bdbe77f9c6f06cfaa155f27c2ade3c523d7fbea7Zack Rusin   full_declaration.Resource = tgsi_default_declaration_resource();
328a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez   full_declaration.SamplerView = tgsi_default_declaration_sampler_view();
329ffe58739da9eee2e99682747cc8f26e412c87430michal
330ffe58739da9eee2e99682747cc8f26e412c87430michal   return full_declaration;
331ffe58739da9eee2e99682747cc8f26e412c87430michal}
332ffe58739da9eee2e99682747cc8f26e412c87430michal
333b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michalunsigned
334ffe58739da9eee2e99682747cc8f26e412c87430michaltgsi_build_full_declaration(
335b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michal   const struct tgsi_full_declaration *full_decl,
336ffe58739da9eee2e99682747cc8f26e412c87430michal   struct tgsi_token *tokens,
337ffe58739da9eee2e99682747cc8f26e412c87430michal   struct tgsi_header *header,
338b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michal   unsigned maxsize )
339ffe58739da9eee2e99682747cc8f26e412c87430michal{
340b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michal   unsigned size = 0;
341ffe58739da9eee2e99682747cc8f26e412c87430michal   struct tgsi_declaration *declaration;
342a49381587f73c67469ec7546419cfc41387f938cMichal Krol   struct tgsi_declaration_range *dr;
343ffe58739da9eee2e99682747cc8f26e412c87430michal
344ffe58739da9eee2e99682747cc8f26e412c87430michal   if( maxsize <= size )
3452b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin      return 0;
346ffe58739da9eee2e99682747cc8f26e412c87430michal   declaration = (struct tgsi_declaration *) &tokens[size];
347ffe58739da9eee2e99682747cc8f26e412c87430michal   size++;
348ffe58739da9eee2e99682747cc8f26e412c87430michal
349ffe58739da9eee2e99682747cc8f26e412c87430michal   *declaration = tgsi_build_declaration(
350ffe58739da9eee2e99682747cc8f26e412c87430michal      full_decl->Declaration.File,
351058b978a5ae2a56e09fed6335b686c654444f4acmichal      full_decl->Declaration.UsageMask,
352ffe58739da9eee2e99682747cc8f26e412c87430michal      full_decl->Declaration.Interpolate,
353dcf8543ab375dd9c128d1ca772b1e587cebbdc7cMichal Krol      full_decl->Declaration.Dimension,
354b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michal      full_decl->Declaration.Semantic,
3554de360e67d83cd6503fb8ad053bb8afe507db5faBrian Paul      full_decl->Declaration.Invariant,
356ffe58739da9eee2e99682747cc8f26e412c87430michal      header );
357ffe58739da9eee2e99682747cc8f26e412c87430michal
358a49381587f73c67469ec7546419cfc41387f938cMichal Krol   if (maxsize <= size)
359a49381587f73c67469ec7546419cfc41387f938cMichal Krol      return 0;
360a49381587f73c67469ec7546419cfc41387f938cMichal Krol   dr = (struct tgsi_declaration_range *) &tokens[size];
361a49381587f73c67469ec7546419cfc41387f938cMichal Krol   size++;
362ffe58739da9eee2e99682747cc8f26e412c87430michal
363a49381587f73c67469ec7546419cfc41387f938cMichal Krol   *dr = tgsi_build_declaration_range(
364fe2b31e4a896167a33d267822b36eb2de0ceecbaKeith Whitwell      full_decl->Range.First,
365fe2b31e4a896167a33d267822b36eb2de0ceecbaKeith Whitwell      full_decl->Range.Last,
366a49381587f73c67469ec7546419cfc41387f938cMichal Krol      declaration,
367a49381587f73c67469ec7546419cfc41387f938cMichal Krol      header );
368ffe58739da9eee2e99682747cc8f26e412c87430michal
369dcf8543ab375dd9c128d1ca772b1e587cebbdc7cMichal Krol   if (full_decl->Declaration.Dimension) {
370dcf8543ab375dd9c128d1ca772b1e587cebbdc7cMichal Krol      struct tgsi_declaration_dimension *dd;
371dcf8543ab375dd9c128d1ca772b1e587cebbdc7cMichal Krol
372dcf8543ab375dd9c128d1ca772b1e587cebbdc7cMichal Krol      if (maxsize <= size) {
373dcf8543ab375dd9c128d1ca772b1e587cebbdc7cMichal Krol         return 0;
374dcf8543ab375dd9c128d1ca772b1e587cebbdc7cMichal Krol      }
375dcf8543ab375dd9c128d1ca772b1e587cebbdc7cMichal Krol      dd = (struct tgsi_declaration_dimension *)&tokens[size];
376dcf8543ab375dd9c128d1ca772b1e587cebbdc7cMichal Krol      size++;
377dcf8543ab375dd9c128d1ca772b1e587cebbdc7cMichal Krol
378dcf8543ab375dd9c128d1ca772b1e587cebbdc7cMichal Krol      *dd = tgsi_build_declaration_dimension(full_decl->Dim.Index2D,
379dcf8543ab375dd9c128d1ca772b1e587cebbdc7cMichal Krol                                             declaration,
380dcf8543ab375dd9c128d1ca772b1e587cebbdc7cMichal Krol                                             header);
381dcf8543ab375dd9c128d1ca772b1e587cebbdc7cMichal Krol   }
382dcf8543ab375dd9c128d1ca772b1e587cebbdc7cMichal Krol
3831279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez   if (full_decl->Declaration.Interpolate) {
3841279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez      struct tgsi_declaration_interp *di;
3851279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez
3861279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez      if (maxsize <= size) {
3871279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez         return 0;
3881279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez      }
3891279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez      di = (struct tgsi_declaration_interp *)&tokens[size];
3901279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez      size++;
3911279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez
3921279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez      *di = tgsi_build_declaration_interp(full_decl->Interp.Interpolate,
3931279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez                                          full_decl->Interp.Centroid,
3941279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez                                          full_decl->Interp.CylindricalWrap,
3951279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez                                          declaration,
3961279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez                                          header);
3971279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez   }
3981279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez
399b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michal   if( full_decl->Declaration.Semantic ) {
400b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michal      struct tgsi_declaration_semantic *ds;
401b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michal
402b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michal      if( maxsize <= size )
403b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michal         return  0;
404b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michal      ds = (struct tgsi_declaration_semantic *) &tokens[size];
405b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michal      size++;
406b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michal
407b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michal      *ds = tgsi_build_declaration_semantic(
408763426a0256f0ab06f8af53947bd630f8600183aKeith Whitwell         full_decl->Semantic.Name,
409763426a0256f0ab06f8af53947bd630f8600183aKeith Whitwell         full_decl->Semantic.Index,
410b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michal         declaration,
411b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michal         header );
412b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michal   }
413b9eeb8dccff3b440a299f19a0868a3ff1cda1e09michal
4142b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin   if (full_decl->Declaration.File == TGSI_FILE_IMMEDIATE_ARRAY) {
4152b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin      unsigned i, j;
4162b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin      union tgsi_immediate_data *data;
4172b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin
4182b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin      for (i = 0; i <= dr->Last; ++i) {
4192b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin         for (j = 0; j < 4; ++j) {
4202b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin            unsigned idx = i*4 + j;
4212b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin            if (maxsize <= size)
4222b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin               return 0;
4232b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin            data = (union tgsi_immediate_data *) &tokens[size];
4242b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin            ++size;
4252b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin
4262b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin            *data = full_decl->ImmediateData.u[idx];
4272b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin            declaration_grow( declaration, header );
4282b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin         }
4292b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin      }
4302b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin   }
4312b221e11da7a8bf759e3c359f22ba6f49d5f0997Zack Rusin
432bdbe77f9c6f06cfaa155f27c2ade3c523d7fbea7Zack Rusin   if (full_decl->Declaration.File == TGSI_FILE_RESOURCE) {
433bdbe77f9c6f06cfaa155f27c2ade3c523d7fbea7Zack Rusin      struct tgsi_declaration_resource *dr;
434bdbe77f9c6f06cfaa155f27c2ade3c523d7fbea7Zack Rusin
435bdbe77f9c6f06cfaa155f27c2ade3c523d7fbea7Zack Rusin      if (maxsize <= size) {
436bdbe77f9c6f06cfaa155f27c2ade3c523d7fbea7Zack Rusin         return  0;
437bdbe77f9c6f06cfaa155f27c2ade3c523d7fbea7Zack Rusin      }
438bdbe77f9c6f06cfaa155f27c2ade3c523d7fbea7Zack Rusin      dr = (struct tgsi_declaration_resource *)&tokens[size];
439bdbe77f9c6f06cfaa155f27c2ade3c523d7fbea7Zack Rusin      size++;
440bdbe77f9c6f06cfaa155f27c2ade3c523d7fbea7Zack Rusin
441bdbe77f9c6f06cfaa155f27c2ade3c523d7fbea7Zack Rusin      *dr = tgsi_build_declaration_resource(full_decl->Resource.Resource,
442bdbe77f9c6f06cfaa155f27c2ade3c523d7fbea7Zack Rusin                                            declaration,
443bdbe77f9c6f06cfaa155f27c2ade3c523d7fbea7Zack Rusin                                            header);
444bdbe77f9c6f06cfaa155f27c2ade3c523d7fbea7Zack Rusin   }
445bdbe77f9c6f06cfaa155f27c2ade3c523d7fbea7Zack Rusin
446a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez   if (full_decl->Declaration.File == TGSI_FILE_SAMPLER_VIEW) {
447a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez      struct tgsi_declaration_sampler_view *dsv;
448a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez
449a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez      if (maxsize <= size) {
450a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez         return  0;
451a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez      }
452a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez      dsv = (struct tgsi_declaration_sampler_view *)&tokens[size];
453a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez      size++;
454a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez
455a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez      *dsv = tgsi_build_declaration_sampler_view(
456a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez         full_decl->SamplerView.Resource,
457a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez         full_decl->SamplerView.ReturnTypeX,
458a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez         full_decl->SamplerView.ReturnTypeY,
459a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez         full_decl->SamplerView.ReturnTypeZ,
460a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez         full_decl->SamplerView.ReturnTypeW,
461a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez         declaration,
462a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez         header);
463a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez   }
464a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez
465ffe58739da9eee2e99682747cc8f26e412c87430michal   return size;
466ffe58739da9eee2e99682747cc8f26e412c87430michal}
467ffe58739da9eee2e99682747cc8f26e412c87430michal
468ffe58739da9eee2e99682747cc8f26e412c87430michal/*
469ffe58739da9eee2e99682747cc8f26e412c87430michal * immediate
470ffe58739da9eee2e99682747cc8f26e412c87430michal */
471ffe58739da9eee2e99682747cc8f26e412c87430michal
472420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krolstatic struct tgsi_immediate
473ffe58739da9eee2e99682747cc8f26e412c87430michaltgsi_default_immediate( void )
474ffe58739da9eee2e99682747cc8f26e412c87430michal{
475ffe58739da9eee2e99682747cc8f26e412c87430michal   struct tgsi_immediate immediate;
476ffe58739da9eee2e99682747cc8f26e412c87430michal
477ffe58739da9eee2e99682747cc8f26e412c87430michal   immediate.Type = TGSI_TOKEN_TYPE_IMMEDIATE;
4785ecd0b0890fd48656e46c017830a9f5d6b906aaeMichal Krol   immediate.NrTokens = 1;
479ffe58739da9eee2e99682747cc8f26e412c87430michal   immediate.DataType = TGSI_IMM_FLOAT32;
480ffe58739da9eee2e99682747cc8f26e412c87430michal   immediate.Padding = 0;
481ffe58739da9eee2e99682747cc8f26e412c87430michal
482ffe58739da9eee2e99682747cc8f26e412c87430michal   return immediate;
483ffe58739da9eee2e99682747cc8f26e412c87430michal}
484ffe58739da9eee2e99682747cc8f26e412c87430michal
485420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krolstatic struct tgsi_immediate
486ffe58739da9eee2e99682747cc8f26e412c87430michaltgsi_build_immediate(
487ffe58739da9eee2e99682747cc8f26e412c87430michal   struct tgsi_header *header )
488ffe58739da9eee2e99682747cc8f26e412c87430michal{
489ffe58739da9eee2e99682747cc8f26e412c87430michal   struct tgsi_immediate immediate;
490ffe58739da9eee2e99682747cc8f26e412c87430michal
491ffe58739da9eee2e99682747cc8f26e412c87430michal   immediate = tgsi_default_immediate();
492ffe58739da9eee2e99682747cc8f26e412c87430michal
493271f9dac79a9247de9a57f4d248e404bf1652a13José Fonseca   header_bodysize_grow( header );
494ffe58739da9eee2e99682747cc8f26e412c87430michal
495ffe58739da9eee2e99682747cc8f26e412c87430michal   return immediate;
496ffe58739da9eee2e99682747cc8f26e412c87430michal}
497ffe58739da9eee2e99682747cc8f26e412c87430michal
498ffe58739da9eee2e99682747cc8f26e412c87430michalstruct tgsi_full_immediate
499ffe58739da9eee2e99682747cc8f26e412c87430michaltgsi_default_full_immediate( void )
500ffe58739da9eee2e99682747cc8f26e412c87430michal{
501ffe58739da9eee2e99682747cc8f26e412c87430michal   struct tgsi_full_immediate fullimm;
502ffe58739da9eee2e99682747cc8f26e412c87430michal
503ffe58739da9eee2e99682747cc8f26e412c87430michal   fullimm.Immediate = tgsi_default_immediate();
504fd31f92cea0ce8613a22d8f4b3c75b340bcc5689Keith Whitwell   fullimm.u[0].Float = 0.0f;
505fd31f92cea0ce8613a22d8f4b3c75b340bcc5689Keith Whitwell   fullimm.u[1].Float = 0.0f;
506fd31f92cea0ce8613a22d8f4b3c75b340bcc5689Keith Whitwell   fullimm.u[2].Float = 0.0f;
507fd31f92cea0ce8613a22d8f4b3c75b340bcc5689Keith Whitwell   fullimm.u[3].Float = 0.0f;
508ffe58739da9eee2e99682747cc8f26e412c87430michal
509ffe58739da9eee2e99682747cc8f26e412c87430michal   return fullimm;
510ffe58739da9eee2e99682747cc8f26e412c87430michal}
511ffe58739da9eee2e99682747cc8f26e412c87430michal
512ffe58739da9eee2e99682747cc8f26e412c87430michalstatic void
513ffe58739da9eee2e99682747cc8f26e412c87430michalimmediate_grow(
514ffe58739da9eee2e99682747cc8f26e412c87430michal   struct tgsi_immediate *immediate,
515ffe58739da9eee2e99682747cc8f26e412c87430michal   struct tgsi_header *header )
516ffe58739da9eee2e99682747cc8f26e412c87430michal{
5175ecd0b0890fd48656e46c017830a9f5d6b906aaeMichal Krol   assert( immediate->NrTokens < 0xFF );
518ffe58739da9eee2e99682747cc8f26e412c87430michal
5195ecd0b0890fd48656e46c017830a9f5d6b906aaeMichal Krol   immediate->NrTokens++;
520ffe58739da9eee2e99682747cc8f26e412c87430michal
521ffe58739da9eee2e99682747cc8f26e412c87430michal   header_bodysize_grow( header );
522ffe58739da9eee2e99682747cc8f26e412c87430michal}
523ffe58739da9eee2e99682747cc8f26e412c87430michal
524420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krolstatic union tgsi_immediate_data
525ffe58739da9eee2e99682747cc8f26e412c87430michaltgsi_build_immediate_float32(
526529c411e4095eeb9be501a6fe657a3a196c3e448michal   float value,
527ffe58739da9eee2e99682747cc8f26e412c87430michal   struct tgsi_immediate *immediate,
528ffe58739da9eee2e99682747cc8f26e412c87430michal   struct tgsi_header *header )
529ffe58739da9eee2e99682747cc8f26e412c87430michal{
530fd31f92cea0ce8613a22d8f4b3c75b340bcc5689Keith Whitwell   union tgsi_immediate_data immediate_data;
531ffe58739da9eee2e99682747cc8f26e412c87430michal
532fd31f92cea0ce8613a22d8f4b3c75b340bcc5689Keith Whitwell   immediate_data.Float = value;
533ffe58739da9eee2e99682747cc8f26e412c87430michal
534ffe58739da9eee2e99682747cc8f26e412c87430michal   immediate_grow( immediate, header );
535ffe58739da9eee2e99682747cc8f26e412c87430michal
536fd31f92cea0ce8613a22d8f4b3c75b340bcc5689Keith Whitwell   return immediate_data;
537ffe58739da9eee2e99682747cc8f26e412c87430michal}
538ffe58739da9eee2e99682747cc8f26e412c87430michal
539529c411e4095eeb9be501a6fe657a3a196c3e448michalunsigned
540ffe58739da9eee2e99682747cc8f26e412c87430michaltgsi_build_full_immediate(
541ffe58739da9eee2e99682747cc8f26e412c87430michal   const struct tgsi_full_immediate *full_imm,
542ffe58739da9eee2e99682747cc8f26e412c87430michal   struct tgsi_token *tokens,
543ffe58739da9eee2e99682747cc8f26e412c87430michal   struct tgsi_header *header,
544529c411e4095eeb9be501a6fe657a3a196c3e448michal   unsigned maxsize )
545ffe58739da9eee2e99682747cc8f26e412c87430michal{
546271f9dac79a9247de9a57f4d248e404bf1652a13José Fonseca   unsigned size = 0, i;
547ffe58739da9eee2e99682747cc8f26e412c87430michal   struct tgsi_immediate *immediate;
548ffe58739da9eee2e99682747cc8f26e412c87430michal
549ffe58739da9eee2e99682747cc8f26e412c87430michal   if( maxsize <= size )
550ffe58739da9eee2e99682747cc8f26e412c87430michal      return 0;
551ffe58739da9eee2e99682747cc8f26e412c87430michal   immediate = (struct tgsi_immediate *) &tokens[size];
552ffe58739da9eee2e99682747cc8f26e412c87430michal   size++;
553ffe58739da9eee2e99682747cc8f26e412c87430michal
554ffe58739da9eee2e99682747cc8f26e412c87430michal   *immediate = tgsi_build_immediate( header );
555ffe58739da9eee2e99682747cc8f26e412c87430michal
556fd31f92cea0ce8613a22d8f4b3c75b340bcc5689Keith Whitwell   assert( full_imm->Immediate.NrTokens <= 4 + 1 );
557fd31f92cea0ce8613a22d8f4b3c75b340bcc5689Keith Whitwell
5585ecd0b0890fd48656e46c017830a9f5d6b906aaeMichal Krol   for( i = 0; i < full_imm->Immediate.NrTokens - 1; i++ ) {
559fd31f92cea0ce8613a22d8f4b3c75b340bcc5689Keith Whitwell      union tgsi_immediate_data *data;
560ffe58739da9eee2e99682747cc8f26e412c87430michal
561ffe58739da9eee2e99682747cc8f26e412c87430michal      if( maxsize <= size )
562ffe58739da9eee2e99682747cc8f26e412c87430michal         return  0;
563fd31f92cea0ce8613a22d8f4b3c75b340bcc5689Keith Whitwell      data = (union tgsi_immediate_data *) &tokens[size];
564ffe58739da9eee2e99682747cc8f26e412c87430michal      size++;
565ffe58739da9eee2e99682747cc8f26e412c87430michal
566fd31f92cea0ce8613a22d8f4b3c75b340bcc5689Keith Whitwell      *data = tgsi_build_immediate_float32(
567fd31f92cea0ce8613a22d8f4b3c75b340bcc5689Keith Whitwell         full_imm->u[i].Float,
568ffe58739da9eee2e99682747cc8f26e412c87430michal         immediate,
569ffe58739da9eee2e99682747cc8f26e412c87430michal         header );
570ffe58739da9eee2e99682747cc8f26e412c87430michal   }
571ffe58739da9eee2e99682747cc8f26e412c87430michal
572ffe58739da9eee2e99682747cc8f26e412c87430michal   return size;
573ffe58739da9eee2e99682747cc8f26e412c87430michal}
574ffe58739da9eee2e99682747cc8f26e412c87430michal
575ffe58739da9eee2e99682747cc8f26e412c87430michal/*
576ffe58739da9eee2e99682747cc8f26e412c87430michal * instruction
577ffe58739da9eee2e99682747cc8f26e412c87430michal */
578ffe58739da9eee2e99682747cc8f26e412c87430michal
579ffe58739da9eee2e99682747cc8f26e412c87430michalstruct tgsi_instruction
580ffe58739da9eee2e99682747cc8f26e412c87430michaltgsi_default_instruction( void )
581ffe58739da9eee2e99682747cc8f26e412c87430michal{
582ffe58739da9eee2e99682747cc8f26e412c87430michal   struct tgsi_instruction instruction;
583ffe58739da9eee2e99682747cc8f26e412c87430michal
584ffe58739da9eee2e99682747cc8f26e412c87430michal   instruction.Type = TGSI_TOKEN_TYPE_INSTRUCTION;
585bc7567d9665924650c43c661d07ae9a922554beeBrian Paul   instruction.NrTokens = 0;
586ffe58739da9eee2e99682747cc8f26e412c87430michal   instruction.Opcode = TGSI_OPCODE_MOV;
587ffe58739da9eee2e99682747cc8f26e412c87430michal   instruction.Saturate = TGSI_SAT_NONE;
5885ee0d9f632383339088cc33005b7794b0915d4e0Michal Krol   instruction.Predicate = 0;
589ffe58739da9eee2e99682747cc8f26e412c87430michal   instruction.NumDstRegs = 1;
590ffe58739da9eee2e99682747cc8f26e412c87430michal   instruction.NumSrcRegs = 1;
591ba1ca28cc62fed71c77902b95ae4ed36c6bf25f8Keith Whitwell   instruction.Label = 0;
592ba1ca28cc62fed71c77902b95ae4ed36c6bf25f8Keith Whitwell   instruction.Texture = 0;
593ffe58739da9eee2e99682747cc8f26e412c87430michal   instruction.Padding  = 0;
594ffe58739da9eee2e99682747cc8f26e412c87430michal
595ffe58739da9eee2e99682747cc8f26e412c87430michal   return instruction;
596ffe58739da9eee2e99682747cc8f26e412c87430michal}
597ffe58739da9eee2e99682747cc8f26e412c87430michal
598420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krolstatic struct tgsi_instruction
5995ee0d9f632383339088cc33005b7794b0915d4e0Michal Kroltgsi_build_instruction(unsigned opcode,
6005ee0d9f632383339088cc33005b7794b0915d4e0Michal Krol                       unsigned saturate,
6015ee0d9f632383339088cc33005b7794b0915d4e0Michal Krol                       unsigned predicate,
6025ee0d9f632383339088cc33005b7794b0915d4e0Michal Krol                       unsigned num_dst_regs,
6035ee0d9f632383339088cc33005b7794b0915d4e0Michal Krol                       unsigned num_src_regs,
6045ee0d9f632383339088cc33005b7794b0915d4e0Michal Krol                       struct tgsi_header *header)
605ffe58739da9eee2e99682747cc8f26e412c87430michal{
606ffe58739da9eee2e99682747cc8f26e412c87430michal   struct tgsi_instruction instruction;
607ffe58739da9eee2e99682747cc8f26e412c87430michal
608ffe58739da9eee2e99682747cc8f26e412c87430michal   assert (opcode <= TGSI_OPCODE_LAST);
609ffe58739da9eee2e99682747cc8f26e412c87430michal   assert (saturate <= TGSI_SAT_MINUS_PLUS_ONE);
610ffe58739da9eee2e99682747cc8f26e412c87430michal   assert (num_dst_regs <= 3);
611ffe58739da9eee2e99682747cc8f26e412c87430michal   assert (num_src_regs <= 15);
612ffe58739da9eee2e99682747cc8f26e412c87430michal
613ffe58739da9eee2e99682747cc8f26e412c87430michal   instruction = tgsi_default_instruction();
614ffe58739da9eee2e99682747cc8f26e412c87430michal   instruction.Opcode = opcode;
615ffe58739da9eee2e99682747cc8f26e412c87430michal   instruction.Saturate = saturate;
6165ee0d9f632383339088cc33005b7794b0915d4e0Michal Krol   instruction.Predicate = predicate;
617ffe58739da9eee2e99682747cc8f26e412c87430michal   instruction.NumDstRegs = num_dst_regs;
618ffe58739da9eee2e99682747cc8f26e412c87430michal   instruction.NumSrcRegs = num_src_regs;
619ffe58739da9eee2e99682747cc8f26e412c87430michal
620ffe58739da9eee2e99682747cc8f26e412c87430michal   header_bodysize_grow( header );
621ffe58739da9eee2e99682747cc8f26e412c87430michal
622ffe58739da9eee2e99682747cc8f26e412c87430michal   return instruction;
623ffe58739da9eee2e99682747cc8f26e412c87430michal}
624ffe58739da9eee2e99682747cc8f26e412c87430michal
625ffe58739da9eee2e99682747cc8f26e412c87430michalstatic void
626ffe58739da9eee2e99682747cc8f26e412c87430michalinstruction_grow(
627ffe58739da9eee2e99682747cc8f26e412c87430michal   struct tgsi_instruction *instruction,
628ffe58739da9eee2e99682747cc8f26e412c87430michal   struct tgsi_header *header )
629ffe58739da9eee2e99682747cc8f26e412c87430michal{
6305ecd0b0890fd48656e46c017830a9f5d6b906aaeMichal Krol   assert (instruction->NrTokens <   0xFF);
631ffe58739da9eee2e99682747cc8f26e412c87430michal
6325ecd0b0890fd48656e46c017830a9f5d6b906aaeMichal Krol   instruction->NrTokens++;
633ffe58739da9eee2e99682747cc8f26e412c87430michal
634ffe58739da9eee2e99682747cc8f26e412c87430michal   header_bodysize_grow( header );
635ffe58739da9eee2e99682747cc8f26e412c87430michal}
636ffe58739da9eee2e99682747cc8f26e412c87430michal
637420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krolstruct tgsi_instruction_predicate
638420400f67fce15512a8fcab770dde83a3eacc5ccMichal Kroltgsi_default_instruction_predicate(void)
639ffe58739da9eee2e99682747cc8f26e412c87430michal{
640420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   struct tgsi_instruction_predicate instruction_predicate;
641ffe58739da9eee2e99682747cc8f26e412c87430michal
642420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   instruction_predicate.SwizzleX = TGSI_SWIZZLE_X;
643420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   instruction_predicate.SwizzleY = TGSI_SWIZZLE_Y;
644420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   instruction_predicate.SwizzleZ = TGSI_SWIZZLE_Z;
645420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   instruction_predicate.SwizzleW = TGSI_SWIZZLE_W;
646420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   instruction_predicate.Negate = 0;
647420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   instruction_predicate.Index = 0;
648420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   instruction_predicate.Padding = 0;
649ffe58739da9eee2e99682747cc8f26e412c87430michal
650420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   return instruction_predicate;
651ffe58739da9eee2e99682747cc8f26e412c87430michal}
652ffe58739da9eee2e99682747cc8f26e412c87430michal
653420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krolstatic struct tgsi_instruction_predicate
654420400f67fce15512a8fcab770dde83a3eacc5ccMichal Kroltgsi_build_instruction_predicate(int index,
655420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol                                 unsigned negate,
656420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol                                 unsigned swizzleX,
657420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol                                 unsigned swizzleY,
658420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol                                 unsigned swizzleZ,
659420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol                                 unsigned swizzleW,
660420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol                                 struct tgsi_instruction *instruction,
661420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol                                 struct tgsi_header *header)
662ffe58739da9eee2e99682747cc8f26e412c87430michal{
663420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   struct tgsi_instruction_predicate instruction_predicate;
664ffe58739da9eee2e99682747cc8f26e412c87430michal
665420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   instruction_predicate = tgsi_default_instruction_predicate();
666420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   instruction_predicate.SwizzleX = swizzleX;
667420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   instruction_predicate.SwizzleY = swizzleY;
668420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   instruction_predicate.SwizzleZ = swizzleZ;
669420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   instruction_predicate.SwizzleW = swizzleW;
670420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   instruction_predicate.Negate = negate;
671420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   instruction_predicate.Index = index;
672ffe58739da9eee2e99682747cc8f26e412c87430michal
673420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   instruction_grow(instruction, header);
674ffe58739da9eee2e99682747cc8f26e412c87430michal
675420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   return instruction_predicate;
676420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol}
677420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
678420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krolstatic struct tgsi_instruction_label
679420400f67fce15512a8fcab770dde83a3eacc5ccMichal Kroltgsi_default_instruction_label( void )
680420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol{
681420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   struct tgsi_instruction_label instruction_label;
682420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
683420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   instruction_label.Label = 0;
684420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   instruction_label.Padding = 0;
685420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
686420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   return instruction_label;
687420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol}
688420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
689420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krolstatic struct tgsi_instruction_label
690420400f67fce15512a8fcab770dde83a3eacc5ccMichal Kroltgsi_build_instruction_label(
691420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   unsigned label,
692420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   struct tgsi_token  *prev_token,
693420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   struct tgsi_instruction *instruction,
694420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   struct tgsi_header *header )
695420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol{
696420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   struct tgsi_instruction_label instruction_label;
697420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
698420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   instruction_label.Label = label;
699420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   instruction_label.Padding = 0;
700420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   instruction->Label = 1;
701420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
702420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   instruction_grow( instruction, header );
703420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
704420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   return instruction_label;
705420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol}
706420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
707420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krolstatic struct tgsi_instruction_texture
708420400f67fce15512a8fcab770dde83a3eacc5ccMichal Kroltgsi_default_instruction_texture( void )
709420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol{
710420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   struct tgsi_instruction_texture instruction_texture;
711420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
712420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   instruction_texture.Texture = TGSI_TEXTURE_UNKNOWN;
7132083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie   instruction_texture.NumOffsets = 0;
714420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   instruction_texture.Padding = 0;
715420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
716420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   return instruction_texture;
717420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol}
718420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
719420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krolstatic struct tgsi_instruction_texture
720420400f67fce15512a8fcab770dde83a3eacc5ccMichal Kroltgsi_build_instruction_texture(
721420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   unsigned texture,
7222083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie   unsigned num_offsets,
723420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   struct tgsi_token *prev_token,
724420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   struct tgsi_instruction *instruction,
725420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   struct tgsi_header *header )
726420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol{
727420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   struct tgsi_instruction_texture instruction_texture;
728420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
729420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   instruction_texture.Texture = texture;
7302083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie   instruction_texture.NumOffsets = num_offsets;
731420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   instruction_texture.Padding = 0;
732420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   instruction->Texture = 1;
733420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
734420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   instruction_grow( instruction, header );
735420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
736420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   return instruction_texture;
737420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol}
738420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
7392083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie
7402083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airliestatic struct tgsi_texture_offset
7412083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlietgsi_default_texture_offset( void )
7422083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie{
7432083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie   struct tgsi_texture_offset texture_offset;
7442083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie
7452083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie   texture_offset.Index = 0;
7462083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie   texture_offset.File = 0;
7472083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie   texture_offset.SwizzleX = 0;
7482083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie   texture_offset.SwizzleY = 0;
7492083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie   texture_offset.SwizzleZ = 0;
7502083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie   texture_offset.Padding = 0;
7512083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie
7522083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie   return texture_offset;
7532083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie}
7542083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie
7552083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airliestatic struct tgsi_texture_offset
7562083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlietgsi_build_texture_offset(
7572083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie   int index, int file, int swizzle_x, int swizzle_y, int swizzle_z,
7582083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie   struct tgsi_token *prev_token,
7592083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie   struct tgsi_instruction *instruction,
7602083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie   struct tgsi_header *header )
7612083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie{
7622083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie   struct tgsi_texture_offset texture_offset;
7632083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie
7642083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie   texture_offset.Index = index;
7652083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie   texture_offset.File = file;
7662083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie   texture_offset.SwizzleX = swizzle_x;
7672083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie   texture_offset.SwizzleY = swizzle_y;
7682083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie   texture_offset.SwizzleZ = swizzle_z;
7692083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie   texture_offset.Padding = 0;
7702083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie
7712083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie   instruction_grow( instruction, header );
7722083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie
7732083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie   return texture_offset;
7742083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie}
7752083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie
776420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krolstatic struct tgsi_src_register
777420400f67fce15512a8fcab770dde83a3eacc5ccMichal Kroltgsi_default_src_register( void )
778420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol{
779420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   struct tgsi_src_register src_register;
780420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
781420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   src_register.File = TGSI_FILE_NULL;
782420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   src_register.SwizzleX = TGSI_SWIZZLE_X;
783420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   src_register.SwizzleY = TGSI_SWIZZLE_Y;
784420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   src_register.SwizzleZ = TGSI_SWIZZLE_Z;
785420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   src_register.SwizzleW = TGSI_SWIZZLE_W;
786420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   src_register.Negate = 0;
787420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   src_register.Absolute = 0;
788420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   src_register.Indirect = 0;
789420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   src_register.Dimension = 0;
790420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   src_register.Index = 0;
791420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
792420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   return src_register;
793420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol}
794420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
795420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krolstatic struct tgsi_src_register
796420400f67fce15512a8fcab770dde83a3eacc5ccMichal Kroltgsi_build_src_register(
797420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   unsigned file,
798420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   unsigned swizzle_x,
799420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   unsigned swizzle_y,
800420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   unsigned swizzle_z,
801420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   unsigned swizzle_w,
802420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   unsigned negate,
803420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   unsigned absolute,
804420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   unsigned indirect,
805420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   unsigned dimension,
806420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   int index,
807420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   struct tgsi_instruction *instruction,
808420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   struct tgsi_header *header )
809420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol{
810420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   struct tgsi_src_register   src_register;
811420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
812420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   assert( file < TGSI_FILE_COUNT );
813420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   assert( swizzle_x <= TGSI_SWIZZLE_W );
814420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   assert( swizzle_y <= TGSI_SWIZZLE_W );
815420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   assert( swizzle_z <= TGSI_SWIZZLE_W );
816420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   assert( swizzle_w <= TGSI_SWIZZLE_W );
817420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   assert( negate <= 1 );
818420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   assert( index >= -0x8000 && index <= 0x7FFF );
819420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
820420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   src_register.File = file;
821420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   src_register.SwizzleX = swizzle_x;
822420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   src_register.SwizzleY = swizzle_y;
823420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   src_register.SwizzleZ = swizzle_z;
824420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   src_register.SwizzleW = swizzle_w;
825420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   src_register.Negate = negate;
826420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   src_register.Absolute = absolute;
827420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   src_register.Indirect = indirect;
828420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   src_register.Dimension = dimension;
829420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   src_register.Index = index;
830420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
831420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   instruction_grow( instruction, header );
832420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
833420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   return src_register;
834420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol}
835420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
836420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krolstatic struct tgsi_dimension
837420400f67fce15512a8fcab770dde83a3eacc5ccMichal Kroltgsi_default_dimension( void )
838420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol{
839420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   struct tgsi_dimension dimension;
840420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
841420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   dimension.Indirect = 0;
842420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   dimension.Dimension = 0;
843420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   dimension.Padding = 0;
844420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   dimension.Index = 0;
845420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
846420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   return dimension;
847420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol}
848420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
849420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krolstatic struct tgsi_full_src_register
850420400f67fce15512a8fcab770dde83a3eacc5ccMichal Kroltgsi_default_full_src_register( void )
851420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol{
852420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   struct tgsi_full_src_register full_src_register;
853420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
854420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   full_src_register.Register = tgsi_default_src_register();
855420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   full_src_register.Indirect = tgsi_default_src_register();
856420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   full_src_register.Dimension = tgsi_default_dimension();
857420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   full_src_register.DimIndirect = tgsi_default_src_register();
858420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
859420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   return full_src_register;
860420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol}
861420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
862420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krolstatic struct tgsi_dimension
863420400f67fce15512a8fcab770dde83a3eacc5ccMichal Kroltgsi_build_dimension(
864420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   unsigned indirect,
865420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   unsigned index,
866420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   struct tgsi_instruction *instruction,
867420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   struct tgsi_header *header )
868420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol{
869420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   struct tgsi_dimension dimension;
870420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
871420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   dimension.Indirect = indirect;
872420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   dimension.Dimension = 0;
873420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   dimension.Padding = 0;
874420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   dimension.Index = index;
875420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
876420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   instruction_grow( instruction, header );
877420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
878420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   return dimension;
879420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol}
880420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
881420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krolstatic struct tgsi_dst_register
882420400f67fce15512a8fcab770dde83a3eacc5ccMichal Kroltgsi_default_dst_register( void )
883420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol{
884420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   struct tgsi_dst_register dst_register;
885420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
886420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   dst_register.File = TGSI_FILE_NULL;
887420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   dst_register.WriteMask = TGSI_WRITEMASK_XYZW;
888420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   dst_register.Indirect = 0;
889420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   dst_register.Dimension = 0;
890420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   dst_register.Index = 0;
891420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   dst_register.Padding = 0;
892420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
893420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   return dst_register;
894420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol}
895420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
896420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krolstatic struct tgsi_dst_register
897420400f67fce15512a8fcab770dde83a3eacc5ccMichal Kroltgsi_build_dst_register(
898420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   unsigned file,
899420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   unsigned mask,
900420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   unsigned indirect,
901420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   unsigned dimension,
902420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   int index,
903420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   struct tgsi_instruction *instruction,
904420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   struct tgsi_header *header )
905420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol{
906420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   struct tgsi_dst_register dst_register;
907420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
908420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   assert( file < TGSI_FILE_COUNT );
909420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   assert( mask <= TGSI_WRITEMASK_XYZW );
910420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   assert( index >= -32768 && index <= 32767 );
911420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
912420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   dst_register.File = file;
913420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   dst_register.WriteMask = mask;
914420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   dst_register.Indirect = indirect;
915420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   dst_register.Dimension = dimension;
916420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   dst_register.Index = index;
917420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   dst_register.Padding = 0;
918420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
919420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   instruction_grow( instruction, header );
920420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
921420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   return dst_register;
922420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol}
923420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
924420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krolstatic struct tgsi_full_dst_register
925420400f67fce15512a8fcab770dde83a3eacc5ccMichal Kroltgsi_default_full_dst_register( void )
926420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol{
927420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   struct tgsi_full_dst_register full_dst_register;
928420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
929420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   full_dst_register.Register = tgsi_default_dst_register();
930420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   full_dst_register.Indirect = tgsi_default_src_register();
931420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   full_dst_register.Dimension = tgsi_default_dimension();
932420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   full_dst_register.DimIndirect = tgsi_default_src_register();
933420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
934420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   return full_dst_register;
935420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol}
936420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
937420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krolstruct tgsi_full_instruction
938420400f67fce15512a8fcab770dde83a3eacc5ccMichal Kroltgsi_default_full_instruction( void )
939420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol{
940420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   struct tgsi_full_instruction full_instruction;
941420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   unsigned i;
942420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
943420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   full_instruction.Instruction = tgsi_default_instruction();
944420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   full_instruction.Predicate = tgsi_default_instruction_predicate();
945420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   full_instruction.Label = tgsi_default_instruction_label();
946420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   full_instruction.Texture = tgsi_default_instruction_texture();
9472083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie   for( i = 0;  i < TGSI_FULL_MAX_TEX_OFFSETS; i++ ) {
9482083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie      full_instruction.TexOffsets[i] = tgsi_default_texture_offset();
9492083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie   }
950420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   for( i = 0;  i < TGSI_FULL_MAX_DST_REGISTERS; i++ ) {
951420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol      full_instruction.Dst[i] = tgsi_default_full_dst_register();
952420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   }
953420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   for( i = 0;  i < TGSI_FULL_MAX_SRC_REGISTERS; i++ ) {
954420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol      full_instruction.Src[i] = tgsi_default_full_src_register();
955420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   }
956420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
957420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   return full_instruction;
958420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol}
959420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
960420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krolunsigned
961420400f67fce15512a8fcab770dde83a3eacc5ccMichal Kroltgsi_build_full_instruction(
962420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   const struct tgsi_full_instruction *full_inst,
963420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   struct  tgsi_token *tokens,
964420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   struct  tgsi_header *header,
965420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   unsigned  maxsize )
966420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol{
967420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   unsigned size = 0;
968420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   unsigned i;
969420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   struct tgsi_instruction *instruction;
970420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   struct tgsi_token *prev_token;
971420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
972420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   if( maxsize <= size )
973420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol      return 0;
974420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   instruction = (struct tgsi_instruction *) &tokens[size];
975420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   size++;
976420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
977420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   *instruction = tgsi_build_instruction(full_inst->Instruction.Opcode,
978420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol                                         full_inst->Instruction.Saturate,
979420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol                                         full_inst->Instruction.Predicate,
980420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol                                         full_inst->Instruction.NumDstRegs,
981420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol                                         full_inst->Instruction.NumSrcRegs,
982420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol                                         header);
983420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   prev_token = (struct tgsi_token  *) instruction;
984420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol
985420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krol   if (full_inst->Instruction.Predicate) {
9865ee0d9f632383339088cc33005b7794b0915d4e0Michal Krol      struct tgsi_instruction_predicate *instruction_predicate;
9875ee0d9f632383339088cc33005b7794b0915d4e0Michal Krol
9885ee0d9f632383339088cc33005b7794b0915d4e0Michal Krol      if (maxsize <= size) {
9895ee0d9f632383339088cc33005b7794b0915d4e0Michal Krol         return 0;
9905ee0d9f632383339088cc33005b7794b0915d4e0Michal Krol      }
9915ee0d9f632383339088cc33005b7794b0915d4e0Michal Krol      instruction_predicate = (struct tgsi_instruction_predicate *)&tokens[size];
9925ee0d9f632383339088cc33005b7794b0915d4e0Michal Krol      size++;
9935ee0d9f632383339088cc33005b7794b0915d4e0Michal Krol
9945ee0d9f632383339088cc33005b7794b0915d4e0Michal Krol      *instruction_predicate =
9957d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell         tgsi_build_instruction_predicate(full_inst->Predicate.Index,
9967d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell                                          full_inst->Predicate.Negate,
9977d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell                                          full_inst->Predicate.SwizzleX,
9987d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell                                          full_inst->Predicate.SwizzleY,
9997d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell                                          full_inst->Predicate.SwizzleZ,
10007d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell                                          full_inst->Predicate.SwizzleW,
10015ee0d9f632383339088cc33005b7794b0915d4e0Michal Krol                                          instruction,
10025ee0d9f632383339088cc33005b7794b0915d4e0Michal Krol                                          header);
10035ee0d9f632383339088cc33005b7794b0915d4e0Michal Krol   }
10045ee0d9f632383339088cc33005b7794b0915d4e0Michal Krol
1005e13add8cae4637d9cd2f6c40c68de30701736abfMichal Krol   if (full_inst->Instruction.Label) {
1006ba1ca28cc62fed71c77902b95ae4ed36c6bf25f8Keith Whitwell      struct tgsi_instruction_label *instruction_label;
1007ffe58739da9eee2e99682747cc8f26e412c87430michal
1008ffe58739da9eee2e99682747cc8f26e412c87430michal      if( maxsize <= size )
1009ffe58739da9eee2e99682747cc8f26e412c87430michal         return 0;
1010ba1ca28cc62fed71c77902b95ae4ed36c6bf25f8Keith Whitwell      instruction_label =
1011ba1ca28cc62fed71c77902b95ae4ed36c6bf25f8Keith Whitwell         (struct  tgsi_instruction_label *) &tokens[size];
1012ffe58739da9eee2e99682747cc8f26e412c87430michal      size++;
1013ffe58739da9eee2e99682747cc8f26e412c87430michal
1014ba1ca28cc62fed71c77902b95ae4ed36c6bf25f8Keith Whitwell      *instruction_label = tgsi_build_instruction_label(
10157d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell         full_inst->Label.Label,
1016ffe58739da9eee2e99682747cc8f26e412c87430michal         prev_token,
1017ffe58739da9eee2e99682747cc8f26e412c87430michal         instruction,
1018ffe58739da9eee2e99682747cc8f26e412c87430michal         header );
1019ba1ca28cc62fed71c77902b95ae4ed36c6bf25f8Keith Whitwell      prev_token = (struct tgsi_token  *) instruction_label;
1020ffe58739da9eee2e99682747cc8f26e412c87430michal   }
1021ffe58739da9eee2e99682747cc8f26e412c87430michal
1022e13add8cae4637d9cd2f6c40c68de30701736abfMichal Krol   if (full_inst->Instruction.Texture) {
1023ba1ca28cc62fed71c77902b95ae4ed36c6bf25f8Keith Whitwell      struct tgsi_instruction_texture *instruction_texture;
1024ffe58739da9eee2e99682747cc8f26e412c87430michal
1025ffe58739da9eee2e99682747cc8f26e412c87430michal      if( maxsize <= size )
1026ffe58739da9eee2e99682747cc8f26e412c87430michal         return 0;
1027ba1ca28cc62fed71c77902b95ae4ed36c6bf25f8Keith Whitwell      instruction_texture =
1028ba1ca28cc62fed71c77902b95ae4ed36c6bf25f8Keith Whitwell         (struct  tgsi_instruction_texture *) &tokens[size];
1029ffe58739da9eee2e99682747cc8f26e412c87430michal      size++;
1030ffe58739da9eee2e99682747cc8f26e412c87430michal
1031ba1ca28cc62fed71c77902b95ae4ed36c6bf25f8Keith Whitwell      *instruction_texture = tgsi_build_instruction_texture(
10327d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell         full_inst->Texture.Texture,
10332083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie	 full_inst->Texture.NumOffsets,
1034ffe58739da9eee2e99682747cc8f26e412c87430michal         prev_token,
1035ffe58739da9eee2e99682747cc8f26e412c87430michal         instruction,
1036ffe58739da9eee2e99682747cc8f26e412c87430michal         header   );
1037ba1ca28cc62fed71c77902b95ae4ed36c6bf25f8Keith Whitwell      prev_token = (struct tgsi_token  *) instruction_texture;
1038ffe58739da9eee2e99682747cc8f26e412c87430michal
10392083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie      for (i = 0; i < full_inst->Texture.NumOffsets; i++) {
10402083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie         struct tgsi_texture_offset *texture_offset;
10412083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie
10422083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie         if ( maxsize <= size )
10432083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie            return 0;
10442083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie	 texture_offset = (struct tgsi_texture_offset *)&tokens[size];
10452083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie         size++;
10462083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie         *texture_offset = tgsi_build_texture_offset(
10472083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie            full_inst->TexOffsets[i].Index,
10482083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie            full_inst->TexOffsets[i].File,
10492083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie            full_inst->TexOffsets[i].SwizzleX,
10502083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie            full_inst->TexOffsets[i].SwizzleY,
10512083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie            full_inst->TexOffsets[i].SwizzleZ,
10522083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie            prev_token,
10532083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie            instruction,
10542083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie            header);
10552083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie         prev_token = (struct tgsi_token *) texture_offset;
10562083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie      }
10572083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie   }
1058ffe58739da9eee2e99682747cc8f26e412c87430michal   for( i = 0;  i <   full_inst->Instruction.NumDstRegs; i++ ) {
10597d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell      const struct tgsi_full_dst_register *reg = &full_inst->Dst[i];
1060ffe58739da9eee2e99682747cc8f26e412c87430michal      struct tgsi_dst_register *dst_register;
1061ffe58739da9eee2e99682747cc8f26e412c87430michal
1062ffe58739da9eee2e99682747cc8f26e412c87430michal      if( maxsize <= size )
1063ffe58739da9eee2e99682747cc8f26e412c87430michal         return 0;
1064ffe58739da9eee2e99682747cc8f26e412c87430michal      dst_register = (struct tgsi_dst_register *) &tokens[size];
1065ffe58739da9eee2e99682747cc8f26e412c87430michal      size++;
1066ffe58739da9eee2e99682747cc8f26e412c87430michal
1067ffe58739da9eee2e99682747cc8f26e412c87430michal      *dst_register = tgsi_build_dst_register(
10685b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell         reg->Register.File,
10695b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell         reg->Register.WriteMask,
10705b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell         reg->Register.Indirect,
1071101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin         reg->Register.Dimension,
10725b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell         reg->Register.Index,
1073ffe58739da9eee2e99682747cc8f26e412c87430michal         instruction,
1074ffe58739da9eee2e99682747cc8f26e412c87430michal         header );
1075ffe58739da9eee2e99682747cc8f26e412c87430michal
10765b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell      if( reg->Register.Indirect ) {
1077baa7ff47d548cdcc1ea68657ee1b0500f78041beBrian Paul         struct tgsi_src_register *ind;
1078baa7ff47d548cdcc1ea68657ee1b0500f78041beBrian Paul
1079baa7ff47d548cdcc1ea68657ee1b0500f78041beBrian Paul         if( maxsize <= size )
1080baa7ff47d548cdcc1ea68657ee1b0500f78041beBrian Paul            return 0;
1081baa7ff47d548cdcc1ea68657ee1b0500f78041beBrian Paul         ind = (struct tgsi_src_register *) &tokens[size];
1082baa7ff47d548cdcc1ea68657ee1b0500f78041beBrian Paul         size++;
1083baa7ff47d548cdcc1ea68657ee1b0500f78041beBrian Paul
1084baa7ff47d548cdcc1ea68657ee1b0500f78041beBrian Paul         *ind = tgsi_build_src_register(
10855b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell            reg->Indirect.File,
10865b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell            reg->Indirect.SwizzleX,
10875b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell            reg->Indirect.SwizzleY,
10885b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell            reg->Indirect.SwizzleZ,
10895b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell            reg->Indirect.SwizzleW,
10905b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell            reg->Indirect.Negate,
10915b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell            reg->Indirect.Absolute,
10925b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell            reg->Indirect.Indirect,
10935b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell            reg->Indirect.Dimension,
10945b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell            reg->Indirect.Index,
1095baa7ff47d548cdcc1ea68657ee1b0500f78041beBrian Paul            instruction,
1096baa7ff47d548cdcc1ea68657ee1b0500f78041beBrian Paul            header );
1097baa7ff47d548cdcc1ea68657ee1b0500f78041beBrian Paul      }
1098101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin
1099101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin      if( reg->Register.Dimension ) {
1100101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin         struct  tgsi_dimension *dim;
1101101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin
1102101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin         assert( !reg->Dimension.Dimension );
1103101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin
1104101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin         if( maxsize <= size )
1105101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin            return 0;
1106101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin         dim = (struct tgsi_dimension *) &tokens[size];
1107101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin         size++;
1108101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin
1109101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin         *dim = tgsi_build_dimension(
1110101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin            reg->Dimension.Indirect,
1111101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin            reg->Dimension.Index,
1112101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin            instruction,
1113101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin            header );
1114101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin
1115101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin         if( reg->Dimension.Indirect ) {
1116101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin            struct tgsi_src_register *ind;
1117101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin
1118101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin            if( maxsize <= size )
1119101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin               return 0;
1120101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin            ind = (struct tgsi_src_register *) &tokens[size];
1121101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin            size++;
1122101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin
1123101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin            *ind = tgsi_build_src_register(
1124101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin               reg->DimIndirect.File,
1125101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin               reg->DimIndirect.SwizzleX,
1126101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin               reg->DimIndirect.SwizzleY,
1127101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin               reg->DimIndirect.SwizzleZ,
1128101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin               reg->DimIndirect.SwizzleW,
1129101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin               reg->DimIndirect.Negate,
1130101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin               reg->DimIndirect.Absolute,
1131101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin               reg->DimIndirect.Indirect,
1132101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin               reg->DimIndirect.Dimension,
1133101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin               reg->DimIndirect.Index,
1134101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin               instruction,
1135101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin               header );
1136101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin         }
1137101f792a2af9c9a19a050afba8b60caa689466a5Zack Rusin      }
1138ffe58739da9eee2e99682747cc8f26e412c87430michal   }
1139ffe58739da9eee2e99682747cc8f26e412c87430michal
1140ffe58739da9eee2e99682747cc8f26e412c87430michal   for( i = 0;  i < full_inst->Instruction.NumSrcRegs; i++ ) {
11417d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell      const struct tgsi_full_src_register *reg = &full_inst->Src[i];
1142ffe58739da9eee2e99682747cc8f26e412c87430michal      struct tgsi_src_register *src_register;
1143ffe58739da9eee2e99682747cc8f26e412c87430michal
1144ffe58739da9eee2e99682747cc8f26e412c87430michal      if( maxsize <= size )
1145ffe58739da9eee2e99682747cc8f26e412c87430michal         return 0;
1146ffe58739da9eee2e99682747cc8f26e412c87430michal      src_register = (struct tgsi_src_register *)  &tokens[size];
1147ffe58739da9eee2e99682747cc8f26e412c87430michal      size++;
1148ffe58739da9eee2e99682747cc8f26e412c87430michal
1149ffe58739da9eee2e99682747cc8f26e412c87430michal      *src_register = tgsi_build_src_register(
115091a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell         reg->Register.File,
115191a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell         reg->Register.SwizzleX,
115291a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell         reg->Register.SwizzleY,
115391a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell         reg->Register.SwizzleZ,
115491a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell         reg->Register.SwizzleW,
115591a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell         reg->Register.Negate,
115691a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell         reg->Register.Absolute,
115791a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell         reg->Register.Indirect,
115891a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell         reg->Register.Dimension,
115991a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell         reg->Register.Index,
1160ffe58739da9eee2e99682747cc8f26e412c87430michal         instruction,
1161ffe58739da9eee2e99682747cc8f26e412c87430michal         header );
1162ffe58739da9eee2e99682747cc8f26e412c87430michal
116391a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell      if( reg->Register.Indirect ) {
1164ffe58739da9eee2e99682747cc8f26e412c87430michal         struct  tgsi_src_register *ind;
1165ffe58739da9eee2e99682747cc8f26e412c87430michal
1166ffe58739da9eee2e99682747cc8f26e412c87430michal         if( maxsize <= size )
1167ffe58739da9eee2e99682747cc8f26e412c87430michal            return 0;
1168ffe58739da9eee2e99682747cc8f26e412c87430michal         ind = (struct tgsi_src_register *) &tokens[size];
1169ffe58739da9eee2e99682747cc8f26e412c87430michal         size++;
1170ffe58739da9eee2e99682747cc8f26e412c87430michal
1171ffe58739da9eee2e99682747cc8f26e412c87430michal         *ind = tgsi_build_src_register(
117291a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell            reg->Indirect.File,
117391a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell            reg->Indirect.SwizzleX,
117491a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell            reg->Indirect.SwizzleY,
117591a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell            reg->Indirect.SwizzleZ,
117691a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell            reg->Indirect.SwizzleW,
117791a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell            reg->Indirect.Negate,
117891a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell            reg->Indirect.Absolute,
117991a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell            reg->Indirect.Indirect,
118091a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell            reg->Indirect.Dimension,
118191a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell            reg->Indirect.Index,
1182ffe58739da9eee2e99682747cc8f26e412c87430michal            instruction,
1183ffe58739da9eee2e99682747cc8f26e412c87430michal            header );
1184ffe58739da9eee2e99682747cc8f26e412c87430michal      }
1185ffe58739da9eee2e99682747cc8f26e412c87430michal
118691a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell      if( reg->Register.Dimension ) {
1187ffe58739da9eee2e99682747cc8f26e412c87430michal         struct  tgsi_dimension *dim;
1188ffe58739da9eee2e99682747cc8f26e412c87430michal
118991a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell         assert( !reg->Dimension.Dimension );
1190ffe58739da9eee2e99682747cc8f26e412c87430michal
1191ffe58739da9eee2e99682747cc8f26e412c87430michal         if( maxsize <= size )
1192ffe58739da9eee2e99682747cc8f26e412c87430michal            return 0;
1193ffe58739da9eee2e99682747cc8f26e412c87430michal         dim = (struct tgsi_dimension *) &tokens[size];
1194ffe58739da9eee2e99682747cc8f26e412c87430michal         size++;
1195ffe58739da9eee2e99682747cc8f26e412c87430michal
1196ffe58739da9eee2e99682747cc8f26e412c87430michal         *dim = tgsi_build_dimension(
119791a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell            reg->Dimension.Indirect,
119891a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell            reg->Dimension.Index,
1199ffe58739da9eee2e99682747cc8f26e412c87430michal            instruction,
1200ffe58739da9eee2e99682747cc8f26e412c87430michal            header );
1201ffe58739da9eee2e99682747cc8f26e412c87430michal
120291a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell         if( reg->Dimension.Indirect ) {
1203ffe58739da9eee2e99682747cc8f26e412c87430michal            struct tgsi_src_register *ind;
1204ffe58739da9eee2e99682747cc8f26e412c87430michal
1205ffe58739da9eee2e99682747cc8f26e412c87430michal            if( maxsize <= size )
1206ffe58739da9eee2e99682747cc8f26e412c87430michal               return 0;
1207ffe58739da9eee2e99682747cc8f26e412c87430michal            ind = (struct tgsi_src_register *) &tokens[size];
1208ffe58739da9eee2e99682747cc8f26e412c87430michal            size++;
1209ffe58739da9eee2e99682747cc8f26e412c87430michal
1210ffe58739da9eee2e99682747cc8f26e412c87430michal            *ind = tgsi_build_src_register(
121191a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell               reg->DimIndirect.File,
121291a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell               reg->DimIndirect.SwizzleX,
121391a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell               reg->DimIndirect.SwizzleY,
121491a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell               reg->DimIndirect.SwizzleZ,
121591a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell               reg->DimIndirect.SwizzleW,
121691a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell               reg->DimIndirect.Negate,
121791a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell               reg->DimIndirect.Absolute,
121891a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell               reg->DimIndirect.Indirect,
121991a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell               reg->DimIndirect.Dimension,
122091a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell               reg->DimIndirect.Index,
1221ffe58739da9eee2e99682747cc8f26e412c87430michal               instruction,
1222ffe58739da9eee2e99682747cc8f26e412c87430michal               header );
1223ffe58739da9eee2e99682747cc8f26e412c87430michal         }
1224ffe58739da9eee2e99682747cc8f26e412c87430michal      }
1225ffe58739da9eee2e99682747cc8f26e412c87430michal   }
1226ffe58739da9eee2e99682747cc8f26e412c87430michal
1227ffe58739da9eee2e99682747cc8f26e412c87430michal   return size;
1228ffe58739da9eee2e99682747cc8f26e412c87430michal}
1229ffe58739da9eee2e99682747cc8f26e412c87430michal
1230420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krolstatic struct tgsi_property
12313ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusintgsi_default_property( void )
12323ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin{
12333ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   struct tgsi_property property;
12343ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin
12353ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   property.Type = TGSI_TOKEN_TYPE_PROPERTY;
12363ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   property.NrTokens = 1;
12373ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   property.PropertyName = TGSI_PROPERTY_GS_INPUT_PRIM;
12383ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   property.Padding = 0;
12393ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin
12403ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   return property;
12413ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin}
12423ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin
1243420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krolstatic struct tgsi_property
12443ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusintgsi_build_property(unsigned property_name,
12453ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin                    struct tgsi_header *header)
12463ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin{
12473ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   struct tgsi_property property;
12483ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin
12493ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   property = tgsi_default_property();
12503ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   property.PropertyName = property_name;
12513ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin
12523ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   header_bodysize_grow( header );
12533ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin
12543ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   return property;
12553ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin}
12563ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin
12573ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin
12583ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusinstruct tgsi_full_property
12593ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusintgsi_default_full_property( void )
12603ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin{
12613ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   struct tgsi_full_property  full_property;
12623ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin
12633ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   full_property.Property  = tgsi_default_property();
12643ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   memset(full_property.u, 0,
12653ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin          sizeof(struct tgsi_property_data) * 8);
12663ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin
12673ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   return full_property;
12683ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin}
12693ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin
12703ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusinstatic void
12713ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusinproperty_grow(
12723ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   struct tgsi_property *property,
12733ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   struct tgsi_header *header )
12743ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin{
12753ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   assert( property->NrTokens < 0xFF );
12763ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin
12773ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   property->NrTokens++;
12783ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin
12793ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   header_bodysize_grow( header );
12803ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin}
12813ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin
1282420400f67fce15512a8fcab770dde83a3eacc5ccMichal Krolstatic struct tgsi_property_data
12833ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusintgsi_build_property_data(
12843ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   unsigned value,
12853ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   struct tgsi_property *property,
12863ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   struct tgsi_header *header )
12873ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin{
12883ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   struct tgsi_property_data property_data;
12893ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin
12903ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   property_data.Data = value;
12913ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin
12923ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   property_grow( property, header );
12933ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin
12943ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   return property_data;
12953ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin}
12963ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin
12973ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusinunsigned
12983ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusintgsi_build_full_property(
12993ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   const struct tgsi_full_property *full_prop,
13003ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   struct tgsi_token *tokens,
13013ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   struct tgsi_header *header,
13023ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   unsigned maxsize )
13033ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin{
13043ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   unsigned size = 0, i;
13053ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   struct tgsi_property *property;
13063ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin
13073ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   if( maxsize <= size )
13083ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin      return 0;
13093ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   property = (struct tgsi_property *) &tokens[size];
13103ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   size++;
13113ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin
13123ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   *property = tgsi_build_property(
1313960be012a9d185c80bfcb9ff5c3781314dfb7b25Zack Rusin      full_prop->Property.PropertyName,
13143ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin      header );
13153ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin
13163ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   assert( full_prop->Property.NrTokens <= 8 + 1 );
13173ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin
13183ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   for( i = 0; i < full_prop->Property.NrTokens - 1; i++ ) {
13193ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin      struct tgsi_property_data *data;
13203ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin
13213ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin      if( maxsize <= size )
13223ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin         return  0;
13233ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin      data = (struct tgsi_property_data *) &tokens[size];
13243ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin      size++;
13253ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin
13263ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin      *data = tgsi_build_property_data(
13273ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin         full_prop->u[i].Data,
13283ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin         property,
13293ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin         header );
13303ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   }
13313ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin
13323ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin   return size;
13333ff688ea299581e60caf5d6e1a464f68c717fe83Zack Rusin}
1334