private unsafe bool TryAllocateDescriptorSets(ReadOnlySpan <DescriptorSetLayout> layouts, bool isTry, out DescriptorSetCollection dsc)
            {
                Debug.Assert(!_done);

                DescriptorSet[] descriptorSets = new DescriptorSet[layouts.Length];

                fixed(DescriptorSet *pDescriptorSets = descriptorSets)
                {
                    fixed(DescriptorSetLayout *pLayouts = layouts)
                    {
                        var descriptorSetAllocateInfo = new DescriptorSetAllocateInfo()
                        {
                            SType              = StructureType.DescriptorSetAllocateInfo,
                            DescriptorPool     = _pool,
                            DescriptorSetCount = (uint)layouts.Length,
                            PSetLayouts        = pLayouts
                        };

                        var result = Api.AllocateDescriptorSets(Device, &descriptorSetAllocateInfo, pDescriptorSets);

                        if (isTry && result == Result.ErrorOutOfPoolMemory)
                        {
                            _totalSets = (int)_capacity;
                            _done      = true;
                            DestroyIfDone();
                            dsc = default;
                            return(false);
                        }

                        result.ThrowOnError();
                    }
                }

                _totalSets += layouts.Length;
                _setsInUse += layouts.Length;

                dsc = new DescriptorSetCollection(this, descriptorSets);
                return(true);
            }
 public bool TryAllocateDescriptorSets(ReadOnlySpan <DescriptorSetLayout> layouts, out DescriptorSetCollection dsc)
 {
     return(TryAllocateDescriptorSets(layouts, isTry: true, out dsc));
 }
 public void FreeDescriptorSets(DescriptorSetCollection dsc)
 {
     _setsInUse -= dsc.SetsCount;
     Debug.Assert(_setsInUse >= 0);
     DestroyIfDone();
 }