Esempio n. 1
0
        void SetupDescriptorSet(Pipeline pipeline, GraphicsDevice device, UniformBuffer uniformBuffer, Texture2D texture_colorMap)
        {
            var dsl = pipeline.descriptorSetLayout;
            VkDescriptorSetAllocateInfo allocInfo =
                Initializers.descriptorSetAllocateInfo(
                    pipeline.descriptorPool,
                    &dsl,
                    1);

            Util.CheckResult(vkAllocateDescriptorSets(device.device, &allocInfo, out pipeline.descriptorSet));

            VkDescriptorImageInfo texDescriptor =
                Initializers.descriptorImageInfo(
                    texture_colorMap.sampler,
                    texture_colorMap.view,
                    VkImageLayout.General);

            VkDescriptorBufferInfo temp = uniformBuffer.GetVkDescriptor();

            FixedArray2 <VkWriteDescriptorSet> writeDescriptorSets = new FixedArray2 <VkWriteDescriptorSet>(
                // Binding 0 : Vertex shader uniform buffer
                Initializers.writeDescriptorSet(
                    pipeline.descriptorSet,
                    VkDescriptorType.UniformBuffer,
                    uniformBuffer.location,
                    &temp),
                // Binding 1 : Color map
                Initializers.writeDescriptorSet(
                    pipeline.descriptorSet,
                    VkDescriptorType.CombinedImageSampler,
                    1,
                    &texDescriptor));

            vkUpdateDescriptorSets(device.device, (writeDescriptorSets.Count), ref writeDescriptorSets.First, 0, null);
        }
Esempio n. 2
0
        void setupDescriptorSet()
        {
            // Scene rendering
            {
                VkDescriptorSetLayout dsl = setLayoutScene;
                var info = VkDescriptorSetAllocateInfo.Alloc();
                info->setLayouts     = dsl;
                info->descriptorPool = descriptorPool;
                VkDescriptorSet set;
                vkAllocateDescriptorSets(device, info, &set);
                this.setScene = set;
            }
            {
                var descriptor0 = uniformBufferScene.descriptor;
                var descriptor1 = textures_gradient.descriptor;
                var writes      = VkWriteDescriptorSet.Alloc(2);
                {
                    // Binding 0: Vertex shader uniform buffer
                    writes[0].dstSet = setScene;
                    writes[0].data.descriptorType = VkDescriptorType.UniformBuffer;
                    writes[0].dstBinding          = 0;
                    writes[0].data.Set(descriptor0);
                    // Binding 1: Color gradient sampler
                    writes[1].dstSet = setScene;
                    writes[1].data.descriptorType = VkDescriptorType.CombinedImageSampler;
                    writes[1].dstBinding          = 1;
                    writes[1].data.Set(descriptor1);
                }
                vkUpdateDescriptorSets(device, 2, writes, 0, null);
            }

            // Fullscreen radial blur
            {
                VkDescriptorSetLayout dsl = setLayoutRadialBlur;
                var info = VkDescriptorSetAllocateInfo.Alloc();
                info->setLayouts     = dsl;
                info->descriptorPool = descriptorPool;
                VkDescriptorSet set;
                vkAllocateDescriptorSets(device, info, &set);
                this.setRadialBlur = set;
            }
            {
                VkDescriptorBufferInfo descriptor0 = uniformBufferBlurParams.descriptor;
                VkDescriptorImageInfo  descriptor1 = offscreenPass.descriptorImage;
                var writes = VkWriteDescriptorSet.Alloc(2);
                {
                    // Binding 0: Vertex shader uniform buffer
                    writes[0].dstSet = setRadialBlur;
                    writes[0].data.descriptorType = VkDescriptorType.UniformBuffer;
                    writes[0].dstBinding          = 0;
                    writes[0].data.Set(descriptor0);
                    // Binding 0: Fragment shader texture sampler
                    writes[1].dstSet = setRadialBlur;
                    writes[1].data.descriptorType = VkDescriptorType.CombinedImageSampler;
                    writes[1].dstBinding          = 1;
                    writes[1].data.Set(descriptor1);
                }
                vkUpdateDescriptorSets(device, 2, writes, 0, null);
            }
        }
