60
* Delete a vertex program variant. Note the caller must unlink
61
* the variant from the linked list.
64
delete_vp_variant(struct st_context *st, struct st_vp_variant *vpv)
66
if (vpv->driver_shader)
67
cso_delete_vertex_shader(st->cso_context, vpv->driver_shader);
69
#if FEATURE_feedback || FEATURE_rastpos
71
draw_delete_vertex_shader( st->draw, vpv->draw_shader );
75
st_free_tokens(vpv->tgsi.tokens);
55
83
* Clean out any old compilations:
58
st_vp_release_varients( struct st_context *st,
86
st_release_vp_variants( struct st_context *st,
59
87
struct st_vertex_program *stvp )
61
struct st_vp_varient *vpv;
63
for (vpv = stvp->varients; vpv; ) {
64
struct st_vp_varient *next = vpv->next;
66
if (vpv->driver_shader)
67
cso_delete_vertex_shader(st->cso_context, vpv->driver_shader);
69
#if FEATURE_feedback || FEATURE_rastpos
71
draw_delete_vertex_shader( st->draw, vpv->draw_shader );
75
st_free_tokens(vpv->tgsi.tokens);
89
struct st_vp_variant *vpv;
91
for (vpv = stvp->variants; vpv; ) {
92
struct st_vp_variant *next = vpv->next;
93
delete_vp_variant(st, vpv);
82
stvp->varients = NULL;
97
stvp->variants = NULL;
103
* Delete a fragment program variant. Note the caller must unlink
104
* the variant from the linked list.
107
delete_fp_variant(struct st_context *st, struct st_fp_variant *fpv)
109
if (fpv->driver_shader)
110
cso_delete_fragment_shader(st->cso_context, fpv->driver_shader);
112
_mesa_free_parameter_list(fpv->parameters);
119
* Free all variants of a fragment program.
122
st_release_fp_variants(struct st_context *st, struct st_fragment_program *stfp)
124
struct st_fp_variant *fpv;
126
for (fpv = stfp->variants; fpv; ) {
127
struct st_fp_variant *next = fpv->next;
128
delete_fp_variant(st, fpv);
132
stfp->variants = NULL;
137
* Delete a geometry program variant. Note the caller must unlink
138
* the variant from the linked list.
141
delete_gp_variant(struct st_context *st, struct st_gp_variant *gpv)
143
if (gpv->driver_shader)
144
cso_delete_geometry_shader(st->cso_context, gpv->driver_shader);
151
* Free all variants of a geometry program.
154
st_release_gp_variants(struct st_context *st, struct st_geometry_program *stgp)
156
struct st_gp_variant *gpv;
158
for (gpv = stgp->variants; gpv; ) {
159
struct st_gp_variant *next = gpv->next;
160
delete_gp_variant(st, gpv);
164
stgp->variants = NULL;
282
* Translate a Mesa fragment shader into a TGSI shader.
283
* \return pointer to cached pipe_shader object.
367
* Find/create a vertex program variant.
369
struct st_vp_variant *
370
st_get_vp_variant(struct st_context *st,
371
struct st_vertex_program *stvp,
372
const struct st_vp_variant_key *key)
374
struct st_vp_variant *vpv;
376
/* Search for existing variant */
377
for (vpv = stvp->variants; vpv; vpv = vpv->next) {
378
if (memcmp(&vpv->key, key, sizeof(*key)) == 0) {
385
vpv = st_translate_vertex_program(st, stvp, key);
387
/* insert into list */
388
vpv->next = stvp->variants;
389
stvp->variants = vpv;
398
* Translate a Mesa fragment shader into a TGSI shader using extra info in
400
* \return new fragment program variant
402
static struct st_fp_variant *
286
403
st_translate_fragment_program(struct st_context *st,
287
struct st_fragment_program *stfp )
404
struct st_fragment_program *stfp,
405
const struct st_fp_variant_key *key)
289
407
struct pipe_context *pipe = st->pipe;
290
GLuint outputMapping[FRAG_RESULT_MAX];
291
GLuint inputMapping[FRAG_ATTRIB_MAX];
292
GLuint interpMode[PIPE_MAX_SHADER_INPUTS]; /* XXX size? */
294
enum pipe_error error;
295
const GLbitfield inputsRead = stfp->Base.Base.InputsRead;
296
struct ureg_program *ureg;
298
ubyte input_semantic_name[PIPE_MAX_SHADER_INPUTS];
299
ubyte input_semantic_index[PIPE_MAX_SHADER_INPUTS];
300
uint fs_num_inputs = 0;
302
ubyte fs_output_semantic_name[PIPE_MAX_SHADER_OUTPUTS];
303
ubyte fs_output_semantic_index[PIPE_MAX_SHADER_OUTPUTS];
304
uint fs_num_outputs = 0;
306
_mesa_remove_output_reads(&stfp->Base.Base, PROGRAM_OUTPUT);
309
* Convert Mesa program inputs to TGSI input register semantics.
311
for (attr = 0; attr < FRAG_ATTRIB_MAX; attr++) {
312
if (inputsRead & (1 << attr)) {
313
const GLuint slot = fs_num_inputs++;
315
inputMapping[attr] = slot;
318
case FRAG_ATTRIB_WPOS:
319
input_semantic_name[slot] = TGSI_SEMANTIC_POSITION;
320
input_semantic_index[slot] = 0;
321
interpMode[slot] = TGSI_INTERPOLATE_LINEAR;
323
case FRAG_ATTRIB_COL0:
324
input_semantic_name[slot] = TGSI_SEMANTIC_COLOR;
325
input_semantic_index[slot] = 0;
326
interpMode[slot] = TGSI_INTERPOLATE_LINEAR;
328
case FRAG_ATTRIB_COL1:
329
input_semantic_name[slot] = TGSI_SEMANTIC_COLOR;
330
input_semantic_index[slot] = 1;
331
interpMode[slot] = TGSI_INTERPOLATE_LINEAR;
333
case FRAG_ATTRIB_FOGC:
334
input_semantic_name[slot] = TGSI_SEMANTIC_FOG;
335
input_semantic_index[slot] = 0;
336
interpMode[slot] = TGSI_INTERPOLATE_PERSPECTIVE;
338
case FRAG_ATTRIB_FACE:
339
input_semantic_name[slot] = TGSI_SEMANTIC_FACE;
340
input_semantic_index[slot] = 0;
341
interpMode[slot] = TGSI_INTERPOLATE_CONSTANT;
343
/* In most cases, there is nothing special about these
344
* inputs, so adopt a convention to use the generic
345
* semantic name and the mesa FRAG_ATTRIB_ number as the
348
* All that is required is that the vertex shader labels
349
* its own outputs similarly, and that the vertex shader
350
* generates at least every output required by the
351
* fragment shader plus fixed-function hardware (such as
354
* There is no requirement that semantic indexes start at
355
* zero or be restricted to a particular range -- nobody
356
* should be building tables based on semantic index.
358
case FRAG_ATTRIB_PNTC:
359
case FRAG_ATTRIB_TEX0:
360
case FRAG_ATTRIB_TEX1:
361
case FRAG_ATTRIB_TEX2:
362
case FRAG_ATTRIB_TEX3:
363
case FRAG_ATTRIB_TEX4:
364
case FRAG_ATTRIB_TEX5:
365
case FRAG_ATTRIB_TEX6:
366
case FRAG_ATTRIB_TEX7:
367
case FRAG_ATTRIB_VAR0:
369
/* Actually, let's try and zero-base this just for
370
* readability of the generated TGSI.
372
assert(attr >= FRAG_ATTRIB_TEX0);
373
input_semantic_index[slot] = (attr - FRAG_ATTRIB_TEX0);
374
input_semantic_name[slot] = TGSI_SEMANTIC_GENERIC;
375
if (attr == FRAG_ATTRIB_PNTC)
376
interpMode[slot] = TGSI_INTERPOLATE_LINEAR;
408
struct st_fp_variant *variant = CALLOC_STRUCT(st_fp_variant);
409
GLboolean deleteFP = GL_FALSE;
414
assert(!(key->bitmap && key->drawpixels));
418
/* glBitmap drawing */
419
struct gl_fragment_program *fp; /* we free this temp program below */
421
st_make_bitmap_fragment_program(st, &stfp->Base,
422
&fp, &variant->bitmap_sampler);
424
variant->parameters = _mesa_clone_parameter_list(fp->Base.Parameters);
425
stfp = st_fragment_program(fp);
428
else if (key->drawpixels) {
429
/* glDrawPixels drawing */
430
struct gl_fragment_program *fp; /* we free this temp program below */
432
if (key->drawpixels_z || key->drawpixels_stencil) {
433
fp = st_make_drawpix_z_stencil_program(st, key->drawpixels_z,
434
key->drawpixels_stencil);
438
st_make_drawpix_fragment_program(st, &stfp->Base, &fp);
439
variant->parameters = _mesa_clone_parameter_list(fp->Base.Parameters);
442
stfp = st_fragment_program(fp);
446
if (!stfp->tgsi.tokens) {
447
/* need to translate Mesa instructions to TGSI now */
448
GLuint outputMapping[FRAG_RESULT_MAX];
449
GLuint inputMapping[FRAG_ATTRIB_MAX];
450
GLuint interpMode[PIPE_MAX_SHADER_INPUTS]; /* XXX size? */
452
enum pipe_error error;
453
const GLbitfield inputsRead = stfp->Base.Base.InputsRead;
454
struct ureg_program *ureg;
455
GLboolean write_all = GL_FALSE;
457
ubyte input_semantic_name[PIPE_MAX_SHADER_INPUTS];
458
ubyte input_semantic_index[PIPE_MAX_SHADER_INPUTS];
459
uint fs_num_inputs = 0;
461
ubyte fs_output_semantic_name[PIPE_MAX_SHADER_OUTPUTS];
462
ubyte fs_output_semantic_index[PIPE_MAX_SHADER_OUTPUTS];
463
uint fs_num_outputs = 0;
466
_mesa_remove_output_reads(&stfp->Base.Base, PROGRAM_OUTPUT);
469
* Convert Mesa program inputs to TGSI input register semantics.
471
for (attr = 0; attr < FRAG_ATTRIB_MAX; attr++) {
472
if (inputsRead & (1 << attr)) {
473
const GLuint slot = fs_num_inputs++;
475
inputMapping[attr] = slot;
478
case FRAG_ATTRIB_WPOS:
479
input_semantic_name[slot] = TGSI_SEMANTIC_POSITION;
480
input_semantic_index[slot] = 0;
481
interpMode[slot] = TGSI_INTERPOLATE_LINEAR;
483
case FRAG_ATTRIB_COL0:
484
input_semantic_name[slot] = TGSI_SEMANTIC_COLOR;
485
input_semantic_index[slot] = 0;
486
interpMode[slot] = TGSI_INTERPOLATE_LINEAR;
488
case FRAG_ATTRIB_COL1:
489
input_semantic_name[slot] = TGSI_SEMANTIC_COLOR;
490
input_semantic_index[slot] = 1;
491
interpMode[slot] = TGSI_INTERPOLATE_LINEAR;
493
case FRAG_ATTRIB_FOGC:
494
input_semantic_name[slot] = TGSI_SEMANTIC_FOG;
495
input_semantic_index[slot] = 0;
378
496
interpMode[slot] = TGSI_INTERPOLATE_PERSPECTIVE;
383
inputMapping[attr] = -1;
388
* Semantics and mapping for outputs
392
GLbitfield64 outputsWritten = stfp->Base.Base.OutputsWritten;
394
/* if z is written, emit that first */
395
if (outputsWritten & BITFIELD64_BIT(FRAG_RESULT_DEPTH)) {
396
fs_output_semantic_name[fs_num_outputs] = TGSI_SEMANTIC_POSITION;
397
fs_output_semantic_index[fs_num_outputs] = 0;
398
outputMapping[FRAG_RESULT_DEPTH] = fs_num_outputs;
400
outputsWritten &= ~(1 << FRAG_RESULT_DEPTH);
403
if (outputsWritten & BITFIELD64_BIT(FRAG_RESULT_STENCIL)) {
404
fs_output_semantic_name[fs_num_outputs] = TGSI_SEMANTIC_STENCIL;
405
fs_output_semantic_index[fs_num_outputs] = 0;
406
outputMapping[FRAG_RESULT_STENCIL] = fs_num_outputs;
408
outputsWritten &= ~(1 << FRAG_RESULT_STENCIL);
411
/* handle remaning outputs (color) */
412
for (attr = 0; attr < FRAG_RESULT_MAX; attr++) {
413
if (outputsWritten & BITFIELD64_BIT(attr)) {
415
case FRAG_RESULT_DEPTH:
416
case FRAG_RESULT_STENCIL:
498
case FRAG_ATTRIB_FACE:
499
input_semantic_name[slot] = TGSI_SEMANTIC_FACE;
500
input_semantic_index[slot] = 0;
501
interpMode[slot] = TGSI_INTERPOLATE_CONSTANT;
503
/* In most cases, there is nothing special about these
504
* inputs, so adopt a convention to use the generic
505
* semantic name and the mesa FRAG_ATTRIB_ number as the
508
* All that is required is that the vertex shader labels
509
* its own outputs similarly, and that the vertex shader
510
* generates at least every output required by the
511
* fragment shader plus fixed-function hardware (such as
514
* There is no requirement that semantic indexes start at
515
* zero or be restricted to a particular range -- nobody
516
* should be building tables based on semantic index.
518
case FRAG_ATTRIB_PNTC:
519
case FRAG_ATTRIB_TEX0:
520
case FRAG_ATTRIB_TEX1:
521
case FRAG_ATTRIB_TEX2:
522
case FRAG_ATTRIB_TEX3:
523
case FRAG_ATTRIB_TEX4:
524
case FRAG_ATTRIB_TEX5:
525
case FRAG_ATTRIB_TEX6:
526
case FRAG_ATTRIB_TEX7:
527
case FRAG_ATTRIB_VAR0:
421
assert(attr == FRAG_RESULT_COLOR ||
422
(FRAG_RESULT_DATA0 <= attr && attr < FRAG_RESULT_MAX));
423
fs_output_semantic_name[fs_num_outputs] = TGSI_SEMANTIC_COLOR;
424
fs_output_semantic_index[fs_num_outputs] = numColors;
425
outputMapping[attr] = fs_num_outputs;
529
/* Actually, let's try and zero-base this just for
530
* readability of the generated TGSI.
532
assert(attr >= FRAG_ATTRIB_TEX0);
533
input_semantic_index[slot] = (attr - FRAG_ATTRIB_TEX0);
534
input_semantic_name[slot] = TGSI_SEMANTIC_GENERIC;
535
if (attr == FRAG_ATTRIB_PNTC)
536
interpMode[slot] = TGSI_INTERPOLATE_LINEAR;
538
interpMode[slot] = TGSI_INTERPOLATE_PERSPECTIVE;
435
ureg = ureg_create( TGSI_PROCESSOR_FRAGMENT );
439
if (ST_DEBUG & DEBUG_MESA) {
440
_mesa_print_program(&stfp->Base.Base);
441
_mesa_print_program_parameters(st->ctx, &stfp->Base.Base);
446
st_translate_mesa_program(st->ctx,
447
TGSI_PROCESSOR_FRAGMENT,
454
input_semantic_index,
459
fs_output_semantic_name,
460
fs_output_semantic_index, FALSE );
462
stfp->tgsi.tokens = ureg_get_tokens( ureg, NULL );
463
ureg_destroy( ureg );
464
stfp->driver_shader = pipe->create_fs_state(pipe, &stfp->tgsi);
543
inputMapping[attr] = -1;
548
* Semantics and mapping for outputs
552
GLbitfield64 outputsWritten = stfp->Base.Base.OutputsWritten;
554
/* if z is written, emit that first */
555
if (outputsWritten & BITFIELD64_BIT(FRAG_RESULT_DEPTH)) {
556
fs_output_semantic_name[fs_num_outputs] = TGSI_SEMANTIC_POSITION;
557
fs_output_semantic_index[fs_num_outputs] = 0;
558
outputMapping[FRAG_RESULT_DEPTH] = fs_num_outputs;
560
outputsWritten &= ~(1 << FRAG_RESULT_DEPTH);
563
if (outputsWritten & BITFIELD64_BIT(FRAG_RESULT_STENCIL)) {
564
fs_output_semantic_name[fs_num_outputs] = TGSI_SEMANTIC_STENCIL;
565
fs_output_semantic_index[fs_num_outputs] = 0;
566
outputMapping[FRAG_RESULT_STENCIL] = fs_num_outputs;
568
outputsWritten &= ~(1 << FRAG_RESULT_STENCIL);
571
/* handle remaning outputs (color) */
572
for (attr = 0; attr < FRAG_RESULT_MAX; attr++) {
573
if (outputsWritten & BITFIELD64_BIT(attr)) {
575
case FRAG_RESULT_DEPTH:
576
case FRAG_RESULT_STENCIL:
580
case FRAG_RESULT_COLOR:
581
write_all = GL_TRUE; /* fallthrough */
583
assert(attr == FRAG_RESULT_COLOR ||
584
(FRAG_RESULT_DATA0 <= attr && attr < FRAG_RESULT_MAX));
585
fs_output_semantic_name[fs_num_outputs] = TGSI_SEMANTIC_COLOR;
586
fs_output_semantic_index[fs_num_outputs] = numColors;
587
outputMapping[attr] = fs_num_outputs;
597
ureg = ureg_create( TGSI_PROCESSOR_FRAGMENT );
601
if (ST_DEBUG & DEBUG_MESA) {
602
_mesa_print_program(&stfp->Base.Base);
603
_mesa_print_program_parameters(st->ctx, &stfp->Base.Base);
606
if (write_all == GL_TRUE)
607
ureg_property_fs_color0_writes_all_cbufs(ureg, 1);
609
error = st_translate_mesa_program(st->ctx,
610
TGSI_PROCESSOR_FRAGMENT,
617
input_semantic_index,
622
fs_output_semantic_name,
623
fs_output_semantic_index, FALSE );
625
stfp->tgsi.tokens = ureg_get_tokens( ureg, NULL );
626
ureg_destroy( ureg );
629
/* fill in variant */
630
variant->driver_shader = pipe->create_fs_state(pipe, &stfp->tgsi);
466
633
if (ST_DEBUG & DEBUG_TGSI) {
467
634
tgsi_dump( stfp->tgsi.tokens, 0/*TGSI_DUMP_VERBOSE*/ );
468
635
debug_printf("\n");
639
/* Free the temporary program made above */
640
struct gl_fragment_program *fp = &stfp->Base;
641
_mesa_reference_fragprog(st->ctx, &fp, NULL);
649
* Translate fragment program if needed.
651
struct st_fp_variant *
652
st_get_fp_variant(struct st_context *st,
653
struct st_fragment_program *stfp,
654
const struct st_fp_variant_key *key)
656
struct st_fp_variant *fpv;
658
/* Search for existing variant */
659
for (fpv = stfp->variants; fpv; fpv = fpv->next) {
660
if (memcmp(&fpv->key, key, sizeof(*key)) == 0) {
667
fpv = st_translate_fragment_program(st, stfp, key);
669
/* insert into list */
670
fpv->next = stfp->variants;
671
stfp->variants = fpv;
680
* Translate a geometry program to create a new variant.
682
static struct st_gp_variant *
473
683
st_translate_geometry_program(struct st_context *st,
474
struct st_geometry_program *stgp)
684
struct st_geometry_program *stgp,
685
const struct st_gp_variant_key *key)
476
687
GLuint inputMapping[GEOM_ATTRIB_MAX];
477
688
GLuint outputMapping[GEOM_RESULT_MAX];
1017
* Vert/Geom/Frag programs have per-context variants. Free all the
1018
* variants attached to the given program which match the given context.
1021
destroy_program_variants(struct st_context *st, struct gl_program *program)
1026
switch (program->Target) {
1027
case GL_VERTEX_PROGRAM_ARB:
1029
struct st_vertex_program *stvp = (struct st_vertex_program *) program;
1030
struct st_vp_variant *vpv, **prevPtr = &stvp->variants;
1032
for (vpv = stvp->variants; vpv; ) {
1033
struct st_vp_variant *next = vpv->next;
1034
if (vpv->key.st == st) {
1035
/* unlink from list */
1037
/* destroy this variant */
1038
delete_vp_variant(st, vpv);
1041
prevPtr = &vpv->next;
1047
case GL_FRAGMENT_PROGRAM_ARB:
1049
struct st_fragment_program *stfp =
1050
(struct st_fragment_program *) program;
1051
struct st_fp_variant *fpv, **prevPtr = &stfp->variants;
1053
for (fpv = stfp->variants; fpv; ) {
1054
struct st_fp_variant *next = fpv->next;
1055
if (fpv->key.st == st) {
1056
/* unlink from list */
1058
/* destroy this variant */
1059
delete_fp_variant(st, fpv);
1062
prevPtr = &fpv->next;
1068
case MESA_GEOMETRY_PROGRAM:
1070
struct st_geometry_program *stgp =
1071
(struct st_geometry_program *) program;
1072
struct st_gp_variant *gpv, **prevPtr = &stgp->variants;
1074
for (gpv = stgp->variants; gpv; ) {
1075
struct st_gp_variant *next = gpv->next;
1076
if (gpv->key.st == st) {
1077
/* unlink from list */
1079
/* destroy this variant */
1080
delete_gp_variant(st, gpv);
1083
prevPtr = &gpv->next;
1090
_mesa_problem(NULL, "Unexpected program target 0x%x in "
1091
"destroy_program_variants_cb()", program->Target);
1097
* Callback for _mesa_HashWalk. Free all the shader's program variants
1098
* which match the given context.
1101
destroy_shader_program_variants_cb(GLuint key, void *data, void *userData)
1103
struct st_context *st = (struct st_context *) userData;
1104
struct gl_shader *shader = (struct gl_shader *) data;
1106
switch (shader->Type) {
1107
case GL_SHADER_PROGRAM_MESA:
1109
struct gl_shader_program *shProg = (struct gl_shader_program *) data;
1112
for (i = 0; i < shProg->NumShaders; i++) {
1113
destroy_program_variants(st, shProg->Shaders[i]->Program);
1116
destroy_program_variants(st, (struct gl_program *)
1117
shProg->VertexProgram);
1118
destroy_program_variants(st, (struct gl_program *)
1119
shProg->FragmentProgram);
1120
destroy_program_variants(st, (struct gl_program *)
1121
shProg->GeometryProgram);
1124
case GL_VERTEX_SHADER:
1125
case GL_FRAGMENT_SHADER:
1126
case GL_GEOMETRY_SHADER:
1128
destroy_program_variants(st, shader->Program);
1138
* Callback for _mesa_HashWalk. Free all the program variants which match
1139
* the given context.
1142
destroy_program_variants_cb(GLuint key, void *data, void *userData)
1144
struct st_context *st = (struct st_context *) userData;
1145
struct gl_program *program = (struct gl_program *) data;
1146
destroy_program_variants(st, program);
1151
* Walk over all shaders and programs to delete any variants which
1152
* belong to the given context.
1153
* This is called during context tear-down.
1156
st_destroy_program_variants(struct st_context *st)
1158
/* ARB vert/frag program */
1159
_mesa_HashWalk(st->ctx->Shared->Programs,
1160
destroy_program_variants_cb, st);
1162
/* GLSL vert/frag/geom shaders */
1163
_mesa_HashWalk(st->ctx->Shared->ShaderObjects,
1164
destroy_shader_program_variants_cb, st);