diff -up xf86-video-ati-6.12.2/configure.ac.dave xf86-video-ati-6.12.2/configure.ac --- xf86-video-ati-6.12.2/configure.ac.dave 2009-06-25 15:55:13.000000000 +1000 +++ xf86-video-ati-6.12.2/configure.ac 2009-06-25 15:55:27.000000000 +1000 @@ -117,7 +117,7 @@ if test "$DRI" = yes; then fi save_CFLAGS="$CFLAGS" - CFLAGS="$XORG_CFLAGS $DRI_CFLAGS" + CFLAGS="$XORG_CFLAGS $DRI_CFLAGS $CFLAGS" AC_CHECK_HEADER(xf86drmMode.h,[DRM_MODE=yes],[DRM_MODE=no],[#include #include ]) if test "x$DRM_MODE" = xyes; then @@ -348,3 +348,25 @@ AC_OUTPUT([ src/Makefile man/Makefile ]) + +dnl +dnl Output some configuration info for the user +dnl +echo "" +echo " prefix: $prefix" +echo " exec_prefix: $exec_prefix" +echo " libdir: $libdir" +echo " includedir: $includedir" + + +echo "" +echo " Kernel modesetting: $DRM_MODE" + +echo "" +echo " CFLAGS: $CFLAGS" +echo " CXXFLAGS: $CXXFLAGS" +echo " Macros: $DEFINES" + +echo "" +echo " Run '${MAKE-make}' to build xf86-video-ati" +echo "" diff -up xf86-video-ati-6.12.2/src/radeon_accel.c.dave xf86-video-ati-6.12.2/src/radeon_accel.c --- xf86-video-ati-6.12.2/src/radeon_accel.c.dave 2009-06-25 15:55:13.000000000 +1000 +++ xf86-video-ati-6.12.2/src/radeon_accel.c 2009-06-25 15:55:27.000000000 +1000 @@ -425,6 +425,24 @@ void RADEONEngineRestore(ScrnInfoPtr pSc info->accel_state->XInited3D = FALSE; } +static int RADEONDRMGetNumPipes(ScrnInfoPtr pScrn, int *num_pipes) +{ + RADEONInfoPtr info = RADEONPTR(pScrn); + if (info->dri->pKernelDRMVersion->version_major < 2) { + drm_radeon_getparam_t np; + + memset(&np, 0, sizeof(np)); + np.param = RADEON_PARAM_NUM_GB_PIPES; + np.value = num_pipes; + return drmCommandWriteRead(info->dri->drmFD, DRM_RADEON_GETPARAM, &np, sizeof(np)); + } else { + struct drm_radeon_info np2; + np2.value = (uint64_t)num_pipes; + np2.request = RADEON_INFO_NUM_GB_PIPES; + return drmCommandWriteRead(info->dri->drmFD, DRM_RADEON_INFO, &np2, sizeof(np2)); + } +} + /* Initialize the acceleration hardware */ void RADEONEngineInit(ScrnInfoPtr pScrn) { @@ -440,15 +458,9 @@ void RADEONEngineInit(ScrnInfoPtr pScrn) #ifdef XF86DRI if ((info->directRenderingEnabled || info->drm_mode_setting) && (IS_R300_3D || IS_R500_3D)) { - drm_radeon_getparam_t np; int num_pipes; - memset(&np, 0, sizeof(np)); - np.param = RADEON_PARAM_NUM_GB_PIPES; - np.value = &num_pipes; - - if (drmCommandWriteRead(info->dri->drmFD, DRM_RADEON_GETPARAM, &np, - sizeof(np)) < 0) { + if(RADEONDRMGetNumPipes(pScrn, &num_pipes) < 0) { xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "Failed to determine num pipes from DRM, falling back to " "manual look-up!\n"); diff -up xf86-video-ati-6.12.2/src/radeon_commonfuncs.c.dave xf86-video-ati-6.12.2/src/radeon_commonfuncs.c --- xf86-video-ati-6.12.2/src/radeon_commonfuncs.c.dave 2009-06-25 15:55:13.000000000 +1000 +++ xf86-video-ati-6.12.2/src/radeon_commonfuncs.c 2009-06-25 15:55:27.000000000 +1000 @@ -82,6 +82,7 @@ static void FUNC_NAME(RADEONInit3DEngine case 1: gb_tile_config |= R300_PIPE_COUNT_RV350; break; } + if (info->dri->pKernelDRMVersion->version_major < 2) { size = (info->ChipFamily >= CHIP_FAMILY_R420) ? 5 : 4; BEGIN_ACCEL(size); OUT_ACCEL_REG(R300_GB_TILE_CONFIG, gb_tile_config); @@ -91,13 +92,16 @@ static void FUNC_NAME(RADEONInit3DEngine OUT_ACCEL_REG(R300_GB_SELECT, 0); OUT_ACCEL_REG(R300_GB_ENABLE, 0); FINISH_ACCEL(); + } if (IS_R500_3D) { su_reg_dest = ((1 << info->accel_state->num_gb_pipes) - 1); + if (info->dri->pKernelDRMVersion->version_major < 2) { BEGIN_ACCEL(2); OUT_ACCEL_REG(R500_SU_REG_DEST, su_reg_dest); OUT_ACCEL_REG(R500_VAP_INDEX_OFFSET, 0); FINISH_ACCEL(); + } } BEGIN_ACCEL(3); @@ -106,10 +110,13 @@ static void FUNC_NAME(RADEONInit3DEngine OUT_ACCEL_REG(RADEON_WAIT_UNTIL, RADEON_WAIT_2D_IDLECLEAN | RADEON_WAIT_3D_IDLECLEAN); FINISH_ACCEL(); - BEGIN_ACCEL(5); + BEGIN_ACCEL(3); OUT_ACCEL_REG(R300_GB_AA_CONFIG, 0); OUT_ACCEL_REG(R300_RB3D_DSTCACHE_CTLSTAT, R300_DC_FLUSH_3D | R300_DC_FREE_3D); OUT_ACCEL_REG(R300_RB3D_ZCACHE_CTLSTAT, R300_ZC_FLUSH | R300_ZC_FREE); + FINISH_ACCEL(); + if (info->dri->pKernelDRMVersion->version_major < 2) { + BEGIN_ACCEL(3); OUT_ACCEL_REG(R300_GB_MSPOS0, ((6 << R300_MS_X0_SHIFT) | (6 << R300_MS_Y0_SHIFT) | (6 << R300_MS_X1_SHIFT) | @@ -125,10 +132,11 @@ static void FUNC_NAME(RADEONInit3DEngine (6 << R300_MS_X5_SHIFT) | (6 << R300_MS_Y5_SHIFT) | (6 << R300_MSBD1_SHIFT))); + OUT_ACCEL_REG(R300_GA_ENHANCE, R300_GA_DEADLOCK_CNTL | R300_GA_FASTSYNC_CNTL); FINISH_ACCEL(); + } - BEGIN_ACCEL(5); - OUT_ACCEL_REG(R300_GA_ENHANCE, R300_GA_DEADLOCK_CNTL | R300_GA_FASTSYNC_CNTL); + BEGIN_ACCEL(4); OUT_ACCEL_REG(R300_GA_POLY_MODE, R300_FRONT_PTYPE_TRIANGE | R300_BACK_PTYPE_TRIANGE); OUT_ACCEL_REG(R300_GA_ROUND_MODE, (R300_GEOMETRY_ROUND_NEAREST | R300_COLOR_ROUND_NEAREST)); diff -up xf86-video-ati-6.12.2/src/radeon_dri2.c.dave xf86-video-ati-6.12.2/src/radeon_dri2.c --- xf86-video-ati-6.12.2/src/radeon_dri2.c.dave 2009-06-25 15:55:13.000000000 +1000 +++ xf86-video-ati-6.12.2/src/radeon_dri2.c 2009-06-25 15:55:27.000000000 +1000 @@ -36,15 +36,22 @@ #include "radeon.h" #include "radeon_dri2.h" +#include "radeon_bufmgr_gem.h" #include "radeon_version.h" #ifdef DRI2 +#if DRI2INFOREC_VERSION >= 1 +#define USE_DRI2_1_1_0 +#endif + struct dri2_buffer_priv { PixmapPtr pixmap; + unsigned int attachment; }; +#ifndef USE_DRI2_1_1_0 static DRI2BufferPtr radeon_dri2_create_buffers(DrawablePtr drawable, unsigned int *attachments, @@ -103,12 +110,81 @@ radeon_dri2_create_buffers(DrawablePtr d buffers[i].pitch = pixmap->devKind; buffers[i].cpp = pixmap->drawable.bitsPerPixel / 8; buffers[i].driverPrivate = &privates[i]; - buffers[i].flags = 0; /* not tiled */ + buffers[i].flags = 0; privates[i].pixmap = pixmap; + privates[i].attachment = attachments[i]; } return buffers; } +#else +static DRI2BufferPtr +radeon_dri2_create_buffer(DrawablePtr drawable, + unsigned int attachment, + unsigned int format) +{ + ScreenPtr pScreen = drawable->pScreen; + DRI2BufferPtr buffers; + struct dri2_buffer_priv *privates; + PixmapPtr pixmap, depth_pixmap; + struct radeon_exa_pixmap_priv *driver_priv; + int r; + buffers = xcalloc(1, sizeof *buffers); + if (buffers == NULL) { + return NULL; + } + privates = xcalloc(1, sizeof(struct dri2_buffer_priv)); + if (privates == NULL) { + xfree(buffers); + return NULL; + } + + depth_pixmap = NULL; + + if (attachment == DRI2BufferFrontLeft) { + if (drawable->type == DRAWABLE_PIXMAP) { + pixmap = (PixmapPtr)drawable; + } else { + pixmap = (*pScreen->GetWindowPixmap)((WindowPtr)drawable); + } + pixmap->refcnt++; + } else if (attachment == DRI2BufferStencil && depth_pixmap) { + pixmap = depth_pixmap; + pixmap->refcnt++; + } else { + pixmap = (*pScreen->CreatePixmap)(pScreen, + drawable->width, + drawable->height, + (format != 0)?format:drawable->depth, + 0); + } + + if (attachment == DRI2BufferDepth) { + depth_pixmap = pixmap; + } + driver_priv = exaGetPixmapDriverPrivate(pixmap); + r = radeon_bo_gem_name_buffer(driver_priv->bo, &buffers->name); + if (r) { + /* FIXME: cleanup */ + fprintf(stderr, "flink error: %d %s\n", r, strerror(r)); + xfree(buffers); + xfree(privates); + return NULL; + } + buffers->attachment = attachment; + buffers->pitch = pixmap->devKind; + buffers->cpp = pixmap->drawable.bitsPerPixel / 8; + buffers->driverPrivate = privates; + buffers->format = format; + buffers->flags = 0; /* not tiled */ + privates->pixmap = pixmap; + privates->attachment = attachment; + + return buffers; +} +#endif + +#ifndef USE_DRI2_1_1_0 static void radeon_dri2_destroy_buffers(DrawablePtr drawable, DRI2BufferPtr buffers, @@ -127,6 +203,23 @@ radeon_dri2_destroy_buffers(DrawablePtr xfree(buffers); } } +#else +static void +radeon_dri2_destroy_buffer(DrawablePtr drawable, DRI2BufferPtr buffers) +{ + if(buffers) + { + ScreenPtr pScreen = drawable->pScreen; + struct dri2_buffer_priv *private; + + private = buffers->driverPrivate; + (*pScreen->DestroyPixmap)(private->pixmap); + + xfree(buffers->driverPrivate); + xfree(buffers); + } +} +#endif static void radeon_dri2_copy_region(DrawablePtr drawable, @@ -134,19 +227,29 @@ radeon_dri2_copy_region(DrawablePtr draw DRI2BufferPtr dest_buffer, DRI2BufferPtr src_buffer) { - struct dri2_buffer_priv *private = src_buffer->driverPrivate; + struct dri2_buffer_priv *src_private = src_buffer->driverPrivate; + struct dri2_buffer_priv *dst_private = dest_buffer->driverPrivate; ScreenPtr pScreen = drawable->pScreen; ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; - PixmapPtr pixmap = private->pixmap; + PixmapPtr src_pixmap; + PixmapPtr dst_pixmap; RegionPtr copy_clip; GCPtr gc; + src_pixmap = src_private->pixmap; + dst_pixmap = dst_private->pixmap; + if (src_private->attachment == DRI2BufferFrontLeft) { + src_pixmap = (PixmapPtr)drawable; + } + if (dst_private->attachment == DRI2BufferFrontLeft) { + dst_pixmap = (PixmapPtr)drawable; + } gc = GetScratchGC(drawable->depth, pScreen); copy_clip = REGION_CREATE(pScreen, NULL, 0); REGION_COPY(pScreen, copy_clip, region); (*gc->funcs->ChangeClip) (gc, CT_REGION, copy_clip, 0); - ValidateGC(drawable, gc); - (*gc->ops->CopyArea)(&pixmap->drawable, drawable, gc, + ValidateGC(&dst_pixmap->drawable, gc); + (*gc->ops->CopyArea)(&src_pixmap->drawable, &dst_pixmap->drawable, gc, 0, 0, drawable->width, drawable->height, 0, 0); FreeScratchGC(gc); RADEONCPReleaseIndirect(pScrn); @@ -207,16 +310,21 @@ radeon_dri2_screen_init(ScreenPtr pScree } dri2_info.fd = info->dri2.drm_fd; dri2_info.deviceName = info->dri2.device_name; +#ifndef USE_DRI2_1_1_0 dri2_info.version = 1; dri2_info.CreateBuffers = radeon_dri2_create_buffers; dri2_info.DestroyBuffers = radeon_dri2_destroy_buffers; +#else + dri2_info.version = 2; + dri2_info.CreateBuffer = radeon_dri2_create_buffer; + dri2_info.DestroyBuffer = radeon_dri2_destroy_buffer; +#endif dri2_info.CopyRegion = radeon_dri2_copy_region; info->dri2.enabled = DRI2ScreenInit(pScreen, &dri2_info); return info->dri2.enabled; } -void -radeon_dri2_close_screen(ScreenPtr pScreen) +void radeon_dri2_close_screen(ScreenPtr pScreen) { DRI2CloseScreen(pScreen); } diff -up xf86-video-ati-6.12.2/src/radeon_driver.c.dave xf86-video-ati-6.12.2/src/radeon_driver.c --- xf86-video-ati-6.12.2/src/radeon_driver.c.dave 2009-06-25 15:55:13.000000000 +1000 +++ xf86-video-ati-6.12.2/src/radeon_driver.c 2009-06-25 15:55:27.000000000 +1000 @@ -2816,15 +2816,23 @@ static Bool radeon_kernel_mode_enabled(S pEnt = xf86GetEntityInfo(pScrn->entityList[0]); PciInfo = xf86GetPciInfoForEntity(pEnt->index); - if (!xf86LoaderCheckSymbol("DRICreatePCIBusID")) + if (!xf86LoaderCheckSymbol("DRICreatePCIBusID")) { + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, RADEON_LOGLEVEL_DEBUG, + "[KMS] No DRICreatePCIBusID symbol, no kernel modesetting.\n"); return FALSE; + } busIdString = DRICreatePCIBusID(PciInfo); ret = drmCheckModesettingSupported(busIdString); xfree(busIdString); - if (ret) + if (ret) { + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, RADEON_LOGLEVEL_DEBUG, + "[KMS] drm report modesetting isn't supported.\n"); return FALSE; + } + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, RADEON_LOGLEVEL_DEBUG, + "[KMS] Kernel modesetting enabled.\n"); return TRUE; } #else @@ -3116,6 +3124,12 @@ Bool RADEONPreInit(ScrnInfoPtr pScrn, in info->dri2.drm_fd = info->drmmode.fd; info->dri2.enabled = FALSE; xfree(bus_id); + info->dri->pKernelDRMVersion = drmGetVersion(info->dri->drmFD); + if (info->dri->pKernelDRMVersion == NULL) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "RADEONDRIGetVersion failed to get the DRM version\n"); + goto fail; + } { struct drm_radeon_gem_info mminfo; @@ -3127,6 +3141,7 @@ Bool RADEONPreInit(ScrnInfoPtr pScrn, in ErrorF("initing gart:%llx vram: s:%llx v:%llx\n", mminfo.gart_size, mminfo.vram_size, mminfo.vram_visible); } + if (info->dri == NULL || info->dri->pKernelDRMVersion->version_major < 2) { struct drm_radeon_getparam gp; int value; diff -up xf86-video-ati-6.12.2/src/radeon_exa_render.c.dave xf86-video-ati-6.12.2/src/radeon_exa_render.c --- xf86-video-ati-6.12.2/src/radeon_exa_render.c.dave 2009-06-25 15:55:13.000000000 +1000 +++ xf86-video-ati-6.12.2/src/radeon_exa_render.c 2009-06-25 15:55:27.000000000 +1000 @@ -2163,16 +2163,23 @@ static Bool FUNC_NAME(R300PrepareComposi } /* Clear out scissoring */ + if (IS_R300_3D) { BEGIN_ACCEL(2); - if (IS_R300_3D) - OUT_ACCEL_REG(R300_SC_SCISSOR0, ((1440 << R300_SCISSOR_X_SHIFT) | - (1440 << R300_SCISSOR_Y_SHIFT))); - else - OUT_ACCEL_REG(R300_SC_SCISSOR0, ((0 << R300_SCISSOR_X_SHIFT) | - (0 << R300_SCISSOR_Y_SHIFT))); - OUT_ACCEL_REG(R300_SC_SCISSOR1, ((8191 << R300_SCISSOR_X_SHIFT) | - (8191 << R300_SCISSOR_Y_SHIFT))); + OUT_ACCEL_REG(R300_SC_SCISSOR0, ((1440 << R300_SCISSOR_X_SHIFT) | + (1440 << R300_SCISSOR_Y_SHIFT))); + OUT_ACCEL_REG(R300_SC_SCISSOR1, + (((pDst->drawable.width + 1440 - 1) << R300_SCISSOR_X_SHIFT) | + ((pDst->drawable.height + 1440 - 1) << R300_SCISSOR_Y_SHIFT))); FINISH_ACCEL(); + } else { + BEGIN_ACCEL(2); + OUT_ACCEL_REG(R300_SC_SCISSOR0, ((0 << R300_SCISSOR_X_SHIFT) | + (0 << R300_SCISSOR_Y_SHIFT))); + OUT_ACCEL_REG(R300_SC_SCISSOR1, + (((pDst->drawable.width - 1) << R300_SCISSOR_X_SHIFT) | + ((pDst->drawable.height - 1) << R300_SCISSOR_Y_SHIFT))); + FINISH_ACCEL(); + } qwords = info->new_cs ? 4 : 3; BEGIN_ACCEL(qwords);