Esempio n. 3
0
        public void Set(uint binding, uint idx, GpuBuffer buf, ulong off, ulong len)
        {
            var buf_info = new VkDescriptorBufferInfo()
            {
                buffer = buf.hndl,
                offset = off,
                range  = len
            };
            var buf_info_ptr = buf_info.Pointer();

            var desc_write = new VkWriteDescriptorSet()
            {
                sType            = VkStructureType.StructureTypeWriteDescriptorSet,
                dstSet           = hndl,
                dstBinding       = binding,
                dstArrayElement  = idx,
                descriptorCount  = 1,
                pImageInfo       = IntPtr.Zero,
                pBufferInfo      = buf_info_ptr,
                pTexelBufferView = null,
                descriptorType   = (VkDescriptorType)Layout.Layouts[(int)binding].Type
            };

            vkUpdateDescriptorSets(GraphicsDevice.GetDeviceInfo(devID).Device, 1, desc_write.Pointer(), 0, null);
        }
        public unsafe void UpdateBuffer(Buffer buffer, int binding)
        {
            var vulkanBinding           = _descriptorPool.Layout.Bindings[binding];
            var descriptorSetBufferInfo = new VkDescriptorBufferInfo
            {
                buffer = buffer.Handle,
                offset = 0,
                range  = buffer.Size
            };

            var writeDescriptorSet = new VkWriteDescriptorSet
            {
                sType           = VkStructureType.WriteDescriptorSet,
                dstSet          = _handle,
                dstBinding      = vulkanBinding.Index,
                dstArrayElement = 0,
                descriptorCount = vulkanBinding.DescriptorCounts,
                descriptorType  = vulkanBinding.DescriptorType,
                pBufferInfo     = &descriptorSetBufferInfo,
            };

            VulkanNative.vkUpdateDescriptorSets(
                _device.Handle,
                1,
                &writeDescriptorSet,
                0,
                null
                );
        }
Esempio n. 5
0
        void CreateDescriptorSet()
        {
            var layouts = new List <VkDescriptorSetLayout> {
                descriptorSetLayout
            };
            var info = new VkDescriptorSetAllocateInfo();

            info.setLayouts = layouts;

            descriptorSet = descriptorPool.Allocate(info)[0];

            var bufferInfo = new VkDescriptorBufferInfo();

            bufferInfo.buffer = uniformBuffer;
            bufferInfo.offset = 0;
            bufferInfo.range  = Interop.SizeOf <UniformBufferObject>();

            var descriptorWrites = new List <VkWriteDescriptorSet>();

            descriptorWrites.Add(new VkWriteDescriptorSet());
            descriptorWrites[0].dstSet          = descriptorSet;
            descriptorWrites[0].dstBinding      = 0;
            descriptorWrites[0].dstArrayElement = 0;
            descriptorWrites[0].descriptorType  = VkDescriptorType.UniformBuffer;
            descriptorWrites[0].bufferInfo      = new List <VkDescriptorBufferInfo> {
                bufferInfo
            };

            descriptorSet.Update(descriptorWrites, null);
        }
        public VkDescriptorBufferInfo GetVkDescriptor()
        {
            VkDescriptorBufferInfo bufferInfo = new VkDescriptorBufferInfo();

            bufferInfo.buffer = vkBuffer;
            bufferInfo.offset = 0;
            bufferInfo.range  = size;
            return(bufferInfo);
        }
