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); } }
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); } } } }
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 {
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); }