コード例 #1
0
        internal void PlatformApplyState(GraphicsDevice device)
        {
            if (_state == null)
            {
                // Build the description.
                var desc = new SharpDX.Direct3D11.DepthStencilStateDescription
                {
                    IsDepthEnabled  = DepthBufferEnable,
                    DepthComparison = DepthBufferFunction.ToComparison()
                };

                if (DepthBufferWriteEnable)
                {
                    desc.DepthWriteMask = SharpDX.Direct3D11.DepthWriteMask.All;
                }
                else
                {
                    desc.DepthWriteMask = SharpDX.Direct3D11.DepthWriteMask.Zero;
                }

                desc.IsStencilEnabled = StencilEnable;
                desc.StencilReadMask  = (byte)StencilMask; // TODO: Should this instead grab the upper 8bits?
                desc.StencilWriteMask = (byte)StencilWriteMask;

                if (TwoSidedStencilMode)
                {
                    desc.BackFace.Comparison         = CounterClockwiseStencilFunction.ToComparison();
                    desc.BackFace.DepthFailOperation = GetStencilOp(CounterClockwiseStencilDepthBufferFail);
                    desc.BackFace.FailOperation      = GetStencilOp(CounterClockwiseStencilFail);
                    desc.BackFace.PassOperation      = GetStencilOp(CounterClockwiseStencilPass);
                }
                else
                {   //use same settings as frontFace
                    desc.BackFace.Comparison         = StencilFunction.ToComparison();
                    desc.BackFace.DepthFailOperation = GetStencilOp(StencilDepthBufferFail);
                    desc.BackFace.FailOperation      = GetStencilOp(StencilFail);
                    desc.BackFace.PassOperation      = GetStencilOp(StencilPass);
                }

                desc.FrontFace.Comparison         = StencilFunction.ToComparison();
                desc.FrontFace.DepthFailOperation = GetStencilOp(StencilDepthBufferFail);
                desc.FrontFace.FailOperation      = GetStencilOp(StencilFail);
                desc.FrontFace.PassOperation      = GetStencilOp(StencilPass);

                // Create the state.
                _state = new SharpDX.Direct3D11.DepthStencilState(GraphicsDevice._d3dDevice, desc);
            }

            Debug.Assert(GraphicsDevice == device, "The state was created for a different device!");

            // NOTE: We make the assumption here that the caller has
            // locked the d3dContext for us to use.

            // Apply the state!
            device._d3dContext.OutputMerger.SetDepthStencilState(_state, ReferenceStencil);
        }
