i965: Emit invariant state once at startup on Gen6+.
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>
This commit is contained in:
@@ -978,7 +978,8 @@ const struct brw_tracked_state brw_line_stipple = {
|
|||||||
* Misc invariant state packets
|
* 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;
|
struct intel_context *intel = &brw->intel;
|
||||||
|
|
||||||
@@ -1016,7 +1017,7 @@ const struct brw_tracked_state brw_invariant_state = {
|
|||||||
.brw = BRW_NEW_CONTEXT,
|
.brw = BRW_NEW_CONTEXT,
|
||||||
.cache = 0
|
.cache = 0
|
||||||
},
|
},
|
||||||
.emit = upload_invariant_state
|
.emit = brw_upload_invariant_state
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -125,6 +125,7 @@ extern const struct brw_tracked_state gen7_wm_state;
|
|||||||
extern const struct brw_tracked_state haswell_cut_index;
|
extern const struct brw_tracked_state haswell_cut_index;
|
||||||
|
|
||||||
/* brw_misc_state.c */
|
/* brw_misc_state.c */
|
||||||
|
void brw_upload_invariant_state(struct brw_context *brw);
|
||||||
uint32_t
|
uint32_t
|
||||||
brw_depthbuffer_format(struct brw_context *brw);
|
brw_depthbuffer_format(struct brw_context *brw);
|
||||||
|
|
||||||
|
@@ -111,7 +111,6 @@ static const struct brw_tracked_state *gen6_atoms[] =
|
|||||||
&gen6_sf_vp,
|
&gen6_sf_vp,
|
||||||
|
|
||||||
/* Command packets: */
|
/* Command packets: */
|
||||||
&brw_invariant_state,
|
|
||||||
|
|
||||||
/* must do before binding table pointers, cc state ptrs */
|
/* must do before binding table pointers, cc state ptrs */
|
||||||
&brw_state_base_address,
|
&brw_state_base_address,
|
||||||
@@ -177,7 +176,6 @@ static const struct brw_tracked_state *gen7_atoms[] =
|
|||||||
&brw_wm_prog,
|
&brw_wm_prog,
|
||||||
|
|
||||||
/* Command packets: */
|
/* Command packets: */
|
||||||
&brw_invariant_state,
|
|
||||||
&gen7_push_constant_alloc,
|
&gen7_push_constant_alloc,
|
||||||
|
|
||||||
/* must do before binding table pointers, cc state ptrs */
|
/* must do before binding table pointers, cc state ptrs */
|
||||||
@@ -241,6 +239,20 @@ static const struct brw_tracked_state *gen7_atoms[] =
|
|||||||
&haswell_cut_index,
|
&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 )
|
void brw_init_state( struct brw_context *brw )
|
||||||
{
|
{
|
||||||
@@ -270,6 +282,8 @@ void brw_init_state( struct brw_context *brw )
|
|||||||
assert((*atoms)->emit);
|
assert((*atoms)->emit);
|
||||||
atoms++;
|
atoms++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
brw_upload_initial_gpu_state(brw);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user