Esempio n. 1
0
        private static VkDescriptorSetLayout CreateDescriptorLayout(VkDevice device, uint textureCount)
        {
            VkDescriptorSetLayoutBinding samplerLayoutBinding = new VkDescriptorSetLayoutBinding();

            samplerLayoutBinding.binding            = 0;
            samplerLayoutBinding.descriptorCount    = textureCount;
            samplerLayoutBinding.descriptorType     = VkDescriptorType.CombinedImageSampler;
            samplerLayoutBinding.pImmutableSamplers = null;
            samplerLayoutBinding.stageFlags         = VkShaderStageFlags.Fragment;

            VkDescriptorSetLayoutBinding uboLayoutBinding = new VkDescriptorSetLayoutBinding();

            uboLayoutBinding.binding         = 1;
            uboLayoutBinding.descriptorCount = 1;
            uboLayoutBinding.descriptorType  = VkDescriptorType.UniformBuffer;
            uboLayoutBinding.stageFlags      = VkShaderStageFlags.Vertex;

            VkDescriptorSetLayoutBinding[] bindings = new VkDescriptorSetLayoutBinding[2];
            bindings[0] = samplerLayoutBinding;
            bindings[1] = uboLayoutBinding;

            VkDescriptorSetLayoutCreateInfo layoutInfo = VkDescriptorSetLayoutCreateInfo.New();

            layoutInfo.bindingCount = (uint)bindings.Length;

            fixed(VkDescriptorSetLayoutBinding *ptr = bindings)
            layoutInfo.pBindings = ptr;

            VkDescriptorSetLayout descriptorSetLayout = VkDescriptorSetLayout.Null;

            Assert(vkCreateDescriptorSetLayout(device, &layoutInfo, null, &descriptorSetLayout));
            return(descriptorSetLayout);
        }
Esempio n. 2
0
        void setupDescriptorSetLayout()
        {
            var bindings = VkDescriptorSetLayoutBinding.Alloc(2);
            {
                // Binding 0 : Vertex shader uniform buffer
                bindings[0].binding         = 0;
                bindings[0].descriptorType  = VkDescriptorType.UniformBuffer;
                bindings[0].descriptorCount = 1;
                bindings[0].stageFlags      = VkShaderStageFlagBits.Vertex;
                // Binding 1 : Fragment shader image sampler
                bindings[1].binding         = 1;
                bindings[1].descriptorType  = VkDescriptorType.CombinedImageSampler;
                bindings[1].descriptorCount = 1;
                bindings[1].stageFlags      = VkShaderStageFlagBits.Fragment;
            }

            {
                var info = VkDescriptorSetLayoutCreateInfo.Alloc();
                info[0].bindings.count   = 2;
                info[0].bindings.pointer = bindings;
                VkDescriptorSetLayout layout;
                vkCreateDescriptorSetLayout(device, info, null, &layout);
                this.layout = layout;
            }

            {
                VkDescriptorSetLayout layout = this.layout;
                var info = VkPipelineLayoutCreateInfo.Alloc();
                info[0].setLayouts = layout;
                VkPipelineLayout pipelineLayout;
                vkCreatePipelineLayout(device, info, null, &pipelineLayout);
                this.pipelineLayout = pipelineLayout;
            }
        }
        void setupDescriptorSetLayout()
        {
            var bindings = new VkDescriptorSetLayoutBinding[] {
                // layout (binding = 0) uniform UboView
                new VkDescriptorSetLayoutBinding(0, VkDescriptorType.UniformBuffer, 1, VkShaderStageFlagBits.Vertex),
                // layout (binding = 1) uniform UboInstance
                new VkDescriptorSetLayoutBinding(1, VkDescriptorType.UniformBufferDynamic, 1, VkShaderStageFlagBits.Vertex),
                // no matching uniform sampler2D in shader.
                new VkDescriptorSetLayoutBinding(2, VkDescriptorType.CombinedImageSampler, 1, VkShaderStageFlagBits.Fragment),
            };

            var descriptorLayoutInfo = new VkDescriptorSetLayoutCreateInfo();

            descriptorLayoutInfo.sType    = DescriptorSetLayoutCreateInfo;
            descriptorLayoutInfo.bindings = bindings;

            VkDescriptorSetLayout layout;

            vkCreateDescriptorSetLayout(device, &descriptorLayoutInfo, null, &layout);
            this.descriptorSetLayout = layout;

            VkPipelineLayoutCreateInfo info = new VkPipelineLayoutCreateInfo();

            info.sType      = PipelineLayoutCreateInfo;
            info.setLayouts = layout;

            VkPipelineLayout pipelineLayout;

            vkCreatePipelineLayout(device, &info, null, &pipelineLayout);
            this.pipelineLayout = pipelineLayout;
        }
        private VkDescriptorSetLayout CreateDescriptorSetLayout()
        {
            VkDescriptorSetLayoutBinding *bindings = stackalloc VkDescriptorSetLayoutBinding[2];

            bindings[0] = new VkDescriptorSetLayoutBinding
            {
                binding         = 0,
                descriptorType  = VkDescriptorType.UniformBuffer,
                descriptorCount = 1,
                stageFlags      = VkShaderStageFlags.Vertex
            };
            bindings[1] = new VkDescriptorSetLayoutBinding
            {
                binding         = 1,
                descriptorType  = VkDescriptorType.CombinedImageSampler,
                descriptorCount = 1,
                stageFlags      = VkShaderStageFlags.Fragment
            };
            var createInfo = new VkDescriptorSetLayoutCreateInfo
            {
                sType        = VkStructureType.DescriptorSetLayoutCreateInfo,
                pNext        = null,
                bindingCount = 2,
                pBindings    = bindings
            };
            VkDescriptorSetLayout layout;

            vkCreateDescriptorSetLayout(Context.Device, &createInfo, null, out layout).CheckResult();
            return(layout);
        }
