mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-23 15:30:14 +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;
|
||||
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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue