public DescriptorSet[] Allocate(DescriptorSetAllocateInfo info)
        {
            var infoNative = new VkDescriptorSetAllocateInfo();

            infoNative.sType              = VkStructureType.DescriptorSetAllocateInfo;
            infoNative.descriptorPool     = descriptorPool;
            infoNative.descriptorSetCount = info.descriptorSetCount;

            var layoutsMarshalled = new NativeArray <VkDescriptorSetLayout>(info.setLayouts.Count);

            for (int i = 0; i < info.setLayouts.Count; i++)
            {
                layoutsMarshalled[i] = info.setLayouts[i].Native;
            }
            infoNative.pSetLayouts = layoutsMarshalled.Address;

            var descriptorSetsMarshalled = new NativeArray <VkDescriptorSet>((int)info.descriptorSetCount);

            using (layoutsMarshalled)
                using (descriptorSetsMarshalled) {
                    var result = Device.Commands.allocateDescriptorSets(Device.Native, ref infoNative, descriptorSetsMarshalled.Address);
                    if (result != VkResult.Success)
                    {
                        throw new DescriptorPoolException(string.Format("Error allocating descriptor sets: {0}", result));
                    }

                    var results = new DescriptorSet[(int)info.descriptorSetCount];

                    for (int i = 0; i < info.descriptorSetCount; i++)
                    {
                        results[i] = new DescriptorSet(Device, this, descriptorSetsMarshalled[i]);
                    }

                    return(results);
                }
        }
 public void BindDescriptorSets(VkPipelineBindPoint pipelineBindPoint, PipelineLayout layout, uint firstSet, DescriptorSet descriptorSet, uint dynamicOffset)
 {
     unsafe
     {
         VkDescriptorSet setNative = descriptorSet.Native;
         Device.Commands.cmdBindDescriptorSets(commandBuffer, pipelineBindPoint, layout.Native,
                                               firstSet, 1, (IntPtr)(&setNative),
                                               1, (IntPtr)(&dynamicOffset));
     }
 }
        public void BindDescriptorSets(VkPipelineBindPoint pipelineBindPoint, PipelineLayout layout, uint firstSet, DescriptorSet descriptorSet, List <uint> dynamicOffsets)
        {
            unsafe
            {
                int dynamicOffsetCount = 0;
                if (dynamicOffsets != null)
                {
                    dynamicOffsetCount = dynamicOffsets.Count;
                }

                var offsets = stackalloc uint[dynamicOffsetCount];

                VkDescriptorSet setNative = descriptorSet.Native;
                Interop.Copy(dynamicOffsets, (IntPtr)offsets);

                Device.Commands.cmdBindDescriptorSets(commandBuffer, VkPipelineBindPoint.Graphics, layout.Native,
                                                      firstSet, 1, (IntPtr)(&setNative),
                                                      (uint)dynamicOffsetCount, (IntPtr)offsets);
            }
        }