On Monday, December 29, 2008 1:08 am Dave Airlie wrote:
> From: Dave Airlie <[email protected]>
>
> The gem gtt mapping code didn't use the drm_vm.c accounting open/close,
> it did call the initial drm_vm_open_locked, so it should always do this.
>
> I'm not 100% sure it doesn't need a special open/close pair, but this at
> least makes /proc/dri/0/vma not end up with lots of crap in it. I'm still
> not getting kms + EXA on i915 working at all.
>
> Signed-off-by: Dave Airlie <[email protected]>
At first I thought you meant core VM accounting, but this is purely DRM code.
Anyway, it looks fine, you can add my
Acked-by: Jesse Barnes <[email protected]>
If you want to use EXA and not UXA you'll want my EXA pixmap patch (old
version attached, refreshing now to current xf86-video-intel).
Thanks,
--
Jesse Barnes, Intel Open Source Technology Center
diff --git a/src/i830.h b/src/i830.h
index 14c371c..53f6d2d 100644
--- a/src/i830.h
+++ b/src/i830.h
@@ -536,10 +536,10 @@ typedef struct _I830Rec {
#endif
#ifdef I830_USE_UXA
uxa_driver_t *uxa_driver;
- Bool need_flush;
- Bool need_sync;
#endif
#if defined(I830_USE_EXA) || defined(I830_USE_UXA)
+ Bool need_flush;
+ Bool need_sync;
PixmapPtr pSrcPixmap;
#endif
int accel_pixmap_pitch_alignment;
diff --git a/src/i830_accel.c b/src/i830_accel.c
index fe76fa0..8e3e500 100644
--- a/src/i830_accel.c
+++ b/src/i830_accel.c
@@ -67,28 +67,26 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
unsigned long
intel_get_pixmap_offset(PixmapPtr pPix)
{
-#if defined(I830_USE_EXA) || defined(I830_USE_UXA)
ScreenPtr pScreen = pPix->drawable.pScreen;
ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
I830Ptr pI830 = I830PTR(pScrn);
+#if defined(I830_USE_EXA) || defined(I830_USE_UXA)
+ dri_bo *bo;
- if (pI830->accel == ACCEL_EXA)
- return exaGetPixmapOffset(pPix);
-#endif
+ bo = i830_get_pixmap_bo(pPix);
+
+ if (bo)
+ return bo->offset;
+
+ return pI830->front_buffer->offset;
+#else
return (unsigned long)pPix->devPrivate.ptr - (unsigned long)pI830->FbBase;
+#endif
}
unsigned long
intel_get_pixmap_pitch(PixmapPtr pPix)
{
-#ifdef I830_USE_EXA
- ScreenPtr pScreen = pPix->drawable.pScreen;
- ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
- I830Ptr pI830 = I830PTR(pScrn);
-
- if (pI830->accel == ACCEL_EXA)
- return exaGetPixmapPitch(pPix);
-#endif
return (unsigned long)pPix->devKind;
}
@@ -326,13 +324,13 @@ I830AccelInit(ScreenPtr pScreen)
* so EXA doesn't need to worry.
*/
if (IS_I965G(pI830)) {
- pI830->accel_pixmap_offset_alignment = 4 * 2;
- pI830->accel_pixmap_pitch_alignment = 16;
+ pI830->accel_pixmap_offset_alignment = GTT_PAGE_SIZE;
+ pI830->accel_pixmap_pitch_alignment = 512;
pI830->accel_max_x = 8192;
pI830->accel_max_y = 8192;
} else {
- pI830->accel_pixmap_offset_alignment = 4;
- pI830->accel_pixmap_pitch_alignment = 16;
+ pI830->accel_pixmap_offset_alignment = GTT_PAGE_SIZE;
+ pI830->accel_pixmap_pitch_alignment = 512;
pI830->accel_max_x = 2048;
pI830->accel_max_y = 2048;
}
diff --git a/src/i830_driver.c b/src/i830_driver.c
index 1407a22..741328a 100644
--- a/src/i830_driver.c
+++ b/src/i830_driver.c
@@ -1940,7 +1940,9 @@ I830PreInit(ScrnInfoPtr pScrn, int flags)
#endif
#ifdef I830_USE_EXA
- case ACCEL_EXA: {
+ case ACCEL_EXA:
+ case ACCEL_UXA:
+ {
XF86ModReqInfo req;
int errmaj, errmin;
diff --git a/src/i830_exa.c b/src/i830_exa.c
index 9fcda51..7464372 100644
--- a/src/i830_exa.c
+++ b/src/i830_exa.c
@@ -35,6 +35,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#include "xaarop.h"
#include "i830.h"
#include "i810_reg.h"
+#include "drmmode_display.h"
#include <string.h>
#define ALWAYS_SYNC 0
@@ -93,47 +94,25 @@ i830_pixmap_tiled(PixmapPtr pPixmap)
ScreenPtr pScreen = pPixmap->drawable.pScreen;
ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
I830Ptr pI830 = I830PTR(pScrn);
+ struct i830_exa_pixmap_priv *driver_priv;
unsigned long offset;
+ driver_priv = exaGetPixmapDriverPrivate(pPixmap);
offset = intel_get_pixmap_offset(pPixmap);
if (offset == pI830->front_buffer->offset &&
pI830->front_buffer->tiling != TILE_NONE)
- {
return TRUE;
- }
return FALSE;
}
-static unsigned long
-i830_pixmap_pitch(PixmapPtr pixmap)
-{
- return pixmap->devKind;
-}
-
static int
i830_pixmap_pitch_is_aligned(PixmapPtr pixmap)
{
ScrnInfoPtr pScrn = xf86Screens[pixmap->drawable.pScreen->myNum];
I830Ptr pI830 = I830PTR(pScrn);
- return i830_pixmap_pitch(pixmap) % pI830->accel_pixmap_pitch_alignment == 0;
-}
-
-static Bool
-i830_exa_pixmap_is_offscreen(PixmapPtr pPixmap)
-{
- ScrnInfoPtr pScrn = xf86Screens[pPixmap->drawable.pScreen->myNum];
- I830Ptr pI830 = I830PTR(pScrn);
-
- if ((void *)pPixmap->devPrivate.ptr >= (void *)pI830->FbBase &&
- (void *)pPixmap->devPrivate.ptr <
- (void *)(pI830->FbBase + pI830->FbMapSize))
- {
- return TRUE;
- } else {
- return FALSE;
- }
+ return intel_get_pixmap_pitch(pixmap) % pI830->accel_pixmap_pitch_alignment == 0;
}
/**
@@ -171,7 +150,7 @@ I830EXAPrepareSolid(PixmapPtr pPixmap, int alu, Pixel planemask, Pixel fg)
i830_exa_check_pitch_2d(pPixmap);
- pitch = i830_pixmap_pitch(pPixmap);
+ pitch = intel_get_pixmap_pitch(pPixmap);
if (!i830_pixmap_pitch_is_aligned(pPixmap))
I830FALLBACK("pixmap pitch not aligned");
@@ -201,7 +180,7 @@ I830EXASolid(PixmapPtr pPixmap, int x1, int y1, int x2, int y2)
unsigned long pitch;
uint32_t cmd;
- pitch = i830_pixmap_pitch(pPixmap);
+ pitch = intel_get_pixmap_pitch(pPixmap);
{
BEGIN_BATCH(6);
@@ -290,8 +269,8 @@ I830EXACopy(PixmapPtr pDstPixmap, int src_x1, int src_y1, int dst_x1,
dst_x2 = dst_x1 + w;
dst_y2 = dst_y1 + h;
- dst_pitch = i830_pixmap_pitch(pDstPixmap);
- src_pitch = i830_pixmap_pitch(pI830->pSrcPixmap);
+ dst_pitch = intel_get_pixmap_pitch(pDstPixmap);
+ src_pitch = intel_get_pixmap_pitch(pI830->pSrcPixmap);
{
BEGIN_BATCH(8);
@@ -448,8 +427,6 @@ i830_transform_is_affine (PictTransformPtr t)
return t->matrix[2][0] == 0 && t->matrix[2][1] == 0;
}
-#ifdef XF86DRM_MODE
-
static void *
I830EXACreatePixmap(ScreenPtr screen, int size, int align)
{
@@ -518,7 +495,7 @@ static Bool I830EXAPrepareAccess(PixmapPtr pPix, int index)
I830Sync(scrn);
i830->need_sync = FALSE;
}
- if (dri_gem_bo_map_gtt(driver_priv->bo)) {
+ if (drm_intel_gem_bo_map_gtt(driver_priv->bo)) {
xf86DrvMsg(scrn->scrnIndex, X_WARNING, "%s: bo map failed\n",
__FUNCTION__);
return FALSE;
@@ -534,6 +511,7 @@ static void I830EXAFinishAccess(PixmapPtr pPix, int index)
ScrnInfoPtr scrn = xf86Screens[screen->myNum];
I830Ptr i830 = I830PTR(scrn);
struct i830_exa_pixmap_priv *driver_priv = exaGetPixmapDriverPrivate(pPix);
+ uint32_t tiling_mode = I915_TILING_X;
if (!driver_priv) {
xf86DrvMsg(scrn->scrnIndex, X_WARNING, "%s: no driver private?\n",
@@ -547,9 +525,8 @@ static void I830EXAFinishAccess(PixmapPtr pPix, int index)
return;
}
- dri_bo_unmap(driver_priv->bo);
pPix->devPrivate.ptr = NULL;
- if (driver_priv->bo == i830->front_buffer->bo)
+ if (i830->front_buffer->offset == driver_priv->bo->offset)
i830->need_flush = TRUE;
}
@@ -564,7 +541,7 @@ static Bool I830EXAModifyPixmapHeader(PixmapPtr pPix, int width, int height,
if (!driver_priv)
return FALSE;
-
+#ifdef XF86DRM_MODE
if (pI830->use_drm_mode &&
drmmode_is_rotate_pixmap(pScrn, pPixData, &driver_priv->bo)) {
/* this is a rotate pixmap */
@@ -573,6 +550,7 @@ static Bool I830EXAModifyPixmapHeader(PixmapPtr pPix, int width, int height,
miModifyPixmapHeader(pPix, width, height, depth,
bitsPerPixel, devKind, NULL);
}
+#endif
if (pPixData == pI830->FbBase + pScrn->fbOffset) {
if (driver_priv->bo)
@@ -591,8 +569,6 @@ static Bool I830EXAModifyPixmapHeader(PixmapPtr pPix, int width, int height,
return FALSE;
}
-#endif /* XF86DRM_MODE */
-
Bool
I830EXAInit(ScreenPtr pScreen)
{
@@ -608,49 +584,15 @@ I830EXAInit(ScreenPtr pScreen)
pI830->bufferOffset = 0;
pI830->EXADriverPtr->exa_major = 2;
- /* If compiled against EXA 2.2, require 2.2 so we can use the
- * PixmapIsOffscreen hook.
- */
-#if EXA_VERSION_MINOR >= 2
- pI830->EXADriverPtr->exa_minor = 2;
-#else
- pI830->EXADriverPtr->exa_minor = 1;
- xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
- "EXA compatibility mode. Output rotation rendering "
- "performance may suffer\n");
-#endif
- 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 {
-#ifdef XF86DRM_MODE
- 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
-#endif /* XF86DRM_MODE */
- }
-
- DPRINTF(PFX, "EXA Mem: memoryBase 0x%x, end 0x%x, offscreen base 0x%x, "
- "memorySize 0x%x\n",
- pI830->EXADriverPtr->memoryBase,
- pI830->EXADriverPtr->memoryBase + pI830->EXADriverPtr->memorySize,
- pI830->EXADriverPtr->offScreenBase,
- pI830->EXADriverPtr->memorySize);
-
+ pI830->EXADriverPtr->exa_minor = 4;
+
+ pI830->EXADriverPtr->flags = EXA_OFFSCREEN_PIXMAPS | EXA_HANDLES_PIXMAPS;
+ pI830->EXADriverPtr->PrepareAccess = I830EXAPrepareAccess;
+ pI830->EXADriverPtr->FinishAccess = I830EXAFinishAccess;
+ pI830->EXADriverPtr->CreatePixmap = I830EXACreatePixmap;
+ pI830->EXADriverPtr->DestroyPixmap = I830EXADestroyPixmap;
+ pI830->EXADriverPtr->PixmapIsOffscreen = I830EXAPixmapIsOffscreen;
+ pI830->EXADriverPtr->ModifyPixmapHeader = I830EXAModifyPixmapHeader;
pI830->EXADriverPtr->pixmapOffsetAlign = pI830->accel_pixmap_offset_alignment;
pI830->EXADriverPtr->pixmapPitchAlign = pI830->accel_pixmap_pitch_alignment;
pI830->EXADriverPtr->maxX = pI830->accel_max_x;
@@ -688,10 +630,6 @@ I830EXAInit(ScreenPtr pScreen)
pI830->EXADriverPtr->Composite = i965_composite;
pI830->EXADriverPtr->DoneComposite = i830_done_composite;
}
-#if EXA_VERSION_MINOR >= 2
- if (!pI830->use_drm_mode)
- pI830->EXADriverPtr->PixmapIsOffscreen = i830_exa_pixmap_is_offscreen;
-#endif
if(!exaDriverInit(pScreen, pI830->EXADriverPtr)) {
xf86DrvMsg(pScrn->scrnIndex, X_INFO,
@@ -725,13 +663,12 @@ i830_get_pixmap_bo(PixmapPtr pixmap)
return dixLookupPrivate(&pixmap->devPrivates, &uxa_pixmap_index);
}
#endif
-#ifdef XF86DRM_MODE
+
if (i830->accel == ACCEL_EXA) {
struct i830_exa_pixmap_priv *driver_priv =
exaGetPixmapDriverPrivate(pixmap);
return driver_priv ? driver_priv->bo : NULL;
}
-#endif
return NULL;
}
@@ -940,9 +877,11 @@ extern void ExaOffscreenMarkUsed(PixmapPtr);
unsigned long long
I830TexOffsetStart(PixmapPtr pPix)
{
- exaMoveInPixmap(pPix);
- ExaOffscreenMarkUsed(pPix);
+ dri_bo *bo = i830_get_pixmap_bo(pPix);
+
+ if (!bo)
+ return 0;
- return exaGetPixmapOffset(pPix);
+ return bo->offset;
}
#endif
diff --git a/src/i830_memory.c b/src/i830_memory.c
index caae135..d472ad3 100644
--- a/src/i830_memory.c
+++ b/src/i830_memory.c
@@ -216,10 +216,9 @@ 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->memory_manager)
mem->fence_nr = i830_set_tiling(pScrn, mem->offset, mem->pitch,
mem->allocated_size, mem->tiling);
- }
return TRUE;
}
@@ -232,7 +231,7 @@ i830_unbind_memory(ScrnInfoPtr pScrn, i830_memory *mem)
if (mem == NULL || !mem->bound)
return TRUE;
- if (mem->tiling != TILE_NONE && !pI830->use_drm_mode)
+ if (mem->tiling != TILE_NONE && !pI830->memory_manager)
i830_clear_tiling(pScrn, mem->fence_nr);
#ifdef XF86DRI
@@ -787,7 +786,7 @@ i830_allocate_memory_bo(ScrnInfoPtr pScrn, const char *name,
mem->end = -1;
mem->size = size;
mem->allocated_size = size;
- mem->alignment = align;
+ mem->alignment = mem->bo->align = align;
if (flags & NEED_LIFETIME_FIXED)
mem->lifetime_fixed_offset = TRUE;
@@ -932,7 +931,7 @@ i830_allocate_memory_tiled(ScrnInfoPtr pScrn, const char *name,
else
tiling_mode = I915_TILING_Y;
- ret = dri_bo_set_tiling(mem->bo, &tiling_mode);
+ ret = drm_intel_bo_set_tiling(mem->bo, &tiling_mode, mem->pitch);
if (ret != 0 || tiling_mode == I915_TILING_NONE) {
xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
"Failed to set tiling on %s: %s\n",
@@ -1488,7 +1487,7 @@ i830_allocate_2d_memory(ScrnInfoPtr pScrn)
return FALSE;
#ifdef I830_USE_EXA
- if (pI830->accel == ACCEL_EXA && !pI830->use_drm_mode) {
+ if (pI830->accel == ACCEL_EXA && !pI830->memory_manager) {
if (pI830->exa_offscreen == NULL) {
/* Default EXA to having 3 screens worth of offscreen memory space
* (for pixmaps).
------------------------------------------------------------------------------
--
_______________________________________________
Dri-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/dri-devel