xf86-video-intel: Branch 'modesetting-gem' - 6 commits - src/drmmode_display.c src/drmmode_display.h src/i830_accel.c src/i830_driver.c src/i830_exa.c src/i830.h src/i830_memory.c src/i965_render.c

Jesse Barnes jbarnes at kemper.freedesktop.org
Tue Aug 12 18:17:05 PDT 2008


 src/drmmode_display.c |  238 ++++++++++++++++++++++++++------------------------
 src/drmmode_display.h |   38 ++++---
 src/i830.h            |    4 
 src/i830_accel.c      |    2 
 src/i830_driver.c     |   14 +-
 src/i830_exa.c        |  150 ++++++++++++++++++++++---------
 src/i830_memory.c     |    4 
 src/i965_render.c     |   10 +-
 8 files changed, 275 insertions(+), 185 deletions(-)

New commits:
commit 1ab7239b73a5e298cadaf44e5605cf05855f08e9
Author: Jesse Barnes <jbarnes at virtuousgeek.org>
Date:   Tue Aug 12 18:16:37 2008 -0700

    Map gen4 render state buffer before initializing

diff --git a/src/i965_render.c b/src/i965_render.c
index 391e063..bd693ca 100644
--- a/src/i965_render.c
+++ b/src/i965_render.c
@@ -1448,9 +1448,13 @@ gen4_render_state_init(ScrnInfoPtr pScrn)
     render_state = pI830->gen4_render_state;
 
     render_state->card_state_offset = pI830->gen4_render_state_mem->offset;
-    render_state->card_state = (gen4_state_t *)
-	(pI830->FbBase + render_state->card_state_offset);
 
+    if (dri_bo_map(pI830->gen4_render_state_mem->bo, 1)) {
+	xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "Failed to map gen4 state\n");
+	return;
+    }
+
+    render_state->card_state = pI830->gen4_render_state_mem->bo->virtual;
     gen4_state_init(render_state);
 }
 
@@ -1462,6 +1466,8 @@ gen4_render_state_cleanup(ScrnInfoPtr pScrn)
 {
     I830Ptr pI830 = I830PTR(pScrn);
 
+    dri_bo_unmap(pI830->gen4_render_state_mem->bo);
+    dri_bo_unreference(pI830->gen4_render_state_mem->bo);
     pI830->gen4_render_state->card_state = NULL;
 }
 
commit 603f48e31b021c4dc0bbf7b5efbb2e68aeb421d5
Author: Jesse Barnes <jbarnes at virtuousgeek.org>
Date:   Tue Aug 12 18:04:08 2008 -0700

    Don't set tiling (yet) if kernel mode setting is active

diff --git a/src/i830_memory.c b/src/i830_memory.c
index fe70908..d14d86f 100644
--- a/src/i830_memory.c
+++ b/src/i830_memory.c
@@ -193,7 +193,7 @@ i830_bind_memory(ScrnInfoPtr pScrn, i830_memory *mem)
 	mem->bound = TRUE;
     }
 
