Beispiel #1
0
 internal void Free(ref DescriptorResourceCounts counts, uint count = 1)
 {
     RemainingSets += 1;
     for (int i = 0; i < MAX_DESCRIPTOR_COUNT; i++)
     {
         RemainingCount[i] += (counts[i] * count);
     }
 }
Beispiel #2
0
 public void Free(VkDescriptorPool pool, ref DescriptorResourceCounts counts, uint count = 1)
 {
     lock (_lock)
     {
         foreach (PoolInfo poolInfo in _pools)
         {
             if (poolInfo.Pool == pool)
             {
                 poolInfo.Free(ref counts, count);
             }
         }
     }
 }
Beispiel #3
0
        public VkDescriptorPool GetPool(ref DescriptorResourceCounts counts, uint count = 1)
        {
            lock (_lock)
            {
                foreach (PoolInfo poolInfo in _pools)
                {
                    if (poolInfo.Allocate(counts, count))
                    {
                        return(poolInfo.Pool);
                    }
                }

                PoolInfo newPool = CreateNewPool();
                _pools.Add(newPool);
                bool result = newPool.Allocate(counts, count);
                Debug.Assert(result);
                return(newPool.Pool);
            }
        }
        public unsafe DescriptorSetLayout Build()
        {
            if (!needRebuild)
            {
                return(this);
            }

            needRebuild = false;

            Destroy(true);

            bindings = new VkDescriptorSetLayoutBinding[Bindings.Count];
            for (int i = 0; i < Bindings.Count; i++)
            {
                bindings[i] = new VkDescriptorSetLayoutBinding
                {
                    descriptorType  = Bindings[i].descriptorType,
                    stageFlags      = Bindings[i].stageFlags,
                    binding         = Bindings[i].binding,
                    descriptorCount = Bindings[i].descriptorCount
                };
            }

            var descriptorSetLayoutCreateInfo = new VkDescriptorSetLayoutCreateInfo
            {
                sType = VkStructureType.DescriptorSetLayoutCreateInfo
            };

            descriptorSetLayoutCreateInfo.pBindings    = (VkDescriptorSetLayoutBinding *)Utilities.AsPointer(ref bindings[0]);
            descriptorSetLayoutCreateInfo.bindingCount = (uint)bindings.Length;

            descriptorSetLayout = Device.CreateDescriptorSetLayout(ref descriptorSetLayoutCreateInfo);

            descriptorResourceCounts = new DescriptorResourceCounts();
            foreach (var binding in bindings)
            {
                int index = binding.descriptorType switch
                {
Beispiel #5
0
            internal bool Allocate(DescriptorResourceCounts counts, uint count = 1)
            {
                if (RemainingSets <= 0)
                {
                    return(false);
                }

                for (int i = 0; i < MAX_DESCRIPTOR_COUNT; i++)
                {
                    if (RemainingCount[i] < counts[i] * count)
                    {
                        return(false);
                    }
                }

                RemainingSets -= 1;
                for (int i = 0; i < MAX_DESCRIPTOR_COUNT; i++)
                {
                    RemainingCount[i] -= counts[i] * count;
                }

                return(true);
            }