implicit-flush

This commit is contained in:
Chris Wilson 2010-06-08 10:43:24 +01:00
parent d41684d545
commit 0776a42b70
3 changed files with 25 additions and 14 deletions

View File

@ -144,6 +144,24 @@ void intel_batch_teardown(ScrnInfoPtr scrn)
}
}
void intel_batch_do_flush(ScrnInfoPtr scrn)
{
intel_screen_private *intel = intel_get_screen_private(scrn);
while (!list_is_empty(&intel->flush_pixmaps)) {
struct intel_pixmap *entry;
entry = list_first_entry(&intel->flush_pixmaps,
struct intel_pixmap,
flush);
entry->flush_read_domains = entry->flush_write_domain = 0;
list_del(&entry->flush);
}
intel->need_mi_flush = FALSE;
}
void intel_batch_emit_flush(ScrnInfoPtr scrn)
{
intel_screen_private *intel = intel_get_screen_private(scrn);
@ -160,18 +178,7 @@ void intel_batch_emit_flush(ScrnInfoPtr scrn)
OUT_BATCH(MI_FLUSH | flags);
ADVANCE_BATCH();
while (!list_is_empty(&intel->flush_pixmaps)) {
struct intel_pixmap *entry;
entry = list_first_entry(&intel->flush_pixmaps,
struct intel_pixmap,
flush);
entry->flush_read_domains = entry->flush_write_domain = 0;
list_del(&entry->flush);
}
intel->need_mi_flush = FALSE;
intel_batch_do_flush(scrn);
}
void intel_batch_submit(ScrnInfoPtr scrn)

View File

@ -36,6 +36,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
void intel_batch_init(ScrnInfoPtr scrn);
void intel_batch_teardown(ScrnInfoPtr scrn);
void intel_batch_emit_flush(ScrnInfoPtr scrn);
void intel_batch_do_flush(ScrnInfoPtr scrn);
void intel_batch_submit(ScrnInfoPtr scrn);
void intel_batch_wait_last(ScrnInfoPtr scrn);

View File

@ -832,8 +832,11 @@ i915_prepare_composite(int op, PicturePtr source_picture,
intel->i915_render_state.op = op;
if((source && i830_uxa_pixmap_is_dirty(source)) ||
(mask && i830_uxa_pixmap_is_dirty(mask)))
/* BUF_INFO is an implicit flush */
if (dest != intel->render_current_dest)
intel_batch_do_flush(scrn);
else if((source && i830_uxa_pixmap_is_dirty(source)) ||
(mask && i830_uxa_pixmap_is_dirty(mask)))
intel_batch_emit_flush(scrn);
intel->needs_render_state_emit = TRUE;