-    if (mem->tiling != TILE_NONE && pI830->use_drm_mode) {
+    if (mem->tiling != TILE_NONE && !pI830->use_drm_mode) {
 	mem->fence_nr = i830_set_tiling(pScrn, mem->offset, mem->pitch,
 					mem->allocated_size, mem->tiling);
     }
@@ -741,8 +741,6 @@ i830_allocate_memory_bo(ScrnInfoPtr pScrn, const char *name,
 
     mem->bo = dri_bo_alloc (pI830->bufmgr, name, size, align);
 
-    ErrorF("alloc'd bo for %s\n", name);
-
     if (!mem->bo) {
 	xfree(mem->name);
 	xfree(mem);
commit f744aa8d4b22374e1de6dda4facb673c3c428d4d
Author: Jesse Barnes <jbarnes at virtuousgeek.org>
Date:   Tue Aug 12 18:02:21 2008 -0700

    Don't run old accel init code
    
    Had the wrong logic.  Throw in a couple of cleanups while we're there.

diff --git a/src/i830_driver.c b/src/i830_driver.c
index 2681135..3ad811e 100644
--- a/src/i830_driver.c
+++ b/src/i830_driver.c
@@ -1878,8 +1878,10 @@ I830PreInit(ScrnInfoPtr pScrn, int flags)
    if (pI830->use_drm_mode) {
        if (!I830DrmModeInit(pScrn))
 	   return FALSE;
-   } else if (!I830AccelMethodInit(pScrn))
-       return FALSE;
+   } else {
+       if (!I830AccelMethodInit(pScrn))
+	   return FALSE;
+   }
 
    I830XvInit(pScrn);
 
@@ -2661,9 +2663,6 @@ I830BlockHandler(int i,
 #endif
 
        pI830->need_mi_flush = FALSE;
-#ifdef XF86DRI
-       drmCommandNone(pI830->drmSubFD, DRM_I915_GEM_THROTTLE);
-#endif
     }
 
     if (pI830->accel == ACCEL_UXA)
@@ -2675,7 +2674,7 @@ I830BlockHandler(int i,
      * (except for mode setting, where it may occur naturally).
      * Check & ack the condition.
      */
-    if (pScrn->vtSema && !DSPARB_HWCONTROL(pI830)) {
+    if (!pI830->use_drm_mode && pScrn->vtSema && !DSPARB_HWCONTROL(pI830)) {
 	if (xf86_config->crtc[0]->enabled &&
 		(INREG(PIPEASTAT) & FIFO_UNDERRUN)) {
 	    xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "underrun on pipe A!\n");
@@ -3641,7 +3640,8 @@ I830EnterVT(int scrnIndex, int flags)
 
    intel_batch_init(pScrn);
 
-   if ((pI830->accel == ACCEL_EXA || pI830->accel == ACCEL_UXA) && IS_I965G(pI830))
+   if ((pI830->accel == ACCEL_EXA || pI830->accel == ACCEL_UXA) &&
+       IS_I965G(pI830))
       gen4_render_state_init(pScrn);
 
    if (!pI830->use_drm_mode) {
commit 2321c865f3da9fd321910236a92b32e0af1aa458
Author: Jesse Barnes <jbarnes at virtuousgeek.org>
Date:   Tue Aug 12 17:59:16 2008 -0700

    Don't wait for ring if kernel mode setting is active
    
    We won't have the ring mapped.

diff --git a/src/i830_accel.c b/src/i830_accel.c
index a301818..386e653 100644
--- a/src/i830_accel.c
+++ b/src/i830_accel.c
@@ -220,7 +220,7 @@ I830Sync(ScrnInfoPtr pScrn)
 
        if (!pI830->memory_manager)
 	   i830_refresh_ring(pScrn);
-   } else {
+   } else if (!pI830->use_drm_mode) {
        i830_wait_ring_idle(pScrn);
    }
 
commit a1b334a4c8ae090744e802f8d41a36ea631d6c84
Author: Jesse Barnes <jbarnes at virtuousgeek.org>
Date:   Tue Aug 12 17:58:29 2008 -0700

    Update DRM based modesetting support
    
    Just a checkpoint, still needs a lot of work to properly handle resize, rotate
    & cursor handling.

diff --git a/src/drmmode_display.c b/src/drmmode_display.c
index 5bbb97c..a65e948 100644
--- a/src/drmmode_display.c
+++ b/src/drmmode_display.c
@@ -33,17 +33,18 @@
 #include "i830.h"
 #include "sarea.h"
 
-static Bool drmmode_resize_fb(ScrnInfoPtr scrn, drmmode_ptr drmmode, int width, int height);
+static Bool drmmode_resize_fb(ScrnInfoPtr scrn, drmmode_ptr drmmode,
+			      int width, int height);
 
 static Bool
 drmmode_xf86crtc_resize (ScrnInfoPtr scrn, int width, int height)
 {
 	xf86CrtcConfigPtr   xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
-	drmmode_crtc_private_ptr drmmode_crtc = xf86_config->crtc[0]->driver_private;
+	drmmode_crtc_private_ptr drmmode_crtc =
+		xf86_config->crtc[0]->driver_private;
 	drmmode_ptr drmmode = drmmode_crtc->drmmode;
 	Bool ret;
 
-	ErrorF("resize called %d %d\n", width, height);
 	ret = drmmode_resize_fb(scrn, drmmode, width, height);
 	scrn->virtualX = width;
 	scrn->virtualY = height;
@@ -51,21 +52,21 @@ drmmode_xf86crtc_resize (ScrnInfoPtr scrn, int width, int height)
 }
 
 static void
-drmmode_ConvertFromKMode(ScrnInfoPtr	scrn,
-		     struct drm_mode_modeinfo *kmode,
-		     DisplayModePtr	mode)
+drmmode_ConvertFromKMode(ScrnInfoPtr scrn,
+			 struct drm_mode_modeinfo *kmode,
+			 DisplayModePtr	mode)
 {
 	memset(mode, 0, sizeof(DisplayModeRec));
 	mode->status = MODE_OK;
-	
+
 	mode->Clock = kmode->clock;
-	
+
 	mode->HDisplay = kmode->hdisplay;
 	mode->HSyncStart = kmode->hsync_start;
 	mode->HSyncEnd = kmode->hsync_end;
 	mode->HTotal = kmode->htotal;
 	mode->HSkew = kmode->hskew;
-    
+
 	mode->VDisplay = kmode->vdisplay;
 	mode->VSyncStart = kmode->vsync_start;
 	mode->VSyncEnd = kmode->vsync_end;
@@ -83,9 +84,9 @@ drmmode_ConvertFromKMode(ScrnInfoPtr	scrn,
 }
 
 static void
-drmmode_ConvertToKMode(ScrnInfoPtr	scrn,
-		     struct drm_mode_modeinfo *kmode,
-		     DisplayModePtr	mode)
+drmmode_ConvertToKMode(ScrnInfoPtr scrn,
+		       struct drm_mode_modeinfo *kmode,
+		       DisplayModePtr mode)
 {
 	memset(kmode, 0, sizeof(*kmode));
 
@@ -95,7 +96,7 @@ drmmode_ConvertToKMode(ScrnInfoPtr	scrn,
 	kmode->hsync_end = mode->HSyncEnd;
 	kmode->htotal = mode->HTotal;
 	kmode->hskew = mode->HSkew;
-    
+
 	kmode->vdisplay = mode->VDisplay;
 	kmode->vsync_start = mode->VSyncStart;
 	kmode->vsync_end = mode->VSyncEnd;
@@ -121,7 +122,7 @@ drmmode_crtc_dpms(xf86CrtcPtr drmmode_crtc, int mode)
 
 static Bool
 drmmode_set_mode_major(xf86CrtcPtr crtc, DisplayModePtr mode,
-		     Rotation rotation, int x, int y)
+		       Rotation rotation, int x, int y)
 {
 	xf86CrtcConfigPtr   xf86_config = XF86_CRTC_CONFIG_PTR(crtc->scrn);
 	drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
@@ -160,7 +161,8 @@ drmmode_set_mode_major(xf86CrtcPtr crtc, DisplayModePtr mode,
 			continue;
 
 		drmmode_output = output->driver_private;
-		output_ids[output_count] = drmmode_output->mode_output->connector_id;
+		output_ids[output_count] =
+			drmmode_output->mode_output->connector_id;
 		output_count++;
 	}
 
@@ -175,9 +177,13 @@ drmmode_set_mode_major(xf86CrtcPtr crtc, DisplayModePtr mode,
 	if (drmmode_crtc->rotate_fb_id)
 		fb_id = drmmode_crtc->rotate_fb_id;
 	ErrorF("fb id is %d\n", fb_id);
-	drmModeSetCrtc(drmmode->fd, drmmode_crtc->mode_crtc->crtc_id,
-		       fb_id, x, y, output_ids, output_count, &kmode);
-
+	ret = drmModeSetCrtc(drmmode->fd, drmmode_crtc->mode_crtc->crtc_id,
+			     fb_id, x, y, output_ids, output_count, &kmode);
+	if (ret)
+		xf86DrvMsg(crtc->scrn->scrnIndex, X_ERROR,
+			   "failed to set mode: %s", strerror(-ret));
+	else
+		ret = TRUE;
 
 done:
 	if (!ret) {
@@ -192,7 +198,7 @@ done:
 static void
 drmmode_set_cursor_colors (xf86CrtcPtr crtc, int bg, int fg)
 {
-  
+
 }
 
 static void
@@ -208,10 +214,16 @@ static void
 drmmode_load_cursor_argb (xf86CrtcPtr crtc, CARD32 *image)
 {
 	drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
+	ScrnInfoPtr pScrn = crtc->scrn;
+	I830Ptr pI830 = I830PTR(pScrn);
 	void *ptr;
 
 	/* cursor should be mapped already */
-	ptr = drmmode_crtc->cursor_map;
+	if (dri_bo_map(pI830->cursor_mem->bo, 1))
+		xf86DrvMsg(crtc->scrn->scrnIndex, X_ERROR,
+			   "failed to map cursor");
+
+	ptr = pI830->cursor_mem->bo->virtual;
 
 	memcpy (ptr, image, 64 * 64 * 4);
 
@@ -224,9 +236,9 @@ drmmode_hide_cursor (xf86CrtcPtr crtc)
 {
 	drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
 	drmmode_ptr drmmode = drmmode_crtc->drmmode;
-	
-	drmModeSetCursor(drmmode->fd, drmmode_crtc->mode_crtc->crtc_id, 0, 64, 64);
 
+	drmModeSetCursor(drmmode->fd, drmmode_crtc->mode_crtc->crtc_id,
+			 0, 64, 64);
 }
 
 static void
@@ -234,8 +246,11 @@ drmmode_show_cursor (xf86CrtcPtr crtc)
 {
 	drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
 	drmmode_ptr drmmode = drmmode_crtc->drmmode;
+	ScrnInfoPtr pScrn = crtc->scrn;
+	I830Ptr pI830 = I830PTR(pScrn);
 
-	drmModeSetCursor(drmmode->fd, drmmode_crtc->mode_crtc->crtc_id, drmmode_crtc->cursor_handle, 64, 64);
+	drmModeSetCursor(drmmode->fd, drmmode_crtc->mode_crtc->crtc_id,
+			 pI830->cursor_mem->bo->handle, 64, 64);
 }
 
 static void *
@@ -250,23 +265,24 @@ drmmode_crtc_shadow_allocate(xf86CrtcPtr crtc, int width, int height)
 	size = rotate_pitch * height;
 
 #if 0
-	drmmode_crtc->rotate_bo = dri_bo_alloc(drmmode->bufmgr, "rotate",
-					     size, 4096, DRM_BO_FLAG_MEM_TT | DRM_BO_FLAG_CACHED | DRM_BO_FLAG_CACHED_MAPPED);
+	drmmode_crtc->rotate_bo =
+		dri_bo_alloc(drmmode->bufmgr, "rotate", size, 4096);
 
 	if (!drmmode_crtc->rotate_bo) {
 		xf86DrvMsg(crtc->scrn->scrnIndex, X_ERROR,
 			   "Couldn't allocate shadow memory for rotated CRTC\n");
 		return NULL;
 	}
-		
+
 	dri_bo_map(drmmode_crtc->rotate_bo, 1);
 
 	ret = drmModeAddFB(drmmode->fd, width, height, crtc->scrn->depth,
-			   crtc->scrn->bitsPerPixel, rotate_pitch, dri_bo_get_handle(drmmode_crtc->rotate_bo), &drmmode_crtc->rotate_fb_id);
-	if (ret) {
+			   crtc->scrn->bitsPerPixel, rotate_pitch,
+			   drmmode_crtc->rotate_bo->handle,
+			   &drmmode_crtc->rotate_fb_id);
+	if (ret)
 		ErrorF("failed to add rotate fb\n");
-	}
-       
+
 	return drmmode_crtc->rotate_bo->virtual;
 #endif
 	return NULL;
@@ -280,19 +296,19 @@ drmmode_crtc_shadow_create(xf86CrtcPtr crtc, void *data, int width, int height)
 	drmmode_ptr drmmode = drmmode_crtc->drmmode;
 	unsigned long rotate_pitch;
 	PixmapPtr rotate_pixmap;
-	
+
 	if (!data)
 		data = drmmode_crtc_shadow_allocate (crtc, width, height);
 
 	rotate_pitch = pScrn->displayWidth * drmmode->cpp;
-	
+
 	rotate_pixmap = GetScratchPixmapHeader(pScrn->pScreen,
 					       width, height,
 					       pScrn->depth,
 					       pScrn->bitsPerPixel,
 					       rotate_pitch,
 					       data);
-	
+
 	if (rotate_pixmap == NULL) {
 		xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
 			   "Couldn't allocate shadow pixmap for rotated CRTC\n");
@@ -307,8 +323,8 @@ drmmode_crtc_shadow_destroy(xf86CrtcPtr crtc, PixmapPtr rotate_pixmap, void *dat
 	drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
 
 	if (rotate_pixmap)
-	    FreeScratchPixmapHeader(rotate_pixmap);
-	
+		FreeScratchPixmapHeader(rotate_pixmap);
+
 	if (data) {
 #if 0
 		/* Be sure to sync acceleration before the memory gets unbound. */
@@ -322,25 +338,25 @@ drmmode_crtc_shadow_destroy(xf86CrtcPtr crtc, PixmapPtr rotate_pixmap, void *dat
 }
 
 static const xf86CrtcFuncsRec drmmode_crtc_funcs = {
-    .dpms = drmmode_crtc_dpms,
-    .set_mode_major = drmmode_set_mode_major,
-    .set_cursor_colors = drmmode_set_cursor_colors,
-    .set_cursor_position = drmmode_set_cursor_position,
-    .show_cursor = drmmode_show_cursor,
-    .hide_cursor = drmmode_hide_cursor,
-    .load_cursor_argb = drmmode_load_cursor_argb,
-
-    .shadow_create = drmmode_crtc_shadow_create,
-    .shadow_allocate = drmmode_crtc_shadow_allocate,
-    .shadow_destroy = drmmode_crtc_shadow_destroy,
+	.dpms = drmmode_crtc_dpms,
+	.set_mode_major = drmmode_set_mode_major,
+	.set_cursor_colors = drmmode_set_cursor_colors,
+	.set_cursor_position = drmmode_set_cursor_position,
+	.show_cursor = drmmode_show_cursor,
+	.hide_cursor = drmmode_hide_cursor,
+	.load_cursor_argb = drmmode_load_cursor_argb,
+
+	.shadow_create = drmmode_crtc_shadow_create,
+	.shadow_allocate = drmmode_crtc_shadow_allocate,
+	.shadow_destroy = drmmode_crtc_shadow_destroy,
 #if 0
-    .gamma_set = i830_crtc_gamma_set,
-    .shadow_create = i830_crtc_shadow_create,
-    .shadow_allocate = i830_crtc_shadow_allocate,
-    .shadow_destroy = i830_crtc_shadow_destroy,
-    .set_cursor_colors = i830_crtc_set_cursor_colors,
+	.gamma_set = i830_crtc_gamma_set,
+	.shadow_create = i830_crtc_shadow_create,
+	.shadow_allocate = i830_crtc_shadow_allocate,
+	.shadow_destroy = i830_crtc_shadow_destroy,
+	.set_cursor_colors = i830_crtc_set_cursor_colors,
 #endif
-    .destroy = NULL, /* XXX */
+	.destroy = NULL, /* XXX */
 };
 
 
@@ -349,23 +365,19 @@ drmmode_crtc_init(ScrnInfoPtr pScrn, drmmode_ptr drmmode, int num)
 {
 	xf86CrtcPtr crtc;
 	drmmode_crtc_private_ptr drmmode_crtc;
+	I830Ptr pI830 = I830PTR(pScrn);
+	int ret;
 
 	crtc = xf86CrtcCreate(pScrn, &drmmode_crtc_funcs);
 	if (crtc == NULL)
 		return;
 
 	drmmode_crtc = xnfcalloc(sizeof(drmmode_crtc_private_rec), 1);
-	drmmode_crtc->mode_crtc = drmModeGetCrtc(drmmode->fd, drmmode->mode_res->crtcs[num]);
+	drmmode_crtc->mode_crtc = drmModeGetCrtc(drmmode->fd,
+						 drmmode->mode_res->crtcs[num]);
 	drmmode_crtc->drmmode = drmmode;
 	crtc->driver_private = drmmode_crtc;
 
-#if 0
-	drmmode_crtc->cursor_handle = drmmode->alloc_cursor(pScrn, num, 64, 64, &drmmode_crtc->cursor_map);
-	if (!drmmode_crtc->cursor_handle) {
-		ErrorF("failed to allocate cursor for crtc\n");
-		return;	  
-	}
-#endif
 	return;
 }
 
@@ -377,9 +389,10 @@ drmmode_output_detect(xf86OutputPtr output)
 	drmmode_ptr drmmode = drmmode_output->drmmode;
 	xf86OutputStatus status;
 	drmModeFreeConnector(drmmode_output->mode_output);
-	
-	drmmode_output->mode_output = drmModeGetConnector(drmmode->fd, drmmode_output->output_id);
-	
+
+	drmmode_output->mode_output =
+		drmModeGetConnector(drmmode->fd, drmmode_output->output_id);
+
 	switch (drmmode_output->mode_output->connection) {
 	case DRM_MODE_CONNECTED:
 		status = XF86OutputStatusConnected;
@@ -414,26 +427,33 @@ drmmode_output_get_modes(xf86OutputPtr output)
 	/* look for an EDID property */
 	for (i = 0; i < koutput->count_props; i++) {
 		props = drmModeGetProperty(drmmode->fd, koutput->props[i]);
-		if (props && (props->flags & DRM_MODE_PROP_BLOB)) {
-			if (!strcmp(props->name, "EDID")) {
-				if (drmmode_output->edid_blob)
-					drmModeFreePropertyBlob(drmmode_output->edid_blob);
-				drmmode_output->edid_blob = drmModeGetPropertyBlob(drmmode->fd, koutput->prop_values[i]);
-			}
-			drmModeFreeProperty(props);
+		if (!props || !(props->flags & DRM_MODE_PROP_BLOB))
+			continue;
+
+		if (!strcmp(props->name, "EDID") && drmmode_output->edid_blob) {
+			drmModeFreePropertyBlob(drmmode_output->edid_blob);
+			drmmode_output->edid_blob =
+				drmModeGetPropertyBlob(drmmode->fd,
+						       koutput->prop_values[i]);
 		}
+		drmModeFreeProperty(props);
 	}
 
 	if (drmmode_output->edid_blob)
-		xf86OutputSetEDID(output, xf86InterpretEDID(output->scrn->scrnIndex, drmmode_output->edid_blob->data));
+		xf86OutputSetEDID(output,
+				  xf86InterpretEDID(output->scrn->scrnIndex,
+						    drmmode_output->edid_blob->data));
 	else
-		xf86OutputSetEDID(output, xf86InterpretEDID(output->scrn->scrnIndex, NULL));
+		xf86OutputSetEDID(output,
+				  xf86InterpretEDID(output->scrn->scrnIndex,
+						    NULL));
 
 	/* modes should already be available */
 	for (i = 0; i < koutput->count_modes; i++) {
 		Mode = xnfalloc(sizeof(DisplayModeRec));
 
-		drmmode_ConvertFromKMode(output->scrn, &koutput->modes[i], Mode);
+		drmmode_ConvertFromKMode(output->scrn, &koutput->modes[i],
+					 Mode);
 		Modes = xf86ModesAdd(Modes, Mode);
 
 	}
@@ -459,21 +479,21 @@ drmmode_output_dpms(xf86OutputPtr output, int mode)
 }
 
 static const xf86OutputFuncsRec drmmode_output_funcs = {
-    .dpms = drmmode_output_dpms,
+	.dpms = drmmode_output_dpms,
 #if 0
 
-    .save = drmmode_crt_save,
-    .restore = drmmode_crt_restore,
-    .mode_fixup = drmmode_crt_mode_fixup,
-    .prepare = drmmode_output_prepare,
-    .mode_set = drmmode_crt_mode_set,
-    .commit = drmmode_output_commit,
+	.save = drmmode_crt_save,
+	.restore = drmmode_crt_restore,
+	.mode_fixup = drmmode_crt_mode_fixup,
+	.prepare = drmmode_output_prepare,
+	.mode_set = drmmode_crt_mode_set,
+	.commit = drmmode_output_commit,
 #endif
-    .detect = drmmode_output_detect,
-    .mode_valid = drmmode_output_mode_valid,
+	.detect = drmmode_output_detect,
+	.mode_valid = drmmode_output_mode_valid,
 
-    .get_modes = drmmode_output_get_modes,
-    .destroy = drmmode_output_destroy
+	.get_modes = drmmode_output_get_modes,
+	.destroy = drmmode_output_destroy
 };
 
 static int subpixel_conv_table[7] = { 0, SubPixelUnknown,
@@ -497,7 +517,7 @@ const char *output_names[] = { "None",
 			       "HDMI",
 			       "HDMI",
 };
-   
+
 
 static void
 drmmode_output_init(ScrnInfoPtr pScrn, drmmode_ptr drmmode, int num)
@@ -508,7 +528,8 @@ drmmode_output_init(ScrnInfoPtr pScrn, drmmode_ptr drmmode, int num)
 	drmmode_output_private_ptr drmmode_output;
 	char name[32];
 
-	koutput = drmModeGetConnector(drmmode->fd, drmmode->mode_res->connectors[num]);
+	koutput = drmModeGetConnector(drmmode->fd,
+				      drmmode->mode_res->connectors[num]);
 	if (!koutput)
 		return;
 
@@ -518,7 +539,8 @@ drmmode_output_init(ScrnInfoPtr pScrn, drmmode_ptr drmmode, int num)
 		return;
 	}
 
-	snprintf(name, 32, "%s%d", output_names[koutput->connector_type], koutput->connector_type_id);
+	snprintf(name, 32, "%s%d", output_names[koutput->connector_type],
+		 koutput->connector_type_id);
 
 	output = xf86OutputCreate (pScrn, &drmmode_output_funcs, name);
 	if (!output) {
@@ -550,7 +572,8 @@ drmmode_output_init(ScrnInfoPtr pScrn, drmmode_ptr drmmode, int num)
 	return;
 }
 
-Bool drmmode_pre_init(ScrnInfoPtr pScrn, drmmode_ptr drmmode, char *busId, char *driver_name, int cpp)
+Bool drmmode_pre_init(ScrnInfoPtr pScrn, drmmode_ptr drmmode, char *busId,
+		      char *driver_name, int cpp)
 {
 	xf86CrtcConfigPtr   xf86_config;
 	int i;
@@ -576,7 +599,8 @@ Bool drmmode_pre_init(ScrnInfoPtr pScrn, drmmode_ptr drmmode, char *busId, char
 	if (!drmmode->mode_res)
 		return FALSE;
 
-	xf86CrtcSetSizeRange(pScrn, 320, 200, drmmode->mode_res->max_width, drmmode->mode_res->max_height);
+	xf86CrtcSetSizeRange(pScrn, 320, 200, drmmode->mode_res->max_width,
+			     drmmode->mode_res->max_height);
 	for (i = 0; i < drmmode->mode_res->count_crtcs; i++)
 		drmmode_crtc_init(pScrn, drmmode, i);
 
@@ -589,14 +613,16 @@ Bool drmmode_pre_init(ScrnInfoPtr pScrn, drmmode_ptr drmmode, char *busId, char
 }
 
 #if 0
-Bool drmmode_set_bufmgr(ScrnInfoPtr pScrn, drmmode_ptr drmmode, dri_bufmgr *bufmgr)
+Bool drmmode_set_bufmgr(ScrnInfoPtr pScrn, drmmode_ptr drmmode,
+			dri_bufmgr *bufmgr)
 {
 	drmmode->bufmgr = bufmgr;
 	return TRUE;
 }
 #endif
 
-void drmmode_set_fb(ScrnInfoPtr scrn, drmmode_ptr drmmode, int width, int height, int pitch, dri_bo *bo)
+void drmmode_set_fb(ScrnInfoPtr scrn, drmmode_ptr drmmode, int width,
+		    int height, int pitch, dri_bo *bo)
 {
 	int ret;
 
@@ -616,23 +642,14 @@ void drmmode_set_fb(ScrnInfoPtr scrn, drmmode_ptr drmmode, int width, int height
 	ErrorF("Add fb id %d %d %d\n", drmmode->fb_id, width, height);
 }
 
-void drmmode_set_cursor(ScrnInfoPtr scrn, drmmode_ptr drmmode, int id, void *ptr, uint32_t handle)
-{
-  	xf86CrtcConfigPtr   xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
-	xf86CrtcPtr crtc = xf86_config->crtc[id];
-	drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
-	
-
-	drmmode_crtc->cursor_handle = handle;
-	drmmode_crtc->cursor_map = ptr;
-}
-
-#if 0
 Bool drmmode_is_rotate_pixmap(ScrnInfoPtr pScrn, pointer pPixData, dri_bo **bo)
 {
-	xf86CrtcConfigPtr	config = XF86_CRTC_CONFIG_PTR (pScrn);
+	xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR (pScrn);
 	int i;
 
+	return FALSE;
+
+#if 0
 	for (i = 0; i < config->num_crtc; i++) {
 		xf86CrtcPtr crtc = config->crtc[i];
 		drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
@@ -646,11 +663,11 @@ Bool drmmode_is_rotate_pixmap(ScrnInfoPtr pScrn, pointer pPixData, dri_bo **bo)
 		}
 	}
 	return FALSE;
-
-}
 #endif
+}
 
-static Bool drmmode_resize_fb(ScrnInfoPtr scrn, drmmode_ptr drmmode, int width, int height)
+static Bool drmmode_resize_fb(ScrnInfoPtr scrn, drmmode_ptr drmmode, int width,
+			      int height)
 {
 	uint32_t handle;
 	int pitch;
@@ -658,7 +675,8 @@ static Bool drmmode_resize_fb(ScrnInfoPtr scrn, drmmode_ptr drmmode, int width,
 
 	return FALSE;
 
-	if (drmmode->mode_fb->width == width && drmmode->mode_fb->height == height)
+	if (drmmode->mode_fb->width == width &&
+	    drmmode->mode_fb->height == height)
 		return TRUE;
 
 	if (!drmmode->create_new_fb)
@@ -668,7 +686,7 @@ static Bool drmmode_resize_fb(ScrnInfoPtr scrn, drmmode_ptr drmmode, int width,
 	if (handle == 0)
 		return FALSE;
 
-	ret = drmModeReplaceFB(drmmode->fd, drmmode->fb_id, 
+	ret = drmModeReplaceFB(drmmode->fd, drmmode->fb_id,
 			       width, height,
 			       scrn->depth, scrn->bitsPerPixel, pitch,
 			       handle);
@@ -680,7 +698,7 @@ static Bool drmmode_resize_fb(ScrnInfoPtr scrn, drmmode_ptr drmmode, int width,
 	drmmode->mode_fb = drmModeGetFB(drmmode->fd, drmmode->fb_id);
 	if (!drmmode->mode_fb)
 		return FALSE;
-	
+
 	return TRUE;
 }
 
diff --git a/src/drmmode_display.h b/src/drmmode_display.h
index 112ee03..fc7c1df 100644
--- a/src/drmmode_display.h
+++ b/src/drmmode_display.h
@@ -33,23 +33,21 @@
 #include "xf86drmMode.h"
 
 typedef struct {
-  int fd;
-  uint32_t fb_id;
-  drmModeResPtr mode_res;
-  drmModeFBPtr mode_fb;
-  int cpp;
-  //  dri_bufmgr *bufmgr;
-
-  uint32_t (*create_new_fb)(ScrnInfoPtr pScrn, int width, int height, int *pitch);
+    int fd;
+    uint32_t fb_id;
+    drmModeResPtr mode_res;
+    drmModeFBPtr mode_fb;
+    int cpp;
+    uint32_t (*create_new_fb)(ScrnInfoPtr pScrn, int width, int height,
+			      int *pitch);
 } drmmode_rec, *drmmode_ptr;
 
 typedef struct {
 
     drmmode_ptr drmmode;
     drmModeCrtcPtr mode_crtc;
-    uint32_t cursor_handle;
-    void *cursor_map;
-  //    dri_bo *rotate_bo;
+    dri_bo *cursor;
+    dri_bo *rotate_bo;
     int rotate_fb_id;
 } drmmode_crtc_private_rec, *drmmode_crtc_private_ptr;
 
@@ -62,10 +60,14 @@ typedef struct {
 } drmmode_output_private_rec, *drmmode_output_private_ptr;
 
 
-extern Bool drmmode_pre_init(ScrnInfoPtr pScrn, drmmode_ptr drmmode, char *busId, char *driver_name, int cpp);
-//extern Bool drmmode_set_bufmgr(ScrnInfoPtr pScrn, drmmode_ptr drmmode, dri_bufmgr *bufmgr);
-extern void drmmode_set_fb(ScrnInfoPtr pScrn, drmmode_ptr drmmode, int width, int height, int pitch, dri_bo *bo);
-//extern Bool drmmode_is_rotate_pixmap(ScrnInfoPtr pScrn, pointer pPixData, dri_bo **bo);
-extern void drmmode_set_cursor(ScrnInfoPtr scrn, drmmode_ptr drmmode, int id, void *ptr, uint32_t handle);
-#endif
-#endif
+extern Bool drmmode_pre_init(ScrnInfoPtr pScrn, drmmode_ptr drmmode,
+			     char *busId, char *driver_name, int cpp);
+extern void drmmode_set_fb(ScrnInfoPtr pScrn, drmmode_ptr drmmode, int width,
+			   int height, int pitch, dri_bo *bo);
+extern Bool drmmode_is_rotate_pixmap(ScrnInfoPtr pScrn, pointer pPixData,
+				     dri_bo **bo);
+extern void drmmode_set_cursor(ScrnInfoPtr scrn, drmmode_ptr drmmode, int id,
+			       void *ptr, uint32_t handle);
+#endif /* XF86DRM_MODE */
+
+#endif /* DRMMODE_DISPLAY_H */
commit 5d78cf7cf0d23f60e6d61a92cbc2065b440027d3
Author: Jesse Barnes <jbarnes at virtuousgeek.org>
Date:   Tue Aug 12 17:56:59 2008 -0700

    Add EXA pixmap management functions for kernel mode setting
    
    Mostly pulled over from the old kernel modesetting code; a few updates were
    necessary.

diff --git a/src/i830.h b/src/i830.h
index 769fd52..3ae9e89 100644
--- a/src/i830.h
+++ b/src/i830.h
@@ -726,6 +726,10 @@ typedef struct _I830Rec {
 unsigned long intel_get_pixmap_offset(PixmapPtr pPix);
 unsigned long intel_get_pixmap_pitch(PixmapPtr pPix);
 
+struct i830_exa_pixmap_priv {
+    dri_bo *bo;
+};
+
 /* Batchbuffer support macros and functions */
 #include "i830_batchbuffer.h"
 
diff --git a/src/i830_exa.c b/src/i830_exa.c
index 25b5370..504bfc1 100644
--- a/src/i830_exa.c
+++ b/src/i830_exa.c
@@ -467,92 +467,147 @@ i830_transform_is_affine (PictTransformPtr t)
 
 static DevPrivateKey exa_pixmap_key = &exa_pixmap_key;
 
+static void *
+I830EXACreatePixmap(ScreenPtr screen, int size, int align)
+{
+    ScrnInfoPtr scrn = xf86Screens[screen->myNum];
+    I830Ptr i830 = I830PTR(scrn);
+    struct i830_exa_pixmap_priv *new_priv;
+
+    new_priv = xcalloc(1, sizeof(struct i830_exa_pixmap_priv));
+    if (!new_priv)
+        return NULL;
+
+    if (size == 0)
+	return new_priv;
+
+    new_priv->bo = dri_bo_alloc(i830->bufmgr, "pixmap", size,
+				i830->accel_pixmap_offset_alignment);
+    if (!new_priv->bo) {
+	xfree(new_priv);
+	return NULL;
+    }
+
+    return new_priv;
+}
+
 static void
-i830_exa_set_pixmap_bo (PixmapPtr pixmap, dri_bo *bo)
+I830EXADestroyPixmap(ScreenPtr pScreen, void *driverPriv)
 {
-    dixSetPrivate(&pixmap->devPrivates, exa_pixmap_key, bo);
+    struct i830_exa_pixmap_priv *priv = driverPriv;
+
+    if (priv->bo)
+	dri_bo_unreference(priv->bo);
+    xfree(priv);
 }
 
-dri_bo *
-i830_exa_get_pixmap_bo (PixmapPtr pixmap)
+static Bool I830EXAPixmapIsOffscreen(PixmapPtr pPix)
 {
-    return dixLookupPrivate(&pixmap->devPrivates, exa_pixmap_key);
+    struct i830_exa_pixmap_priv *driver_priv = exaGetPixmapDriverPrivate(pPix);
+
+    if (driver_priv && driver_priv->bo)
+	return TRUE;
+
+    return FALSE;
 }
 
 static Bool I830EXAPrepareAccess(PixmapPtr pPix, int index)
 {
-    dri_bo *bo = i830_exa_get_pixmap_bo(pPix);
+    ScreenPtr screen = pPix->drawable.pScreen;
+    ScrnInfoPtr scrn = xf86Screens[screen->myNum];
+    I830Ptr i830 = I830PTR(scrn);
+    struct i830_exa_pixmap_priv *driver_priv = exaGetPixmapDriverPrivate(pPix);
 
-    if (bo) {
-	ScreenPtr screen = pPix->drawable.pScreen;
-	ScrnInfoPtr scrn = xf86Screens[screen->myNum];
-	I830Ptr i830 = I830PTR(scrn);
+    if (!driver_priv) {
+	xf86DrvMsg(scrn->scrnIndex, X_WARNING, "%s: no driver private?\n",
+		   __FUNCTION__);
+	return FALSE;
+    }
 
-	intel_batch_flush(scrn);
-	if (i830->need_sync) {
-	    I830Sync(scrn);
-	    i830->need_sync = FALSE;
-	}
-	if (dri_bo_map(bo, 1))
-	    return FALSE;
-        pPix->devPrivate.ptr = bo->virtual;
+    if (!driver_priv->bo) {
+	xf86DrvMsg(scrn->scrnIndex, X_WARNING, "%s: no buffer object?\n",
+		   __FUNCTION__);
+	return TRUE;
     }
+
+    intel_batch_flush(scrn);
+    if (i830->need_sync) {
+	I830Sync(scrn);
+	i830->need_sync = FALSE;
+    }
+    if (dri_bo_map(driver_priv->bo, 1)) {
+	xf86DrvMsg(scrn->scrnIndex, X_WARNING, "%s: bo map failed\n",
+		   __FUNCTION__);
+	return FALSE;
+    }
+    pPix->devPrivate.ptr = driver_priv->bo->virtual;
+
     return TRUE;
 }
 
 static void I830EXAFinishAccess(PixmapPtr pPix, int index)
 {
-    dri_bo *bo = i830_exa_get_pixmap_bo(pPix);
+    ScreenPtr screen = pPix->drawable.pScreen;
+    ScrnInfoPtr scrn = xf86Screens[screen->myNum];
+    I830Ptr i830 = I830PTR(scrn);
+    struct i830_exa_pixmap_priv *driver_priv = exaGetPixmapDriverPrivate(pPix);
 
-    if (bo) {
-	ScreenPtr screen = pPix->drawable.pScreen;
-	ScrnInfoPtr scrn = xf86Screens[screen->myNum];
-	I830Ptr i830 = I830PTR(scrn);
+    if (!driver_priv) {
+	xf86DrvMsg(scrn->scrnIndex, X_WARNING, "%s: no driver private?\n",
+		   __FUNCTION__);
+	return;
+    }
 
-	dri_bo_unmap(bo);
-	pPix->devPrivate.ptr = NULL;
-	if (bo == i830->front_buffer->bo)
-	    i830->need_flush = TRUE;
+    if (!driver_priv->bo) {
+	xf86DrvMsg(scrn->scrnIndex, X_WARNING, "%s: no buffer object?\n",
+		   __FUNCTION__);
+	return;
     }
+
+    dri_bo_unmap(driver_priv->bo);
+    pPix->devPrivate.ptr = NULL;
+    if (driver_priv->bo == i830->front_buffer->bo)
+	i830->need_flush = TRUE;
 }
-#if 0
-static Bool I830EXAModifyPixmapHeader(PixmapPtr pPixmap, int width, int height,
+
+static Bool I830EXAModifyPixmapHeader(PixmapPtr pPix, int width, int height,
 				      int depth, int bitsPerPixel, int devKind,
 				      pointer pPixData)
 {
-    ScreenPtr	pScreen = pPixmap->drawable.pScreen;
+    ScreenPtr	pScreen = pPix->drawable.pScreen;
     ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
     I830Ptr pI830 = I830PTR(pScrn);
-    dri_bo *bo = i830_exa_get_pixmap_bo(pPixmap);
+    struct i830_exa_pixmap_priv *driver_priv = exaGetPixmapDriverPrivate(pPix);
+
+    if (!driver_priv)
+	return FALSE;
 
     if (pI830->use_drm_mode &&
 	drmmode_is_rotate_pixmap(pScrn, pPixData, &driver_priv->bo)) {
 	/* this is a rotate pixmap */
-	dri_bo_unmap(bo);
-	dri_bo_reference(bo);
-        miModifyPixmapHeader(pPixmap, width, height, depth,
+	dri_bo_unmap(driver_priv->bo);
+	dri_bo_reference(driver_priv->bo);
+        miModifyPixmapHeader(pPix, width, height, depth,
 			     bitsPerPixel, devKind, NULL);
     }
 
     if (pPixData == pI830->FbBase + pScrn->fbOffset) {
-	/* this is the front buffer pixmap so set it up as such..*/
-        driver_priv->flags |= I830_EXA_PIXMAP_IS_FRONTBUFFER;
-
-	ErrorF("FRONTBUFFER HANDLE CHANGING %p\n", driver_priv->bo);
-	/* get a reference to the front buffer handle */
 	if (driver_priv->bo)
 		dri_bo_unreference(driver_priv->bo);
-	bo = intel_ttm_bo_create_from_handle(pI830->bufmgr, "front",
-					     pI830->front_buffer->bo->handle);
+	driver_priv->bo =
+	    intel_bo_gem_create_from_name(pI830->bufmgr, "front",
+					  pI830->front_buffer->gem_name);
+	if (!driver_priv->bo)
+	    return FALSE;
 
-	miModifyPixmapHeader(pPixmap, width, height, depth,
+	miModifyPixmapHeader(pPix, width, height, depth,
 			     bitsPerPixel, devKind, NULL);
 
 	return TRUE;
     }
     return FALSE;
 }
-#endif
+
 
 Bool
 I830EXAInit(ScreenPtr pScreen)
@@ -598,6 +653,12 @@ I830EXAInit(ScreenPtr pScreen)
 	pI830->EXADriverPtr->flags = EXA_OFFSCREEN_PIXMAPS | EXA_HANDLES_PIXMAPS;
 	pI830->EXADriverPtr->PrepareAccess = I830EXAPrepareAccess;
 	pI830->EXADriverPtr->FinishAccess = I830EXAFinishAccess;
+#if EXA_VERSION_MINOR >= 4
+	pI830->EXADriverPtr->CreatePixmap = I830EXACreatePixmap;
+	pI830->EXADriverPtr->DestroyPixmap = I830EXADestroyPixmap;
+	pI830->EXADriverPtr->PixmapIsOffscreen = I830EXAPixmapIsOffscreen;
+	pI830->EXADriverPtr->ModifyPixmapHeader = I830EXAModifyPixmapHeader;
+#endif
     }
 
     DPRINTF(PFX, "EXA Mem: memoryBase 0x%x, end 0x%x, offscreen base 0x%x, "
@@ -645,7 +706,8 @@ I830EXAInit(ScreenPtr pScreen)
  	pI830->EXADriverPtr->DoneComposite = i830_done_composite;
     }
 #if EXA_VERSION_MINOR >= 2
-    pI830->EXADriverPtr->PixmapIsOffscreen = i830_exa_pixmap_is_offscreen;
+    if (!pI830->use_drm_mode)
+	pI830->EXADriverPtr->PixmapIsOffscreen = i830_exa_pixmap_is_offscreen;
 #endif
 
     if(!exaDriverInit(pScreen, pI830->EXADriverPtr)) {


More information about the xorg-commit mailing list