diff options
author | Christoph Bumiller <e0425955@student.tuwien.ac.at> | 2011-12-10 13:32:24 +0100 |
---|---|---|
committer | Christoph Bumiller <e0425955@student.tuwien.ac.at> | 2011-12-10 13:32:24 +0100 |
commit | ad402333157c437ccd2c639f5b3f3bcb81e78d6c (patch) | |
tree | a8f3078ab076984ce20ea33ceb3c37fec85f03e6 | |
parent | 3d2a752ca8aafee5e1e94dabfd7deec439890e95 (diff) | |
download | xorg-driver-xf86-video-nouveau-ad402333157c437ccd2c639f5b3f3bcb81e78d6c.tar.gz |
dri2: fix allocation of Z16 depth attachments
-rw-r--r-- | src/nouveau_dri2.c | 6 | ||||
-rw-r--r-- | src/nouveau_local.h | 8 | ||||
-rw-r--r-- | src/nv_accel_common.c | 4 |
3 files changed, 15 insertions, 3 deletions
diff --git a/src/nouveau_dri2.c b/src/nouveau_dri2.c index d14443f..979216d 100644 --- a/src/nouveau_dri2.c +++ b/src/nouveau_dri2.c @@ -46,8 +46,12 @@ nouveau_dri2_create_buffer(DrawablePtr pDraw, unsigned int attachment, ppix->refcnt++; } else { + int bpp; unsigned int usage_hint = NOUVEAU_CREATE_PIXMAP_TILED; + /* 'format' is just depth */ + bpp = round_up_pow2(format); + if (attachment == DRI2BufferDepth || attachment == DRI2BufferDepthStencil) usage_hint |= NOUVEAU_CREATE_PIXMAP_ZETA; @@ -55,7 +59,7 @@ nouveau_dri2_create_buffer(DrawablePtr pDraw, unsigned int attachment, usage_hint |= NOUVEAU_CREATE_PIXMAP_SCANOUT; ppix = pScreen->CreatePixmap(pScreen, pDraw->width, - pDraw->height, pDraw->depth, + pDraw->height, bpp, usage_hint); } diff --git a/src/nouveau_local.h b/src/nouveau_local.h index cc2fe34..cfce831 100644 --- a/src/nouveau_local.h +++ b/src/nouveau_local.h @@ -79,6 +79,14 @@ static inline int round_down_pow2(int x) return 1 << log2i(x); } +static inline int round_up_pow2(int x) +{ + int r = round_down_pow2(x); + if (r < x) + r <<= 1; + return r; +} + #define SWAP(x, y) do { \ typeof(x) __z = (x); \ (x) = (y); \ diff --git a/src/nv_accel_common.c b/src/nv_accel_common.c index 3219dbe..51cc66a 100644 --- a/src/nv_accel_common.c +++ b/src/nv_accel_common.c @@ -71,7 +71,7 @@ nouveau_allocate_surface(ScrnInfoPtr scrn, int width, int height, int bpp, tile_mode = 0x00; if (usage_hint & NOUVEAU_CREATE_PIXMAP_ZETA) - tile_flags = 0x1100; /* S8Z24 */ + tile_flags = (bpp == 16) ? 0x0100 : 0x1100; /* Z16 : Z24S8 */ else tile_flags = 0xfe00; @@ -90,7 +90,7 @@ nouveau_allocate_surface(ScrnInfoPtr scrn, int width, int height, int bpp, tile_mode = 0; if (usage_hint & NOUVEAU_CREATE_PIXMAP_ZETA) - tile_flags = 0x22800; + tile_flags = (bpp == 16) ? 0x26c00 : 0x22800; else if (usage_hint & NOUVEAU_CREATE_PIXMAP_SCANOUT) tile_flags = (bpp == 16 ? 0x7000 : 0x7a00); else |