/// <summary> /// Determine and updates <see cref="CurrentState"/> from <see cref="State"/>. /// </summary> public void Update() { // Hash current state var hashedState = new PipelineStateDescriptionWithHash(State); // Find existing PipelineState object PipelineState pipelineState; // TODO GRAPHICS REFACTOR We could avoid lock by adding them to a ThreadLocal (or RenderContext) and merge at end of frame lock (cache) { if (!cache.TryGetValue(hashedState, out pipelineState)) { // Otherwise, instantiate it // First, make an copy hashedState = new PipelineStateDescriptionWithHash(State.Clone()); cache.Add(hashedState, pipelineState = PipelineState.New(graphicsDevice, ref State)); } } CurrentState = pipelineState; }
public static PipelineState New(GraphicsDevice graphicsDevice, ref PipelineStateDescription pipelineStateDescription) { // Hash the current state var hashedState = new PipelineStateDescriptionWithHash(pipelineStateDescription); // Store SamplerState in a cache (D3D seems to have quite bad concurrency when using CreateSampler while rendering) PipelineState pipelineState; lock (graphicsDevice.CachedPipelineStates) { if (graphicsDevice.CachedPipelineStates.TryGetValue(hashedState, out pipelineState)) { // TODO: Appropriate destroy pipelineState.AddReferenceInternal(); } else { pipelineState = new PipelineState(graphicsDevice, pipelineStateDescription); graphicsDevice.CachedPipelineStates.Add(hashedState, pipelineState); } } return(pipelineState); }