iris: Support multiple chained batches.

There was never much point in artificially limiting chaining to two
batches - we can trivially support arbitrary length chains.

Currently, we should only ever have 1 or 2, but this may change.

Reviewed-by: Tapani Pälli <tapani.palli@intel.com>
Tested-by: Marge Bot <https://gitlab.freedesktop.org/mesa/mesa/merge_requests/3613>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/merge_requests/3613>
This commit is contained in:
Kenneth Graunke
2020-01-13 16:14:24 -08:00
committed by Marge Bot
parent 94f9c5fff6
commit ba148813d7
2 changed files with 25 additions and 21 deletions
+20 -20
View File
@@ -370,6 +370,7 @@ iris_batch_reset(struct iris_batch *batch)
iris_bo_unreference(batch->bo);
batch->primary_batch_size = 0;
batch->total_chained_batch_size = 0;
batch->contains_draw = false;
batch->decoder.surface_base = batch->last_surface_base_address;
@@ -430,30 +431,37 @@ iris_batch_maybe_flush(struct iris_batch *batch, unsigned estimate)
}
}
static void
record_batch_sizes(struct iris_batch *batch)
{
unsigned batch_size = iris_batch_bytes_used(batch);
VG(VALGRIND_CHECK_MEM_IS_DEFINED(batch->map, batch_size));
if (batch->bo == batch->exec_bos[0])
batch->primary_batch_size = batch_size;
batch->total_chained_batch_size += batch_size;
}
void
iris_chain_to_new_batch(struct iris_batch *batch)
{
/* We only support chaining a single time. */
assert(batch->bo == batch->exec_bos[0]);
VG(void *map = batch->map);
uint32_t *cmd = batch->map_next;
uint64_t *addr = batch->map_next + 4;
batch->map_next += 12;
record_batch_sizes(batch);
/* No longer held by batch->bo, still held by validation list */
iris_bo_unreference(batch->bo);
batch->primary_batch_size = iris_batch_bytes_used(batch);
create_batch(batch);
/* Emit MI_BATCH_BUFFER_START to chain to another batch. */
*cmd = (0x31 << 23) | (1 << 8) | (3 - 2);
*addr = batch->bo->gtt_offset;
VG(VALGRIND_CHECK_MEM_IS_DEFINED(map, batch->primary_batch_size));
}
static void
add_aux_map_bos_to_batch(struct iris_batch *batch)
{
@@ -493,10 +501,8 @@ iris_finish_batch(struct iris_batch *batch)
map[0] = (0xA << 23);
batch->map_next += 4;
VG(VALGRIND_CHECK_MEM_IS_DEFINED(batch->map, iris_batch_bytes_used(batch)));
if (batch->bo == batch->exec_bos[0])
batch->primary_batch_size = iris_batch_bytes_used(batch);
record_batch_sizes(batch);
}
/**
@@ -644,17 +650,11 @@ _iris_batch_flush(struct iris_batch *batch, const char *file, int line)
if (unlikely(INTEL_DEBUG &
(DEBUG_BATCH | DEBUG_SUBMIT | DEBUG_PIPE_CONTROL))) {
int bytes_for_commands = iris_batch_bytes_used(batch);
int second_bytes = 0;
if (batch->bo != batch->exec_bos[0]) {
second_bytes = bytes_for_commands;
bytes_for_commands += batch->primary_batch_size;
}
fprintf(stderr, "%19s:%-3d: %s batch [%u] flush with %5d+%5db (%0.1f%%) "
fprintf(stderr, "%19s:%-3d: %s batch [%u] flush with %5db (%0.1f%%) "
"(cmds), %4d BOs (%0.1fMb aperture)\n",
file, line, batch_name_to_string(batch->name), batch->hw_ctx_id,
batch->primary_batch_size, second_bytes,
100.0f * bytes_for_commands / BATCH_SZ,
batch->total_chained_batch_size,
100.0f * batch->total_chained_batch_size / BATCH_SZ,
batch->exec_count,
(float) batch->aperture_space / (1024 * 1024));
+5 -1
View File
@@ -67,9 +67,13 @@ struct iris_batch {
struct iris_bo *bo;
void *map;
void *map_next;
/** Size of the primary batch if we've moved on to a secondary. */
/** Size of the primary batch being submitted to execbuf (in bytes). */
unsigned primary_batch_size;
/** Total size of all chained batches (in bytes). */
unsigned total_chained_batch_size;
/** Last Surface State Base Address set in this hardware context. */
uint64_t last_surface_base_address;