xf86-video-intel: 5 commits - src/sna/brw src/sna/gen4_render.c src/sna/gen5_render.c
Chris Wilson
ickle at kemper.freedesktop.org
Tue Jan 7 07:00:24 PST 2014
src/sna/brw/brw_eu_emit.c | 2
src/sna/gen4_render.c | 126 +++++++++++++++++++++++++++++++---------------
src/sna/gen5_render.c | 2
3 files changed, 89 insertions(+), 41 deletions(-)
New commits:
commit b858c28d04dfd353a99f9d15c39599adbf5cb25f
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Tue Jan 7 14:42:41 2014 +0000
sna/gen4: Tidy URB_FENCE command
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/sna/gen4_render.c b/src/sna/gen4_render.c
index d80791b..e239c21 100644
--- a/src/sna/gen4_render.c
+++ b/src/sna/gen4_render.c
@@ -79,8 +79,8 @@
#define URB_GS_ENTRY_SIZE 0
#define URB_GS_ENTRIES 0
-#define URB_CLIP_ENTRY_SIZE 0
-#define URB_CLIP_ENTRIES 0
+#define URB_CL_ENTRY_SIZE 0
+#define URB_CL_ENTRIES 0
#define URB_SF_ENTRY_SIZE 2
#define URB_SF_ENTRIES 64
@@ -767,25 +767,21 @@ gen4_composite_get_binding_table(struct sna *sna, uint16_t *offset)
static void
gen4_emit_urb(struct sna *sna)
{
- int urb_vs_start, urb_vs_size;
- int urb_gs_start, urb_gs_size;
- int urb_clip_start, urb_clip_size;
- int urb_sf_start, urb_sf_size;
- int urb_cs_start, urb_cs_size;
+ int urb_vs_end;
+ int urb_gs_end;
+ int urb_cl_end;
+ int urb_sf_end;
+ int urb_cs_end;
if (!sna->render_state.gen4.needs_urb)
return;
- urb_vs_start = 0;
- urb_vs_size = URB_VS_ENTRIES * URB_VS_ENTRY_SIZE;
- urb_gs_start = urb_vs_start + urb_vs_size;
- urb_gs_size = URB_GS_ENTRIES * URB_GS_ENTRY_SIZE;
- urb_clip_start = urb_gs_start + urb_gs_size;
- urb_clip_size = URB_CLIP_ENTRIES * URB_CLIP_ENTRY_SIZE;
- urb_sf_start = urb_clip_start + urb_clip_size;
- urb_sf_size = URB_SF_ENTRIES * URB_SF_ENTRY_SIZE;
- urb_cs_start = urb_sf_start + urb_sf_size;
- urb_cs_size = URB_CS_ENTRIES * URB_CS_ENTRY_SIZE;
+ urb_vs_end = URB_VS_ENTRIES * URB_VS_ENTRY_SIZE;
+ urb_gs_end = urb_vs_end + URB_GS_ENTRIES * URB_GS_ENTRY_SIZE;
+ urb_cl_end = urb_gs_end + URB_CL_ENTRIES * URB_CL_ENTRY_SIZE;
+ urb_sf_end = urb_cl_end + URB_SF_ENTRIES * URB_SF_ENTRY_SIZE;
+ urb_cs_end = urb_sf_end + URB_CS_ENTRIES * URB_CS_ENTRY_SIZE;
+ assert(urb_cs_end <= 256);
while ((sna->kgem.nbatch & 15) > 12)
OUT_BATCH(MI_NOOP);
@@ -797,11 +793,11 @@ gen4_emit_urb(struct sna *sna)
UF0_GS_REALLOC |
UF0_VS_REALLOC |
1);
- OUT_BATCH(((urb_clip_start + urb_clip_size) << UF1_CLIP_FENCE_SHIFT) |
- ((urb_gs_start + urb_gs_size) << UF1_GS_FENCE_SHIFT) |
- ((urb_vs_start + urb_vs_size) << UF1_VS_FENCE_SHIFT));
- OUT_BATCH(((urb_cs_start + urb_cs_size) << UF2_CS_FENCE_SHIFT) |
- ((urb_sf_start + urb_sf_size) << UF2_SF_FENCE_SHIFT));
+ OUT_BATCH(urb_cl_end << UF1_CLIP_FENCE_SHIFT |
+ urb_gs_end << UF1_GS_FENCE_SHIFT |
+ urb_vs_end << UF1_VS_FENCE_SHIFT);
+ OUT_BATCH(urb_cs_end << UF2_CS_FENCE_SHIFT |
+ urb_sf_end << UF2_SF_FENCE_SHIFT);
/* Constant buffer state */
OUT_BATCH(GEN4_CS_URB_STATE | 0);
commit b7565a26401e283df94b68019e8093f8104428f4
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Tue Jan 7 14:05:09 2014 +0000
sna/gen4: Use PIPE_CONTROL for a smaller hammer
Using MI_FLUSH to break up primitive is overkill when a top-of-pipe
PIPE_CONTROL will suffice.
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/sna/gen4_render.c b/src/sna/gen4_render.c
index 98e56e7..d80791b 100644
--- a/src/sna/gen4_render.c
+++ b/src/sna/gen4_render.c
@@ -568,6 +568,45 @@ static void gen4_emit_vertex_buffer(struct sna *sna,
sna->render.vb_id |= 1 << id;
}
+inline static void
+gen4_emit_pipe_flush(struct sna *sna)
+{
+#if 1
+ OUT_BATCH(GEN4_PIPE_CONTROL | (4 - 2));
+ OUT_BATCH(GEN4_PIPE_CONTROL_WC_FLUSH);
+ OUT_BATCH(0);
+ OUT_BATCH(0);
+#else
+ OUT_BATCH(MI_FLUSH | MI_INHIBIT_RENDER_CACHE_FLUSH);
+#endif
+}
+
+inline static void
+gen4_emit_pipe_break(struct sna *sna)
+{
+#if 1
+ OUT_BATCH(GEN4_PIPE_CONTROL | (4 - 2));
+ OUT_BATCH(0);
+ OUT_BATCH(0);
+ OUT_BATCH(0);
+#else
+ OUT_BATCH(MI_FLUSH | MI_INHIBIT_RENDER_CACHE_FLUSH);
+#endif
+}
+
+inline static void
+gen4_emit_pipe_invalidate(struct sna *sna)
+{
+#if 0
+ OUT_BATCH(GEN4_PIPE_CONTROL | (4 - 2));
+ OUT_BATCH(GEN4_PIPE_CONTROL_WC_FLUSH | GEN4_PIPE_CONTROL_TC_FLUSH);
+ OUT_BATCH(0);
+ OUT_BATCH(0);
+#else
+ OUT_BATCH(MI_FLUSH);
+#endif
+}
+
static void gen4_emit_primitive(struct sna *sna)
{
if (sna->kgem.nbatch == sna->render_state.gen4.last_primitive) {
@@ -604,7 +643,7 @@ static bool gen4_rectangle_begin(struct sna *sna,
ndwords = op->need_magic_ca_pass? 19 : 6;
if ((sna->render.vb_id & id) == 0)
ndwords += 5;
- ndwords += 2*FORCE_FLUSH;
+ ndwords += 8*FORCE_FLUSH;
if (!kgem_check_batch(&sna->kgem, ndwords))
return false;
@@ -628,7 +667,7 @@ static int gen4_get_rectangles__flush(struct sna *sna,
}
if (!kgem_check_batch(&sna->kgem,
- 2*FORCE_FLUSH + (op->need_magic_ca_pass ? 2*19+6 : 6)))
+ 8*FORCE_FLUSH + (op->need_magic_ca_pass ? 2*19+6 : 6)))
return 0;
if (!kgem_check_reloc_and_exec(&sna->kgem, 2))
return 0;
@@ -666,7 +705,7 @@ inline static int gen4_get_rectangles(struct sna *sna,
op->u.gen4.wm_kernel);
}
}
- OUT_BATCH(MI_FLUSH | MI_INHIBIT_RENDER_CACHE_FLUSH);
+ gen4_emit_pipe_break(sna);
rem = MAX_FLUSH_VERTICES;
}
} else
@@ -1048,14 +1087,14 @@ gen4_emit_state(struct sna *sna,
kgem_bo_is_dirty(op->src.bo),
kgem_bo_is_dirty(op->mask.bo),
flush));
- OUT_BATCH(MI_FLUSH);
+ gen4_emit_pipe_invalidate(sna);
kgem_clear_dirty(&sna->kgem);
kgem_bo_mark_dirty(op->dst.bo);
flush = false;
}
flush &= gen4_emit_drawing_rectangle(sna, op);
if (flush && op->op > PictOpSrc)
- OUT_BATCH(MI_FLUSH | MI_INHIBIT_RENDER_CACHE_FLUSH);
+ gen4_emit_pipe_flush(sna);
gen4_emit_binding_table(sna, wm_binding_table);
gen4_emit_pipelined_pointers(sna, op, op->op, op->u.gen4.wm_kernel);
commit 9d8473c5d9489db439aca73f470bda29a22ebab6
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Tue Jan 7 13:43:35 2014 +0000
sna/gen4: Check for available batch space before restoring state after CA pass
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=73348
References: https://bugs.freedesktop.org/show_bug.cgi?id=55500
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/sna/gen4_render.c b/src/sna/gen4_render.c
index 5e18fd0..98e56e7 100644
--- a/src/sna/gen4_render.c
+++ b/src/sna/gen4_render.c
@@ -601,7 +601,7 @@ static bool gen4_rectangle_begin(struct sna *sna,
return true;
/* 7xpipelined pointers + 6xprimitive + 1xflush */
- ndwords = op->need_magic_ca_pass? 20 : 6;
+ ndwords = op->need_magic_ca_pass? 19 : 6;
if ((sna->render.vb_id & id) == 0)
ndwords += 5;
ndwords += 2*FORCE_FLUSH;
@@ -628,7 +628,7 @@ static int gen4_get_rectangles__flush(struct sna *sna,
}
if (!kgem_check_batch(&sna->kgem,
- 2*FORCE_FLUSH + (op->need_magic_ca_pass ? 25 : 6)))
+ 2*FORCE_FLUSH + (op->need_magic_ca_pass ? 2*19+6 : 6)))
return 0;
if (!kgem_check_reloc_and_exec(&sna->kgem, 2))
return 0;
@@ -660,9 +660,11 @@ inline static int gen4_get_rectangles(struct sna *sna,
if (rem <= 0) {
if (sna->render.vertex_offset) {
gen4_vertex_flush(sna);
- if (gen4_magic_ca_pass(sna, op))
- gen4_emit_pipelined_pointers(sna, op, op->op,
- op->u.gen4.wm_kernel);
+ if (gen4_magic_ca_pass(sna, op)) {
+ if (kgem_check_batch(&sna->kgem, 19+6))
+ gen4_emit_pipelined_pointers(sna, op, op->op,
+ op->u.gen4.wm_kernel);
+ }
}
OUT_BATCH(MI_FLUSH | MI_INHIBIT_RENDER_CACHE_FLUSH);
rem = MAX_FLUSH_VERTICES;
diff --git a/src/sna/gen5_render.c b/src/sna/gen5_render.c
index 9266f90..8ec2587 100644
--- a/src/sna/gen5_render.c
+++ b/src/sna/gen5_render.c
@@ -611,7 +611,7 @@ static int gen5_get_rectangles__flush(struct sna *sna,
return rem;
}
- if (!kgem_check_batch(&sna->kgem, op->need_magic_ca_pass ? 20 : 6))
+ if (!kgem_check_batch(&sna->kgem, op->need_magic_ca_pass ? 40 : 6))
return 0;
if (!kgem_check_reloc_and_exec(&sna->kgem, 2))
return 0;
commit 3b177a5e972a8eed63f99b0cd7b048a1229683f5
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Wed Nov 20 14:22:05 2013 +0000
sna/gen4: Reduce flushes between primitive continuations
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/sna/gen4_render.c b/src/sna/gen4_render.c
index 637137e..5e18fd0 100644
--- a/src/sna/gen4_render.c
+++ b/src/sna/gen4_render.c
@@ -1039,6 +1039,8 @@ gen4_emit_state(struct sna *sna,
assert(op->dst.bo->exec);
flush = wm_binding_table & 1;
+ wm_binding_table &= ~1;
+
if (kgem_bo_is_dirty(op->src.bo) || kgem_bo_is_dirty(op->mask.bo)) {
DBG(("%s: flushing dirty (%d, %d), forced? %d\n", __FUNCTION__,
kgem_bo_is_dirty(op->src.bo),
@@ -1053,7 +1055,7 @@ gen4_emit_state(struct sna *sna,
if (flush && op->op > PictOpSrc)
OUT_BATCH(MI_FLUSH | MI_INHIBIT_RENDER_CACHE_FLUSH);
- gen4_emit_binding_table(sna, wm_binding_table & ~1);
+ gen4_emit_binding_table(sna, wm_binding_table);
gen4_emit_pipelined_pointers(sna, op, op->op, op->u.gen4.wm_kernel);
gen4_emit_vertex_elements(sna, op);
}
@@ -1062,11 +1064,11 @@ static void
gen4_bind_surfaces(struct sna *sna,
const struct sna_composite_op *op)
{
- bool dirty = kgem_bo_is_dirty(op->dst.bo);
uint32_t *binding_table;
- uint16_t offset;
+ uint16_t offset, dirty;
gen4_get_batch(sna, op);
+ dirty = kgem_bo_is_dirty(op->dst.bo);
binding_table = gen4_composite_get_binding_table(sna, &offset);
@@ -1099,6 +1101,9 @@ gen4_bind_surfaces(struct sna *sna,
offset = sna->render_state.gen4.surface_table;
}
+ if (sna->kgem.batch[sna->render_state.gen4.surface_table] == binding_table[0])
+ dirty = 0;
+
gen4_emit_state(sna, op, offset | dirty);
}
@@ -1273,7 +1278,6 @@ static uint32_t gen4_bind_video_source(struct sna *sna,
static void gen4_video_bind_surfaces(struct sna *sna,
const struct sna_composite_op *op)
{
- bool dirty = kgem_bo_is_dirty(op->dst.bo);
struct sna_video_frame *frame = op->priv;
uint32_t src_surf_format;
uint32_t src_surf_base[6];
@@ -1281,7 +1285,7 @@ static void gen4_video_bind_surfaces(struct sna *sna,
int src_height[6];
int src_pitch[6];
uint32_t *binding_table;
- uint16_t offset;
+ uint16_t offset, dirty;
int n_src, n;
src_surf_base[0] = 0;
@@ -1316,6 +1320,7 @@ static void gen4_video_bind_surfaces(struct sna *sna,
}
gen4_get_batch(sna, op);
+ dirty = kgem_bo_is_dirty(op->dst.bo);
binding_table = gen4_composite_get_binding_table(sna, &offset);
binding_table[0] =
@@ -1334,6 +1339,9 @@ static void gen4_video_bind_surfaces(struct sna *sna,
src_surf_format);
}
+ if (sna->kgem.batch[sna->render_state.gen4.surface_table] == binding_table[0])
+ dirty = 0;
+
gen4_emit_state(sna, op, offset | dirty);
}
@@ -2252,11 +2260,11 @@ cleanup_dst:
static void
gen4_copy_bind_surfaces(struct sna *sna, const struct sna_composite_op *op)
{
- bool dirty = kgem_bo_is_dirty(op->dst.bo);
uint32_t *binding_table;
- uint16_t offset;
+ uint16_t offset, dirty;
gen4_get_batch(sna, op);
+ dirty = kgem_bo_is_dirty(op->dst.bo);
binding_table = gen4_composite_get_binding_table(sna, &offset);
@@ -2277,6 +2285,9 @@ gen4_copy_bind_surfaces(struct sna *sna, const struct sna_composite_op *op)
offset = sna->render_state.gen4.surface_table;
}
+ if (sna->kgem.batch[sna->render_state.gen4.surface_table] == binding_table[0])
+ dirty = 0;
+
gen4_emit_state(sna, op, offset | dirty);
}
@@ -2888,7 +2899,7 @@ static void gen4_render_reset(struct sna *sna)
sna->render_state.gen4.drawrect_offset = -1;
sna->render_state.gen4.drawrect_limit = -1;
- sna->render_state.gen4.surface_table = -1;
+ sna->render_state.gen4.surface_table = 0;
if (sna->render.vbo && !kgem_bo_can_map(&sna->kgem, sna->render.vbo)) {
DBG(("%s: discarding unmappable vbo\n", __FUNCTION__));
commit 4966f8374a068ca2a533e30594bfd333551ffd37
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Wed Nov 20 14:20:54 2013 +0000
sna: Remove spurious SAMPLER writemask for gen4
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/sna/brw/brw_eu_emit.c b/src/sna/brw/brw_eu_emit.c
index 5c0b306..81d1437 100644
--- a/src/sna/brw/brw_eu_emit.c
+++ b/src/sna/brw/brw_eu_emit.c
@@ -1802,7 +1802,7 @@ void brw_SAMPLE(struct brw_compile *p,
{
assert(writemask);
- if (p->gen < 050 || writemask != WRITEMASK_XYZW) {
+ if (writemask != WRITEMASK_XYZW) {
struct brw_reg m1 = brw_message_reg(msg_reg_nr);
writemask = ~writemask & WRITEMASK_XYZW;
More information about the xorg-commit
mailing list