コード例 #2
0
        internal void PlatformApplyState(GraphicsDevice device, bool force = false)
        {
            if (force || this.DepthBufferEnable != device._lastDepthStencilState.DepthBufferEnable)
            {
                if (!DepthBufferEnable)
                {
                    GL.Disable(EnableCap.DepthTest);
                    GraphicsExtensions.CheckGLError();
                }
                else
                {
                    // enable Depth Buffer
                    GL.Enable(EnableCap.DepthTest);
                    GraphicsExtensions.CheckGLError();
                }
                device._lastDepthStencilState.DepthBufferEnable = this.DepthBufferEnable;
            }

            if (force || this.DepthBufferFunction != device._lastDepthStencilState.DepthBufferFunction)
            {
                GL.DepthFunc(DepthBufferFunction.GetDepthFunction());
                GraphicsExtensions.CheckGLError();
                device._lastDepthStencilState.DepthBufferFunction = this.DepthBufferFunction;
            }

            if (force || this.DepthBufferWriteEnable != device._lastDepthStencilState.DepthBufferWriteEnable)
            {
                GL.DepthMask(DepthBufferWriteEnable);
                GraphicsExtensions.CheckGLError();
                device._lastDepthStencilState.DepthBufferWriteEnable = this.DepthBufferWriteEnable;
            }

            if (force || this.StencilEnable != device._lastDepthStencilState.StencilEnable)
            {
                if (!StencilEnable)
                {
                    GL.Disable(EnableCap.StencilTest);
                    GraphicsExtensions.CheckGLError();
                }
                else
                {
                    // enable Stencil
                    GL.Enable(EnableCap.StencilTest);
                    GraphicsExtensions.CheckGLError();
                }
                device._lastDepthStencilState.StencilEnable = this.StencilEnable;
            }

            // set function
            if (this.TwoSidedStencilMode)
            {
#if GLES
                var cullFaceModeFront = CullFaceMode.Front;
                var cullFaceModeBack  = CullFaceMode.Back;
                var stencilFaceFront  = CullFaceMode.Front;
                var stencilFaceBack   = CullFaceMode.Back;
#elif MONOMAC
                var cullFaceModeFront = (Version20)CullFaceMode.Front;
                var cullFaceModeBack  = (Version20)CullFaceMode.Back;
                var stencilFaceFront  = StencilFace.Front;
                var stencilFaceBack   = StencilFace.Back;
#else
                var cullFaceModeFront = StencilFace.Front;
                var cullFaceModeBack  = StencilFace.Back;
                var stencilFaceFront  = StencilFace.Front;
                var stencilFaceBack   = StencilFace.Back;
#endif

                if (force ||
                    this.TwoSidedStencilMode != device._lastDepthStencilState.TwoSidedStencilMode ||
                    this.StencilFunction != device._lastDepthStencilState.StencilFunction ||
                    this.ReferenceStencil != device._lastDepthStencilState.ReferenceStencil ||
                    this.StencilMask != device._lastDepthStencilState.StencilMask)
                {
                    GL.StencilFuncSeparate(cullFaceModeFront, GetStencilFunc(this.StencilFunction),
                                           this.ReferenceStencil, this.StencilMask);
                    GraphicsExtensions.CheckGLError();
                    device._lastDepthStencilState.StencilFunction  = this.StencilFunction;
                    device._lastDepthStencilState.ReferenceStencil = this.ReferenceStencil;
                    device._lastDepthStencilState.StencilMask      = this.StencilMask;
                }

                if (force ||
                    this.TwoSidedStencilMode != device._lastDepthStencilState.TwoSidedStencilMode ||
                    this.CounterClockwiseStencilFunction != device._lastDepthStencilState.CounterClockwiseStencilFunction ||
                    this.ReferenceStencil != device._lastDepthStencilState.ReferenceStencil ||
                    this.StencilMask != device._lastDepthStencilState.StencilMask)
                {
                    GL.StencilFuncSeparate(cullFaceModeBack, GetStencilFunc(this.CounterClockwiseStencilFunction),
                                           this.ReferenceStencil, this.StencilMask);
                    GraphicsExtensions.CheckGLError();
                    device._lastDepthStencilState.CounterClockwiseStencilFunction = this.CounterClockwiseStencilFunction;
                    device._lastDepthStencilState.ReferenceStencil = this.ReferenceStencil;
                    device._lastDepthStencilState.StencilMask      = this.StencilMask;
                }


                if (force ||
                    this.TwoSidedStencilMode != device._lastDepthStencilState.TwoSidedStencilMode ||
                    this.StencilFail != device._lastDepthStencilState.StencilFail ||
                    this.StencilDepthBufferFail != device._lastDepthStencilState.StencilDepthBufferFail ||
                    this.StencilPass != device._lastDepthStencilState.StencilPass)
                {
                    GL.StencilOpSeparate(stencilFaceFront, GetStencilOp(this.StencilFail),
                                         GetStencilOp(this.StencilDepthBufferFail),
                                         GetStencilOp(this.StencilPass));
                    GraphicsExtensions.CheckGLError();
                    device._lastDepthStencilState.StencilFail            = this.StencilFail;
                    device._lastDepthStencilState.StencilDepthBufferFail = this.StencilDepthBufferFail;
                    device._lastDepthStencilState.StencilPass            = this.StencilPass;
                }

                if (force ||
                    this.TwoSidedStencilMode != device._lastDepthStencilState.TwoSidedStencilMode ||
                    this.CounterClockwiseStencilFail != device._lastDepthStencilState.CounterClockwiseStencilFail ||
                    this.CounterClockwiseStencilDepthBufferFail != device._lastDepthStencilState.CounterClockwiseStencilDepthBufferFail ||
                    this.CounterClockwiseStencilPass != device._lastDepthStencilState.CounterClockwiseStencilPass)
                {
                    GL.StencilOpSeparate(stencilFaceBack, GetStencilOp(this.CounterClockwiseStencilFail),
                                         GetStencilOp(this.CounterClockwiseStencilDepthBufferFail),
                                         GetStencilOp(this.CounterClockwiseStencilPass));
                    GraphicsExtensions.CheckGLError();
                    device._lastDepthStencilState.CounterClockwiseStencilFail            = this.CounterClockwiseStencilFail;
                    device._lastDepthStencilState.CounterClockwiseStencilDepthBufferFail = this.CounterClockwiseStencilDepthBufferFail;
                    device._lastDepthStencilState.CounterClockwiseStencilPass            = this.CounterClockwiseStencilPass;
                }
            }
            else
            {
                if (force ||
                    this.TwoSidedStencilMode != device._lastDepthStencilState.TwoSidedStencilMode ||
                    this.StencilFunction != device._lastDepthStencilState.StencilFunction ||
                    this.ReferenceStencil != device._lastDepthStencilState.ReferenceStencil ||
                    this.StencilMask != device._lastDepthStencilState.StencilMask)
                {
                    GL.StencilFunc(GetStencilFunc(this.StencilFunction), ReferenceStencil, StencilMask);
                    GraphicsExtensions.CheckGLError();
                    device._lastDepthStencilState.StencilFunction  = this.StencilFunction;
                    device._lastDepthStencilState.ReferenceStencil = this.ReferenceStencil;
                    device._lastDepthStencilState.StencilMask      = this.StencilMask;
                }

                if (force ||
                    this.TwoSidedStencilMode != device._lastDepthStencilState.TwoSidedStencilMode ||
                    this.StencilFail != device._lastDepthStencilState.StencilFail ||
                    this.StencilDepthBufferFail != device._lastDepthStencilState.StencilDepthBufferFail ||
                    this.StencilPass != device._lastDepthStencilState.StencilPass)
                {
                    GL.StencilOp(GetStencilOp(StencilFail),
                                 GetStencilOp(StencilDepthBufferFail),
                                 GetStencilOp(StencilPass));
                    GraphicsExtensions.CheckGLError();
                    device._lastDepthStencilState.StencilFail            = this.StencilFail;
                    device._lastDepthStencilState.StencilDepthBufferFail = this.StencilDepthBufferFail;
                    device._lastDepthStencilState.StencilPass            = this.StencilPass;
                }
            }

            device._lastDepthStencilState.TwoSidedStencilMode = this.TwoSidedStencilMode;

            if (force || this.StencilWriteMask != device._lastDepthStencilState.StencilWriteMask)
            {
                GL.StencilMask(this.StencilWriteMask);
                GraphicsExtensions.CheckGLError();
                device._lastDepthStencilState.StencilWriteMask = this.StencilWriteMask;
            }
        }
