xf86-video-intel: 9 commits - configure.ac src/intel_module.c src/sna/kgem.c src/sna/Makefile.am src/sna/sna_accel.c src/sna/sna_blt.c src/sna/sna_display.c src/sna/sna_dri.c src/sna/sna.h src/sna/sna_render.h
Chris Wilson
ickle at kemper.freedesktop.org
Fri Jun 10 11:54:35 PDT 2011
configure.ac | 38 --------
src/intel_module.c | 60 -------------
src/sna/Makefile.am | 21 ----
src/sna/kgem.c | 14 +--
src/sna/sna.h | 6 -
src/sna/sna_accel.c | 3
src/sna/sna_blt.c | 15 +++
src/sna/sna_display.c | 71 +++++++++++-----
src/sna/sna_dri.c | 215 +++++++++++++++++++++++++-------------------------
src/sna/sna_render.h | 24 -----
10 files changed, 193 insertions(+), 274 deletions(-)
New commits:
commit d0d65940b4f4d4993eccb8c66ec7e8b633b331da
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Fri Jun 10 19:51:12 2011 +0100
sna: Remove the ability to disable chipset specific code
This was a fun little, but pointless, exercise.
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/configure.ac b/configure.ac
index 31106af..5f193b3 100644
--- a/configure.ac
+++ b/configure.ac
@@ -94,7 +94,7 @@ AC_ARG_ENABLE(kms-only, AS_HELP_STRING([--enable-kms-only],
AC_ARG_ENABLE(sna,
AS_HELP_STRING([--enable-sna],
- [Enable SandyBridge's New Acceleration (SNA) [options=default|gen2|gen3|ge4|gen5|gen6]]),
+ [Enable SandyBridge's New Acceleration (SNA) [default=no]]),
[SNA="$enableval"],
[SNA=no])
@@ -187,42 +187,8 @@ if test "x$VMAP" = xyes; then
fi
AM_CONDITIONAL(SNA, test x$SNA != xno)
-AM_CONDITIONAL(SNA_GEN2, [echo $SNA | grep -E -qsi '(yes)|(all)|(gen2)'])
-AM_CONDITIONAL(SNA_GEN3, [echo $SNA | grep -E -qsi '(yes)|(all)|(pnv)|(gen3)'])
-AM_CONDITIONAL(SNA_GEN4, [echo $SNA | grep -E -qsi '(yes)|(all)|(brw)|(gen4)'])
-AM_CONDITIONAL(SNA_GEN5, [echo $SNA | grep -E -qsi '(yes)|(all)|(ilk)|(gen5)'])
-AM_CONDITIONAL(SNA_GEN6, [echo $SNA | grep -E -qsi '(yes)|(all)|(snb)|(gen6)'])
AC_MSG_CHECKING([whether to include SNA support])
-sna_drivers="no"
-if test "x$SNA" != xno; then
- sna_drivers=""
- AC_DEFINE(SNA,1,[Enable SandyBridge's New Architecture])
- if echo $SNA | grep -E -qsi '(yes)|(default)'; then
- AC_DEFINE(SNA_DEFAULT,1,[Enable SandyBridge's New Architecture by default])
- sna_drivers="default $sna_drivers"
- fi
- if echo $SNA | grep -E -qsi '(yes)|(all)|(gen2)'; then
- AC_DEFINE(SNA_GEN2,1,[Enable SandyBridge's New Architecture for GEN2])
- sna_drivers="i8xx $sna_drivers"
- fi
- if echo $SNA | grep -E -qsi '(yes)|(all)|(pnv)|(gen3)'; then
- AC_DEFINE(SNA_GEN3,1,[Enable SandyBridge's New Architecture for PNV])
- sna_drivers="pnv $sna_drivers"
- fi
- if echo $SNA | grep -E -qsi '(yes)|(all)|(brw)|(gen4)'; then
- AC_DEFINE(SNA_GEN4,1,[Enable SandyBridge's New Architecture for BRW])
- sna_drivers="brw $sna_drivers"
- fi
- if echo $SNA | grep -E -qsi '(yes)|(all)|(ilk)|(gen5)'; then
- AC_DEFINE(SNA_GEN5,1,[Enable SandyBridge's New Architecture for ILK])
- sna_drivers="ilk $sna_drivers"
- fi
- if echo $SNA | grep -E -qsi '(yes)|(all)|(snb)|(gen6)'; then
- AC_DEFINE(SNA_GEN6,1,[Enable SandyBridge's New Architecture for SNB])
- sna_drivers="snb $sna_drivers"
- fi
-fi
-AC_MSG_RESULT([$sna_drivers])
+AC_MSG_RESULT([$SNA])
AM_CONDITIONAL(DEBUG, test x$DEBUG != xno)
if test "x$DEBUG" = xno; then
diff --git a/src/intel_module.c b/src/intel_module.c
index bec3d0f..63a63b8 100644
--- a/src/intel_module.c
+++ b/src/intel_module.c
@@ -334,40 +334,8 @@ static Bool intel_pci_probe(DriverPtr driver,
break;
#endif
-#if SNA
- case 0:
-#if SNA_GEN2
- case PCI_CHIP_I830_M:
- case PCI_CHIP_845_G:
- case PCI_CHIP_I854:
- case PCI_CHIP_I855_GM:
- case PCI_CHIP_I865_G:
-#endif
-#if SNA_GEN3
- case PCI_CHIP_PINEVIEW_M:
- case PCI_CHIP_PINEVIEW_G:
- case PCI_CHIP_G33_G:
- case PCI_CHIP_Q35_G:
- case PCI_CHIP_Q33_G:
-#endif
-#if SNA_GEN5
- case PCI_CHIP_IRONLAKE_D_G:
- case PCI_CHIP_IRONLAKE_M_G:
-#endif
-#if SNA_GEN6
- case PCI_CHIP_SANDYBRIDGE_GT1:
- case PCI_CHIP_SANDYBRIDGE_GT2:
- case PCI_CHIP_SANDYBRIDGE_GT2_PLUS:
- case PCI_CHIP_SANDYBRIDGE_M_GT1:
- case PCI_CHIP_SANDYBRIDGE_M_GT2:
- case PCI_CHIP_SANDYBRIDGE_M_GT2_PLUS:
- case PCI_CHIP_SANDYBRIDGE_S_GT:
-#endif
- sna_init_scrn(scrn, entity_num);
- break;
-#endif
default:
-#if SNA_DEFAULT
+#if SNA
sna_init_scrn(scrn, entity_num);
#else
intel_init_scrn(scrn);
@@ -407,32 +375,8 @@ intel_available_options(int chipid, int busid)
return lg_i810_available_options(chipid, busid);
#endif
-#if SNA
- case 0:
-#if SNA_GEN3
- case PCI_CHIP_PINEVIEW_M:
- case PCI_CHIP_PINEVIEW_G:
- case PCI_CHIP_G33_G:
- case PCI_CHIP_Q35_G:
- case PCI_CHIP_Q33_G:
-#endif
-#if SNA_GEN5
- case PCI_CHIP_IRONLAKE_D_G:
- case PCI_CHIP_IRONLAKE_M_G:
-#endif
-#if SNA_GEN6
- case PCI_CHIP_SANDYBRIDGE_GT1:
- case PCI_CHIP_SANDYBRIDGE_GT2:
- case PCI_CHIP_SANDYBRIDGE_GT2_PLUS:
- case PCI_CHIP_SANDYBRIDGE_M_GT1:
- case PCI_CHIP_SANDYBRIDGE_M_GT2:
- case PCI_CHIP_SANDYBRIDGE_M_GT2_PLUS:
- case PCI_CHIP_SANDYBRIDGE_S_GT:
-#endif
- return sna_available_options(chipid, busid);
-#endif
default:
-#if SNA_DEFAULT
+#if SNA
return sna_available_options(chipid, busid);
#else
return intel_uxa_available_options(chipid, busid);
diff --git a/src/sna/Makefile.am b/src/sna/Makefile.am
index f65b281..24df843 100644
--- a/src/sna/Makefile.am
+++ b/src/sna/Makefile.am
@@ -54,38 +54,17 @@ libsna_la_SOURCES = \
sna_video.h \
sna_video_overlay.c \
sna_video_textured.c \
- $(NULL)
-
-if SNA_GEN2
-libsna_la_SOURCES += \
gen2_render.c \
gen2_render.h \
- $(NULL)
-endif
-if SNA_GEN3
-libsna_la_SOURCES += \
gen3_render.c \
gen3_render.h \
- $(NULL)
-endif
-if SNA_GEN4
-libsna_la_SOURCES += \
gen4_render.c \
gen4_render.h \
- $(NULL)
-endif
-if SNA_GEN5
-libsna_la_SOURCES += \
gen5_render.c \
gen5_render.h \
- $(NULL)
-endif
-if SNA_GEN6
-libsna_la_SOURCES += \
gen6_render.c \
gen6_render.h \
$(NULL)
-endif
if DRI
libsna_la_SOURCES += \
diff --git a/src/sna/sna_render.h b/src/sna/sna_render.h
index 55ca549..c2d6f12 100644
--- a/src/sna/sna_render.h
+++ b/src/sna/sna_render.h
@@ -384,35 +384,11 @@ Bool sna_picture_is_solid(PicturePtr picture, uint32_t *color);
void no_render_init(struct sna *sna);
-#ifdef SNA_GEN2
Bool gen2_render_init(struct sna *sna);
-#else
-static inline Bool gen2_render_init(struct sna *sna) { return FALSE; }
-#endif
-
-#ifdef SNA_GEN3
Bool gen3_render_init(struct sna *sna);
-#else
-static inline Bool gen3_render_init(struct sna *sna) { return FALSE; }
-#endif
-
-#ifdef SNA_GEN4
Bool gen4_render_init(struct sna *sna);
-#else
-static inline Bool gen4_render_init(struct sna *sna) { return FALSE; }
-#endif
-
-#ifdef SNA_GEN5
Bool gen5_render_init(struct sna *sna);
-#else
-static inline Bool gen5_render_init(struct sna *sna) { return FALSE; }
-#endif
-
-#ifdef SNA_GEN6
Bool gen6_render_init(struct sna *sna);
-#else
-static inline Bool gen6_render_init(struct sna *sna) { return FALSE; }
-#endif
Bool sna_tiling_composite(struct sna *sna,
uint32_t op,
commit 6f035e80b98e478ff4c59427e50e57ecd710da62
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Fri Jun 10 18:41:56 2011 +0100
sna/dri: Keep reference on swap buffers until the end of the pageflip
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 3faa199..c90545e 100644
--- a/src/sna/sna_dri.c
+++ b/src/sna/sna_dri.c
@@ -81,7 +81,6 @@ struct sna_dri_private {
int refcnt;
PixmapPtr pixmap;
struct kgem_bo *bo;
- unsigned int attachment;
};
struct sna_dri_frame_event {
@@ -244,7 +243,6 @@ sna_dri_create_buffer(DrawablePtr drawable,
private->refcnt = 1;
private->pixmap = pixmap;
private->bo = bo;
- private->attachment = attachment;
if (buffer->name == 0) {
/* failed to name buffer */
@@ -262,22 +260,26 @@ err:
return NULL;
}
-static void sna_dri_destroy_buffer(DrawablePtr drawable, DRI2Buffer2Ptr buffer)
+static void _sna_dri_destroy_buffer(struct sna *sna, DRI2Buffer2Ptr buffer)
{
- if (buffer && buffer->driverPrivate) {
- struct sna_dri_private *private = buffer->driverPrivate;
- if (--private->refcnt == 0) {
- if (private->pixmap) {
- ScreenPtr screen = private->pixmap->drawable.pScreen;
- screen->DestroyPixmap(private->pixmap);
- } else {
- struct sna *sna = to_sna_from_drawable(drawable);
- kgem_bo_destroy(&sna->kgem, private->bo);
- }
+ struct sna_dri_private *private = buffer->driverPrivate;
- free(buffer);
- }
- } else
+ if (--private->refcnt == 0) {
+ if (private->pixmap) {
+ ScreenPtr screen = private->pixmap->drawable.pScreen;
+ screen->DestroyPixmap(private->pixmap);
+ } else
+ kgem_bo_destroy(&sna->kgem, private->bo);
+
+ free(buffer);
+ }
+}
+
+static void sna_dri_destroy_buffer(DrawablePtr drawable, DRI2Buffer2Ptr buffer)
+{
+ if (buffer && buffer->driverPrivate)
+ _sna_dri_destroy_buffer(to_sna_from_drawable(drawable), buffer);
+ else
free(buffer);
}
@@ -349,15 +351,15 @@ static void damage(DrawablePtr drawable, RegionPtr region)
static void
sna_dri_copy_region(DrawablePtr drawable, RegionPtr region,
- DRI2BufferPtr destBuffer, DRI2BufferPtr sourceBuffer)
+ DRI2BufferPtr dst_buffer, DRI2BufferPtr src_buffer)
{
struct sna *sna = to_sna_from_drawable(drawable);
- struct sna_dri_private *srcPrivate = sourceBuffer->driverPrivate;
- struct sna_dri_private *dstPrivate = destBuffer->driverPrivate;
+ struct sna_dri_private *srcPrivate = src_buffer->driverPrivate;
+ struct sna_dri_private *dstPrivate = dst_buffer->driverPrivate;
ScreenPtr screen = drawable->pScreen;
- DrawablePtr src = (srcPrivate->attachment == DRI2BufferFrontLeft)
+ DrawablePtr src = (src_buffer->attachment == DRI2BufferFrontLeft)
? drawable : &srcPrivate->pixmap->drawable;
- DrawablePtr dst = (dstPrivate->attachment == DRI2BufferFrontLeft)
+ DrawablePtr dst = (dst_buffer->attachment == DRI2BufferFrontLeft)
? drawable : &dstPrivate->pixmap->drawable;
GCPtr gc;
bool flush = false;
@@ -368,6 +370,17 @@ sna_dri_copy_region(DrawablePtr drawable, RegionPtr region,
region ? REGION_EXTENTS(NULL, region)->x2 : dst->width,
region ? REGION_EXTENTS(NULL, region)->y2 : dst->height));
+ DBG(("%s: dst -- attachment=%d, name=%d, handle=%d\n",
+ __FUNCTION__,
+ dst_buffer->attachment,
+ dst_buffer->name,
+ dstPrivate->bo->handle));
+ DBG(("%s: src -- attachment=%d, name=%d, handle=%d\n",
+ __FUNCTION__,
+ src_buffer->attachment,
+ src_buffer->name,
+ srcPrivate->bo->handle));
+
gc = GetScratchGC(dst->depth, screen);
if (!gc)
return;
@@ -520,31 +533,39 @@ sna_dri_add_frame_event(struct sna_dri_frame_event *frame_event)
}
static void
-sna_dri_del_frame_event(struct sna_dri_frame_event *frame_event)
+sna_dri_frame_event_info(struct sna_dri_frame_event *info)
{
- if (frame_event->client_id)
- FreeResourceByType(frame_event->client_id,
+ if (info->client_id)
+ FreeResourceByType(info->client_id,
frame_event_client_type,
TRUE);
- if (frame_event->drawable_id)
- FreeResourceByType(frame_event->drawable_id,
+ if (info->drawable_id)
+ FreeResourceByType(info->drawable_id,
frame_event_drawable_type,
TRUE);
+
+ if (info->front)
+ _sna_dri_destroy_buffer(info->sna, info->front);
+ if (info->back)
+ _sna_dri_destroy_buffer(info->sna, info->back);
+ free(info);
}
static void
sna_dri_exchange_buffers(DrawablePtr draw,
- DRI2BufferPtr front, DRI2BufferPtr back)
+ DRI2BufferPtr front,
+ DRI2BufferPtr back)
{
int tmp;
DBG(("%s()\n", __FUNCTION__));
- /* Swap BO names so DRI works */
- tmp = front->name;
- front->name = back->name;
- back->name = tmp;
+ assert(front->format == back->format);
+
+ tmp = front->attachment;
+ front->attachment = back->attachment;
+ back->attachment = tmp;
}
/*
@@ -553,53 +574,29 @@ sna_dri_exchange_buffers(DrawablePtr draw,
*/
static Bool
sna_dri_schedule_flip(struct sna *sna,
- ClientPtr client, DrawablePtr draw, DRI2BufferPtr front,
- DRI2BufferPtr back, DRI2SwapEventPtr func, void *data,
- unsigned int target_msc)
+ DrawablePtr draw,
+ struct sna_dri_frame_event *info)
{
struct sna_dri *dri = &sna->dri;
struct sna_dri_private *back_priv;
- struct sna_dri_frame_event *info;
/* Main crtc for this drawable shall finally deliver pageflip event. */
int ref_crtc_hw_id = sna_dri_get_pipe(draw);
DBG(("%s()\n", __FUNCTION__));
- info = calloc(1, sizeof(struct sna_dri_frame_event));
- if (!info)
- return FALSE;
-
- info->sna = sna;
- info->drawable_id = draw->id;
- info->client = client;
- info->type = DRI2_SWAP;
- info->event_complete = func;
- info->event_data = data;
- info->frame = target_msc;
-
- if (!sna_dri_add_frame_event(info)) {
- free(info);
- return FALSE;
- }
-
dri->fe_frame = 0;
dri->fe_tv_sec = 0;
dri->fe_tv_usec = 0;
/* Page flip the full screen buffer */
- back_priv = back->driverPrivate;
+ back_priv = info->back->driverPrivate;
info->count = sna_do_pageflip(sna,
back_priv->pixmap,
info, ref_crtc_hw_id,
&info->old_front,
&info->old_fb);
- if (info->count)
- return TRUE;
-
- sna_dri_del_frame_event(info);
- free(info);
- return FALSE;
+ return info->count != 0;
}
static Bool
@@ -662,7 +659,6 @@ can_flip(struct sna * sna,
DRI2BufferPtr front,
DRI2BufferPtr back)
{
- struct sna_dri_private *front_priv = front->driverPrivate;
struct sna_dri_private *back_priv = back->driverPrivate;
struct sna_pixmap *front_sna, *back_sna;
WindowPtr win = (WindowPtr)draw;
@@ -673,10 +669,16 @@ can_flip(struct sna * sna,
assert(draw->type == DRAWABLE_WINDOW);
- if (front_priv->attachment != DRI2BufferFrontLeft) {
+ if (front->format != back->format) {
+ DBG(("%s: no, format mismatch, front = %d, back = %d\n",
+ __FUNCTION__, front->format, back->format));
+ return FALSE;
+ }
+
+ if (front->attachment != DRI2BufferFrontLeft) {
DBG(("%s: no, front attachment [%d] is not FrontLeft [%d]\n",
__FUNCTION__,
- front_priv->attachment,
+ front->attachment,
DRI2BufferFrontLeft));
return FALSE;
}
@@ -772,7 +774,7 @@ static void sna_dri_vblank_handle(int fd,
void *data)
{
struct sna_dri_frame_event *swap_info = data;
- DrawablePtr drawable;
+ DrawablePtr draw;
ScreenPtr screen;
ScrnInfoPtr scrn;
struct sna *sna;
@@ -783,53 +785,46 @@ static void sna_dri_vblank_handle(int fd,
status = BadDrawable;
if (swap_info->drawable_id)
- status = dixLookupDrawable(&drawable,
+ status = dixLookupDrawable(&draw,
swap_info->drawable_id,
serverClient,
M_ANY, DixWriteAccess);
if (status != Success)
goto done;
- screen = drawable->pScreen;
+ screen = draw->pScreen;
scrn = xf86Screens[screen->myNum];
sna = to_sna(scrn);
switch (swap_info->type) {
case DRI2_FLIP:
/* If we can still flip... */
- if (can_flip(sna, drawable,
+ if (can_flip(sna, draw,
swap_info->front, swap_info->back) &&
- sna_dri_schedule_flip(sna,
- swap_info->client,
- drawable,
- swap_info->front,
- swap_info->back,
- swap_info->event_complete,
- swap_info->event_data,
- swap_info->frame)) {
- sna_dri_exchange_buffers(drawable,
- swap_info->front,
- swap_info->back);
- break;
+ sna_dri_schedule_flip(sna, draw, swap_info)) {
+ sna_dri_exchange_buffers(draw,
+ swap_info->front,
+ swap_info->back);
+ return;
}
/* else fall through to exchange/blit */
case DRI2_SWAP: {
int swap_type;
- if (DRI2CanExchange(drawable) &&
+ if (DRI2CanExchange(draw) &&
can_exchange(swap_info->front, swap_info->back)) {
- sna_dri_exchange_buffers(drawable,
- swap_info->front,
- swap_info->back);
+ sna_dri_exchange_buffers(draw,
+ swap_info->front,
+ swap_info->back);
swap_type = DRI2_EXCHANGE_COMPLETE;
} else {
- sna_dri_copy_region(drawable, NULL,
- swap_info->front,
- swap_info->back);
+ sna_dri_copy_region(draw, NULL,
+ swap_info->front,
+ swap_info->back);
swap_type = DRI2_BLIT_COMPLETE;
}
DRI2SwapComplete(swap_info->client,
- drawable, frame,
+ draw, frame,
tv_sec, tv_usec,
swap_type,
swap_info->client ? swap_info->event_complete : NULL,
@@ -838,7 +833,7 @@ static void sna_dri_vblank_handle(int fd,
}
case DRI2_WAITMSC:
if (swap_info->client)
- DRI2WaitMSCComplete(swap_info->client, drawable,
+ DRI2WaitMSCComplete(swap_info->client, draw,
frame, tv_sec, tv_usec);
break;
default:
@@ -849,13 +844,11 @@ static void sna_dri_vblank_handle(int fd,
}
done:
- sna_dri_del_frame_event(swap_info);
- sna_dri_destroy_buffer(drawable, swap_info->front);
- sna_dri_destroy_buffer(drawable, swap_info->back);
- free(swap_info);
+ sna_dri_frame_event_info(swap_info);
}
-static void sna_dri_flip_event(struct sna *sna, struct sna_dri_frame_event *flip)
+static void sna_dri_flip_event(struct sna *sna,
+ struct sna_dri_frame_event *flip)
{
DrawablePtr drawable;
int status;
@@ -879,7 +872,7 @@ static void sna_dri_flip_event(struct sna *sna, struct sna_dri_frame_event *flip
/* We assume our flips arrive in order, so we don't check the frame */
switch (flip->type) {
- case DRI2_SWAP:
+ case DRI2_FLIP:
/* Deliver cached msc, ust from reference crtc */
/* Check for too small vblank count of pageflip completion, taking wraparound
* into account. This usually means some defective kms pageflip completion,
@@ -903,12 +896,13 @@ static void sna_dri_flip_event(struct sna *sna, struct sna_dri_frame_event *flip
sna->dri.fe_frame = sna->dri.fe_tv_sec = sna->dri.fe_tv_usec = 0;
}
- DBG(("%s: swap complete\n", __FUNCTION__));
+ DBG(("%s: flip complete\n", __FUNCTION__));
DRI2SwapComplete(flip->client, drawable,
sna->dri.fe_frame,
sna->dri.fe_tv_sec,
sna->dri.fe_tv_usec,
- DRI2_FLIP_COMPLETE, flip->client ? flip->event_complete : NULL,
+ DRI2_FLIP_COMPLETE,
+ flip->client ? flip->event_complete : NULL,
flip->event_data);
break;
@@ -949,8 +943,7 @@ sna_dri_page_flip_handler(int fd, unsigned int frame, unsigned int tv_sec,
sna_dri_flip_event(info->sna, info);
sna_mode_delete_fb(info->sna, info->old_front, info->old_fb);
- sna_dri_del_frame_event(info);
- free(info);
+ sna_dri_frame_event_info(info);
}
/*
@@ -1003,6 +996,7 @@ sna_dri_schedule_swap(ClientPtr client, DrawablePtr draw, DRI2BufferPtr front,
if (!swap_info)
goto blit_fallback;
+ swap_info->sna = sna;
swap_info->drawable_id = draw->id;
swap_info->client = client;
swap_info->event_complete = func;
@@ -1141,12 +1135,8 @@ blit_fallback:
sna_dri_copy_region(draw, NULL, front, back);
DRI2SwapComplete(client, draw, 0, 0, 0, DRI2_BLIT_COMPLETE, func, data);
- if (swap_info) {
- sna_dri_del_frame_event(swap_info);
- sna_dri_destroy_buffer(draw, swap_info->front);
- sna_dri_destroy_buffer(draw, swap_info->back);
- free(swap_info);
- }
+ if (swap_info)
+ sna_dri_frame_event_info(swap_info);
*target_msc = 0; /* offscreen, so zero out target vblank count */
return TRUE;
}
@@ -1367,6 +1357,7 @@ sna_dri_schedule_wait_msc(ClientPtr client, DrawablePtr draw, CARD64 target_msc,
if (!wait_info)
goto out_complete;
+ wait_info->sna = sna;
wait_info->drawable_id = draw->id;
wait_info->client = client;
wait_info->type = DRI2_WAITMSC;
commit cf6c7901825bb831443615ef21555c5843184bdb
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Fri Jun 10 17:49:13 2011 +0100
sna: Use the ScreenPixmap->serialNumber as a generation count
DRI2 presumes that the pixmap->serialNumber can be used as unique id.
If it changes revokes *all* the buffers, it presumes a new pixmap has
been attached to the window, for example after a reconfiguration event
(resizing of a window, or a mode switch). However, as we updated the
root pixmap upon a pageflip, we were triggering revocations everytime,
causing further revocations and massive aperture thrashing.
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 b21ce39..6131be1 100644
--- a/src/sna/sna_display.c
+++ b/src/sna/sna_display.c
@@ -1575,10 +1575,19 @@ sna_do_pageflip(struct sna *sna,
*/
count = do_page_flip(sna, data, ref_crtc_hw_id);
if (count > 0) {
+ int id = sna->front->drawable.serialNumber;
+
sna->front = pixmap;
pixmap->refcnt++;
+
sna_redirect_screen_pixmap(scrn, *old_front, sna->front);
scrn->displayWidth = bo->pitch / sna->mode.cpp;
+
+ /* DRI2 uses the serialNumber as a means for detecting
+ * when to revoke its buffers after a reconfigureatin event.
+ * For the ScreenPixmap this means set_size.
+ */
+ pixmap->drawable.serialNumber = id;
} else {
drmModeRmFB(sna->kgem.fd, mode->fb_id);
mode->fb_id = *old_fb;
commit 3f19270d6795738b58d9ce1721896b3067b38c9f
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Fri Jun 10 15:29:57 2011 +0100
sna/dri: Actually restrict pageflipping to properly aligned fs windows
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 ad28202..3faa199 100644
--- a/src/sna/sna_dri.c
+++ b/src/sna/sna_dri.c
@@ -707,7 +707,12 @@ can_flip(struct sna * sna,
return FALSE;
}
- if (draw->width != front_pixmap->drawable.width ||
+ if (draw->x != 0 || draw->y != 0 ||
+#ifdef COMPOSITE
+ draw->x != front_pixmap->screen_x ||
+ draw->y != front_pixmap->screen_y ||
+#endif
+ draw->width != front_pixmap->drawable.width ||
draw->height != front_pixmap->drawable.height) {
DBG(("%s: no, window is not full size (%dx%d)!=(%dx%d)\n",
__FUNCTION__,
commit 9e9c628708ae838e5df3df89331243f84b297e8e
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Fri Jun 10 15:17:18 2011 +0100
sna/dri: Create pixmap suitable for the framebuffer for fullscreen buffers
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/sna/kgem.c b/src/sna/kgem.c
index 436b69b..d600936 100644
--- a/src/sna/kgem.c
+++ b/src/sna/kgem.c
@@ -1141,6 +1141,9 @@ int kgem_choose_tiling(struct kgem *kgem, int tiling, int width, int height, int
}
}
+ if (tiling < 0)
+ return tiling;
+
if (tiling == I915_TILING_Y && height < 16) {
DBG(("%s: too short [%d] for TILING_Y\n",
__FUNCTION__,height));
diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
index 6492749..d84d703 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -127,6 +127,9 @@ static uint32_t sna_pixmap_choose_tiling(PixmapPtr pixmap)
if ((sna->tiling && (1 << bit)) == 0)
tiling = I915_TILING_NONE;
+ if (pixmap->usage_hint == SNA_CREATE_FB)
+ tiling = -tiling;
+
/* Also adjust tiling if it is not supported or likely to
* slow us down,
*/
diff --git a/src/sna/sna_dri.c b/src/sna/sna_dri.c
index 9abc66d..ad28202 100644
--- a/src/sna/sna_dri.c
+++ b/src/sna/sna_dri.c
@@ -135,8 +135,9 @@ static struct kgem_bo *sna_pixmap_set_dri(struct sna *sna,
}
static DRI2Buffer2Ptr
-sna_dri_create_buffer(DrawablePtr drawable, unsigned int attachment,
- unsigned int format)
+sna_dri_create_buffer(DrawablePtr drawable,
+ unsigned int attachment,
+ unsigned int format)
{
ScreenPtr screen = drawable->pScreen;
ScrnInfoPtr scrn = xf86Screens[screen->myNum];
@@ -172,7 +173,13 @@ sna_dri_create_buffer(DrawablePtr drawable, unsigned int attachment,
case DRI2BufferBackLeft:
case DRI2BufferBackRight:
case DRI2BufferFrontRight:
+ /* Allocate a normal window, perhaps flippable */
usage = 0;
+ if (drawable->width == sna->front->drawable.width &&
+ drawable->height == sna->front->drawable.height &&
+ drawable->bitsPerPixel == sna->front->drawable.bitsPerPixel)
+ usage = SNA_CREATE_FB;
+
case DRI2BufferFakeFrontLeft:
case DRI2BufferFakeFrontRight:
pixmap = screen->CreatePixmap(screen,
commit b22de0b01453884d5018e7e0faef439421fa63a0
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Fri Jun 10 13:30:54 2011 +0100
sna/blt: Suppress overwriting boxes through fill_boxes()
As the introduction of the unrolled fill_boxes() was bypassing the
effective optimisation in fill_one().
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/sna/sna_blt.c b/src/sna/sna_blt.c
index d82f417..3d350b1 100644
--- a/src/sna/sna_blt.c
+++ b/src/sna/sna_blt.c
@@ -1178,6 +1178,21 @@ Bool sna_blt_fill_boxes(struct sna *sna, uint8_t alu,
case 8: break;
}
+ /* All too frequently one blt completely overwrites the previous */
+ if (kgem->nbatch >= 6 &&
+ (alu == GXcopy || alu == GXclear) &&
+ kgem->batch[kgem->nbatch-6] == cmd &&
+ kgem->batch[kgem->nbatch-4] == (box[0].y1 << 16 | box[0].x1) &&
+ kgem->batch[kgem->nbatch-3] == (box[0].y2 << 16 | box[0].x2) &&
+ kgem->reloc[kgem->nreloc-1].target_handle == bo->handle) {
+ DBG(("%s: replacing last fill\n", __FUNCTION__));
+ kgem->batch[kgem->nbatch-5] = br13;
+ kgem->batch[kgem->nbatch-1] = color;
+ if (--nbox == 0)
+ return TRUE;
+ box++;
+ }
+
kgem_set_mode(kgem, KGEM_BLT);
if (!kgem_check_batch(kgem, 6) ||
!kgem_check_bo_fenced(kgem, bo, NULL) ||
commit ebeebc2044610e6e31d9cef746c768d2e435f32c
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Fri Jun 10 13:07:13 2011 +0100
sna: Use temporary for storing the current crtc box when computing best crtc
... as the caller may be reusing an input parameter for the result.
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/sna/sna.h b/src/sna/sna.h
index 08de443..844705d 100644
--- a/src/sna/sna.h
+++ b/src/sna/sna.h
@@ -309,8 +309,10 @@ to_sna_from_drawable(DrawablePtr drawable)
#define ALIGN(i,m) (((i) + (m) - 1) & ~((m) - 1))
#define MIN(a,b) ((a) < (b) ? (a) : (b))
-extern xf86CrtcPtr sna_covering_crtc(ScrnInfoPtr scrn, BoxPtr box,
- xf86CrtcPtr desired, BoxPtr crtc_box_ret);
+extern xf86CrtcPtr sna_covering_crtc(ScrnInfoPtr scrn,
+ const BoxRec *box,
+ xf86CrtcPtr desired,
+ BoxPtr crtc_box_ret);
extern bool sna_wait_for_scanline(struct sna *sna, PixmapPtr pixmap,
xf86CrtcPtr crtc, RegionPtr clip);
diff --git a/src/sna/sna_display.c b/src/sna/sna_display.c
index a5e1f6f..b21ce39 100644
--- a/src/sna/sna_display.c
+++ b/src/sna/sna_display.c
@@ -1683,17 +1683,22 @@ static void sna_crtc_box(xf86CrtcPtr crtc, BoxPtr crtc_box)
crtc_box->x1 = crtc_box->x2 = crtc_box->y1 = crtc_box->y2 = 0;
}
-static void sna_box_intersect(BoxPtr dest, BoxPtr a, BoxPtr b)
+static void sna_box_intersect(BoxPtr r, const BoxRec *a, const BoxRec *b)
{
- dest->x1 = a->x1 > b->x1 ? a->x1 : b->x1;
- dest->x2 = a->x2 < b->x2 ? a->x2 : b->x2;
- dest->y1 = a->y1 > b->y1 ? a->y1 : b->y1;
- dest->y2 = a->y2 < b->y2 ? a->y2 : b->y2;
- if (dest->x1 >= dest->x2 || dest->y1 >= dest->y2)
- dest->x1 = dest->x2 = dest->y1 = dest->y2 = 0;
+ r->x1 = a->x1 > b->x1 ? a->x1 : b->x1;
+ r->x2 = a->x2 < b->x2 ? a->x2 : b->x2;
+ r->y1 = a->y1 > b->y1 ? a->y1 : b->y1;
+ r->y2 = a->y2 < b->y2 ? a->y2 : b->y2;
+ DBG(("%s: (%d, %d), (%d, %d) intersect (%d, %d), (%d, %d) = (%d, %d), (%d, %d)\n",
+ __FUNCTION__,
+ a->x1, a->y1, a->x2, a->y2,
+ b->x1, b->y1, b->x2, b->y2,
+ r->x1, r->y1, r->x2, r->y2));
+ if (r->x1 >= r->x2 || r->y1 >= r->y2)
+ r->x1 = r->x2 = r->y1 = r->y2 = 0;
}
-static int sna_box_area(BoxPtr box)
+static int sna_box_area(const BoxRec *box)
{
return (int)(box->x2 - box->x1) * (int)(box->y2 - box->y1);
}
@@ -1705,25 +1710,28 @@ static int sna_box_area(BoxPtr box)
*/
xf86CrtcPtr
sna_covering_crtc(ScrnInfoPtr scrn,
- BoxPtr box, xf86CrtcPtr desired, BoxPtr crtc_box_ret)
+ const BoxRec *box,
+ xf86CrtcPtr desired,
+ BoxPtr crtc_box_ret)
{
xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
- xf86CrtcPtr crtc, best_crtc;
- int coverage, best_coverage;
- int c;
- BoxRec crtc_box, cover_box;
+ xf86CrtcPtr best_crtc;
+ int best_coverage, c;
+ BoxRec best_crtc_box;
DBG(("%s for box=(%d, %d), (%d, %d)\n",
__FUNCTION__, box->x1, box->y1, box->x2, box->y2));
best_crtc = NULL;
best_coverage = 0;
- crtc_box_ret->x1 = 0;
- crtc_box_ret->x2 = 0;
- crtc_box_ret->y1 = 0;
- crtc_box_ret->y2 = 0;
+ best_crtc_box.x1 = 0;
+ best_crtc_box.x2 = 0;
+ best_crtc_box.y1 = 0;
+ best_crtc_box.y2 = 0;
for (c = 0; c < xf86_config->num_crtc; c++) {
- crtc = xf86_config->crtc[c];
+ xf86CrtcPtr crtc = xf86_config->crtc[c];
+ BoxRec crtc_box, cover_box;
+ int coverage;
/* If the CRTC is off, treat it as not covering */
if (!sna_crtc_on(crtc)) {
@@ -1732,8 +1740,20 @@ sna_covering_crtc(ScrnInfoPtr scrn,
}
sna_crtc_box(crtc, &crtc_box);
+ DBG(("%s: crtc %d: (%d, %d), (%d, %d)\n",
+ __FUNCTION__, c,
+ crtc_box.x1, crtc_box.y1,
+ crtc_box.x2, crtc_box.y2));
+
sna_box_intersect(&cover_box, &crtc_box, box);
+ DBG(("%s: box instersects (%d, %d), (%d, %d) of crtc %d\n",
+ __FUNCTION__,
+ cover_box.x1, cover_box.y1,
+ cover_box.x2, cover_box.y2,
+ c));
coverage = sna_box_area(&cover_box);
+ DBG(("%s: box covers %d of crtc %d\n",
+ __FUNCTION__, coverage, c));
if (coverage && crtc == desired) {
DBG(("%s: box is on desired crtc [%p]\n",
__FUNCTION__, crtc));
@@ -1741,12 +1761,14 @@ sna_covering_crtc(ScrnInfoPtr scrn,
return crtc;
}
if (coverage > best_coverage) {
- *crtc_box_ret = crtc_box;
+ best_crtc_box = crtc_box;
best_crtc = crtc;
best_coverage = coverage;
}
}
- DBG(("%s: best crtc = %p\n", __FUNCTION__, best_crtc));
+ DBG(("%s: best crtc = %p, coverage = %d\n",
+ __FUNCTION__, best_crtc, best_coverage));
+ *crtc_box_ret = best_crtc_box;
return best_crtc;
}
commit b3949d0d7424242703c9e60e2e33908499aa6a43
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Fri Jun 10 12:45:24 2011 +0100
sna/kgem: remove erroneous assert during submit
This was only valid for gen6+ with the multiple rings.
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/sna/kgem.c b/src/sna/kgem.c
index e5a9c78..436b69b 100644
--- a/src/sna/kgem.c
+++ b/src/sna/kgem.c
@@ -774,7 +774,6 @@ void _kgem_submit(struct kgem *kgem)
assert(kgem->nbatch);
assert(kgem->nbatch <= KGEM_BATCH_SIZE(kgem));
assert(kgem->nbatch <= kgem->surface);
- assert(kgem->mode == KGEM_NONE || kgem->mode == kgem->ring);
batch_end = kgem_end_batch(kgem);
kgem_sna_flush(kgem);
commit 33abb68da2c49081f28898f93cc4e14702b40d70
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Fri Jun 10 12:44:56 2011 +0100
sna/kgem: remove redundant clears upon initialisation
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/sna/kgem.c b/src/sna/kgem.c
index 2c7f832..e5a9c78 100644
--- a/src/sna/kgem.c
+++ b/src/sna/kgem.c
@@ -296,14 +296,15 @@ void kgem_init(struct kgem *kgem, int fd, int gen)
struct drm_i915_gem_get_aperture aperture;
int i;
+ /* We presume we are partt of a zeroed structure
+ memset(kgem, 0, sizeof(*kgem));
+ */
+
kgem->fd = fd;
kgem->gen = gen;
kgem->wedged = drmCommandNone(kgem->fd, DRM_I915_GEM_THROTTLE) == -EIO;
kgem->wedged |= DBG_NO_HW;
- kgem->ring = kgem->mode = KGEM_NONE;
- kgem->flush = 0;
-
list_init(&kgem->partial);
list_init(&kgem->requests);
list_init(&kgem->active);
@@ -313,7 +314,6 @@ void kgem_init(struct kgem *kgem, int fd, int gen)
kgem->next_request = __kgem_request_alloc();
- kgem->has_vmap = 0;
#if defined(USE_VMAP) && defined(I915_PARAM_HAS_VMAP)
if (!DBG_NO_VMAP) {
drm_i915_getparam_t gp;
@@ -328,7 +328,6 @@ void kgem_init(struct kgem *kgem, int fd, int gen)
DBG(("%s: using vmap=%d\n", __FUNCTION__, kgem->has_vmap));
if (gen < 40) {
- kgem->has_relaxed_fencing = 0;
if (!DBG_NO_RELAXED_FENCING) {
drm_i915_getparam_t gp;
@@ -351,7 +350,6 @@ void kgem_init(struct kgem *kgem, int fd, int gen)
kgem->aperture_high = aperture.aper_available_size * 3/4;
kgem->aperture_low = aperture.aper_available_size * 1/4;
- kgem->aperture = 0;
DBG(("%s: aperture low=%d, high=%d\n", __FUNCTION__,
kgem->aperture_low, kgem->aperture_high));
More information about the xorg-commit
mailing list