Esempio n. 7
0
        private DescriptorSet Bind(uint dstBinding, ref VkDescriptorBufferInfo bufferInfo, BufferView bufferView)
        {
            var descriptorType = resourceLayout.Bindings[(int)dstBinding].descriptorType;

            for (int img = 0; img < Swapchain.IMAGE_COUNT; img++)
            {
                AddWriteDescriptorSet(img, new VkWriteDescriptorSet(dstBinding, descriptorSet[img], descriptorType, ref bufferInfo, ref bufferView.HandleRef));
            }

            return(this);
        }
        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 unsafe VkWriteDescriptorSet(uint binding, VkDescriptorSet dstSet, VkDescriptorType type,
                                    ref VkDescriptorBufferInfo bufferInfo, uint descriptorCount = 1)
 {
     this.sType            = VkStructureType.WriteDescriptorSet;
     this.pNext            = null;
     this.dstSet           = dstSet;
     this.descriptorType   = type;
     this.dstBinding       = binding;
     this.pBufferInfo      = (VkDescriptorBufferInfo *)Unsafe.AsPointer(ref bufferInfo);
     this.descriptorCount  = descriptorCount;
     this.pImageInfo       = null;
     this.pTexelBufferView = null;
     this.dstArrayElement  = 0;
 }
Esempio n. 10
0
        void UpdateDescriptorSets(VkDevice device, VkBuffer uniformBuffer, VkDescriptorSet descriptorSet)
        {
            var write = new VkWriteDescriptorSet {
                sType = VkStructureType.WriteDescriptorSet
            };

            write.dstSet = descriptorSet;
            write.data.descriptorType = VkDescriptorType.UniformBuffer;
            var info = new VkDescriptorBufferInfo(uniformBuffer, 0, 2 * sizeof(float));

            write.data.Set(info);

            //device.UpdateDescriptorSets(new VkWriteDescriptorSet[] { write }, null);
            vkAPI.vkUpdateDescriptorSets(device, 1, &write, 0, null);

            write.Free();
        }
        void setupDescriptorSet()
        {
            var allocInfo = new VkDescriptorSetAllocateInfo();

            allocInfo.sType          = DescriptorSetAllocateInfo;
            allocInfo.descriptorPool = descriptorPool;
            allocInfo.setLayouts     = descriptorSetLayout;

            VkDescriptorSet set;

            vkAllocateDescriptorSets(device, &allocInfo, &set);
            this.descriptorSet = set;

            VkDescriptorBufferInfo descriptor0 = uniformBuffers_view.descriptor;
            VkDescriptorBufferInfo descriptor1 = uniformBuffers_dynamic.descriptor;
            var writeDescriptorSets            = new VkWriteDescriptorSet[2];

            {
                // Binding 0 : Projection/View matrix uniform buffer
                var a = new VkWriteDescriptorSet()
                {
                    sType      = WriteDescriptorSet,
                    dstSet     = descriptorSet,
                    dstBinding = 0,
                };
                a.data.descriptorType = VkDescriptorType.UniformBuffer;
                a.data.Set(descriptor0);
                writeDescriptorSets[0] = a;
                // Binding 1 : Instance matrix as dynamic uniform buffer
                var b = new VkWriteDescriptorSet()
                {
                    sType      = WriteDescriptorSet,
                    dstSet     = descriptorSet,
                    dstBinding = 1,
                };
                b.data.descriptorType = VkDescriptorType.UniformBufferDynamic;
                b.data.Set(descriptor1);
                writeDescriptorSets[1] = b;
            };

            fixed(VkWriteDescriptorSet *pointer = writeDescriptorSets)
            {
                vkUpdateDescriptorSets(device, (UInt32)writeDescriptorSets.Length, pointer, 0, null);
            }
        }
