1848b8605Smrg/************************************************************************** 2848b8605Smrg * 3848b8605Smrg * Copyright 2009 VMware, Inc. 4848b8605Smrg * All Rights Reserved. 5848b8605Smrg * 6848b8605Smrg * Permission is hereby granted, free of charge, to any person obtaining a 7848b8605Smrg * copy of this software and associated documentation files (the 8848b8605Smrg * "Software"), to deal in the Software without restriction, including 9848b8605Smrg * without limitation the rights to use, copy, modify, merge, publish, 10848b8605Smrg * distribute, sub license, and/or sell copies of the Software, and to 11848b8605Smrg * permit persons to whom the Software is furnished to do so, subject to 12848b8605Smrg * the following conditions: 13848b8605Smrg * 14848b8605Smrg * The above copyright notice and this permission notice (including the 15848b8605Smrg * next paragraph) shall be included in all copies or substantial portions 16848b8605Smrg * of the Software. 17848b8605Smrg * 18848b8605Smrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 19848b8605Smrg * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20848b8605Smrg * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 21848b8605Smrg * IN NO EVENT SHALL VMWARE, INC AND/OR ITS SUPPLIERS BE LIABLE FOR 22848b8605Smrg * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 23848b8605Smrg * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 24848b8605Smrg * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25848b8605Smrg * 26848b8605Smrg **************************************************************************/ 27848b8605Smrg 28848b8605Smrg#ifndef TGSI_UREG_H 29848b8605Smrg#define TGSI_UREG_H 30848b8605Smrg 31b8e80941Smrg#include "pipe/p_format.h" 32848b8605Smrg#include "pipe/p_compiler.h" 33848b8605Smrg#include "pipe/p_shader_tokens.h" 34848b8605Smrg#include "util/u_debug.h" 35848b8605Smrg 36848b8605Smrg#ifdef __cplusplus 37848b8605Smrgextern "C" { 38848b8605Smrg#endif 39848b8605Smrg 40b8e80941Smrgstruct pipe_screen; 41848b8605Smrgstruct ureg_program; 42848b8605Smrgstruct pipe_stream_output_info; 43848b8605Smrg 44848b8605Smrg/* Almost a tgsi_src_register, but we need to pull in the Absolute 45848b8605Smrg * flag from the _ext token. Indirect flag always implies ADDR[0]. 46848b8605Smrg */ 47848b8605Smrgstruct ureg_src 48848b8605Smrg{ 49848b8605Smrg unsigned File : 4; /* TGSI_FILE_ */ 50848b8605Smrg unsigned SwizzleX : 2; /* TGSI_SWIZZLE_ */ 51848b8605Smrg unsigned SwizzleY : 2; /* TGSI_SWIZZLE_ */ 52848b8605Smrg unsigned SwizzleZ : 2; /* TGSI_SWIZZLE_ */ 53848b8605Smrg unsigned SwizzleW : 2; /* TGSI_SWIZZLE_ */ 54848b8605Smrg unsigned Indirect : 1; /* BOOL */ 55848b8605Smrg unsigned DimIndirect : 1; /* BOOL */ 56848b8605Smrg unsigned Dimension : 1; /* BOOL */ 57848b8605Smrg unsigned Absolute : 1; /* BOOL */ 58848b8605Smrg unsigned Negate : 1; /* BOOL */ 59848b8605Smrg unsigned IndirectFile : 4; /* TGSI_FILE_ */ 60848b8605Smrg unsigned IndirectSwizzle : 2; /* TGSI_SWIZZLE_ */ 61848b8605Smrg unsigned DimIndFile : 4; /* TGSI_FILE_ */ 62848b8605Smrg unsigned DimIndSwizzle : 2; /* TGSI_SWIZZLE_ */ 63848b8605Smrg int Index : 16; /* SINT */ 64848b8605Smrg int IndirectIndex : 16; /* SINT */ 65848b8605Smrg int DimensionIndex : 16; /* SINT */ 66848b8605Smrg int DimIndIndex : 16; /* SINT */ 67848b8605Smrg unsigned ArrayID : 10; /* UINT */ 68848b8605Smrg}; 69848b8605Smrg 70848b8605Smrg/* Very similar to a tgsi_dst_register, removing unsupported fields 71848b8605Smrg * and adding a Saturate flag. It's easier to push saturate into the 72848b8605Smrg * destination register than to try and create a _SAT variant of each 73848b8605Smrg * instruction function. 74848b8605Smrg */ 75848b8605Smrgstruct ureg_dst 76848b8605Smrg{ 77848b8605Smrg unsigned File : 4; /* TGSI_FILE_ */ 78848b8605Smrg unsigned WriteMask : 4; /* TGSI_WRITEMASK_ */ 79848b8605Smrg unsigned Indirect : 1; /* BOOL */ 80b8e80941Smrg unsigned DimIndirect : 1; /* BOOL */ 81b8e80941Smrg unsigned Dimension : 1; /* BOOL */ 82848b8605Smrg unsigned Saturate : 1; /* BOOL */ 83b8e80941Smrg unsigned Invariant : 1; /* BOOL */ 84848b8605Smrg int Index : 16; /* SINT */ 85848b8605Smrg int IndirectIndex : 16; /* SINT */ 86848b8605Smrg unsigned IndirectFile : 4; /* TGSI_FILE_ */ 87848b8605Smrg int IndirectSwizzle : 2; /* TGSI_SWIZZLE_ */ 88b8e80941Smrg unsigned DimIndFile : 4; /* TGSI_FILE_ */ 89b8e80941Smrg unsigned DimIndSwizzle : 2; /* TGSI_SWIZZLE_ */ 90b8e80941Smrg int DimensionIndex : 16; /* SINT */ 91b8e80941Smrg int DimIndIndex : 16; /* SINT */ 92848b8605Smrg unsigned ArrayID : 10; /* UINT */ 93848b8605Smrg}; 94848b8605Smrg 95848b8605Smrgstruct pipe_context; 96848b8605Smrg 97848b8605Smrgstruct ureg_program * 98b8e80941Smrgureg_create(enum pipe_shader_type processor); 99b8e80941Smrg 100b8e80941Smrgstruct ureg_program * 101b8e80941Smrgureg_create_with_screen(enum pipe_shader_type processor, 102b8e80941Smrg struct pipe_screen *screen); 103848b8605Smrg 104848b8605Smrgconst struct tgsi_token * 105848b8605Smrgureg_finalize( struct ureg_program * ); 106848b8605Smrg 107848b8605Smrg/* Create and return a shader: 108848b8605Smrg */ 109848b8605Smrgvoid * 110848b8605Smrgureg_create_shader( struct ureg_program *, 111848b8605Smrg struct pipe_context *pipe, 112848b8605Smrg const struct pipe_stream_output_info *so ); 113848b8605Smrg 114b8e80941Smrgvoid 115b8e80941Smrgureg_set_next_shader_processor(struct ureg_program *ureg, unsigned processor); 116848b8605Smrg 117848b8605Smrg/* Alternately, return the built token stream and hand ownership of 118848b8605Smrg * that memory to the caller: 119848b8605Smrg */ 120848b8605Smrgconst struct tgsi_token * 121848b8605Smrgureg_get_tokens( struct ureg_program *ureg, 122848b8605Smrg unsigned *nr_tokens ); 123848b8605Smrg 124848b8605Smrg/* 125848b8605Smrg * Returns the number of currently declared outputs. 126848b8605Smrg */ 127848b8605Smrgunsigned 128848b8605Smrgureg_get_nr_outputs( const struct ureg_program *ureg ); 129848b8605Smrg 130848b8605Smrg 131848b8605Smrg/* Free the tokens created by ureg_get_tokens() */ 132848b8605Smrgvoid ureg_free_tokens( const struct tgsi_token *tokens ); 133848b8605Smrg 134848b8605Smrg 135848b8605Smrgvoid 136848b8605Smrgureg_destroy( struct ureg_program * ); 137848b8605Smrg 138848b8605Smrg 139848b8605Smrg/*********************************************************************** 140848b8605Smrg * Convenience routine: 141848b8605Smrg */ 142b8e80941Smrgstatic inline void * 143848b8605Smrgureg_create_shader_with_so_and_destroy( struct ureg_program *p, 144848b8605Smrg struct pipe_context *pipe, 145848b8605Smrg const struct pipe_stream_output_info *so ) 146848b8605Smrg{ 147848b8605Smrg void *result = ureg_create_shader( p, pipe, so ); 148848b8605Smrg ureg_destroy( p ); 149848b8605Smrg return result; 150848b8605Smrg} 151848b8605Smrg 152b8e80941Smrgstatic inline void * 153848b8605Smrgureg_create_shader_and_destroy( struct ureg_program *p, 154848b8605Smrg struct pipe_context *pipe ) 155848b8605Smrg{ 156848b8605Smrg return ureg_create_shader_with_so_and_destroy(p, pipe, NULL); 157848b8605Smrg} 158848b8605Smrg 159848b8605Smrg 160848b8605Smrg/*********************************************************************** 161848b8605Smrg * Build shader properties: 162848b8605Smrg */ 163848b8605Smrg 164848b8605Smrgvoid 165b8e80941Smrgureg_property(struct ureg_program *ureg, unsigned name, unsigned value); 166848b8605Smrg 167848b8605Smrg 168848b8605Smrg/*********************************************************************** 169848b8605Smrg * Build shader declarations: 170848b8605Smrg */ 171848b8605Smrg 172b8e80941Smrgstruct ureg_src 173b8e80941Smrgureg_DECL_fs_input_cyl_centroid_layout(struct ureg_program *, 174b8e80941Smrg enum tgsi_semantic semantic_name, 175b8e80941Smrg unsigned semantic_index, 176b8e80941Smrg enum tgsi_interpolate_mode interp_mode, 177b8e80941Smrg unsigned cylindrical_wrap, 178b8e80941Smrg enum tgsi_interpolate_loc interp_location, 179b8e80941Smrg unsigned index, 180b8e80941Smrg unsigned usage_mask, 181b8e80941Smrg unsigned array_id, 182b8e80941Smrg unsigned array_size); 183b8e80941Smrg 184848b8605Smrgstruct ureg_src 185848b8605Smrgureg_DECL_fs_input_cyl_centroid(struct ureg_program *, 186b8e80941Smrg enum tgsi_semantic semantic_name, 187848b8605Smrg unsigned semantic_index, 188b8e80941Smrg enum tgsi_interpolate_mode interp_mode, 189848b8605Smrg unsigned cylindrical_wrap, 190b8e80941Smrg enum tgsi_interpolate_loc interp_location, 191b8e80941Smrg unsigned array_id, 192b8e80941Smrg unsigned array_size); 193848b8605Smrg 194b8e80941Smrgstatic inline struct ureg_src 195848b8605Smrgureg_DECL_fs_input_cyl(struct ureg_program *ureg, 196b8e80941Smrg enum tgsi_semantic semantic_name, 197848b8605Smrg unsigned semantic_index, 198b8e80941Smrg enum tgsi_interpolate_mode interp_mode, 199848b8605Smrg unsigned cylindrical_wrap) 200848b8605Smrg{ 201848b8605Smrg return ureg_DECL_fs_input_cyl_centroid(ureg, 202848b8605Smrg semantic_name, 203848b8605Smrg semantic_index, 204848b8605Smrg interp_mode, 205848b8605Smrg cylindrical_wrap, 206b8e80941Smrg TGSI_INTERPOLATE_LOC_CENTER, 0, 1); 207848b8605Smrg} 208848b8605Smrg 209b8e80941Smrgstatic inline struct ureg_src 210848b8605Smrgureg_DECL_fs_input(struct ureg_program *ureg, 211b8e80941Smrg enum tgsi_semantic semantic_name, 212848b8605Smrg unsigned semantic_index, 213b8e80941Smrg enum tgsi_interpolate_mode interp_mode) 214848b8605Smrg{ 215848b8605Smrg return ureg_DECL_fs_input_cyl_centroid(ureg, 216848b8605Smrg semantic_name, 217848b8605Smrg semantic_index, 218848b8605Smrg interp_mode, 219b8e80941Smrg 0, TGSI_INTERPOLATE_LOC_CENTER, 0, 1); 220848b8605Smrg} 221848b8605Smrg 222848b8605Smrgstruct ureg_src 223848b8605Smrgureg_DECL_vs_input( struct ureg_program *, 224848b8605Smrg unsigned index ); 225848b8605Smrg 226848b8605Smrgstruct ureg_src 227b8e80941Smrgureg_DECL_input_layout(struct ureg_program *, 228b8e80941Smrg enum tgsi_semantic semantic_name, 229b8e80941Smrg unsigned semantic_index, 230b8e80941Smrg unsigned index, 231b8e80941Smrg unsigned usage_mask, 232b8e80941Smrg unsigned array_id, 233b8e80941Smrg unsigned array_size); 234b8e80941Smrg 235b8e80941Smrgstruct ureg_src 236b8e80941Smrgureg_DECL_input(struct ureg_program *, 237b8e80941Smrg enum tgsi_semantic semantic_name, 238b8e80941Smrg unsigned semantic_index, 239b8e80941Smrg unsigned array_id, 240b8e80941Smrg unsigned array_size); 241848b8605Smrg 242848b8605Smrgstruct ureg_src 243848b8605Smrgureg_DECL_system_value(struct ureg_program *, 244b8e80941Smrg enum tgsi_semantic semantic_name, 245848b8605Smrg unsigned semantic_index); 246848b8605Smrg 247848b8605Smrgstruct ureg_dst 248b8e80941Smrgureg_DECL_output_layout(struct ureg_program *, 249b8e80941Smrg enum tgsi_semantic semantic_name, 250b8e80941Smrg unsigned semantic_index, 251b8e80941Smrg unsigned streams, 252b8e80941Smrg unsigned index, 253b8e80941Smrg unsigned usage_mask, 254b8e80941Smrg unsigned array_id, 255b8e80941Smrg unsigned array_size, 256b8e80941Smrg boolean invariant); 257b8e80941Smrg 258b8e80941Smrgstruct ureg_dst 259b8e80941Smrgureg_DECL_output_masked(struct ureg_program *, 260b8e80941Smrg enum tgsi_semantic semantic_name, 261b8e80941Smrg unsigned semantic_index, 262b8e80941Smrg unsigned usage_mask, 263b8e80941Smrg unsigned array_id, 264b8e80941Smrg unsigned array_size); 265b8e80941Smrg 266b8e80941Smrgstruct ureg_dst 267b8e80941Smrgureg_DECL_output(struct ureg_program *, 268b8e80941Smrg enum tgsi_semantic semantic_name, 269b8e80941Smrg unsigned semantic_index); 270848b8605Smrg 271848b8605Smrgstruct ureg_dst 272b8e80941Smrgureg_DECL_output_array(struct ureg_program *ureg, 273b8e80941Smrg enum tgsi_semantic semantic_name, 274b8e80941Smrg unsigned semantic_index, 275b8e80941Smrg unsigned array_id, 276b8e80941Smrg unsigned array_size); 277848b8605Smrg 278848b8605Smrgstruct ureg_src 279848b8605Smrgureg_DECL_immediate( struct ureg_program *, 280848b8605Smrg const float *v, 281848b8605Smrg unsigned nr ); 282848b8605Smrg 283b8e80941Smrgstruct ureg_src 284b8e80941Smrgureg_DECL_immediate_f64( struct ureg_program *, 285b8e80941Smrg const double *v, 286b8e80941Smrg unsigned nr ); 287b8e80941Smrg 288848b8605Smrgstruct ureg_src 289848b8605Smrgureg_DECL_immediate_uint( struct ureg_program *, 290848b8605Smrg const unsigned *v, 291848b8605Smrg unsigned nr ); 292848b8605Smrg 293848b8605Smrgstruct ureg_src 294848b8605Smrgureg_DECL_immediate_block_uint( struct ureg_program *, 295848b8605Smrg const unsigned *v, 296848b8605Smrg unsigned nr ); 297848b8605Smrg 298848b8605Smrgstruct ureg_src 299848b8605Smrgureg_DECL_immediate_int( struct ureg_program *, 300848b8605Smrg const int *v, 301848b8605Smrg unsigned nr ); 302848b8605Smrg 303b8e80941Smrgstruct ureg_src 304b8e80941Smrgureg_DECL_immediate_uint64( struct ureg_program *, 305b8e80941Smrg const uint64_t *v, 306b8e80941Smrg unsigned nr ); 307b8e80941Smrg 308b8e80941Smrgstruct ureg_src 309b8e80941Smrgureg_DECL_immediate_int64( struct ureg_program *, 310b8e80941Smrg const int64_t *v, 311b8e80941Smrg unsigned nr ); 312b8e80941Smrg 313848b8605Smrgvoid 314848b8605Smrgureg_DECL_constant2D(struct ureg_program *ureg, 315848b8605Smrg unsigned first, 316848b8605Smrg unsigned last, 317848b8605Smrg unsigned index2D); 318848b8605Smrg 319848b8605Smrgstruct ureg_src 320848b8605Smrgureg_DECL_constant( struct ureg_program *, 321848b8605Smrg unsigned index ); 322848b8605Smrg 323b8e80941Smrgvoid 324b8e80941Smrgureg_DECL_hw_atomic(struct ureg_program *ureg, 325b8e80941Smrg unsigned first, 326b8e80941Smrg unsigned last, 327b8e80941Smrg unsigned buffer_id, 328b8e80941Smrg unsigned array_id); 329b8e80941Smrg 330848b8605Smrgstruct ureg_dst 331848b8605Smrgureg_DECL_temporary( struct ureg_program * ); 332848b8605Smrg 333848b8605Smrg/** 334848b8605Smrg * Emit a temporary with the LOCAL declaration flag set. For use when 335848b8605Smrg * the register value is not required to be preserved across 336848b8605Smrg * subroutine boundaries. 337848b8605Smrg */ 338848b8605Smrgstruct ureg_dst 339848b8605Smrgureg_DECL_local_temporary( struct ureg_program * ); 340848b8605Smrg 341848b8605Smrg/** 342848b8605Smrg * Declare "size" continuous temporary registers. 343848b8605Smrg */ 344848b8605Smrgstruct ureg_dst 345848b8605Smrgureg_DECL_array_temporary( struct ureg_program *, 346848b8605Smrg unsigned size, 347848b8605Smrg boolean local ); 348848b8605Smrg 349848b8605Smrgvoid 350848b8605Smrgureg_release_temporary( struct ureg_program *ureg, 351848b8605Smrg struct ureg_dst tmp ); 352848b8605Smrg 353848b8605Smrgstruct ureg_dst 354848b8605Smrgureg_DECL_address( struct ureg_program * ); 355848b8605Smrg 356848b8605Smrg/* Supply an index to the sampler declaration as this is the hook to 357848b8605Smrg * the external pipe_sampler state. Users of this function probably 358848b8605Smrg * don't want just any sampler, but a specific one which they've set 359848b8605Smrg * up state for in the context. 360848b8605Smrg */ 361848b8605Smrgstruct ureg_src 362848b8605Smrgureg_DECL_sampler( struct ureg_program *, 363848b8605Smrg unsigned index ); 364848b8605Smrg 365848b8605Smrgstruct ureg_src 366848b8605Smrgureg_DECL_sampler_view(struct ureg_program *, 367848b8605Smrg unsigned index, 368b8e80941Smrg enum tgsi_texture_type target, 369b8e80941Smrg enum tgsi_return_type return_type_x, 370b8e80941Smrg enum tgsi_return_type return_type_y, 371b8e80941Smrg enum tgsi_return_type return_type_z, 372b8e80941Smrg enum tgsi_return_type return_type_w ); 373848b8605Smrg 374b8e80941Smrgstruct ureg_src 375b8e80941Smrgureg_DECL_image(struct ureg_program *ureg, 376b8e80941Smrg unsigned index, 377b8e80941Smrg enum tgsi_texture_type target, 378b8e80941Smrg enum pipe_format format, 379b8e80941Smrg boolean wr, 380b8e80941Smrg boolean raw); 381b8e80941Smrg 382b8e80941Smrgstruct ureg_src 383b8e80941Smrgureg_DECL_buffer(struct ureg_program *ureg, unsigned nr, bool atomic); 384848b8605Smrg 385b8e80941Smrgstruct ureg_src 386b8e80941Smrgureg_DECL_memory(struct ureg_program *ureg, unsigned memory_type); 387b8e80941Smrg 388b8e80941Smrgstatic inline struct ureg_src 389848b8605Smrgureg_imm4f( struct ureg_program *ureg, 390848b8605Smrg float a, float b, 391848b8605Smrg float c, float d) 392848b8605Smrg{ 393848b8605Smrg float v[4]; 394848b8605Smrg v[0] = a; 395848b8605Smrg v[1] = b; 396848b8605Smrg v[2] = c; 397848b8605Smrg v[3] = d; 398848b8605Smrg return ureg_DECL_immediate( ureg, v, 4 ); 399848b8605Smrg} 400848b8605Smrg 401b8e80941Smrgstatic inline struct ureg_src 402848b8605Smrgureg_imm3f( struct ureg_program *ureg, 403848b8605Smrg float a, float b, 404848b8605Smrg float c) 405848b8605Smrg{ 406848b8605Smrg float v[3]; 407848b8605Smrg v[0] = a; 408848b8605Smrg v[1] = b; 409848b8605Smrg v[2] = c; 410848b8605Smrg return ureg_DECL_immediate( ureg, v, 3 ); 411848b8605Smrg} 412848b8605Smrg 413b8e80941Smrgstatic inline struct ureg_src 414848b8605Smrgureg_imm2f( struct ureg_program *ureg, 415848b8605Smrg float a, float b) 416848b8605Smrg{ 417848b8605Smrg float v[2]; 418848b8605Smrg v[0] = a; 419848b8605Smrg v[1] = b; 420848b8605Smrg return ureg_DECL_immediate( ureg, v, 2 ); 421848b8605Smrg} 422848b8605Smrg 423b8e80941Smrgstatic inline struct ureg_src 424848b8605Smrgureg_imm1f( struct ureg_program *ureg, 425848b8605Smrg float a) 426848b8605Smrg{ 427848b8605Smrg float v[1]; 428848b8605Smrg v[0] = a; 429848b8605Smrg return ureg_DECL_immediate( ureg, v, 1 ); 430848b8605Smrg} 431848b8605Smrg 432b8e80941Smrgstatic inline struct ureg_src 433848b8605Smrgureg_imm4u( struct ureg_program *ureg, 434848b8605Smrg unsigned a, unsigned b, 435848b8605Smrg unsigned c, unsigned d) 436848b8605Smrg{ 437848b8605Smrg unsigned v[4]; 438848b8605Smrg v[0] = a; 439848b8605Smrg v[1] = b; 440848b8605Smrg v[2] = c; 441848b8605Smrg v[3] = d; 442848b8605Smrg return ureg_DECL_immediate_uint( ureg, v, 4 ); 443848b8605Smrg} 444848b8605Smrg 445b8e80941Smrgstatic inline struct ureg_src 446848b8605Smrgureg_imm3u( struct ureg_program *ureg, 447848b8605Smrg unsigned a, unsigned b, 448848b8605Smrg unsigned c) 449848b8605Smrg{ 450848b8605Smrg unsigned v[3]; 451848b8605Smrg v[0] = a; 452848b8605Smrg v[1] = b; 453848b8605Smrg v[2] = c; 454848b8605Smrg return ureg_DECL_immediate_uint( ureg, v, 3 ); 455848b8605Smrg} 456848b8605Smrg 457b8e80941Smrgstatic inline struct ureg_src 458848b8605Smrgureg_imm2u( struct ureg_program *ureg, 459848b8605Smrg unsigned a, unsigned b) 460848b8605Smrg{ 461848b8605Smrg unsigned v[2]; 462848b8605Smrg v[0] = a; 463848b8605Smrg v[1] = b; 464848b8605Smrg return ureg_DECL_immediate_uint( ureg, v, 2 ); 465848b8605Smrg} 466848b8605Smrg 467b8e80941Smrgstatic inline struct ureg_src 468848b8605Smrgureg_imm1u( struct ureg_program *ureg, 469848b8605Smrg unsigned a) 470848b8605Smrg{ 471848b8605Smrg return ureg_DECL_immediate_uint( ureg, &a, 1 ); 472848b8605Smrg} 473848b8605Smrg 474b8e80941Smrgstatic inline struct ureg_src 475848b8605Smrgureg_imm4i( struct ureg_program *ureg, 476848b8605Smrg int a, int b, 477848b8605Smrg int c, int d) 478848b8605Smrg{ 479848b8605Smrg int v[4]; 480848b8605Smrg v[0] = a; 481848b8605Smrg v[1] = b; 482848b8605Smrg v[2] = c; 483848b8605Smrg v[3] = d; 484848b8605Smrg return ureg_DECL_immediate_int( ureg, v, 4 ); 485848b8605Smrg} 486848b8605Smrg 487b8e80941Smrgstatic inline struct ureg_src 488848b8605Smrgureg_imm3i( struct ureg_program *ureg, 489848b8605Smrg int a, int b, 490848b8605Smrg int c) 491848b8605Smrg{ 492848b8605Smrg int v[3]; 493848b8605Smrg v[0] = a; 494848b8605Smrg v[1] = b; 495848b8605Smrg v[2] = c; 496848b8605Smrg return ureg_DECL_immediate_int( ureg, v, 3 ); 497848b8605Smrg} 498848b8605Smrg 499b8e80941Smrgstatic inline struct ureg_src 500848b8605Smrgureg_imm2i( struct ureg_program *ureg, 501848b8605Smrg int a, int b) 502848b8605Smrg{ 503848b8605Smrg int v[2]; 504848b8605Smrg v[0] = a; 505848b8605Smrg v[1] = b; 506848b8605Smrg return ureg_DECL_immediate_int( ureg, v, 2 ); 507848b8605Smrg} 508848b8605Smrg 509b8e80941Smrgstatic inline struct ureg_src 510848b8605Smrgureg_imm1i( struct ureg_program *ureg, 511848b8605Smrg int a) 512848b8605Smrg{ 513848b8605Smrg return ureg_DECL_immediate_int( ureg, &a, 1 ); 514848b8605Smrg} 515848b8605Smrg 516848b8605Smrg/* Where the destination register has a valid file, but an empty 517848b8605Smrg * writemask. 518848b8605Smrg */ 519b8e80941Smrgstatic inline boolean 520848b8605Smrgureg_dst_is_empty( struct ureg_dst dst ) 521848b8605Smrg{ 522848b8605Smrg return dst.File != TGSI_FILE_NULL && 523848b8605Smrg dst.WriteMask == 0; 524848b8605Smrg} 525848b8605Smrg 526848b8605Smrg/*********************************************************************** 527848b8605Smrg * Functions for patching up labels 528848b8605Smrg */ 529848b8605Smrg 530848b8605Smrg 531848b8605Smrg/* Will return a number which can be used in a label to point to the 532848b8605Smrg * next instruction to be emitted. 533848b8605Smrg */ 534848b8605Smrgunsigned 535848b8605Smrgureg_get_instruction_number( struct ureg_program *ureg ); 536848b8605Smrg 537848b8605Smrg 538848b8605Smrg/* Patch a given label (expressed as a token number) to point to a 539848b8605Smrg * given instruction (expressed as an instruction number). 540848b8605Smrg * 541848b8605Smrg * Labels are obtained from instruction emitters, eg ureg_CAL(). 542848b8605Smrg * Instruction numbers are obtained from ureg_get_instruction_number(), 543848b8605Smrg * above. 544848b8605Smrg */ 545848b8605Smrgvoid 546848b8605Smrgureg_fixup_label(struct ureg_program *ureg, 547848b8605Smrg unsigned label_token, 548848b8605Smrg unsigned instruction_number ); 549848b8605Smrg 550848b8605Smrg 551848b8605Smrg/* Generic instruction emitter. Use if you need to pass the opcode as 552848b8605Smrg * a parameter, rather than using the emit_OP() variants below. 553848b8605Smrg */ 554848b8605Smrgvoid 555848b8605Smrgureg_insn(struct ureg_program *ureg, 556b8e80941Smrg enum tgsi_opcode opcode, 557848b8605Smrg const struct ureg_dst *dst, 558848b8605Smrg unsigned nr_dst, 559848b8605Smrg const struct ureg_src *src, 560b8e80941Smrg unsigned nr_src, 561b8e80941Smrg unsigned precise ); 562848b8605Smrg 563848b8605Smrg 564848b8605Smrgvoid 565848b8605Smrgureg_tex_insn(struct ureg_program *ureg, 566b8e80941Smrg enum tgsi_opcode opcode, 567848b8605Smrg const struct ureg_dst *dst, 568848b8605Smrg unsigned nr_dst, 569b8e80941Smrg enum tgsi_texture_type target, 570b8e80941Smrg enum tgsi_return_type return_type, 571848b8605Smrg const struct tgsi_texture_offset *texoffsets, 572848b8605Smrg unsigned nr_offset, 573848b8605Smrg const struct ureg_src *src, 574848b8605Smrg unsigned nr_src ); 575848b8605Smrg 576848b8605Smrg 577848b8605Smrgvoid 578b8e80941Smrgureg_memory_insn(struct ureg_program *ureg, 579b8e80941Smrg enum tgsi_opcode opcode, 580b8e80941Smrg const struct ureg_dst *dst, 581b8e80941Smrg unsigned nr_dst, 582b8e80941Smrg const struct ureg_src *src, 583b8e80941Smrg unsigned nr_src, 584b8e80941Smrg unsigned qualifier, 585b8e80941Smrg enum tgsi_texture_type texture, 586b8e80941Smrg enum pipe_format format); 587848b8605Smrg 588848b8605Smrg/*********************************************************************** 589848b8605Smrg * Internal instruction helpers, don't call these directly: 590848b8605Smrg */ 591848b8605Smrg 592848b8605Smrgstruct ureg_emit_insn_result { 593848b8605Smrg unsigned insn_token; /*< Used to fixup insn size. */ 594848b8605Smrg unsigned extended_token; /*< Used to set the Extended bit, usually the same as insn_token. */ 595848b8605Smrg}; 596848b8605Smrg 597848b8605Smrgstruct ureg_emit_insn_result 598848b8605Smrgureg_emit_insn(struct ureg_program *ureg, 599b8e80941Smrg enum tgsi_opcode opcode, 600848b8605Smrg boolean saturate, 601b8e80941Smrg unsigned precise, 602848b8605Smrg unsigned num_dst, 603b8e80941Smrg unsigned num_src); 604848b8605Smrg 605848b8605Smrgvoid 606848b8605Smrgureg_emit_label(struct ureg_program *ureg, 607848b8605Smrg unsigned insn_token, 608848b8605Smrg unsigned *label_token ); 609848b8605Smrg 610848b8605Smrgvoid 611848b8605Smrgureg_emit_texture(struct ureg_program *ureg, 612848b8605Smrg unsigned insn_token, 613b8e80941Smrg enum tgsi_texture_type target, 614b8e80941Smrg enum tgsi_return_type return_type, 615b8e80941Smrg unsigned num_offsets); 616848b8605Smrg 617848b8605Smrgvoid 618848b8605Smrgureg_emit_texture_offset(struct ureg_program *ureg, 619848b8605Smrg const struct tgsi_texture_offset *offset); 620848b8605Smrg 621b8e80941Smrgvoid 622b8e80941Smrgureg_emit_memory(struct ureg_program *ureg, 623b8e80941Smrg unsigned insn_token, 624b8e80941Smrg unsigned qualifier, 625b8e80941Smrg enum tgsi_texture_type texture, 626b8e80941Smrg enum pipe_format format); 627b8e80941Smrg 628848b8605Smrgvoid 629848b8605Smrgureg_emit_dst( struct ureg_program *ureg, 630848b8605Smrg struct ureg_dst dst ); 631848b8605Smrg 632848b8605Smrgvoid 633848b8605Smrgureg_emit_src( struct ureg_program *ureg, 634848b8605Smrg struct ureg_src src ); 635848b8605Smrg 636848b8605Smrgvoid 637848b8605Smrgureg_fixup_insn_size(struct ureg_program *ureg, 638848b8605Smrg unsigned insn ); 639848b8605Smrg 640848b8605Smrg 641848b8605Smrg#define OP00( op ) \ 642b8e80941Smrgstatic inline void ureg_##op( struct ureg_program *ureg ) \ 643848b8605Smrg{ \ 644b8e80941Smrg enum tgsi_opcode opcode = TGSI_OPCODE_##op; \ 645848b8605Smrg struct ureg_emit_insn_result insn; \ 646848b8605Smrg insn = ureg_emit_insn(ureg, \ 647848b8605Smrg opcode, \ 648848b8605Smrg FALSE, \ 649b8e80941Smrg 0, \ 650848b8605Smrg 0, \ 651848b8605Smrg 0); \ 652848b8605Smrg ureg_fixup_insn_size( ureg, insn.insn_token ); \ 653848b8605Smrg} 654848b8605Smrg 655848b8605Smrg#define OP01( op ) \ 656b8e80941Smrgstatic inline void ureg_##op( struct ureg_program *ureg, \ 657848b8605Smrg struct ureg_src src ) \ 658848b8605Smrg{ \ 659b8e80941Smrg enum tgsi_opcode opcode = TGSI_OPCODE_##op; \ 660848b8605Smrg struct ureg_emit_insn_result insn; \ 661848b8605Smrg insn = ureg_emit_insn(ureg, \ 662848b8605Smrg opcode, \ 663848b8605Smrg FALSE, \ 664b8e80941Smrg 0, \ 665848b8605Smrg 0, \ 666848b8605Smrg 1); \ 667848b8605Smrg ureg_emit_src( ureg, src ); \ 668848b8605Smrg ureg_fixup_insn_size( ureg, insn.insn_token ); \ 669848b8605Smrg} 670848b8605Smrg 671848b8605Smrg#define OP00_LBL( op ) \ 672b8e80941Smrgstatic inline void ureg_##op( struct ureg_program *ureg, \ 673848b8605Smrg unsigned *label_token ) \ 674848b8605Smrg{ \ 675b8e80941Smrg enum tgsi_opcode opcode = TGSI_OPCODE_##op; \ 676848b8605Smrg struct ureg_emit_insn_result insn; \ 677848b8605Smrg insn = ureg_emit_insn(ureg, \ 678848b8605Smrg opcode, \ 679848b8605Smrg FALSE, \ 680b8e80941Smrg 0, \ 681848b8605Smrg 0, \ 682848b8605Smrg 0); \ 683848b8605Smrg ureg_emit_label( ureg, insn.extended_token, label_token ); \ 684848b8605Smrg ureg_fixup_insn_size( ureg, insn.insn_token ); \ 685848b8605Smrg} 686848b8605Smrg 687848b8605Smrg#define OP01_LBL( op ) \ 688b8e80941Smrgstatic inline void ureg_##op( struct ureg_program *ureg, \ 689848b8605Smrg struct ureg_src src, \ 690848b8605Smrg unsigned *label_token ) \ 691848b8605Smrg{ \ 692b8e80941Smrg enum tgsi_opcode opcode = TGSI_OPCODE_##op; \ 693848b8605Smrg struct ureg_emit_insn_result insn; \ 694848b8605Smrg insn = ureg_emit_insn(ureg, \ 695848b8605Smrg opcode, \ 696848b8605Smrg FALSE, \ 697b8e80941Smrg 0, \ 698848b8605Smrg 0, \ 699848b8605Smrg 1); \ 700848b8605Smrg ureg_emit_label( ureg, insn.extended_token, label_token ); \ 701848b8605Smrg ureg_emit_src( ureg, src ); \ 702848b8605Smrg ureg_fixup_insn_size( ureg, insn.insn_token ); \ 703848b8605Smrg} 704848b8605Smrg 705848b8605Smrg#define OP10( op ) \ 706b8e80941Smrgstatic inline void ureg_##op( struct ureg_program *ureg, \ 707848b8605Smrg struct ureg_dst dst ) \ 708848b8605Smrg{ \ 709b8e80941Smrg enum tgsi_opcode opcode = TGSI_OPCODE_##op; \ 710848b8605Smrg struct ureg_emit_insn_result insn; \ 711848b8605Smrg if (ureg_dst_is_empty(dst)) \ 712848b8605Smrg return; \ 713848b8605Smrg insn = ureg_emit_insn(ureg, \ 714848b8605Smrg opcode, \ 715848b8605Smrg dst.Saturate, \ 716b8e80941Smrg 0, \ 717848b8605Smrg 1, \ 718848b8605Smrg 0); \ 719848b8605Smrg ureg_emit_dst( ureg, dst ); \ 720848b8605Smrg ureg_fixup_insn_size( ureg, insn.insn_token ); \ 721848b8605Smrg} 722848b8605Smrg 723848b8605Smrg 724848b8605Smrg#define OP11( op ) \ 725b8e80941Smrgstatic inline void ureg_##op( struct ureg_program *ureg, \ 726848b8605Smrg struct ureg_dst dst, \ 727848b8605Smrg struct ureg_src src ) \ 728848b8605Smrg{ \ 729b8e80941Smrg enum tgsi_opcode opcode = TGSI_OPCODE_##op; \ 730848b8605Smrg struct ureg_emit_insn_result insn; \ 731848b8605Smrg if (ureg_dst_is_empty(dst)) \ 732848b8605Smrg return; \ 733848b8605Smrg insn = ureg_emit_insn(ureg, \ 734848b8605Smrg opcode, \ 735848b8605Smrg dst.Saturate, \ 736b8e80941Smrg 0, \ 737848b8605Smrg 1, \ 738848b8605Smrg 1); \ 739848b8605Smrg ureg_emit_dst( ureg, dst ); \ 740848b8605Smrg ureg_emit_src( ureg, src ); \ 741848b8605Smrg ureg_fixup_insn_size( ureg, insn.insn_token ); \ 742848b8605Smrg} 743848b8605Smrg 744848b8605Smrg#define OP12( op ) \ 745b8e80941Smrgstatic inline void ureg_##op( struct ureg_program *ureg, \ 746848b8605Smrg struct ureg_dst dst, \ 747848b8605Smrg struct ureg_src src0, \ 748848b8605Smrg struct ureg_src src1 ) \ 749848b8605Smrg{ \ 750b8e80941Smrg enum tgsi_opcode opcode = TGSI_OPCODE_##op; \ 751848b8605Smrg struct ureg_emit_insn_result insn; \ 752848b8605Smrg if (ureg_dst_is_empty(dst)) \ 753848b8605Smrg return; \ 754848b8605Smrg insn = ureg_emit_insn(ureg, \ 755848b8605Smrg opcode, \ 756848b8605Smrg dst.Saturate, \ 757b8e80941Smrg 0, \ 758848b8605Smrg 1, \ 759848b8605Smrg 2); \ 760848b8605Smrg ureg_emit_dst( ureg, dst ); \ 761848b8605Smrg ureg_emit_src( ureg, src0 ); \ 762848b8605Smrg ureg_emit_src( ureg, src1 ); \ 763848b8605Smrg ureg_fixup_insn_size( ureg, insn.insn_token ); \ 764848b8605Smrg} 765848b8605Smrg 766848b8605Smrg#define OP12_TEX( op ) \ 767b8e80941Smrgstatic inline void ureg_##op( struct ureg_program *ureg, \ 768848b8605Smrg struct ureg_dst dst, \ 769b8e80941Smrg enum tgsi_texture_type target, \ 770848b8605Smrg struct ureg_src src0, \ 771848b8605Smrg struct ureg_src src1 ) \ 772848b8605Smrg{ \ 773b8e80941Smrg enum tgsi_opcode opcode = TGSI_OPCODE_##op; \ 774b8e80941Smrg enum tgsi_return_type return_type = TGSI_RETURN_TYPE_UNKNOWN; \ 775848b8605Smrg struct ureg_emit_insn_result insn; \ 776848b8605Smrg if (ureg_dst_is_empty(dst)) \ 777848b8605Smrg return; \ 778848b8605Smrg insn = ureg_emit_insn(ureg, \ 779848b8605Smrg opcode, \ 780848b8605Smrg dst.Saturate, \ 781b8e80941Smrg 0, \ 782848b8605Smrg 1, \ 783848b8605Smrg 2); \ 784b8e80941Smrg ureg_emit_texture( ureg, insn.extended_token, target, \ 785b8e80941Smrg return_type, 0 ); \ 786848b8605Smrg ureg_emit_dst( ureg, dst ); \ 787848b8605Smrg ureg_emit_src( ureg, src0 ); \ 788848b8605Smrg ureg_emit_src( ureg, src1 ); \ 789848b8605Smrg ureg_fixup_insn_size( ureg, insn.insn_token ); \ 790848b8605Smrg} 791848b8605Smrg 792848b8605Smrg#define OP13( op ) \ 793b8e80941Smrgstatic inline void ureg_##op( struct ureg_program *ureg, \ 794848b8605Smrg struct ureg_dst dst, \ 795848b8605Smrg struct ureg_src src0, \ 796848b8605Smrg struct ureg_src src1, \ 797848b8605Smrg struct ureg_src src2 ) \ 798848b8605Smrg{ \ 799b8e80941Smrg enum tgsi_opcode opcode = TGSI_OPCODE_##op; \ 800848b8605Smrg struct ureg_emit_insn_result insn; \ 801848b8605Smrg if (ureg_dst_is_empty(dst)) \ 802848b8605Smrg return; \ 803848b8605Smrg insn = ureg_emit_insn(ureg, \ 804848b8605Smrg opcode, \ 805848b8605Smrg dst.Saturate, \ 806b8e80941Smrg 0, \ 807848b8605Smrg 1, \ 808848b8605Smrg 3); \ 809848b8605Smrg ureg_emit_dst( ureg, dst ); \ 810848b8605Smrg ureg_emit_src( ureg, src0 ); \ 811848b8605Smrg ureg_emit_src( ureg, src1 ); \ 812848b8605Smrg ureg_emit_src( ureg, src2 ); \ 813848b8605Smrg ureg_fixup_insn_size( ureg, insn.insn_token ); \ 814848b8605Smrg} 815848b8605Smrg 816848b8605Smrg#define OP14_TEX( op ) \ 817b8e80941Smrgstatic inline void ureg_##op( struct ureg_program *ureg, \ 818848b8605Smrg struct ureg_dst dst, \ 819b8e80941Smrg enum tgsi_texture_type target, \ 820848b8605Smrg struct ureg_src src0, \ 821848b8605Smrg struct ureg_src src1, \ 822848b8605Smrg struct ureg_src src2, \ 823848b8605Smrg struct ureg_src src3 ) \ 824848b8605Smrg{ \ 825b8e80941Smrg enum tgsi_opcode opcode = TGSI_OPCODE_##op; \ 826b8e80941Smrg enum tgsi_return_type return_type = TGSI_RETURN_TYPE_UNKNOWN; \ 827848b8605Smrg struct ureg_emit_insn_result insn; \ 828848b8605Smrg if (ureg_dst_is_empty(dst)) \ 829848b8605Smrg return; \ 830848b8605Smrg insn = ureg_emit_insn(ureg, \ 831848b8605Smrg opcode, \ 832848b8605Smrg dst.Saturate, \ 833b8e80941Smrg 0, \ 834848b8605Smrg 1, \ 835848b8605Smrg 4); \ 836b8e80941Smrg ureg_emit_texture( ureg, insn.extended_token, target, \ 837b8e80941Smrg return_type, 0 ); \ 838848b8605Smrg ureg_emit_dst( ureg, dst ); \ 839848b8605Smrg ureg_emit_src( ureg, src0 ); \ 840848b8605Smrg ureg_emit_src( ureg, src1 ); \ 841848b8605Smrg ureg_emit_src( ureg, src2 ); \ 842848b8605Smrg ureg_emit_src( ureg, src3 ); \ 843848b8605Smrg ureg_fixup_insn_size( ureg, insn.insn_token ); \ 844848b8605Smrg} 845848b8605Smrg 846848b8605Smrg/* Use a template include to generate a correctly-typed ureg_OP() 847848b8605Smrg * function for each TGSI opcode: 848848b8605Smrg */ 849848b8605Smrg#include "tgsi_opcode_tmp.h" 850848b8605Smrg 851848b8605Smrg 852848b8605Smrg/*********************************************************************** 853848b8605Smrg * Inline helpers for manipulating register structs: 854848b8605Smrg */ 855b8e80941Smrgstatic inline struct ureg_src 856848b8605Smrgureg_negate( struct ureg_src reg ) 857848b8605Smrg{ 858848b8605Smrg assert(reg.File != TGSI_FILE_NULL); 859848b8605Smrg reg.Negate ^= 1; 860848b8605Smrg return reg; 861848b8605Smrg} 862848b8605Smrg 863b8e80941Smrgstatic inline struct ureg_src 864848b8605Smrgureg_abs( struct ureg_src reg ) 865848b8605Smrg{ 866848b8605Smrg assert(reg.File != TGSI_FILE_NULL); 867848b8605Smrg reg.Absolute = 1; 868848b8605Smrg reg.Negate = 0; 869848b8605Smrg return reg; 870848b8605Smrg} 871848b8605Smrg 872b8e80941Smrgstatic inline struct ureg_src 873848b8605Smrgureg_swizzle( struct ureg_src reg, 874848b8605Smrg int x, int y, int z, int w ) 875848b8605Smrg{ 876848b8605Smrg unsigned swz = ( (reg.SwizzleX << 0) | 877848b8605Smrg (reg.SwizzleY << 2) | 878848b8605Smrg (reg.SwizzleZ << 4) | 879848b8605Smrg (reg.SwizzleW << 6)); 880848b8605Smrg 881848b8605Smrg assert(reg.File != TGSI_FILE_NULL); 882848b8605Smrg assert(x < 4); 883848b8605Smrg assert(y < 4); 884848b8605Smrg assert(z < 4); 885848b8605Smrg assert(w < 4); 886848b8605Smrg 887848b8605Smrg reg.SwizzleX = (swz >> (x*2)) & 0x3; 888848b8605Smrg reg.SwizzleY = (swz >> (y*2)) & 0x3; 889848b8605Smrg reg.SwizzleZ = (swz >> (z*2)) & 0x3; 890848b8605Smrg reg.SwizzleW = (swz >> (w*2)) & 0x3; 891848b8605Smrg return reg; 892848b8605Smrg} 893848b8605Smrg 894b8e80941Smrgstatic inline struct ureg_src 895848b8605Smrgureg_scalar( struct ureg_src reg, int x ) 896848b8605Smrg{ 897848b8605Smrg return ureg_swizzle(reg, x, x, x, x); 898848b8605Smrg} 899848b8605Smrg 900b8e80941Smrgstatic inline struct ureg_dst 901848b8605Smrgureg_writemask( struct ureg_dst reg, 902848b8605Smrg unsigned writemask ) 903848b8605Smrg{ 904848b8605Smrg assert(reg.File != TGSI_FILE_NULL); 905848b8605Smrg reg.WriteMask &= writemask; 906848b8605Smrg return reg; 907848b8605Smrg} 908848b8605Smrg 909b8e80941Smrgstatic inline struct ureg_dst 910848b8605Smrgureg_saturate( struct ureg_dst reg ) 911848b8605Smrg{ 912848b8605Smrg assert(reg.File != TGSI_FILE_NULL); 913848b8605Smrg reg.Saturate = 1; 914848b8605Smrg return reg; 915848b8605Smrg} 916848b8605Smrg 917b8e80941Smrgstatic inline struct ureg_dst 918848b8605Smrgureg_dst_indirect( struct ureg_dst reg, struct ureg_src addr ) 919848b8605Smrg{ 920848b8605Smrg assert(reg.File != TGSI_FILE_NULL); 921848b8605Smrg reg.Indirect = 1; 922848b8605Smrg reg.IndirectFile = addr.File; 923848b8605Smrg reg.IndirectIndex = addr.Index; 924848b8605Smrg reg.IndirectSwizzle = addr.SwizzleX; 925848b8605Smrg return reg; 926848b8605Smrg} 927848b8605Smrg 928b8e80941Smrgstatic inline struct ureg_src 929848b8605Smrgureg_src_indirect( struct ureg_src reg, struct ureg_src addr ) 930848b8605Smrg{ 931848b8605Smrg assert(reg.File != TGSI_FILE_NULL); 932848b8605Smrg reg.Indirect = 1; 933848b8605Smrg reg.IndirectFile = addr.File; 934848b8605Smrg reg.IndirectIndex = addr.Index; 935848b8605Smrg reg.IndirectSwizzle = addr.SwizzleX; 936848b8605Smrg return reg; 937848b8605Smrg} 938848b8605Smrg 939b8e80941Smrgstatic inline struct ureg_dst 940b8e80941Smrgureg_dst_dimension( struct ureg_dst reg, int index ) 941b8e80941Smrg{ 942b8e80941Smrg assert(reg.File != TGSI_FILE_NULL); 943b8e80941Smrg reg.Dimension = 1; 944b8e80941Smrg reg.DimIndirect = 0; 945b8e80941Smrg reg.DimensionIndex = index; 946b8e80941Smrg return reg; 947b8e80941Smrg} 948b8e80941Smrg 949b8e80941Smrgstatic inline struct ureg_src 950848b8605Smrgureg_src_dimension( struct ureg_src reg, int index ) 951848b8605Smrg{ 952848b8605Smrg assert(reg.File != TGSI_FILE_NULL); 953848b8605Smrg reg.Dimension = 1; 954848b8605Smrg reg.DimIndirect = 0; 955848b8605Smrg reg.DimensionIndex = index; 956848b8605Smrg return reg; 957848b8605Smrg} 958848b8605Smrg 959b8e80941Smrgstatic inline struct ureg_dst 960b8e80941Smrgureg_dst_dimension_indirect( struct ureg_dst reg, struct ureg_src addr, 961b8e80941Smrg int index ) 962b8e80941Smrg{ 963b8e80941Smrg assert(reg.File != TGSI_FILE_NULL); 964b8e80941Smrg reg.Dimension = 1; 965b8e80941Smrg reg.DimIndirect = 1; 966b8e80941Smrg reg.DimensionIndex = index; 967b8e80941Smrg reg.DimIndFile = addr.File; 968b8e80941Smrg reg.DimIndIndex = addr.Index; 969b8e80941Smrg reg.DimIndSwizzle = addr.SwizzleX; 970b8e80941Smrg return reg; 971b8e80941Smrg} 972848b8605Smrg 973b8e80941Smrgstatic inline struct ureg_src 974848b8605Smrgureg_src_dimension_indirect( struct ureg_src reg, struct ureg_src addr, 975848b8605Smrg int index ) 976848b8605Smrg{ 977848b8605Smrg assert(reg.File != TGSI_FILE_NULL); 978848b8605Smrg reg.Dimension = 1; 979848b8605Smrg reg.DimIndirect = 1; 980848b8605Smrg reg.DimensionIndex = index; 981848b8605Smrg reg.DimIndFile = addr.File; 982848b8605Smrg reg.DimIndIndex = addr.Index; 983848b8605Smrg reg.DimIndSwizzle = addr.SwizzleX; 984848b8605Smrg return reg; 985848b8605Smrg} 986848b8605Smrg 987b8e80941Smrgstatic inline struct ureg_src 988b8e80941Smrgureg_src_array_offset(struct ureg_src reg, int offset) 989b8e80941Smrg{ 990b8e80941Smrg reg.Index += offset; 991b8e80941Smrg return reg; 992b8e80941Smrg} 993b8e80941Smrg 994b8e80941Smrgstatic inline struct ureg_dst 995848b8605Smrgureg_dst_array_offset( struct ureg_dst reg, int offset ) 996848b8605Smrg{ 997848b8605Smrg reg.Index += offset; 998848b8605Smrg return reg; 999848b8605Smrg} 1000848b8605Smrg 1001b8e80941Smrgstatic inline struct ureg_dst 1002b8e80941Smrgureg_dst_array_register(unsigned file, 1003b8e80941Smrg unsigned index, 1004b8e80941Smrg unsigned array_id) 1005848b8605Smrg{ 1006848b8605Smrg struct ureg_dst dst; 1007848b8605Smrg 1008b8e80941Smrg dst.File = file; 1009b8e80941Smrg dst.WriteMask = TGSI_WRITEMASK_XYZW; 1010b8e80941Smrg dst.Indirect = 0; 1011b8e80941Smrg dst.IndirectFile = TGSI_FILE_NULL; 1012b8e80941Smrg dst.IndirectIndex = 0; 1013b8e80941Smrg dst.IndirectSwizzle = 0; 1014b8e80941Smrg dst.Saturate = 0; 1015b8e80941Smrg dst.Index = index; 1016b8e80941Smrg dst.Dimension = 0; 1017b8e80941Smrg dst.DimensionIndex = 0; 1018b8e80941Smrg dst.DimIndirect = 0; 1019b8e80941Smrg dst.DimIndFile = TGSI_FILE_NULL; 1020b8e80941Smrg dst.DimIndIndex = 0; 1021b8e80941Smrg dst.DimIndSwizzle = 0; 1022b8e80941Smrg dst.ArrayID = array_id; 1023b8e80941Smrg dst.Invariant = 0; 1024b8e80941Smrg 1025b8e80941Smrg return dst; 1026b8e80941Smrg} 1027b8e80941Smrg 1028b8e80941Smrgstatic inline struct ureg_dst 1029b8e80941Smrgureg_dst_register(unsigned file, 1030b8e80941Smrg unsigned index) 1031b8e80941Smrg{ 1032b8e80941Smrg return ureg_dst_array_register(file, index, 0); 1033b8e80941Smrg} 1034b8e80941Smrg 1035b8e80941Smrgstatic inline struct ureg_dst 1036b8e80941Smrgureg_dst( struct ureg_src src ) 1037b8e80941Smrg{ 1038b8e80941Smrg struct ureg_dst dst; 1039848b8605Smrg 1040848b8605Smrg dst.File = src.File; 1041848b8605Smrg dst.WriteMask = TGSI_WRITEMASK_XYZW; 1042848b8605Smrg dst.IndirectFile = src.IndirectFile; 1043848b8605Smrg dst.Indirect = src.Indirect; 1044848b8605Smrg dst.IndirectIndex = src.IndirectIndex; 1045848b8605Smrg dst.IndirectSwizzle = src.IndirectSwizzle; 1046848b8605Smrg dst.Saturate = 0; 1047848b8605Smrg dst.Index = src.Index; 1048b8e80941Smrg dst.Dimension = src.Dimension; 1049b8e80941Smrg dst.DimensionIndex = src.DimensionIndex; 1050b8e80941Smrg dst.DimIndirect = src.DimIndirect; 1051b8e80941Smrg dst.DimIndFile = src.DimIndFile; 1052b8e80941Smrg dst.DimIndIndex = src.DimIndIndex; 1053b8e80941Smrg dst.DimIndSwizzle = src.DimIndSwizzle; 1054848b8605Smrg dst.ArrayID = src.ArrayID; 1055b8e80941Smrg dst.Invariant = 0; 1056848b8605Smrg 1057848b8605Smrg return dst; 1058848b8605Smrg} 1059848b8605Smrg 1060b8e80941Smrgstatic inline struct ureg_src 1061b8e80941Smrgureg_src_array_register(unsigned file, 1062b8e80941Smrg unsigned index, 1063b8e80941Smrg unsigned array_id) 1064848b8605Smrg{ 1065848b8605Smrg struct ureg_src src; 1066848b8605Smrg 1067848b8605Smrg src.File = file; 1068848b8605Smrg src.SwizzleX = TGSI_SWIZZLE_X; 1069848b8605Smrg src.SwizzleY = TGSI_SWIZZLE_Y; 1070848b8605Smrg src.SwizzleZ = TGSI_SWIZZLE_Z; 1071848b8605Smrg src.SwizzleW = TGSI_SWIZZLE_W; 1072848b8605Smrg src.Indirect = 0; 1073848b8605Smrg src.IndirectFile = TGSI_FILE_NULL; 1074848b8605Smrg src.IndirectIndex = 0; 1075848b8605Smrg src.IndirectSwizzle = 0; 1076848b8605Smrg src.Absolute = 0; 1077848b8605Smrg src.Index = index; 1078848b8605Smrg src.Negate = 0; 1079848b8605Smrg src.Dimension = 0; 1080848b8605Smrg src.DimensionIndex = 0; 1081848b8605Smrg src.DimIndirect = 0; 1082848b8605Smrg src.DimIndFile = TGSI_FILE_NULL; 1083848b8605Smrg src.DimIndIndex = 0; 1084848b8605Smrg src.DimIndSwizzle = 0; 1085b8e80941Smrg src.ArrayID = array_id; 1086848b8605Smrg 1087848b8605Smrg return src; 1088848b8605Smrg} 1089848b8605Smrg 1090b8e80941Smrgstatic inline struct ureg_src 1091b8e80941Smrgureg_src_register(unsigned file, 1092b8e80941Smrg unsigned index) 1093b8e80941Smrg{ 1094b8e80941Smrg return ureg_src_array_register(file, index, 0); 1095b8e80941Smrg} 1096b8e80941Smrg 1097b8e80941Smrgstatic inline struct ureg_src 1098848b8605Smrgureg_src( struct ureg_dst dst ) 1099848b8605Smrg{ 1100848b8605Smrg struct ureg_src src; 1101848b8605Smrg 1102848b8605Smrg src.File = dst.File; 1103848b8605Smrg src.SwizzleX = TGSI_SWIZZLE_X; 1104848b8605Smrg src.SwizzleY = TGSI_SWIZZLE_Y; 1105848b8605Smrg src.SwizzleZ = TGSI_SWIZZLE_Z; 1106848b8605Smrg src.SwizzleW = TGSI_SWIZZLE_W; 1107848b8605Smrg src.Indirect = dst.Indirect; 1108848b8605Smrg src.IndirectFile = dst.IndirectFile; 1109848b8605Smrg src.IndirectIndex = dst.IndirectIndex; 1110848b8605Smrg src.IndirectSwizzle = dst.IndirectSwizzle; 1111848b8605Smrg src.Absolute = 0; 1112848b8605Smrg src.Index = dst.Index; 1113848b8605Smrg src.Negate = 0; 1114b8e80941Smrg src.Dimension = dst.Dimension; 1115b8e80941Smrg src.DimensionIndex = dst.DimensionIndex; 1116b8e80941Smrg src.DimIndirect = dst.DimIndirect; 1117b8e80941Smrg src.DimIndFile = dst.DimIndFile; 1118b8e80941Smrg src.DimIndIndex = dst.DimIndIndex; 1119b8e80941Smrg src.DimIndSwizzle = dst.DimIndSwizzle; 1120848b8605Smrg src.ArrayID = dst.ArrayID; 1121848b8605Smrg 1122848b8605Smrg return src; 1123848b8605Smrg} 1124848b8605Smrg 1125848b8605Smrg 1126848b8605Smrg 1127b8e80941Smrgstatic inline struct ureg_dst 1128848b8605Smrgureg_dst_undef( void ) 1129848b8605Smrg{ 1130848b8605Smrg struct ureg_dst dst; 1131848b8605Smrg 1132848b8605Smrg dst.File = TGSI_FILE_NULL; 1133848b8605Smrg dst.WriteMask = 0; 1134848b8605Smrg dst.Indirect = 0; 1135848b8605Smrg dst.IndirectFile = TGSI_FILE_NULL; 1136848b8605Smrg dst.IndirectIndex = 0; 1137848b8605Smrg dst.IndirectSwizzle = 0; 1138848b8605Smrg dst.Saturate = 0; 1139848b8605Smrg dst.Index = 0; 1140b8e80941Smrg dst.Dimension = 0; 1141b8e80941Smrg dst.DimensionIndex = 0; 1142b8e80941Smrg dst.DimIndirect = 0; 1143b8e80941Smrg dst.DimIndFile = TGSI_FILE_NULL; 1144b8e80941Smrg dst.DimIndIndex = 0; 1145b8e80941Smrg dst.DimIndSwizzle = 0; 1146848b8605Smrg dst.ArrayID = 0; 1147b8e80941Smrg dst.Invariant = 0; 1148848b8605Smrg 1149848b8605Smrg return dst; 1150848b8605Smrg} 1151848b8605Smrg 1152b8e80941Smrgstatic inline struct ureg_src 1153848b8605Smrgureg_src_undef( void ) 1154848b8605Smrg{ 1155848b8605Smrg struct ureg_src src; 1156848b8605Smrg 1157848b8605Smrg src.File = TGSI_FILE_NULL; 1158848b8605Smrg src.SwizzleX = 0; 1159848b8605Smrg src.SwizzleY = 0; 1160848b8605Smrg src.SwizzleZ = 0; 1161848b8605Smrg src.SwizzleW = 0; 1162848b8605Smrg src.Indirect = 0; 1163848b8605Smrg src.IndirectFile = TGSI_FILE_NULL; 1164848b8605Smrg src.IndirectIndex = 0; 1165848b8605Smrg src.IndirectSwizzle = 0; 1166848b8605Smrg src.Absolute = 0; 1167848b8605Smrg src.Index = 0; 1168848b8605Smrg src.Negate = 0; 1169848b8605Smrg src.Dimension = 0; 1170848b8605Smrg src.DimensionIndex = 0; 1171848b8605Smrg src.DimIndirect = 0; 1172848b8605Smrg src.DimIndFile = TGSI_FILE_NULL; 1173848b8605Smrg src.DimIndIndex = 0; 1174848b8605Smrg src.DimIndSwizzle = 0; 1175848b8605Smrg src.ArrayID = 0; 1176848b8605Smrg 1177848b8605Smrg return src; 1178848b8605Smrg} 1179848b8605Smrg 1180b8e80941Smrgstatic inline boolean 1181848b8605Smrgureg_src_is_undef( struct ureg_src src ) 1182848b8605Smrg{ 1183848b8605Smrg return src.File == TGSI_FILE_NULL; 1184848b8605Smrg} 1185848b8605Smrg 1186b8e80941Smrgstatic inline boolean 1187848b8605Smrgureg_dst_is_undef( struct ureg_dst dst ) 1188848b8605Smrg{ 1189848b8605Smrg return dst.File == TGSI_FILE_NULL; 1190848b8605Smrg} 1191848b8605Smrg 1192848b8605Smrg 1193848b8605Smrg#ifdef __cplusplus 1194848b8605Smrg} 1195848b8605Smrg#endif 1196848b8605Smrg 1197848b8605Smrg#endif 1198