diff options
author | Christoph Bumiller <[email protected]> | 2013-03-11 20:53:25 +0100 |
---|---|---|
committer | Christoph Bumiller <[email protected]> | 2013-03-12 12:55:37 +0100 |
commit | 8aa8b0539eda00b9bafacb69774b26975db66ae4 (patch) | |
tree | 3cb46eb6b202691d484fb6b97f2fd7de919b119b /src/gallium/drivers/nvc0 | |
parent | 4d28aff48fb8e93e2faf2ed042663f7c32c5af7b (diff) |
nvc0: avoid crash on updating RASTERIZE_ENABLE state
When doing a blit with the 3D engine, the rasterizer or zsa cso may
be NULL.
Diffstat (limited to 'src/gallium/drivers/nvc0')
-rw-r--r-- | src/gallium/drivers/nvc0/nvc0_state_validate.c | 12 | ||||
-rw-r--r-- | src/gallium/drivers/nvc0/nvc0_surface.c | 10 |
2 files changed, 18 insertions, 4 deletions
diff --git a/src/gallium/drivers/nvc0/nvc0_state_validate.c b/src/gallium/drivers/nvc0/nvc0_state_validate.c index 1f12de61e9f..28573b51193 100644 --- a/src/gallium/drivers/nvc0/nvc0_state_validate.c +++ b/src/gallium/drivers/nvc0/nvc0_state_validate.c @@ -451,10 +451,14 @@ nvc0_validate_derived_1(struct nvc0_context *nvc0) struct nouveau_pushbuf *push = nvc0->base.pushbuf; boolean rasterizer_discard; - rasterizer_discard = (!nvc0->fragprog || !nvc0->fragprog->hdr[18]) && - !nvc0->zsa->pipe.depth.enabled && !nvc0->zsa->pipe.stencil[0].enabled; - rasterizer_discard = rasterizer_discard || - nvc0->rast->pipe.rasterizer_discard; + if (nvc0->rast && nvc0->rast->pipe.rasterizer_discard) { + rasterizer_discard = TRUE; + } else { + boolean zs = nvc0->zsa && + (nvc0->zsa->pipe.depth.enabled || nvc0->zsa->pipe.stencil[0].enabled); + rasterizer_discard = !zs && + (!nvc0->fragprog || !nvc0->fragprog->hdr[18]); + } if (rasterizer_discard != nvc0->state.rasterizer_discard) { nvc0->state.rasterizer_discard = rasterizer_discard; diff --git a/src/gallium/drivers/nvc0/nvc0_surface.c b/src/gallium/drivers/nvc0/nvc0_surface.c index 77330c52ac5..cd4e3a75dc1 100644 --- a/src/gallium/drivers/nvc0/nvc0_surface.c +++ b/src/gallium/drivers/nvc0/nvc0_surface.c @@ -472,6 +472,7 @@ struct nvc0_blitctx enum pipe_texture_target target; struct { struct pipe_framebuffer_state fb; + struct nvc0_rasterizer_stateobj *rast; struct nvc0_program *vp; struct nvc0_program *tcp; struct nvc0_program *tep; @@ -483,6 +484,7 @@ struct nvc0_blitctx struct nv50_tsc_entry *sampler[2]; uint32_t dirty; } saved; + struct nvc0_rasterizer_stateobj rast; }; static void @@ -701,12 +703,16 @@ nvc0_blitctx_pre_blit(struct nvc0_blitctx *ctx) ctx->saved.fb.cbufs[0] = nvc0->framebuffer.cbufs[0]; ctx->saved.fb.zsbuf = nvc0->framebuffer.zsbuf; + ctx->saved.rast = nvc0->rast; + ctx->saved.vp = nvc0->vertprog; ctx->saved.tcp = nvc0->tctlprog; ctx->saved.tep = nvc0->tevlprog; ctx->saved.gp = nvc0->gmtyprog; ctx->saved.fp = nvc0->fragprog; + nvc0->rast = &ctx->rast; + nvc0->vertprog = &blitter->vp; nvc0->tctlprog = NULL; nvc0->tevlprog = NULL; @@ -760,6 +766,8 @@ nvc0_blitctx_post_blit(struct nvc0_blitctx *blit) nvc0->framebuffer.cbufs[0] = blit->saved.fb.cbufs[0]; nvc0->framebuffer.zsbuf = blit->saved.fb.zsbuf; + nvc0->rast = blit->saved.rast; + nvc0->vertprog = blit->saved.vp; nvc0->tctlprog = blit->saved.tcp; nvc0->tevlprog = blit->saved.tep; @@ -1182,6 +1190,8 @@ nvc0_blitctx_create(struct nvc0_context *nvc0) nvc0->blit->nvc0 = nvc0; + nvc0->blit->rast.pipe.gl_rasterization_rules = 1; + return TRUE; } |