Esempio n. 12
0
        void CreateDescriptorSet()
        {
            var layouts = new List <VkDescriptorSetLayout> {
                descriptorSetLayout
            };
            var info = new VkDescriptorSetAllocateInfo();

            info.setLayouts = layouts;

            descriptorSet = descriptorPool.Allocate(info)[0];

            var bufferInfo = new VkDescriptorBufferInfo();

            bufferInfo.buffer = uniformBuffer;
            bufferInfo.offset = 0;
            bufferInfo.range  = Interop.SizeOf <UniformBufferObject>();

            var imageInfo = new VkDescriptorImageInfo();

            imageInfo.imageLayout = VkImageLayout.ShaderReadOnlyOptimal;
            imageInfo.imageView   = textureImageView;
            imageInfo.sampler     = textureSampler;

            var descriptorWrites = new List <VkWriteDescriptorSet>();

            descriptorWrites.Add(new VkWriteDescriptorSet());
            descriptorWrites[0].dstSet          = descriptorSet;
            descriptorWrites[0].dstBinding      = 0;
            descriptorWrites[0].dstArrayElement = 0;
            descriptorWrites[0].descriptorType  = VkDescriptorType.UniformBuffer;
            descriptorWrites[0].bufferInfo      = new List <VkDescriptorBufferInfo> {
                bufferInfo
            };

            descriptorWrites.Add(new VkWriteDescriptorSet());
            descriptorWrites[1].dstSet          = descriptorSet;
            descriptorWrites[1].dstBinding      = 1;
            descriptorWrites[1].dstArrayElement = 0;
            descriptorWrites[1].descriptorType  = VkDescriptorType.CombinedImageSampler;
            descriptorWrites[1].imageInfo       = new List <VkDescriptorImageInfo> {
                imageInfo
            };

            descriptorSet.Update(descriptorWrites, null);
        }
Esempio n. 13
0
        void setupDescriptorSet()
        {
            VkDescriptorSetLayout       dsl       = descriptorSetLayout;
            VkDescriptorSetAllocateInfo allocInfo = new VkDescriptorSetAllocateInfo();

            allocInfo.sType          = DescriptorSetAllocateInfo;
            allocInfo.descriptorPool = descriptorPool;
            allocInfo.setLayouts     = dsl;

            {
                VkDescriptorSet set;
                vkAllocateDescriptorSets(device, &allocInfo, &set);
                this.descriptorSet = set;
            }

            VkDescriptorImageInfo texDescriptor = new VkDescriptorImageInfo();

            texDescriptor.sampler     = textures_colorMap.sampler;
            texDescriptor.imageView   = textures_colorMap.view;
            texDescriptor.imageLayout = VkImageLayout.General;

            VkDescriptorBufferInfo temp = uniformBuffers_scene.descriptor;
            var writes = new VkWriteDescriptorSet[2];

            // Binding 0 : Vertex shader uniform buffer
            writes[0]        = new VkWriteDescriptorSet();
            writes[0].sType  = WriteDescriptorSet;
            writes[0].dstSet = descriptorSet;
            writes[0].data.descriptorType = VkDescriptorType.UniformBuffer;
            writes[0].dstBinding          = 0;
            writes[0].data.Set(temp);
            // Binding 1 : Color map
            writes[1]        = new VkWriteDescriptorSet();
            writes[1].sType  = WriteDescriptorSet;
            writes[1].dstSet = descriptorSet;
            writes[1].data.descriptorType = VkDescriptorType.CombinedImageSampler;
            writes[1].dstBinding          = 1;
            writes[1].data.Set(texDescriptor);

            fixed(VkWriteDescriptorSet *pointer = writes)
            {
                vkUpdateDescriptorSets(device, (UInt32)writes.Length, pointer, 0, null);
            }
        }
Esempio n. 14
0
        private void UpdateUniformData(FDataBuffer <float> uniformBuffer, uint swapchainImageIndex)
        {
            VkDescriptorBufferInfo bufferInfo = new VkDescriptorBufferInfo();

            bufferInfo.buffer = uniformBuffer.Buffer;
            bufferInfo.offset = 0;
            bufferInfo.range  = (uint)uniformBuffer.Length * 4;

            VkWriteDescriptorSet[] writes = new VkWriteDescriptorSet[1];
            writes[0].dstSet          = descriptorSets[swapchainImageIndex];
            writes[0].dstBinding      = 1;
            writes[0].dstArrayElement = 0;
            writes[0].descriptorType  = VkDescriptorType.UniformBuffer;
            writes[0].descriptorCount = 1;
            writes[0].pBufferInfo     = &bufferInfo;

            fixed(VkWriteDescriptorSet *ptr = writes)
            vkUpdateDescriptorSets(device, (uint)writes.Length, ptr, 0, null);
        }
