----- Original Message ----- > Same approach as in the llvmpipe, if the geometry shader is > null and we have stream output then attach it to the vertex > shader right before executing the draw pipeline. > > Signed-off-by: Zack Rusin <za...@vmware.com> > --- > src/gallium/drivers/softpipe/sp_draw_arrays.c | 7 ++++++ > src/gallium/drivers/softpipe/sp_state_shader.c | 28 > ++++++++++++++---------- > 2 files changed, 23 insertions(+), 12 deletions(-) > > diff --git a/src/gallium/drivers/softpipe/sp_draw_arrays.c > b/src/gallium/drivers/softpipe/sp_draw_arrays.c > index 4378312..0eb9c50 100644 > --- a/src/gallium/drivers/softpipe/sp_draw_arrays.c > +++ b/src/gallium/drivers/softpipe/sp_draw_arrays.c > @@ -105,6 +105,13 @@ softpipe_draw_vbo(struct pipe_context *pipe, > draw_set_mapped_so_targets(draw, sp->num_so_targets, > sp->so_targets); > > + if (sp->gs && !sp->gs->shader.tokens) { > + /* we have an empty geometry shader with stream output, so > + attach the stream output info to the current vertex shader */ > + if (sp->vs) { > + draw_vs_attach_so(sp->vs->draw_data, > &sp->gs->shader.stream_output); > + } > + } > draw_collect_pipeline_statistics(draw, > sp->active_statistics_queries > 0); > > diff --git a/src/gallium/drivers/softpipe/sp_state_shader.c > b/src/gallium/drivers/softpipe/sp_state_shader.c > index 40d32a4..79bd597 100644 > --- a/src/gallium/drivers/softpipe/sp_state_shader.c > +++ b/src/gallium/drivers/softpipe/sp_state_shader.c > @@ -275,21 +275,25 @@ softpipe_create_gs_state(struct pipe_context *pipe, > if (state == NULL ) > goto fail; > > - /* debug */ > - if (softpipe->dump_gs) > - tgsi_dump(templ->tokens, 0); > + state->shader = *templ; > > - /* copy shader tokens, the ones passed in will go away. > - */ > - state->shader.tokens = tgsi_dup_tokens(templ->tokens); > - if (state->shader.tokens == NULL) > - goto fail; > + if (templ->tokens) { > + /* debug */ > + if (softpipe->dump_gs) > + tgsi_dump(templ->tokens, 0); > > - state->draw_data = draw_create_geometry_shader(softpipe->draw, templ); > - if (state->draw_data == NULL) > - goto fail; > + /* copy shader tokens, the ones passed in will go away. > + */ > + state->shader.tokens = tgsi_dup_tokens(templ->tokens); > + if (state->shader.tokens == NULL) > + goto fail; > > - state->max_sampler = state->draw_data->info.file_max[TGSI_FILE_SAMPLER]; > + state->draw_data = draw_create_geometry_shader(softpipe->draw, templ); > + if (state->draw_data == NULL) > + goto fail; > + > + state->max_sampler = > state->draw_data->info.file_max[TGSI_FILE_SAMPLER]; > + } > > return state; > > -- > 1.7.10.4
Series looks good to me. Reviewed-by: Jose Fonseca <jfons...@vmware.com> _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev