summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrian Paul <brianp@vmware.com>2018-02-21 13:57:39 -0700
committerBrian Paul <brianp@vmware.com>2018-03-02 12:23:50 -0700
commit72df3a7a3957a13c4a667ffb2295ced7b91e5620 (patch)
treeb87847da62764c6a6eecbf4a8f494de7573b9217
parent0a7deaa0d6d14fcc21cad08d9acae688ed7c9fcb (diff)
svga: if svga_update_state() fails, skip the draw call
If svga_update_state() fails, we flush the command buffer and retry. If it fails again, it likely means we were unable to translate a shader for some reason (uses too many resources, for example). In that case, let's just skip the draw call. The alternative, just disabling the shader stage in question, would certainly lead to bad rendering anyway, and probably device errors. Fixes failed assertion running Piglit glsl-1.50/execution/ variable-indexing/gs-output-array-vec4-index-wr.shader_test since it uses too many GS output registers (though the test still fails). VMware bug 2063492. v2: also call pipe_debug_message() so apps or apitrace can be notified when this issue occurs. v3: use svga_update_state_retry(). Reviewed-by: Charmaine Lee <charmainel@vmware.com> Reviewed-by: Neha Bhende <bhenden@vmware.com>
-rw-r--r--src/gallium/drivers/svga/svga_pipe_draw.c10
1 files changed, 5 insertions, 5 deletions
diff --git a/src/gallium/drivers/svga/svga_pipe_draw.c b/src/gallium/drivers/svga/svga_pipe_draw.c
index c73c406e697..ace1d2cb6f3 100644
--- a/src/gallium/drivers/svga/svga_pipe_draw.c
+++ b/src/gallium/drivers/svga/svga_pipe_draw.c
@@ -203,11 +203,11 @@ 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 (!svga_update_state_retry(svga, SVGA_STATE_HW_DRAW)) {
+ static const char *msg = "State update failed, skipping draw call";
+ debug_printf("%s\n", msg);
+ pipe_debug_message(&svga->debug.callback, INFO, "%s", msg);
+ goto done;
}
svga_hwtnl_set_fillmode(svga->hwtnl, svga->curr.rast->hw_fillmode);