snb: Emit more invariants only once

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
This commit is contained in:
Chris Wilson 2010-12-06 13:34:53 +00:00
parent e8f41c3710
commit a58e5a1bdf
1 changed files with 65 additions and 75 deletions

View File

@ -2175,10 +2175,8 @@ gen6_composite_create_depth_stencil_state(ScrnInfoPtr scrn)
}
static void
gen6_composite_invarient_states(ScrnInfoPtr scrn)
gen6_composite_invariant_states(intel_screen_private *intel)
{
intel_screen_private *intel = intel_get_screen_private(scrn);
OUT_BATCH(NEW_PIPELINE_SELECT | PIPELINE_SELECT_3D);
OUT_BATCH(GEN6_3DSTATE_MULTISAMPLE | (3 - 2));
@ -2195,10 +2193,8 @@ gen6_composite_invarient_states(ScrnInfoPtr scrn)
}
static void
gen6_composite_state_base_address(ScrnInfoPtr scrn)
gen6_composite_state_base_address(intel_screen_private *intel)
{
intel_screen_private *intel = intel_get_screen_private(scrn);
OUT_BATCH(BRW_STATE_BASE_ADDRESS | (10 - 2));
OUT_BATCH(BASE_ADDRESS_MODIFY); /* General state base address */
intel->surface_reloc = intel->batch_used;
@ -2214,9 +2210,9 @@ gen6_composite_state_base_address(ScrnInfoPtr scrn)
}
static void
gen6_composite_viewport_state_pointers(ScrnInfoPtr scrn, drm_intel_bo *cc_vp_bo)
gen6_composite_viewport_state_pointers(intel_screen_private *intel,
drm_intel_bo *cc_vp_bo)
{
intel_screen_private *intel = intel_get_screen_private(scrn);
OUT_BATCH(GEN6_3DSTATE_VIEWPORT_STATE_POINTERS |
GEN6_3DSTATE_VIEWPORT_STATE_MODIFY_CC |
@ -2227,10 +2223,8 @@ gen6_composite_viewport_state_pointers(ScrnInfoPtr scrn, drm_intel_bo *cc_vp_bo)
}
static void
gen6_composite_urb(ScrnInfoPtr scrn)
gen6_composite_urb(intel_screen_private *intel)
{
intel_screen_private *intel = intel_get_screen_private(scrn);
OUT_BATCH(GEN6_3DSTATE_URB | (3 - 2));
OUT_BATCH(((1 - 1) << GEN6_3DSTATE_URB_VS_SIZE_SHIFT) |
(24 << GEN6_3DSTATE_URB_VS_ENTRIES_SHIFT)); /* at least 24 on GEN6 */
@ -2239,16 +2233,14 @@ gen6_composite_urb(ScrnInfoPtr scrn)
}
static void
gen6_composite_cc_state_pointers(ScrnInfoPtr scrn,
drm_intel_bo *blend_state_bo,
uint32_t blend_state_offset,
drm_intel_bo *depth_stencil_state_bo,
uint32_t depth_stencil_state_offset,
drm_intel_bo *cc_state_bo,
uint32_t cc_state_offset)
gen6_composite_cc_state_pointers(intel_screen_private *intel,
drm_intel_bo *blend_state_bo,
uint32_t blend_state_offset,
drm_intel_bo *depth_stencil_state_bo,
uint32_t depth_stencil_state_offset,
drm_intel_bo *cc_state_bo,
uint32_t cc_state_offset)
{
intel_screen_private *intel = intel_get_screen_private(scrn);
OUT_BATCH(GEN6_3DSTATE_CC_STATE_POINTERS | (4 - 2));
OUT_RELOC(blend_state_bo, I915_GEM_DOMAIN_INSTRUCTION, 0, blend_state_offset | 1);
OUT_RELOC(depth_stencil_state_bo, I915_GEM_DOMAIN_INSTRUCTION, 0, depth_stencil_state_offset | 1);
@ -2256,10 +2248,9 @@ gen6_composite_cc_state_pointers(ScrnInfoPtr scrn,
}
static void
gen6_composite_sampler_state_pointers(ScrnInfoPtr scrn, drm_intel_bo *ps_sampler_state_bo)
gen6_composite_sampler_state_pointers(intel_screen_private *intel,
drm_intel_bo *ps_sampler_state_bo)
{
intel_screen_private *intel = intel_get_screen_private(scrn);
OUT_BATCH(GEN6_3DSTATE_SAMPLER_STATE_POINTERS |
GEN6_3DSTATE_SAMPLER_STATE_MODIFY_PS |
(4 - 2));
@ -2268,18 +2259,16 @@ gen6_composite_sampler_state_pointers(ScrnInfoPtr scrn, drm_intel_bo *ps_sampler
OUT_RELOC(ps_sampler_state_bo, I915_GEM_DOMAIN_INSTRUCTION, 0, 0);
}
static void
gen6_composite_vs_state(ScrnInfoPtr scrn)
static void
gen6_composite_vs_state(intel_screen_private *intel)
{
intel_screen_private *intel = intel_get_screen_private(scrn);
/* disable VS constant buffer */
OUT_BATCH(GEN6_3DSTATE_CONSTANT_VS | (5 - 2));
OUT_BATCH(0);
OUT_BATCH(0);
OUT_BATCH(0);
OUT_BATCH(0);
OUT_BATCH(GEN6_3DSTATE_VS | (6 - 2));
OUT_BATCH(0); /* without VS kernel */
OUT_BATCH(0);
@ -2288,18 +2277,16 @@ gen6_composite_vs_state(ScrnInfoPtr scrn)
OUT_BATCH(0); /* pass-through */
}
static void
gen6_composite_gs_state(ScrnInfoPtr scrn)
static void
gen6_composite_gs_state(intel_screen_private *intel)
{
intel_screen_private *intel = intel_get_screen_private(scrn);
/* disable GS constant buffer */
OUT_BATCH(GEN6_3DSTATE_CONSTANT_GS | (5 - 2));
OUT_BATCH(0);
OUT_BATCH(0);
OUT_BATCH(0);
OUT_BATCH(0);
OUT_BATCH(GEN6_3DSTATE_GS | (7 - 2));
OUT_BATCH(0); /* without GS kernel */
OUT_BATCH(0);
@ -2309,21 +2296,19 @@ gen6_composite_gs_state(ScrnInfoPtr scrn)
OUT_BATCH(0); /* pass-through */
}
static void
gen6_composite_clip_state(ScrnInfoPtr scrn)
static void
gen6_composite_clip_state(intel_screen_private *intel)
{
intel_screen_private *intel = intel_get_screen_private(scrn);
OUT_BATCH(GEN6_3DSTATE_CLIP | (4 - 2));
OUT_BATCH(0);
OUT_BATCH(0); /* pass-through */
OUT_BATCH(0);
}
static void
gen6_composite_sf_state(ScrnInfoPtr scrn, Bool has_mask)
static void
gen6_composite_sf_state(intel_screen_private *intel,
Bool has_mask)
{
intel_screen_private *intel = intel_get_screen_private(scrn);
int num_sf_outputs = has_mask ? 2 : 1;
OUT_BATCH(GEN6_3DSTATE_SF | (20 - 2));
@ -2350,10 +2335,11 @@ gen6_composite_sf_state(ScrnInfoPtr scrn, Bool has_mask)
OUT_BATCH(0); /* DW19 */
}
static void
gen6_composite_wm_state(ScrnInfoPtr scrn, Bool has_mask, drm_intel_bo *kernel_bo)
static void
gen6_composite_wm_state(intel_screen_private *intel,
Bool has_mask,
drm_intel_bo *kernel_bo)
{
intel_screen_private *intel = intel_get_screen_private(scrn);
int num_surfaces = has_mask ? 3 : 2;
int num_sf_outputs = has_mask ? 2 : 1;
@ -2373,19 +2359,17 @@ gen6_composite_wm_state(ScrnInfoPtr scrn, Bool has_mask, drm_intel_bo *kernel_bo
OUT_BATCH(0);
OUT_BATCH((6 << GEN6_3DSTATE_WM_DISPATCH_START_GRF_0_SHIFT)); /* DW4 */
OUT_BATCH(((40 - 1) << GEN6_3DSTATE_WM_MAX_THREADS_SHIFT) |
GEN6_3DSTATE_WM_DISPATCH_ENABLE |
GEN6_3DSTATE_WM_16_DISPATCH_ENABLE);
GEN6_3DSTATE_WM_DISPATCH_ENABLE |
GEN6_3DSTATE_WM_16_DISPATCH_ENABLE);
OUT_BATCH((num_sf_outputs << GEN6_3DSTATE_WM_NUM_SF_OUTPUTS_SHIFT) |
GEN6_3DSTATE_WM_PERSPECTIVE_PIXEL_BARYCENTRIC);
GEN6_3DSTATE_WM_PERSPECTIVE_PIXEL_BARYCENTRIC);
OUT_BATCH(0);
OUT_BATCH(0);
}
static void
gen6_composite_binding_table_pointers(ScrnInfoPtr scrn)
gen6_composite_binding_table_pointers(intel_screen_private *intel)
{
intel_screen_private *intel = intel_get_screen_private(scrn);
/* Binding table pointers */
OUT_BATCH(BRW_3DSTATE_BINDING_TABLE_POINTERS |
GEN6_3DSTATE_BINDING_TABLE_MODIFY_PS |
@ -2397,10 +2381,8 @@ gen6_composite_binding_table_pointers(ScrnInfoPtr scrn)
}
static void
gen6_composite_depth_buffer_state(ScrnInfoPtr scrn)
gen6_composite_depth_buffer_state(intel_screen_private *intel)
{
intel_screen_private *intel = intel_get_screen_private(scrn);
OUT_BATCH(BRW_3DSTATE_DEPTH_BUFFER | (7 - 2));
OUT_BATCH((BRW_SURFACE_NULL << BRW_3DSTATE_DEPTH_BUFFER_TYPE_SHIFT) |
(BRW_DEPTHFORMAT_D32_FLOAT << BRW_3DSTATE_DEPTH_BUFFER_FORMAT_SHIFT));
@ -2415,10 +2397,9 @@ gen6_composite_depth_buffer_state(ScrnInfoPtr scrn)
}
static void
gen6_composite_drawing_rectangle(ScrnInfoPtr scrn, PixmapPtr dest)
gen6_composite_drawing_rectangle(intel_screen_private *intel,
PixmapPtr dest)
{
intel_screen_private *intel = intel_get_screen_private(scrn);
OUT_BATCH(BRW_3DSTATE_DRAWING_RECTANGLE | (4 - 2));
OUT_BATCH(0x00000000); /* ymin, xmin */
OUT_BATCH(DRAW_YMAX(dest->drawable.height - 1) | DRAW_XMAX(dest->drawable.width - 1)); /* ymax, xmax */
@ -2426,9 +2407,10 @@ gen6_composite_drawing_rectangle(ScrnInfoPtr scrn, PixmapPtr dest)
}
static void
gen6_composite_vertex_element_state(ScrnInfoPtr scrn, Bool has_mask, Bool is_affine)
gen6_composite_vertex_element_state(intel_screen_private *intel,
Bool has_mask,
Bool is_affine)
{
intel_screen_private *intel = intel_get_screen_private(scrn);
/*
* vertex data in vertex buffer
* position: (x, y)
@ -2521,37 +2503,45 @@ gen6_emit_composite_state(ScrnInfoPtr scrn)
drm_intel_bo *ps_sampler_state_bo = render_state->ps_sampler_state_bo[src_filter][src_extend][mask_filter][mask_extend];
intel->needs_render_state_emit = FALSE;
IntelEmitInvarientState(scrn);
intel->last_3d = LAST_3D_RENDER;
if (intel->needs_3d_invariant) {
gen6_composite_invariant_states(intel);
gen6_composite_viewport_state_pointers(intel,
render_state->cc_vp_bo);
gen6_composite_urb(intel);
gen6_composite_vs_state(intel);
gen6_composite_gs_state(intel);
gen6_composite_clip_state(intel);
gen6_composite_depth_buffer_state(intel);
intel->needs_3d_invariant = FALSE;
}
i965_get_blend_cntl(op,
mask_picture,
dest_picture->format,
&src_blend,
&dst_blend);
assert(intel->in_batch_atomic);
gen6_composite_invarient_states(scrn);
if (intel->surface_reloc == 0)
gen6_composite_state_base_address(scrn);
gen6_composite_viewport_state_pointers(scrn, render_state->cc_vp_bo);
gen6_composite_urb(scrn);
gen6_composite_cc_state_pointers(scrn,
gen6_composite_state_base_address(intel);
gen6_composite_cc_state_pointers(intel,
render_state->gen6_blend_bo,
((src_blend * BRW_BLENDFACTOR_COUNT) + dst_blend) * GEN6_BLEND_STATE_PADDED_SIZE,
render_state->gen6_depth_stencil_bo,
0,
render_state->cc_state_bo,
0);
gen6_composite_sampler_state_pointers(scrn, ps_sampler_state_bo);
gen6_composite_vs_state(scrn);
gen6_composite_gs_state(scrn);
gen6_composite_clip_state(scrn);
gen6_composite_sf_state(scrn, mask != 0);
gen6_composite_wm_state(scrn, mask != 0, render_state->wm_kernel_bo[composite_op->wm_kernel]);
gen6_composite_binding_table_pointers(scrn);
gen6_composite_depth_buffer_state(scrn);
gen6_composite_drawing_rectangle(scrn, dest);
gen6_composite_vertex_element_state(scrn, mask != 0, is_affine);
gen6_composite_sampler_state_pointers(intel, ps_sampler_state_bo);
gen6_composite_sf_state(intel, mask != 0);
gen6_composite_wm_state(intel,
mask != 0,
render_state->wm_kernel_bo[composite_op->wm_kernel]);
gen6_composite_binding_table_pointers(intel);
gen6_composite_drawing_rectangle(intel, dest);
gen6_composite_vertex_element_state(intel, mask != 0, is_affine);
}
static void