Esempio n. 5
0
        void setupDescriptorSetLayout()
        {
            // Binding 0 : Vertex shader uniform buffer
            VkDescriptorSetLayoutBinding setLayoutBinding = new VkDescriptorSetLayoutBinding()
            {
                descriptorType  = VkDescriptorType.UniformBuffer,
                stageFlags      = VkShaderStageFlags.Vertex,
                binding         = 0,
                descriptorCount = 1
            };

            VkDescriptorSetLayoutCreateInfo descriptorLayout = VkDescriptorSetLayoutCreateInfo.New();

            descriptorLayout.pBindings    = &setLayoutBinding;
            descriptorLayout.bindingCount = 1;

            descriptorSetLayout.Count = 1;
            Util.CheckResult(vkCreateDescriptorSetLayout(Device, &descriptorLayout, null, (VkDescriptorSetLayout *)descriptorSetLayout.GetAddress(0)));

            VkPipelineLayoutCreateInfo pPipelineLayoutCreateInfo = VkPipelineLayoutCreateInfo.New();

            pPipelineLayoutCreateInfo.setLayoutCount = 1;
            pPipelineLayoutCreateInfo.pSetLayouts    = (VkDescriptorSetLayout *)descriptorSetLayout.Data.ToPointer();

            Util.CheckResult(vkCreatePipelineLayout(Device, &pPipelineLayoutCreateInfo, null, out pipelineLayout));
        }
Esempio n. 6
0
        internal static unsafe VkDescriptorSetLayout CreateNativeDescriptorSetLayout(GraphicsDevice device, IList <DescriptorSetLayoutBuilder.Entry> entries, out uint[] typeCounts)
        {
            var bindings          = new VkDescriptorSetLayoutBinding[entries.Count];
            var immutableSamplers = new VkSampler[entries.Count];

            int usedBindingCount = 0;

            typeCounts = new uint[DescriptorTypeCount];

            fixed(VkSampler *immutableSamplersPointer = &immutableSamplers[0])
            {
                for (int i = 0; i < entries.Count; i++)
                {
                    var entry = entries[i];

                    // TODO VULKAN: Special case for unused bindings in PipelineState. Handle more nicely.
                    if (entry.ArraySize == 0)
                    {
                        continue;
                    }

                    bindings[usedBindingCount] = new VkDescriptorSetLayoutBinding
                    {
                        descriptorType  = VulkanConvertExtensions.ConvertDescriptorType(entry.Class, entry.Type),
                        stageFlags      = VkShaderStageFlags.All, // TODO VULKAN: Filter?
                        binding         = (uint)i,
                        descriptorCount = (uint)entry.ArraySize
                    };

                    if (entry.ImmutableSampler != null)
                    {
                        // TODO VULKAN: Handle immutable samplers for DescriptorCount > 1
                        if (entry.ArraySize > 1)
                        {
                            throw new NotImplementedException();
                        }

                        // Remember this, so we can choose the right VkDescriptorType in DescriptorSet.SetShaderResourceView
                        immutableSamplers[i] = entry.ImmutableSampler.NativeSampler;
                        //bindings[i].VkDescriptorType = VkDescriptorType.CombinedImageSampler;
                        bindings[usedBindingCount].pImmutableSamplers = immutableSamplersPointer + i;
                    }

                    typeCounts[(int)bindings[usedBindingCount].descriptorType] += bindings[usedBindingCount].descriptorCount;

                    usedBindingCount++;
                }

                var createInfo = new VkDescriptorSetLayoutCreateInfo
                {
                    sType        = VkStructureType.DescriptorSetLayoutCreateInfo,
                    bindingCount = (uint)usedBindingCount,
                    pBindings    = usedBindingCount > 0 ? (VkDescriptorSetLayoutBinding *)Core.Interop.Fixed(bindings) : null,
                };

                vkCreateDescriptorSetLayout(device.NativeDevice, &createInfo, null, out var descriptorSetLayout);
                return(descriptorSetLayout);
            }
        }
