diff --git a/.pick_status.json b/.pick_status.json index c65a22f7c5a..62e050f7bb1 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -1948,7 +1948,7 @@ "description": "nouveau/nvc0: fix linear buffer alignment for scan-out/cursors", "nominated": true, "nomination_type": 0, - "resolution": 0, + "resolution": 1, "master_sha": null, "because_sha": null }, diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_miptree.c b/src/gallium/drivers/nouveau/nvc0/nvc0_miptree.c index a095515e48d..c8e94d6ad7b 100644 --- a/src/gallium/drivers/nouveau/nvc0/nvc0_miptree.c +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_miptree.c @@ -377,6 +377,7 @@ nvc0_miptree_create(struct pipe_screen *pscreen, int ret; union nouveau_bo_config bo_config; uint32_t bo_flags; + unsigned pitch_align; if (!mt) return NULL; @@ -421,10 +422,19 @@ nvc0_miptree_create(struct pipe_screen *pscreen, } else if (likely(bo_config.nvc0.memtype)) { nvc0_miptree_init_layout_tiled(mt); - } else - if (!nv50_miptree_init_layout_linear(mt, 128)) { - FREE(mt); - return NULL; + } else { + /* When modifiers are supplied, usage is zero. TODO: detect the + * modifiers+cursor case. */ + if (pt->usage & PIPE_BIND_CURSOR) + pitch_align = 1; + else if ((pt->usage & PIPE_BIND_SCANOUT) || count > 0) + pitch_align = 256; + else + pitch_align = 128; + if (!nv50_miptree_init_layout_linear(mt, pitch_align)) { + FREE(mt); + return NULL; + } } bo_config.nvc0.tile_mode = mt->level[0].tile_mode;