OSDN Git Service

[I915] Handle tiled buffers in vblank tasklet
authorKeith Packard <keithp@keithp.com>
Sun, 20 Apr 2008 23:10:05 +0000 (16:10 -0700)
committerKeith Packard <keithp@keithp.com>
Sun, 20 Apr 2008 23:10:05 +0000 (16:10 -0700)
The vblank tasklet update code must build 2D blt commands with the
appropriate tiled flags.

shared-core/i915_drv.h
shared-core/i915_irq.c

index 78889ed..3fd416c 100644 (file)
@@ -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)
index 2aa0d45..785008d 100644 (file)
@@ -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();