Esempio n. 7
0
        /// <summary>
        /// Adds write info without specifying a destination descriptor set, this imply that on calling Write, you MUST
        /// provide a desDescriptor!
        /// </summary>
        public void AddWriteInfo(VkDescriptorSetLayoutBinding binding)
        {
            VkWriteDescriptorSet wds = VkWriteDescriptorSet.New();

            wds.descriptorType  = binding.descriptorType;
            wds.descriptorCount = binding.descriptorCount;
            wds.dstBinding      = binding.binding;
            WriteDescriptorSets.Add(wds);
        }
        private void PrepareDescriptor(VkDevice device)
        {
            // 定数バッファを1つだけ持つものを作る.
            VkDescriptorPoolSize descriptorPoolSize = new VkDescriptorPoolSize()
            {
                descriptorCount = 1,
                type            = VkDescriptorType.VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
            };
            var descriptorPoolCreateInfo = new VkDescriptorPoolCreateInfo()
            {
                poolSizes = new[] { descriptorPoolSize },
                maxSets   = 1,
                flags     = VkDescriptorPoolCreateFlags.VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT,
            };

            VulkanAPI.vkCreateDescriptorPool(device, ref descriptorPoolCreateInfo, out m_descriptorPool);

            // ディスクリプタセットレイアウトの作成.
            // 今は定数バッファを1つ持つだけのものを作成.
            var descriptorLayoutBinding = new VkDescriptorSetLayoutBinding();

            descriptorLayoutBinding.binding         = 0;
            descriptorLayoutBinding.descriptorCount = 1;
            descriptorLayoutBinding.descriptorType  = VkDescriptorType.VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
            descriptorLayoutBinding.stageFlags      = VkShaderStageFlagBits.VK_SHADER_STAGE_VERTEX_BIT;

            var descriptorSetLayoutCreateInfo = new VkDescriptorSetLayoutCreateInfo();

            descriptorSetLayoutCreateInfo.bindings = new[] { descriptorLayoutBinding };
            VulkanAPI.vkCreateDescriptorSetLayout(device, ref descriptorSetLayoutCreateInfo, out m_descriptorSetLayout);

            // ディスクリプタセットを作成.
            VkDescriptorSet[] descriptorSets;
            var descriptorSetAllocateInfo = new VkDescriptorSetAllocateInfo(m_descriptorPool, new[] { m_descriptorSetLayout });

            VulkanAPI.vkAllocateDescriptorSets(device, ref descriptorSetAllocateInfo, out descriptorSets);
            m_descriptorSet = descriptorSets[0];

            // ディスクリプタを更新.
            // 定数バッファ1つを持つレイアウトでディスクリプタを作る.
            VkDescriptorBufferInfo descUniformBufferInfo = new VkDescriptorBufferInfo();

            descUniformBufferInfo.buffer = m_uniformBuffer;
            descUniformBufferInfo.range  = Marshal.SizeOf <Transform>();
            var descriptor = new VkWriteDescriptorSet();

            descriptor.descriptorCount = 1;
            descriptor.descriptorType  = VkDescriptorType.VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
            descriptor.pBufferInfo     = new[] { descUniformBufferInfo };
            descriptor.dstBinding      = 0;
            descriptor.dstSet          = m_descriptorSet;
            VulkanAPI.vkUpdateDescriptorSets(device, new[] { descriptor }, null);
        }
