Module: Mesa Branch: master Commit: fb6d9798a0c6eefd512f5b0f19eed34af8f4f257 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=fb6d9798a0c6eefd512f5b0f19eed34af8f4f257
Author: Paul Berry <stereotype...@gmail.com> Date: Fri Jan 10 18:56:14 2014 -0800 i965: Ensure that all necessary state is re-emitted if we run out of aperture. Prior to this patch, if we ran out of aperture space during brw_try_draw_prims(), we would rewind the batch buffer pointer (potentially throwing some state that may have been emitted by brw_upload_state()), flush the batch, and then try again. However, we wouldn't reset the dirty bits to the state they had before the call to brw_upload_state(). As a result, when we tried again, there was a danger that we wouldn't re-emit all the necessary state. (Note: prior to the introduction of hardware contexts, this wasn't a problem because flushing the batch forced all state to be re-emitted). This patch fixes the problem by leaving the dirty bits set at the end of brw_upload_state(); we only clear them after we have determined that we don't need to rewind the batch buffer. Cc: 10.0 9.2 <mesa-sta...@lists.freedesktop.org> Reviewed-by: Eric Anholt <e...@anholt.net> Reviewed-by: Kenneth Graunke <kenn...@whitecape.org> --- src/mesa/drivers/dri/i965/brw_draw.c | 6 ++++++ src/mesa/drivers/dri/i965/brw_state.h | 1 + src/mesa/drivers/dri/i965/brw_state_upload.c | 14 ++++++++++++++ 3 files changed, 21 insertions(+) diff --git a/src/mesa/drivers/dri/i965/brw_draw.c b/src/mesa/drivers/dri/i965/brw_draw.c index b898cd3..ec56a21 100644 --- a/src/mesa/drivers/dri/i965/brw_draw.c +++ b/src/mesa/drivers/dri/i965/brw_draw.c @@ -499,6 +499,12 @@ retry: } } } + + /* Now that we know we haven't run out of aperture space, we can safely + * reset the dirty bits. + */ + if (brw->state.dirty.brw) + brw_clear_dirty_bits(brw); } if (brw->always_flush_batch) diff --git a/src/mesa/drivers/dri/i965/brw_state.h b/src/mesa/drivers/dri/i965/brw_state.h index a148125..e9428fb 100644 --- a/src/mesa/drivers/dri/i965/brw_state.h +++ b/src/mesa/drivers/dri/i965/brw_state.h @@ -143,6 +143,7 @@ brw_depthbuffer_format(struct brw_context *brw); * brw_state.c */ void brw_upload_state(struct brw_context *brw); +void brw_clear_dirty_bits(struct brw_context *brw); void brw_init_state(struct brw_context *brw); void brw_destroy_state(struct brw_context *brw); diff --git a/src/mesa/drivers/dri/i965/brw_state_upload.c b/src/mesa/drivers/dri/i965/brw_state_upload.c index 1eb3a79..7490df4 100644 --- a/src/mesa/drivers/dri/i965/brw_state_upload.c +++ b/src/mesa/drivers/dri/i965/brw_state_upload.c @@ -573,6 +573,20 @@ void brw_upload_state(struct brw_context *brw) fprintf(stderr, "\n"); } } +} + +/** + * Clear dirty bits to account for the fact that the state emitted by + * brw_upload_state() has been committed to the hardware. This is a separate + * call from brw_upload_state() because it's possible that after the call to + * brw_upload_state(), we will discover that we've run out of aperture space, + * and need to rewind the batch buffer to the state it had before the + * brw_upload_state() call. + */ +void +brw_clear_dirty_bits(struct brw_context *brw) +{ + struct brw_state_flags *state = &brw->state.dirty; memset(state, 0, sizeof(*state)); } _______________________________________________ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit