private static bool ChangesFoundInStencil( GLQueueRendererStencilState previous, GLQueueRendererStencilState current ) { var mask = GLGraphicsPipelineFlagBits.StencilEnabled | GLGraphicsPipelineFlagBits.TwoSidedStencilMode; var pastFlags = mask & previous.Flags; var nextFlags = mask & current.Flags; return((pastFlags != nextFlags) || (!previous.Enums.Equals(current.Enums))); }
private void ApplyStencilChanges( GLQueueRendererStencilState past, GLQueueRendererStencilState next) { var pastStencil = past.Enums; var nextStencil = next.Enums; if (past.Front.WriteMask != next.Front.WriteMask) { mStencil.SetStencilWriteMask(MgStencilFaceFlagBits.FRONT_BIT, next.Front.WriteMask); } var newStencilEnabled = (next.Flags & GLGraphicsPipelineFlagBits.StencilEnabled); if (mStencil.IsStencilBufferEnabled != (newStencilEnabled != 0)) { if (mStencil.IsStencilBufferEnabled) { mStencil.DisableStencilBuffer(); } else { mStencil.EnableStencilBuffer(); if ( nextStencil.FrontStencilFail != pastStencil.FrontStencilFail || nextStencil.FrontDepthBufferFail != pastStencil.FrontDepthBufferFail || nextStencil.FrontStencilPass != pastStencil.FrontStencilPass ) { mStencil.SetFrontFaceStencilOperation(nextStencil.FrontStencilFail, nextStencil.FrontDepthBufferFail, nextStencil.FrontStencilPass); } if ( nextStencil.BackStencilFail != pastStencil.BackStencilFail || nextStencil.BackDepthBufferFail != pastStencil.BackDepthBufferFail || nextStencil.BackStencilPass != pastStencil.BackStencilPass ) { mStencil.SetBackFaceStencilOperation(nextStencil.BackStencilFail, nextStencil.BackDepthBufferFail, nextStencil.BackStencilPass); } } } }
public void Initialize() { const int NO_OF_COLOR_ATTACHMENTS = 4; mPastColorBlendEnums = mBlend.Initialize(NO_OF_COLOR_ATTACHMENTS); var initialStencilValue = mStencil.Initialize(); mPastStencilInfo = initialStencilValue; mPastFrontWriteMask = initialStencilValue.Front.WriteMask; mPastBackWriteMask = initialStencilValue.Back.WriteMask; mPastFrontStencilInfo = new GLCmdStencilFunctionInfo { CompareMask = initialStencilValue.Front.CompareMask, ReferenceMask = initialStencilValue.Front.Reference, StencilFunction = initialStencilValue.Enums.FrontStencilFunction, }; mPastBackStencilInfo = new GLCmdStencilFunctionInfo { CompareMask = initialStencilValue.Back.CompareMask, ReferenceMask = initialStencilValue.Back.Reference, StencilFunction = initialStencilValue.Enums.BackStencilFunction, }; var initialDepthValue = mDepth.Initialize(); PreviousPipeline = new GLCmdBufferPipelineItem { DepthState = initialDepthValue, StencilState = initialStencilValue.Enums, }; mPastRasterization = mRaster.Initialize(); mPastClearValues = mClear.Initialize(); }