diff options
Diffstat (limited to 'src/mesa/state_tracker/st_atom_depth.c')
-rw-r--r-- | src/mesa/state_tracker/st_atom_depth.c | 54 |
1 files changed, 29 insertions, 25 deletions
diff --git a/src/mesa/state_tracker/st_atom_depth.c b/src/mesa/state_tracker/st_atom_depth.c index 2d617bd95d..0aa128f947 100644 --- a/src/mesa/state_tracker/st_atom_depth.c +++ b/src/mesa/state_tracker/st_atom_depth.c @@ -94,36 +94,40 @@ static void update_depth_stencil_alpha(struct st_context *st) { struct pipe_depth_stencil_alpha_state *dsa = &st->state.depth_stencil; + GLcontext *ctx = st->ctx; memset(dsa, 0, sizeof(*dsa)); - dsa->depth.enabled = st->ctx->Depth.Test; - dsa->depth.writemask = st->ctx->Depth.Mask; - dsa->depth.func = st_compare_func_to_pipe(st->ctx->Depth.Func); + if (ctx->Depth.Test && ctx->DrawBuffer->Visual.depthBits > 0) { + dsa->depth.enabled = 1; + dsa->depth.writemask = ctx->Depth.Mask; + dsa->depth.func = st_compare_func_to_pipe(ctx->Depth.Func); + } - if (st->ctx->Query.CurrentOcclusionObject && - st->ctx->Query.CurrentOcclusionObject->Active) + if (ctx->Query.CurrentOcclusionObject && + ctx->Query.CurrentOcclusionObject->Active) dsa->depth.occlusion_count = 1; - if (st->ctx->Stencil.Enabled && st->ctx->Visual.stencilBits > 0) { + if (ctx->Stencil.Enabled && ctx->DrawBuffer->Visual.stencilBits > 0) { dsa->stencil[0].enabled = 1; - dsa->stencil[0].func = st_compare_func_to_pipe(st->ctx->Stencil.Function[0]); - dsa->stencil[0].fail_op = gl_stencil_op_to_pipe(st->ctx->Stencil.FailFunc[0]); - dsa->stencil[0].zfail_op = gl_stencil_op_to_pipe(st->ctx->Stencil.ZFailFunc[0]); - dsa->stencil[0].zpass_op = gl_stencil_op_to_pipe(st->ctx->Stencil.ZPassFunc[0]); - dsa->stencil[0].ref_value = st->ctx->Stencil.Ref[0] & 0xff; - dsa->stencil[0].valuemask = st->ctx->Stencil.ValueMask[0] & 0xff; - dsa->stencil[0].writemask = st->ctx->Stencil.WriteMask[0] & 0xff; - - if (st->ctx->Stencil._TestTwoSide) { + dsa->stencil[0].func = st_compare_func_to_pipe(ctx->Stencil.Function[0]); + 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; + + if (ctx->Stencil._TestTwoSide) { + const GLuint back = ctx->Stencil._BackFace; dsa->stencil[1].enabled = 1; - dsa->stencil[1].func = st_compare_func_to_pipe(st->ctx->Stencil.Function[1]); - dsa->stencil[1].fail_op = gl_stencil_op_to_pipe(st->ctx->Stencil.FailFunc[1]); - dsa->stencil[1].zfail_op = gl_stencil_op_to_pipe(st->ctx->Stencil.ZFailFunc[1]); - dsa->stencil[1].zpass_op = gl_stencil_op_to_pipe(st->ctx->Stencil.ZPassFunc[1]); - dsa->stencil[1].ref_value = st->ctx->Stencil.Ref[1] & 0xff; - dsa->stencil[1].valuemask = st->ctx->Stencil.ValueMask[1] & 0xff; - dsa->stencil[1].writemask = st->ctx->Stencil.WriteMask[1] & 0xff; + dsa->stencil[1].func = st_compare_func_to_pipe(ctx->Stencil.Function[back]); + 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; } else { dsa->stencil[1] = dsa->stencil[0]; @@ -131,10 +135,10 @@ update_depth_stencil_alpha(struct st_context *st) } } - if (st->ctx->Color.AlphaEnabled) { + if (ctx->Color.AlphaEnabled) { dsa->alpha.enabled = 1; - dsa->alpha.func = st_compare_func_to_pipe(st->ctx->Color.AlphaFunc); - dsa->alpha.ref_value = st->ctx->Color.AlphaRef; + dsa->alpha.func = st_compare_func_to_pipe(ctx->Color.AlphaFunc); + dsa->alpha.ref_value = ctx->Color.AlphaRef; } cso_set_depth_stencil_alpha(st->cso_context, dsa); |