xf86-video-intel: 5 commits - src/sna/gen3_render.c src/sna/gen4_render.c src/sna/gen5_render.c src/sna/gen6_render.c src/sna/sna_accel.c src/sna/sna_blt.c src/sna/sna_display.c src/sna/sna_dri.c src/sna/sna_driver.c src/sna/sna_render.c src/sna/sna_render_inline.h
Chris Wilson
ickle at kemper.freedesktop.org
Fri Jun 24 05:47:30 PDT 2011
src/sna/gen3_render.c | 19 +++
src/sna/gen4_render.c | 20 +++-
src/sna/gen5_render.c | 14 ++
src/sna/gen6_render.c | 20 +++-
src/sna/sna_accel.c | 4
src/sna/sna_blt.c | 9 +
src/sna/sna_display.c | 32 +++++-
src/sna/sna_dri.c | 212 ++++++++++++++------------------------------
src/sna/sna_driver.c | 7 -
src/sna/sna_render.c | 8 +
src/sna/sna_render_inline.h | 17 +++
11 files changed, 194 insertions(+), 168 deletions(-)
New commits:
commit 471115a9806162bf0cafe27947f49d94fdd63d87
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Fri Jun 24 13:32:45 2011 +0100
sna: Also allow BLT copies to discard the alpha channel
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/sna/gen3_render.c b/src/sna/gen3_render.c
index 37eb6c2..92edc72 100644
--- a/src/sna/gen3_render.c
+++ b/src/sna/gen3_render.c
@@ -3254,7 +3254,7 @@ gen3_render_copy_boxes(struct sna *sna, uint8_t alu,
struct sna_composite_op tmp;
#if NO_COPY_BOXES
- if (src->drawable.depth != dst->drawable->depth)
+ if (!sna_blt_compare_depth(&src->drawable, &dst->drawable))
return FALSE;
return sna_blt_copy_boxes(sna, alu,
@@ -3267,7 +3267,7 @@ gen3_render_copy_boxes(struct sna *sna, uint8_t alu,
DBG(("%s (%d, %d)->(%d, %d) x %d\n",
__FUNCTION__, src_dx, src_dy, dst_dx, dst_dy, n));
- if (src->drawable.depth == dst->drawable.depth &&
+ if (sna_blt_compare_depth(&src->drawable, &dst->drawable) &&
sna_blt_copy_boxes(sna, alu,
src_bo, src_dx, src_dy,
dst_bo, dst_dx, dst_dy,
@@ -3283,7 +3283,7 @@ gen3_render_copy_boxes(struct sna *sna, uint8_t alu,
dst_bo->pitch > 8192 ||
dst->drawable.width > 2048 ||
dst->drawable.height > 2048) {
- if (src->drawable.depth != dst->drawable.depth)
+ if (!sna_blt_compare_depth(&src->drawable, &dst->drawable))
return FALSE;
return sna_blt_copy_boxes(sna, alu,
@@ -3399,7 +3399,7 @@ gen3_render_copy(struct sna *sna, uint8_t alu,
struct sna_copy_op *tmp)
{
#if NO_COPY
- if (src->drawable.depth != dst->drawable.depth)
+ if (!sna_blt_compare_depth(&src->drawable, &dst->drawable))
return FALSE;
return sna_blt_copy(sna, alu,
@@ -3410,7 +3410,7 @@ gen3_render_copy(struct sna *sna, uint8_t alu,
/* Prefer to use the BLT */
if (sna->kgem.mode == KGEM_BLT &&
- src->drawable.depth == dst->drawable.depth &&
+ sna_blt_compare_depth(&src->drawable, &dst->drawable) &&
sna_blt_copy(sna, alu,
src_bo, dst_bo,
dst->drawable.bitsPerPixel,
@@ -3422,7 +3422,7 @@ gen3_render_copy(struct sna *sna, uint8_t alu,
src->drawable.width > 2048 || src->drawable.height > 2048 ||
dst->drawable.width > 2048 || dst->drawable.height > 2048 ||
src_bo->pitch > 8192 || dst_bo->pitch > 8192) {
- if (src->drawable.depth != dst->drawable.depth)
+ if (!sna_blt_compare_depth(&src->drawable, &dst->drawable))
return FALSE;
return sna_blt_copy(sna, alu, src_bo, dst_bo,
diff --git a/src/sna/gen4_render.c b/src/sna/gen4_render.c
index bb84de7..1037deb 100644
--- a/src/sna/gen4_render.c
+++ b/src/sna/gen4_render.c
@@ -2150,7 +2150,7 @@ gen4_render_copy_boxes(struct sna *sna, uint8_t alu,
struct sna_composite_op tmp;
#if NO_COPY_BOXES
- if (src->drawable.depth != dst->drawable.depth)
+ if (!sna_blt_compare_depth(&src->drawable, &dst->drawable))
return FALSE;
return sna_blt_copy_boxes(sna, alu,
@@ -2161,7 +2161,7 @@ gen4_render_copy_boxes(struct sna *sna, uint8_t alu,
#endif
if (prefer_blt(sna) &&
- src->drawable.depth == dst->drawable.depth &&
+ sna_blt_compare_depth(&src->drawable, &dst->drawable) &&
sna_blt_copy_boxes(sna, alu,
src_bo, src_dx, src_dy,
dst_bo, dst_dx, dst_dy,
@@ -2172,7 +2172,7 @@ gen4_render_copy_boxes(struct sna *sna, uint8_t alu,
if (!(alu == GXcopy || alu == GXclear) || src_bo == dst_bo ||
src->drawable.width > 8192 || src->drawable.height > 8192 ||
dst->drawable.width > 8192 || dst->drawable.height > 8192) {
- if (src->drawable.depth != dst->drawable.depth)
+ if (!sna_blt_compare_depth(&src->drawable, &dst->drawable))
return FALSE;
return sna_blt_copy_boxes(sna, alu,
@@ -2257,7 +2257,7 @@ gen4_render_copy(struct sna *sna, uint8_t alu,
struct sna_copy_op *op)
{
#if NO_COPY
- if (src->drawable.depth != dst->drawable.depth)
+ if (!sna_blt_compare_depth(&src->drawable, &dst->drawable))
return FALSE;
return sna_blt_copy(sna, alu,
@@ -2267,7 +2267,7 @@ gen4_render_copy(struct sna *sna, uint8_t alu,
#endif
if (prefer_blt(sna) &&
- src->drawable.depth == dst->drawable.depth &&
+ sna_blt_compare_depth(&src->drawable, &dst->drawable) &&
sna_blt_copy(sna, alu,
src_bo, dst_bo,
dst->drawable.bitsPerPixel,
@@ -2277,7 +2277,7 @@ gen4_render_copy(struct sna *sna, uint8_t alu,
if (!(alu == GXcopy || alu == GXclear) || src_bo == dst_bo ||
src->drawable.width > 8192 || src->drawable.height > 8192 ||
dst->drawable.width > 8192 || dst->drawable.height > 8192) {
- if (src->drawable.depth != dst->drawable.depth)
+ if (!sna_blt_compare_depth(&src->drawable, &dst->drawable))
return FALSE;
return sna_blt_copy(sna, alu, src_bo, dst_bo,
diff --git a/src/sna/gen5_render.c b/src/sna/gen5_render.c
index 858a2f6..a029d18 100644
--- a/src/sna/gen5_render.c
+++ b/src/sna/gen5_render.c
@@ -2099,7 +2099,7 @@ gen5_render_copy_boxes(struct sna *sna, uint8_t alu,
struct sna_composite_op tmp;
if (sna->kgem.mode == KGEM_BLT &&
- src->drawable.depth == dst->drawable.depth &&
+ sna_blt_compare_depth(&src->drawable, &dst->drawable) &&
sna_blt_copy_boxes(sna, alu,
src_bo, src_dx, src_dy,
dst_bo, dst_dx, dst_dy,
@@ -2110,7 +2110,7 @@ gen5_render_copy_boxes(struct sna *sna, uint8_t alu,
if (!(alu == GXcopy || alu == GXclear) || src_bo == dst_bo ||
src->drawable.width > 8192 || src->drawable.height > 8192 ||
dst->drawable.width > 8192 || dst->drawable.height > 8192) {
- if (src->drawable.depth != dst->drawable.depth)
+ if (!sna_blt_compare_depth(&src->drawable, &dst->drawable))
return FALSE;
return sna_blt_copy_boxes(sna, alu,
@@ -2241,7 +2241,7 @@ gen5_render_copy(struct sna *sna, uint8_t alu,
DBG(("%s (alu=%d)\n", __FUNCTION__, alu));
if (sna->kgem.mode == KGEM_BLT &&
- src->drawable.depth == dst->drawable.depth &&
+ sna_blt_compare_depth(&src->drawable, &dst->drawable) &&
sna_blt_copy(sna, alu,
src_bo, dst_bo,
dst->drawable.bitsPerPixel,
@@ -2251,7 +2251,7 @@ gen5_render_copy(struct sna *sna, uint8_t alu,
if (!(alu == GXcopy || alu == GXclear) || src_bo == dst_bo ||
src->drawable.width > 8192 || src->drawable.height > 8192 ||
dst->drawable.width > 8192 || dst->drawable.height > 8192) {
- if (src->drawable.depth != dst->drawable.depth)
+ if (!sna_blt_compare_depth(&src->drawable, &dst->drawable))
return FALSE;
return sna_blt_copy(sna, alu, src_bo, dst_bo,
diff --git a/src/sna/gen6_render.c b/src/sna/gen6_render.c
index b6d9973..2f0879e 100644
--- a/src/sna/gen6_render.c
+++ b/src/sna/gen6_render.c
@@ -2289,7 +2289,7 @@ gen6_render_copy_boxes(struct sna *sna, uint8_t alu,
struct sna_composite_op tmp;
#if NO_COPY_BOXES
- if (src->drawable.depth != dst->drawable.depth)
+ if (!sna_blt_compare_depth(&src->drawable, &dst->drawable))
return FALSE;
return sna_blt_copy_boxes(sna, alu,
@@ -2304,7 +2304,7 @@ gen6_render_copy_boxes(struct sna *sna, uint8_t alu,
src_bo == dst_bo));
if (sna->kgem.mode == KGEM_BLT &&
- src->drawable.depth == dst->drawable.depth &&
+ sna_blt_compare_depth(&src->drawable, &dst->drawable) &&
sna_blt_copy_boxes(sna, alu,
src_bo, src_dx, src_dy,
dst_bo, dst_dx, dst_dy,
@@ -2315,7 +2315,7 @@ gen6_render_copy_boxes(struct sna *sna, uint8_t alu,
if (!(alu == GXcopy || alu == GXclear) || src_bo == dst_bo ||
src->drawable.width > 8192 || src->drawable.height > 8192 ||
dst->drawable.width > 8192 || dst->drawable.height > 8192) {
- if (src->drawable.depth != dst->drawable.depth)
+ if (!sna_blt_compare_depth(&src->drawable, &dst->drawable))
return FALSE;
return sna_blt_copy_boxes(sna, alu,
@@ -2444,7 +2444,7 @@ gen6_render_copy(struct sna *sna, uint8_t alu,
struct sna_copy_op *op)
{
#if NO_COPY
- if (src->drawable.depth != dst->drawable.depth)
+ if (!sna_blt_compare_depth(&src->drawable, &dst->drawable))
return FALSE;
return sna_blt_copy(sna, alu,
@@ -2459,7 +2459,7 @@ gen6_render_copy(struct sna *sna, uint8_t alu,
dst->drawable.width, dst->drawable.height));
if (sna->kgem.mode == KGEM_BLT &&
- src->drawable.depth == dst->drawable.depth &&
+ sna_blt_compare_depth(&src->drawable, &dst->drawable) &&
sna_blt_copy(sna, alu,
src_bo, dst_bo,
dst->drawable.bitsPerPixel,
@@ -2469,7 +2469,7 @@ gen6_render_copy(struct sna *sna, uint8_t alu,
if (!(alu == GXcopy || alu == GXclear) || src_bo == dst_bo ||
src->drawable.width > 8192 || src->drawable.height > 8192 ||
dst->drawable.width > 8192 || dst->drawable.height > 8192) {
- if (src->drawable.depth != dst->drawable.depth)
+ if (!sna_blt_compare_depth(&src->drawable, &dst->drawable))
return FALSE;
return sna_blt_copy(sna, alu, src_bo, dst_bo,
diff --git a/src/sna/sna_blt.c b/src/sna/sna_blt.c
index 38b9113..c8bf92f 100644
--- a/src/sna/sna_blt.c
+++ b/src/sna/sna_blt.c
@@ -34,6 +34,7 @@
#include "sna.h"
#include "sna_render.h"
+#include "sna_render_inline.h"
#include "sna_reg.h"
#include <mipict.h>
@@ -977,7 +978,7 @@ sna_blt_composite(struct sna *sna,
return FALSE;
}
- if (src->pDrawable->depth != dst->pDrawable->depth) {
+ if (!sna_blt_compare_depth(src->pDrawable, dst->pDrawable)) {
DBG(("%s: mismatching depth src=%d/%d, dst=%d/%d\n",
__FUNCTION__,
src->pDrawable->depth, src->pDrawable->bitsPerPixel,
diff --git a/src/sna/sna_render.c b/src/sna/sna_render.c
index 58e9f20..21afd26 100644
--- a/src/sna/sna_render.c
+++ b/src/sna/sna_render.c
@@ -27,6 +27,7 @@
#include "sna.h"
#include "sna_render.h"
+#include "sna_render_inline.h"
#include <fb.h>
@@ -51,7 +52,7 @@ sna_format_for_depth(int depth)
case 8: return PICT_a8;
case 15: return PICT_x1r5g5b5;
case 16: return PICT_r5g6b5;
- default:
+ default: assert(0);
case 24: return PICT_x8r8g8b8;
case 30: return PICT_x2r10g10b10;
case 32: return PICT_a8r8g8b8;
@@ -92,7 +93,7 @@ no_render_copy_boxes(struct sna *sna, uint8_t alu,
{
DBG(("%s (n=%d)\n", __FUNCTION__, n));
- if (src->drawable.depth != dst->drawable.depth)
+ if (!sna_blt_compare_depth(&src->drawable, &dst->drawable))
return FALSE;
return sna_blt_copy_boxes(sna, alu,
@@ -110,7 +111,7 @@ no_render_copy(struct sna *sna, uint8_t alu,
{
DBG(("%s ()\n", __FUNCTION__));
- if (src->drawable.depth == dst->drawable.depth &&
+ if (sna_blt_compare_depth(&src->drawable, &dst->drawable) &&
sna_blt_copy(sna, alu,
src_bo, dst_bo, dst->drawable.bitsPerPixel,
tmp))
diff --git a/src/sna/sna_render_inline.h b/src/sna/sna_render_inline.h
index 33d84d4..b09ad75 100644
--- a/src/sna/sna_render_inline.h
+++ b/src/sna/sna_render_inline.h
@@ -99,4 +99,21 @@ picture_is_gpu(PicturePtr picture)
return is_gpu(picture->pDrawable);
}
+static inline Bool sna_blt_compare_depth(DrawablePtr src, DrawablePtr dst)
+{
+ if (src->depth == dst->depth)
+ return TRUE;
+
+ /* Also allow for the alpha to be discarded on a copy */
+ if (src->bitsPerPixel != dst->bitsPerPixel)
+ return FALSE;
+
+ if (dst->depth == 24 && src->depth == 32)
+ return TRUE;
+
+ /* Note that a depth-16 pixmap is r5g6b5, not x1r5g5b5. */
+
+ return FALSE;
+}
+
#endif /* SNA_RENDER_INLINE_H */
commit c3b1a0d7046a83b6daec03e5a562116e3adf3c71
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Fri Jun 24 12:19:09 2011 +0100
sna/dri: Copy to real front upon swap
The front-buffer of a DRI2 drawable, may not in fact be pointing to the
scanout pixmap. So override the destination for swapbuffers to update
the scanout.
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/sna/sna_dri.c b/src/sna/sna_dri.c
index 9d6369e..3a8a753 100644
--- a/src/sna/sna_dri.c
+++ b/src/sna/sna_dri.c
@@ -374,134 +374,81 @@ static void damage(DrawablePtr drawable, PixmapPtr pixmap, RegionPtr region)
}
static void
-sna_dri_copy_region(DrawablePtr draw,
- RegionPtr region,
- DRI2BufferPtr dst_buffer,
- DRI2BufferPtr src_buffer)
+sna_dri_copy(struct sna *sna, DrawablePtr draw, RegionPtr region,
+ DRI2BufferPtr dst_buffer, DRI2BufferPtr src_buffer,
+ bool sync)
{
- struct sna *sna = to_sna_from_drawable(draw);
struct sna_dri_private *src_priv = src_buffer->driverPrivate;
struct sna_dri_private *dst_priv = dst_buffer->driverPrivate;
PixmapPtr src = src_priv->pixmap;
PixmapPtr dst = dst_priv->pixmap;
+ struct kgem_bo *dst_bo = dst_priv->bo;
pixman_region16_t clip;
+ bool flush = false;
+ BoxRec box, *boxes;
int16_t dx, dy;
+ int n;
- DBG(("%s(region=(%d, %d), (%d, %d)))\n", __FUNCTION__,
- REGION_EXTENTS(NULL, region)->x1,
- REGION_EXTENTS(NULL, region)->y1,
- REGION_EXTENTS(NULL, region)->x2,
- REGION_EXTENTS(NULL, region)->y2));
-
- DBG(("%s: draw (%d, %d)\n", __FUNCTION__, draw->x, draw->y));
- DBG(("%s: dst -- attachment=%d, name=%d, handle=%d [screen %d]\n",
+ DBG(("%s: dst -- attachment=%d, name=%d, handle=%d [screen=%d]\n",
__FUNCTION__,
dst_buffer->attachment,
dst_buffer->name,
dst_priv->bo->handle,
- sna_pixmap(sna->front)->gpu_bo->handle));
+ sna_pixmap_get_bo(sna->front)->handle));
DBG(("%s: src -- attachment=%d, name=%d, handle=%d\n",
__FUNCTION__,
src_buffer->attachment,
src_buffer->name,
src_priv->bo->handle));
- if (draw->type == DRAWABLE_WINDOW) {
+ if (draw->type == DRAWABLE_PIXMAP) {
+ if (region) {
+ boxes = REGION_RECTS(region);
+ n = REGION_NUM_RECTS(region);
+ if (n == 0)
+ return;
+ } else {
+ box.x1 = box.y1 = 0;
+ box.x2 = draw->width;
+ box.y2 = draw->height;
+
+ boxes = &box;
+ n = 1;
+ }
+ dx = dy = 0;
+ } else {
WindowPtr win = (WindowPtr)draw;
DBG(("%s: draw=(%d, %d), delta=(%d, %d)\n",
__FUNCTION__, draw->x, draw->y,
get_drawable_dx(draw), get_drawable_dy(draw)));
- pixman_region_translate(region, draw->x, draw->y);
-
- pixman_region_init(&clip);
- pixman_region_intersect(&clip, &win->clipList, region);
- if (!pixman_region_not_empty(&clip)) {
- DBG(("%s: all clipped\n", __FUNCTION__));
- return;
- }
- region = &clip;
-
- get_drawable_deltas(draw, dst, &dx, &dy);
-
- DBG(("%s clipped=(%d, %d), (%d, %d)x%d\n", __FUNCTION__,
- REGION_EXTENTS(NULL, region)->x1,
- REGION_EXTENTS(NULL, region)->y1,
- REGION_EXTENTS(NULL, region)->x2,
- REGION_EXTENTS(NULL, region)->y2,
- REGION_NUM_RECTS(region)));
+ if (region) {
+ pixman_region_translate(region, draw->x, draw->y);
+
+ pixman_region_init(&clip);
+ pixman_region_intersect(&clip, &win->clipList, region);
+ if (!pixman_region_not_empty(&clip)) {
+ DBG(("%s: all clipped\n", __FUNCTION__));
+ return;
+ }
+ region = &clip;
- if (dst_buffer->attachment == DRI2BufferFrontLeft) {
- assert(dst == sna->front);
- assert(dst_priv->bo == sna_pixmap(sna->front)->gpu_bo);
+ boxes = REGION_RECTS(region);
+ n = REGION_NUM_RECTS(region);
+ } else {
+ boxes = REGION_RECTS(&win->clipList);
+ n = REGION_NUM_RECTS(&win->clipList);
+ region = &win->clipList;
}
- } else {
- assert(draw->x == 0);
- assert(draw->y == 0);
- dx = dy = 0;
- }
-
- assert(sna_pixmap(src)->cpu_damage == NULL);
- assert(sna_pixmap(dst)->cpu_damage == NULL);
-
- /* It's important that this copy gets submitted before the
- * direct rendering client submits rendering for the next
- * frame, but we don't actually need to submit right now. The
- * client will wait for the DRI2CopyRegion reply or the swap
- * buffer event before rendering, and we'll hit the flush
- * callback chain before those messages are sent. We submit
- * our batch buffers from the flush callback chain so we know
- * that will happen before the client tries to render
- * again.
- */
- sna->render.copy_boxes(sna, GXcopy,
- src, src_priv->bo, -draw->x, -draw->y,
- dst, dst_priv->bo, dx, dy,
- REGION_RECTS(region),
- REGION_NUM_RECTS(region));
-
- damage(draw, dst, region);
- if (region == &clip)
- pixman_region_fini(&clip);
-}
-
-static void
-sna_dri_swap_blit(struct sna *sna, DrawablePtr draw, DRI2BufferPtr front, DRI2BufferPtr back)
-{
- struct sna_dri_private *src_priv = back->driverPrivate;
- struct sna_dri_private *dst_priv = front->driverPrivate;
- PixmapPtr src = src_priv->pixmap;
- PixmapPtr dst = dst_priv->pixmap;
- bool flush = false;
- BoxRec box, *boxes;
- int16_t dx, dy;
- int n;
-
- DBG(("%s: back -- attachment=%d, name=%d, handle=%d\n",
- __FUNCTION__,
- back->attachment,
- back->name,
- src_priv->bo->handle));
-
- if (draw->type == DRAWABLE_PIXMAP) {
- box.x1 = box.y1 = 0;
- box.x2 = draw->width;
- box.y2 = draw->height;
-
- boxes = &box;
- n = 1;
- dx = dy = 0;
- } else {
- WindowPtr win = (WindowPtr)draw;
-
- boxes = REGION_RECTS(&win->clipList);
- n = REGION_NUM_RECTS(&win->clipList);
if (n == 0)
return;
- flush = sna_wait_for_scanline(sna, sna->front,
- NULL, &win->clipList.extents);
+ if (sync)
+ flush = sna_wait_for_scanline(sna, sna->front, NULL,
+ ®ion->extents);
+ dst = sna->front;
+ dst_bo = sna_pixmap_get_bo(sna->front);
get_drawable_deltas(draw, dst, &dx, &dy);
}
@@ -517,14 +464,27 @@ sna_dri_swap_blit(struct sna *sna, DrawablePtr draw, DRI2BufferPtr front, DRI2Bu
*/
sna->render.copy_boxes(sna, GXcopy,
src, src_priv->bo, -draw->x, -draw->y,
- dst, dst_priv->bo, dx, dy,
+ dst, dst_bo, dx, dy,
boxes, n);
- damage(draw, dst, NULL);
+ damage(draw, dst, region);
DBG(("%s: flushing? %d\n", __FUNCTION__, flush));
if (flush) /* STAT! */
kgem_submit(&sna->kgem);
+
+ if (region == &clip)
+ pixman_region_fini(&clip);
+}
+
+static void
+sna_dri_copy_region(DrawablePtr draw,
+ RegionPtr region,
+ DRI2BufferPtr dst_buffer,
+ DRI2BufferPtr src_buffer)
+{
+ sna_dri_copy(to_sna_from_drawable(draw), draw,region,
+ dst_buffer, src_buffer, false);
}
#if DRI2INFOREC_VERSION >= 4
@@ -841,7 +801,7 @@ static void sna_dri_vblank_handle(int fd,
}
/* else fall through to exchange/blit */
case DRI2_SWAP:
- sna_dri_swap_blit(sna, draw, info->front, info->back);
+ sna_dri_copy(sna, draw, NULL, info->front, info->back, true);
case DRI2_SWAP_THROTTLE:
DRI2SwapComplete(info->client,
draw, frame,
@@ -1145,7 +1105,7 @@ immediate:
if (drmWaitVBlank(sna->kgem.fd, &vbl))
sna_dri_frame_event_info_free(info);
- sna_dri_swap_blit(sna, draw, front, back);
+ sna_dri_copy(sna, draw, NULL, front, back, true);
return TRUE;
}
@@ -1207,7 +1167,7 @@ immediate:
blit_fallback:
DBG(("%s -- blit\n", __FUNCTION__));
- sna_dri_swap_blit(sna, draw, front, back);
+ sna_dri_copy(sna, draw, NULL, front, back, true);
if (info)
sna_dri_frame_event_info_free(info);
DRI2SwapComplete(client, draw, 0, 0, 0, DRI2_BLIT_COMPLETE, func, data);
@@ -1233,41 +1193,7 @@ sna_dri_async_swap(ClientPtr client, DrawablePtr draw,
DBG(("%s()\n", __FUNCTION__));
if (!can_flip(sna, draw, front, back)) {
- BoxRec box, *boxes;
- int16_t dx, dy;
- int n;
-
- if (draw->type == DRAWABLE_PIXMAP) {
- box.x1 = box.y1 = 0;
- box.x2 = draw->width;
- box.y2 = draw->height;
-
- boxes = &box;
- n = 1;
- dx = dy = 0;
- } else {
- WindowPtr win = (WindowPtr)draw;
-
- assert(front_priv->pixmap == sna->front);
- boxes = REGION_RECTS(&win->clipList);
- n = REGION_NUM_RECTS(&win->clipList);
- get_drawable_deltas(draw, front_priv->pixmap, &dx, &dy);
- }
-
- DBG(("%s: fallback blit: %dx%d\n",
- __FUNCTION__, draw->width, draw->height));
-
- if (n) {
- sna->render.copy_boxes(sna, GXcopy,
- back_priv->pixmap,
- back_priv->bo,
- -draw->x, -draw->y,
- front_priv->pixmap,
- front_priv->bo,
- dx, dy,
- boxes, n);
- }
-
+ sna_dri_copy(sna, draw, NULL, front, back, false);
DRI2SwapComplete(client, draw, 0, 0, 0,
DRI2_BLIT_COMPLETE, func, data);
return;
commit 669378cd8db8af89d12f1b95a07fc1ead0b1569c
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Fri Jun 24 11:53:17 2011 +0100
sna: Wrap the fbcon in a scratch pixmap for render-copy across depth changes
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 21554f1..285a39b 100644
--- a/src/sna/sna_display.c
+++ b/src/sna/sna_display.c
@@ -506,6 +506,7 @@ void sna_copy_fbcon(struct sna *sna)
{
xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(sna->scrn);
drmModeFBPtr fbcon;
+ PixmapPtr scratch;
struct sna_pixmap *priv;
struct kgem_bo *bo;
BoxRec box;
@@ -533,7 +534,15 @@ void sna_copy_fbcon(struct sna *sna)
if (fbcon == NULL)
return;
- if (fbcon->depth != sna->front->drawable.depth)
+ /* Wrap the fbcon in a pixmap so that we select the right formats
+ * in the render copy in case we need to preserve the fbcon
+ * across a depth change upon starting X.
+ */
+ scratch = GetScratchPixmapHeader(sna->scrn->pScreen,
+ fbcon->width, fbcon->height,
+ fbcon->depth, fbcon->bpp,
+ 0, NULL);
+ if (scratch == NullPixmap)
goto cleanup_fbcon;
box.x1 = box.y1 = 0;
@@ -542,7 +551,7 @@ void sna_copy_fbcon(struct sna *sna)
bo = sna_create_bo_for_fbcon(sna, fbcon);
if (bo == NULL)
- goto cleanup_fbcon;
+ goto cleanup_scratch;
priv = sna_pixmap(sna->front);
assert(priv && priv->gpu_bo);
@@ -560,7 +569,7 @@ void sna_copy_fbcon(struct sna *sna)
dy = (sna->front->drawable.height - box.y2) / 2.;
ok = sna->render.copy_boxes(sna, GXcopy,
- sna->front, bo, sx, sy,
+ scratch, bo, sx, sy,
sna->front, priv->gpu_bo, dx, dy,
&box, 1);
sna_damage_add_box(&priv->gpu_damage, &box);
@@ -569,6 +578,8 @@ void sna_copy_fbcon(struct sna *sna)
sna->scrn->pScreen->canDoBGNoneRoot = ok;
+cleanup_scratch:
+ FreeScratchPixmapHeader(scratch);
cleanup_fbcon:
drmModeFreeFB(fbcon);
}
commit 33b2ea0392fe944b210ef744398aa22989bfdf33
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Fri Jun 24 11:43:07 2011 +0100
sna: Avoid using the BLT to copy between mismatching depths
We either conflated bpp (which fails given a mixture of depth-24 and
depth-30 pixmaps) or neglected to check at all.
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/sna/gen3_render.c b/src/sna/gen3_render.c
index 1252ba4..37eb6c2 100644
--- a/src/sna/gen3_render.c
+++ b/src/sna/gen3_render.c
@@ -3254,6 +3254,9 @@ gen3_render_copy_boxes(struct sna *sna, uint8_t alu,
struct sna_composite_op tmp;
#if NO_COPY_BOXES
+ if (src->drawable.depth != dst->drawable->depth)
+ return FALSE;
+
return sna_blt_copy_boxes(sna, alu,
src_bo, src_dx, src_dy,
dst_bo, dst_dx, dst_dy,
@@ -3264,7 +3267,8 @@ gen3_render_copy_boxes(struct sna *sna, uint8_t alu,
DBG(("%s (%d, %d)->(%d, %d) x %d\n",
__FUNCTION__, src_dx, src_dy, dst_dx, dst_dy, n));
- if (sna_blt_copy_boxes(sna, alu,
+ if (src->drawable.depth == dst->drawable.depth &&
+ sna_blt_copy_boxes(sna, alu,
src_bo, src_dx, src_dy,
dst_bo, dst_dx, dst_dy,
dst->drawable.bitsPerPixel,
@@ -3278,12 +3282,16 @@ gen3_render_copy_boxes(struct sna *sna, uint8_t alu,
src->drawable.height > 2048 ||
dst_bo->pitch > 8192 ||
dst->drawable.width > 2048 ||
- dst->drawable.height > 2048)
+ dst->drawable.height > 2048) {
+ if (src->drawable.depth != dst->drawable.depth)
+ return FALSE;
+
return sna_blt_copy_boxes(sna, alu,
src_bo, src_dx, src_dy,
dst_bo, dst_dx, dst_dy,
dst->drawable.bitsPerPixel,
box, n);
+ }
if (!kgem_check_bo(&sna->kgem, dst_bo))
kgem_submit(&sna->kgem);
@@ -3391,6 +3399,9 @@ gen3_render_copy(struct sna *sna, uint8_t alu,
struct sna_copy_op *tmp)
{
#if NO_COPY
+ if (src->drawable.depth != dst->drawable.depth)
+ return FALSE;
+
return sna_blt_copy(sna, alu,
src_bo, dst_bo,
dst->drawable.bitsPerPixel,
@@ -3399,7 +3410,7 @@ gen3_render_copy(struct sna *sna, uint8_t alu,
/* Prefer to use the BLT */
if (sna->kgem.mode == KGEM_BLT &&
- src->drawable.bitsPerPixel == dst->drawable.bitsPerPixel &&
+ src->drawable.depth == dst->drawable.depth &&
sna_blt_copy(sna, alu,
src_bo, dst_bo,
dst->drawable.bitsPerPixel,
@@ -3411,7 +3422,7 @@ gen3_render_copy(struct sna *sna, uint8_t alu,
src->drawable.width > 2048 || src->drawable.height > 2048 ||
dst->drawable.width > 2048 || dst->drawable.height > 2048 ||
src_bo->pitch > 8192 || dst_bo->pitch > 8192) {
- if (src->drawable.bitsPerPixel != dst->drawable.bitsPerPixel)
+ if (src->drawable.depth != dst->drawable.depth)
return FALSE;
return sna_blt_copy(sna, alu, src_bo, dst_bo,
diff --git a/src/sna/gen4_render.c b/src/sna/gen4_render.c
index 2a2ecab..bb84de7 100644
--- a/src/sna/gen4_render.c
+++ b/src/sna/gen4_render.c
@@ -2150,6 +2150,9 @@ gen4_render_copy_boxes(struct sna *sna, uint8_t alu,
struct sna_composite_op tmp;
#if NO_COPY_BOXES
+ if (src->drawable.depth != dst->drawable.depth)
+ return FALSE;
+
return sna_blt_copy_boxes(sna, alu,
src_bo, src_dx, src_dy,
dst_bo, dst_dx, dst_dy,
@@ -2158,6 +2161,7 @@ gen4_render_copy_boxes(struct sna *sna, uint8_t alu,
#endif
if (prefer_blt(sna) &&
+ src->drawable.depth == dst->drawable.depth &&
sna_blt_copy_boxes(sna, alu,
src_bo, src_dx, src_dy,
dst_bo, dst_dx, dst_dy,
@@ -2167,12 +2171,16 @@ gen4_render_copy_boxes(struct sna *sna, uint8_t alu,
if (!(alu == GXcopy || alu == GXclear) || src_bo == dst_bo ||
src->drawable.width > 8192 || src->drawable.height > 8192 ||
- dst->drawable.width > 8192 || dst->drawable.height > 8192)
+ dst->drawable.width > 8192 || dst->drawable.height > 8192) {
+ if (src->drawable.depth != dst->drawable.depth)
+ return FALSE;
+
return sna_blt_copy_boxes(sna, alu,
src_bo, src_dx, src_dy,
dst_bo, dst_dx, dst_dy,
dst->drawable.bitsPerPixel,
box, n);
+ }
DBG(("%s (%d, %d)->(%d, %d) x %d\n",
__FUNCTION__, src_dx, src_dy, dst_dx, dst_dy, n));
@@ -2249,6 +2257,9 @@ gen4_render_copy(struct sna *sna, uint8_t alu,
struct sna_copy_op *op)
{
#if NO_COPY
+ if (src->drawable.depth != dst->drawable.depth)
+ return FALSE;
+
return sna_blt_copy(sna, alu,
src_bo, dst_bo,
dst->drawable.bitsPerPixel,
@@ -2256,6 +2267,7 @@ gen4_render_copy(struct sna *sna, uint8_t alu,
#endif
if (prefer_blt(sna) &&
+ src->drawable.depth == dst->drawable.depth &&
sna_blt_copy(sna, alu,
src_bo, dst_bo,
dst->drawable.bitsPerPixel,
@@ -2264,10 +2276,14 @@ gen4_render_copy(struct sna *sna, uint8_t alu,
if (!(alu == GXcopy || alu == GXclear) || src_bo == dst_bo ||
src->drawable.width > 8192 || src->drawable.height > 8192 ||
- dst->drawable.width > 8192 || dst->drawable.height > 8192)
+ dst->drawable.width > 8192 || dst->drawable.height > 8192) {
+ if (src->drawable.depth != dst->drawable.depth)
+ return FALSE;
+
return sna_blt_copy(sna, alu, src_bo, dst_bo,
dst->drawable.bitsPerPixel,
op);
+ }
op->base.op = alu == GXcopy ? PictOpSrc : PictOpClear;
diff --git a/src/sna/gen5_render.c b/src/sna/gen5_render.c
index 77ad1bb..858a2f6 100644
--- a/src/sna/gen5_render.c
+++ b/src/sna/gen5_render.c
@@ -2099,6 +2099,7 @@ gen5_render_copy_boxes(struct sna *sna, uint8_t alu,
struct sna_composite_op tmp;
if (sna->kgem.mode == KGEM_BLT &&
+ src->drawable.depth == dst->drawable.depth &&
sna_blt_copy_boxes(sna, alu,
src_bo, src_dx, src_dy,
dst_bo, dst_dx, dst_dy,
@@ -2108,12 +2109,16 @@ gen5_render_copy_boxes(struct sna *sna, uint8_t alu,
if (!(alu == GXcopy || alu == GXclear) || src_bo == dst_bo ||
src->drawable.width > 8192 || src->drawable.height > 8192 ||
- dst->drawable.width > 8192 || dst->drawable.height > 8192)
+ dst->drawable.width > 8192 || dst->drawable.height > 8192) {
+ if (src->drawable.depth != dst->drawable.depth)
+ return FALSE;
+
return sna_blt_copy_boxes(sna, alu,
src_bo, src_dx, src_dy,
dst_bo, dst_dx, dst_dy,
dst->drawable.bitsPerPixel,
box, n);
+ }
DBG(("%s (%d, %d)->(%d, %d) x %d\n",
__FUNCTION__, src_dx, src_dy, dst_dx, dst_dy, n));
@@ -2236,6 +2241,7 @@ gen5_render_copy(struct sna *sna, uint8_t alu,
DBG(("%s (alu=%d)\n", __FUNCTION__, alu));
if (sna->kgem.mode == KGEM_BLT &&
+ src->drawable.depth == dst->drawable.depth &&
sna_blt_copy(sna, alu,
src_bo, dst_bo,
dst->drawable.bitsPerPixel,
@@ -2244,10 +2250,14 @@ gen5_render_copy(struct sna *sna, uint8_t alu,
if (!(alu == GXcopy || alu == GXclear) || src_bo == dst_bo ||
src->drawable.width > 8192 || src->drawable.height > 8192 ||
- dst->drawable.width > 8192 || dst->drawable.height > 8192)
+ dst->drawable.width > 8192 || dst->drawable.height > 8192) {
+ if (src->drawable.depth != dst->drawable.depth)
+ return FALSE;
+
return sna_blt_copy(sna, alu, src_bo, dst_bo,
dst->drawable.bitsPerPixel,
op);
+ }
op->base.op = alu == GXcopy ? PictOpSrc : PictOpClear;
diff --git a/src/sna/gen6_render.c b/src/sna/gen6_render.c
index 4f3e41a..b6d9973 100644
--- a/src/sna/gen6_render.c
+++ b/src/sna/gen6_render.c
@@ -2289,6 +2289,9 @@ gen6_render_copy_boxes(struct sna *sna, uint8_t alu,
struct sna_composite_op tmp;
#if NO_COPY_BOXES
+ if (src->drawable.depth != dst->drawable.depth)
+ return FALSE;
+
return sna_blt_copy_boxes(sna, alu,
src_bo, src_dx, src_dy,
dst_bo, dst_dx, dst_dy,
@@ -2301,6 +2304,7 @@ gen6_render_copy_boxes(struct sna *sna, uint8_t alu,
src_bo == dst_bo));
if (sna->kgem.mode == KGEM_BLT &&
+ src->drawable.depth == dst->drawable.depth &&
sna_blt_copy_boxes(sna, alu,
src_bo, src_dx, src_dy,
dst_bo, dst_dx, dst_dy,
@@ -2310,12 +2314,16 @@ gen6_render_copy_boxes(struct sna *sna, uint8_t alu,
if (!(alu == GXcopy || alu == GXclear) || src_bo == dst_bo ||
src->drawable.width > 8192 || src->drawable.height > 8192 ||
- dst->drawable.width > 8192 || dst->drawable.height > 8192)
+ dst->drawable.width > 8192 || dst->drawable.height > 8192) {
+ if (src->drawable.depth != dst->drawable.depth)
+ return FALSE;
+
return sna_blt_copy_boxes(sna, alu,
src_bo, src_dx, src_dy,
dst_bo, dst_dx, dst_dy,
dst->drawable.bitsPerPixel,
box, n);
+ }
tmp.op = alu == GXcopy ? PictOpSrc : PictOpClear;
tmp.dst.pixmap = dst;
@@ -2436,6 +2444,9 @@ gen6_render_copy(struct sna *sna, uint8_t alu,
struct sna_copy_op *op)
{
#if NO_COPY
+ if (src->drawable.depth != dst->drawable.depth)
+ return FALSE;
+
return sna_blt_copy(sna, alu,
src_bo, dst_bo,
dst->drawable.bitsPerPixel,
@@ -2448,6 +2459,7 @@ gen6_render_copy(struct sna *sna, uint8_t alu,
dst->drawable.width, dst->drawable.height));
if (sna->kgem.mode == KGEM_BLT &&
+ src->drawable.depth == dst->drawable.depth &&
sna_blt_copy(sna, alu,
src_bo, dst_bo,
dst->drawable.bitsPerPixel,
@@ -2456,10 +2468,14 @@ gen6_render_copy(struct sna *sna, uint8_t alu,
if (!(alu == GXcopy || alu == GXclear) || src_bo == dst_bo ||
src->drawable.width > 8192 || src->drawable.height > 8192 ||
- dst->drawable.width > 8192 || dst->drawable.height > 8192)
+ dst->drawable.width > 8192 || dst->drawable.height > 8192) {
+ if (src->drawable.depth != dst->drawable.depth)
+ return FALSE;
+
return sna_blt_copy(sna, alu, src_bo, dst_bo,
dst->drawable.bitsPerPixel,
op);
+ }
op->base.op = alu == GXcopy ? PictOpSrc : PictOpClear;
diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
index 0155ede..37f8fb0 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -1359,9 +1359,7 @@ sna_copy_area(DrawablePtr src, DrawablePtr dst, GCPtr gc,
DBG(("%s: src=(%d, %d)x(%d, %d) -> dst=(%d, %d)\n",
__FUNCTION__, src_x, src_y, width, height, dst_x, dst_y));
- if (sna->kgem.wedged ||
- src->bitsPerPixel != dst->bitsPerPixel ||
- !PM_IS_SOLID(dst, gc->planemask)) {
+ if (sna->kgem.wedged || !PM_IS_SOLID(dst, gc->planemask)) {
BoxRec box;
RegionRec region;
diff --git a/src/sna/sna_blt.c b/src/sna/sna_blt.c
index 35fdc12..38b9113 100644
--- a/src/sna/sna_blt.c
+++ b/src/sna/sna_blt.c
@@ -977,11 +977,11 @@ sna_blt_composite(struct sna *sna,
return FALSE;
}
- if (src->pDrawable->bitsPerPixel != dst->pDrawable->bitsPerPixel) {
- DBG(("%s: mismatching bpp src=%d, dst=%d\n",
+ if (src->pDrawable->depth != dst->pDrawable->depth) {
+ DBG(("%s: mismatching depth src=%d/%d, dst=%d/%d\n",
__FUNCTION__,
- src->pDrawable->bitsPerPixel,
- dst->pDrawable->bitsPerPixel));
+ src->pDrawable->depth, src->pDrawable->bitsPerPixel,
+ dst->pDrawable->depth, dst->pDrawable->bitsPerPixel));
return FALSE;
}
diff --git a/src/sna/sna_dri.c b/src/sna/sna_dri.c
index d4a3e3f..9d6369e 100644
--- a/src/sna/sna_dri.c
+++ b/src/sna/sna_dri.c
@@ -206,7 +206,7 @@ sna_dri_create_buffer(DrawablePtr drawable,
usage = 0;
if (drawable->width == sna->front->drawable.width &&
drawable->height == sna->front->drawable.height &&
- drawable->bitsPerPixel == sna->front->drawable.bitsPerPixel)
+ drawable->depth == sna->front->drawable.depth)
usage = SNA_CREATE_FB;
case DRI2BufferFakeFrontLeft:
@@ -777,10 +777,12 @@ can_flip(struct sna * sna,
return FALSE;
}
- if (front_pixmap->drawable.bitsPerPixel != back_pixmap->drawable.bitsPerPixel) {
- DBG(("%s -- no, depth mismatch: front bpp=%d, back=%d\n",
+ if (front_pixmap->drawable.depth != back_pixmap->drawable.depth) {
+ DBG(("%s -- no, depth mismatch: front bpp=%d/%d, back=%d/%d\n",
__FUNCTION__,
+ front_pixmap->drawable.depth,
front_pixmap->drawable.bitsPerPixel,
+ back_pixmap->drawable.depth,
back_pixmap->drawable.bitsPerPixel));
return FALSE;
}
diff --git a/src/sna/sna_render.c b/src/sna/sna_render.c
index b05689d..58e9f20 100644
--- a/src/sna/sna_render.c
+++ b/src/sna/sna_render.c
@@ -92,6 +92,9 @@ no_render_copy_boxes(struct sna *sna, uint8_t alu,
{
DBG(("%s (n=%d)\n", __FUNCTION__, n));
+ if (src->drawable.depth != dst->drawable.depth)
+ return FALSE;
+
return sna_blt_copy_boxes(sna, alu,
src_bo, src_dx, src_dy,
dst_bo, dst_dx, dst_dy,
@@ -107,7 +110,7 @@ no_render_copy(struct sna *sna, uint8_t alu,
{
DBG(("%s ()\n", __FUNCTION__));
- if (src->drawable.bitsPerPixel != dst->drawable.bitsPerPixel &&
+ if (src->drawable.depth == dst->drawable.depth &&
sna_blt_copy(sna, alu,
src_bo, dst_bo, dst->drawable.bitsPerPixel,
tmp))
commit 28f6dc24d3c50aa399dd098a9ba6a18a95837800
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Fri Jun 24 11:24:59 2011 +0100
sna: Support depth-30 and some more logging to show the depth
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 f92a1db..21554f1 100644
--- a/src/sna/sna_display.c
+++ b/src/sna/sna_display.c
@@ -427,11 +427,19 @@ sna_crtc_restore(struct sna *sna)
assert(bo->tiling != I915_TILING_Y);
+ DBG(("%s: create fb %dx%d@%d/%d\n",
+ __FUNCTION__,
+ sna->front->drawable.width,
+ sna->front->drawable.height,
+ sna->front->drawable.depth,
+ sna->front->drawable.bitsPerPixel));
+
sna_mode_remove_fb(sna);
if (drmModeAddFB(sna->kgem.fd,
sna->front->drawable.width,
sna->front->drawable.height,
- scrn->depth, scrn->bitsPerPixel,
+ sna->front->drawable.depth,
+ sna->front->drawable.bitsPerPixel,
bo->pitch, bo->handle,
&sna->mode.fb_id))
return;
@@ -590,6 +598,11 @@ sna_crtc_set_mode_major(xf86CrtcPtr crtc, DisplayModePtr mode,
if (!bo)
return FALSE;
+ DBG(("%s: create fb %dx%d@%d/%d\n",
+ __FUNCTION__,
+ scrn->virtualX, scrn->virtualY,
+ scrn->depth, scrn->bitsPerPixel));
+
assert(bo->tiling != I915_TILING_Y);
ret = drmModeAddFB(sna->kgem.fd,
scrn->virtualX, scrn->virtualY,
diff --git a/src/sna/sna_driver.c b/src/sna/sna_driver.c
index 4ae6b5f..0ef4dff 100644
--- a/src/sna/sna_driver.c
+++ b/src/sna/sna_driver.c
@@ -176,10 +176,10 @@ sna_load_palette(ScrnInfoPtr scrn, int numColors, int *indices,
*/
static Bool sna_create_screen_resources(ScreenPtr screen)
{
- ScrnInfoPtr scrn = xf86Screens[screen->myNum];
- struct sna *sna = to_sna(scrn);
+ struct sna *sna = to_sna_from_screen(screen);
- DBG(("%s\n", __FUNCTION__));
+ DBG(("%s(%dx%d@%d)\n", __FUNCTION__,
+ screen->width, screen->height, screen->rootDepth));
free(screen->devPrivate);
screen->devPrivate = NULL;
@@ -453,6 +453,7 @@ static Bool sna_pre_init(ScrnInfoPtr scrn, int flags)
case 15:
case 16:
case 24:
+ case 30:
break;
default:
xf86DrvMsg(scrn->scrnIndex, X_ERROR,
More information about the xorg-commit
mailing list