[I915] Handle tiled buffers in vblank tasklet

The vblank tasklet update code must build 2D blt commands with the
appropriate tiled flags.
This commit is contained in:
Keith Packard 2008-04-20 16:10:05 -07:00
parent 21dbba5a22
commit f0e38f5217
2 changed files with 19 additions and 5 deletions

View 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_CMD ((2<<29)|(0x53<<22)|6)
#define XY_SRC_COPY_BLT_WRITE_ALPHA (1<<21) #define XY_SRC_COPY_BLT_WRITE_ALPHA (1<<21)
#define XY_SRC_COPY_BLT_WRITE_RGB (1<<20) #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 ((0x30<<23)|1)
#define MI_BATCH_BUFFER_START (0x31<<23) #define MI_BATCH_BUFFER_START (0x31<<23)

View 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_ALPHA |
XY_SRC_COPY_BLT_WRITE_RGB) XY_SRC_COPY_BLT_WRITE_RGB)
: XY_SRC_COPY_BLT_CMD; : XY_SRC_COPY_BLT_CMD;
u32 pitchropcpp = (sarea_priv->pitch * cpp) | (0xcc << 16) | u32 src_pitch = sarea_priv->pitch * cpp;
(cpp << 23) | (1 << 24); 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; 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[0] = drm_vblank_count(dev, 0);
counter[1] = drm_vblank_count(dev, 1); counter[1] = drm_vblank_count(dev, 1);
@ -326,12 +337,12 @@ static void i915_vblank_tasklet(struct drm_device *dev)
BEGIN_LP_RING(8); BEGIN_LP_RING(8);
OUT_RING(cmd); OUT_RING(cmd);
OUT_RING(pitchropcpp); OUT_RING(ropcpp | dst_pitch);
OUT_RING((y1 << 16) | rect->x1); OUT_RING((y1 << 16) | rect->x1);
OUT_RING((y2 << 16) | rect->x2); OUT_RING((y2 << 16) | rect->x2);
OUT_RING(offsets[front]); OUT_RING(offsets[front]);
OUT_RING((y1 << 16) | rect->x1); OUT_RING((y1 << 16) | rect->x1);
OUT_RING(pitchropcpp & 0xffff); OUT_RING(src_pitch);
OUT_RING(offsets[back]); OUT_RING(offsets[back]);
ADVANCE_LP_RING(); ADVANCE_LP_RING();