Esempio n. 15
0
        public unsafe void UpdateBuffers(List <Buffer> buffers)
        {
            if (buffers.Count != _descriptorPool.Layout.Bindings.Count)
            {
                throw new InvalidOperationException("buffers length should match descriptor layout bindings");
            }

            var descriptorSetBufferInfos = new NativeList <VkDescriptorBufferInfo>();
            var writeDescriptorSets      = new NativeList <VkWriteDescriptorSet>();

            for (int i = 0; i < _descriptorPool.Layout.Bindings.Count; i++)
            {
                var binding = _descriptorPool.Layout.Bindings[i];
                var descriptorSetBufferInfo = new VkDescriptorBufferInfo
                {
                    buffer = buffers[i].Handle,
                    offset = 0,
                    range  = buffers[i].Size
                };

                var writeDescriptorSet = new VkWriteDescriptorSet
                {
                    sType           = VkStructureType.WriteDescriptorSet,
                    dstSet          = _handle,
                    dstBinding      = binding.Index,
                    dstArrayElement = 0,
                    descriptorCount = binding.DescriptorCounts,
                    descriptorType  = binding.DescriptorType,
                    pBufferInfo     = &descriptorSetBufferInfo,
                };
                descriptorSetBufferInfos.Add(descriptorSetBufferInfo);
                writeDescriptorSets.Add(writeDescriptorSet);
            }
            VulkanNative.vkUpdateDescriptorSets(
                _device.Handle,
                writeDescriptorSets.Count,
                (VkWriteDescriptorSet *)writeDescriptorSets.Data.ToPointer(),
                0,
                null
                );
        }
