internal static void Update(DescriptorPool parent, WriteDescriptorSet[] descriptorWrites, CopyDescriptorSet[] descriptorCopies) { int descriptorWriteCount = descriptorWrites?.Length ?? 0; var nativeDescriptorWritesPtr = stackalloc WriteDescriptorSet.Native[descriptorWriteCount]; for (int i = 0; i < descriptorWriteCount; i++) { descriptorWrites[i].ToNative(&nativeDescriptorWritesPtr[i]); } int descriptorCopyCount = descriptorCopies?.Length ?? 0; for (int i = 0; i < descriptorCopyCount; i++) { descriptorCopies[i].Prepare(); fixed(CopyDescriptorSet *descriptorCopiesPtr = descriptorCopies) { vkUpdateDescriptorSets( parent.Parent, descriptorWriteCount, nativeDescriptorWritesPtr, descriptorCopyCount, descriptorCopiesPtr); } for (int i = 0; i < descriptorWriteCount; i++) nativeDescriptorWritesPtr[i].Free(); } }
internal void ToNative(out Native native, DescriptorPool pool, long *setLayouts) { native.Type = StructureType.DescriptorSetAllocateInfo; native.Next = IntPtr.Zero; native.DescriptorPool = pool; native.DescriptorSetCount = DescriptorSetCount; native.SetLayouts = setLayouts; }
internal static void Free(DescriptorPool parent, DescriptorSet[] descriptorSets) { int count = descriptorSets?.Length ?? 0; var descriptorSetsPtr = stackalloc long[count]; for (int i = 0; i < count; i++) { descriptorSetsPtr[i] = descriptorSets[i]; } Result result = vkFreeDescriptorSets(parent.Parent, parent, count, descriptorSetsPtr); VulkanException.ThrowForInvalidResult(result); }
internal static DescriptorSet[] Allocate(DescriptorPool parent, ref DescriptorSetAllocateInfo createInfo) { fixed(long *setLayoutsPtr = createInfo.SetLayouts) { createInfo.ToNative(out DescriptorSetAllocateInfo.Native nativeCreateInfo, parent, setLayoutsPtr); int count = createInfo.SetLayouts?.Length ?? 0; var descriptorSetsPtr = stackalloc long[count]; Result result = vkAllocateDescriptorSets(parent.Parent, &nativeCreateInfo, descriptorSetsPtr); VulkanException.ThrowForInvalidResult(result); var descriptorSets = new DescriptorSet[count]; for (int i = 0; i < count; i++) { descriptorSets[i] = new DescriptorSet(parent, descriptorSetsPtr[i]); } return(descriptorSets); } }
internal DescriptorSet(DescriptorPool parent, long handle) { Parent = parent; Handle = handle; }