예제 #1
0
        private unsafe PoolInfo CreateNewPool()
        {
            uint totalSets              = 1000;
            uint descriptorCount        = 100;
            uint poolSizeCount          = 7;
            VkDescriptorPoolSize *sizes = stackalloc VkDescriptorPoolSize[(int)poolSizeCount];

            sizes[0].type            = VkDescriptorType.UniformBuffer;
            sizes[0].descriptorCount = descriptorCount;
            sizes[1].type            = VkDescriptorType.SampledImage;
            sizes[1].descriptorCount = descriptorCount;
            sizes[2].type            = VkDescriptorType.Sampler;
            sizes[2].descriptorCount = descriptorCount;
            sizes[3].type            = VkDescriptorType.StorageBuffer;
            sizes[3].descriptorCount = descriptorCount;
            sizes[4].type            = VkDescriptorType.StorageImage;
            sizes[4].descriptorCount = descriptorCount;
            sizes[5].type            = VkDescriptorType.UniformBufferDynamic;
            sizes[5].descriptorCount = descriptorCount;
            sizes[6].type            = VkDescriptorType.StorageBufferDynamic;
            sizes[6].descriptorCount = descriptorCount;

            VkDescriptorPoolCreateInfo poolCI = VkDescriptorPoolCreateInfo.New();

            poolCI.flags         = VkDescriptorPoolCreateFlags.FreeDescriptorSet;
            poolCI.maxSets       = totalSets;
            poolCI.pPoolSizes    = sizes;
            poolCI.poolSizeCount = poolSizeCount;

            VkResult result = vkCreateDescriptorPool(_gd.Device, ref poolCI, null, out VkDescriptorPool descriptorPool);

            VulkanUtil.CheckResult(result);

            return(new PoolInfo(descriptorPool, totalSets, descriptorCount));
        }
예제 #2
0
        public VkResourceCache(VkDevice device, VkSamplerState defaultSamplerState)
        {
            _device = device;
            _defaultSamplerState = defaultSamplerState;

            VkDescriptorPoolSize *sizes = stackalloc VkDescriptorPoolSize[3];

            sizes[0].type            = VkDescriptorType.UniformBuffer;
            sizes[0].descriptorCount = 50000;
            sizes[1].type            = VkDescriptorType.SampledImage;
            sizes[1].descriptorCount = 15000;
            sizes[2].type            = VkDescriptorType.Sampler;
            sizes[2].descriptorCount = 15000;

            VkDescriptorPoolCreateInfo descriptorPoolCI = VkDescriptorPoolCreateInfo.New();

            descriptorPoolCI.flags         = VkDescriptorPoolCreateFlags.FreeDescriptorSet;
            descriptorPoolCI.maxSets       = 15000;
            descriptorPoolCI.pPoolSizes    = sizes;
            descriptorPoolCI.poolSizeCount = 3;

            VkResult result = vkCreateDescriptorPool(_device, ref descriptorPoolCI, null, out _descriptorPool);

            CheckResult(result);
        }
예제 #3
0
        private unsafe PoolInfo CreateNewPool()
        {
            uint totalSets       = 1000;
            uint descriptorCount = 256;
            uint poolSizeCount   = MAX_DESCRIPTOR_COUNT;

            VkDescriptorPoolSize *sizes = stackalloc VkDescriptorPoolSize[(int)poolSizeCount];

            for (int i = 0; i < MAX_DESCRIPTOR_COUNT; i++)
            {
                sizes[i].type            = descriptorTypes[i];
                sizes[i].descriptorCount = descriptorCount;
            }

            VkDescriptorPoolInlineUniformBlockCreateInfoEXT descriptorPoolInlineUniformBlockCreateInfo = new VkDescriptorPoolInlineUniformBlockCreateInfoEXT
            {
                sType = VkStructureType.DescriptorPoolInlineUniformBlockCreateInfoEXT,
                maxInlineUniformBlockBindings = totalSets
            };

            var poolCI = new VkDescriptorPoolCreateInfo
            {
                sType         = VkStructureType.DescriptorPoolCreateInfo,
                flags         = VkDescriptorPoolCreateFlags.FreeDescriptorSet,
                poolSizeCount = poolSizeCount,
                maxSets       = totalSets,
                pPoolSizes    = sizes,
                pNext         = &descriptorPoolInlineUniformBlockCreateInfo
            };

            var descriptorPool = Device.CreateDescriptorPool(ref poolCI);

            return(new PoolInfo(descriptorPool, totalSets, descriptorCount));
        }
