Merge branch '7.8' into master
[mesa.git] / src / mesa / state_tracker / st_atom_depth.c
index 0e791ceb20873dfec2282c9caee42d29a69a458a..3c07afba9aaf588a78e97d1b24428eac215c4ee8 100644 (file)
@@ -94,50 +94,57 @@ 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));
 
-   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 (st->ctx->Query.CurrentOcclusionObject &&
-       st->ctx->Query.CurrentOcclusionObject->Active)
-      dsa->depth.occlusion_count = 1;
+   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->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].value_mask = st->ctx->Stencil.ValueMask[0] & 0xff;
-      dsa->stencil[0].write_mask = 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].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;
          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].value_mask = st->ctx->Stencil.ValueMask[1] & 0xff;
-         dsa->stencil[1].write_mask = 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].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];
       }
    }
 
-   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 = 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);
+   cso_set_stencil_ref(st->cso_context, &sr);
 }