svga: move svga_update_state() call in draw code

This fixes a few Piglit transform feedback regressions caused by
commit 7a1401938b.

In that change I moved the moved svga_update_state() into the loops,
after the calls to svga_hwtnl_set_flatshade().  But
svga_hwtnl_set_flatshade() actually depends on some derived shader
state.  This patch moves the svga_update_state() call into
svga_draw_vbo() so it's not duplicated in two places.

Fixes: 7a1401938b ("svga: clean up retry_draw_range_elements(),
retry_draw_arrays()")

Reviewed-by: Charmaine Lee <charmainel@vmware.com>
This commit is contained in:
Brian Paul 2018-02-14 09:33:58 -08:00
parent 6f0aec5671
commit 072df89a79

View file

@ -75,17 +75,14 @@ retry_draw_range_elements(struct svga_context *svga,
svga->curr.rast->templ.flatshade_first);
for (unsigned try = 0; try < 2; try++) {
ret = svga_update_state(svga, SVGA_STATE_HW_DRAW);
if (ret == PIPE_OK) {
ret = svga_hwtnl_draw_range_elements(svga->hwtnl,
index_buffer, index_size,
index_bias,
min_index, max_index,
prim, start, count,
start_instance, instance_count);
if (ret == PIPE_OK)
break;
}
ret = svga_hwtnl_draw_range_elements(svga->hwtnl,
index_buffer, index_size,
index_bias,
min_index, max_index,
prim, start, count,
start_instance, instance_count);
if (ret == PIPE_OK)
break;
svga_context_flush(svga, NULL);
}
@ -114,13 +111,10 @@ retry_draw_arrays(struct svga_context *svga,
svga->curr.rast->templ.flatshade_first);
for (unsigned try = 0; try < 2; try++) {
ret = svga_update_state(svga, SVGA_STATE_HW_DRAW);
if (ret == PIPE_OK) {
ret = svga_hwtnl_draw_arrays(svga->hwtnl, prim, start, count,
start_instance, instance_count);
if (ret == PIPE_OK)
break;
}
ret = svga_hwtnl_draw_arrays(svga->hwtnl, prim, start, count,
start_instance, instance_count);
if (ret == PIPE_OK)
break;
svga_context_flush(svga, NULL);
}
@ -229,6 +223,13 @@ svga_draw_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info)
ret = svga_swtnl_draw_vbo(svga, info, indexbuf, index_offset);
}
else {
ret = svga_update_state(svga, SVGA_STATE_HW_DRAW);
if (ret != PIPE_OK) {
svga_context_flush(svga, NULL);
ret = svga_update_state(svga, SVGA_STATE_HW_DRAW);
assert(ret == PIPE_OK);
}
if (info->index_size && indexbuf) {
unsigned offset;