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); }
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; } }
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; } }
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; } }