예제 #4
0
        public void Set(params VkDescriptorPoolSize[] value)
        {
            IntPtr ptr = (IntPtr)this.pointer;

            value.Set(ref ptr, ref this.count);
            this.pointer = (VkDescriptorPoolSize *)ptr;
        }
        private VkDescriptorPool CreateDescriptorPool()
        {
            VkDescriptorPoolSize *descriptorPoolSizePtr = stackalloc VkDescriptorPoolSize[2]
            {
                new VkDescriptorPoolSize {
                    type = VkDescriptorType.UniformBuffer, descriptorCount = 1
                },
                new VkDescriptorPoolSize {
                    type = VkDescriptorType.CombinedImageSampler, descriptorCount = 1
                }
            };

            var createInfo = new VkDescriptorPoolCreateInfo()
            {
                sType         = VkStructureType.DescriptorPoolCreateInfo,
                pNext         = null,
                poolSizeCount = 2,
                pPoolSizes    = descriptorPoolSizePtr,
                maxSets       = 2
            };

            VkDescriptorPool descriptorPool;

            vkCreateDescriptorPool(Context.Device, &createInfo, null, out descriptorPool).CheckResult();

            return(descriptorPool);
        }
예제 #6
0
 public VkDescriptorPoolSizeGroup(params VkDescriptorPoolSize[] value)
 {
     this.count   = 0;
     this.pointer = null;
     if (value != null)
     {
         IntPtr ptr = IntPtr.Zero;
         value.Set(ref ptr, ref this.count);
         this.pointer = (VkDescriptorPoolSize *)ptr;
     }
 }
예제 #7
0
파일: Initializers.cs 프로젝트: gomson/vk
        public static VkDescriptorPoolCreateInfo descriptorPoolCreateInfo(
            uint poolSizeCount,
            VkDescriptorPoolSize *pPoolSizes,
            uint maxSets)
        {
            VkDescriptorPoolCreateInfo descriptorPoolInfo = VkDescriptorPoolCreateInfo.New();

            descriptorPoolInfo.poolSizeCount = poolSizeCount;
            descriptorPoolInfo.pPoolSizes    = pPoolSizes;
            descriptorPoolInfo.maxSets       = maxSets;
            return(descriptorPoolInfo);
        }
예제 #8
0
        private void CreateDescriptorPool()
        {
            VkDescriptorPoolSize *sizes = stackalloc VkDescriptorPoolSize[3];

            sizes[0].type            = VkDescriptorType.UniformBuffer;
            sizes[0].descriptorCount = 5000;
            sizes[1].type            = VkDescriptorType.SampledImage;
            sizes[1].descriptorCount = 5000;
            sizes[2].type            = VkDescriptorType.Sampler;
            sizes[2].descriptorCount = 5000;

            VkDescriptorPoolCreateInfo descriptorPoolCI = VkDescriptorPoolCreateInfo.New();

            descriptorPoolCI.flags         = VkDescriptorPoolCreateFlags.FreeDescriptorSet;
            descriptorPoolCI.maxSets       = 5000;
            descriptorPoolCI.pPoolSizes    = sizes;
            descriptorPoolCI.poolSizeCount = 3;

            VkResult result = vkCreateDescriptorPool(_device, ref descriptorPoolCI, null, out _descriptorPool);

            CheckResult(result);
        }