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 <tarceri@itsqueeze.com>
This commit is contained in:
@@ -7470,25 +7470,17 @@ st_link_shader(struct gl_context *ctx, struct gl_shader_program *prog)
|
||||
}
|
||||
|
||||
void
|
||||
st_translate_stream_output_info(glsl_to_tgsi_visitor *glsl_to_tgsi,
|
||||
const ubyte outputMapping[],
|
||||
struct pipe_stream_output_info *so)
|
||||
{
|
||||
if (!glsl_to_tgsi->shader_program->last_vert_prog)
|
||||
return;
|
||||
|
||||
struct gl_transform_feedback_info *info =
|
||||
glsl_to_tgsi->shader_program->last_vert_prog->sh.LinkedTransformFeedback;
|
||||
st_translate_stream_output_info2(info, outputMapping, so);
|
||||
}
|
||||
|
||||
void
|
||||
st_translate_stream_output_info2(struct gl_transform_feedback_info *info,
|
||||
st_translate_stream_output_info(struct gl_transform_feedback_info *info,
|
||||
const ubyte outputMapping[],
|
||||
struct pipe_stream_output_info *so)
|
||||
{
|
||||
unsigned i;
|
||||
|
||||
if (!info) {
|
||||
so->num_outputs = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
for (i = 0; i < info->NumOutputs; i++) {
|
||||
so->output[i].register_index =
|
||||
outputMapping[info->Outputs[i].OutputRegister];
|
||||
|
||||
@@ -61,12 +61,7 @@ void free_glsl_to_tgsi_visitor(struct glsl_to_tgsi_visitor *v);
|
||||
GLboolean st_link_shader(struct gl_context *ctx, struct gl_shader_program *prog);
|
||||
|
||||
void
|
||||
st_translate_stream_output_info(struct glsl_to_tgsi_visitor *glsl_to_tgsi,
|
||||
const ubyte outputMapping[],
|
||||
struct pipe_stream_output_info *so);
|
||||
|
||||
void
|
||||
st_translate_stream_output_info2(struct gl_transform_feedback_info *info,
|
||||
st_translate_stream_output_info(struct gl_transform_feedback_info *info,
|
||||
const ubyte outputMapping[],
|
||||
struct pipe_stream_output_info *so);
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user