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