174
174
* \param tokensOut destination for TGSI tokens
175
175
* \return pointer to cached pipe_shader object.
178
st_prepare_vertex_program(struct st_context *st,
178
st_prepare_vertex_program(struct gl_context *ctx,
179
179
struct st_vertex_program *stvp)
184
184
stvp->num_outputs = 0;
186
186
if (stvp->Base.IsPositionInvariant)
187
_mesa_insert_mvp_code(st->ctx, &stvp->Base);
187
_mesa_insert_mvp_code(ctx, &stvp->Base);
189
assert(stvp->Base.Base.NumInstructions > 1);
189
if (!stvp->glsl_to_tgsi)
190
assert(stvp->Base.Base.NumInstructions > 1);
192
193
* Determine number of inputs, the mappings between VERT_ATTRIB_x
193
194
* and TGSI generic input indexes, plus input attrib semantic info.
195
196
for (attr = 0; attr < VERT_ATTRIB_MAX; attr++) {
196
if (stvp->Base.Base.InputsRead & (1 << attr)) {
197
if ((stvp->Base.Base.InputsRead & BITFIELD64_BIT(attr)) != 0) {
197
198
stvp->input_to_index[attr] = stvp->num_inputs;
198
199
stvp->index_to_input[stvp->num_inputs] = attr;
199
200
stvp->num_inputs++;
243
244
stvp->output_semantic_name[slot] = TGSI_SEMANTIC_PSIZE;
244
245
stvp->output_semantic_index[slot] = 0;
247
case VERT_RESULT_CLIP_DIST0:
248
stvp->output_semantic_name[slot] = TGSI_SEMANTIC_CLIPDIST;
249
stvp->output_semantic_index[slot] = 0;
251
case VERT_RESULT_CLIP_DIST1:
252
stvp->output_semantic_name[slot] = TGSI_SEMANTIC_CLIPDIST;
253
stvp->output_semantic_index[slot] = 1;
246
255
case VERT_RESULT_EDGE:
258
case VERT_RESULT_CLIP_VERTEX:
259
stvp->output_semantic_name[slot] = TGSI_SEMANTIC_CLIPVERTEX;
260
stvp->output_semantic_index[slot] = 0;
250
263
case VERT_RESULT_TEX0:
251
264
case VERT_RESULT_TEX1:
292
305
enum pipe_error error;
293
306
unsigned num_outputs;
295
st_prepare_vertex_program( st, stvp );
308
st_prepare_vertex_program(st->ctx, stvp);
297
_mesa_remove_output_reads(&stvp->Base.Base, PROGRAM_OUTPUT);
298
_mesa_remove_output_reads(&stvp->Base.Base, PROGRAM_VARYING);
310
if (!stvp->glsl_to_tgsi)
312
_mesa_remove_output_reads(&stvp->Base.Base, PROGRAM_OUTPUT);
313
_mesa_remove_output_reads(&stvp->Base.Base, PROGRAM_VARYING);
300
316
ureg = ureg_create( TGSI_PROCESSOR_VERTEX );
301
317
if (ureg == NULL) {
318
334
debug_printf("\n");
321
error = st_translate_mesa_program(st->ctx,
322
TGSI_PROCESSOR_VERTEX,
327
stvp->input_to_index,
328
NULL, /* input semantic name */
329
NULL, /* input semantic index */
333
stvp->result_to_output,
334
stvp->output_semantic_name,
335
stvp->output_semantic_index,
336
key->passthrough_edgeflags );
337
if (stvp->glsl_to_tgsi)
338
error = st_translate_program(st->ctx,
339
TGSI_PROCESSOR_VERTEX,
345
stvp->input_to_index,
346
NULL, /* input semantic name */
347
NULL, /* input semantic index */
348
NULL, /* interp mode */
351
stvp->result_to_output,
352
stvp->output_semantic_name,
353
stvp->output_semantic_index,
354
key->passthrough_edgeflags );
356
error = st_translate_mesa_program(st->ctx,
357
TGSI_PROCESSOR_VERTEX,
362
stvp->input_to_index,
363
NULL, /* input semantic name */
364
NULL, /* input semantic index */
368
stvp->result_to_output,
369
stvp->output_semantic_name,
370
stvp->output_semantic_index,
371
key->passthrough_edgeflags );
345
380
ureg_destroy( ureg );
382
if (stvp->glsl_to_tgsi) {
383
st_translate_stream_output_info(stvp->glsl_to_tgsi,
384
stvp->result_to_output,
385
&vpv->tgsi.stream_output);
347
388
vpv->driver_shader = pipe->create_vs_state(pipe, &vpv->tgsi);
349
390
if (ST_DEBUG & DEBUG_TGSI) {
439
st_translate_interp(enum glsl_interp_qualifier glsl_qual, bool is_color)
442
case INTERP_QUALIFIER_NONE:
444
return TGSI_INTERPOLATE_COLOR;
445
return TGSI_INTERPOLATE_PERSPECTIVE;
446
case INTERP_QUALIFIER_SMOOTH:
447
return TGSI_INTERPOLATE_PERSPECTIVE;
448
case INTERP_QUALIFIER_FLAT:
449
return TGSI_INTERPOLATE_CONSTANT;
450
case INTERP_QUALIFIER_NOPERSPECTIVE:
451
return TGSI_INTERPOLATE_LINEAR;
453
assert(0 && "unexpected interp mode in st_translate_interp()");
454
return TGSI_INTERPOLATE_PERSPECTIVE;
398
460
* Translate a Mesa fragment shader into a TGSI shader using extra info in
449
511
GLuint inputMapping[FRAG_ATTRIB_MAX];
450
512
GLuint interpMode[PIPE_MAX_SHADER_INPUTS]; /* XXX size? */
452
enum pipe_error error;
453
const GLbitfield inputsRead = stfp->Base.Base.InputsRead;
514
const GLbitfield64 inputsRead = stfp->Base.Base.InputsRead;
454
515
struct ureg_program *ureg;
455
517
GLboolean write_all = GL_FALSE;
457
519
ubyte input_semantic_name[PIPE_MAX_SHADER_INPUTS];
461
523
ubyte fs_output_semantic_name[PIPE_MAX_SHADER_OUTPUTS];
462
524
ubyte fs_output_semantic_index[PIPE_MAX_SHADER_OUTPUTS];
463
525
uint fs_num_outputs = 0;
466
_mesa_remove_output_reads(&stfp->Base.Base, PROGRAM_OUTPUT);
527
if (!stfp->glsl_to_tgsi)
528
_mesa_remove_output_reads(&stfp->Base.Base, PROGRAM_OUTPUT);
469
531
* Convert Mesa program inputs to TGSI input register semantics.
471
533
for (attr = 0; attr < FRAG_ATTRIB_MAX; attr++) {
472
if (inputsRead & (1 << attr)) {
534
if ((inputsRead & BITFIELD64_BIT(attr)) != 0) {
473
535
const GLuint slot = fs_num_inputs++;
475
537
inputMapping[attr] = slot;
483
545
case FRAG_ATTRIB_COL0:
484
546
input_semantic_name[slot] = TGSI_SEMANTIC_COLOR;
485
547
input_semantic_index[slot] = 0;
486
interpMode[slot] = TGSI_INTERPOLATE_LINEAR;
548
interpMode[slot] = st_translate_interp(stfp->Base.InterpQualifier[attr],
488
551
case FRAG_ATTRIB_COL1:
489
552
input_semantic_name[slot] = TGSI_SEMANTIC_COLOR;
490
553
input_semantic_index[slot] = 1;
491
interpMode[slot] = TGSI_INTERPOLATE_LINEAR;
554
interpMode[slot] = st_translate_interp(stfp->Base.InterpQualifier[attr],
493
557
case FRAG_ATTRIB_FOGC:
494
558
input_semantic_name[slot] = TGSI_SEMANTIC_FOG;
500
564
input_semantic_index[slot] = 0;
501
565
interpMode[slot] = TGSI_INTERPOLATE_CONSTANT;
567
case FRAG_ATTRIB_CLIP_DIST0:
568
input_semantic_name[slot] = TGSI_SEMANTIC_CLIPDIST;
569
input_semantic_index[slot] = 0;
570
interpMode[slot] = TGSI_INTERPOLATE_LINEAR;
572
case FRAG_ATTRIB_CLIP_DIST1:
573
input_semantic_name[slot] = TGSI_SEMANTIC_CLIPDIST;
574
input_semantic_index[slot] = 1;
575
interpMode[slot] = TGSI_INTERPOLATE_LINEAR;
503
577
/* In most cases, there is nothing special about these
504
578
* inputs, so adopt a convention to use the generic
505
579
* semantic name and the mesa FRAG_ATTRIB_ number as the
535
609
if (attr == FRAG_ATTRIB_PNTC)
536
610
interpMode[slot] = TGSI_INTERPOLATE_LINEAR;
538
interpMode[slot] = TGSI_INTERPOLATE_PERSPECTIVE;
612
interpMode[slot] = st_translate_interp(stfp->Base.InterpQualifier[attr],
606
683
if (write_all == GL_TRUE)
607
684
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 );
686
if (stfp->Base.FragDepthLayout != FRAG_DEPTH_LAYOUT_NONE) {
687
switch (stfp->Base.FragDepthLayout) {
688
case FRAG_DEPTH_LAYOUT_ANY:
689
ureg_property_fs_depth_layout(ureg, TGSI_FS_DEPTH_LAYOUT_ANY);
691
case FRAG_DEPTH_LAYOUT_GREATER:
692
ureg_property_fs_depth_layout(ureg, TGSI_FS_DEPTH_LAYOUT_GREATER);
694
case FRAG_DEPTH_LAYOUT_LESS:
695
ureg_property_fs_depth_layout(ureg, TGSI_FS_DEPTH_LAYOUT_LESS);
697
case FRAG_DEPTH_LAYOUT_UNCHANGED:
698
ureg_property_fs_depth_layout(ureg, TGSI_FS_DEPTH_LAYOUT_UNCHANGED);
705
if (stfp->glsl_to_tgsi)
706
st_translate_program(st->ctx,
707
TGSI_PROCESSOR_FRAGMENT,
715
input_semantic_index,
720
fs_output_semantic_name,
721
fs_output_semantic_index, FALSE );
723
st_translate_mesa_program(st->ctx,
724
TGSI_PROCESSOR_FRAGMENT,
731
input_semantic_index,
736
fs_output_semantic_name,
737
fs_output_semantic_index, FALSE );
625
739
stfp->tgsi.tokens = ureg_get_tokens( ureg, NULL );
626
740
ureg_destroy( ureg );
687
801
GLuint inputMapping[GEOM_ATTRIB_MAX];
688
802
GLuint outputMapping[GEOM_RESULT_MAX];
689
803
struct pipe_context *pipe = st->pipe;
690
enum pipe_error error;
692
const GLbitfield inputsRead = stgp->Base.Base.InputsRead;
805
const GLbitfield64 inputsRead = stgp->Base.Base.InputsRead;
693
806
GLuint vslot = 0;
694
807
GLuint num_generic = 0;
730
843
* Convert Mesa program inputs to TGSI input register semantics.
732
845
for (attr = 0; attr < GEOM_ATTRIB_MAX; attr++) {
733
if (inputsRead & (1 << attr)) {
846
if ((inputsRead & BITFIELD64_BIT(attr)) != 0) {
734
847
const GLuint slot = gs_num_inputs;
894
1007
ureg_property_gs_output_prim(ureg, stgp->Base.OutputType);
895
1008
ureg_property_gs_max_vertices(ureg, stgp->Base.VerticesOut);
897
error = st_translate_mesa_program(st->ctx,
898
TGSI_PROCESSOR_GEOMETRY,
904
stgp->input_semantic_name,
905
stgp->input_semantic_index,
910
gs_output_semantic_name,
911
gs_output_semantic_index,
1010
st_translate_mesa_program(st->ctx,
1011
TGSI_PROCESSOR_GEOMETRY,
1017
stgp->input_semantic_name,
1018
stgp->input_semantic_index,
1023
gs_output_semantic_name,
1024
gs_output_semantic_index,
914
1027
stgp->num_inputs = gs_num_inputs;
915
1028
stgp->tgsi.tokens = ureg_get_tokens( ureg, NULL );
916
1029
ureg_destroy( ureg );
1031
if (stgp->glsl_to_tgsi) {
1032
st_translate_stream_output_info(stgp->glsl_to_tgsi,
1034
&stgp->tgsi.stream_output);
918
1037
/* fill in new variant */
919
1038
gpv->driver_shader = pipe->create_gs_state(pipe, &stgp->tgsi);
920
1039
gpv->key = *key;
1113
1232
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);
1235
for (i = 0; i < Elements(shProg->_LinkedShaders); i++) {
1236
if (shProg->_LinkedShaders[i])
1237
destroy_program_variants(st, shProg->_LinkedShaders[i]->Program);
1124
1241
case GL_VERTEX_SHADER: