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