summaryrefslogtreecommitdiff
path: root/shared-core
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2008-04-20 16:10:05 -0700
committerKeith Packard <keithp@keithp.com>2008-04-20 16:10:05 -0700
commitf0e38f521790becbf9ca13ef5c579d12c6985d52 (patch)
tree7e104bd5771924ae2becdd3358546cf4b5ccf186 /shared-core
parent21dbba5a227e20dd64ce300cc78927e139a684dd (diff)
[I915] Handle tiled buffers in vblank tasklet
The vblank tasklet update code must build 2D blt commands with the appropriate tiled flags.
Diffstat (limited to 'shared-core')
-rw-r--r--shared-core/i915_drv.h3
-rw-r--r--shared-core/i915_irq.c21
2 files changed, 19 insertions, 5 deletions
diff --git a/shared-core/i915_drv.h b/shared-core/i915_drv.h
index 78889edb..3fd416c6 100644
--- a/shared-core/i915_drv.h
+++ b/shared-core/i915_drv.h
@@ -735,6 +735,9 @@ extern int i915_wait_ring(struct drm_device * dev, int n, const char *caller);
#define XY_SRC_COPY_BLT_CMD ((2<<29)|(0x53<<22)|6)
#define XY_SRC_COPY_BLT_WRITE_ALPHA (1<<21)
#define XY_SRC_COPY_BLT_WRITE_RGB (1<<20)
+#define XY_SRC_COPY_BLT_SRC_TILED (1<<15)
+#define XY_SRC_COPY_BLT_DST_TILED (1<<11)
+
#define MI_BATCH_BUFFER ((0x30<<23)|1)
#define MI_BATCH_BUFFER_START (0x31<<23)
diff --git a/shared-core/i915_irq.c b/shared-core/i915_irq.c
index 2aa0d455..785008d4 100644
--- a/shared-core/i915_irq.c
+++ b/shared-core/i915_irq.c
@@ -156,10 +156,21 @@ static void i915_vblank_tasklet(struct drm_device *dev)
XY_SRC_COPY_BLT_WRITE_ALPHA |
XY_SRC_COPY_BLT_WRITE_RGB)
: XY_SRC_COPY_BLT_CMD;
- u32 pitchropcpp = (sarea_priv->pitch * cpp) | (0xcc << 16) |
- (cpp << 23) | (1 << 24);
+ u32 src_pitch = sarea_priv->pitch * cpp;
+ u32 dst_pitch = sarea_priv->pitch * cpp;
+ /* COPY rop (0xcc), map cpp to magic color depth constants */
+ u32 ropcpp = (0xcc << 16) | ((cpp - 1) << 24);
RING_LOCALS;
-
+
+ if (sarea_priv->front_tiled) {
+ cmd |= XY_SRC_COPY_BLT_DST_TILED;
+ dst_pitch >>= 2;
+ }
+ if (sarea_priv->back_tiled) {
+ cmd |= XY_SRC_COPY_BLT_SRC_TILED;
+ src_pitch >>= 2;
+ }
+
counter[0] = drm_vblank_count(dev, 0);
counter[1] = drm_vblank_count(dev, 1);
@@ -326,12 +337,12 @@ static void i915_vblank_tasklet(struct drm_device *dev)
BEGIN_LP_RING(8);
OUT_RING(cmd);
- OUT_RING(pitchropcpp);
+ OUT_RING(ropcpp | dst_pitch);
OUT_RING((y1 << 16) | rect->x1);
OUT_RING((y2 << 16) | rect->x2);
OUT_RING(offsets[front]);
OUT_RING((y1 << 16) | rect->x1);
- OUT_RING(pitchropcpp & 0xffff);
+ OUT_RING(src_pitch);
OUT_RING(offsets[back]);
ADVANCE_LP_RING();