xf86-video-intel: 6 commits - src/sna/gen2_render.c src/sna/gen3_render.c src/sna/gen4_render.c src/sna/gen5_render.c src/sna/gen6_render.c src/sna/kgem.c src/sna/kgem.h src/sna/sna_accel.c src/sna/sna_display.c src/sna/sna_driver.c src/sna/sna.h
Chris Wilson
ickle at kemper.freedesktop.org
Fri Jun 10 03:30:26 PDT 2011
src/sna/gen2_render.c | 2 -
src/sna/gen3_render.c | 2 -
src/sna/gen4_render.c | 9 +++++---
src/sna/gen5_render.c | 1
src/sna/gen6_render.c | 1
src/sna/kgem.c | 30 +++++++++++++++-------------
src/sna/kgem.h | 1
src/sna/sna.h | 1
src/sna/sna_accel.c | 2 +
src/sna/sna_display.c | 1
src/sna/sna_driver.c | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++
11 files changed, 78 insertions(+), 24 deletions(-)
New commits:
commit cfde920a2e449efaa387850173e46f87d928023b
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Fri Jun 10 11:27:04 2011 +0100
sna: Remember to decouple the fb on closing
... so that we actually attach a new one after regen!
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 4d11063..a5e1f6f 100644
--- a/src/sna/sna_display.c
+++ b/src/sna/sna_display.c
@@ -1846,4 +1846,3 @@ sna_wait_for_scanline(struct sna *sna, PixmapPtr pixmap,
kgem_advance_batch(&sna->kgem, 5);
return true;
}
-
diff --git a/src/sna/sna_driver.c b/src/sna/sna_driver.c
index 42d4091..2c9cae9 100644
--- a/src/sna/sna_driver.c
+++ b/src/sna/sna_driver.c
@@ -763,6 +763,7 @@ static Bool sna_close_screen(int scrnIndex, ScreenPtr screen)
sna->directRenderingOpen = FALSE;
}
+ sna_mode_remove_fb(sna);
xf86GARTCloseScreen(scrnIndex);
scrn->vtSema = FALSE;
commit b6192ce95af8aa8be6d9a68a500393f2a73c2f4c
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Fri Jun 10 11:05:41 2011 +0100
sna/gen4: Tweak calculation of required batch space for CA
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/sna/gen4_render.c b/src/sna/gen4_render.c
index 13d9533..c7bc751 100644
--- a/src/sna/gen4_render.c
+++ b/src/sna/gen4_render.c
@@ -1046,13 +1046,18 @@ static bool gen4_rectangle_begin(struct sna *sna,
int ndwords;
ndwords = 0;
+ if (FLUSH_EVERY_VERTEX)
+ ndwords = 1;
if ((sna->render_state.gen4.vb_id & (1 << id)) == 0)
ndwords += 5;
if (sna->render_state.gen4.vertex_offset == 0)
- ndwords += op->need_magic_ca_pass ? 20 : 6;
+ ndwords += 6;
if (ndwords == 0)
return true;
+ if (op->need_magic_ca_pass)
+ ndwords += 12; /* pipelined pointers + primitive + flush */
+
if (!kgem_check_batch(&sna->kgem, ndwords))
return false;
commit c9b89fc87f1d43a715cd9c5915bfed957175986d
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Fri Jun 10 10:53:29 2011 +0100
sna: Drain the event queues before CloseScreen
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/sna/sna_driver.c b/src/sna/sna_driver.c
index 60bd53a..42d4091 100644
--- a/src/sna/sna_driver.c
+++ b/src/sna/sna_driver.c
@@ -737,6 +737,10 @@ static Bool sna_close_screen(int scrnIndex, ScreenPtr screen)
sna_uevent_fini(scrn);
#endif
+ /* drain the event queues */
+ sna_accel_wakeup_handler(sna);
+ sna_dri_wakeup(sna);
+
if (scrn->vtSema == TRUE)
sna_leave_vt(scrnIndex, 0);
commit ea560e25dfcce3750339b477a1a3c05f504cf91e
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Fri Jun 10 10:44:27 2011 +0100
sna: Workaround the random free of the ScreenPixmap in fbCloseScreen
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/sna/sna_driver.c b/src/sna/sna_driver.c
index a02c4d8..60bd53a 100644
--- a/src/sna/sna_driver.c
+++ b/src/sna/sna_driver.c
@@ -744,6 +744,13 @@ static Bool sna_close_screen(int scrnIndex, ScreenPtr screen)
xf86_cursors_fini(screen);
+ /* XXX unhook devPrivate otherwise fbCloseScreen frees it! */
+ if (sna->front) {
+ screen->DestroyPixmap(sna->front);
+ sna->front = NULL;
+ screen->devPrivate = NULL;
+ }
+
screen->CloseScreen = sna->CloseScreen;
(*screen->CloseScreen) (scrnIndex, screen);
commit 1f364c6d241e8971e8fc1447871c718240e4563e
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Fri Jun 10 10:03:01 2011 +0100
sna: Reset the kgem state on server regen
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/sna/gen2_render.c b/src/sna/gen2_render.c
index 0ead969..34c053b 100644
--- a/src/sna/gen2_render.c
+++ b/src/sna/gen2_render.c
@@ -1267,8 +1267,6 @@ Bool gen2_render_init(struct sna *sna)
{
struct sna_render *render = &sna->render;
- gen2_render_reset(sna);
-
/* Use the BLT (and overlay) for everything except when forced to
* use the texture combiners.
*/
diff --git a/src/sna/gen3_render.c b/src/sna/gen3_render.c
index fcc3ba2..542856d 100644
--- a/src/sna/gen3_render.c
+++ b/src/sna/gen3_render.c
@@ -3668,8 +3668,6 @@ Bool gen3_render_init(struct sna *sna)
{
struct sna_render *render = &sna->render;
- gen3_render_reset(sna);
-
render->composite = gen3_render_composite;
render->composite_spans = gen3_render_composite_spans;
diff --git a/src/sna/gen4_render.c b/src/sna/gen4_render.c
index 582e398..13d9533 100644
--- a/src/sna/gen4_render.c
+++ b/src/sna/gen4_render.c
@@ -2792,8 +2792,6 @@ Bool gen4_render_init(struct sna *sna)
if (!gen4_render_setup(sna))
return FALSE;
- gen4_render_reset(sna);
-
sna->render.composite = gen4_render_composite;
sna->render.video = gen4_render_video;
diff --git a/src/sna/gen5_render.c b/src/sna/gen5_render.c
index c444b69..69c71f5 100644
--- a/src/sna/gen5_render.c
+++ b/src/sna/gen5_render.c
@@ -2809,7 +2809,6 @@ Bool gen5_render_init(struct sna *sna)
if (!gen5_render_setup(sna))
return FALSE;
- gen5_render_reset(sna);
sna->kgem.context_switch = gen5_render_context_switch;
sna->render.composite = gen5_render_composite;
diff --git a/src/sna/gen6_render.c b/src/sna/gen6_render.c
index 2195882..80d1f3d 100644
--- a/src/sna/gen6_render.c
+++ b/src/sna/gen6_render.c
@@ -2852,7 +2852,6 @@ Bool gen6_render_init(struct sna *sna)
if (!gen6_render_setup(sna))
return FALSE;
- gen6_render_reset(sna);
sna->kgem.context_switch = gen6_render_context_switch;
sna->render.composite = gen6_render_composite;
diff --git a/src/sna/kgem.c b/src/sna/kgem.c
index 43a82d4..2c7f832 100644
--- a/src/sna/kgem.c
+++ b/src/sna/kgem.c
@@ -304,10 +304,6 @@ void kgem_init(struct kgem *kgem, int fd, int gen)
kgem->ring = kgem->mode = KGEM_NONE;
kgem->flush = 0;
- kgem->nbatch = 0;
- kgem->nreloc = 0;
- kgem->nexec = 0;
- kgem->surface = ARRAY_SIZE(kgem->batch);
list_init(&kgem->partial);
list_init(&kgem->requests);
list_init(&kgem->active);
@@ -757,6 +753,20 @@ static int kgem_batch_write(struct kgem *kgem, uint32_t handle)
kgem->batch + kgem->surface);
}
+void kgem_reset(struct kgem *kgem)
+{
+ kgem->nfence = 0;
+ kgem->nexec = 0;
+ kgem->nreloc = 0;
+ kgem->aperture = 0;
+ kgem->nbatch = 0;
+ kgem->surface = ARRAY_SIZE(kgem->batch);
+ kgem->mode = KGEM_NONE;
+ kgem->flush = 0;
+
+ kgem_sna_reset(kgem);
+}
+
void _kgem_submit(struct kgem *kgem)
{
struct kgem_request *rq;
@@ -917,16 +927,7 @@ void _kgem_submit(struct kgem *kgem)
if (kgem->wedged)
kgem_cleanup(kgem);
- kgem->nfence = 0;
- kgem->nexec = 0;
- kgem->nreloc = 0;
- kgem->aperture = 0;
- kgem->nbatch = 0;
- kgem->surface = ARRAY_SIZE(kgem->batch);
- kgem->mode = KGEM_NONE;
- kgem->flush = 0;
-
- kgem_sna_reset(kgem);
+ kgem_reset(kgem);
}
void kgem_throttle(struct kgem *kgem)
diff --git a/src/sna/kgem.h b/src/sna/kgem.h
index 3709930..fc1c38c 100644
--- a/src/sna/kgem.h
+++ b/src/sna/kgem.h
@@ -122,6 +122,7 @@ struct kgem {
#define KGEM_RELOC_SIZE(K) (ARRAY_SIZE((K)->reloc)-KGEM_RELOC_RESERVED)
void kgem_init(struct kgem *kgem, int fd, int gen);
+void kgem_reset(struct kgem *kgem);
struct kgem_bo *kgem_create_map(struct kgem *kgem,
void *ptr, uint32_t size,
diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
index af021b6..6492749 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -3270,6 +3270,8 @@ Bool sna_accel_init(ScreenPtr screen, struct sna *sna)
DBG(("%s(backend=%s, have_render=%d)\n",
__FUNCTION__, backend, sna->have_render));
+ kgem_reset(&sna->kgem);
+
xf86DrvMsg(sna->scrn->scrnIndex, X_INFO,
"SNA initialized with %s backend\n",
backend);
commit 95ae39a93467655b2107b82bd7970f732c8de066
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Fri Jun 10 09:57:22 2011 +0100
sna: Add some debug statements to the core DDX interface
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/sna/kgem.c b/src/sna/kgem.c
index c560531..43a82d4 100644
--- a/src/sna/kgem.c
+++ b/src/sna/kgem.c
@@ -766,6 +766,7 @@ 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);
diff --git a/src/sna/sna.h b/src/sna/sna.h
index d963d9c..08de443 100644
--- a/src/sna/sna.h
+++ b/src/sna/sna.h
@@ -78,6 +78,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#define DEBUG_DAMAGE (DEBUG_ALL || 0)
#define DEBUG_DISPLAY (DEBUG_ALL || 0)
#define DEBUG_DRI (DEBUG_ALL || 0)
+#define DEBUG_DRIVER (DEBUG_ALL || 0)
#define DEBUG_GRADIENT (DEBUG_ALL || 0)
#define DEBUG_GLYPHS (DEBUG_ALL || 0)
#define DEBUG_IO (DEBUG_ALL || 0)
diff --git a/src/sna/sna_driver.c b/src/sna/sna_driver.c
index ca1f32c..a02c4d8 100644
--- a/src/sna/sna_driver.c
+++ b/src/sna/sna_driver.c
@@ -71,6 +71,13 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.
#include <sys/fcntl.h>
#include "i915_drm.h"
+#if DEBUG_DRIVER
+#undef DBG
+#define DBG(x) ErrorF x
+#else
+#define NDEBUG 1
+#endif
+
static OptionInfoRec sna_options[] = {
{OPTION_TILING_FB, "LinearFramebuffer", OPTV_BOOLEAN, {0}, FALSE},
{OPTION_TILING_2D, "Tiling", OPTV_BOOLEAN, {0}, TRUE},
@@ -105,6 +112,8 @@ sna_load_palette(ScrnInfoPtr scrn, int numColors, int *indices,
int p;
uint16_t lut_r[256], lut_g[256], lut_b[256];
+ DBG(("%s\n", __FUNCTION__));
+
for (p = 0; p < xf86_config->num_crtc; p++) {
xf86CrtcPtr crtc = xf86_config->crtc[p];
@@ -171,6 +180,8 @@ static Bool sna_create_screen_resources(ScreenPtr screen)
ScrnInfoPtr scrn = xf86Screens[screen->myNum];
struct sna *sna = to_sna(scrn);
+ DBG(("%s\n", __FUNCTION__));
+
free(screen->devPrivate);
screen->devPrivate = NULL;
@@ -286,6 +297,8 @@ static int sna_open_drm_master(ScrnInfoPtr scrn)
char busid[20];
int fd;
+ DBG(("%s\n", __FUNCTION__));
+
dev = sna_device(scrn);
if (dev) {
dev->open_count++;
@@ -351,6 +364,8 @@ static void sna_close_drm_master(ScrnInfoPtr scrn)
{
struct sna_device *dev = sna_device(scrn);
+ DBG(("%s(open_count=%d)\n", __FUNCTION__, dev->open_count));
+
if (--dev->open_count)
return;
@@ -386,6 +401,8 @@ static Bool sna_pre_init(ScrnInfoPtr scrn, int flags)
Gamma zeros = { 0.0, 0.0, 0.0 };
int fd;
+ DBG(("%s\n", __FUNCTION__));
+
sna_selftest();
if (scrn->numEntities != 1)
@@ -545,6 +562,8 @@ sna_block_handler(int i, pointer data, pointer timeout, pointer read_mask)
ScrnInfoPtr scrn = xf86Screens[i];
struct sna *sna = to_sna(scrn);
+ DBG(("%s\n", __FUNCTION__));
+
screen->BlockHandler = sna->BlockHandler;
(*screen->BlockHandler) (i, data, timeout, read_mask);
@@ -562,6 +581,8 @@ sna_wakeup_handler(int i, pointer data, unsigned long result, pointer read_mask)
ScrnInfoPtr scrn = xf86Screens[i];
struct sna *sna = to_sna(scrn);
+ DBG(("%s\n", __FUNCTION__));
+
screen->WakeupHandler = sna->WakeupHandler;
(*screen->WakeupHandler) (i, data, result, read_mask);
@@ -590,6 +611,8 @@ sna_handle_uevents(int fd, void *closure)
struct stat s;
dev_t udev_devnum;
+ DBG(("%s\n", __FUNCTION__));
+
dev = udev_monitor_receive_device(sna->uevent_monitor);
if (!dev)
return;
@@ -620,6 +643,8 @@ sna_uevent_init(ScrnInfoPtr scrn)
Bool hotplug;
MessageType from = X_CONFIG;
+ DBG(("%s\n", __FUNCTION__));
+
if (!xf86GetOptValBool(sna->Options, OPTION_HOTPLUG, &hotplug)) {
from = X_DEFAULT;
hotplug = TRUE;
@@ -688,6 +713,8 @@ static void sna_leave_vt(int scrnIndex, int flags)
struct sna *sna = to_sna(scrn);
int ret;
+ DBG(("%s\n", __FUNCTION__));
+
xf86RotateFreeShadow(scrn);
xf86_hide_cursors(scrn);
@@ -704,6 +731,8 @@ static Bool sna_close_screen(int scrnIndex, ScreenPtr screen)
ScrnInfoPtr scrn = xf86Screens[scrnIndex];
struct sna *sna = to_sna(scrn);
+ DBG(("%s\n", __FUNCTION__));
+
#if HAVE_UDEV
sna_uevent_fini(scrn);
#endif
@@ -737,6 +766,8 @@ sna_screen_init(int scrnIndex, ScreenPtr screen, int argc, char **argv)
VisualPtr visual;
struct pci_device *const device = sna->PciInfo;
+ DBG(("%s\n", __FUNCTION__));
+
scrn->videoRam = device->regions[2].size / 1024;
#ifdef DRI2
@@ -856,6 +887,8 @@ static void sna_free_screen(int scrnIndex, int flags)
ScrnInfoPtr scrn = xf86Screens[scrnIndex];
struct sna *sna = to_sna(scrn);
+ DBG(("%s\n", __FUNCTION__));
+
if (sna) {
sna_mode_fini(sna);
@@ -877,6 +910,8 @@ static Bool sna_enter_vt(int scrnIndex, int flags)
ScrnInfoPtr scrn = xf86Screens[scrnIndex];
struct sna *sna = to_sna(scrn);
+ DBG(("%s\n", __FUNCTION__));
+
if (drmSetMaster(sna->kgem.fd)) {
xf86DrvMsg(scrn->scrnIndex, X_WARNING,
"drmSetMaster failed: %s\n",
@@ -888,6 +923,7 @@ static Bool sna_enter_vt(int scrnIndex, int flags)
static Bool sna_switch_mode(int scrnIndex, DisplayModePtr mode, int flags)
{
+ DBG(("%s\n", __FUNCTION__));
return xf86SetSingleMode(xf86Screens[scrnIndex], mode, RR_Rotate_0);
}
@@ -914,6 +950,8 @@ static Bool sna_pm_event(int scrnIndex, pmEvent event, Bool undo)
ScrnInfoPtr scrn = xf86Screens[scrnIndex];
struct sna *sna = to_sna(scrn);
+ DBG(("%s\n", __FUNCTION__));
+
switch (event) {
case XF86_APM_SYS_SUSPEND:
case XF86_APM_CRITICAL_SUSPEND: /*do we want to delay a critical suspend? */
@@ -963,6 +1001,8 @@ void sna_init_scrn(ScrnInfoPtr scrn, int entity_num)
{
EntityInfoPtr entity;
+ DBG(("%s\n", __FUNCTION__));
+
sna_device_key = xf86AllocateEntityPrivateIndex();
scrn->PreInit = sna_pre_init;
More information about the xorg-commit
mailing list