Esempio n. 16
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. 17
0
        void setupDescriptorSet()
        {
            VkDescriptorSetLayout layout = this.layout;
            var allocInfo = VkDescriptorSetAllocateInfo.Alloc();

            allocInfo[0].descriptorPool = descriptorPool;
            allocInfo[0].setLayouts     = layout;
            {
                VkDescriptorSet set;
                vkAllocateDescriptorSets(device, allocInfo, &set);
                this.descriptorSet = set;
            }

            // Setup a descriptor image info for the current texture to be used as a combined image sampler
            VkDescriptorImageInfo imageInfo;

            imageInfo.imageView   = texture.view;           // The image's view (images are never directly accessed by the shader, but rather through views defining subresources)
            imageInfo.sampler     = texture.sampler;        //  The sampler (Telling the pipeline how to sample the texture, including repeat, border, etc.)
            imageInfo.imageLayout = texture.imageLayout;    //  The current layout of the image (Note: Should always fit the actual use, e.g. shader read)

            VkDescriptorBufferInfo bufferInfo = uniformBufferVS.descriptor;
            var writes = VkWriteDescriptorSet.Alloc(2);

            {
                // Binding 0 : Vertex shader uniform buffer
                writes[0].dstSet              = descriptorSet;
                writes[0].dstBinding          = 0;
                writes[0].data.descriptorType = VkDescriptorType.UniformBuffer;
                writes[0].data.Set(bufferInfo);
                // Binding 1 : Fragment shader texture sampler
                //  Fragment shader: layout (binding = 1) uniform sampler2D samplerColor;
                writes[1].dstSet              = descriptorSet;
                writes[1].dstBinding          = 1;
                writes[1].data.descriptorType = VkDescriptorType.CombinedImageSampler;
                writes[1].data.Set(imageInfo);
            }
            vkUpdateDescriptorSets(device, 2, writes, 0, null);
        }
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);
        }
        private VkDescriptorSet CreateDescriptorSet(VkDescriptorPool descriptorPool)
        {
            VkDescriptorSetLayout layout = _descriptorSetLayout;

            var allocInfo = new VkDescriptorSetAllocateInfo
            {
                sType              = VkStructureType.DescriptorSetAllocateInfo,
                pNext              = null,
                descriptorPool     = descriptorPool,
                descriptorSetCount = 1,
                pSetLayouts        = &layout
            };

            VkDescriptorSet descriptorSet;

            vkAllocateDescriptorSets(Context.Device, &allocInfo, &descriptorSet);

            VkBuffer uniformBuffer = _uniformBuffer.Buffer;
            // Update the descriptor set for the shader binding point.
            VkDescriptorBufferInfo bufferInfo1 = new VkDescriptorBufferInfo
            {
                buffer = _uniformBuffer.Buffer,
                offset = 0,
                range  = ulong.MaxValue
            };

            VkDescriptorBufferInfo bufferInfo = new VkDescriptorBufferInfo
            {
                buffer = _uniformBuffer.Buffer,
                offset = 0,
                range  = ulong.MaxValue
            };

            VkDescriptorImageInfo imageInfo = new VkDescriptorImageInfo
            {
                sampler     = _sampler,
                imageView   = _cubeTexture.View,
                imageLayout = VkImageLayout.ShaderReadOnlyOptimal
            };


            VkWriteDescriptorSet *writeDescriptorSetsPtr = stackalloc VkWriteDescriptorSet[2]
            {
                new VkWriteDescriptorSet
                {
                    sType           = VkStructureType.WriteDescriptorSet,
                    pNext           = null,
                    dstBinding      = 0,
                    descriptorCount = 1,
                    descriptorType  = VkDescriptorType.UniformBuffer,
                    pBufferInfo     = &bufferInfo,
                    dstSet          = descriptorSet
                },
                new VkWriteDescriptorSet
                {
                    sType           = VkStructureType.WriteDescriptorSet,
                    pNext           = null,
                    dstBinding      = 1,
                    descriptorCount = 1,
                    descriptorType  = VkDescriptorType.CombinedImageSampler,
                    pImageInfo      = &imageInfo,
                    dstSet          = descriptorSet,
                }
            };

            vkUpdateDescriptorSets(Context.Device, 2, writeDescriptorSetsPtr, 0, null);

            return(descriptorSet);
        }
