1 /************************************************************************** 2 * 3 * Copyright 2007-2008 VMware, Inc. 4 * All Rights Reserved. 5 * Copyright 2009-2010 VMware, Inc. All rights Reserved. 6 * 7 * Permission is hereby granted, free of charge, to any person obtaining a 8 * copy of this software and associated documentation files (the 9 * "Software"), to deal in the Software without restriction, including 10 * without limitation the rights to use, copy, modify, merge, publish, 11 * distribute, sub license, and/or sell copies of the Software, and to 12 * permit persons to whom the Software is furnished to do so, subject to 13 * the following conditions: 14 * 15 * The above copyright notice and this permission notice (including the 16 * next paragraph) shall be included in all copies or substantial portions 17 * of the Software. 18 * 19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 20 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 21 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 22 * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR 23 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 24 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 25 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 26 * 27 **************************************************************************/ 28 29 #ifndef TGSI_EXEC_H 30 #define TGSI_EXEC_H 31 32 #include "pipe/p_compiler.h" 33 #include "pipe/p_state.h" 34 #include "pipe/p_shader_tokens.h" 35 36 #if defined __cplusplus 37 extern "C" { 38 #endif 39 40 #define TGSI_CHAN_X 0 41 #define TGSI_CHAN_Y 1 42 #define TGSI_CHAN_Z 2 43 #define TGSI_CHAN_W 3 44 45 #define TGSI_NUM_CHANNELS 4 /* R,G,B,A */ 46 #define TGSI_QUAD_SIZE 4 /* 4 pixel/quad */ 47 48 #define TGSI_FOR_EACH_CHANNEL( CHAN )\ 49 for (CHAN = 0; CHAN < TGSI_NUM_CHANNELS; CHAN++) 50 51 #define TGSI_IS_DST0_CHANNEL_ENABLED( INST, CHAN )\ 52 ((INST)->Dst[0].Register.WriteMask & (1 << (CHAN))) 53 54 #define TGSI_IF_IS_DST0_CHANNEL_ENABLED( INST, CHAN )\ 55 if (TGSI_IS_DST0_CHANNEL_ENABLED( INST, CHAN )) 56 57 #define TGSI_FOR_EACH_DST0_ENABLED_CHANNEL( INST, CHAN )\ 58 TGSI_FOR_EACH_CHANNEL( CHAN )\ 59 TGSI_IF_IS_DST0_CHANNEL_ENABLED( INST, CHAN ) 60 61 62 /** 63 * Registers may be treated as float, signed int or unsigned int. 64 */ 65 union tgsi_exec_channel 66 { 67 float f[TGSI_QUAD_SIZE]; 68 int i[TGSI_QUAD_SIZE]; 69 unsigned u[TGSI_QUAD_SIZE]; 70 }; 71 72 /** 73 * A vector[RGBA] of channels[4 pixels] 74 */ 75 struct tgsi_exec_vector 76 { 77 union tgsi_exec_channel xyzw[TGSI_NUM_CHANNELS]; 78 }; 79 80 /** 81 * For fragment programs, information for computing fragment input 82 * values from plane equation of the triangle/line. 83 */ 84 struct tgsi_interp_coef 85 { 86 float a0[TGSI_NUM_CHANNELS]; /* in an xyzw layout */ 87 float dadx[TGSI_NUM_CHANNELS]; 88 float dady[TGSI_NUM_CHANNELS]; 89 }; 90 91 enum tgsi_sampler_control 92 { 93 TGSI_SAMPLER_LOD_NONE, 94 TGSI_SAMPLER_LOD_BIAS, 95 TGSI_SAMPLER_LOD_EXPLICIT, 96 TGSI_SAMPLER_LOD_ZERO, 97 TGSI_SAMPLER_DERIVS_EXPLICIT, 98 TGSI_SAMPLER_GATHER, 99 }; 100 101 struct tgsi_image_params { 102 unsigned unit; 103 unsigned tgsi_tex_instr; 104 enum pipe_format format; 105 unsigned execmask; 106 }; 107 108 struct tgsi_image { 109 /* image interfaces */ 110 void (*load)(const struct tgsi_image *image, 111 const struct tgsi_image_params *params, 112 const int s[TGSI_QUAD_SIZE], 113 const int t[TGSI_QUAD_SIZE], 114 const int r[TGSI_QUAD_SIZE], 115 const int sample[TGSI_QUAD_SIZE], 116 float rgba[TGSI_NUM_CHANNELS][TGSI_QUAD_SIZE]); 117 118 void (*store)(const struct tgsi_image *image, 119 const struct tgsi_image_params *params, 120 const int s[TGSI_QUAD_SIZE], 121 const int t[TGSI_QUAD_SIZE], 122 const int r[TGSI_QUAD_SIZE], 123 const int sample[TGSI_QUAD_SIZE], 124 float rgba[TGSI_NUM_CHANNELS][TGSI_QUAD_SIZE]); 125 126 void (*op)(const struct tgsi_image *image, 127 const struct tgsi_image_params *params, 128 unsigned opcode, 129 const int s[TGSI_QUAD_SIZE], 130 const int t[TGSI_QUAD_SIZE], 131 const int r[TGSI_QUAD_SIZE], 132 const int sample[TGSI_QUAD_SIZE], 133 float rgba[TGSI_NUM_CHANNELS][TGSI_QUAD_SIZE], 134 float rgba2[TGSI_NUM_CHANNELS][TGSI_QUAD_SIZE]); 135 136 void (*get_dims)(const struct tgsi_image *image, 137 const struct tgsi_image_params *params, 138 int dims[4]); 139 }; 140 141 struct tgsi_buffer_params { 142 unsigned unit; 143 unsigned execmask; 144 unsigned writemask; 145 }; 146 147 struct tgsi_buffer { 148 /* buffer interfaces */ 149 void (*load)(const struct tgsi_buffer *buffer, 150 const struct tgsi_buffer_params *params, 151 const int s[TGSI_QUAD_SIZE], 152 float rgba[TGSI_NUM_CHANNELS][TGSI_QUAD_SIZE]); 153 154 void (*store)(const struct tgsi_buffer *buffer, 155 const struct tgsi_buffer_params *params, 156 const int s[TGSI_QUAD_SIZE], 157 float rgba[TGSI_NUM_CHANNELS][TGSI_QUAD_SIZE]); 158 159 void (*op)(const struct tgsi_buffer *buffer, 160 const struct tgsi_buffer_params *params, 161 unsigned opcode, 162 const int s[TGSI_QUAD_SIZE], 163 float rgba[TGSI_NUM_CHANNELS][TGSI_QUAD_SIZE], 164 float rgba2[TGSI_NUM_CHANNELS][TGSI_QUAD_SIZE]); 165 166 void (*get_dims)(const struct tgsi_buffer *buffer, 167 const struct tgsi_buffer_params *params, 168 int *dim); 169 }; 170 171 /** 172 * Information for sampling textures, which must be implemented 173 * by code outside the TGSI executor. 174 */ 175 struct tgsi_sampler 176 { 177 /** Get samples for four fragments in a quad */ 178 /* this interface contains 5 sets of channels that vary 179 * depending on the sampler. 180 * s - the first texture coordinate for sampling. 181 * t - the second texture coordinate for sampling - unused for 1D, 182 layer for 1D arrays. 183 * r - the third coordinate for sampling for 3D, cube, cube arrays, 184 * layer for 2D arrays. Compare value for 1D/2D shadows. 185 * c0 - Compare value for shadow cube and shadow 2d arrays, 186 * layer for cube arrays. 187 * derivs - explicit derivatives. 188 * offset - texel offsets 189 * lod - lod value, except for shadow cube arrays (compare value there). 190 */ 191 void (*get_samples)(struct tgsi_sampler *sampler, 192 const unsigned sview_index, 193 const unsigned sampler_index, 194 const float s[TGSI_QUAD_SIZE], 195 const float t[TGSI_QUAD_SIZE], 196 const float r[TGSI_QUAD_SIZE], 197 const float c0[TGSI_QUAD_SIZE], 198 const float c1[TGSI_QUAD_SIZE], 199 float derivs[3][2][TGSI_QUAD_SIZE], 200 const int8_t offset[3], 201 enum tgsi_sampler_control control, 202 float rgba[TGSI_NUM_CHANNELS][TGSI_QUAD_SIZE]); 203 void (*get_dims)(struct tgsi_sampler *sampler, 204 const unsigned sview_index, 205 int level, int dims[4]); 206 void (*get_texel)(struct tgsi_sampler *sampler, 207 const unsigned sview_index, 208 const int i[TGSI_QUAD_SIZE], 209 const int j[TGSI_QUAD_SIZE], const int k[TGSI_QUAD_SIZE], 210 const int lod[TGSI_QUAD_SIZE], const int8_t offset[3], 211 float rgba[TGSI_NUM_CHANNELS][TGSI_QUAD_SIZE]); 212 void (*query_lod)(const struct tgsi_sampler *tgsi_sampler, 213 const unsigned sview_index, 214 const unsigned sampler_index, 215 const float s[TGSI_QUAD_SIZE], 216 const float t[TGSI_QUAD_SIZE], 217 const float p[TGSI_QUAD_SIZE], 218 const float c0[TGSI_QUAD_SIZE], 219 const enum tgsi_sampler_control control, 220 float mipmap[TGSI_QUAD_SIZE], 221 float lod[TGSI_QUAD_SIZE]); 222 }; 223 224 #define TGSI_EXEC_NUM_TEMPS 4096 225 #define TGSI_EXEC_NUM_IMMEDIATES 256 226 227 /* 228 * Locations of various utility registers (_I = Index, _C = Channel) 229 */ 230 #define TGSI_EXEC_TEMP_00000000_I (TGSI_EXEC_NUM_TEMPS + 0) 231 #define TGSI_EXEC_TEMP_00000000_C 0 232 233 #define TGSI_EXEC_TEMP_7FFFFFFF_I (TGSI_EXEC_NUM_TEMPS + 0) 234 #define TGSI_EXEC_TEMP_7FFFFFFF_C 1 235 236 #define TGSI_EXEC_TEMP_80000000_I (TGSI_EXEC_NUM_TEMPS + 0) 237 #define TGSI_EXEC_TEMP_80000000_C 2 238 239 #define TGSI_EXEC_TEMP_FFFFFFFF_I (TGSI_EXEC_NUM_TEMPS + 0) 240 #define TGSI_EXEC_TEMP_FFFFFFFF_C 3 241 242 #define TGSI_EXEC_TEMP_ONE_I (TGSI_EXEC_NUM_TEMPS + 1) 243 #define TGSI_EXEC_TEMP_ONE_C 0 244 245 #define TGSI_EXEC_TEMP_TWO_I (TGSI_EXEC_NUM_TEMPS + 1) 246 #define TGSI_EXEC_TEMP_TWO_C 1 247 248 #define TGSI_EXEC_TEMP_128_I (TGSI_EXEC_NUM_TEMPS + 1) 249 #define TGSI_EXEC_TEMP_128_C 2 250 251 #define TGSI_EXEC_TEMP_MINUS_128_I (TGSI_EXEC_NUM_TEMPS + 1) 252 #define TGSI_EXEC_TEMP_MINUS_128_C 3 253 254 #define TGSI_EXEC_TEMP_KILMASK_I (TGSI_EXEC_NUM_TEMPS + 2) 255 #define TGSI_EXEC_TEMP_KILMASK_C 0 256 257 #define TGSI_EXEC_TEMP_OUTPUT_I (TGSI_EXEC_NUM_TEMPS + 2) 258 #define TGSI_EXEC_TEMP_OUTPUT_C 1 259 260 #define TGSI_EXEC_TEMP_PRIMITIVE_I (TGSI_EXEC_NUM_TEMPS + 2) 261 #define TGSI_EXEC_TEMP_PRIMITIVE_C 2 262 263 #define TGSI_EXEC_TEMP_THREE_I (TGSI_EXEC_NUM_TEMPS + 2) 264 #define TGSI_EXEC_TEMP_THREE_C 3 265 266 #define TGSI_EXEC_TEMP_HALF_I (TGSI_EXEC_NUM_TEMPS + 3) 267 #define TGSI_EXEC_TEMP_HALF_C 0 268 269 /* 4 register buffer for various purposes */ 270 #define TGSI_EXEC_TEMP_R0 (TGSI_EXEC_NUM_TEMPS + 4) 271 #define TGSI_EXEC_NUM_TEMP_R 4 272 273 #define TGSI_EXEC_TEMP_ADDR (TGSI_EXEC_NUM_TEMPS + 8) 274 #define TGSI_EXEC_NUM_ADDRS 3 275 276 /* predicate register */ 277 #define TGSI_EXEC_TEMP_P0 (TGSI_EXEC_NUM_TEMPS + 11) 278 #define TGSI_EXEC_NUM_PREDS 1 279 280 #define TGSI_EXEC_NUM_TEMP_EXTRAS 12 281 282 283 284 #define TGSI_EXEC_MAX_NESTING 32 285 #define TGSI_EXEC_MAX_COND_NESTING TGSI_EXEC_MAX_NESTING 286 #define TGSI_EXEC_MAX_LOOP_NESTING TGSI_EXEC_MAX_NESTING 287 #define TGSI_EXEC_MAX_SWITCH_NESTING TGSI_EXEC_MAX_NESTING 288 #define TGSI_EXEC_MAX_CALL_NESTING TGSI_EXEC_MAX_NESTING 289 290 /* The maximum number of input attributes per vertex. For 2D 291 * input register files, this is the stride between two 1D 292 * arrays. 293 */ 294 #define TGSI_EXEC_MAX_INPUT_ATTRIBS 32 295 296 /* The maximum number of bytes per constant buffer. 297 */ 298 #define TGSI_EXEC_MAX_CONST_BUFFER_SIZE (4096 * sizeof(float[4])) 299 300 /* The maximum number of vertices per primitive */ 301 #define TGSI_MAX_PRIM_VERTICES 6 302 303 /* The maximum number of primitives to be generated */ 304 #define TGSI_MAX_PRIMITIVES 64 305 306 /* The maximum total number of vertices */ 307 #define TGSI_MAX_TOTAL_VERTICES (TGSI_MAX_PRIM_VERTICES * TGSI_MAX_PRIMITIVES * PIPE_MAX_ATTRIBS) 308 309 #define TGSI_MAX_MISC_INPUTS 8 310 311 /** function call/activation record */ 312 struct tgsi_call_record 313 { 314 uint CondStackTop; 315 uint LoopStackTop; 316 uint ContStackTop; 317 int SwitchStackTop; 318 int BreakStackTop; 319 uint ReturnAddr; 320 }; 321 322 323 /* Switch-case block state. */ 324 struct tgsi_switch_record { 325 uint mask; /**< execution mask */ 326 union tgsi_exec_channel selector; /**< a value case statements are compared to */ 327 uint defaultMask; /**< non-execute mask for default case */ 328 }; 329 330 331 enum tgsi_break_type { 332 TGSI_EXEC_BREAK_INSIDE_LOOP, 333 TGSI_EXEC_BREAK_INSIDE_SWITCH 334 }; 335 336 337 #define TGSI_EXEC_MAX_BREAK_STACK (TGSI_EXEC_MAX_LOOP_NESTING + TGSI_EXEC_MAX_SWITCH_NESTING) 338 339 340 /** 341 * Run-time virtual machine state for executing TGSI shader. 342 */ 343 struct tgsi_exec_machine 344 { 345 /* Total = program temporaries + internal temporaries 346 */ 347 struct tgsi_exec_vector Temps[TGSI_EXEC_NUM_TEMPS + 348 TGSI_EXEC_NUM_TEMP_EXTRAS]; 349 350 float Imms[TGSI_EXEC_NUM_IMMEDIATES][4]; 351 352 float ImmArray[TGSI_EXEC_NUM_IMMEDIATES][4]; 353 354 struct tgsi_exec_vector *Inputs; 355 struct tgsi_exec_vector *Outputs; 356 357 /* System values */ 358 unsigned SysSemanticToIndex[TGSI_SEMANTIC_COUNT]; 359 struct tgsi_exec_vector SystemValue[TGSI_MAX_MISC_INPUTS]; 360 361 struct tgsi_exec_vector *Addrs; 362 struct tgsi_exec_vector *Predicates; 363 364 struct tgsi_sampler *Sampler; 365 366 struct tgsi_image *Image; 367 struct tgsi_buffer *Buffer; 368 unsigned ImmLimit; 369 370 const void *Consts[PIPE_MAX_CONSTANT_BUFFERS]; 371 unsigned ConstsSize[PIPE_MAX_CONSTANT_BUFFERS]; 372 373 const struct tgsi_token *Tokens; /**< Declarations, instructions */ 374 enum pipe_shader_type ShaderType; /**< PIPE_SHADER_x */ 375 376 /* GEOMETRY processor only. */ 377 unsigned *Primitives; 378 unsigned NumOutputs; 379 unsigned MaxGeometryShaderOutputs; 380 unsigned MaxOutputVertices; 381 382 /* FRAGMENT processor only. */ 383 const struct tgsi_interp_coef *InterpCoefs; 384 struct tgsi_exec_vector QuadPos; 385 float Face; /**< +1 if front facing, -1 if back facing */ 386 bool flatshade_color; 387 388 /* Compute Only */ 389 void *LocalMem; 390 unsigned LocalMemSize; 391 392 /* See GLSL 4.50 specification for definition of helper invocations */ 393 uint NonHelperMask; /**< non-helpers */ 394 /* Conditional execution masks */ 395 uint CondMask; /**< For IF/ELSE/ENDIF */ 396 uint LoopMask; /**< For BGNLOOP/ENDLOOP */ 397 uint ContMask; /**< For loop CONT statements */ 398 uint FuncMask; /**< For function calls */ 399 uint ExecMask; /**< = CondMask & LoopMask */ 400 401 /* Current switch-case state. */ 402 struct tgsi_switch_record Switch; 403 404 /* Current break type. */ 405 enum tgsi_break_type BreakType; 406 407 /** Condition mask stack (for nested conditionals) */ 408 uint CondStack[TGSI_EXEC_MAX_COND_NESTING]; 409 int CondStackTop; 410 411 /** Loop mask stack (for nested loops) */ 412 uint LoopStack[TGSI_EXEC_MAX_LOOP_NESTING]; 413 int LoopStackTop; 414 415 /** Loop label stack */ 416 uint LoopLabelStack[TGSI_EXEC_MAX_LOOP_NESTING]; 417 int LoopLabelStackTop; 418 419 /** Loop continue mask stack (see comments in tgsi_exec.c) */ 420 uint ContStack[TGSI_EXEC_MAX_LOOP_NESTING]; 421 int ContStackTop; 422 423 /** Switch case stack */ 424 struct tgsi_switch_record SwitchStack[TGSI_EXEC_MAX_SWITCH_NESTING]; 425 int SwitchStackTop; 426 427 enum tgsi_break_type BreakStack[TGSI_EXEC_MAX_BREAK_STACK]; 428 int BreakStackTop; 429 430 /** Function execution mask stack (for executing subroutine code) */ 431 uint FuncStack[TGSI_EXEC_MAX_CALL_NESTING]; 432 int FuncStackTop; 433 434 /** Function call stack for saving/restoring the program counter */ 435 struct tgsi_call_record CallStack[TGSI_EXEC_MAX_CALL_NESTING]; 436 int CallStackTop; 437 438 struct tgsi_full_instruction *Instructions; 439 uint NumInstructions; 440 441 struct tgsi_full_declaration *Declarations; 442 uint NumDeclarations; 443 444 struct tgsi_declaration_sampler_view 445 SamplerViews[PIPE_MAX_SHADER_SAMPLER_VIEWS]; 446 447 boolean UsedGeometryShader; 448 449 int pc; 450 }; 451 452 struct tgsi_exec_machine * 453 tgsi_exec_machine_create(enum pipe_shader_type shader_type); 454 455 void 456 tgsi_exec_machine_destroy(struct tgsi_exec_machine *mach); 457 458 459 void 460 tgsi_exec_machine_bind_shader( 461 struct tgsi_exec_machine *mach, 462 const struct tgsi_token *tokens, 463 struct tgsi_sampler *sampler, 464 struct tgsi_image *image, 465 struct tgsi_buffer *buffer); 466 467 uint 468 tgsi_exec_machine_run( 469 struct tgsi_exec_machine *mach, int start_pc ); 470 471 472 void 473 tgsi_exec_machine_free_data(struct tgsi_exec_machine *mach); 474 475 476 boolean 477 tgsi_check_soa_dependencies(const struct tgsi_full_instruction *inst); 478 479 480 extern void 481 tgsi_exec_set_constant_buffers(struct tgsi_exec_machine *mach, 482 unsigned num_bufs, 483 const void **bufs, 484 const unsigned *buf_sizes); 485 486 487 static inline int 488 tgsi_exec_get_shader_param(enum pipe_shader_cap param) 489 { 490 switch(param) { 491 case PIPE_SHADER_CAP_MAX_INSTRUCTIONS: 492 case PIPE_SHADER_CAP_MAX_ALU_INSTRUCTIONS: 493 case PIPE_SHADER_CAP_MAX_TEX_INSTRUCTIONS: 494 case PIPE_SHADER_CAP_MAX_TEX_INDIRECTIONS: 495 return INT_MAX; 496 case PIPE_SHADER_CAP_MAX_CONTROL_FLOW_DEPTH: 497 return TGSI_EXEC_MAX_NESTING; 498 case PIPE_SHADER_CAP_MAX_INPUTS: 499 return TGSI_EXEC_MAX_INPUT_ATTRIBS; 500 case PIPE_SHADER_CAP_MAX_OUTPUTS: 501 return 32; 502 case PIPE_SHADER_CAP_MAX_CONST_BUFFER_SIZE: 503 return TGSI_EXEC_MAX_CONST_BUFFER_SIZE; 504 case PIPE_SHADER_CAP_MAX_CONST_BUFFERS: 505 return PIPE_MAX_CONSTANT_BUFFERS; 506 case PIPE_SHADER_CAP_MAX_TEMPS: 507 return TGSI_EXEC_NUM_TEMPS; 508 case PIPE_SHADER_CAP_MAX_PREDS: 509 return TGSI_EXEC_NUM_PREDS; 510 case PIPE_SHADER_CAP_TGSI_CONT_SUPPORTED: 511 return 1; 512 case PIPE_SHADER_CAP_INDIRECT_INPUT_ADDR: 513 case PIPE_SHADER_CAP_INDIRECT_OUTPUT_ADDR: 514 case PIPE_SHADER_CAP_INDIRECT_TEMP_ADDR: 515 case PIPE_SHADER_CAP_INDIRECT_CONST_ADDR: 516 return 1; 517 case PIPE_SHADER_CAP_SUBROUTINES: 518 return 1; 519 case PIPE_SHADER_CAP_INTEGERS: 520 return 1; 521 case PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS: 522 return PIPE_MAX_SAMPLERS; 523 case PIPE_SHADER_CAP_MAX_SAMPLER_VIEWS: 524 return PIPE_MAX_SHADER_SAMPLER_VIEWS; 525 case PIPE_SHADER_CAP_PREFERRED_IR: 526 return PIPE_SHADER_IR_TGSI; 527 case PIPE_SHADER_CAP_SUPPORTED_IRS: 528 return 1 << PIPE_SHADER_IR_TGSI; 529 case PIPE_SHADER_CAP_TGSI_SQRT_SUPPORTED: 530 return 1; 531 case PIPE_SHADER_CAP_DOUBLES: 532 case PIPE_SHADER_CAP_TGSI_DFRACEXP_DLDEXP_SUPPORTED: 533 case PIPE_SHADER_CAP_TGSI_ANY_INOUT_DECL_RANGE: 534 return 1; 535 case PIPE_SHADER_CAP_TGSI_DROUND_SUPPORTED: 536 case PIPE_SHADER_CAP_TGSI_FMA_SUPPORTED: 537 case PIPE_SHADER_CAP_LOWER_IF_THRESHOLD: 538 return 0; 539 case PIPE_SHADER_CAP_MAX_SHADER_BUFFERS: 540 return PIPE_MAX_SHADER_BUFFERS; 541 case PIPE_SHADER_CAP_MAX_SHADER_IMAGES: 542 return PIPE_MAX_SHADER_IMAGES; 543 544 case PIPE_SHADER_CAP_MAX_UNROLL_ITERATIONS_HINT: 545 return 32; 546 } 547 /* if we get here, we missed a shader cap above (and should have seen 548 * a compiler warning.) 549 */ 550 return 0; 551 } 552 553 #if defined __cplusplus 554 } /* extern "C" */ 555 #endif 556 557 #endif /* TGSI_EXEC_H */ 558