In general, the functions which emit commands to the command buffer check for failure and return a PIPE_ERROR_x code. It's up to the caller to flush the buffer and retry the command. But svga_set_stream_output() did its own flushing and the callers never checked the return value (though, it would always be PIPE_OK) in practice. This patch changes svga_set_stream_output() so that it does not call svga_context_flush() when the buffer is full. And we update the callers to check the return value as we do for other functions, like svga_set_shader(). No Piglit regressions. Also tested w/ Nature demo. Reviewed-by: Charmaine Lee <charmainel@vmware.com>tags/17.2-branchpoint
svga_set_stream_output(struct svga_context *svga, | svga_set_stream_output(struct svga_context *svga, | ||||
struct svga_stream_output *streamout) | struct svga_stream_output *streamout) | ||||
{ | { | ||||
enum pipe_error ret = PIPE_OK; | |||||
unsigned id = streamout ? streamout->id : SVGA3D_INVALID_ID; | unsigned id = streamout ? streamout->id : SVGA3D_INVALID_ID; | ||||
if (!svga_have_vgpu10(svga)) { | if (!svga_have_vgpu10(svga)) { | ||||
streamout, id); | streamout, id); | ||||
if (svga->current_so != streamout) { | if (svga->current_so != streamout) { | ||||
/* Save current SO state */ | |||||
svga->current_so = streamout; | |||||
ret = SVGA3D_vgpu10_SetStreamOutput(svga->swc, id); | |||||
enum pipe_error ret = SVGA3D_vgpu10_SetStreamOutput(svga->swc, id); | |||||
if (ret != PIPE_OK) { | if (ret != PIPE_OK) { | ||||
svga_context_flush(svga, NULL); | |||||
ret = SVGA3D_vgpu10_SetStreamOutput(svga->swc, id); | |||||
return ret; | |||||
} | } | ||||
svga->current_so = streamout; | |||||
} | } | ||||
return ret; | |||||
return PIPE_OK; | |||||
} | } | ||||
void | void |
* it instead of the one from the vertex shader. | * it instead of the one from the vertex shader. | ||||
*/ | */ | ||||
if (svga_have_gs_streamout(svga)) { | if (svga_have_gs_streamout(svga)) { | ||||
svga_set_stream_output(svga, gs->base.stream_output); | |||||
ret = svga_set_stream_output(svga, gs->base.stream_output); | |||||
if (ret != PIPE_OK) { | |||||
goto done; | |||||
} | |||||
} | } | ||||
else if (!svga_have_vs_streamout(svga)) { | else if (!svga_have_vs_streamout(svga)) { | ||||
/* turn off stream out */ | /* turn off stream out */ | ||||
svga_set_stream_output(svga, NULL); | |||||
ret = svga_set_stream_output(svga, NULL); | |||||
if (ret != PIPE_OK) { | |||||
goto done; | |||||
} | |||||
} | } | ||||
/* SVGA_NEW_NEED_SWTNL */ | /* SVGA_NEW_NEED_SWTNL */ |
/* No GS stream out */ | /* No GS stream out */ | ||||
if (svga_have_vs_streamout(svga)) { | if (svga_have_vs_streamout(svga)) { | ||||
/* Set VS stream out */ | /* Set VS stream out */ | ||||
svga_set_stream_output(svga, vs->base.stream_output); | |||||
ret = svga_set_stream_output(svga, vs->base.stream_output); | |||||
} | } | ||||
else { | else { | ||||
/* turn off stream out */ | /* turn off stream out */ | ||||
svga_set_stream_output(svga, NULL); | |||||
ret = svga_set_stream_output(svga, NULL); | |||||
} | |||||
if (ret != PIPE_OK) { | |||||
goto done; | |||||
} | } | ||||
} | } | ||||