summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrian Paul <[email protected]>2018-02-14 09:33:58 -0800
committerBrian Paul <[email protected]>2018-02-15 09:05:08 -0700
commit072df89a796f549cc0ad90ce3dcbc9ad5c58d892 (patch)
tree6ee6acfec00b2d00aae30167857efd5347ae17bd
parent6f0aec5671a1efd374f517d3f9e4b0ff1c4c4709 (diff)
svga: move svga_update_state() call in draw code
This fixes a few Piglit transform feedback regressions caused by commit 7a1401938b351. 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: 7a1401938b351 ("svga: clean up retry_draw_range_elements(), retry_draw_arrays()") Reviewed-by: Charmaine Lee <[email protected]>
-rw-r--r--src/gallium/drivers/svga/svga_pipe_draw.c37
1 files changed, 19 insertions, 18 deletions
diff --git a/src/gallium/drivers/svga/svga_pipe_draw.c b/src/gallium/drivers/svga/svga_pipe_draw.c
index ee4a1057adf..af538819ea6 100644
--- a/src/gallium/drivers/svga/svga_pipe_draw.c
+++ b/src/gallium/drivers/svga/svga_pipe_draw.c
@@ -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;