Esempio n. 20
0
        /// <inheritdoc cref="Draw(GraphicsPrimitive)" />
        public void Draw(VulkanGraphicsPrimitive graphicsPrimitive)
        {
            ThrowIfNull(graphicsPrimitive, nameof(graphicsPrimitive));

            var graphicsCommandBuffer     = VulkanCommandBuffer;
            var graphicsPipeline          = graphicsPrimitive.VulkanGraphicsPipeline;
            var graphicsPipelineSignature = graphicsPipeline.VulkanSignature;
            var vulkanPipeline            = graphicsPipeline.VulkanPipeline;
            var vertexBuffer             = graphicsPrimitive.VulkanVertexBuffer;
            var vulkanVertexBuffer       = vertexBuffer.VulkanBuffer;
            var vulkanVertexBufferOffset = 0ul;

            vkCmdBindPipeline(graphicsCommandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, vulkanPipeline);
            vkCmdBindVertexBuffers(graphicsCommandBuffer, firstBinding: 0, bindingCount: 1, (ulong *)&vulkanVertexBuffer, &vulkanVertexBufferOffset);

            var vulkanDescriptorSet = graphicsPipelineSignature.VulkanDescriptorSet;

            if (vulkanDescriptorSet != VK_NULL_HANDLE)
            {
                var inputResources       = graphicsPrimitive.InputResources;
                var inputResourcesLength = inputResources.Length;

                for (var index = 0; index < inputResourcesLength; index++)
                {
                    var inputResource = inputResources[index];

                    VkWriteDescriptorSet writeDescriptorSet;

                    if (inputResource is VulkanGraphicsBuffer vulkanGraphicsBuffer)
                    {
                        var descriptorBufferInfo = new VkDescriptorBufferInfo {
                            buffer = vulkanGraphicsBuffer.VulkanBuffer,
                            offset = 0,
                            range  = vulkanGraphicsBuffer.Size,
                        };

                        writeDescriptorSet = new VkWriteDescriptorSet {
                            sType           = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET,
                            dstSet          = vulkanDescriptorSet,
                            dstBinding      = unchecked ((uint)index),
                            descriptorCount = 1,
                            descriptorType  = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
                            pBufferInfo     = &descriptorBufferInfo,
                        };
                    }
                    else if (inputResource is VulkanGraphicsTexture vulkanGraphicsTexture)
                    {
                        var descriptorImageInfo = new VkDescriptorImageInfo {
                            sampler     = vulkanGraphicsTexture.VulkanSampler,
                            imageView   = vulkanGraphicsTexture.VulkanImageView,
                            imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
                        };

                        writeDescriptorSet = new VkWriteDescriptorSet {
                            sType           = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET,
                            dstSet          = vulkanDescriptorSet,
                            dstBinding      = unchecked ((uint)index),
                            descriptorCount = 1,
                            descriptorType  = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
                            pImageInfo      = &descriptorImageInfo,
                        };
                    }

                    vkUpdateDescriptorSets(VulkanGraphicsDevice.VulkanDevice, 1, &writeDescriptorSet, 0, pDescriptorCopies: null);
                }

                vkCmdBindDescriptorSets(graphicsCommandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, graphicsPipelineSignature.VulkanPipelineLayout, firstSet: 0, 1, (ulong *)&vulkanDescriptorSet, dynamicOffsetCount: 0, pDynamicOffsets: null);
            }

            var indexBuffer = graphicsPrimitive.VulkanIndexBuffer;

            if (indexBuffer != null)
            {
                var indexBufferStride = indexBuffer.Stride;
                var indexType         = VK_INDEX_TYPE_UINT16;

                if (indexBufferStride != 2)
                {
                    Assert(indexBufferStride == 4, "Index Buffer has an unsupported stride.");
                    indexType = VK_INDEX_TYPE_UINT32;
                }
                vkCmdBindIndexBuffer(graphicsCommandBuffer, indexBuffer.VulkanBuffer, offset: 0, indexType);

                vkCmdDrawIndexed(graphicsCommandBuffer, indexCount: (uint)(indexBuffer.Size / indexBufferStride), instanceCount: 1, firstIndex: 0, vertexOffset: 0, firstInstance: 0);
            }
            else
            {
                vkCmdDraw(graphicsCommandBuffer, vertexCount: (uint)(vertexBuffer.Size / vertexBuffer.Stride), instanceCount: 1, firstVertex: 0, firstInstance: 0);
            }
        }
