xf86-video-intel: 2 commits - src/sna/sna_display.c src/sna/sna_trapezoids.c
Chris Wilson
ickle at kemper.freedesktop.org
Fri Mar 30 14:02:58 PDT 2012
src/sna/sna_display.c | 54 ++++++++++++++++++++++++++++++++---------------
src/sna/sna_trapezoids.c | 30 +++++++++++++-------------
2 files changed, 52 insertions(+), 32 deletions(-)
New commits:
commit 305734ebdf3d51c084cfbee8804b6c60b1f03a98
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Fri Mar 30 21:27:29 2012 +0100
sna: Separate out scanline waiting for gen4
So that we do not set a gen4 bit on gen2 and apply the old workaround of
trimming y2 instead.
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/sna/sna_display.c b/src/sna/sna_display.c
index ecfe670..f413ac1 100644
--- a/src/sna/sna_display.c
+++ b/src/sna/sna_display.c
@@ -2105,44 +2105,62 @@ static void sna_emit_wait_for_scanline_gen6(struct sna *sna,
kgem_advance_batch(&sna->kgem, 4);
}
-static void sna_emit_wait_for_scanline_gen2(struct sna *sna,
+static void sna_emit_wait_for_scanline_gen4(struct sna *sna,
int pipe, int y1, int y2,
bool full_height)
{
uint32_t event;
uint32_t *b;
- /*
- * Pre-965 doesn't have SVBLANK, so we need a bit
- * of extra time for the blitter to start up and
- * do its job for a full height blit
- */
if (pipe == 0) {
- pipe = MI_LOAD_SCAN_LINES_DISPLAY_PIPEA;
- event = MI_WAIT_FOR_PIPEA_SCAN_LINE_WINDOW;
if (full_height)
event = MI_WAIT_FOR_PIPEA_SVBLANK;
+ else
+ event = MI_WAIT_FOR_PIPEA_SCAN_LINE_WINDOW;
} else {
- pipe = MI_LOAD_SCAN_LINES_DISPLAY_PIPEB;
- event = MI_WAIT_FOR_PIPEB_SCAN_LINE_WINDOW;
if (full_height)
event = MI_WAIT_FOR_PIPEB_SVBLANK;
+ else
+ event = MI_WAIT_FOR_PIPEB_SCAN_LINE_WINDOW;
}
- if (sna->kgem.mode == KGEM_NONE)
- kgem_set_mode(&sna->kgem, KGEM_BLT);
-
+ kgem_set_mode(&sna->kgem, KGEM_BLT);
b = kgem_get_batch(&sna->kgem, 5);
/* The documentation says that the LOAD_SCAN_LINES command
* always comes in pairs. Don't ask me why. */
- b[0] = MI_LOAD_SCAN_LINES_INCL | pipe;
- b[1] = (y1 << 16) | (y2-1);
- b[2] = MI_LOAD_SCAN_LINES_INCL | pipe;
- b[3] = (y1 << 16) | (y2-1);
+ b[2] = b[0] = MI_LOAD_SCAN_LINES_INCL | pipe << 20;
+ b[3] = b[1] = (y1 << 16) | (y2-1);
b[4] = MI_WAIT_FOR_EVENT | event;
kgem_advance_batch(&sna->kgem, 5);
}
+static void sna_emit_wait_for_scanline_gen2(struct sna *sna,
+ int pipe, int y1, int y2,
+ bool full_height)
+{
+ uint32_t *b;
+
+ /*
+ * Pre-965 doesn't have SVBLANK, so we need a bit
+ * of extra time for the blitter to start up and
+ * do its job for a full height blit
+ */
+ if (full_height)
+ y2 -= 2;
+
+ kgem_set_mode(&sna->kgem, KGEM_BLT);
+ b = kgem_get_batch(&sna->kgem, 5);
+ /* The documentation says that the LOAD_SCAN_LINES command
+ * always comes in pairs. Don't ask me why. */
+ b[2] = b[0] = MI_LOAD_SCAN_LINES_INCL | pipe << 20;
+ b[3] = b[1] = (y1 << 16) | (y2-1);
+ if (pipe == 0)
+ b[4] = MI_WAIT_FOR_EVENT | MI_WAIT_FOR_PIPEA_SCAN_LINE_WINDOW;
+ else
+ b[4] = MI_WAIT_FOR_EVENT | MI_WAIT_FOR_PIPEB_SCAN_LINE_WINDOW;
+ kgem_advance_batch(&sna->kgem, 5);
+}
+
bool
sna_wait_for_scanline(struct sna *sna,
PixmapPtr pixmap,
@@ -2202,6 +2220,8 @@ sna_wait_for_scanline(struct sna *sna,
if (sna->kgem.gen >= 60)
sna_emit_wait_for_scanline_gen6(sna, pipe, y1, y2, full_height);
+ else if (sna->kgem.gen >= 40)
+ sna_emit_wait_for_scanline_gen4(sna, pipe, y1, y2, full_height);
else
sna_emit_wait_for_scanline_gen2(sna, pipe, y1, y2, full_height);
commit 6f2814db6f7b89e94e54b8d73c7e176ab7d1c469
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Fri Mar 30 20:45:55 2012 +0100
sna/traps: Align the pointer+index
It's the location of the pixels within the row that matter for
alignment!
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=47418
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
Tested-by: Magnus Kessler <Magnus.Kessler at gmx.net>
diff --git a/src/sna/sna_trapezoids.c b/src/sna/sna_trapezoids.c
index b6c5b65..2b4b2db 100644
--- a/src/sna/sna_trapezoids.c
+++ b/src/sna/sna_trapezoids.c
@@ -1490,42 +1490,42 @@ inplace_row(struct active_list *active, uint8_t *row, int width)
if (rix > ++lix) {
rix -= lix;
+ row += lix;
#if 0
if (rix == 1)
- row[lix] = 0xff;
+ *row = 0xff;
else
- memset(row+lix, 0xff, rix);
+ memset(row, 0xff, rix);
#else
if ((uintptr_t)row & 1 && rix) {
- row[lix] = 0xff;
- lix++;
+ *row++ = 0xff;
rix--;
}
if ((uintptr_t)row & 2 && rix >= 2) {
- *(uint16_t *)(row+lix) = 0xffff;
- lix += 2;
+ *(uint16_t *)row = 0xffff;
+ row += 2;
rix -= 2;
}
if ((uintptr_t)row & 4 && rix >= 4) {
- *(uint32_t *)(row+lix) = 0xffffffff;
- lix += 4;
+ *(uint32_t *)row = 0xffffffff;
+ row += 4;
rix -= 4;
}
while (rix >= 8) {
- *(uint64_t *)(row+lix) = 0xffffffffffffffff;
- lix += 8;
+ *(uint64_t *)row = 0xffffffffffffffff;
+ row += 8;
rix -= 8;
}
if (rix & 4) {
- *(uint32_t *)(row+lix) = 0xffffffff;
- lix += 4;
+ *(uint32_t *)row = 0xffffffff;
+ row += 4;
}
if (rix & 2) {
- *(uint16_t *)(row+lix) = 0xffff;
- lix += 2;
+ *(uint16_t *)row = 0xffff;
+ row += 2;
}
if (rix & 1)
- row[lix] = 0xff;
+ *row = 0xff;
#endif
}
}
More information about the xorg-commit
mailing list