nv50: don't assume a rast is set when validating for clears
authorIlia Mirkin <imirkin@alum.mit.edu>
Mon, 6 Mar 2017 00:45:00 +0000 (19:45 -0500)
committerIlia Mirkin <imirkin@alum.mit.edu>
Sun, 2 Apr 2017 14:58:32 +0000 (10:58 -0400)
Clears can happen before a rast is set, which can in turn cause scissors
and fragprog to be validated. Make sure that we handle this case.

Reported-by: Andrew Randrianasulu <randrianasulu@gmail.com>
Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu>
src/gallium/drivers/nouveau/nv50/nv50_shader_state.c
src/gallium/drivers/nouveau/nv50/nv50_state_validate.c

index d234748a0a0c011ccb07307a71a8061b83291baf..7f32900a6e96494fe64d31e3dcfb56ea43f9097c 100644 (file)
@@ -174,6 +174,9 @@ nv50_fragprog_validate(struct nv50_context *nv50)
    struct nv50_program *fp = nv50->fragprog;
    struct pipe_rasterizer_state *rast = &nv50->rast->pipe;
 
+   if (!fp || !rast)
+      return;
+
    if (nv50->zsa && nv50->zsa->pipe.alpha.enabled) {
       struct pipe_framebuffer_state *fb = &nv50->framebuffer;
       bool blendable = fb->nr_cbufs == 0 || !fb->cbufs[0] ||
index c6f0363075a190e84450a0201864b37f6376fc70..fcf2228c17875d81cba62b140042dada084415e9 100644 (file)
@@ -186,16 +186,17 @@ nv50_validate_scissor(struct nv50_context *nv50)
    struct nouveau_pushbuf *push = nv50->base.pushbuf;
 #ifdef NV50_SCISSORS_CLIPPING
    int minx, maxx, miny, maxy, i;
+   bool rast_scissor = nv50->rast ? nv50->rast->pipe.scissor : false;
 
    if (!(nv50->dirty_3d &
          (NV50_NEW_3D_SCISSOR | NV50_NEW_3D_VIEWPORT | NV50_NEW_3D_FRAMEBUFFER)) &&
-       nv50->state.scissor == nv50->rast->pipe.scissor)
+       nv50->state.scissor == rast_scissor)
       return;
 
-   if (nv50->state.scissor != nv50->rast->pipe.scissor)
+   if (nv50->state.scissor != rast_scissor)
       nv50->scissors_dirty = (1 << NV50_MAX_VIEWPORTS) - 1;
 
-   nv50->state.scissor = nv50->rast->pipe.scissor;
+   nv50->state.scissor = rast_scissor;
 
    if ((nv50->dirty_3d & NV50_NEW_3D_FRAMEBUFFER) && !nv50->state.scissor)
       nv50->scissors_dirty = (1 << NV50_MAX_VIEWPORTS) - 1;