summaryrefslogtreecommitdiffstats
path: root/src/mesa/state_tracker/st_program.c
diff options
context:
space:
mode:
authorKenneth Graunke <[email protected]>2018-10-25 02:16:27 -0700
committerKenneth Graunke <[email protected]>2018-11-03 23:34:36 -0700
commit5d517a599b1eabd1d5696bf31e26f16568d35770 (patch)
tree26988704ed5512f861cd5ab9f684903b91420696 /src/mesa/state_tracker/st_program.c
parentb6410a2d227ca71ee26fd3806ec51a2133c5692c (diff)
st/mesa: Don't record garbage streamout information in the non-SSO case.
In the non-SSO case, where multiple shader stages are linked together, we were recording garbage pipe_stream_output_info structures for all but the last enabled geometry-processing stage. Specifically, we were using the gl_transform_feedback_info from shader_program->last_vert_prog (the stage whose outputs will be recorded)...but were pairing it with the output varying mappings from the current shader stage. For example, a program with a VS and GS, the VS's pipe_shader_state would have a pipe_stream_output_info based on the GS transform feedback info, but the VS output mapping. This generally worked out okay because only the pipe_stream_output_info for the last stage really matters - the others can be ignored. However, we'd like to avoid confusing the pipe driver. In particular, my new driver translates the stream out information to hardware packets at bind_{vs,tes,gs}_state() time...and was hitting asserts about garbage varyings that didn't exist. This patch changes st/mesa to record a blank pipe_stream_output_info with num_outputs = 0 for all stages prior to last_vert_prog. The last one is captured as normal. (In the fully-SSO case, nothing should change - each program contains a single shader stage, so last_vert_prog *is* the current shader.) Tested with llvmpipe (piglit's gpu profile), and freedreno (a3xx, gpu profile with -t transform.feedback). Fixes several hundred CTS tests on my new driver. Reviewed-by: Timothy Arceri <[email protected]>
Diffstat (limited to 'src/mesa/state_tracker/st_program.c')
-rw-r--r--src/mesa/state_tracker/st_program.c19
1 files changed, 8 insertions, 11 deletions
diff --git a/src/mesa/state_tracker/st_program.c b/src/mesa/state_tracker/st_program.c
index af86c47b945..3bc7b0649c4 100644
--- a/src/mesa/state_tracker/st_program.c
+++ b/src/mesa/state_tracker/st_program.c
@@ -458,12 +458,9 @@ st_translate_vertex_program(struct st_context *st,
}
if (stvp->shader_program) {
- struct gl_program *prog = stvp->shader_program->last_vert_prog;
- if (prog) {
- st_translate_stream_output_info2(prog->sh.LinkedTransformFeedback,
- stvp->result_to_output,
- &stvp->tgsi.stream_output);
- }
+ st_translate_stream_output_info(stvp->Base.sh.LinkedTransformFeedback,
+ stvp->result_to_output,
+ &stvp->tgsi.stream_output);
st_store_ir_in_disk_cache(st, &stvp->Base, true);
return true;
@@ -505,7 +502,7 @@ st_translate_vertex_program(struct st_context *st,
output_semantic_name,
output_semantic_index);
- st_translate_stream_output_info(stvp->glsl_to_tgsi,
+ st_translate_stream_output_info(stvp->Base.sh.LinkedTransformFeedback,
stvp->result_to_output,
&stvp->tgsi.stream_output);
@@ -1417,7 +1414,7 @@ st_translate_program_common(struct st_context *st,
}
ureg_destroy(ureg);
- st_translate_stream_output_info(glsl_to_tgsi,
+ st_translate_stream_output_info(prog->sh.LinkedTransformFeedback,
outputMapping,
&out_state->stream_output);
@@ -1464,9 +1461,9 @@ st_translate_program_stream_output(struct gl_program *prog,
}
}
- st_translate_stream_output_info2(prog->sh.LinkedTransformFeedback,
- outputMapping,
- stream_output);
+ st_translate_stream_output_info(prog->sh.LinkedTransformFeedback,
+ outputMapping,
+ stream_output);
}
/**