v3d: Flush blit jobs immediately after generating them.
authorEric Anholt <eric@anholt.net>
Tue, 22 Jan 2019 19:05:56 +0000 (11:05 -0800)
committerEric Anholt <eric@anholt.net>
Sun, 27 Jan 2019 16:30:03 +0000 (08:30 -0800)
Fixes OOMs in the CTS's packed_pixels.varied_rectangle.* tests -- the
series of texture uploads at the start before texturing occurred would end
up all sitting around as cached jobs for reuse.  By flushing immediately,
peak active BO usage goes from 150M to 40M.

We could maybe put some limits on how many jobs we keep around, but blits
seem particularly unlikely to get reused for other drawing.

src/gallium/drivers/v3d/v3d_blit.c

index 7662c63d8fe9b21413321216c09562a81f3f8e2a..2f36bdd46e39b3f267178e4941f8c31e0b782e93 100644 (file)
@@ -517,6 +517,7 @@ v3d_tfu_blit(struct pipe_context *pctx, const struct pipe_blit_info *info)
 void
 v3d_blit(struct pipe_context *pctx, const struct pipe_blit_info *blit_info)
 {
+        struct v3d_context *v3d = v3d_context(pctx);
         struct pipe_blit_info info = *blit_info;
 
         if (info.mask & PIPE_MASK_S) {
@@ -529,4 +530,11 @@ v3d_blit(struct pipe_context *pctx, const struct pipe_blit_info *blit_info)
 
         if (info.mask)
                 v3d_render_blit(pctx, &info);
+
+        /* Flush our blit jobs immediately.  They're unlikely to get reused by
+         * normal drawing or other blits, and without flushing we can easily
+         * run into unexpected OOMs when blits are used for a large series of
+         * texture uploads before using the textures.
+         */
+        v3d_flush_jobs_writing_resource(v3d, info.dst.resource);
 }