i965: Emit invariant state once at startup on Gen6+.
authorKenneth Graunke <kenneth@whitecape.org>
Sat, 8 Jun 2013 16:55:36 +0000 (09:55 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Mon, 10 Jun 2013 17:58:42 +0000 (10:58 -0700)
Now that we have hardware contexts, we can safely initialize our GPU
state once at startup, rather than needing a state atom with the
BRW_NEW_CONTEXT flag set.

This removes a tiny bit of code from our drawing loop.

Reviewed-by: Eric Anholt <eric@anholt.net>
Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
src/mesa/drivers/dri/i965/brw_misc_state.c
src/mesa/drivers/dri/i965/brw_state.h
src/mesa/drivers/dri/i965/brw_state_upload.c

index 8162eeb66f6a2de4f8a29ab3a8ff3361e049720f..7e41c849117552ac5c8f7b7da656a2107f55c22a 100644 (file)
@@ -978,7 +978,8 @@ const struct brw_tracked_state brw_line_stipple = {
  * Misc invariant state packets
  */
 
-static void upload_invariant_state( struct brw_context *brw )
+void
+brw_upload_invariant_state(struct brw_context *brw)
 {
    struct intel_context *intel = &brw->intel;
 
@@ -1016,7 +1017,7 @@ const struct brw_tracked_state brw_invariant_state = {
       .brw = BRW_NEW_CONTEXT,
       .cache = 0
    },
-   .emit = upload_invariant_state
+   .emit = brw_upload_invariant_state
 };
 
 /**
index 9afc6bbad2b398e077056fb4d54cdc595f05c9d4..7215128c49a709f59cc4bddd2ad1df30bc52f3b3 100644 (file)
@@ -125,6 +125,7 @@ extern const struct brw_tracked_state gen7_wm_state;
 extern const struct brw_tracked_state haswell_cut_index;
 
 /* brw_misc_state.c */
+void brw_upload_invariant_state(struct brw_context *brw);
 uint32_t
 brw_depthbuffer_format(struct brw_context *brw);
 
index 07c49ff1c219fb8830e2e9e684876596a907f6ae..6a69a677dde9dbccfad95fb9c1bf6ce33f518ab0 100644 (file)
@@ -111,7 +111,6 @@ static const struct brw_tracked_state *gen6_atoms[] =
    &gen6_sf_vp,
 
    /* Command packets: */
-   &brw_invariant_state,
 
    /* must do before binding table pointers, cc state ptrs */
    &brw_state_base_address,
@@ -177,7 +176,6 @@ static const struct brw_tracked_state *gen7_atoms[] =
    &brw_wm_prog,
 
    /* Command packets: */
-   &brw_invariant_state,
    &gen7_push_constant_alloc,
 
    /* must do before binding table pointers, cc state ptrs */
@@ -241,6 +239,20 @@ static const struct brw_tracked_state *gen7_atoms[] =
    &haswell_cut_index,
 };
 
+static void
+brw_upload_initial_gpu_state(struct brw_context *brw)
+{
+   struct intel_context *intel = &brw->intel;
+
+   /* On platforms with hardware contexts, we can set our initial GPU state
+    * right away rather than doing it via state atoms.  This saves a small
+    * amount of overhead on every draw call.
+    */
+   if (!intel->hw_ctx)
+      return;
+
+   brw_upload_invariant_state(brw);
+}
 
 void brw_init_state( struct brw_context *brw )
 {
@@ -270,6 +282,8 @@ void brw_init_state( struct brw_context *brw )
       assert((*atoms)->emit);
       atoms++;
    }
+
+   brw_upload_initial_gpu_state(brw);
 }