summaryrefslogtreecommitdiffstats
path: root/src/gallium
diff options
context:
space:
mode:
authorEric Anholt <[email protected]>2017-01-04 11:24:31 -0800
committerEric Anholt <[email protected]>2017-01-05 16:23:32 -0800
commitebf33e577aee00cf888c79e11a3b62c181b46510 (patch)
tree142adc22f4a46af254f8a2a38101ef90f844b38c /src/gallium
parent076ab157ff2ed7a98b09363bce355247f4ed71e6 (diff)
vc4: Flush the job early if we're referencing too many BOs.
If we get up toward 256MB (or whatever the CMA area size is), VC4_GEM_CREATE will start throwing errors. Even if we don't trigger that, when we flush the kernel's BO allocation for the CLs or bin memory may end up throwing an error, at which point our job won't get rendered at all. Just flush early (half of maximum CMA size) so that hopefully we never get to that point.
Diffstat (limited to 'src/gallium')
-rw-r--r--src/gallium/drivers/vc4/vc4_cl.c2
-rw-r--r--src/gallium/drivers/vc4/vc4_context.h7
-rw-r--r--src/gallium/drivers/vc4/vc4_draw.c7
3 files changed, 16 insertions, 0 deletions
diff --git a/src/gallium/drivers/vc4/vc4_cl.c b/src/gallium/drivers/vc4/vc4_cl.c
index 91f51b02bb6..35578370e2c 100644
--- a/src/gallium/drivers/vc4/vc4_cl.c
+++ b/src/gallium/drivers/vc4/vc4_cl.c
@@ -76,5 +76,7 @@ vc4_gem_hindex(struct vc4_job *job, struct vc4_bo *bo)
cl_ptr(&out, vc4_bo_reference(bo));
cl_end(&job->bo_pointers, out);
+ job->bo_space += bo->size;
+
return hindex;
}
diff --git a/src/gallium/drivers/vc4/vc4_context.h b/src/gallium/drivers/vc4/vc4_context.h
index 2005ae0e4ea..6bd2424ec79 100644
--- a/src/gallium/drivers/vc4/vc4_context.h
+++ b/src/gallium/drivers/vc4/vc4_context.h
@@ -228,6 +228,13 @@ struct vc4_job {
struct vc4_cl bo_handles;
struct vc4_cl bo_pointers;
uint32_t shader_rec_count;
+ /**
+ * Amount of memory used by the BOs in bo_pointers.
+ *
+ * Used for checking when we should flush the job early so we don't
+ * OOM.
+ */
+ uint32_t bo_space;
/** @{ Surfaces to submit rendering for. */
struct pipe_surface *color_read;
diff --git a/src/gallium/drivers/vc4/vc4_draw.c b/src/gallium/drivers/vc4/vc4_draw.c
index 13db9daeb9e..ebd080298a4 100644
--- a/src/gallium/drivers/vc4/vc4_draw.c
+++ b/src/gallium/drivers/vc4/vc4_draw.c
@@ -466,6 +466,13 @@ vc4_draw_vbo(struct pipe_context *pctx, const struct pipe_draw_info *info)
job->resolve |= PIPE_CLEAR_COLOR0;
+ /* If we've used half of the presumably 256MB CMA area, flush the job
+ * so that we don't accumulate a job that will end up not being
+ * executable.
+ */
+ if (job->bo_space > 128 * 1024 * 1024)
+ vc4_flush(pctx);
+
if (vc4_debug & VC4_DEBUG_ALWAYS_FLUSH)
vc4_flush(pctx);
}