diff options
author | Jesse Barnes <jbarnes@virtuousgeek.org> | 2008-08-08 18:11:13 -0700 |
---|---|---|
committer | Jesse Barnes <jbarnes@virtuousgeek.org> | 2008-08-08 18:11:13 -0700 |
commit | 173b909a71955997ed6366e70faebf63fe922a8e (patch) | |
tree | a3e65942bab390647105db99cc9fbb6d6c6f8bee | |
parent | b1aef6f63c151dcb202fce869e4b80598b4b2052 (diff) |
Make it actually build the kernel stuff if possible
Fixup the kernel stuff to have a slightly better chance of working. Still need
to fixup the EXA pixmap functions.
-rw-r--r-- | configure.ac | 10 | ||||
-rw-r--r-- | src/drmmode_display.c | 17 | ||||
-rw-r--r-- | src/drmmode_display.h | 5 | ||||
-rw-r--r-- | src/i830_dri.c | 2 | ||||
-rw-r--r-- | src/i830_driver.c | 48 | ||||
-rw-r--r-- | src/i830_exa.c | 118 | ||||
-rw-r--r-- | src/i830_memory.c | 12 |
7 files changed, 146 insertions, 66 deletions
diff --git a/configure.ac b/configure.ac index 61202271..87dad694 100644 --- a/configure.ac +++ b/configure.ac @@ -85,12 +85,16 @@ XORG_DRIVER_CHECK_EXT(DPMSExtension, xextproto) # Checks for pkg-config packages PKG_CHECK_MODULES(XORG, [xorg-server xproto fontsproto $REQUIRED_MODULES]) sdkdir=$(pkg-config --variable=sdkdir xorg-server) +drm_cflags=$(pkg-config --cflags libdrm) # Checks for libraries. # Checks for header files. AC_HEADER_STDC +save_CFLAGS="$CFLAGS" +CFLAGS="$XORG_CFLAGS $DRI_CFLAGS $drm_cflags" +CPPFLAGS="$XORG_CFLAGS $DRI_CFLAGS $drm_cflags" AC_MSG_CHECKING([whether to include DRI support]) if test x$DRI = xauto; then AC_CHECK_FILE([${sdkdir}/dri.h], @@ -101,7 +105,9 @@ if test x$DRI = xauto; then [have_dristruct_h="yes"], [have_dristruct_h="no"]) AC_CHECK_FILE([${sdkdir}/damage.h], [have_damage_h="yes"], [have_damage_h="no"]) - AC_CHECK_HEADER(xf86drmMode.h,[DRM_MODE=yes],[DRM_MODE=no],[#include "stdint.h"]) + AC_CHECK_HEADER(xf86drmMode.h, + [DRM_MODE=yes],[DRM_MODE=no] + [#include "stdint.h"]) if test "x$DRM_MODE" = xyes; then AC_DEFINE(XF86DRM_MODE,1,[DRM kernel modesetting]) fi @@ -116,8 +122,6 @@ if test x$DRI = xauto; then fi AC_MSG_RESULT([$DRI]) -save_CFLAGS="$CFLAGS" -CFLAGS="$XORG_CFLAGS" AC_CHECK_HEADER(xf86Modes.h,[XMODES=yes],[XMODES=no],[#include "xorg-server.h"]) AC_CHECK_DECL(XSERVER_LIBPCIACCESS, [XSERVER_LIBPCIACCESS=yes],[XSERVER_LIBPCIACCESS=no], diff --git a/src/drmmode_display.c b/src/drmmode_display.c index b329090a..5bbb97c3 100644 --- a/src/drmmode_display.c +++ b/src/drmmode_display.c @@ -30,7 +30,7 @@ #endif #ifdef XF86DRM_MODE -#include "radeon.h" +#include "i830.h" #include "sarea.h" static Bool drmmode_resize_fb(ScrnInfoPtr scrn, drmmode_ptr drmmode, int width, int height); @@ -208,9 +208,6 @@ static void drmmode_load_cursor_argb (xf86CrtcPtr crtc, CARD32 *image) { drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private; - drmmode_ptr drmmode = drmmode_crtc->drmmode; - - int ret; void *ptr; /* cursor should be mapped already */ @@ -246,7 +243,6 @@ drmmode_crtc_shadow_allocate(xf86CrtcPtr crtc, int width, int height) { drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private; drmmode_ptr drmmode = drmmode_crtc->drmmode; - int ret; int size; unsigned long rotate_pitch; @@ -309,7 +305,6 @@ static void drmmode_crtc_shadow_destroy(xf86CrtcPtr crtc, PixmapPtr rotate_pixmap, void *data) { drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private; - drmmode_ptr drmmode = drmmode_crtc->drmmode; if (rotate_pixmap) FreeScratchPixmapHeader(rotate_pixmap); @@ -354,9 +349,6 @@ drmmode_crtc_init(ScrnInfoPtr pScrn, drmmode_ptr drmmode, int num) { xf86CrtcPtr crtc; drmmode_crtc_private_ptr drmmode_crtc; - int cursor_size = 64 * 64 * 4; - uint32_t mask; - int ret; crtc = xf86CrtcCreate(pScrn, &drmmode_crtc_funcs); if (crtc == NULL) @@ -604,15 +596,16 @@ Bool drmmode_set_bufmgr(ScrnInfoPtr pScrn, drmmode_ptr drmmode, dri_bufmgr *bufm } #endif -void drmmode_set_fb(ScrnInfoPtr scrn, drmmode_ptr drmmode, int width, int height, int pitch, uint32_t handle) +void drmmode_set_fb(ScrnInfoPtr scrn, drmmode_ptr drmmode, int width, int height, int pitch, dri_bo *bo) { int ret; ret = drmModeAddFB(drmmode->fd, width, height, scrn->depth, - scrn->bitsPerPixel, pitch, handle, &drmmode->fb_id); + scrn->bitsPerPixel, pitch, bo->handle, + &drmmode->fb_id); if (ret) { - ErrorF("Failed to add fb\n"); + ErrorF("Failed to add fb: %s\n", strerror(-ret)); } drmmode->mode_fb = drmModeGetFB(drmmode->fd, drmmode->fb_id); diff --git a/src/drmmode_display.h b/src/drmmode_display.h index 59e6307a..112ee034 100644 --- a/src/drmmode_display.h +++ b/src/drmmode_display.h @@ -29,11 +29,12 @@ #ifdef XF86DRM_MODE +#include "dri_bufmgr.h" #include "xf86drmMode.h" typedef struct { int fd; - int fb_id; + uint32_t fb_id; drmModeResPtr mode_res; drmModeFBPtr mode_fb; int cpp; @@ -63,7 +64,7 @@ typedef struct { 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, uint32_t handle); +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 diff --git a/src/i830_dri.c b/src/i830_dri.c index 9d7271ea..ca3bc621 100644 --- a/src/i830_dri.c +++ b/src/i830_dri.c @@ -159,7 +159,7 @@ I830InitDma(ScrnInfoPtr pScrn) info.func = I830_INIT_DMA; /* Initialize fields that are used in the absence of GEM */ - if (!pI830->memory_manager) { + if (!pI830->memory_manager && !pI830->use_drm_mode) { info.ring_start = ring->mem->offset + pI830->LinearAddr; info.ring_end = ring->mem->end + pI830->LinearAddr; info.ring_size = ring->mem->size; diff --git a/src/i830_driver.c b/src/i830_driver.c index 01073fe7..26811352 100644 --- a/src/i830_driver.c +++ b/src/i830_driver.c @@ -1668,7 +1668,7 @@ I830DrmModeInit(ScrnInfoPtr pScrn) pI830->directRenderingDisabled = FALSE; pI830->allocate_classic_textures = FALSE; - I830InitBufMgr(pScrn); + i830_init_bufmgr(pScrn); #endif return TRUE; @@ -1860,7 +1860,9 @@ I830PreInit(ScrnInfoPtr pScrn, int flags) if (!xf86SetDefaultVisual(pScrn, -1)) return FALSE; - hwp = VGAHWPTR(pScrn); + if (!pI830->use_drm_mode) + hwp = VGAHWPTR(pScrn); + pI830->cpp = pScrn->bitsPerPixel / 8; pI830->preinit = TRUE; @@ -1873,9 +1875,10 @@ I830PreInit(ScrnInfoPtr pScrn, int flags) I830PreInitCrtcConfig(pScrn); - if (pI830->use_drm_mode && !I830DrmModeInit(pScrn)) - return FALSE; - else if (!I830AccelMethodInit(pScrn)) + if (pI830->use_drm_mode) { + if (!I830DrmModeInit(pScrn)) + return FALSE; + } else if (!I830AccelMethodInit(pScrn)) return FALSE; I830XvInit(pScrn); @@ -2910,9 +2913,10 @@ i830_init_bufmgr(ScrnInfoPtr pScrn) { I830Ptr pI830 = I830PTR(pScrn); - if (pI830->bufmgr) return; + if (pI830->bufmgr) + return; - if (pI830->memory_manager) { + if (pI830->memory_manager || pI830->use_drm_mode) { int batch_size; batch_size = 4096 * 4; @@ -3093,30 +3097,10 @@ I830ScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv) if (pI830->use_drm_mode) { #ifdef XF86DRM_MODE - uint64_t size; - int ret; - ret = drmMMInfo(pI830->drmSubFD, DRM_BO_MEM_VRAM, &size); - if (ret) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "Kernel memory manager has no VRAM allocation\n"); - return FALSE; - } - pI830->stolen_size = size * GTT_PAGE_SIZE; - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Kernel stolen allocator is %dkb\n", - pI830->stolen_size / KB(1)); - - ret = drmMMInfo(pI830->drmSubFD, DRM_BO_MEM_TT, &size); - if (ret) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "Kernel memory manager has no TT allocation\n"); - return FALSE; - } - pScrn->videoRam = (size * GTT_PAGE_SIZE) / KB(1); - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Kernel AGP allocator is %dkb\n", pScrn->videoRam); + pI830->stolen_size = 0; + pScrn->videoRam = ~0UL / KB(1); #endif - } else { + } else { I830AdjustMemory(pScreen); } @@ -3308,7 +3292,6 @@ I830ScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv) DPRINTF(PFX, "assert( if(!I830MapMem(pScrn)) )\n"); if (!I830MapMem(pScrn)) return FALSE; - pScrn->memPhysBase = (unsigned long)pI830->FbBase; } @@ -3443,7 +3426,7 @@ I830ScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv) #ifdef I830_XV /* Init video */ - if (pI830->XvEnabled) + if (pI830->XvEnabled && !pI830->use_drm_mode) I830InitVideo(pScreen); #endif @@ -3682,7 +3665,6 @@ I830EnterVT(int scrnIndex, int flags) if (pI830->power_context) OUTREG(PWRCTXA, pI830->power_context->offset | PWRCTX_EN); - /* Clear the framebuffer */ memset(pI830->FbBase + pScrn->fbOffset, 0, pScrn->virtualY * pScrn->displayWidth * pI830->cpp); diff --git a/src/i830_exa.c b/src/i830_exa.c index 20417410..25b53705 100644 --- a/src/i830_exa.c +++ b/src/i830_exa.c @@ -465,16 +465,104 @@ i830_transform_is_affine (PictTransformPtr t) return t->matrix[2][0] == 0 && t->matrix[2][1] == 0; } -/* - * TODO: - * - Dual head? - */ +static DevPrivateKey exa_pixmap_key = &exa_pixmap_key; + +static void +i830_exa_set_pixmap_bo (PixmapPtr pixmap, dri_bo *bo) +{ + dixSetPrivate(&pixmap->devPrivates, exa_pixmap_key, bo); +} + +dri_bo * +i830_exa_get_pixmap_bo (PixmapPtr pixmap) +{ + return dixLookupPrivate(&pixmap->devPrivates, exa_pixmap_key); +} + +static Bool I830EXAPrepareAccess(PixmapPtr pPix, int index) +{ + dri_bo *bo = i830_exa_get_pixmap_bo(pPix); + + if (bo) { + ScreenPtr screen = pPix->drawable.pScreen; + ScrnInfoPtr scrn = xf86Screens[screen->myNum]; + I830Ptr i830 = I830PTR(scrn); + + 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; + } + return TRUE; +} + +static void I830EXAFinishAccess(PixmapPtr pPix, int index) +{ + dri_bo *bo = i830_exa_get_pixmap_bo(pPix); + + if (bo) { + ScreenPtr screen = pPix->drawable.pScreen; + ScrnInfoPtr scrn = xf86Screens[screen->myNum]; + I830Ptr i830 = I830PTR(scrn); + + dri_bo_unmap(bo); + pPix->devPrivate.ptr = NULL; + if (bo == i830->front_buffer->bo) + i830->need_flush = TRUE; + } +} +#if 0 +static Bool I830EXAModifyPixmapHeader(PixmapPtr pPixmap, int width, int height, + int depth, int bitsPerPixel, int devKind, + pointer pPixData) +{ + ScreenPtr pScreen = pPixmap->drawable.pScreen; + ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; + I830Ptr pI830 = I830PTR(pScrn); + dri_bo *bo = i830_exa_get_pixmap_bo(pPixmap); + + 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, + 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); + + miModifyPixmapHeader(pPixmap, width, height, depth, + bitsPerPixel, devKind, NULL); + + return TRUE; + } + return FALSE; +} +#endif + Bool I830EXAInit(ScreenPtr pScreen) { ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; I830Ptr pI830 = I830PTR(pScrn); + if (!dixRequestPrivate(exa_pixmap_key, 0)) + return FALSE; + pI830->EXADriverPtr = exaDriverAlloc(); if (pI830->EXADriverPtr == NULL) { pI830->accel = ACCEL_NONE; @@ -495,16 +583,22 @@ I830EXAInit(ScreenPtr pScreen) "EXA compatibility mode. Output rotation rendering " "performance may suffer\n"); #endif - pI830->EXADriverPtr->memoryBase = pI830->FbBase; - if (pI830->exa_offscreen) { - pI830->EXADriverPtr->offScreenBase = pI830->exa_offscreen->offset; - pI830->EXADriverPtr->memorySize = pI830->exa_offscreen->offset + - pI830->exa_offscreen->size; + if (!pI830->use_drm_mode) { + pI830->EXADriverPtr->memoryBase = pI830->FbBase; + if (pI830->exa_offscreen) { + pI830->EXADriverPtr->offScreenBase = pI830->exa_offscreen->offset; + pI830->EXADriverPtr->memorySize = pI830->exa_offscreen->offset + + pI830->exa_offscreen->size; + } else { + pI830->EXADriverPtr->offScreenBase = pI830->FbMapSize; + pI830->EXADriverPtr->memorySize = pI830->FbMapSize; + } + pI830->EXADriverPtr->flags = EXA_OFFSCREEN_PIXMAPS; } else { - pI830->EXADriverPtr->offScreenBase = pI830->FbMapSize; - pI830->EXADriverPtr->memorySize = pI830->FbMapSize; + pI830->EXADriverPtr->flags = EXA_OFFSCREEN_PIXMAPS | EXA_HANDLES_PIXMAPS; + pI830->EXADriverPtr->PrepareAccess = I830EXAPrepareAccess; + pI830->EXADriverPtr->FinishAccess = I830EXAFinishAccess; } - pI830->EXADriverPtr->flags = EXA_OFFSCREEN_PIXMAPS; DPRINTF(PFX, "EXA Mem: memoryBase 0x%x, end 0x%x, offscreen base 0x%x, " "memorySize 0x%x\n", diff --git a/src/i830_memory.c b/src/i830_memory.c index 57b9d275..fe709081 100644 --- a/src/i830_memory.c +++ b/src/i830_memory.c @@ -741,6 +741,8 @@ 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); @@ -757,7 +759,7 @@ i830_allocate_memory_bo(ScrnInfoPtr pScrn, const char *name, mem->lifetime_fixed_offset = TRUE; /* Bind it if we currently control the VT */ - if (pScrn->vtSema) { + if (pScrn->vtSema || pI830->use_drm_mode) { if (!i830_bind_memory(pScrn, mem)) { dri_bo_unreference (mem->bo); xfree(mem->name); @@ -1227,8 +1229,10 @@ i830_allocate_framebuffer(ScrnInfoPtr pScrn, I830Ptr pI830, BoxPtr FbMemBox, if (pI830->use_drm_mode) { #ifdef XF86DRM_MODE + ErrorF("setting kernel fb to new front buffer\n"); + ErrorF("front_buffer->bo->size: %ld\n", front_buffer->bo->size); drmmode_set_fb(pScrn, &pI830->drmmode, pScrn->virtualX, fb_height, - pScrn->displayWidth * pI830->cpp, &front_buffer->bo); + pScrn->displayWidth * pI830->cpp, front_buffer->bo); #endif } else if (pI830->FbBase) memset (pI830->FbBase + front_buffer->offset, 0, size); @@ -1986,12 +1990,14 @@ i830_bind_all_memory(ScrnInfoPtr pScrn) for (mem = pI830->memory_list->next; mem->next != NULL; mem = mem->next) { - if (!i830_bind_memory(pScrn, mem)) { + if (!mem->bound && !i830_bind_memory(pScrn, mem)) { /* This shouldn't happen */ FatalError("Couldn't bind memory for %s\n", mem->name); } } for (mem = pI830->bo_list; mem != NULL; mem = mem->next) { + if (mem->bound) + continue; if (!mem->lifetime_fixed_offset && !i830_bind_memory(pScrn, mem)) FatalError("Couldn't bind memory for BO %s\n", mem->name); } |