diff options
Diffstat (limited to 'src/i915_render.c')
-rw-r--r-- | src/i915_render.c | 27 |
1 files changed, 16 insertions, 11 deletions
diff --git a/src/i915_render.c b/src/i915_render.c index 9e3cb50f..b2bc7a76 100644 --- a/src/i915_render.c +++ b/src/i915_render.c @@ -993,8 +993,7 @@ static void i915_emit_composite_setup(ScrnInfoPtr scrn) intel->needs_render_state_emit = FALSE; - if (intel->last_3d == LAST_3D_OTHER) - I915EmitInvarientState(intel); + IntelEmitInvarientState(scrn); intel->last_3d = LAST_3D_RENDER; is_solid_src = intel->render_source_is_solid; @@ -1141,12 +1140,18 @@ i915_composite(PixmapPtr dest, int srcX, int srcY, int maskX, int maskY, intel->needs_render_vertex_emit = FALSE; } - if (intel->vertex_count == 0 && intel->needs_render_ca_pass) { - OUT_BATCH(_3DSTATE_LOAD_STATE_IMMEDIATE_1 | I1_LOAD_S(6) | 0); - OUT_BATCH(i915_get_blend_cntl(PictOpOutReverse, - intel->render_mask_picture, - intel->render_dest_picture->format)); - i915_composite_emit_shader(intel, PictOpOutReverse); + if (intel->prim_offset == 0) { + if (intel->needs_render_ca_pass) { + OUT_BATCH(_3DSTATE_LOAD_STATE_IMMEDIATE_1 | I1_LOAD_S(6) | 0); + OUT_BATCH(i915_get_blend_cntl(PictOpOutReverse, + intel->render_mask_picture, + intel->render_dest_picture->format)); + i915_composite_emit_shader(intel, PictOpOutReverse); + } + + intel->prim_offset = intel->batch_used; + OUT_BATCH(PRIM3D_RECTLIST | PRIM3D_INDIRECT_SEQUENTIAL); + OUT_BATCH(intel->vertex_index); } intel->vertex_count += 3; @@ -1162,11 +1167,11 @@ i915_composite(PixmapPtr dest, int srcX, int srcY, int maskX, int maskY, void i915_vertex_flush(intel_screen_private *intel) { - if (intel->vertex_count == 0) + if (intel->prim_offset == 0) return; - OUT_BATCH(PRIM3D_RECTLIST | PRIM3D_INDIRECT_SEQUENTIAL | intel->vertex_count); - OUT_BATCH(intel->vertex_index); + intel->batch_ptr[intel->prim_offset] |= intel->vertex_count; + intel->prim_offset = 0; if (intel->needs_render_ca_pass) { OUT_BATCH(_3DSTATE_LOAD_STATE_IMMEDIATE_1 | I1_LOAD_S(6) | 0); |