private void ResetManagedState() { _numVertexBindings = 0; Util.ClearArray(_vertexBindings); _vertexStrides = null; Util.ClearArray(_vertexOffsets); _framebuffer = null; Util.ClearArray(_viewports); Util.ClearArray(_scissors); _viewportsChanged = false; _scissorRectsChanged = false; _ib = null; _graphicsPipeline = null; _blendState = null; _depthStencilState = null; _rasterizerState = null; _primitiveTopology = SharpDX.Direct3D.PrimitiveTopology.Undefined; _inputLayout = null; _vertexShader = null; _geometryShader = null; _hullShader = null; _domainShader = null; _pixelShader = null; Util.ClearArray(_graphicsResourceSets); Util.ClearArray(_vertexBoundUniformBuffers); Util.ClearArray(_vertexBoundTextureViews); Util.ClearArray(_vertexBoundSamplers); Util.ClearArray(_fragmentBoundUniformBuffers); Util.ClearArray(_fragmentBoundTextureViews); Util.ClearArray(_fragmentBoundSamplers); _computePipeline = null; Util.ClearArray(_computeResourceSets); foreach (KeyValuePair <Texture, List <BoundTextureInfo> > kvp in _boundSRVs) { List <BoundTextureInfo> list = kvp.Value; list.Clear(); PoolBoundTextureList(list); } _boundSRVs.Clear(); foreach (KeyValuePair <Texture, List <BoundTextureInfo> > kvp in _boundUAVs) { List <BoundTextureInfo> list = kvp.Value; list.Clear(); PoolBoundTextureList(list); } _boundUAVs.Clear(); }
protected override void SetPipelineCore(Pipeline pipeline) { if (!pipeline.IsComputePipeline && _graphicsPipeline != pipeline) { D3D11Pipeline d3dPipeline = Util.AssertSubtype <Pipeline, D3D11Pipeline>(pipeline); _graphicsPipeline = d3dPipeline; Util.ClearArray(_graphicsResourceSets); // Invalidate resource set bindings -- they may be invalid. Util.ClearArray(_invalidatedGraphicsResourceSets); BlendState blendState = d3dPipeline.BlendState; if (_blendState != blendState) { _blendState = blendState; _context.OutputMerger.SetBlendState(blendState); } DepthStencilState depthStencilState = d3dPipeline.DepthStencilState; uint stencilReference = d3dPipeline.StencilReference; if (_depthStencilState != depthStencilState || _stencilReference != stencilReference) { _depthStencilState = depthStencilState; _stencilReference = stencilReference; _context.OutputMerger.SetDepthStencilState(depthStencilState, (int)stencilReference); } RasterizerState rasterizerState = d3dPipeline.RasterizerState; if (_rasterizerState != rasterizerState) { _rasterizerState = rasterizerState; _context.Rasterizer.State = rasterizerState; } SharpDX.Direct3D.PrimitiveTopology primitiveTopology = d3dPipeline.PrimitiveTopology; if (_primitiveTopology != primitiveTopology) { _primitiveTopology = primitiveTopology; _context.InputAssembler.PrimitiveTopology = primitiveTopology; } InputLayout inputLayout = d3dPipeline.InputLayout; if (_inputLayout != inputLayout) { _inputLayout = inputLayout; _context.InputAssembler.InputLayout = inputLayout; } VertexShader vertexShader = d3dPipeline.VertexShader; if (_vertexShader != vertexShader) { _vertexShader = vertexShader; _context.VertexShader.Set(vertexShader); } GeometryShader geometryShader = d3dPipeline.GeometryShader; if (_geometryShader != geometryShader) { _geometryShader = geometryShader; _context.GeometryShader.Set(geometryShader); } HullShader hullShader = d3dPipeline.HullShader; if (_hullShader != hullShader) { _hullShader = hullShader; _context.HullShader.Set(hullShader); } DomainShader domainShader = d3dPipeline.DomainShader; if (_domainShader != domainShader) { _domainShader = domainShader; _context.DomainShader.Set(domainShader); } PixelShader pixelShader = d3dPipeline.PixelShader; if (_pixelShader != pixelShader) { _pixelShader = pixelShader; _context.PixelShader.Set(pixelShader); } _vertexStrides = d3dPipeline.VertexStrides; if (_vertexStrides != null) { int vertexStridesCount = _vertexStrides.Length; Util.EnsureArrayMinimumSize(ref _vertexBindings, (uint)vertexStridesCount); Util.EnsureArrayMinimumSize(ref _vertexOffsets, (uint)vertexStridesCount); } Util.EnsureArrayMinimumSize(ref _graphicsResourceSets, (uint)d3dPipeline.ResourceLayouts.Length); Util.EnsureArrayMinimumSize(ref _invalidatedGraphicsResourceSets, (uint)d3dPipeline.ResourceLayouts.Length); } else if (pipeline.IsComputePipeline && _computePipeline != pipeline) { D3D11Pipeline d3dPipeline = Util.AssertSubtype <Pipeline, D3D11Pipeline>(pipeline); _computePipeline = d3dPipeline; Util.ClearArray(_computeResourceSets); // Invalidate resource set bindings -- they may be invalid. Util.ClearArray(_invalidatedComputeResourceSets); ComputeShader computeShader = d3dPipeline.ComputeShader; _context.ComputeShader.Set(computeShader); Util.EnsureArrayMinimumSize(ref _computeResourceSets, (uint)d3dPipeline.ResourceLayouts.Length); Util.EnsureArrayMinimumSize(ref _invalidatedComputeResourceSets, (uint)d3dPipeline.ResourceLayouts.Length); } }