summaryrefslogtreecommitdiffstats
path: root/src/gallium/drivers/svga
diff options
context:
space:
mode:
authorBrian Paul <[email protected]>2017-06-22 14:45:07 -0600
committerBrian Paul <[email protected]>2017-06-30 08:24:27 -0600
commit4f3974d7586070fe72a9ef09d3df3f24b4a49f43 (patch)
tree0483e1db1b330c83075facdf5eeb34b29568a303 /src/gallium/drivers/svga
parentadead35320c0afe95f3f170a6047905179f8c6c3 (diff)
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 <[email protected]>
Diffstat (limited to 'src/gallium/drivers/svga')
-rw-r--r--src/gallium/drivers/svga/svga_pipe_streamout.c13
-rw-r--r--src/gallium/drivers/svga/svga_state_gs.c10
-rw-r--r--src/gallium/drivers/svga/svga_state_vs.c7
3 files changed, 18 insertions, 12 deletions
diff --git a/src/gallium/drivers/svga/svga_pipe_streamout.c b/src/gallium/drivers/svga/svga_pipe_streamout.c
index 4add087888f..3f30e648c0c 100644
--- a/src/gallium/drivers/svga/svga_pipe_streamout.c
+++ b/src/gallium/drivers/svga/svga_pipe_streamout.c
@@ -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
diff --git a/src/gallium/drivers/svga/svga_state_gs.c b/src/gallium/drivers/svga/svga_state_gs.c
index 217463882f1..19f0887d2ba 100644
--- a/src/gallium/drivers/svga/svga_state_gs.c
+++ b/src/gallium/drivers/svga/svga_state_gs.c
@@ -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 */
diff --git a/src/gallium/drivers/svga/svga_state_vs.c b/src/gallium/drivers/svga/svga_state_vs.c
index 325ef3ebad4..a0ab868cbba 100644
--- a/src/gallium/drivers/svga/svga_state_vs.c
+++ b/src/gallium/drivers/svga/svga_state_vs.c
@@ -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;
}
}