diff options
author | Marek Olšák <[email protected]> | 2010-09-10 07:58:07 +0200 |
---|---|---|
committer | Marek Olšák <[email protected]> | 2010-09-13 07:49:43 +0200 |
commit | c3c5646b93eb20013d2739c7966da7ddad532877 (patch) | |
tree | e99ffbf16ed144d8db03607ba481555f802d7671 /src/gallium/drivers/r300/r300_emit.c | |
parent | 317680c6fbb898c56dac523cde756cb892481b97 (diff) |
r300g: skip rendering if CS space validation fails
radeon_cs_space_check flushes the pipe context on failure, retries
the validation, and returns -1 if it fails again. At that point, there is
nothing we can do, so let's skip draw operations instead of getting stuck
in an infinite loop.
This code path ideally should never be hit.
Diffstat (limited to 'src/gallium/drivers/r300/r300_emit.c')
-rw-r--r-- | src/gallium/drivers/r300/r300_emit.c | 19 |
1 files changed, 6 insertions, 13 deletions
diff --git a/src/gallium/drivers/r300/r300_emit.c b/src/gallium/drivers/r300/r300_emit.c index 232259e21d1..2583b93c484 100644 --- a/src/gallium/drivers/r300/r300_emit.c +++ b/src/gallium/drivers/r300/r300_emit.c @@ -1137,9 +1137,9 @@ void r300_emit_texture_cache_inval(struct r300_context* r300, unsigned size, voi END_CS; } -void r300_emit_buffer_validate(struct r300_context *r300, - boolean do_validate_vertex_buffers, - struct pipe_resource *index_buffer) +boolean r300_emit_buffer_validate(struct r300_context *r300, + boolean do_validate_vertex_buffers, + struct pipe_resource *index_buffer) { struct pipe_framebuffer_state* fb = (struct pipe_framebuffer_state*)r300->fb_state.state; @@ -1150,7 +1150,6 @@ void r300_emit_buffer_validate(struct r300_context *r300, struct pipe_vertex_element *velem = r300->velems->velem; struct pipe_resource *pbuf; unsigned i; - boolean invalid = FALSE; /* upload buffers first */ if (r300->screen->caps.has_tcl && r300->any_user_vbs) { @@ -1161,7 +1160,6 @@ void r300_emit_buffer_validate(struct r300_context *r300, /* Clean out BOs. */ r300->rws->cs_reset_buffers(r300->cs); -validate: /* Color buffers... */ for (i = 0; i < fb->nr_cbufs; i++) { tex = r300_texture(fb->cbufs[i]->texture); @@ -1208,15 +1206,10 @@ validate: r300_buffer(index_buffer)->domain, 0); if (!r300->rws->cs_validate(r300->cs)) { - r300->context.flush(&r300->context, 0, NULL); - if (invalid) { - /* Well, hell. */ - fprintf(stderr, "r300: Stuck in validation loop, gonna quit now.\n"); - abort(); - } - invalid = TRUE; - goto validate; + return FALSE; } + + return TRUE; } unsigned r300_get_num_dirty_dwords(struct r300_context *r300) |