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