コード例 #3
0
        internal void PlatformApplyState(GraphicsDevice device, bool force = false)
        {
            if (force || this.DepthBufferEnable != device._lastDepthStencilState.DepthBufferEnable)
            {
                if (!DepthBufferEnable)
                {
                    gl.disable(gl.DEPTH_TEST);
                    GraphicsExtensions.CheckGLError();
                }
                else
                {
                    // enable Depth Buffer
                    gl.enable(gl.DEPTH_TEST);
                    GraphicsExtensions.CheckGLError();
                }
                device._lastDepthStencilState.DepthBufferEnable = this.DepthBufferEnable;
            }

            if (force || this.DepthBufferFunction != device._lastDepthStencilState.DepthBufferFunction)
            {
                gl.depthFunc(DepthBufferFunction.GetDepthFunction());
                GraphicsExtensions.CheckGLError();
                device._lastDepthStencilState.DepthBufferFunction = this.DepthBufferFunction;
            }

            if (force || this.DepthBufferWriteEnable != device._lastDepthStencilState.DepthBufferWriteEnable)
            {
                gl.depthMask(DepthBufferWriteEnable);
                GraphicsExtensions.CheckGLError();
                device._lastDepthStencilState.DepthBufferWriteEnable = this.DepthBufferWriteEnable;
            }

            if (force || this.StencilEnable != device._lastDepthStencilState.StencilEnable)
            {
                if (!StencilEnable)
                {
                    gl.disable(gl.STENCIL_TEST);
                    GraphicsExtensions.CheckGLError();
                }
                else
                {
                    // enable Stencil
                    gl.enable(gl.STENCIL_TEST);
                    GraphicsExtensions.CheckGLError();
                }
                device._lastDepthStencilState.StencilEnable = this.StencilEnable;
            }

            // set function
            if (this.TwoSidedStencilMode)
            {
                var cullFaceModeFront = gl.FRONT;
                var cullFaceModeBack  = gl.BACK;
                var stencilFaceFront  = gl.FRONT;
                var stencilFaceBack   = gl.BACK;

                if (force ||
                    this.TwoSidedStencilMode != device._lastDepthStencilState.TwoSidedStencilMode ||
                    this.StencilFunction != device._lastDepthStencilState.StencilFunction ||
                    this.ReferenceStencil != device._lastDepthStencilState.ReferenceStencil ||
                    this.StencilMask != device._lastDepthStencilState.StencilMask)
                {
                    gl.stencilFuncSeparate(cullFaceModeFront, GetStencilFunc(this.StencilFunction),
                                           this.ReferenceStencil, this.StencilMask);
                    GraphicsExtensions.CheckGLError();
                    device._lastDepthStencilState.StencilFunction  = this.StencilFunction;
                    device._lastDepthStencilState.ReferenceStencil = this.ReferenceStencil;
                    device._lastDepthStencilState.StencilMask      = this.StencilMask;
                }

                if (force ||
                    this.TwoSidedStencilMode != device._lastDepthStencilState.TwoSidedStencilMode ||
                    this.CounterClockwiseStencilFunction != device._lastDepthStencilState.CounterClockwiseStencilFunction ||
                    this.ReferenceStencil != device._lastDepthStencilState.ReferenceStencil ||
                    this.StencilMask != device._lastDepthStencilState.StencilMask)
                {
                    gl.stencilFuncSeparate(cullFaceModeBack, GetStencilFunc(this.CounterClockwiseStencilFunction),
                                           this.ReferenceStencil, this.StencilMask);
                    GraphicsExtensions.CheckGLError();
                    device._lastDepthStencilState.CounterClockwiseStencilFunction = this.CounterClockwiseStencilFunction;
                    device._lastDepthStencilState.ReferenceStencil = this.ReferenceStencil;
                    device._lastDepthStencilState.StencilMask      = this.StencilMask;
                }


                if (force ||
                    this.TwoSidedStencilMode != device._lastDepthStencilState.TwoSidedStencilMode ||
                    this.StencilFail != device._lastDepthStencilState.StencilFail ||
                    this.StencilDepthBufferFail != device._lastDepthStencilState.StencilDepthBufferFail ||
                    this.StencilPass != device._lastDepthStencilState.StencilPass)
                {
                    gl.stencilOpSeparate(stencilFaceFront, GetStencilOp(this.StencilFail),
                                         GetStencilOp(this.StencilDepthBufferFail),
                                         GetStencilOp(this.StencilPass));
                    GraphicsExtensions.CheckGLError();
                    device._lastDepthStencilState.StencilFail            = this.StencilFail;
                    device._lastDepthStencilState.StencilDepthBufferFail = this.StencilDepthBufferFail;
                    device._lastDepthStencilState.StencilPass            = this.StencilPass;
                }

                if (force ||
                    this.TwoSidedStencilMode != device._lastDepthStencilState.TwoSidedStencilMode ||
                    this.CounterClockwiseStencilFail != device._lastDepthStencilState.CounterClockwiseStencilFail ||
                    this.CounterClockwiseStencilDepthBufferFail != device._lastDepthStencilState.CounterClockwiseStencilDepthBufferFail ||
                    this.CounterClockwiseStencilPass != device._lastDepthStencilState.CounterClockwiseStencilPass)
                {
                    gl.stencilOpSeparate(stencilFaceBack, GetStencilOp(this.CounterClockwiseStencilFail),
                                         GetStencilOp(this.CounterClockwiseStencilDepthBufferFail),
                                         GetStencilOp(this.CounterClockwiseStencilPass));
                    GraphicsExtensions.CheckGLError();
                    device._lastDepthStencilState.CounterClockwiseStencilFail            = this.CounterClockwiseStencilFail;
                    device._lastDepthStencilState.CounterClockwiseStencilDepthBufferFail = this.CounterClockwiseStencilDepthBufferFail;
                    device._lastDepthStencilState.CounterClockwiseStencilPass            = this.CounterClockwiseStencilPass;
                }
            }
            else
            {
                if (force ||
                    this.TwoSidedStencilMode != device._lastDepthStencilState.TwoSidedStencilMode ||
                    this.StencilFunction != device._lastDepthStencilState.StencilFunction ||
                    this.ReferenceStencil != device._lastDepthStencilState.ReferenceStencil ||
                    this.StencilMask != device._lastDepthStencilState.StencilMask)
                {
                    gl.stencilFunc(GetStencilFunc(this.StencilFunction), ReferenceStencil, StencilMask);
                    GraphicsExtensions.CheckGLError();
                    device._lastDepthStencilState.StencilFunction  = this.StencilFunction;
                    device._lastDepthStencilState.ReferenceStencil = this.ReferenceStencil;
                    device._lastDepthStencilState.StencilMask      = this.StencilMask;
                }

                if (force ||
                    this.TwoSidedStencilMode != device._lastDepthStencilState.TwoSidedStencilMode ||
                    this.StencilFail != device._lastDepthStencilState.StencilFail ||
                    this.StencilDepthBufferFail != device._lastDepthStencilState.StencilDepthBufferFail ||
                    this.StencilPass != device._lastDepthStencilState.StencilPass)
                {
                    gl.stencilOp(GetStencilOp(StencilFail),
                                 GetStencilOp(StencilDepthBufferFail),
                                 GetStencilOp(StencilPass));
                    GraphicsExtensions.CheckGLError();
                    device._lastDepthStencilState.StencilFail            = this.StencilFail;
                    device._lastDepthStencilState.StencilDepthBufferFail = this.StencilDepthBufferFail;
                    device._lastDepthStencilState.StencilPass            = this.StencilPass;
                }
            }

            device._lastDepthStencilState.TwoSidedStencilMode = this.TwoSidedStencilMode;

            if (force || this.StencilWriteMask != device._lastDepthStencilState.StencilWriteMask)
            {
                gl.stencilMask(this.StencilWriteMask);
                GraphicsExtensions.CheckGLError();
                device._lastDepthStencilState.StencilWriteMask = this.StencilWriteMask;
            }
        }
