From 25182e249e50b0fce41d975ae2b3c9cbdb8d0ef3 Mon Sep 17 00:00:00 2001 From: Ilia Mirkin Date: Tue, 17 Jun 2014 23:28:56 -0400 Subject: [PATCH] nv30: hack to avoid errors on unexpected color/zeta combinations This is just a hack, it should be possible to create a temporary zeta surface and render to that instead. However that's more complicated and this avoids the render being entirely broken and errors being reported by the card. Signed-off-by: Ilia Mirkin Cc: "10.2" --- src/gallium/drivers/nouveau/nv30/nv30_state.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/gallium/drivers/nouveau/nv30/nv30_state.c b/src/gallium/drivers/nouveau/nv30/nv30_state.c index 64be1b78f79..708ba34c1e5 100644 --- a/src/gallium/drivers/nouveau/nv30/nv30_state.c +++ b/src/gallium/drivers/nouveau/nv30/nv30_state.c @@ -23,6 +23,7 @@ * */ +#include "util/u_format.h" #include "util/u_helpers.h" #include "util/u_inlines.h" @@ -360,6 +361,22 @@ nv30_set_framebuffer_state(struct pipe_context *pipe, nv30->framebuffer = *fb; nv30->dirty |= NV30_NEW_FRAMEBUFFER; + + /* Hardware can't handle different swizzled-ness or different blocksizes + * for zs and cbufs. If both are supplied and something doesn't match, + * blank out the zs for now so that at least *some* rendering can occur. + */ + if (fb->nr_cbufs > 0 && fb->zsbuf) { + struct nv30_miptree *color_mt = nv30_miptree(fb->cbufs[0]->texture); + struct nv30_miptree *zeta_mt = nv30_miptree(fb->zsbuf->texture); + + if (color_mt->swizzled != zeta_mt->swizzled || + (util_format_get_blocksize(fb->zsbuf->format) > 2) != + (util_format_get_blocksize(fb->cbufs[0]->format) > 2)) { + nv30->framebuffer.zsbuf = NULL; + debug_printf("Mismatched color and zeta formats, ignoring zeta.\n"); + } + } } static void -- 2.30.2