dri/nouveau: Just reemit the BO state on pushbuf flush.
authorFrancisco Jerez <currojerez@riseup.net>
Wed, 10 Mar 2010 22:51:06 +0000 (23:51 +0100)
committerFrancisco Jerez <currojerez@riseup.net>
Wed, 10 Mar 2010 23:59:59 +0000 (00:59 +0100)
Reemitting dirty states on flush causes problems if the GL context
isn't fully consistent when we get to it. It didn't serve any specific
purpose, so, use nouveau_bo_state_emit instead.

src/mesa/drivers/dri/nouveau/nouveau_context.c
src/mesa/drivers/dri/nouveau/nouveau_context.h
src/mesa/drivers/dri/nouveau/nv04_context.c

index 502e01255cbbb695154c6c361af9c8be984adce2..be57d48b8ddf5f3cc653ad172d76533c8d7afe77 100644 (file)
@@ -69,8 +69,8 @@ nouveau_channel_flush_notify(struct nouveau_channel *chan)
        struct nouveau_context *nctx = chan->user_private;
        GLcontext *ctx = &nctx->base;
 
-       if (nctx->fallback < SWRAST && ctx->DrawBuffer)
-               nouveau_state_emit(&nctx->base);
+       if (nctx->fallback < SWRAST)
+               nouveau_bo_state_emit(ctx);
 }
 
 GLboolean
index 682f8a414e3e680df201ab66fed4a1062ebb42cb..fe64fec930b8b672c374f34e2f286e65a03f79be 100644 (file)
@@ -85,6 +85,8 @@ struct nouveau_context {
        BITSET_SET(to_nouveau_context(ctx)->dirty, NOUVEAU_STATE_##s)
 #define context_dirty_i(ctx, s, i) \
        BITSET_SET(to_nouveau_context(ctx)->dirty, NOUVEAU_STATE_##s##0 + i)
+#define context_emit(ctx, s) \
+       context_drv(ctx)->emit[NOUVEAU_STATE_##s](ctx, NOUVEAU_STATE_##s)
 
 GLboolean
 nouveau_context_create(const __GLcontextModes *visual, __DRIcontext *dri_ctx,
index a442425e4483408749f982196b46a6500d3a56f6..3624b3af9211b77ec0ec2114af91e5b7f83fc888 100644 (file)
@@ -75,18 +75,16 @@ nv04_channel_flush_notify(struct nouveau_channel *chan)
        struct nouveau_context *nctx = chan->user_private;
        GLcontext *ctx = &nctx->base;
 
-       if (nctx->fallback < SWRAST && ctx->DrawBuffer) {
-               GLcontext *ctx = &nctx->base;
-
+       if (nctx->fallback < SWRAST) {
                /* Flushing seems to clobber the engine context. */
-               context_dirty_i(ctx, TEX_OBJ, 0);
-               context_dirty_i(ctx, TEX_OBJ, 1);
-               context_dirty_i(ctx, TEX_ENV, 0);
-               context_dirty_i(ctx, TEX_ENV, 1);
-               context_dirty(ctx, CONTROL);
-               context_dirty(ctx, BLEND);
-
-               nouveau_state_emit(ctx);
+               context_emit(ctx, TEX_OBJ0);
+               context_emit(ctx, TEX_OBJ1);
+               context_emit(ctx, TEX_ENV0);
+               context_emit(ctx, TEX_ENV1);
+               context_emit(ctx, CONTROL);
+               context_emit(ctx, BLEND);
+
+               nouveau_bo_state_emit(ctx);
        }
 }
 
@@ -200,9 +198,9 @@ nv04_context_create(struct nouveau_screen *screen, const GLvisual *visual,
        if (ret)
                goto fail;
 
+       init_dummy_texture(ctx);
        nv04_hwctx_init(ctx);
        nv04_render_init(ctx);
-       init_dummy_texture(ctx);
 
        return ctx;