+static void
+setup_hierz_buffer(struct gl_context *ctx)
+{
+ struct nouveau_pushbuf *push = context_push(ctx);
+ struct gl_framebuffer *fb = ctx->DrawBuffer;
+ struct nouveau_framebuffer *nfb = to_nouveau_framebuffer(fb);
+ unsigned pitch = align(fb->Width, 128),
+ height = align(fb->Height, 2),
+ size = pitch * height;
+
+ if (!nfb->hierz.bo || nfb->hierz.bo->size != size) {
+ nouveau_bo_ref(NULL, &nfb->hierz.bo);
+ nouveau_bo_new(context_dev(ctx), NOUVEAU_BO_VRAM, 0, size,
+ NULL, &nfb->hierz.bo);
+ }
+
+ BEGIN_NV04(push, NV25_3D(HIERZ_PITCH), 1);
+ PUSH_DATA (push, pitch);
+ BEGIN_NV04(push, NV25_3D(HIERZ_OFFSET), 1);
+ PUSH_MTHDl(push, NV25_3D(HIERZ_OFFSET), BUFCTX_FB,
+ nfb->hierz.bo, 0, NOUVEAU_BO_VRAM | NOUVEAU_BO_RDWR);
+}
+