public IRenderGroupState GetOrCreateState(GraphicsDevice device, IPipelineState pso, PrimitiveTopology pt, VertexLayoutDescription vl) { var modelOffset = 64u; if (device.UniformBufferMinOffsetAlignment > 64) { modelOffset = device.UniformBufferMinOffsetAlignment; } var maxAllowedDrawables = 65536u / modelOffset; var key = new Tuple <IPipelineState, PrimitiveTopology, VertexLayoutDescription>(pso, pt, vl); if (RenderGroupStateCache.TryGetValue(key, out var renderGroupStateList)) { // Check to see if this state list can accept any more drawables, if not, allocate a new one foreach (var renderGroupState in renderGroupStateList) { if (renderGroupState.Elements.Count < maxAllowedDrawables) { return(renderGroupState); } } renderGroupStateList.Add(RenderGroupState.Create(pso, pt, vl)); return(renderGroupStateList.Last()); } renderGroupStateList = new List <IRenderGroupState> { RenderGroupState.Create(pso, pt, vl) }; RenderGroupStateCache.Add(key, renderGroupStateList); return(renderGroupStateList.Last()); }
public IRenderGroupState GetOrCreateState(IPipelineState pso, PrimitiveTopology pt, VertexLayoutDescription vl) { var key = new Tuple <IPipelineState, PrimitiveTopology, VertexLayoutDescription>(pso, pt, vl); if (RenderGroupStateCache.TryGetValue(key, out var renderGroupState)) { return(renderGroupState); } renderGroupState = RenderGroupState.Create(pso, pt, vl); RenderGroupStateCache.Add(key, renderGroupState); return(renderGroupState); }