Esempio n. 9
0
        public static VkDescriptorSetLayoutBinding descriptorSetLayoutBinding(
            VkDescriptorType type,
            VkShaderStageFlags stageFlags,
            uint binding,
            uint descriptorCount = 1)
        {
            VkDescriptorSetLayoutBinding setLayoutBinding = new VkDescriptorSetLayoutBinding();

            setLayoutBinding.descriptorType  = type;
            setLayoutBinding.stageFlags      = stageFlags;
            setLayoutBinding.binding         = binding;
            setLayoutBinding.descriptorCount = descriptorCount;
            return(setLayoutBinding);
        }
Esempio n. 10
0
        public void AddWriteInfo(DescriptorSet destSet, VkDescriptorSetLayoutBinding binding, VkDescriptorImageInfo descriptor)
        {
            if (!descriptors.Contains(descriptor))
            {
                descriptors.Add(descriptor);
            }
            VkWriteDescriptorSet wds = VkWriteDescriptorSet.New();

            wds.descriptorType  = binding.descriptorType;
            wds.descriptorCount = binding.descriptorCount;
            wds.dstBinding      = binding.binding;
            wds.dstSet          = destSet.handle;
            wds.pImageInfo      = descriptor.Pin();

            WriteDescriptorSets.Add(wds);
        }
Esempio n. 11
0
        void CreateDescriptorSetLayout()
        {
            var uboLayoutBinding = new VkDescriptorSetLayoutBinding();

            uboLayoutBinding.binding         = 0;
            uboLayoutBinding.descriptorType  = VkDescriptorType.UniformBuffer;
            uboLayoutBinding.descriptorCount = 1;
            uboLayoutBinding.stageFlags      = VkShaderStageFlags.VertexBit;

            var info = new VkDescriptorSetLayoutCreateInfo();

            info.bindings = new List <VkDescriptorSetLayoutBinding> {
                uboLayoutBinding
            };

            descriptorSetLayout = new VkDescriptorSetLayout(device, info);
        }
Esempio n. 12
0
        void setupDescriptorSetLayout()
        {
            VkDescriptorSetLayoutBinding setLayoutBindings =
                // Binding 0 : Vertex shader uniform buffer
                Initializers.descriptorSetLayoutBinding(
                    VkDescriptorType.UniformBuffer,
                    VkShaderStageFlags.Vertex,
                    0);

            VkDescriptorSetLayoutCreateInfo descriptorLayout =
                Initializers.descriptorSetLayoutCreateInfo(
                    &setLayoutBindings,
                    1);

            Util.CheckResult(vkCreateDescriptorSetLayout(device, &descriptorLayout, null, out descriptorSetLayout));

            var dsl = descriptorSetLayout;
            VkPipelineLayoutCreateInfo pipelineLayoutCreateInfo =
                Initializers.pipelineLayoutCreateInfo(
                    &dsl,
                    1);

            // Define push constant
            // Example uses six light positions as push constants
            // 6 * 4 * 4 = 96 bytes
            // Spec requires a minimum of 128 bytes, bigger values
            // need to be checked against maxPushConstantsSize
            // But even at only 128 bytes, lots of stuff can fit
            // inside push constants
            VkPushConstantRange pushConstantRange =
                Initializers.pushConstantRange(
                    VkShaderStageFlags.Vertex,
                    pushConstants.Count * (uint)sizeof(Vector4),
                    0);

            // Push constant ranges are part of the pipeline layout
            pipelineLayoutCreateInfo.pushConstantRangeCount = 1;
            pipelineLayoutCreateInfo.pPushConstantRanges    = &pushConstantRange;

            Util.CheckResult(vkCreatePipelineLayout(device, &pipelineLayoutCreateInfo, null, out pipelineLayout));
        }
