diff options
-rw-r--r-- | src/gallium/auxiliary/draw/draw_pipe_clip.c | 17 | ||||
-rw-r--r-- | src/gallium/auxiliary/draw/draw_pipe_flatshade.c | 11 | ||||
-rw-r--r-- | src/gallium/auxiliary/draw/draw_pipe_twoside.c | 9 |
3 files changed, 27 insertions, 10 deletions
diff --git a/src/gallium/auxiliary/draw/draw_pipe_clip.c b/src/gallium/auxiliary/draw/draw_pipe_clip.c index cf2b41738bf..4cfa54b2e17 100644 --- a/src/gallium/auxiliary/draw/draw_pipe_clip.c +++ b/src/gallium/auxiliary/draw/draw_pipe_clip.c @@ -771,8 +771,9 @@ find_interp(const struct draw_fragment_shader *fs, int *indexed_interp, int interp; /* If it's gl_{Front,Back}{,Secondary}Color, pick up the mode * from the array we've filled before. */ - if (semantic_name == TGSI_SEMANTIC_COLOR || - semantic_name == TGSI_SEMANTIC_BCOLOR) { + if ((semantic_name == TGSI_SEMANTIC_COLOR || + semantic_name == TGSI_SEMANTIC_BCOLOR) && + semantic_index < 2) { interp = indexed_interp[semantic_index]; } else if (semantic_name == TGSI_SEMANTIC_POSITION || semantic_name == TGSI_SEMANTIC_CLIPVERTEX) { @@ -851,7 +852,8 @@ clip_init_state(struct draw_stage *stage) if (fs) { for (i = 0; i < fs->info.num_inputs; i++) { - if (fs->info.input_semantic_name[i] == TGSI_SEMANTIC_COLOR) { + if (fs->info.input_semantic_name[i] == TGSI_SEMANTIC_COLOR && + fs->info.input_semantic_index[i] < 2) { if (fs->info.input_interpolate[i] != TGSI_INTERPOLATE_COLOR) indexed_interp[fs->info.input_semantic_index[i]] = fs->info.input_interpolate[i]; } @@ -881,6 +883,15 @@ clip_init_state(struct draw_stage *stage) clipper->perspect_attribs[clipper->num_perspect_attribs] = i; clipper->num_perspect_attribs++; break; + case TGSI_INTERPOLATE_COLOR: + if (draw->rasterizer->flatshade) { + clipper->const_attribs[clipper->num_const_attribs] = i; + clipper->num_const_attribs++; + } else { + clipper->perspect_attribs[clipper->num_perspect_attribs] = i; + clipper->num_perspect_attribs++; + } + break; default: assert(interp == -1); break; diff --git a/src/gallium/auxiliary/draw/draw_pipe_flatshade.c b/src/gallium/auxiliary/draw/draw_pipe_flatshade.c index cd285e6f97c..2830435b993 100644 --- a/src/gallium/auxiliary/draw/draw_pipe_flatshade.c +++ b/src/gallium/auxiliary/draw/draw_pipe_flatshade.c @@ -170,8 +170,9 @@ find_interp(const struct draw_fragment_shader *fs, int *indexed_interp, int interp; /* If it's gl_{Front,Back}{,Secondary}Color, pick up the mode * from the array we've filled before. */ - if (semantic_name == TGSI_SEMANTIC_COLOR || - semantic_name == TGSI_SEMANTIC_BCOLOR) { + if ((semantic_name == TGSI_SEMANTIC_COLOR || + semantic_name == TGSI_SEMANTIC_BCOLOR) && + semantic_index < 2) { interp = indexed_interp[semantic_index]; } else { /* Otherwise, search in the FS inputs, with a decent default @@ -216,7 +217,8 @@ static void flatshade_init_state( struct draw_stage *stage ) if (fs) { for (i = 0; i < fs->info.num_inputs; i++) { - if (fs->info.input_semantic_name[i] == TGSI_SEMANTIC_COLOR) { + if (fs->info.input_semantic_name[i] == TGSI_SEMANTIC_COLOR && + fs->info.input_semantic_index[i] < 2) { if (fs->info.input_interpolate[i] != TGSI_INTERPOLATE_COLOR) indexed_interp[fs->info.input_semantic_index[i]] = fs->info.input_interpolate[i]; } @@ -236,7 +238,8 @@ static void flatshade_init_state( struct draw_stage *stage ) info->output_semantic_index[i]); /* If it's flat, add it to the flat vector. */ - if (interp == TGSI_INTERPOLATE_CONSTANT) { + if (interp == TGSI_INTERPOLATE_CONSTANT || + (interp == TGSI_INTERPOLATE_COLOR && draw->rasterizer->flatshade)) { flat->flat_attribs[flat->num_flat_attribs] = i; flat->num_flat_attribs++; } diff --git a/src/gallium/auxiliary/draw/draw_pipe_twoside.c b/src/gallium/auxiliary/draw/draw_pipe_twoside.c index 52d87c6b291..7e76835f12e 100644 --- a/src/gallium/auxiliary/draw/draw_pipe_twoside.c +++ b/src/gallium/auxiliary/draw/draw_pipe_twoside.c @@ -111,18 +111,21 @@ static void twoside_first_tri( struct draw_stage *stage, twoside->attrib_back0 = -1; twoside->attrib_back1 = -1; - /* Find which vertex shader outputs are front/back colors */ + /* + * Find which vertex shader outputs are front/back colors + * (only first two can be front or back). + */ for (i = 0; i < vs->info.num_outputs; i++) { if (vs->info.output_semantic_name[i] == TGSI_SEMANTIC_COLOR) { if (vs->info.output_semantic_index[i] == 0) twoside->attrib_front0 = i; - else + else if (vs->info.output_semantic_index[i] == 1) twoside->attrib_front1 = i; } if (vs->info.output_semantic_name[i] == TGSI_SEMANTIC_BCOLOR) { if (vs->info.output_semantic_index[i] == 0) twoside->attrib_back0 = i; - else + else if (vs->info.output_semantic_index[i] == 1) twoside->attrib_back1 = i; } } |