Parcourir la source

nvc0: avoid crash on updating RASTERIZE_ENABLE state

When doing a blit with the 3D engine, the rasterizer or zsa cso may
be NULL.
tags/mesa-9.2-rc1
Christoph Bumiller il y a 12 ans
Parent
révision
8aa8b0539e

+ 8
- 4
src/gallium/drivers/nvc0/nvc0_state_validate.c Voir le fichier

@@ -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;

+ 10
- 0
src/gallium/drivers/nvc0/nvc0_surface.c Voir le fichier

@@ -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;
}


Chargement…
Annuler
Enregistrer