From 4b4f636fadd997b82be7b0f4fe9acd1090d3ad20 Mon Sep 17 00:00:00 2001 From: Ben Skeggs Date: Fri, 11 May 2012 03:02:13 +1000 Subject: [PATCH] nouveau/vieux: finish != flush, how about we do that.. Signed-off-by: Ben Skeggs --- src/mesa/drivers/dri/nouveau/nouveau_context.c | 7 +++++++ src/mesa/drivers/dri/nouveau/nouveau_context.h | 2 ++ src/mesa/drivers/dri/nouveau/nouveau_driver.c | 10 ++++++++++ 3 files changed, 19 insertions(+) diff --git a/src/mesa/drivers/dri/nouveau/nouveau_context.c b/src/mesa/drivers/dri/nouveau/nouveau_context.c index 9051e18..db5d9ea 100644 --- a/src/mesa/drivers/dri/nouveau/nouveau_context.c +++ b/src/mesa/drivers/dri/nouveau/nouveau_context.c @@ -91,6 +91,12 @@ nouveau_context_create(gl_api api, return GL_FALSE; } + if (nouveau_bo_new(context_dev(ctx), NOUVEAU_BO_VRAM, 0, 4096, &nctx->fence)) { + nouveau_context_destroy(dri_ctx); + *error = __DRI_CTX_ERROR_NO_MEMORY; + return GL_FALSE; + } + *error = __DRI_CTX_ERROR_SUCCESS; return GL_TRUE; } @@ -189,6 +195,7 @@ nouveau_context_destroy(__DRIcontext *dri_ctx) struct nouveau_context *nctx = dri_ctx->driverPrivate; struct gl_context *ctx = &nctx->base; + nouveau_bo_ref(NULL, &nctx->fence); context_drv(ctx)->context_destroy(ctx); } diff --git a/src/mesa/drivers/dri/nouveau/nouveau_context.h b/src/mesa/drivers/dri/nouveau/nouveau_context.h index 7777246..9d06da9 100644 --- a/src/mesa/drivers/dri/nouveau/nouveau_context.h +++ b/src/mesa/drivers/dri/nouveau/nouveau_context.h @@ -65,6 +65,8 @@ struct nouveau_context { BITSET_DECLARE(dirty, MAX_NOUVEAU_STATE); enum nouveau_fallback fallback; + struct nouveau_bo *fence; + struct nouveau_hw_state hw; struct nouveau_bo_state bo; struct nouveau_render_state render; diff --git a/src/mesa/drivers/dri/nouveau/nouveau_driver.c b/src/mesa/drivers/dri/nouveau/nouveau_driver.c index 8532032..6031314 100644 --- a/src/mesa/drivers/dri/nouveau/nouveau_driver.c +++ b/src/mesa/drivers/dri/nouveau/nouveau_driver.c @@ -74,7 +74,17 @@ nouveau_flush(struct gl_context *ctx) static void nouveau_finish(struct gl_context *ctx) { + struct nouveau_context *nctx = to_nouveau_context(ctx); + struct nouveau_channel *chan = context_chan(ctx); + nouveau_flush(ctx); + + MARK_RING(chan, 1, 1); + OUT_RELOC(chan, nctx->fence, 0, NOUVEAU_BO_WR | NOUVEAU_BO_DUMMY, 0, 0); + FIRE_RING(chan); + + nouveau_bo_map(nctx->fence, NOUVEAU_BO_RDWR); + nouveau_bo_unmap(nctx->fence); } void -- 1.7.10