Esempio n. 13
0
        private void PrepareDescriptor(VkDevice device)
        {
            // 今は定数バッファを1つを格納できるだけのディスクリプタプールを準備.
            var descriptorPoolSize = new VkDescriptorPoolSize()
            {
                descriptorCount = 1,
                type            = VkDescriptorType.VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
            };

            m_descriptorPool = m_resourceManager.CreateDescriptorPool(device, new[] { descriptorPoolSize }, 1);

            // ディスクリプタセットレイアウトの作成.
            //  - 定数バッファを1つ
            var descLayoutBinding = new VkDescriptorSetLayoutBinding()
            {
                binding         = 0,
                descriptorCount = 1,
                descriptorType  = VkDescriptorType.VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
                stageFlags      = VkShaderStageFlagBits.VK_SHADER_STAGE_VERTEX_BIT
            };

            m_descriptorSetLayout = m_resourceManager.CreateDescriptorSetLayout(device, new[] { descLayoutBinding });

            // ディスクリプタを作成&更新.
            VkDescriptorSet[] descriptorSets;
            var descriptorSetAllocateInfo = new VkDescriptorSetAllocateInfo(m_descriptorPool, new[] { m_descriptorSetLayout });

            VulkanAPI.vkAllocateDescriptorSets(device, ref descriptorSetAllocateInfo, out descriptorSets);
            m_descriptorSet = descriptorSets[0];

            var descUniform = new VkDescriptorBufferInfo()
            {
                buffer = m_uniformBuffer,
                range  = Marshal.SizeOf <Transform>(),
            };
            var descForUniform   = SampleHelpers.CreateDescriptorFromUniformBuffer(0, descUniform, m_descriptorSet);
            var descriptorWrites = new[] { descForUniform };

            VulkanAPI.vkUpdateDescriptorSets(device, descriptorWrites, null);
        }
