Browse Source

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>
tags/17.2-branchpoint
Brian Paul 8 years ago
parent
commit
4f3974d758

+ 5
- 8
src/gallium/drivers/svga/svga_pipe_streamout.c View File

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

+ 8
- 2
src/gallium/drivers/svga/svga_state_gs.c View File

* 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 */

+ 5
- 2
src/gallium/drivers/svga/svga_state_vs.c View File

/* 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;
} }
} }



Loading…
Cancel
Save