vc4: Move draw call reset handling to a helper function.
authorEric Anholt <eric@anholt.net>
Tue, 30 Dec 2014 20:12:15 +0000 (12:12 -0800)
committerEric Anholt <eric@anholt.net>
Tue, 30 Dec 2014 22:30:59 +0000 (14:30 -0800)
This will be more important in the next commit, when there's more state to
reset to nonzero values, and I want an early exit from the submit
function.

src/gallium/drivers/vc4/vc4_context.c

index d4a9eec7b081b249f628150ba183ec755ffd1d0d..401eb216f2791728b22b47897d2618ede3fa79cd 100644 (file)
@@ -286,6 +286,35 @@ vc4_setup_rcl(struct vc4_context *vc4)
                 ztex->writes++;
 }
 
+static void
+vc4_draw_reset(struct vc4_context *vc4)
+{
+        vc4_reset_cl(&vc4->bcl);
+        vc4_reset_cl(&vc4->rcl);
+        vc4_reset_cl(&vc4->shader_rec);
+        vc4_reset_cl(&vc4->uniforms);
+        vc4_reset_cl(&vc4->bo_handles);
+        struct vc4_bo **referenced_bos = vc4->bo_pointers.base;
+        for (int i = 0; i < (vc4->bo_handles.next -
+                             vc4->bo_handles.base) / 4; i++) {
+                vc4_bo_unreference(&referenced_bos[i]);
+        }
+        vc4_reset_cl(&vc4->bo_pointers);
+        vc4->shader_rec_count = 0;
+
+        vc4->needs_flush = false;
+        vc4->draw_call_queued = false;
+
+        /* We have no hardware context saved between our draw calls, so we
+         * need to flag the next draw as needing all state emitted.  Emitting
+         * all state at the start of our draws is also what ensures that we
+         * return to the state we need after a previous tile has finished.
+         */
+        vc4->dirty = ~0;
+        vc4->resolve = 0;
+        vc4->cleared = 0;
+}
+
 void
 vc4_flush(struct pipe_context *pctx)
 {
@@ -351,28 +380,7 @@ vc4_flush(struct pipe_context *pctx)
                 }
         }
 
-        vc4_reset_cl(&vc4->bcl);
-        vc4_reset_cl(&vc4->rcl);
-        vc4_reset_cl(&vc4->shader_rec);
-        vc4_reset_cl(&vc4->uniforms);
-        vc4_reset_cl(&vc4->bo_handles);
-        struct vc4_bo **referenced_bos = vc4->bo_pointers.base;
-        for (int i = 0; i < submit.bo_handle_count; i++)
-                vc4_bo_unreference(&referenced_bos[i]);
-        vc4_reset_cl(&vc4->bo_pointers);
-        vc4->shader_rec_count = 0;
-
-        vc4->needs_flush = false;
-        vc4->draw_call_queued = false;
-
-        /* We have no hardware context saved between our draw calls, so we
-         * need to flag the next draw as needing all state emitted.  Emitting
-         * all state at the start of our draws is also what ensures that we
-         * return to the state we need after a previous tile has finished.
-         */
-        vc4->dirty = ~0;
-        vc4->resolve = 0;
-        vc4->cleared = 0;
+        vc4_draw_reset(vc4);
 }
 
 static void
@@ -494,8 +502,8 @@ vc4_context_create(struct pipe_screen *pscreen, void *priv)
         vc4_init_cl(vc4, &vc4->uniforms);
         vc4_init_cl(vc4, &vc4->bo_handles);
         vc4_init_cl(vc4, &vc4->bo_pointers);
+        vc4_draw_reset(vc4);
 
-        vc4->dirty = ~0;
         vc4->fd = screen->fd;
 
         util_slab_create(&vc4->transfer_pool, sizeof(struct vc4_transfer),