Make xf86 linear allocator smarter when dealing with alignment constraints
when falling back to X/Y allocations. Fixes various problems of Xv allocation failures, notably with "nv" driver.
This commit is contained in:
parent
c1601717d5
commit
02d80a0de9
|
@ -1,3 +1,10 @@
|
||||||
|
2006-03-15 Benjamin Herrenschmidt <benh@kernel.crashing.org>
|
||||||
|
|
||||||
|
* hw/xfree86/common/xf86fbman.c: (localAllocateOffscreenLinear):
|
||||||
|
Make xf86 linear allocator smarter when dealing with alignment
|
||||||
|
constraints when falling back to X/Y allocations. Fixes various
|
||||||
|
problems of Xv allocation failures, notably with "nv" driver.
|
||||||
|
|
||||||
2006-03-14 Eric Anholt <anholt@FreeBSD.org>
|
2006-03-14 Eric Anholt <anholt@FreeBSD.org>
|
||||||
|
|
||||||
* exa/exa.c: (exaDriverInit):
|
* exa/exa.c: (exaDriverInit):
|
||||||
|
|
|
@ -923,7 +923,7 @@ localAllocateOffscreenLinear(
|
||||||
ErrorF("ALLOCATING LINEAR\n");
|
ErrorF("ALLOCATING LINEAR\n");
|
||||||
#endif
|
#endif
|
||||||
if ((linear = AllocateLinear(offman, length, gran, privData)))
|
if ((linear = AllocateLinear(offman, length, gran, privData)))
|
||||||
return linear;
|
return linear;
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
ErrorF("NOPE, ALLOCATING AREA\n");
|
ErrorF("NOPE, ALLOCATING AREA\n");
|
||||||
|
@ -936,11 +936,17 @@ localAllocateOffscreenLinear(
|
||||||
extents = REGION_EXTENTS(pScreen, offman->InitialBoxes);
|
extents = REGION_EXTENTS(pScreen, offman->InitialBoxes);
|
||||||
pitch = extents->x2 - extents->x1;
|
pitch = extents->x2 - extents->x1;
|
||||||
|
|
||||||
if(gran && ((gran > pitch) || (pitch % gran))) {
|
if (gran && gran > pitch) {
|
||||||
/* we can't match the specified alignment with XY allocations */
|
/* we can't match the specified alignment with XY allocations */
|
||||||
xfree(link);
|
xfree(link);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
if (gran && (pitch % gran)) {
|
||||||
|
/* pitch and granularity aren't a perfect match, let's allocate
|
||||||
|
* a bit more so we can align later on
|
||||||
|
*/
|
||||||
|
length += gran - 1;
|
||||||
|
}
|
||||||
|
|
||||||
if(length < pitch) { /* special case */
|
if(length < pitch) { /* special case */
|
||||||
w = length;
|
w = length;
|
||||||
|
@ -963,6 +969,8 @@ localAllocateOffscreenLinear(
|
||||||
linear->pScreen = pScreen;
|
linear->pScreen = pScreen;
|
||||||
linear->size = h * w;
|
linear->size = h * w;
|
||||||
linear->offset = (pitch * area->box.y1) + area->box.x1;
|
linear->offset = (pitch * area->box.y1) + area->box.x1;
|
||||||
|
if (gran && linear->offset % gran)
|
||||||
|
linear->offset += gran - (linear->offset % gran);
|
||||||
linear->granularity = gran;
|
linear->granularity = gran;
|
||||||
linear->MoveLinearCallback = moveCB;
|
linear->MoveLinearCallback = moveCB;
|
||||||
linear->RemoveLinearCallback = removeCB;
|
linear->RemoveLinearCallback = removeCB;
|
||||||
|
|
Loading…
Reference in New Issue