From: Ilia Mirkin Date: Mon, 6 Mar 2017 00:45:00 +0000 (-0500) Subject: nv50: don't assume a rast is set when validating for clears X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=7a0c1eee0c25e343d8c276e4471e4a113d61f233;p=mesa.git nv50: don't assume a rast is set when validating for clears 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 Signed-off-by: Ilia Mirkin --- diff --git a/src/gallium/drivers/nouveau/nv50/nv50_shader_state.c b/src/gallium/drivers/nouveau/nv50/nv50_shader_state.c index d234748a0a0..7f32900a6e9 100644 --- a/src/gallium/drivers/nouveau/nv50/nv50_shader_state.c +++ b/src/gallium/drivers/nouveau/nv50/nv50_shader_state.c @@ -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] || diff --git a/src/gallium/drivers/nouveau/nv50/nv50_state_validate.c b/src/gallium/drivers/nouveau/nv50/nv50_state_validate.c index c6f0363075a..fcf2228c178 100644 --- a/src/gallium/drivers/nouveau/nv50/nv50_state_validate.c +++ b/src/gallium/drivers/nouveau/nv50/nv50_state_validate.c @@ -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;