@@ -68,6 +68,8 @@ I830DPRINTF_stub(const char *filename, int line, const char *function,
#define KB(x) ((x) * 1024)
#define MB(x) ((x) * KB(1024))
+#define ALIGN(i,m) (((i) + (m) - 1) & ~((m) - 1))
+
/* Using usleep() makes things noticably slow. */
#if 0
#define DELAY(x) usleep(x)
@@ -395,10 +397,6 @@ extern int I810_DEBUG;
#define SUPPORTS_YTILING(pI810) (IS_I965G(intel))
#define GTT_PAGE_SIZE KB(4)
-#define ROUND_TO(x, y) (((x) + (y) - 1) / (y) * (y))
-#define ROUND_DOWN_TO(x, y) ((x) / (y) * (y))
-#define ROUND_TO_PAGE(x) ROUND_TO((x), GTT_PAGE_SIZE)
-#define ROUND_TO_MB(x) ROUND_TO((x), MB(1))
#define PRIMARY_RINGBUFFER_SIZE KB(128)
#define MIN_SCRATCH_BUFFER_SIZE KB(16)
#define MAX_SCRATCH_BUFFER_SIZE KB(64)
@@ -476,7 +476,7 @@ drmmode_crtc_shadow_allocate(xf86CrtcPtr crtc, int width, int height)
int size, ret;
unsigned long rotate_pitch;
- width = i830_pad_drawable_width(width, drmmode->cpp);
+ width = ALIGN(width, 64);
rotate_pitch = width * drmmode->cpp;
size = rotate_pitch * height;
@@ -523,8 +523,7 @@ drmmode_crtc_shadow_create(xf86CrtcPtr crtc, void *data, int width, int height)
}
}
- rotate_pitch =
- i830_pad_drawable_width(width, drmmode->cpp) * drmmode->cpp;
+ rotate_pitch = ALIGN(width, 64) * drmmode->cpp;
rotate_pixmap = GetScratchPixmapHeader(scrn->pScreen,
width, height,
scrn->depth,
@@ -1261,7 +1260,7 @@ drmmode_xf86crtc_resize (ScrnInfoPtr scrn, int width, int height)
if (scrn->virtualX == width && scrn->virtualY == height)
return TRUE;
- pitch = i830_pad_drawable_width(width, intel->cpp);
+ pitch = ALIGN(width, 64);
i830_tiled_width(intel, &pitch, intel->cpp);
xf86DrvMsg(scrn->scrnIndex, X_INFO,
"Allocate new frame buffer %dx%d stride %d\n",
@@ -129,7 +129,7 @@ I810AccelInit(ScreenPtr pScreen)
*/
if (pI810->Scratch.Size != 0) {
int i;
- int width = ((pScrn->displayWidth + 31) & ~31) / 8;
+ int width = ALIGN(pScrn->displayWidth, 32) / 8;
int nr_buffers = pI810->Scratch.Size / width;
unsigned char *ptr = pI810->FbBase + pI810->Scratch.Start;
@@ -118,7 +118,7 @@ I810DGAInit(ScreenPtr pScreen)
currentMode->offset = 0;
currentMode->address = pI810->FbBase;
- currentMode->bytesPerScanline = ((pScrn->displayWidth * Bpp) + 3) & ~3L;
+ currentMode->bytesPerScanline = ALIGN(pScrn->displayWidth * Bpp, 4L);
currentMode->imageWidth = pI810->FbMemBox.x2;
currentMode->imageHeight = pI810->FbMemBox.y2;
currentMode->pixmapWidth = currentMode->imageWidth;
@@ -348,9 +348,8 @@ I810DRIScreenInit(ScreenPtr pScreen)
pDRIInfo->ddxDriverMinorVersion = I810_MINOR_VERSION;
pDRIInfo->ddxDriverPatchVersion = I810_PATCHLEVEL;
pDRIInfo->frameBufferPhysicalAddress = (pointer) pI810->LinearAddr;
- pDRIInfo->frameBufferSize = (((pScrn->displayWidth *
- pScrn->virtualY * pI810->cpp) +
- 4096 - 1) / 4096) * 4096;
+ pDRIInfo->frameBufferSize = ALIGN(pScrn->displayWidth * pScrn->virtualY *
+ pI810->cpp, 4096);
pDRIInfo->frameBufferStride = pScrn->displayWidth * pI810->cpp;
pDRIInfo->ddxDrawableTableEntry = I810_MAX_DRAWABLES;
@@ -537,7 +536,7 @@ I810DRIScreenInit(ScreenPtr pScreen)
* - airlied */
int lines = (pScrn->virtualY + 15) / 16 * 16;
back_size = i810_pitches[pitch_idx] * lines;
- back_size = ((back_size + 4096 - 1) / 4096) * 4096;
+ back_size = ALIGN(back_size, 4096);
}
sysmem_size = pScrn->videoRam * 1024;
@@ -1838,8 +1838,7 @@ I810AllocateFront(ScrnInfoPtr pScrn)
if (!I810AllocLow(&(pI810->FrontBuffer),
&(pI810->SysMem),
- ((pI810->FbMemBox.x2 *
- pI810->FbMemBox.y2 * pI810->cpp) + 4095) & ~4095)) {
+ ALIGN(pI810->FbMemBox.x2 * pI810->FbMemBox.y2 * pI810->cpp, 4096))) {
xf86DrvMsg(pScrn->scrnIndex,
X_WARNING, "Framebuffer allocation failed\n");
return FALSE;
@@ -750,14 +750,14 @@ I810DisplayVideo(
switch(id) {
case FOURCC_YV12:
case FOURCC_I420:
- swidth = (width + 7) & ~7;
+ swidth = ALIGN(width, 8);
overlay->SWID = (swidth << 15) | swidth;
overlay->SWIDQW = (swidth << 12) | (swidth >> 3);
break;
case FOURCC_UYVY:
case FOURCC_YUY2:
default:
- swidth = ((width + 3) & ~3) << 1;
+ swidth = ALIGN(width, 4) << 1;
overlay->SWID = swidth;
overlay->SWIDQW = swidth >> 3;
break;
@@ -1013,15 +1013,15 @@ I810PutImage(
switch(id) {
case FOURCC_YV12:
case FOURCC_I420:
- srcPitch = (width + 3) & ~3;
- dstPitch = ((width >> 1) + 7) & ~7; /* of chroma */
+ srcPitch = ALIGN(width, 4);
+ dstPitch = ALIGN(width >> 1, 8); /* of chroma */
size = dstPitch * height * 3;
break;
case FOURCC_UYVY:
case FOURCC_YUY2:
default:
srcPitch = (width << 1);
- dstPitch = (srcPitch + 7) & ~7;
+ dstPitch = ALIGN(srcPitch, 8);
size = dstPitch * height;
break;
}
@@ -1062,13 +1062,13 @@ I810PutImage(
/* copy data */
top = y1 >> 16;
left = (x1 >> 16) & ~1;
- npixels = ((((x2 + 0xffff) >> 16) + 1) & ~1) - left;
+ npixels = (ALIGN((x2 + 0xffff) >> 16, 2)) - left;
switch(id) {
case FOURCC_YV12:
case FOURCC_I420:
top &= ~1;
- nlines = ((((y2 + 0xffff) >> 16) + 1) & ~1) - top;
+ nlines = (ALIGN((y2 + 0xffff) >> 16, 2)) - top;
I810CopyPlanarData(pScrn, buf, srcPitch, dstPitch, height, top, left,
nlines, npixels, id);
break;
@@ -1109,7 +1109,7 @@ I810QueryImageAttributes(
if(*w > IMAGE_MAX_WIDTH) *w = IMAGE_MAX_WIDTH;
if(*h > IMAGE_MAX_HEIGHT) *h = IMAGE_MAX_HEIGHT;
- *w = (*w + 1) & ~1;
+ *w = ALIGN(*w, 2);
if(offsets) offsets[0] = 0;
switch(id) {
@@ -1121,12 +1121,12 @@ I810QueryImageAttributes(
break;
case FOURCC_YV12:
case FOURCC_I420:
- *h = (*h + 1) & ~1;
- size = (*w + 3) & ~3;
+ *h = ALIGN(*h, 2);
+ size = ALIGN(*w, 4);
if(pitches) pitches[0] = size;
size *= *h;
if(offsets) offsets[1] = size;
- tmp = ((*w >> 1) + 3) & ~3;
+ tmp = ALIGN(*w >> 1, 4);
if(pitches) pitches[1] = pitches[2] = tmp;
tmp *= (*h >> 1);
size += tmp;
@@ -1213,8 +1213,8 @@ I810AllocateSurface(
if((w > 1024) || (h > 1024))
return BadAlloc;
- w = (w + 1) & ~1;
- pitch = ((w << 1) + 15) & ~15;
+ w = ALIGN(w, 2);
+ pitch = ALIGN((w << 1), 16);
bpp = pScrn->bitsPerPixel >> 3;
size = ((pitch * h) + bpp - 1) / bpp;
@@ -385,7 +385,6 @@ intel_get_screen_private(ScrnInfoPtr scrn)
}
#define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0]))
-#define ALIGN(i,m) (((i) + (m) - 1) & ~((m) - 1))
#define MIN(a,b) ((a) < (b) ? (a) : (b))
unsigned long intel_get_pixmap_pitch(PixmapPtr pixmap);
@@ -429,8 +428,6 @@ void i830_init_bufmgr(ScrnInfoPtr scrn);
Bool i830_tiled_width(intel_screen_private *intel, int *width, int cpp);
-int i830_pad_drawable_width(int width, int cpp);
-
/* i830_memory.c */
unsigned long i830_get_fence_size(intel_screen_private *intel, unsigned long size);
unsigned long i830_get_fence_pitch(intel_screen_private *intel, unsigned long pitch,
@@ -360,8 +360,7 @@ Bool i830_tiled_width(intel_screen_private *intel, int *width, int cpp)
if (intel->tiling) {
if (IS_I965G(intel)) {
int tile_pixels = 512 / cpp;
- *width = (*width + tile_pixels - 1) &
- ~(tile_pixels - 1);
+ *width = ALIGN(*width, tile_pixels);
tiled = TRUE;
} else {
/* Good pitches to allow tiling. Don't care about pitches < 1024
@@ -389,14 +388,6 @@ Bool i830_tiled_width(intel_screen_private *intel, int *width, int cpp)
}
/*
- * Pad to accelerator requirement
- */
-int i830_pad_drawable_width(int width, int cpp)
-{
- return (width + 63) & ~63;
-}
-
-/*
* DRM mode setting Linux only at this point... later on we could
* add a wrapper here.
*/
@@ -1100,8 +1091,7 @@ I830ScreenInit(int scrnIndex, ScreenPtr screen, int argc, char **argv)
struct pci_device *const device = intel->PciInfo;
int fb_bar = IS_I9XX(intel) ? 2 : 0;
- scrn->displayWidth =
- i830_pad_drawable_width(scrn->virtualX, intel->cpp);
+ scrn->displayWidth = ALIGN(scrn->virtualX, 64);
/*
* The "VideoRam" config file parameter specifies the maximum amount of
@@ -129,7 +129,7 @@ i830_get_fence_pitch(intel_screen_private *intel, unsigned long pitch,
/* 965 is flexible */
if (IS_I965G(intel))
- return ROUND_TO(pitch, tile_width);
+ return ALIGN(pitch, tile_width);
/* Pre-965 needs power of two tile width */
for (i = tile_width; i < pitch; i <<= 1) ;
@@ -232,7 +232,7 @@ drm_intel_bo *i830_allocate_framebuffer(ScrnInfoPtr scrn)
*/
fb_height = scrn->virtualY;
- size = ROUND_TO_PAGE(pitch * fb_height);
+ size = ALIGN(pitch * fb_height, GTT_PAGE_SIZE);
if (intel->tiling && IsTileable(scrn, pitch))
tiling_mode = I915_TILING_X;
@@ -133,7 +133,7 @@ i830_uxa_pixmap_compute_size(PixmapPtr pixmap,
if (*tiling != I915_TILING_NONE) {
/* First check whether tiling is necessary. */
pitch_align = intel->accel_pixmap_pitch_alignment;
- size = ROUND_TO((w * pixmap->drawable.bitsPerPixel + 7) / 8,
+ size = ALIGN((w * pixmap->drawable.bitsPerPixel + 7) / 8,
pitch_align) * ALIGN (h, 2);
if (size < 4096)
*tiling = I915_TILING_NONE;
@@ -146,7 +146,7 @@ i830_uxa_pixmap_compute_size(PixmapPtr pixmap,
pitch_align = 512;
}
- *stride = ROUND_TO((w * pixmap->drawable.bitsPerPixel + 7) / 8,
+ *stride = ALIGN((w * pixmap->drawable.bitsPerPixel + 7) / 8,
pitch_align);
if (*tiling == I915_TILING_NONE) {
@@ -1271,10 +1271,10 @@ i830_clip_video_helper(ScrnInfoPtr scrn,
*top = y1 >> 16;
*left = (x1 >> 16) & ~1;
- *npixels = ((((x2 + 0xffff) >> 16) + 1) & ~1) - *left;
+ *npixels = ALIGN((x2 + 0xffff) >> 16, 2) - *left;
if (is_planar_fourcc(id)) {
*top &= ~1;
- *nlines = ((((y2 + 0xffff) >> 16) + 1) & ~1) - *top;
+ *nlines = ALIGN((y2 + 0xffff) >> 16, 2) - *top;
} else
*nlines = ((y2 + 0xffff) >> 16) - *top;
@@ -1351,24 +1351,24 @@ i830_setup_dst_params(ScrnInfoPtr scrn, intel_adaptor_private *adaptor_priv, sho
int id)
{
intel_screen_private *intel = intel_get_screen_private(scrn);
- int pitchAlignMask;
+ int pitchAlign;
/* Only needs to be DWORD-aligned for textured on i915, but overlay has
* stricter requirements.
*/
if (adaptor_priv->textured) {
- pitchAlignMask = 3;
+ pitchAlign = 4;
} else {
if (IS_I965G(intel))
- pitchAlignMask = 255;
+ pitchAlign = 256;
else
- pitchAlignMask = 63;
+ pitchAlign = 64;
}
#if INTEL_XVMC
/* for i915 xvmc, hw requires 1kb aligned surfaces */
if ((id == FOURCC_XVMC) && IS_I915(intel))
- pitchAlignMask = 0x3ff;
+ pitchAlign = 1024;
#endif
/* Determine the desired destination pitch (representing the chroma's pitch,
@@ -1377,25 +1377,25 @@ i830_setup_dst_params(ScrnInfoPtr scrn, intel_adaptor_private *adaptor_priv, sho
if (is_planar_fourcc(id)) {
if (adaptor_priv->rotation & (RR_Rotate_90 | RR_Rotate_270)) {
*dstPitch =
- ((height / 2) + pitchAlignMask) & ~pitchAlignMask;
+ ALIGN(height / 2, pitchAlign);
*dstPitch2 =
- (height + pitchAlignMask) & ~pitchAlignMask;
+ ALIGN(height, pitchAlign);
*size = *dstPitch * width * 3;
} else {
*dstPitch =
- ((width / 2) + pitchAlignMask) & ~pitchAlignMask;
+ ALIGN(width / 2, pitchAlign);
*dstPitch2 =
- (width + pitchAlignMask) & ~pitchAlignMask;
+ ALIGN(width, pitchAlign);
*size = *dstPitch * height * 3;
}
} else {
if (adaptor_priv->rotation & (RR_Rotate_90 | RR_Rotate_270)) {
*dstPitch =
- ((height << 1) + pitchAlignMask) & ~pitchAlignMask;
+ ALIGN(height << 1, pitchAlign);
*size = *dstPitch * width;
} else {
*dstPitch =
- ((width << 1) + pitchAlignMask) & ~pitchAlignMask;
+ ALIGN(width << 1, pitchAlign);
*size = *dstPitch * height;
}
*dstPitch2 = 0;
@@ -1426,16 +1426,9 @@ i830_copy_video_data(ScrnInfoPtr scrn, intel_adaptor_private *adaptor_priv,
int top, int left, int npixels, int nlines,
int id, unsigned char *buf)
{
- int srcPitch = 0, srcPitch2 = 0;
+ int srcPitch, srcPitch2;
int size;
- if (is_planar_fourcc(id)) {
- srcPitch = (width + 0x3) & ~0x3;
- srcPitch2 = ((width >> 1) + 0x3) & ~0x3;
- } else {
- srcPitch = width << 1;
- }
-
i830_setup_dst_params(scrn, adaptor_priv, width, height, dstPitch,
dstPitch2, &size, id);
@@ -1444,11 +1437,14 @@ i830_copy_video_data(ScrnInfoPtr scrn, intel_adaptor_private *adaptor_priv,
/* copy data */
if (is_planar_fourcc(id)) {
+ srcPitch = ALIGN(width, 0x4);
+ srcPitch2 = ALIGN(width >> 1, 0x4);
I830CopyPlanarData(adaptor_priv, buf, srcPitch, srcPitch2,
*dstPitch, *dstPitch2,
height, top, left, nlines,
npixels, id);
} else {
+ srcPitch = width << 1;
I830CopyPackedData(adaptor_priv, buf, srcPitch, *dstPitch, top, left,
nlines, npixels);
}
@@ -1650,7 +1646,7 @@ I830QueryImageAttributes(ScrnInfoPtr scrn,
*h = IMAGE_MAX_HEIGHT;
}
- *w = (*w + 1) & ~1;
+ *w = ALIGN(*w, 2);
if (offsets)
offsets[0] = 0;
@@ -1664,14 +1660,14 @@ I830QueryImageAttributes(ScrnInfoPtr scrn,
break;
case FOURCC_YV12:
case FOURCC_I420:
- *h = (*h + 1) & ~1;
- size = (*w + 3) & ~3;
+ *h = ALIGN(*h, 2);
+ size = ALIGN(*w, 4);
if (pitches)
pitches[0] = size;
size *= *h;
if (offsets)
offsets[1] = size;
- tmp = ((*w >> 1) + 3) & ~3;
+ tmp = ALIGN(*w >> 1, 4);
if (pitches)
pitches[1] = pitches[2] = tmp;
tmp *= (*h >> 1);
@@ -1692,7 +1688,7 @@ I830QueryImageAttributes(ScrnInfoPtr scrn,
break;
#ifdef INTEL_XVMC
case FOURCC_XVMC:
- *h = (*h + 1) & ~1;
+ *h = ALIGN(*h, 2);
size = sizeof(struct intel_xvmc_command);
if (pitches)
pitches[0] = size;
@@ -30,7 +30,7 @@
#include "i830_hwmc.h"
/* i915 hw requires surface to be at least 1KB aligned */
-#define STRIDE(w) (((w) + 0x3ff) & ~0x3ff)
+#define STRIDE(w) ALIGN((w), 0x400)
#define SIZE_Y420(w, h) (h * STRIDE(w))
#define SIZE_UV420(w, h) ((h >> 1) * STRIDE(w >> 1))
#define SIZE_YUV420(w, h) (SIZE_Y420(w,h) + SIZE_UV420(w,h) * 2)
@@ -58,7 +58,7 @@ static int create_context(ScrnInfoPtr scrn,
unsigned int blocknum =
(((context->width + 15) / 16) * ((context->height + 15) / 16));
unsigned int blocksize = 6 * blocknum * 64 * sizeof(short);
- blocksize = (blocksize + 4095) & (~4095);
+ blocksize = ALIGN(blocksize, 4096);
if ((private_context = Xcalloc(sizeof(*private_context))) == NULL) {
ErrorF("XVMC Can not allocate private context\n");
return BadAlloc;
@@ -2860,8 +2860,8 @@ _X_EXPORT Status XvMCPutSurface(Display *display,XvMCSurface *surface,
switch(surface->surface_type_id) {
case FOURCC_YV12:
case FOURCC_I420:
- yPitch = (srcw + 7) & ~7;
- uvPitch = ((srcw>>1) + 7) & ~7;
+ yPitch = ALIGN(srcw, 8);
+ uvPitch = ALIGN(srcw>>1, 8);
if((flags & XVMC_FRAME_PICTURE) != XVMC_FRAME_PICTURE) {
srch = srch>>1;
}
@@ -2871,7 +2871,7 @@ _X_EXPORT Status XvMCPutSurface(Display *display,XvMCSurface *surface,
default:
/* FIXME: Non Planar not fully implemented. */
return BadValue;
- yPitch = ((srcw + 7) & ~7) << 1;
+ yPitch = ALIGN(srcw, 8) << 1;
break;
}/* switch(surface->surface_type_id) */
@@ -3010,8 +3010,8 @@ _X_EXPORT Status XvMCPutSurface(Display *display,XvMCSurface *surface,
Adjust the source offset width and height according to the clipped
destination window.
*/
- ysrc_offset = ((clipped_srcx + 1) & ~1) +
- ((clipped_srcy + 1) & ~1) * (1<<pI810Surface->pitch);
+ ysrc_offset = ALIGN(clipped_srcx, 2) +
+ ALIGN(clipped_srcy, 2) * (1<<pI810Surface->pitch);
uvsrc_offset = (clipped_srcx>>1) +
(clipped_srcy>>1) * (1<<(pI810Surface->pitch - 1));
@@ -360,8 +360,8 @@ _X_EXPORT Status XvMCCreateContext(Display * display, XvPortID port,
here.
*/
context->surface_type_id = surface_type_id;
- context->width = (unsigned short)((width + 15) & ~15);
- context->height = (unsigned short)((height + 15) & ~15);
+ context->width = (unsigned short)ALIGN(width, 16);
+ context->height = (unsigned short)ALIGN(height, 16);
context->flags = flags;
context->port = port;
@@ -194,12 +194,6 @@ static inline uxa_screen_t *uxa_get_screen(ScreenPtr screen)
&uxa_screen_index);
}
-/** Align an offset to an arbitrary alignment */
-#define UXA_ALIGN(offset, align) (((offset) + (align) - 1) - \
- (((offset) + (align) - 1) % (align)))
-/** Align an offset to a power-of-two alignment */
-#define UXA_ALIGN2(offset, align) (((offset) + (align) - 1) & ~((align) - 1))
-
typedef struct {
INT16 xSrc;
INT16 ySrc;