Esempio n. 21
0
        public static void Update(Device device, List <WriteDescriptorSet> writes)
        {
            if (device == null)
            {
                throw new ArgumentNullException(nameof(device));
            }

            int totalBuffers     = 0;
            int totalImages      = 0;
            int totalBufferViews = 0;

            for (int i = 0; i < writes.Count; i++)
            {
                var write = writes[i];

                if (write.bufferInfo != null)
                {
                    totalBuffers += write.bufferInfo.Count;
                }
                if (write.imageInfo != null)
                {
                    totalImages += write.imageInfo.Count;
                }
                if (write.texelBufferView != null)
                {
                    totalBufferViews += write.texelBufferView.Count;
                }
            }

            unsafe
            {
                var bufferInfos = stackalloc VkDescriptorBufferInfo[totalBuffers];
                var imageInfos  = stackalloc VkDescriptorImageInfo[totalImages];
                var bufferViews = stackalloc VkBufferView[totalBufferViews];

                int bufferIndex     = 0;
                int imageIndex      = 0;
                int bufferViewIndex = 0;

                var writesNative = stackalloc VkWriteDescriptorSet[writes.Count];

                for (int i = 0; i < writes.Count; i++)
                {
                    var mWrite = writes[i];

                    writesNative[i].sType           = VkStructureType.WriteDescriptorSet;
                    writesNative[i].dstSet          = mWrite.dstSet.Native;
                    writesNative[i].dstBinding      = mWrite.dstBinding;
                    writesNative[i].dstArrayElement = mWrite.dstArrayElement;
                    writesNative[i].descriptorType  = mWrite.descriptorType;

                    if (mWrite.bufferInfo != null)
                    {
                        writesNative[i].descriptorCount = (uint)mWrite.bufferInfo.Count;
                        writesNative[i].pBufferInfo     = (IntPtr)(&bufferInfos[bufferViewIndex]);

                        for (int j = 0; j < writesNative[i].descriptorCount; j++)
                        {
                            VkDescriptorBufferInfo bufferInfo = new VkDescriptorBufferInfo();
                            bufferInfo.buffer = mWrite.bufferInfo[j].buffer.Native;
                            bufferInfo.offset = mWrite.bufferInfo[j].offset;
                            bufferInfo.range  = mWrite.bufferInfo[j].range;

                            bufferInfos[bufferIndex] = bufferInfo;
                            bufferIndex++;
                        }
                    }
                    else if (mWrite.imageInfo != null)
                    {
                        writesNative[i].descriptorCount = (uint)mWrite.imageInfo.Count;
                        writesNative[i].pImageInfo      = (IntPtr)(&imageInfos[imageIndex]);

                        for (int j = 0; j < writesNative[i].descriptorCount; j++)
                        {
                            VkDescriptorImageInfo imageInfo = new VkDescriptorImageInfo();
                            imageInfo.sampler   = VkSampler.Null;
                            imageInfo.imageView = VkImageView.Null;

                            if (mWrite.imageInfo[j].sampler != null)
                            {
                                imageInfo.sampler = mWrite.imageInfo[j].sampler.Native;
                            }

                            if (mWrite.imageInfo[j].imageView != null)
                            {
                                imageInfo.imageView = mWrite.imageInfo[j].imageView.Native;
                            }

                            imageInfo.imageLayout = mWrite.imageInfo[j].imageLayout;

                            imageInfos[imageIndex] = imageInfo;
                            imageIndex++;
                        }
                    }
                    else if (mWrite.texelBufferView != null)
                    {
                        writesNative[i].descriptorCount  = (uint)mWrite.texelBufferView.Count;
                        writesNative[i].pTexelBufferView = (IntPtr)(&bufferViews[bufferViewIndex]);

                        for (int j = 0; j < writesNative[i].descriptorCount; j++)
                        {
                            bufferViews[j] = mWrite.texelBufferView[j].Native;
                            bufferViewIndex++;
                        }
                    }
                }

                device.Commands.updateDescriptorSets(device.Native, (uint)writes.Count, (IntPtr)writesNative, 0, IntPtr.Zero);
            }
        }
        /// <summary>
        /// ユニフォームバッファのディスクリプタの生成.
        /// </summary>
        /// <param name="destBinding"></param>
        /// <param name="uniformBuffer"></param>
        /// <param name="size"></param>
        /// <param name="descriptorSet"></param>
        /// <returns></returns>
        public static VkWriteDescriptorSet CreateDescriptorFromUniformBuffer(uint destBinding, VkDescriptorBufferInfo descUniformBufferInfo, VkDescriptorSet descriptorSet)
        {
            var descriptorUniform = new VkWriteDescriptorSet()
            {
                descriptorCount = 1,
                descriptorType  = VkDescriptorType.VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
                pBufferInfo     = new[] { descUniformBufferInfo, },
                dstBinding      = destBinding,
                dstSet          = descriptorSet
            };

            return(descriptorUniform);
        }
Esempio n. 23
0
        public void AddWriteInfo(DescriptorSet destSet, VkDescriptorSetLayoutBinding binding, VkDescriptorBufferInfo 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.pBufferInfo     = descriptor.Pin();

            WriteDescriptorSets.Add(wds);
        }