aboutsummaryrefslogtreecommitdiffstats
path: root/src/gallium/drivers/nvc0
diff options
context:
space:
mode:
authorChristoph Bumiller <[email protected]>2013-03-11 20:53:25 +0100
committerChristoph Bumiller <[email protected]>2013-03-12 12:55:37 +0100
commit8aa8b0539eda00b9bafacb69774b26975db66ae4 (patch)
tree3cb46eb6b202691d484fb6b97f2fd7de919b119b /src/gallium/drivers/nvc0
parent4d28aff48fb8e93e2faf2ed042663f7c32c5af7b (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.c12
-rw-r--r--src/gallium/drivers/nvc0/nvc0_surface.c10
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;
}