1 /************************************************************************** 2 * 3 * Copyright 2007 VMware, Inc. 4 * All Rights Reserved. 5 * 6 * Permission is hereby granted, free of charge, to any person obtaining a 7 * copy of this software and associated documentation files (the 8 * "Software"), to deal in the Software without restriction, including 9 * without limitation the rights to use, copy, modify, merge, publish, 10 * distribute, sub license, and/or sell copies of the Software, and to 11 * permit persons to whom the Software is furnished to do so, subject to 12 * the following conditions: 13 * 14 * The above copyright notice and this permission notice (including the 15 * next paragraph) shall be included in all copies or substantial portions 16 * of the Software. 17 * 18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 19 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 21 * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR 22 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 23 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 24 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25 * 26 **************************************************************************/ 27 /* 28 * Authors: 29 * Keith Whitwell <keithw (at) vmware.com> 30 * Brian Paul 31 */ 32 33 34 #include "main/imports.h" 35 #include "main/hash.h" 36 #include "main/mtypes.h" 37 #include "program/prog_parameter.h" 38 #include "program/prog_print.h" 39 #include "program/programopt.h" 40 41 #include "compiler/nir/nir.h" 42 43 #include "pipe/p_context.h" 44 #include "pipe/p_defines.h" 45 #include "pipe/p_shader_tokens.h" 46 #include "draw/draw_context.h" 47 #include "tgsi/tgsi_dump.h" 48 #include "tgsi/tgsi_emulate.h" 49 #include "tgsi/tgsi_parse.h" 50 #include "tgsi/tgsi_ureg.h" 51 52 #include "st_debug.h" 53 #include "st_cb_bitmap.h" 54 #include "st_cb_drawpixels.h" 55 #include "st_context.h" 56 #include "st_tgsi_lower_yuv.h" 57 #include "st_program.h" 58 #include "st_mesa_to_tgsi.h" 59 #include "st_atifs_to_tgsi.h" 60 #include "st_nir.h" 61 #include "cso_cache/cso_context.h" 62 63 64 65 /** 66 * Delete a vertex program variant. Note the caller must unlink 67 * the variant from the linked list. 68 */ 69 static void 70 delete_vp_variant(struct st_context *st, struct st_vp_variant *vpv) 71 { 72 if (vpv->driver_shader) 73 cso_delete_vertex_shader(st->cso_context, vpv->driver_shader); 74 75 if (vpv->draw_shader) 76 draw_delete_vertex_shader( st->draw, vpv->draw_shader ); 77 78 if (((vpv->tgsi.type == PIPE_SHADER_IR_TGSI)) && vpv->tgsi.tokens) 79 ureg_free_tokens(vpv->tgsi.tokens); 80 81 free( vpv ); 82 } 83 84 85 86 /** 87 * Clean out any old compilations: 88 */ 89 void 90 st_release_vp_variants( struct st_context *st, 91 struct st_vertex_program *stvp ) 92 { 93 struct st_vp_variant *vpv; 94 95 for (vpv = stvp->variants; vpv; ) { 96 struct st_vp_variant *next = vpv->next; 97 delete_vp_variant(st, vpv); 98 vpv = next; 99 } 100 101 stvp->variants = NULL; 102 103 if ((stvp->tgsi.type == PIPE_SHADER_IR_TGSI) && stvp->tgsi.tokens) { 104 tgsi_free_tokens(stvp->tgsi.tokens); 105 stvp->tgsi.tokens = NULL; 106 } 107 } 108 109 110 111 /** 112 * Delete a fragment program variant. Note the caller must unlink 113 * the variant from the linked list. 114 */ 115 static void 116 delete_fp_variant(struct st_context *st, struct st_fp_variant *fpv) 117 { 118 if (fpv->driver_shader) 119 cso_delete_fragment_shader(st->cso_context, fpv->driver_shader); 120 free(fpv); 121 } 122 123 124 /** 125 * Free all variants of a fragment program. 126 */ 127 void 128 st_release_fp_variants(struct st_context *st, struct st_fragment_program *stfp) 129 { 130 struct st_fp_variant *fpv; 131 132 for (fpv = stfp->variants; fpv; ) { 133 struct st_fp_variant *next = fpv->next; 134 delete_fp_variant(st, fpv); 135 fpv = next; 136 } 137 138 stfp->variants = NULL; 139 140 if ((stfp->tgsi.type == PIPE_SHADER_IR_TGSI) && stfp->tgsi.tokens) { 141 ureg_free_tokens(stfp->tgsi.tokens); 142 stfp->tgsi.tokens = NULL; 143 } 144 } 145 146 147 /** 148 * Delete a basic program variant. Note the caller must unlink 149 * the variant from the linked list. 150 */ 151 static void 152 delete_basic_variant(struct st_context *st, struct st_basic_variant *v, 153 GLenum target) 154 { 155 if (v->driver_shader) { 156 switch (target) { 157 case GL_TESS_CONTROL_PROGRAM_NV: 158 cso_delete_tessctrl_shader(st->cso_context, v->driver_shader); 159 break; 160 case GL_TESS_EVALUATION_PROGRAM_NV: 161 cso_delete_tesseval_shader(st->cso_context, v->driver_shader); 162 break; 163 case GL_GEOMETRY_PROGRAM_NV: 164 cso_delete_geometry_shader(st->cso_context, v->driver_shader); 165 break; 166 case GL_COMPUTE_PROGRAM_NV: 167 cso_delete_compute_shader(st->cso_context, v->driver_shader); 168 break; 169 default: 170 assert(!"this shouldn't occur"); 171 } 172 } 173 174 free(v); 175 } 176 177 178 /** 179 * Free all basic program variants. 180 */ 181 void 182 st_release_basic_variants(struct st_context *st, GLenum target, 183 struct st_basic_variant **variants, 184 struct pipe_shader_state *tgsi) 185 { 186 struct st_basic_variant *v; 187 188 for (v = *variants; v; ) { 189 struct st_basic_variant *next = v->next; 190 delete_basic_variant(st, v, target); 191 v = next; 192 } 193 194 *variants = NULL; 195 196 if (tgsi->tokens) { 197 ureg_free_tokens(tgsi->tokens); 198 tgsi->tokens = NULL; 199 } 200 } 201 202 203 /** 204 * Free all variants of a compute program. 205 */ 206 void 207 st_release_cp_variants(struct st_context *st, struct st_compute_program *stcp) 208 { 209 struct st_basic_variant **variants = &stcp->variants; 210 struct st_basic_variant *v; 211 212 for (v = *variants; v; ) { 213 struct st_basic_variant *next = v->next; 214 delete_basic_variant(st, v, stcp->Base.Target); 215 v = next; 216 } 217 218 *variants = NULL; 219 220 if (stcp->tgsi.prog) { 221 ureg_free_tokens(stcp->tgsi.prog); 222 stcp->tgsi.prog = NULL; 223 } 224 } 225 226 227 /** 228 * Translate a vertex program. 229 */ 230 bool 231 st_translate_vertex_program(struct st_context *st, 232 struct st_vertex_program *stvp) 233 { 234 struct ureg_program *ureg; 235 enum pipe_error error; 236 unsigned num_outputs = 0; 237 unsigned attr; 238 unsigned input_to_index[VERT_ATTRIB_MAX] = {0}; 239 unsigned output_slot_to_attr[VARYING_SLOT_MAX] = {0}; 240 ubyte output_semantic_name[VARYING_SLOT_MAX] = {0}; 241 ubyte output_semantic_index[VARYING_SLOT_MAX] = {0}; 242 243 stvp->num_inputs = 0; 244 245 if (stvp->Base.arb.IsPositionInvariant) 246 _mesa_insert_mvp_code(st->ctx, &stvp->Base); 247 248 /* 249 * Determine number of inputs, the mappings between VERT_ATTRIB_x 250 * and TGSI generic input indexes, plus input attrib semantic info. 251 */ 252 for (attr = 0; attr < VERT_ATTRIB_MAX; attr++) { 253 if ((stvp->Base.info.inputs_read & BITFIELD64_BIT(attr)) != 0) { 254 input_to_index[attr] = stvp->num_inputs; 255 stvp->index_to_input[stvp->num_inputs] = attr; 256 stvp->num_inputs++; 257 if ((stvp->Base.info.double_inputs_read & 258 BITFIELD64_BIT(attr)) != 0) { 259 /* add placeholder for second part of a double attribute */ 260 stvp->index_to_input[stvp->num_inputs] = ST_DOUBLE_ATTRIB_PLACEHOLDER; 261 stvp->num_inputs++; 262 } 263 } 264 } 265 /* bit of a hack, presetup potentially unused edgeflag input */ 266 input_to_index[VERT_ATTRIB_EDGEFLAG] = stvp->num_inputs; 267 stvp->index_to_input[stvp->num_inputs] = VERT_ATTRIB_EDGEFLAG; 268 269 /* Compute mapping of vertex program outputs to slots. 270 */ 271 for (attr = 0; attr < VARYING_SLOT_MAX; attr++) { 272 if ((stvp->Base.info.outputs_written & BITFIELD64_BIT(attr)) == 0) { 273 stvp->result_to_output[attr] = ~0; 274 } 275 else { 276 unsigned slot = num_outputs++; 277 278 stvp->result_to_output[attr] = slot; 279 output_slot_to_attr[slot] = attr; 280 281 switch (attr) { 282 case VARYING_SLOT_POS: 283 output_semantic_name[slot] = TGSI_SEMANTIC_POSITION; 284 output_semantic_index[slot] = 0; 285 break; 286 case VARYING_SLOT_COL0: 287 output_semantic_name[slot] = TGSI_SEMANTIC_COLOR; 288 output_semantic_index[slot] = 0; 289 break; 290 case VARYING_SLOT_COL1: 291 output_semantic_name[slot] = TGSI_SEMANTIC_COLOR; 292 output_semantic_index[slot] = 1; 293 break; 294 case VARYING_SLOT_BFC0: 295 output_semantic_name[slot] = TGSI_SEMANTIC_BCOLOR; 296 output_semantic_index[slot] = 0; 297 break; 298 case VARYING_SLOT_BFC1: 299 output_semantic_name[slot] = TGSI_SEMANTIC_BCOLOR; 300 output_semantic_index[slot] = 1; 301 break; 302 case VARYING_SLOT_FOGC: 303 output_semantic_name[slot] = TGSI_SEMANTIC_FOG; 304 output_semantic_index[slot] = 0; 305 break; 306 case VARYING_SLOT_PSIZ: 307 output_semantic_name[slot] = TGSI_SEMANTIC_PSIZE; 308 output_semantic_index[slot] = 0; 309 break; 310 case VARYING_SLOT_CLIP_DIST0: 311 output_semantic_name[slot] = TGSI_SEMANTIC_CLIPDIST; 312 output_semantic_index[slot] = 0; 313 break; 314 case VARYING_SLOT_CLIP_DIST1: 315 output_semantic_name[slot] = TGSI_SEMANTIC_CLIPDIST; 316 output_semantic_index[slot] = 1; 317 break; 318 case VARYING_SLOT_CULL_DIST0: 319 case VARYING_SLOT_CULL_DIST1: 320 /* these should have been lowered by GLSL */ 321 assert(0); 322 break; 323 case VARYING_SLOT_EDGE: 324 assert(0); 325 break; 326 case VARYING_SLOT_CLIP_VERTEX: 327 output_semantic_name[slot] = TGSI_SEMANTIC_CLIPVERTEX; 328 output_semantic_index[slot] = 0; 329 break; 330 case VARYING_SLOT_LAYER: 331 output_semantic_name[slot] = TGSI_SEMANTIC_LAYER; 332 output_semantic_index[slot] = 0; 333 break; 334 case VARYING_SLOT_VIEWPORT: 335 output_semantic_name[slot] = TGSI_SEMANTIC_VIEWPORT_INDEX; 336 output_semantic_index[slot] = 0; 337 break; 338 339 case VARYING_SLOT_TEX0: 340 case VARYING_SLOT_TEX1: 341 case VARYING_SLOT_TEX2: 342 case VARYING_SLOT_TEX3: 343 case VARYING_SLOT_TEX4: 344 case VARYING_SLOT_TEX5: 345 case VARYING_SLOT_TEX6: 346 case VARYING_SLOT_TEX7: 347 if (st->needs_texcoord_semantic) { 348 output_semantic_name[slot] = TGSI_SEMANTIC_TEXCOORD; 349 output_semantic_index[slot] = attr - VARYING_SLOT_TEX0; 350 break; 351 } 352 /* fall through */ 353 case VARYING_SLOT_VAR0: 354 default: 355 assert(attr >= VARYING_SLOT_VAR0 || 356 (attr >= VARYING_SLOT_TEX0 && attr <= VARYING_SLOT_TEX7)); 357 output_semantic_name[slot] = TGSI_SEMANTIC_GENERIC; 358 output_semantic_index[slot] = 359 st_get_generic_varying_index(st, attr); 360 break; 361 } 362 } 363 } 364 /* similar hack to above, presetup potentially unused edgeflag output */ 365 stvp->result_to_output[VARYING_SLOT_EDGE] = num_outputs; 366 output_semantic_name[num_outputs] = TGSI_SEMANTIC_EDGEFLAG; 367 output_semantic_index[num_outputs] = 0; 368 369 /* ARB_vp: */ 370 if (!stvp->glsl_to_tgsi && !stvp->shader_program) { 371 _mesa_remove_output_reads(&stvp->Base, PROGRAM_OUTPUT); 372 373 /* This determines which states will be updated when the assembly 374 * shader is bound. 375 */ 376 stvp->affected_states = ST_NEW_VS_STATE | 377 ST_NEW_RASTERIZER | 378 ST_NEW_VERTEX_ARRAYS; 379 380 if (stvp->Base.Parameters->NumParameters) 381 stvp->affected_states |= ST_NEW_VS_CONSTANTS; 382 383 /* No samplers are allowed in ARB_vp. */ 384 } 385 386 if (stvp->shader_program) { 387 nir_shader *nir = st_glsl_to_nir(st, &stvp->Base, stvp->shader_program, 388 MESA_SHADER_VERTEX); 389 390 stvp->tgsi.type = PIPE_SHADER_IR_NIR; 391 stvp->tgsi.ir.nir = nir; 392 393 st_translate_stream_output_info2(stvp->shader_program->xfb_program->sh.LinkedTransformFeedback, 394 stvp->result_to_output, 395 &stvp->tgsi.stream_output); 396 return true; 397 } 398 399 ureg = ureg_create_with_screen(PIPE_SHADER_VERTEX, st->pipe->screen); 400 if (ureg == NULL) 401 return false; 402 403 if (stvp->Base.ClipDistanceArraySize) 404 ureg_property(ureg, TGSI_PROPERTY_NUM_CLIPDIST_ENABLED, 405 stvp->Base.ClipDistanceArraySize); 406 if (stvp->Base.CullDistanceArraySize) 407 ureg_property(ureg, TGSI_PROPERTY_NUM_CULLDIST_ENABLED, 408 stvp->Base.CullDistanceArraySize); 409 410 if (ST_DEBUG & DEBUG_MESA) { 411 _mesa_print_program(&stvp->Base); 412 _mesa_print_program_parameters(st->ctx, &stvp->Base); 413 debug_printf("\n"); 414 } 415 416 if (stvp->glsl_to_tgsi) { 417 error = st_translate_program(st->ctx, 418 PIPE_SHADER_VERTEX, 419 ureg, 420 stvp->glsl_to_tgsi, 421 &stvp->Base, 422 /* inputs */ 423 stvp->num_inputs, 424 input_to_index, 425 NULL, /* inputSlotToAttr */ 426 NULL, /* input semantic name */ 427 NULL, /* input semantic index */ 428 NULL, /* interp mode */ 429 /* outputs */ 430 num_outputs, 431 stvp->result_to_output, 432 output_slot_to_attr, 433 output_semantic_name, 434 output_semantic_index); 435 436 st_translate_stream_output_info(stvp->glsl_to_tgsi, 437 stvp->result_to_output, 438 &stvp->tgsi.stream_output); 439 440 free_glsl_to_tgsi_visitor(stvp->glsl_to_tgsi); 441 stvp->glsl_to_tgsi = NULL; 442 } else 443 error = st_translate_mesa_program(st->ctx, 444 PIPE_SHADER_VERTEX, 445 ureg, 446 &stvp->Base, 447 /* inputs */ 448 stvp->num_inputs, 449 input_to_index, 450 NULL, /* input semantic name */ 451 NULL, /* input semantic index */ 452 NULL, 453 /* outputs */ 454 num_outputs, 455 stvp->result_to_output, 456 output_semantic_name, 457 output_semantic_index); 458 459 if (error) { 460 debug_printf("%s: failed to translate Mesa program:\n", __func__); 461 _mesa_print_program(&stvp->Base); 462 debug_assert(0); 463 return false; 464 } 465 466 stvp->tgsi.tokens = ureg_get_tokens(ureg, NULL); 467 ureg_destroy(ureg); 468 return stvp->tgsi.tokens != NULL; 469 } 470 471 static struct st_vp_variant * 472 st_create_vp_variant(struct st_context *st, 473 struct st_vertex_program *stvp, 474 const struct st_vp_variant_key *key) 475 { 476 struct st_vp_variant *vpv = CALLOC_STRUCT(st_vp_variant); 477 struct pipe_context *pipe = st->pipe; 478 479 vpv->key = *key; 480 vpv->tgsi.stream_output = stvp->tgsi.stream_output; 481 vpv->num_inputs = stvp->num_inputs; 482 483 if (stvp->tgsi.type == PIPE_SHADER_IR_NIR) { 484 vpv->tgsi.type = PIPE_SHADER_IR_NIR; 485 vpv->tgsi.ir.nir = nir_shader_clone(NULL, stvp->tgsi.ir.nir); 486 if (key->clamp_color) 487 NIR_PASS_V(vpv->tgsi.ir.nir, nir_lower_clamp_color_outputs); 488 if (key->passthrough_edgeflags) 489 NIR_PASS_V(vpv->tgsi.ir.nir, nir_lower_passthrough_edgeflags); 490 491 st_finalize_nir(st, &stvp->Base, vpv->tgsi.ir.nir); 492 493 vpv->driver_shader = pipe->create_vs_state(pipe, &vpv->tgsi); 494 /* driver takes ownership of IR: */ 495 vpv->tgsi.ir.nir = NULL; 496 return vpv; 497 } 498 499 vpv->tgsi.tokens = tgsi_dup_tokens(stvp->tgsi.tokens); 500 501 /* Emulate features. */ 502 if (key->clamp_color || key->passthrough_edgeflags) { 503 const struct tgsi_token *tokens; 504 unsigned flags = 505 (key->clamp_color ? TGSI_EMU_CLAMP_COLOR_OUTPUTS : 0) | 506 (key->passthrough_edgeflags ? TGSI_EMU_PASSTHROUGH_EDGEFLAG : 0); 507 508 tokens = tgsi_emulate(vpv->tgsi.tokens, flags); 509 510 if (tokens) { 511 tgsi_free_tokens(vpv->tgsi.tokens); 512 vpv->tgsi.tokens = tokens; 513 514 if (key->passthrough_edgeflags) 515 vpv->num_inputs++; 516 } else 517 fprintf(stderr, "mesa: cannot emulate deprecated features\n"); 518 } 519 520 if (ST_DEBUG & DEBUG_TGSI) { 521 tgsi_dump(vpv->tgsi.tokens, 0); 522 debug_printf("\n"); 523 } 524 525 vpv->driver_shader = pipe->create_vs_state(pipe, &vpv->tgsi); 526 return vpv; 527 } 528 529 530 /** 531 * Find/create a vertex program variant. 532 */ 533 struct st_vp_variant * 534 st_get_vp_variant(struct st_context *st, 535 struct st_vertex_program *stvp, 536 const struct st_vp_variant_key *key) 537 { 538 struct st_vp_variant *vpv; 539 540 /* Search for existing variant */ 541 for (vpv = stvp->variants; vpv; vpv = vpv->next) { 542 if (memcmp(&vpv->key, key, sizeof(*key)) == 0) { 543 break; 544 } 545 } 546 547 if (!vpv) { 548 /* create now */ 549 vpv = st_create_vp_variant(st, stvp, key); 550 if (vpv) { 551 /* insert into list */ 552 vpv->next = stvp->variants; 553 stvp->variants = vpv; 554 } 555 } 556 557 return vpv; 558 } 559 560 561 /** 562 * Translate a Mesa fragment shader into a TGSI shader. 563 */ 564 bool 565 st_translate_fragment_program(struct st_context *st, 566 struct st_fragment_program *stfp) 567 { 568 GLuint outputMapping[2 * FRAG_RESULT_MAX]; 569 GLuint inputMapping[VARYING_SLOT_MAX]; 570 GLuint inputSlotToAttr[VARYING_SLOT_MAX]; 571 GLuint interpMode[PIPE_MAX_SHADER_INPUTS]; /* XXX size? */ 572 GLuint attr; 573 GLbitfield64 inputsRead; 574 struct ureg_program *ureg; 575 576 GLboolean write_all = GL_FALSE; 577 578 ubyte input_semantic_name[PIPE_MAX_SHADER_INPUTS]; 579 ubyte input_semantic_index[PIPE_MAX_SHADER_INPUTS]; 580 uint fs_num_inputs = 0; 581 582 ubyte fs_output_semantic_name[PIPE_MAX_SHADER_OUTPUTS]; 583 ubyte fs_output_semantic_index[PIPE_MAX_SHADER_OUTPUTS]; 584 uint fs_num_outputs = 0; 585 586 memset(inputSlotToAttr, ~0, sizeof(inputSlotToAttr)); 587 588 /* Non-GLSL programs: */ 589 if (!stfp->glsl_to_tgsi && !stfp->shader_program) { 590 _mesa_remove_output_reads(&stfp->Base, PROGRAM_OUTPUT); 591 if (st->ctx->Const.GLSLFragCoordIsSysVal) 592 _mesa_program_fragment_position_to_sysval(&stfp->Base); 593 594 /* This determines which states will be updated when the assembly 595 * shader is bound. 596 * 597 * fragment.position and glDrawPixels always use constants. 598 */ 599 stfp->affected_states = ST_NEW_FS_STATE | 600 ST_NEW_SAMPLE_SHADING | 601 ST_NEW_FS_CONSTANTS; 602 603 if (stfp->ati_fs) { 604 /* Just set them for ATI_fs unconditionally. */ 605 stfp->affected_states |= ST_NEW_FS_SAMPLER_VIEWS | 606 ST_NEW_RENDER_SAMPLERS; 607 } else { 608 /* ARB_fp */ 609 if (stfp->Base.SamplersUsed) 610 stfp->affected_states |= ST_NEW_FS_SAMPLER_VIEWS | 611 ST_NEW_RENDER_SAMPLERS; 612 } 613 } 614 615 /* 616 * Convert Mesa program inputs to TGSI input register semantics. 617 */ 618 inputsRead = stfp->Base.info.inputs_read; 619 for (attr = 0; attr < VARYING_SLOT_MAX; attr++) { 620 if ((inputsRead & BITFIELD64_BIT(attr)) != 0) { 621 const GLuint slot = fs_num_inputs++; 622 623 inputMapping[attr] = slot; 624 inputSlotToAttr[slot] = attr; 625 626 switch (attr) { 627 case VARYING_SLOT_POS: 628 input_semantic_name[slot] = TGSI_SEMANTIC_POSITION; 629 input_semantic_index[slot] = 0; 630 interpMode[slot] = TGSI_INTERPOLATE_LINEAR; 631 break; 632 case VARYING_SLOT_COL0: 633 input_semantic_name[slot] = TGSI_SEMANTIC_COLOR; 634 input_semantic_index[slot] = 0; 635 interpMode[slot] = stfp->glsl_to_tgsi ? 636 TGSI_INTERPOLATE_COUNT : TGSI_INTERPOLATE_COLOR; 637 break; 638 case VARYING_SLOT_COL1: 639 input_semantic_name[slot] = TGSI_SEMANTIC_COLOR; 640 input_semantic_index[slot] = 1; 641 interpMode[slot] = stfp->glsl_to_tgsi ? 642 TGSI_INTERPOLATE_COUNT : TGSI_INTERPOLATE_COLOR; 643 break; 644 case VARYING_SLOT_FOGC: 645 input_semantic_name[slot] = TGSI_SEMANTIC_FOG; 646 input_semantic_index[slot] = 0; 647 interpMode[slot] = TGSI_INTERPOLATE_PERSPECTIVE; 648 break; 649 case VARYING_SLOT_FACE: 650 input_semantic_name[slot] = TGSI_SEMANTIC_FACE; 651 input_semantic_index[slot] = 0; 652 interpMode[slot] = TGSI_INTERPOLATE_CONSTANT; 653 break; 654 case VARYING_SLOT_PRIMITIVE_ID: 655 input_semantic_name[slot] = TGSI_SEMANTIC_PRIMID; 656 input_semantic_index[slot] = 0; 657 interpMode[slot] = TGSI_INTERPOLATE_CONSTANT; 658 break; 659 case VARYING_SLOT_LAYER: 660 input_semantic_name[slot] = TGSI_SEMANTIC_LAYER; 661 input_semantic_index[slot] = 0; 662 interpMode[slot] = TGSI_INTERPOLATE_CONSTANT; 663 break; 664 case VARYING_SLOT_VIEWPORT: 665 input_semantic_name[slot] = TGSI_SEMANTIC_VIEWPORT_INDEX; 666 input_semantic_index[slot] = 0; 667 interpMode[slot] = TGSI_INTERPOLATE_CONSTANT; 668 break; 669 case VARYING_SLOT_CLIP_DIST0: 670 input_semantic_name[slot] = TGSI_SEMANTIC_CLIPDIST; 671 input_semantic_index[slot] = 0; 672 interpMode[slot] = TGSI_INTERPOLATE_PERSPECTIVE; 673 break; 674 case VARYING_SLOT_CLIP_DIST1: 675 input_semantic_name[slot] = TGSI_SEMANTIC_CLIPDIST; 676 input_semantic_index[slot] = 1; 677 interpMode[slot] = TGSI_INTERPOLATE_PERSPECTIVE; 678 break; 679 case VARYING_SLOT_CULL_DIST0: 680 case VARYING_SLOT_CULL_DIST1: 681 /* these should have been lowered by GLSL */ 682 assert(0); 683 break; 684 /* In most cases, there is nothing special about these 685 * inputs, so adopt a convention to use the generic 686 * semantic name and the mesa VARYING_SLOT_ number as the 687 * index. 688 * 689 * All that is required is that the vertex shader labels 690 * its own outputs similarly, and that the vertex shader 691 * generates at least every output required by the 692 * fragment shader plus fixed-function hardware (such as 693 * BFC). 694 * 695 * However, some drivers may need us to identify the PNTC and TEXi 696 * varyings if, for example, their capability to replace them with 697 * sprite coordinates is limited. 698 */ 699 case VARYING_SLOT_PNTC: 700 if (st->needs_texcoord_semantic) { 701 input_semantic_name[slot] = TGSI_SEMANTIC_PCOORD; 702 input_semantic_index[slot] = 0; 703 interpMode[slot] = TGSI_INTERPOLATE_LINEAR; 704 break; 705 } 706 /* fall through */ 707 case VARYING_SLOT_TEX0: 708 case VARYING_SLOT_TEX1: 709 case VARYING_SLOT_TEX2: 710 case VARYING_SLOT_TEX3: 711 case VARYING_SLOT_TEX4: 712 case VARYING_SLOT_TEX5: 713 case VARYING_SLOT_TEX6: 714 case VARYING_SLOT_TEX7: 715 if (st->needs_texcoord_semantic) { 716 input_semantic_name[slot] = TGSI_SEMANTIC_TEXCOORD; 717 input_semantic_index[slot] = attr - VARYING_SLOT_TEX0; 718 interpMode[slot] = stfp->glsl_to_tgsi ? 719 TGSI_INTERPOLATE_COUNT : TGSI_INTERPOLATE_PERSPECTIVE; 720 break; 721 } 722 /* fall through */ 723 case VARYING_SLOT_VAR0: 724 default: 725 /* Semantic indices should be zero-based because drivers may choose 726 * to assign a fixed slot determined by that index. 727 * This is useful because ARB_separate_shader_objects uses location 728 * qualifiers for linkage, and if the semantic index corresponds to 729 * these locations, linkage passes in the driver become unecessary. 730 * 731 * If needs_texcoord_semantic is true, no semantic indices will be 732 * consumed for the TEXi varyings, and we can base the locations of 733 * the user varyings on VAR0. Otherwise, we use TEX0 as base index. 734 */ 735 assert(attr >= VARYING_SLOT_VAR0 || attr == VARYING_SLOT_PNTC || 736 (attr >= VARYING_SLOT_TEX0 && attr <= VARYING_SLOT_TEX7)); 737 input_semantic_name[slot] = TGSI_SEMANTIC_GENERIC; 738 input_semantic_index[slot] = st_get_generic_varying_index(st, attr); 739 if (attr == VARYING_SLOT_PNTC) 740 interpMode[slot] = TGSI_INTERPOLATE_LINEAR; 741 else { 742 interpMode[slot] = stfp->glsl_to_tgsi ? 743 TGSI_INTERPOLATE_COUNT : TGSI_INTERPOLATE_PERSPECTIVE; 744 } 745 break; 746 } 747 } 748 else { 749 inputMapping[attr] = -1; 750 } 751 } 752 753 /* 754 * Semantics and mapping for outputs 755 */ 756 { 757 GLbitfield64 outputsWritten = stfp->Base.info.outputs_written; 758 759 /* if z is written, emit that first */ 760 if (outputsWritten & BITFIELD64_BIT(FRAG_RESULT_DEPTH)) { 761 fs_output_semantic_name[fs_num_outputs] = TGSI_SEMANTIC_POSITION; 762 fs_output_semantic_index[fs_num_outputs] = 0; 763 outputMapping[FRAG_RESULT_DEPTH] = fs_num_outputs; 764 fs_num_outputs++; 765 outputsWritten &= ~(1 << FRAG_RESULT_DEPTH); 766 } 767 768 if (outputsWritten & BITFIELD64_BIT(FRAG_RESULT_STENCIL)) { 769 fs_output_semantic_name[fs_num_outputs] = TGSI_SEMANTIC_STENCIL; 770 fs_output_semantic_index[fs_num_outputs] = 0; 771 outputMapping[FRAG_RESULT_STENCIL] = fs_num_outputs; 772 fs_num_outputs++; 773 outputsWritten &= ~(1 << FRAG_RESULT_STENCIL); 774 } 775 776 if (outputsWritten & BITFIELD64_BIT(FRAG_RESULT_SAMPLE_MASK)) { 777 fs_output_semantic_name[fs_num_outputs] = TGSI_SEMANTIC_SAMPLEMASK; 778 fs_output_semantic_index[fs_num_outputs] = 0; 779 outputMapping[FRAG_RESULT_SAMPLE_MASK] = fs_num_outputs; 780 fs_num_outputs++; 781 outputsWritten &= ~(1 << FRAG_RESULT_SAMPLE_MASK); 782 } 783 784 /* handle remaining outputs (color) */ 785 for (attr = 0; attr < ARRAY_SIZE(outputMapping); attr++) { 786 const GLbitfield64 written = attr < FRAG_RESULT_MAX ? outputsWritten : 787 stfp->Base.SecondaryOutputsWritten; 788 const unsigned loc = attr % FRAG_RESULT_MAX; 789 790 if (written & BITFIELD64_BIT(loc)) { 791 switch (loc) { 792 case FRAG_RESULT_DEPTH: 793 case FRAG_RESULT_STENCIL: 794 case FRAG_RESULT_SAMPLE_MASK: 795 /* handled above */ 796 assert(0); 797 break; 798 case FRAG_RESULT_COLOR: 799 write_all = GL_TRUE; /* fallthrough */ 800 default: { 801 int index; 802 assert(loc == FRAG_RESULT_COLOR || 803 (FRAG_RESULT_DATA0 <= loc && loc < FRAG_RESULT_MAX)); 804 805 index = (loc == FRAG_RESULT_COLOR) ? 0 : (loc - FRAG_RESULT_DATA0); 806 807 if (attr >= FRAG_RESULT_MAX) { 808 /* Secondary color for dual source blending. */ 809 assert(index == 0); 810 index++; 811 } 812 813 fs_output_semantic_name[fs_num_outputs] = TGSI_SEMANTIC_COLOR; 814 fs_output_semantic_index[fs_num_outputs] = index; 815 outputMapping[attr] = fs_num_outputs; 816 break; 817 } 818 } 819 820 fs_num_outputs++; 821 } 822 } 823 } 824 825 if (stfp->shader_program) { 826 nir_shader *nir = st_glsl_to_nir(st, &stfp->Base, stfp->shader_program, 827 MESA_SHADER_FRAGMENT); 828 829 stfp->tgsi.type = PIPE_SHADER_IR_NIR; 830 stfp->tgsi.ir.nir = nir; 831 832 return true; 833 } 834 835 ureg = ureg_create_with_screen(PIPE_SHADER_FRAGMENT, st->pipe->screen); 836 if (ureg == NULL) 837 return false; 838 839 if (ST_DEBUG & DEBUG_MESA) { 840 _mesa_print_program(&stfp->Base); 841 _mesa_print_program_parameters(st->ctx, &stfp->Base); 842 debug_printf("\n"); 843 } 844 if (write_all == GL_TRUE) 845 ureg_property(ureg, TGSI_PROPERTY_FS_COLOR0_WRITES_ALL_CBUFS, 1); 846 847 if (stfp->Base.info.fs.depth_layout != FRAG_DEPTH_LAYOUT_NONE) { 848 switch (stfp->Base.info.fs.depth_layout) { 849 case FRAG_DEPTH_LAYOUT_ANY: 850 ureg_property(ureg, TGSI_PROPERTY_FS_DEPTH_LAYOUT, 851 TGSI_FS_DEPTH_LAYOUT_ANY); 852 break; 853 case FRAG_DEPTH_LAYOUT_GREATER: 854 ureg_property(ureg, TGSI_PROPERTY_FS_DEPTH_LAYOUT, 855 TGSI_FS_DEPTH_LAYOUT_GREATER); 856 break; 857 case FRAG_DEPTH_LAYOUT_LESS: 858 ureg_property(ureg, TGSI_PROPERTY_FS_DEPTH_LAYOUT, 859 TGSI_FS_DEPTH_LAYOUT_LESS); 860 break; 861 case FRAG_DEPTH_LAYOUT_UNCHANGED: 862 ureg_property(ureg, TGSI_PROPERTY_FS_DEPTH_LAYOUT, 863 TGSI_FS_DEPTH_LAYOUT_UNCHANGED); 864 break; 865 default: 866 assert(0); 867 } 868 } 869 870 if (stfp->glsl_to_tgsi) { 871 st_translate_program(st->ctx, 872 PIPE_SHADER_FRAGMENT, 873 ureg, 874 stfp->glsl_to_tgsi, 875 &stfp->Base, 876 /* inputs */ 877 fs_num_inputs, 878 inputMapping, 879 inputSlotToAttr, 880 input_semantic_name, 881 input_semantic_index, 882 interpMode, 883 /* outputs */ 884 fs_num_outputs, 885 outputMapping, 886 NULL, 887 fs_output_semantic_name, 888 fs_output_semantic_index); 889 890 free_glsl_to_tgsi_visitor(stfp->glsl_to_tgsi); 891 stfp->glsl_to_tgsi = NULL; 892 } else if (stfp->ati_fs) 893 st_translate_atifs_program(ureg, 894 stfp->ati_fs, 895 &stfp->Base, 896 /* inputs */ 897 fs_num_inputs, 898 inputMapping, 899 input_semantic_name, 900 input_semantic_index, 901 interpMode, 902 /* outputs */ 903 fs_num_outputs, 904 outputMapping, 905 fs_output_semantic_name, 906 fs_output_semantic_index); 907 else 908 st_translate_mesa_program(st->ctx, 909 PIPE_SHADER_FRAGMENT, 910 ureg, 911 &stfp->Base, 912 /* inputs */ 913 fs_num_inputs, 914 inputMapping, 915 input_semantic_name, 916 input_semantic_index, 917 interpMode, 918 /* outputs */ 919 fs_num_outputs, 920 outputMapping, 921 fs_output_semantic_name, 922 fs_output_semantic_index); 923 924 stfp->tgsi.tokens = ureg_get_tokens(ureg, NULL); 925 ureg_destroy(ureg); 926 return stfp->tgsi.tokens != NULL; 927 } 928 929 static struct st_fp_variant * 930 st_create_fp_variant(struct st_context *st, 931 struct st_fragment_program *stfp, 932 const struct st_fp_variant_key *key) 933 { 934 struct pipe_context *pipe = st->pipe; 935 struct st_fp_variant *variant = CALLOC_STRUCT(st_fp_variant); 936 struct pipe_shader_state tgsi = {0}; 937 struct gl_program_parameter_list *params = stfp->Base.Parameters; 938 static const gl_state_index texcoord_state[STATE_LENGTH] = 939 { STATE_INTERNAL, STATE_CURRENT_ATTRIB, VERT_ATTRIB_TEX0 }; 940 static const gl_state_index scale_state[STATE_LENGTH] = 941 { STATE_INTERNAL, STATE_PT_SCALE }; 942 static const gl_state_index bias_state[STATE_LENGTH] = 943 { STATE_INTERNAL, STATE_PT_BIAS }; 944 945 if (!variant) 946 return NULL; 947 948 if (stfp->tgsi.type == PIPE_SHADER_IR_NIR) { 949 tgsi.type = PIPE_SHADER_IR_NIR; 950 tgsi.ir.nir = nir_shader_clone(NULL, stfp->tgsi.ir.nir); 951 952 if (key->clamp_color) 953 NIR_PASS_V(tgsi.ir.nir, nir_lower_clamp_color_outputs); 954 955 if (key->persample_shading) { 956 nir_shader *shader = tgsi.ir.nir; 957 nir_foreach_variable(var, &shader->inputs) 958 var->data.sample = true; 959 } 960 961 assert(!(key->bitmap && key->drawpixels)); 962 963 /* glBitmap */ 964 if (key->bitmap) { 965 nir_lower_bitmap_options options = {0}; 966 967 variant->bitmap_sampler = ffs(~stfp->Base.SamplersUsed) - 1; 968 options.sampler = variant->bitmap_sampler; 969 options.swizzle_xxxx = (st->bitmap.tex_format == PIPE_FORMAT_L8_UNORM); 970 971 NIR_PASS_V(tgsi.ir.nir, nir_lower_bitmap, &options); 972 } 973 974 /* glDrawPixels (color only) */ 975 if (key->drawpixels) { 976 nir_lower_drawpixels_options options = {{0}}; 977 unsigned samplers_used = stfp->Base.SamplersUsed; 978 979 /* Find the first unused slot. */ 980 variant->drawpix_sampler = ffs(~samplers_used) - 1; 981 options.drawpix_sampler = variant->drawpix_sampler; 982 samplers_used |= (1 << variant->drawpix_sampler); 983 984 options.pixel_maps = key->pixelMaps; 985 if (key->pixelMaps) { 986 variant->pixelmap_sampler = ffs(~samplers_used) - 1; 987 options.pixelmap_sampler = variant->pixelmap_sampler; 988 } 989 990 options.scale_and_bias = key->scaleAndBias; 991 if (key->scaleAndBias) { 992 _mesa_add_state_reference(params, scale_state); 993 memcpy(options.scale_state_tokens, scale_state, 994 sizeof(options.scale_state_tokens)); 995 _mesa_add_state_reference(params, bias_state); 996 memcpy(options.bias_state_tokens, bias_state, 997 sizeof(options.bias_state_tokens)); 998 } 999 1000 _mesa_add_state_reference(params, texcoord_state); 1001 memcpy(options.texcoord_state_tokens, texcoord_state, 1002 sizeof(options.texcoord_state_tokens)); 1003 1004 NIR_PASS_V(tgsi.ir.nir, nir_lower_drawpixels, &options); 1005 } 1006 1007 if (unlikely(key->external.lower_nv12 || key->external.lower_iyuv)) { 1008 nir_lower_tex_options options = {0}; 1009 options.lower_y_uv_external = key->external.lower_nv12; 1010 options.lower_y_u_v_external = key->external.lower_iyuv; 1011 NIR_PASS_V(tgsi.ir.nir, nir_lower_tex, &options); 1012 } 1013 1014 st_finalize_nir(st, &stfp->Base, tgsi.ir.nir); 1015 1016 if (unlikely(key->external.lower_nv12 || key->external.lower_iyuv)) { 1017 /* This pass needs to happen *after* nir_lower_sampler */ 1018 NIR_PASS_V(tgsi.ir.nir, st_nir_lower_tex_src_plane, 1019 ~stfp->Base.SamplersUsed, 1020 key->external.lower_nv12, 1021 key->external.lower_iyuv); 1022 } 1023 1024 variant->driver_shader = pipe->create_fs_state(pipe, &tgsi); 1025 variant->key = *key; 1026 1027 return variant; 1028 } 1029 1030 tgsi.tokens = stfp->tgsi.tokens; 1031 1032 assert(!(key->bitmap && key->drawpixels)); 1033 1034 /* Fix texture targets and add fog for ATI_fs */ 1035 if (stfp->ati_fs) { 1036 const struct tgsi_token *tokens = st_fixup_atifs(tgsi.tokens, key); 1037 1038 if (tokens) 1039 tgsi.tokens = tokens; 1040 else 1041 fprintf(stderr, "mesa: cannot post-process ATI_fs\n"); 1042 } 1043 1044 /* Emulate features. */ 1045 if (key->clamp_color || key->persample_shading) { 1046 const struct tgsi_token *tokens; 1047 unsigned flags = 1048 (key->clamp_color ? TGSI_EMU_CLAMP_COLOR_OUTPUTS : 0) | 1049 (key->persample_shading ? TGSI_EMU_FORCE_PERSAMPLE_INTERP : 0); 1050 1051 tokens = tgsi_emulate(tgsi.tokens, flags); 1052 1053 if (tokens) { 1054 if (tgsi.tokens != stfp->tgsi.tokens) 1055 tgsi_free_tokens(tgsi.tokens); 1056 tgsi.tokens = tokens; 1057 } else 1058 fprintf(stderr, "mesa: cannot emulate deprecated features\n"); 1059 } 1060 1061 /* glBitmap */ 1062 if (key->bitmap) { 1063 const struct tgsi_token *tokens; 1064 1065 variant->bitmap_sampler = ffs(~stfp->Base.SamplersUsed) - 1; 1066 1067 tokens = st_get_bitmap_shader(tgsi.tokens, 1068 st->internal_target, 1069 variant->bitmap_sampler, 1070 st->needs_texcoord_semantic, 1071 st->bitmap.tex_format == 1072 PIPE_FORMAT_L8_UNORM); 1073 1074 if (tokens) { 1075 if (tgsi.tokens != stfp->tgsi.tokens) 1076 tgsi_free_tokens(tgsi.tokens); 1077 tgsi.tokens = tokens; 1078 } else 1079 fprintf(stderr, "mesa: cannot create a shader for glBitmap\n"); 1080 } 1081 1082 /* glDrawPixels (color only) */ 1083 if (key->drawpixels) { 1084 const struct tgsi_token *tokens; 1085 unsigned scale_const = 0, bias_const = 0, texcoord_const = 0; 1086 1087 /* Find the first unused slot. */ 1088 variant->drawpix_sampler = ffs(~stfp->Base.SamplersUsed) - 1; 1089 1090 if (key->pixelMaps) { 1091 unsigned samplers_used = stfp->Base.SamplersUsed | 1092 (1 << variant->drawpix_sampler); 1093 1094 variant->pixelmap_sampler = ffs(~samplers_used) - 1; 1095 } 1096 1097 if (key->scaleAndBias) { 1098 scale_const = _mesa_add_state_reference(params, scale_state); 1099 bias_const = _mesa_add_state_reference(params, bias_state); 1100 } 1101 1102 texcoord_const = _mesa_add_state_reference(params, texcoord_state); 1103 1104 tokens = st_get_drawpix_shader(tgsi.tokens, 1105 st->needs_texcoord_semantic, 1106 key->scaleAndBias, scale_const, 1107 bias_const, key->pixelMaps, 1108 variant->drawpix_sampler, 1109 variant->pixelmap_sampler, 1110 texcoord_const, st->internal_target); 1111 1112 if (tokens) { 1113 if (tgsi.tokens != stfp->tgsi.tokens) 1114 tgsi_free_tokens(tgsi.tokens); 1115 tgsi.tokens = tokens; 1116 } else 1117 fprintf(stderr, "mesa: cannot create a shader for glDrawPixels\n"); 1118 } 1119 1120 if (unlikely(key->external.lower_nv12 || key->external.lower_iyuv)) { 1121 const struct tgsi_token *tokens; 1122 1123 /* samplers inserted would conflict, but this should be unpossible: */ 1124 assert(!(key->bitmap || key->drawpixels)); 1125 1126 tokens = st_tgsi_lower_yuv(tgsi.tokens, 1127 ~stfp->Base.SamplersUsed, 1128 key->external.lower_nv12, 1129 key->external.lower_iyuv); 1130 if (tokens) { 1131 if (tgsi.tokens != stfp->tgsi.tokens) 1132 tgsi_free_tokens(tgsi.tokens); 1133 tgsi.tokens = tokens; 1134 } else { 1135 fprintf(stderr, "mesa: cannot create a shader for samplerExternalOES\n"); 1136 } 1137 } 1138 1139 if (ST_DEBUG & DEBUG_TGSI) { 1140 tgsi_dump(tgsi.tokens, 0); 1141 debug_printf("\n"); 1142 } 1143 1144 /* fill in variant */ 1145 variant->driver_shader = pipe->create_fs_state(pipe, &tgsi); 1146 variant->key = *key; 1147 1148 if (tgsi.tokens != stfp->tgsi.tokens) 1149 tgsi_free_tokens(tgsi.tokens); 1150 return variant; 1151 } 1152 1153 /** 1154 * Translate fragment program if needed. 1155 */ 1156 struct st_fp_variant * 1157 st_get_fp_variant(struct st_context *st, 1158 struct st_fragment_program *stfp, 1159 const struct st_fp_variant_key *key) 1160 { 1161 struct st_fp_variant *fpv; 1162 1163 /* Search for existing variant */ 1164 for (fpv = stfp->variants; fpv; fpv = fpv->next) { 1165 if (memcmp(&fpv->key, key, sizeof(*key)) == 0) { 1166 break; 1167 } 1168 } 1169 1170 if (!fpv) { 1171 /* create new */ 1172 fpv = st_create_fp_variant(st, stfp, key); 1173 if (fpv) { 1174 /* insert into list */ 1175 fpv->next = stfp->variants; 1176 stfp->variants = fpv; 1177 } 1178 } 1179 1180 return fpv; 1181 } 1182 1183 1184 /** 1185 * Translate a program. This is common code for geometry and tessellation 1186 * shaders. 1187 */ 1188 static void 1189 st_translate_program_common(struct st_context *st, 1190 struct gl_program *prog, 1191 struct glsl_to_tgsi_visitor *glsl_to_tgsi, 1192 struct ureg_program *ureg, 1193 unsigned tgsi_processor, 1194 struct pipe_shader_state *out_state) 1195 { 1196 GLuint inputSlotToAttr[VARYING_SLOT_TESS_MAX]; 1197 GLuint inputMapping[VARYING_SLOT_TESS_MAX]; 1198 GLuint outputSlotToAttr[VARYING_SLOT_TESS_MAX]; 1199 GLuint outputMapping[VARYING_SLOT_TESS_MAX]; 1200 GLuint attr; 1201 1202 ubyte input_semantic_name[PIPE_MAX_SHADER_INPUTS]; 1203 ubyte input_semantic_index[PIPE_MAX_SHADER_INPUTS]; 1204 uint num_inputs = 0; 1205 1206 ubyte output_semantic_name[PIPE_MAX_SHADER_OUTPUTS]; 1207 ubyte output_semantic_index[PIPE_MAX_SHADER_OUTPUTS]; 1208 uint num_outputs = 0; 1209 1210 GLint i; 1211 1212 memset(inputSlotToAttr, 0, sizeof(inputSlotToAttr)); 1213 memset(inputMapping, 0, sizeof(inputMapping)); 1214 memset(outputSlotToAttr, 0, sizeof(outputSlotToAttr)); 1215 memset(outputMapping, 0, sizeof(outputMapping)); 1216 memset(out_state, 0, sizeof(*out_state)); 1217 1218 if (prog->ClipDistanceArraySize) 1219 ureg_property(ureg, TGSI_PROPERTY_NUM_CLIPDIST_ENABLED, 1220 prog->ClipDistanceArraySize); 1221 if (prog->CullDistanceArraySize) 1222 ureg_property(ureg, TGSI_PROPERTY_NUM_CULLDIST_ENABLED, 1223 prog->CullDistanceArraySize); 1224 1225 /* 1226 * Convert Mesa program inputs to TGSI input register semantics. 1227 */ 1228 for (attr = 0; attr < VARYING_SLOT_MAX; attr++) { 1229 if ((prog->info.inputs_read & BITFIELD64_BIT(attr)) != 0) { 1230 const GLuint slot = num_inputs++; 1231 1232 inputMapping[attr] = slot; 1233 inputSlotToAttr[slot] = attr; 1234 1235 switch (attr) { 1236 case VARYING_SLOT_PRIMITIVE_ID: 1237 assert(tgsi_processor == PIPE_SHADER_GEOMETRY); 1238 input_semantic_name[slot] = TGSI_SEMANTIC_PRIMID; 1239 input_semantic_index[slot] = 0; 1240 break; 1241 case VARYING_SLOT_POS: 1242 input_semantic_name[slot] = TGSI_SEMANTIC_POSITION; 1243 input_semantic_index[slot] = 0; 1244 break; 1245 case VARYING_SLOT_COL0: 1246 input_semantic_name[slot] = TGSI_SEMANTIC_COLOR; 1247 input_semantic_index[slot] = 0; 1248 break; 1249 case VARYING_SLOT_COL1: 1250 input_semantic_name[slot] = TGSI_SEMANTIC_COLOR; 1251 input_semantic_index[slot] = 1; 1252 break; 1253 case VARYING_SLOT_FOGC: 1254 input_semantic_name[slot] = TGSI_SEMANTIC_FOG; 1255 input_semantic_index[slot] = 0; 1256 break; 1257 case VARYING_SLOT_CLIP_VERTEX: 1258 input_semantic_name[slot] = TGSI_SEMANTIC_CLIPVERTEX; 1259 input_semantic_index[slot] = 0; 1260 break; 1261 case VARYING_SLOT_CLIP_DIST0: 1262 input_semantic_name[slot] = TGSI_SEMANTIC_CLIPDIST; 1263 input_semantic_index[slot] = 0; 1264 break; 1265 case VARYING_SLOT_CLIP_DIST1: 1266 input_semantic_name[slot] = TGSI_SEMANTIC_CLIPDIST; 1267 input_semantic_index[slot] = 1; 1268 break; 1269 case VARYING_SLOT_CULL_DIST0: 1270 case VARYING_SLOT_CULL_DIST1: 1271 /* these should have been lowered by GLSL */ 1272 assert(0); 1273 break; 1274 case VARYING_SLOT_PSIZ: 1275 input_semantic_name[slot] = TGSI_SEMANTIC_PSIZE; 1276 input_semantic_index[slot] = 0; 1277 break; 1278 case VARYING_SLOT_TEX0: 1279 case VARYING_SLOT_TEX1: 1280 case VARYING_SLOT_TEX2: 1281 case VARYING_SLOT_TEX3: 1282 case VARYING_SLOT_TEX4: 1283 case VARYING_SLOT_TEX5: 1284 case VARYING_SLOT_TEX6: 1285 case VARYING_SLOT_TEX7: 1286 if (st->needs_texcoord_semantic) { 1287 input_semantic_name[slot] = TGSI_SEMANTIC_TEXCOORD; 1288 input_semantic_index[slot] = attr - VARYING_SLOT_TEX0; 1289 break; 1290 } 1291 /* fall through */ 1292 case VARYING_SLOT_VAR0: 1293 default: 1294 assert(attr >= VARYING_SLOT_VAR0 || 1295 (attr >= VARYING_SLOT_TEX0 && attr <= VARYING_SLOT_TEX7)); 1296 input_semantic_name[slot] = TGSI_SEMANTIC_GENERIC; 1297 input_semantic_index[slot] = 1298 st_get_generic_varying_index(st, attr); 1299 break; 1300 } 1301 } 1302 } 1303 1304 /* Also add patch inputs. */ 1305 for (attr = 0; attr < 32; attr++) { 1306 if (prog->info.patch_inputs_read & (1u << attr)) { 1307 GLuint slot = num_inputs++; 1308 GLuint patch_attr = VARYING_SLOT_PATCH0 + attr; 1309 1310 inputMapping[patch_attr] = slot; 1311 inputSlotToAttr[slot] = patch_attr; 1312 input_semantic_name[slot] = TGSI_SEMANTIC_PATCH; 1313 input_semantic_index[slot] = attr; 1314 } 1315 } 1316 1317 /* initialize output semantics to defaults */ 1318 for (i = 0; i < PIPE_MAX_SHADER_OUTPUTS; i++) { 1319 output_semantic_name[i] = TGSI_SEMANTIC_GENERIC; 1320 output_semantic_index[i] = 0; 1321 } 1322 1323 /* 1324 * Determine number of outputs, the (default) output register 1325 * mapping and the semantic information for each output. 1326 */ 1327 for (attr = 0; attr < VARYING_SLOT_MAX; attr++) { 1328 if (prog->info.outputs_written & BITFIELD64_BIT(attr)) { 1329 GLuint slot = num_outputs++; 1330 1331 outputMapping[attr] = slot; 1332 outputSlotToAttr[slot] = attr; 1333 1334 switch (attr) { 1335 case VARYING_SLOT_POS: 1336 assert(slot == 0); 1337 output_semantic_name[slot] = TGSI_SEMANTIC_POSITION; 1338 output_semantic_index[slot] = 0; 1339 break; 1340 case VARYING_SLOT_COL0: 1341 output_semantic_name[slot] = TGSI_SEMANTIC_COLOR; 1342 output_semantic_index[slot] = 0; 1343 break; 1344 case VARYING_SLOT_COL1: 1345 output_semantic_name[slot] = TGSI_SEMANTIC_COLOR; 1346 output_semantic_index[slot] = 1; 1347 break; 1348 case VARYING_SLOT_BFC0: 1349 output_semantic_name[slot] = TGSI_SEMANTIC_BCOLOR; 1350 output_semantic_index[slot] = 0; 1351 break; 1352 case VARYING_SLOT_BFC1: 1353 output_semantic_name[slot] = TGSI_SEMANTIC_BCOLOR; 1354 output_semantic_index[slot] = 1; 1355 break; 1356 case VARYING_SLOT_FOGC: 1357 output_semantic_name[slot] = TGSI_SEMANTIC_FOG; 1358 output_semantic_index[slot] = 0; 1359 break; 1360 case VARYING_SLOT_PSIZ: 1361 output_semantic_name[slot] = TGSI_SEMANTIC_PSIZE; 1362 output_semantic_index[slot] = 0; 1363 break; 1364 case VARYING_SLOT_CLIP_VERTEX: 1365 output_semantic_name[slot] = TGSI_SEMANTIC_CLIPVERTEX; 1366 output_semantic_index[slot] = 0; 1367 break; 1368 case VARYING_SLOT_CLIP_DIST0: 1369 output_semantic_name[slot] = TGSI_SEMANTIC_CLIPDIST; 1370 output_semantic_index[slot] = 0; 1371 break; 1372 case VARYING_SLOT_CLIP_DIST1: 1373 output_semantic_name[slot] = TGSI_SEMANTIC_CLIPDIST; 1374 output_semantic_index[slot] = 1; 1375 break; 1376 case VARYING_SLOT_CULL_DIST0: 1377 case VARYING_SLOT_CULL_DIST1: 1378 /* these should have been lowered by GLSL */ 1379 assert(0); 1380 break; 1381 case VARYING_SLOT_LAYER: 1382 output_semantic_name[slot] = TGSI_SEMANTIC_LAYER; 1383 output_semantic_index[slot] = 0; 1384 break; 1385 case VARYING_SLOT_PRIMITIVE_ID: 1386 output_semantic_name[slot] = TGSI_SEMANTIC_PRIMID; 1387 output_semantic_index[slot] = 0; 1388 break; 1389 case VARYING_SLOT_VIEWPORT: 1390 output_semantic_name[slot] = TGSI_SEMANTIC_VIEWPORT_INDEX; 1391 output_semantic_index[slot] = 0; 1392 break; 1393 case VARYING_SLOT_TESS_LEVEL_OUTER: 1394 output_semantic_name[slot] = TGSI_SEMANTIC_TESSOUTER; 1395 output_semantic_index[slot] = 0; 1396 break; 1397 case VARYING_SLOT_TESS_LEVEL_INNER: 1398 output_semantic_name[slot] = TGSI_SEMANTIC_TESSINNER; 1399 output_semantic_index[slot] = 0; 1400 break; 1401 case VARYING_SLOT_TEX0: 1402 case VARYING_SLOT_TEX1: 1403 case VARYING_SLOT_TEX2: 1404 case VARYING_SLOT_TEX3: 1405 case VARYING_SLOT_TEX4: 1406 case VARYING_SLOT_TEX5: 1407 case VARYING_SLOT_TEX6: 1408 case VARYING_SLOT_TEX7: 1409 if (st->needs_texcoord_semantic) { 1410 output_semantic_name[slot] = TGSI_SEMANTIC_TEXCOORD; 1411 output_semantic_index[slot] = attr - VARYING_SLOT_TEX0; 1412 break; 1413 } 1414 /* fall through */ 1415 case VARYING_SLOT_VAR0: 1416 default: 1417 assert(slot < ARRAY_SIZE(output_semantic_name)); 1418 assert(attr >= VARYING_SLOT_VAR0 || 1419 (attr >= VARYING_SLOT_TEX0 && attr <= VARYING_SLOT_TEX7)); 1420 output_semantic_name[slot] = TGSI_SEMANTIC_GENERIC; 1421 output_semantic_index[slot] = 1422 st_get_generic_varying_index(st, attr); 1423 break; 1424 } 1425 } 1426 } 1427 1428 /* Also add patch outputs. */ 1429 for (attr = 0; attr < 32; attr++) { 1430 if (prog->info.patch_outputs_written & (1u << attr)) { 1431 GLuint slot = num_outputs++; 1432 GLuint patch_attr = VARYING_SLOT_PATCH0 + attr; 1433 1434 outputMapping[patch_attr] = slot; 1435 outputSlotToAttr[slot] = patch_attr; 1436 output_semantic_name[slot] = TGSI_SEMANTIC_PATCH; 1437 output_semantic_index[slot] = attr; 1438 } 1439 } 1440 1441 st_translate_program(st->ctx, 1442 tgsi_processor, 1443 ureg, 1444 glsl_to_tgsi, 1445 prog, 1446 /* inputs */ 1447 num_inputs, 1448 inputMapping, 1449 inputSlotToAttr, 1450 input_semantic_name, 1451 input_semantic_index, 1452 NULL, 1453 /* outputs */ 1454 num_outputs, 1455 outputMapping, 1456 outputSlotToAttr, 1457 output_semantic_name, 1458 output_semantic_index); 1459 1460 out_state->tokens = ureg_get_tokens(ureg, NULL); 1461 ureg_destroy(ureg); 1462 1463 st_translate_stream_output_info(glsl_to_tgsi, 1464 outputMapping, 1465 &out_state->stream_output); 1466 1467 if ((ST_DEBUG & DEBUG_TGSI) && (ST_DEBUG & DEBUG_MESA)) { 1468 _mesa_print_program(prog); 1469 debug_printf("\n"); 1470 } 1471 1472 if (ST_DEBUG & DEBUG_TGSI) { 1473 tgsi_dump(out_state->tokens, 0); 1474 debug_printf("\n"); 1475 } 1476 } 1477 1478 1479 /** 1480 * Translate a geometry program to create a new variant. 1481 */ 1482 bool 1483 st_translate_geometry_program(struct st_context *st, 1484 struct st_geometry_program *stgp) 1485 { 1486 struct ureg_program *ureg; 1487 1488 ureg = ureg_create_with_screen(PIPE_SHADER_GEOMETRY, st->pipe->screen); 1489 if (ureg == NULL) 1490 return false; 1491 1492 ureg_property(ureg, TGSI_PROPERTY_GS_INPUT_PRIM, 1493 stgp->Base.info.gs.input_primitive); 1494 ureg_property(ureg, TGSI_PROPERTY_GS_OUTPUT_PRIM, 1495 stgp->Base.info.gs.output_primitive); 1496 ureg_property(ureg, TGSI_PROPERTY_GS_MAX_OUTPUT_VERTICES, 1497 stgp->Base.info.gs.vertices_out); 1498 ureg_property(ureg, TGSI_PROPERTY_GS_INVOCATIONS, 1499 stgp->Base.info.gs.invocations); 1500 1501 st_translate_program_common(st, &stgp->Base, stgp->glsl_to_tgsi, ureg, 1502 PIPE_SHADER_GEOMETRY, &stgp->tgsi); 1503 1504 free_glsl_to_tgsi_visitor(stgp->glsl_to_tgsi); 1505 stgp->glsl_to_tgsi = NULL; 1506 return true; 1507 } 1508 1509 1510 /** 1511 * Get/create a basic program variant. 1512 */ 1513 struct st_basic_variant * 1514 st_get_basic_variant(struct st_context *st, 1515 unsigned pipe_shader, 1516 struct pipe_shader_state *tgsi, 1517 struct st_basic_variant **variants) 1518 { 1519 struct pipe_context *pipe = st->pipe; 1520 struct st_basic_variant *v; 1521 struct st_basic_variant_key key; 1522 1523 memset(&key, 0, sizeof(key)); 1524 key.st = st->has_shareable_shaders ? NULL : st; 1525 1526 /* Search for existing variant */ 1527 for (v = *variants; v; v = v->next) { 1528 if (memcmp(&v->key, &key, sizeof(key)) == 0) { 1529 break; 1530 } 1531 } 1532 1533 if (!v) { 1534 /* create new */ 1535 v = CALLOC_STRUCT(st_basic_variant); 1536 if (v) { 1537 /* fill in new variant */ 1538 switch (pipe_shader) { 1539 case PIPE_SHADER_TESS_CTRL: 1540 v->driver_shader = pipe->create_tcs_state(pipe, tgsi); 1541 break; 1542 case PIPE_SHADER_TESS_EVAL: 1543 v->driver_shader = pipe->create_tes_state(pipe, tgsi); 1544 break; 1545 case PIPE_SHADER_GEOMETRY: 1546 v->driver_shader = pipe->create_gs_state(pipe, tgsi); 1547 break; 1548 default: 1549 assert(!"unhandled shader type"); 1550 free(v); 1551 return NULL; 1552 } 1553 1554 v->key = key; 1555 1556 /* insert into list */ 1557 v->next = *variants; 1558 *variants = v; 1559 } 1560 } 1561 1562 return v; 1563 } 1564 1565 1566 /** 1567 * Translate a tessellation control program to create a new variant. 1568 */ 1569 bool 1570 st_translate_tessctrl_program(struct st_context *st, 1571 struct st_tessctrl_program *sttcp) 1572 { 1573 struct ureg_program *ureg; 1574 1575 ureg = ureg_create_with_screen(PIPE_SHADER_TESS_CTRL, st->pipe->screen); 1576 if (ureg == NULL) 1577 return false; 1578 1579 ureg_property(ureg, TGSI_PROPERTY_TCS_VERTICES_OUT, 1580 sttcp->Base.info.tess.tcs_vertices_out); 1581 1582 st_translate_program_common(st, &sttcp->Base, sttcp->glsl_to_tgsi, ureg, 1583 PIPE_SHADER_TESS_CTRL, &sttcp->tgsi); 1584 1585 free_glsl_to_tgsi_visitor(sttcp->glsl_to_tgsi); 1586 sttcp->glsl_to_tgsi = NULL; 1587 return true; 1588 } 1589 1590 1591 /** 1592 * Translate a tessellation evaluation program to create a new variant. 1593 */ 1594 bool 1595 st_translate_tesseval_program(struct st_context *st, 1596 struct st_tesseval_program *sttep) 1597 { 1598 struct ureg_program *ureg; 1599 1600 ureg = ureg_create_with_screen(PIPE_SHADER_TESS_EVAL, st->pipe->screen); 1601 if (ureg == NULL) 1602 return false; 1603 1604 if (sttep->Base.info.tess.primitive_mode == GL_ISOLINES) 1605 ureg_property(ureg, TGSI_PROPERTY_TES_PRIM_MODE, GL_LINES); 1606 else 1607 ureg_property(ureg, TGSI_PROPERTY_TES_PRIM_MODE, 1608 sttep->Base.info.tess.primitive_mode); 1609 1610 STATIC_ASSERT((TESS_SPACING_EQUAL + 1) % 3 == PIPE_TESS_SPACING_EQUAL); 1611 STATIC_ASSERT((TESS_SPACING_FRACTIONAL_ODD + 1) % 3 == 1612 PIPE_TESS_SPACING_FRACTIONAL_ODD); 1613 STATIC_ASSERT((TESS_SPACING_FRACTIONAL_EVEN + 1) % 3 == 1614 PIPE_TESS_SPACING_FRACTIONAL_EVEN); 1615 1616 ureg_property(ureg, TGSI_PROPERTY_TES_SPACING, 1617 (sttep->Base.info.tess.spacing + 1) % 3); 1618 1619 ureg_property(ureg, TGSI_PROPERTY_TES_VERTEX_ORDER_CW, 1620 !sttep->Base.info.tess.ccw); 1621 ureg_property(ureg, TGSI_PROPERTY_TES_POINT_MODE, 1622 sttep->Base.info.tess.point_mode); 1623 1624 st_translate_program_common(st, &sttep->Base, sttep->glsl_to_tgsi, 1625 ureg, PIPE_SHADER_TESS_EVAL, &sttep->tgsi); 1626 1627 free_glsl_to_tgsi_visitor(sttep->glsl_to_tgsi); 1628 sttep->glsl_to_tgsi = NULL; 1629 return true; 1630 } 1631 1632 1633 /** 1634 * Translate a compute program to create a new variant. 1635 */ 1636 bool 1637 st_translate_compute_program(struct st_context *st, 1638 struct st_compute_program *stcp) 1639 { 1640 struct ureg_program *ureg; 1641 struct pipe_shader_state prog; 1642 1643 ureg = ureg_create_with_screen(PIPE_SHADER_COMPUTE, st->pipe->screen); 1644 if (ureg == NULL) 1645 return false; 1646 1647 st_translate_program_common(st, &stcp->Base, stcp->glsl_to_tgsi, ureg, 1648 PIPE_SHADER_COMPUTE, &prog); 1649 1650 stcp->tgsi.ir_type = PIPE_SHADER_IR_TGSI; 1651 stcp->tgsi.prog = prog.tokens; 1652 stcp->tgsi.req_local_mem = stcp->Base.info.cs.shared_size; 1653 stcp->tgsi.req_private_mem = 0; 1654 stcp->tgsi.req_input_mem = 0; 1655 1656 free_glsl_to_tgsi_visitor(stcp->glsl_to_tgsi); 1657 stcp->glsl_to_tgsi = NULL; 1658 return true; 1659 } 1660 1661 1662 /** 1663 * Get/create compute program variant. 1664 */ 1665 struct st_basic_variant * 1666 st_get_cp_variant(struct st_context *st, 1667 struct pipe_compute_state *tgsi, 1668 struct st_basic_variant **variants) 1669 { 1670 struct pipe_context *pipe = st->pipe; 1671 struct st_basic_variant *v; 1672 struct st_basic_variant_key key; 1673 1674 memset(&key, 0, sizeof(key)); 1675 key.st = st->has_shareable_shaders ? NULL : st; 1676 1677 /* Search for existing variant */ 1678 for (v = *variants; v; v = v->next) { 1679 if (memcmp(&v->key, &key, sizeof(key)) == 0) { 1680 break; 1681 } 1682 } 1683 1684 if (!v) { 1685 /* create new */ 1686 v = CALLOC_STRUCT(st_basic_variant); 1687 if (v) { 1688 /* fill in new variant */ 1689 v->driver_shader = pipe->create_compute_state(pipe, tgsi); 1690 v->key = key; 1691 1692 /* insert into list */ 1693 v->next = *variants; 1694 *variants = v; 1695 } 1696 } 1697 1698 return v; 1699 } 1700 1701 1702 /** 1703 * Vert/Geom/Frag programs have per-context variants. Free all the 1704 * variants attached to the given program which match the given context. 1705 */ 1706 static void 1707 destroy_program_variants(struct st_context *st, struct gl_program *target) 1708 { 1709 if (!target || target == &_mesa_DummyProgram) 1710 return; 1711 1712 switch (target->Target) { 1713 case GL_VERTEX_PROGRAM_ARB: 1714 { 1715 struct st_vertex_program *stvp = (struct st_vertex_program *) target; 1716 struct st_vp_variant *vpv, **prevPtr = &stvp->variants; 1717 1718 for (vpv = stvp->variants; vpv; ) { 1719 struct st_vp_variant *next = vpv->next; 1720 if (vpv->key.st == st) { 1721 /* unlink from list */ 1722 *prevPtr = next; 1723 /* destroy this variant */ 1724 delete_vp_variant(st, vpv); 1725 } 1726 else { 1727 prevPtr = &vpv->next; 1728 } 1729 vpv = next; 1730 } 1731 } 1732 break; 1733 case GL_FRAGMENT_PROGRAM_ARB: 1734 { 1735 struct st_fragment_program *stfp = 1736 (struct st_fragment_program *) target; 1737 struct st_fp_variant *fpv, **prevPtr = &stfp->variants; 1738 1739 for (fpv = stfp->variants; fpv; ) { 1740 struct st_fp_variant *next = fpv->next; 1741 if (fpv->key.st == st) { 1742 /* unlink from list */ 1743 *prevPtr = next; 1744 /* destroy this variant */ 1745 delete_fp_variant(st, fpv); 1746 } 1747 else { 1748 prevPtr = &fpv->next; 1749 } 1750 fpv = next; 1751 } 1752 } 1753 break; 1754 case GL_GEOMETRY_PROGRAM_NV: 1755 case GL_TESS_CONTROL_PROGRAM_NV: 1756 case GL_TESS_EVALUATION_PROGRAM_NV: 1757 case GL_COMPUTE_PROGRAM_NV: 1758 { 1759 struct st_geometry_program *gp = (struct st_geometry_program*)target; 1760 struct st_tessctrl_program *tcp = (struct st_tessctrl_program*)target; 1761 struct st_tesseval_program *tep = (struct st_tesseval_program*)target; 1762 struct st_compute_program *cp = (struct st_compute_program*)target; 1763 struct st_basic_variant **variants = 1764 target->Target == GL_GEOMETRY_PROGRAM_NV ? &gp->variants : 1765 target->Target == GL_TESS_CONTROL_PROGRAM_NV ? &tcp->variants : 1766 target->Target == GL_TESS_EVALUATION_PROGRAM_NV ? &tep->variants : 1767 target->Target == GL_COMPUTE_PROGRAM_NV ? &cp->variants : 1768 NULL; 1769 struct st_basic_variant *v, **prevPtr = variants; 1770 1771 for (v = *variants; v; ) { 1772 struct st_basic_variant *next = v->next; 1773 if (v->key.st == st) { 1774 /* unlink from list */ 1775 *prevPtr = next; 1776 /* destroy this variant */ 1777 delete_basic_variant(st, v, target->Target); 1778 } 1779 else { 1780 prevPtr = &v->next; 1781 } 1782 v = next; 1783 } 1784 } 1785 break; 1786 default: 1787 _mesa_problem(NULL, "Unexpected program target 0x%x in " 1788 "destroy_program_variants_cb()", target->Target); 1789 } 1790 } 1791 1792 1793 /** 1794 * Callback for _mesa_HashWalk. Free all the shader's program variants 1795 * which match the given context. 1796 */ 1797 static void 1798 destroy_shader_program_variants_cb(GLuint key, void *data, void *userData) 1799 { 1800 struct st_context *st = (struct st_context *) userData; 1801 struct gl_shader *shader = (struct gl_shader *) data; 1802 1803 switch (shader->Type) { 1804 case GL_SHADER_PROGRAM_MESA: 1805 { 1806 struct gl_shader_program *shProg = (struct gl_shader_program *) data; 1807 GLuint i; 1808 1809 for (i = 0; i < ARRAY_SIZE(shProg->_LinkedShaders); i++) { 1810 if (shProg->_LinkedShaders[i]) 1811 destroy_program_variants(st, shProg->_LinkedShaders[i]->Program); 1812 } 1813 } 1814 break; 1815 case GL_VERTEX_SHADER: 1816 case GL_FRAGMENT_SHADER: 1817 case GL_GEOMETRY_SHADER: 1818 case GL_TESS_CONTROL_SHADER: 1819 case GL_TESS_EVALUATION_SHADER: 1820 case GL_COMPUTE_SHADER: 1821 break; 1822 default: 1823 assert(0); 1824 } 1825 } 1826 1827 1828 /** 1829 * Callback for _mesa_HashWalk. Free all the program variants which match 1830 * the given context. 1831 */ 1832 static void 1833 destroy_program_variants_cb(GLuint key, void *data, void *userData) 1834 { 1835 struct st_context *st = (struct st_context *) userData; 1836 struct gl_program *program = (struct gl_program *) data; 1837 destroy_program_variants(st, program); 1838 } 1839 1840 1841 /** 1842 * Walk over all shaders and programs to delete any variants which 1843 * belong to the given context. 1844 * This is called during context tear-down. 1845 */ 1846 void 1847 st_destroy_program_variants(struct st_context *st) 1848 { 1849 /* If shaders can be shared with other contexts, the last context will 1850 * call DeleteProgram on all shaders, releasing everything. 1851 */ 1852 if (st->has_shareable_shaders) 1853 return; 1854 1855 /* ARB vert/frag program */ 1856 _mesa_HashWalk(st->ctx->Shared->Programs, 1857 destroy_program_variants_cb, st); 1858 1859 /* GLSL vert/frag/geom shaders */ 1860 _mesa_HashWalk(st->ctx->Shared->ShaderObjects, 1861 destroy_shader_program_variants_cb, st); 1862 } 1863 1864 1865 /** 1866 * For debugging, print/dump the current vertex program. 1867 */ 1868 void 1869 st_print_current_vertex_program(void) 1870 { 1871 GET_CURRENT_CONTEXT(ctx); 1872 1873 if (ctx->VertexProgram._Current) { 1874 struct st_vertex_program *stvp = 1875 (struct st_vertex_program *) ctx->VertexProgram._Current; 1876 struct st_vp_variant *stv; 1877 1878 debug_printf("Vertex program %u\n", stvp->Base.Id); 1879 1880 for (stv = stvp->variants; stv; stv = stv->next) { 1881 debug_printf("variant %p\n", stv); 1882 tgsi_dump(stv->tgsi.tokens, 0); 1883 } 1884 } 1885 } 1886 1887 1888 /** 1889 * Compile one shader variant. 1890 */ 1891 void 1892 st_precompile_shader_variant(struct st_context *st, 1893 struct gl_program *prog) 1894 { 1895 switch (prog->Target) { 1896 case GL_VERTEX_PROGRAM_ARB: { 1897 struct st_vertex_program *p = (struct st_vertex_program *)prog; 1898 struct st_vp_variant_key key; 1899 1900 memset(&key, 0, sizeof(key)); 1901 key.st = st->has_shareable_shaders ? NULL : st; 1902 st_get_vp_variant(st, p, &key); 1903 break; 1904 } 1905 1906 case GL_TESS_CONTROL_PROGRAM_NV: { 1907 struct st_tessctrl_program *p = (struct st_tessctrl_program *)prog; 1908 st_get_basic_variant(st, PIPE_SHADER_TESS_CTRL, &p->tgsi, &p->variants); 1909 break; 1910 } 1911 1912 case GL_TESS_EVALUATION_PROGRAM_NV: { 1913 struct st_tesseval_program *p = (struct st_tesseval_program *)prog; 1914 st_get_basic_variant(st, PIPE_SHADER_TESS_EVAL, &p->tgsi, &p->variants); 1915 break; 1916 } 1917 1918 case GL_GEOMETRY_PROGRAM_NV: { 1919 struct st_geometry_program *p = (struct st_geometry_program *)prog; 1920 st_get_basic_variant(st, PIPE_SHADER_GEOMETRY, &p->tgsi, &p->variants); 1921 break; 1922 } 1923 1924 case GL_FRAGMENT_PROGRAM_ARB: { 1925 struct st_fragment_program *p = (struct st_fragment_program *)prog; 1926 struct st_fp_variant_key key; 1927 1928 memset(&key, 0, sizeof(key)); 1929 key.st = st->has_shareable_shaders ? NULL : st; 1930 st_get_fp_variant(st, p, &key); 1931 break; 1932 } 1933 1934 case GL_COMPUTE_PROGRAM_NV: { 1935 struct st_compute_program *p = (struct st_compute_program *)prog; 1936 st_get_cp_variant(st, &p->tgsi, &p->variants); 1937 break; 1938 } 1939 1940 default: 1941 assert(0); 1942 } 1943 } 1944