Esempio n. 14
0
        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
                {
Esempio n. 15
0
        void setupDescriptorSetLayout()
        {
            var bindings = new VkDescriptorSetLayoutBinding[2];

            // Binding 0 : Vertex shader uniform buffer
            bindings[0] = new VkDescriptorSetLayoutBinding();
            bindings[0].descriptorType  = VkDescriptorType.UniformBuffer;
            bindings[0].stageFlags      = VkShaderStageFlagBits.Vertex;
            bindings[0].binding         = 0;
            bindings[0].descriptorCount = 1;
            // Binding 1 : Fragment shader combined sampler
            bindings[1] = new VkDescriptorSetLayoutBinding();
            bindings[1].descriptorType  = VkDescriptorType.CombinedImageSampler;
            bindings[1].stageFlags      = VkShaderStageFlagBits.Fragment;
            bindings[1].binding         = 1;
            bindings[1].descriptorCount = 1;

            var descriptorLayout = VkDescriptorSetLayoutCreateInfo.Alloc();

            descriptorLayout->bindings = bindings;

            VkDescriptorSetLayout dsl;

            vkCreateDescriptorSetLayout(device, descriptorLayout, null, &dsl);
            this.descriptorSetLayout = dsl;

            var info = new VkPipelineLayoutCreateInfo();

            info.sType      = PipelineLayoutCreateInfo;
            info.setLayouts = dsl;

            {
                VkPipelineLayout layout;
                vkCreatePipelineLayout(device, &info, null, &layout);
                this.pipelineLayout = layout;
            }
        }
Esempio n. 16
0
 public DescriptorSetWrites(VkDescriptorSetLayoutBinding binding)
 {
     AddWriteInfo(binding);
 }
        private VkDescriptorSetLayout CreateVulkanDescriptorSetLayout()
        {
            VkDescriptorSetLayout vulkanDescriptorSetLayout;

            var descriptorSetLayoutBindings = Array.Empty <VkDescriptorSetLayoutBinding>();

            var descriptorSetLayoutCreateInfo = new VkDescriptorSetLayoutCreateInfo {
                sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
            };

            var resources       = Resources;
            var resourcesLength = resources.Length;

            var descriptorSetLayoutBindingsIndex = 0;

            if (resourcesLength != 0)
            {
                descriptorSetLayoutBindings = new VkDescriptorSetLayoutBinding[resourcesLength];

                for (var resourceIndex = 0; resourceIndex < resourcesLength; resourceIndex++)
                {
                    var resource = resources[resourceIndex];

                    switch (resource.Kind)
                    {
                    case GraphicsPipelineResourceKind.ConstantBuffer:
                    {
                        var stageFlags = GetVulkanShaderStageFlags(resource.ShaderVisibility);

                        descriptorSetLayoutBindings[descriptorSetLayoutBindingsIndex] = new VkDescriptorSetLayoutBinding {
                            binding         = unchecked ((uint)descriptorSetLayoutBindingsIndex),
                            descriptorType  = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
                            descriptorCount = 1,
                            stageFlags      = stageFlags,
                        };

                        descriptorSetLayoutBindingsIndex++;
                        break;
                    }

                    case GraphicsPipelineResourceKind.Texture:
                    {
                        var stageFlags = GetVulkanShaderStageFlags(resource.ShaderVisibility);

                        descriptorSetLayoutBindings[descriptorSetLayoutBindingsIndex] = new VkDescriptorSetLayoutBinding {
                            binding         = unchecked ((uint)descriptorSetLayoutBindingsIndex),
                            descriptorType  = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
                            descriptorCount = 1,
                            stageFlags      = stageFlags,
                        };

                        descriptorSetLayoutBindingsIndex++;
                        break;
                    }

                    default:
                    {
                        break;
                    }
                    }
                }

                fixed(VkDescriptorSetLayoutBinding *pDescriptorSetLayoutBindings = descriptorSetLayoutBindings)
                {
                    descriptorSetLayoutCreateInfo.bindingCount = unchecked ((uint)descriptorSetLayoutBindings.Length);
                    descriptorSetLayoutCreateInfo.pBindings    = pDescriptorSetLayoutBindings;

                    ThrowExternalExceptionIfNotSuccess(vkCreateDescriptorSetLayout(Device.VulkanDevice, &descriptorSetLayoutCreateInfo, pAllocator: null, (ulong *)&vulkanDescriptorSetLayout), nameof(vkCreateDescriptorSetLayout));
                }
            }
            else
            {
                vulkanDescriptorSetLayout = VK_NULL_HANDLE;
            }

            return(vulkanDescriptorSetLayout);
Esempio n. 18
0
        private void PrepareDescriptor(VkDevice device)
        {
            // 今は定数バッファを1つ、サンプラーを1つを格納できるだけのディスクリプタプールを準備.
            VkDescriptorPoolSize descriptorPoolSize = new VkDescriptorPoolSize()
            {
                descriptorCount = 1,
                type            = VkDescriptorType.VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
            };
            VkDescriptorPoolSize descriptorPoolSizeForSampler = new VkDescriptorPoolSize()
            {
                descriptorCount = 1,
                type            = VkDescriptorType.VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
            };
            var descriptorPoolCreateInfo = new VkDescriptorPoolCreateInfo()
            {
                poolSizes = new[] { descriptorPoolSize, descriptorPoolSizeForSampler },
                maxSets   = 1,
                flags     = VkDescriptorPoolCreateFlags.VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT,
            };

            VulkanAPI.vkCreateDescriptorPool(device, ref descriptorPoolCreateInfo, out m_descriptorPool);

            // ディスクリプタセットレイアウトの作成.
            //  - 定数バッファを1つ
            //  - テクスチャサンプラ1つ
            var descLayoutBindingForUniform = new VkDescriptorSetLayoutBinding();

            descLayoutBindingForUniform.binding         = 0;
            descLayoutBindingForUniform.descriptorCount = 1;
            descLayoutBindingForUniform.descriptorType  = VkDescriptorType.VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
            descLayoutBindingForUniform.stageFlags      = VkShaderStageFlagBits.VK_SHADER_STAGE_VERTEX_BIT;
            var descLayoutBindingForSampler = new VkDescriptorSetLayoutBinding();

            descLayoutBindingForSampler.binding         = 1;
            descLayoutBindingForSampler.descriptorCount = 1;
            descLayoutBindingForSampler.descriptorType  = VkDescriptorType.VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
            descLayoutBindingForSampler.stageFlags      = VkShaderStageFlagBits.VK_SHADER_STAGE_FRAGMENT_BIT;
            var descriptorSetLayoutCreateInfo = new VkDescriptorSetLayoutCreateInfo();

            descriptorSetLayoutCreateInfo.bindings = new[] {
                descLayoutBindingForUniform,
                descLayoutBindingForSampler
            };
            VulkanAPI.vkCreateDescriptorSetLayout(device, ref descriptorSetLayoutCreateInfo, out m_descriptorSetLayout);


            // ディスクリプタを作成&更新.
            VkDescriptorSet[] descriptorSets;
            var descriptorSetAllocateInfo = new VkDescriptorSetAllocateInfo(m_descriptorPool, new[] { m_descriptorSetLayout });

            VulkanAPI.vkAllocateDescriptorSets(device, ref descriptorSetAllocateInfo, out descriptorSets);
            m_descriptorSet = descriptorSets[0];

            var descUniform = new VkDescriptorBufferInfo()
            {
                buffer = m_uniformBuffer,
                range  = Marshal.SizeOf <Transform>(),
            };
            var descSampler = new VkDescriptorImageInfo()
            {
                imageView = m_imageView,
                sampler   = m_imageSampler,
            };
            var descForUniform   = SampleHelpers.CreateDescriptorFromUniformBuffer(0, descUniform, m_descriptorSet);
            var descForSampler   = SampleHelpers.CreateDescriptorFromImageSampler(1, descSampler, m_descriptorSet);
            var descriptorWrites = new[] { descForUniform, descForSampler };

            VulkanAPI.vkUpdateDescriptorSets(device, descriptorWrites, null);
        }
Esempio n. 19
0
        void loadMaterials(glTFLoader ctx, DescriptorSetLayout layout, params AttachmentType[] attachments)
        {
            Model.Material[] mats = ctx.LoadMaterial();
            materials      = new Material[mats.Length];
            descriptorSets = new DescriptorSet[mats.Length];

            if (attachments.Length == 0)
            {
                throw new InvalidOperationException("At least one attachment is required for Model.WriteMaterialDescriptor");
            }

            descriptorPool = new DescriptorPool(dev, (uint)materials.Length,
                                                new VkDescriptorPoolSize(VkDescriptorType.CombinedImageSampler, (uint)(attachments.Length * materials.Length))
                                                );
            descriptorPool.SetName("descPool gltfTextures");

            for (int i = 0; i < mats.Length; i++)
            {
                materials[i] = new Material {
                    workflow        = (float)mats[i].workflow,
                    baseColorFactor = mats[i].baseColorFactor,
                    emissiveFactor  = mats[i].emissiveFactor,
                    metallicFactor  = mats[i].metallicFactor,
                    roughnessFactor = mats[i].roughnessFactor,
                    TexCoord0       = mats[i].availableAttachments,
                    TexCoord1       = mats[i].availableAttachments1,
                    alphaMask       = 0f,
                    alphaMaskCutoff = 0.0f,
                    diffuseFactor   = new Vector4(0),
                    specularFactor  = new Vector4(0)
                };

                descriptorSets[i] = descriptorPool.Allocate(layout);
                descriptorSets[i].Handle.SetDebugMarkerName(dev, "descSet " + mats[i].Name);

                VkDescriptorSetLayoutBinding dslb =
                    new VkDescriptorSetLayoutBinding(0, VkShaderStageFlags.Fragment, VkDescriptorType.CombinedImageSampler);

                using (DescriptorSetWrites2 uboUpdate = new DescriptorSetWrites2(dev)) {
                    for (uint a = 0; a < attachments.Length; a++)
                    {
                        dslb.binding = a;
                        switch (attachments[a])
                        {
                        case AttachmentType.None:
                            break;

                        case AttachmentType.Color:
                            if (mats[i].availableAttachments.HasFlag(AttachmentType.Color))
                            {
                                uboUpdate.AddWriteInfo(descriptorSets[i], dslb, textures[(int)mats[i].baseColorTexture].Descriptor);
                            }
                            break;

                        case AttachmentType.Normal:
                            if (mats[i].availableAttachments.HasFlag(AttachmentType.Normal))
                            {
                                uboUpdate.AddWriteInfo(descriptorSets[i], dslb, textures[(int)mats[i].normalTexture].Descriptor);
                            }
                            break;

                        case AttachmentType.AmbientOcclusion:
                            if (mats[i].availableAttachments.HasFlag(AttachmentType.AmbientOcclusion))
                            {
                                uboUpdate.AddWriteInfo(descriptorSets[i], dslb, textures[(int)mats[i].occlusionTexture].Descriptor);
                            }
                            break;

                        case AttachmentType.PhysicalProps:
                            if (mats[i].availableAttachments.HasFlag(AttachmentType.PhysicalProps))
                            {
                                uboUpdate.AddWriteInfo(descriptorSets[i], dslb, textures[(int)mats[i].metallicRoughnessTexture].Descriptor);
                            }
                            break;

                        case AttachmentType.Metal:
                            break;

                        case AttachmentType.Roughness:
                            break;

                        case AttachmentType.Emissive:
                            if (mats[i].availableAttachments.HasFlag(AttachmentType.Emissive))
                            {
                                uboUpdate.AddWriteInfo(descriptorSets[i], dslb, textures[(int)mats[i].emissiveTexture].Descriptor);
                            }
                            break;
                        }
                    }
                    uboUpdate.Update();
                }
            }
        }
Esempio n. 20
0
 public DescriptorSetWrites(DescriptorSet destSet, VkDescriptorSetLayoutBinding binding)
 {
     AddWriteInfo(destSet, binding);
 }
Esempio n. 21
0
        void setupDescriptorSetLayout()
        {
            // Scene rendering
            {
                var bindings = new VkDescriptorSetLayoutBinding[]
                {
                    // Binding 0: Vertex shader uniform buffer
                    new VkDescriptorSetLayoutBinding {
                        binding        = 0,
                        descriptorType = VkDescriptorType.UniformBuffer, descriptorCount = 1,
                        stageFlags     = VkShaderStageFlagBits.Vertex
                    },
                    // Binding 1: Fragment shader image sampler
                    new VkDescriptorSetLayoutBinding {
                        binding        = 1,
                        descriptorType = VkDescriptorType.CombinedImageSampler, descriptorCount = 1,
                        stageFlags     = VkShaderStageFlagBits.Fragment
                    },
                    // Binding 2: Fragment shader uniform buffer
                    new VkDescriptorSetLayoutBinding {
                        binding        = 2,
                        descriptorType = VkDescriptorType.UniformBuffer, descriptorCount = 1,
                        stageFlags     = VkShaderStageFlagBits.Fragment
                    },
                };

                var layoutInfo = VkDescriptorSetLayoutCreateInfo.Alloc();
                layoutInfo->bindings = bindings;
                {
                    VkDescriptorSetLayout layout;
                    vkCreateDescriptorSetLayout(device, layoutInfo, null, &layout);
                    this.setLayoutScene = layout;
                }
                {
                    var dsl = setLayoutScene;
                    var pPipelineLayoutCreateInfo = VkPipelineLayoutCreateInfo.Alloc();
                    pPipelineLayoutCreateInfo[0].setLayouts = dsl;
                    VkPipelineLayout pipelineLayout;
                    vkCreatePipelineLayout(device, pPipelineLayoutCreateInfo, null, &pipelineLayout);
                    this.pipelineLayoutScene = pipelineLayout;
                }
            }
            // Fullscreen radial blur
            {
                var bindings = new VkDescriptorSetLayoutBinding[]
                {
                    // Binding 0 : Vertex shader uniform buffer
                    new VkDescriptorSetLayoutBinding {
                        binding        = 0,
                        descriptorType = VkDescriptorType.UniformBuffer, descriptorCount = 1,
                        stageFlags     = VkShaderStageFlagBits.Fragment
                    },
                    // Binding 0: Fragment shader image sampler
                    new VkDescriptorSetLayoutBinding {
                        binding        = 1,
                        descriptorType = VkDescriptorType.CombinedImageSampler, descriptorCount = 1,
                        stageFlags     = VkShaderStageFlagBits.Fragment
                    },
                };
                var layoutInfo = VkDescriptorSetLayoutCreateInfo.Alloc();
                layoutInfo->bindings = bindings;
                {
                    VkDescriptorSetLayout layout;
                    vkCreateDescriptorSetLayout(device, layoutInfo, null, &layout);
                    this.setLayoutRadialBlur = layout;
                }
                {
                    var dsl = setLayoutRadialBlur;
                    var pPipelineLayoutCreateInfo = VkPipelineLayoutCreateInfo.Alloc();
                    pPipelineLayoutCreateInfo[0].setLayouts = dsl;
                    VkPipelineLayout pipelineLayout;
                    vkCreatePipelineLayout(device, pPipelineLayoutCreateInfo, null, &pipelineLayout);
                    this.pipelineLayoutRadialBlur = pipelineLayout;
                }
            }
        }
Esempio n. 22
0
 internal DescriptorData(VkDescriptorSetLayoutBinding b)
 {
     Type   = b.DescriptorType;
     Count  = b.DescriptorCount;
     Stages = b.StageFlags;
 }