예제 #1
0
        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());
        }
예제 #2
0
        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);
        }