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); }
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); }
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)); }
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); } }
/// <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); }
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); }
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); }
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); }
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)); }
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); }
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 {
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; } }
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);
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); }
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(); } } }
public DescriptorSetWrites(DescriptorSet destSet, VkDescriptorSetLayoutBinding binding) { AddWriteInfo(destSet, binding); }
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; } } }
internal DescriptorData(VkDescriptorSetLayoutBinding b) { Type = b.DescriptorType; Count = b.DescriptorCount; Stages = b.StageFlags; }