diff options
Diffstat (limited to 'src/mesa')
| -rw-r--r-- | src/mesa/state_tracker/st_atom_depth.c | 11 | ||||
| -rw-r--r-- | src/mesa/state_tracker/st_atom_sampler.c | 2 | ||||
| -rw-r--r-- | src/mesa/state_tracker/st_cb_clear.c | 8 | 
3 files changed, 17 insertions, 4 deletions
diff --git a/src/mesa/state_tracker/st_atom_depth.c b/src/mesa/state_tracker/st_atom_depth.c index 88b80a07fc..3c07afba9a 100644 --- a/src/mesa/state_tracker/st_atom_depth.c +++ b/src/mesa/state_tracker/st_atom_depth.c @@ -94,9 +94,11 @@ static void  update_depth_stencil_alpha(struct st_context *st)  {     struct pipe_depth_stencil_alpha_state *dsa = &st->state.depth_stencil; +   struct pipe_stencil_ref sr;     GLcontext *ctx = st->ctx;     memset(dsa, 0, sizeof(*dsa)); +   memset(&sr, 0, sizeof(sr));     if (ctx->Depth.Test && ctx->DrawBuffer->Visual.depthBits > 0) {        dsa->depth.enabled = 1; @@ -110,9 +112,9 @@ update_depth_stencil_alpha(struct st_context *st)        dsa->stencil[0].fail_op = gl_stencil_op_to_pipe(ctx->Stencil.FailFunc[0]);        dsa->stencil[0].zfail_op = gl_stencil_op_to_pipe(ctx->Stencil.ZFailFunc[0]);        dsa->stencil[0].zpass_op = gl_stencil_op_to_pipe(ctx->Stencil.ZPassFunc[0]); -      dsa->stencil[0].ref_value = ctx->Stencil.Ref[0] & 0xff;        dsa->stencil[0].valuemask = ctx->Stencil.ValueMask[0] & 0xff;        dsa->stencil[0].writemask = ctx->Stencil.WriteMask[0] & 0xff; +      sr.ref_value[0] = ctx->Stencil.Ref[0] & 0xff;        if (ctx->Stencil._TestTwoSide) {           const GLuint back = ctx->Stencil._BackFace; @@ -121,13 +123,17 @@ update_depth_stencil_alpha(struct st_context *st)           dsa->stencil[1].fail_op = gl_stencil_op_to_pipe(ctx->Stencil.FailFunc[back]);           dsa->stencil[1].zfail_op = gl_stencil_op_to_pipe(ctx->Stencil.ZFailFunc[back]);           dsa->stencil[1].zpass_op = gl_stencil_op_to_pipe(ctx->Stencil.ZPassFunc[back]); -         dsa->stencil[1].ref_value = ctx->Stencil.Ref[back] & 0xff;           dsa->stencil[1].valuemask = ctx->Stencil.ValueMask[back] & 0xff;           dsa->stencil[1].writemask = ctx->Stencil.WriteMask[back] & 0xff; +         sr.ref_value[1] = ctx->Stencil.Ref[back] & 0xff;        }        else { +         /* This should be unnecessary. Drivers must not expect this to +          * contain valid data, except the enabled bit +          */           dsa->stencil[1] = dsa->stencil[0];           dsa->stencil[1].enabled = 0; +         sr.ref_value[1] = sr.ref_value[0];        }     } @@ -138,6 +144,7 @@ update_depth_stencil_alpha(struct st_context *st)     }     cso_set_depth_stencil_alpha(st->cso_context, dsa); +   cso_set_stencil_ref(st->cso_context, &sr);  } diff --git a/src/mesa/state_tracker/st_atom_sampler.c b/src/mesa/state_tracker/st_atom_sampler.c index 9d63f1c6ab..a8262a5e1a 100644 --- a/src/mesa/state_tracker/st_atom_sampler.c +++ b/src/mesa/state_tracker/st_atom_sampler.c @@ -211,7 +211,7 @@ update_samplers(struct st_context *st)                              teximg ? teximg->_BaseFormat : GL_RGBA,                              sampler->border_color); -	 sampler->max_anisotropy = texobj->MaxAnisotropy; +	 sampler->max_anisotropy = (texobj->MaxAnisotropy == 1.0 ? 0 : (GLuint)texobj->MaxAnisotropy);           /* only care about ARB_shadow, not SGI shadow */           if (texobj->CompareMode == GL_COMPARE_R_TO_TEXTURE) { diff --git a/src/mesa/state_tracker/st_cb_clear.c b/src/mesa/state_tracker/st_cb_clear.c index 0c7bcb8597..898c32293d 100644 --- a/src/mesa/state_tracker/st_cb_clear.c +++ b/src/mesa/state_tracker/st_cb_clear.c @@ -215,6 +215,7 @@ clear_with_quad(GLcontext *ctx,     */     cso_save_blend(st->cso_context); +   cso_save_stencil_ref(st->cso_context);     cso_save_depth_stencil_alpha(st->cso_context);     cso_save_rasterizer(st->cso_context);     cso_save_fragment_shader(st->cso_context); @@ -254,14 +255,17 @@ clear_with_quad(GLcontext *ctx,        }        if (stencil) { +         struct pipe_stencil_ref stencil_ref; +         memset(&stencil_ref, 0, sizeof(stencil_ref));           depth_stencil.stencil[0].enabled = 1;           depth_stencil.stencil[0].func = PIPE_FUNC_ALWAYS;           depth_stencil.stencil[0].fail_op = PIPE_STENCIL_OP_REPLACE;           depth_stencil.stencil[0].zpass_op = PIPE_STENCIL_OP_REPLACE;           depth_stencil.stencil[0].zfail_op = PIPE_STENCIL_OP_REPLACE; -         depth_stencil.stencil[0].ref_value = ctx->Stencil.Clear;           depth_stencil.stencil[0].valuemask = 0xff;           depth_stencil.stencil[0].writemask = ctx->Stencil.WriteMask[0] & 0xff; +         stencil_ref.ref_value[0] = ctx->Stencil.Clear; +         cso_set_stencil_ref(st->cso_context, &stencil_ref);        }        cso_set_depth_stencil_alpha(st->cso_context, &depth_stencil); @@ -277,10 +281,12 @@ clear_with_quad(GLcontext *ctx,     /* Restore pipe state */     cso_restore_blend(st->cso_context); +   cso_restore_stencil_ref(st->cso_context);     cso_restore_depth_stencil_alpha(st->cso_context);     cso_restore_rasterizer(st->cso_context);     cso_restore_fragment_shader(st->cso_context);     cso_restore_vertex_shader(st->cso_context); +  }  | 
