svga: if svga_update_state() fails, skip the draw call
authorBrian Paul <brianp@vmware.com>
Wed, 21 Feb 2018 20:57:39 +0000 (13:57 -0700)
committerBrian Paul <brianp@vmware.com>
Fri, 2 Mar 2018 19:23:50 +0000 (12:23 -0700)
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>
src/gallium/drivers/svga/svga_pipe_draw.c

index c73c406e6973860a3c66e4d31e62b0cec1302fb8..ace1d2cb6f3c06928037dde1c0c8a627cf5da550 100644 (file)
@@ -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);