svga: change error handling convention for svga_set_stream_output()
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>
This commit is contained in:
@@ -157,7 +157,6 @@ enum pipe_error
|
||||
svga_set_stream_output(struct svga_context *svga,
|
||||
struct svga_stream_output *streamout)
|
||||
{
|
||||
enum pipe_error ret = PIPE_OK;
|
||||
unsigned id = streamout ? streamout->id : SVGA3D_INVALID_ID;
|
||||
|
||||
if (!svga_have_vgpu10(svga)) {
|
||||
@@ -168,17 +167,15 @@ svga_set_stream_output(struct svga_context *svga,
|
||||
streamout, id);
|
||||
|
||||
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) {
|
||||
svga_context_flush(svga, NULL);
|
||||
ret = SVGA3D_vgpu10_SetStreamOutput(svga->swc, id);
|
||||
return ret;
|
||||
}
|
||||
|
||||
svga->current_so = streamout;
|
||||
}
|
||||
|
||||
return ret;
|
||||
return PIPE_OK;
|
||||
}
|
||||
|
||||
void
|
||||
|
@@ -201,11 +201,17 @@ emit_hw_gs(struct svga_context *svga, unsigned dirty)
|
||||
* it instead of the one from the vertex shader.
|
||||
*/
|
||||
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)) {
|
||||
/* 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 */
|
||||
|
@@ -353,11 +353,14 @@ emit_hw_vs(struct svga_context *svga, unsigned dirty)
|
||||
/* No GS stream out */
|
||||
if (svga_have_vs_streamout(svga)) {
|
||||
/* Set VS stream out */
|
||||
svga_set_stream_output(svga, vs->base.stream_output);
|
||||
ret = svga_set_stream_output(svga, vs->base.stream_output);
|
||||
}
|
||||
else {
|
||||
/* turn off stream out */
|
||||
svga_set_stream_output(svga, NULL);
|
||||
ret = svga_set_stream_output(svga, NULL);
|
||||
}
|
||||
if (ret != PIPE_OK) {
|
||||
goto done;
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user