mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-23 22:00:13 +01:00
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:
parent
4d28aff48f
commit
8aa8b0539e
2 changed files with 18 additions and 4 deletions
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue