nvc0: avoid crash on updating RASTERIZE_ENABLE state

When doing a blit with the 3D engine, the rasterizer or zsa cso may
be NULL.
This commit is contained in:
Christoph Bumiller 2013-03-11 20:53:25 +01:00
parent 4d28aff48f
commit 8aa8b0539e
2 changed files with 18 additions and 4 deletions

View file

@ -451,10 +451,14 @@ nvc0_validate_derived_1(struct nvc0_context *nvc0)
struct nouveau_pushbuf *push = nvc0->base.pushbuf; struct nouveau_pushbuf *push = nvc0->base.pushbuf;
boolean rasterizer_discard; boolean rasterizer_discard;
rasterizer_discard = (!nvc0->fragprog || !nvc0->fragprog->hdr[18]) && if (nvc0->rast && nvc0->rast->pipe.rasterizer_discard) {
!nvc0->zsa->pipe.depth.enabled && !nvc0->zsa->pipe.stencil[0].enabled; rasterizer_discard = TRUE;
rasterizer_discard = rasterizer_discard || } else {
nvc0->rast->pipe.rasterizer_discard; 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) { if (rasterizer_discard != nvc0->state.rasterizer_discard) {
nvc0->state.rasterizer_discard = rasterizer_discard; nvc0->state.rasterizer_discard = rasterizer_discard;

View file

@ -472,6 +472,7 @@ struct nvc0_blitctx
enum pipe_texture_target target; enum pipe_texture_target target;
struct { struct {
struct pipe_framebuffer_state fb; struct pipe_framebuffer_state fb;
struct nvc0_rasterizer_stateobj *rast;
struct nvc0_program *vp; struct nvc0_program *vp;
struct nvc0_program *tcp; struct nvc0_program *tcp;
struct nvc0_program *tep; struct nvc0_program *tep;
@ -483,6 +484,7 @@ struct nvc0_blitctx
struct nv50_tsc_entry *sampler[2]; struct nv50_tsc_entry *sampler[2];
uint32_t dirty; uint32_t dirty;
} saved; } saved;
struct nvc0_rasterizer_stateobj rast;
}; };
static void 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.cbufs[0] = nvc0->framebuffer.cbufs[0];
ctx->saved.fb.zsbuf = nvc0->framebuffer.zsbuf; ctx->saved.fb.zsbuf = nvc0->framebuffer.zsbuf;
ctx->saved.rast = nvc0->rast;
ctx->saved.vp = nvc0->vertprog; ctx->saved.vp = nvc0->vertprog;
ctx->saved.tcp = nvc0->tctlprog; ctx->saved.tcp = nvc0->tctlprog;
ctx->saved.tep = nvc0->tevlprog; ctx->saved.tep = nvc0->tevlprog;
ctx->saved.gp = nvc0->gmtyprog; ctx->saved.gp = nvc0->gmtyprog;
ctx->saved.fp = nvc0->fragprog; ctx->saved.fp = nvc0->fragprog;
nvc0->rast = &ctx->rast;
nvc0->vertprog = &blitter->vp; nvc0->vertprog = &blitter->vp;
nvc0->tctlprog = NULL; nvc0->tctlprog = NULL;
nvc0->tevlprog = 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.cbufs[0] = blit->saved.fb.cbufs[0];
nvc0->framebuffer.zsbuf = blit->saved.fb.zsbuf; nvc0->framebuffer.zsbuf = blit->saved.fb.zsbuf;
nvc0->rast = blit->saved.rast;
nvc0->vertprog = blit->saved.vp; nvc0->vertprog = blit->saved.vp;
nvc0->tctlprog = blit->saved.tcp; nvc0->tctlprog = blit->saved.tcp;
nvc0->tevlprog = blit->saved.tep; nvc0->tevlprog = blit->saved.tep;
@ -1182,6 +1190,8 @@ nvc0_blitctx_create(struct nvc0_context *nvc0)
nvc0->blit->nvc0 = nvc0; nvc0->blit->nvc0 = nvc0;
nvc0->blit->rast.pipe.gl_rasterization_rules = 1;
return TRUE; return TRUE;
} }