コード例 #4
0
        internal void PlatformApplyState(GraphicsDevice device, bool force = false)
        {
            if (force || DepthBufferEnable != device._lastDepthStencilState.DepthBufferEnable)
            {
                if (!DepthBufferEnable)
                {
                    GL.Disable(EnableCap.DepthTest);
                    GL.CheckError();
                }
                else
                {
                    // enable Depth Buffer
                    GL.Enable(EnableCap.DepthTest);
                    GL.CheckError();
                }
                device._lastDepthStencilState.DepthBufferEnable = DepthBufferEnable;
            }

            if (force || DepthBufferFunction != device._lastDepthStencilState.DepthBufferFunction)
            {
                GL.DepthFunc(DepthBufferFunction.GetDepthFunction());
                GL.CheckError();
                device._lastDepthStencilState.DepthBufferFunction = DepthBufferFunction;
            }

            if (force || DepthBufferWriteEnable != device._lastDepthStencilState.DepthBufferWriteEnable)
            {
                GL.DepthMask(DepthBufferWriteEnable);
                GL.CheckError();
                device._lastDepthStencilState.DepthBufferWriteEnable = DepthBufferWriteEnable;
            }

            if (force || StencilEnable != device._lastDepthStencilState.StencilEnable)
            {
                if (!StencilEnable)
                {
                    GL.Disable(EnableCap.StencilTest);
                    GL.CheckError();
                }
                else
                {
                    // enable Stencil
                    GL.Enable(EnableCap.StencilTest);
                    GL.CheckError();
                }
                device._lastDepthStencilState.StencilEnable = StencilEnable;
            }

            // set function
            if (TwoSidedStencilMode)
            {
                var cullFaceModeFront = StencilFace.Front;
                var cullFaceModeBack  = StencilFace.Back;
                var stencilFaceFront  = StencilFace.Front;
                var stencilFaceBack   = StencilFace.Back;

                if (force ||
                    TwoSidedStencilMode != device._lastDepthStencilState.TwoSidedStencilMode ||
                    StencilFunction != device._lastDepthStencilState.StencilFunction ||
                    ReferenceStencil != device._lastDepthStencilState.ReferenceStencil ||
                    StencilMask != device._lastDepthStencilState.StencilMask)
                {
                    GL.StencilFuncSeparate(cullFaceModeFront, GetStencilFunc(StencilFunction),
                                           ReferenceStencil, StencilMask);
                    GL.CheckError();
                    device._lastDepthStencilState.StencilFunction  = StencilFunction;
                    device._lastDepthStencilState.ReferenceStencil = ReferenceStencil;
                    device._lastDepthStencilState.StencilMask      = StencilMask;
                }

                if (force ||
                    TwoSidedStencilMode != device._lastDepthStencilState.TwoSidedStencilMode ||
                    CounterClockwiseStencilFunction != device._lastDepthStencilState.CounterClockwiseStencilFunction ||
                    ReferenceStencil != device._lastDepthStencilState.ReferenceStencil ||
                    StencilMask != device._lastDepthStencilState.StencilMask)
                {
                    GL.StencilFuncSeparate(cullFaceModeBack, GetStencilFunc(CounterClockwiseStencilFunction),
                                           ReferenceStencil, StencilMask);
                    GL.CheckError();
                    device._lastDepthStencilState.CounterClockwiseStencilFunction = CounterClockwiseStencilFunction;
                    device._lastDepthStencilState.ReferenceStencil = ReferenceStencil;
                    device._lastDepthStencilState.StencilMask      = StencilMask;
                }


                if (force ||
                    TwoSidedStencilMode != device._lastDepthStencilState.TwoSidedStencilMode ||
                    StencilFail != device._lastDepthStencilState.StencilFail ||
                    StencilDepthBufferFail != device._lastDepthStencilState.StencilDepthBufferFail ||
                    StencilPass != device._lastDepthStencilState.StencilPass)
                {
                    GL.StencilOpSeparate(stencilFaceFront, GetStencilOp(StencilFail),
                                         GetStencilOp(StencilDepthBufferFail),
                                         GetStencilOp(StencilPass));
                    GL.CheckError();
                    device._lastDepthStencilState.StencilFail            = StencilFail;
                    device._lastDepthStencilState.StencilDepthBufferFail = StencilDepthBufferFail;
                    device._lastDepthStencilState.StencilPass            = StencilPass;
                }

                if (force ||
                    TwoSidedStencilMode != device._lastDepthStencilState.TwoSidedStencilMode ||
                    CounterClockwiseStencilFail != device._lastDepthStencilState.CounterClockwiseStencilFail ||
                    CounterClockwiseStencilDepthBufferFail != device._lastDepthStencilState.CounterClockwiseStencilDepthBufferFail ||
                    CounterClockwiseStencilPass != device._lastDepthStencilState.CounterClockwiseStencilPass)
                {
                    GL.StencilOpSeparate(stencilFaceBack, GetStencilOp(CounterClockwiseStencilFail),
                                         GetStencilOp(CounterClockwiseStencilDepthBufferFail),
                                         GetStencilOp(CounterClockwiseStencilPass));
                    GL.CheckError();
                    device._lastDepthStencilState.CounterClockwiseStencilFail            = CounterClockwiseStencilFail;
                    device._lastDepthStencilState.CounterClockwiseStencilDepthBufferFail = CounterClockwiseStencilDepthBufferFail;
                    device._lastDepthStencilState.CounterClockwiseStencilPass            = CounterClockwiseStencilPass;
                }
            }
            else
            {
                if (force ||
                    TwoSidedStencilMode != device._lastDepthStencilState.TwoSidedStencilMode ||
                    StencilFunction != device._lastDepthStencilState.StencilFunction ||
                    ReferenceStencil != device._lastDepthStencilState.ReferenceStencil ||
                    StencilMask != device._lastDepthStencilState.StencilMask)
                {
                    GL.StencilFunc(GetStencilFunc(StencilFunction), ReferenceStencil, StencilMask);
                    GL.CheckError();
                    device._lastDepthStencilState.StencilFunction  = StencilFunction;
                    device._lastDepthStencilState.ReferenceStencil = ReferenceStencil;
                    device._lastDepthStencilState.StencilMask      = StencilMask;
                }

                if (force ||
                    TwoSidedStencilMode != device._lastDepthStencilState.TwoSidedStencilMode ||
                    StencilFail != device._lastDepthStencilState.StencilFail ||
                    StencilDepthBufferFail != device._lastDepthStencilState.StencilDepthBufferFail ||
                    StencilPass != device._lastDepthStencilState.StencilPass)
                {
                    GL.StencilOp(GetStencilOp(StencilFail),
                                 GetStencilOp(StencilDepthBufferFail),
                                 GetStencilOp(StencilPass));
                    GL.CheckError();
                    device._lastDepthStencilState.StencilFail            = StencilFail;
                    device._lastDepthStencilState.StencilDepthBufferFail = StencilDepthBufferFail;
                    device._lastDepthStencilState.StencilPass            = StencilPass;
                }
            }

            device._lastDepthStencilState.TwoSidedStencilMode = TwoSidedStencilMode;

            if (force || StencilWriteMask != device._lastDepthStencilState.StencilWriteMask)
            {
                GL.StencilMask(StencilWriteMask);
                GL.CheckError();
                device._lastDepthStencilState.StencilWriteMask = StencilWriteMask;
            }
        }