49 mVulkanRenderer { aVulkanRenderer },
50 mMaterial { &aMaterial },
51 mUniformBuffer { mVulkanRenderer }
53 if ( mVkDescriptorPool != VK_NULL_HANDLE || mUniformDescriptorSet != VK_NULL_HANDLE || mSamplerDescriptorSet != VK_NULL_HANDLE )
55 std::cout <<
LogLevel::Error <<
"VulkanMaterial: Already initialized." << std::endl;
56 throw std::runtime_error (
"VulkanMaterial: Already initialized." );
59 std::vector<VkDescriptorPoolSize> descriptor_pool_sizes{};
60 descriptor_pool_sizes.reserve ( 2 );
62 if ( mMaterial->GetUniformBuffer().size() > 0 )
64 descriptor_pool_sizes.push_back ( {VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1} );
66 if ( mMaterial->GetSamplers().size() > 0 )
68 descriptor_pool_sizes.push_back ( {VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
static_cast<uint32_t
> ( mMaterial->GetSamplers().size() ) } );
71 if ( !descriptor_pool_sizes.empty() )
76 std::vector<VkWriteDescriptorSet> write_descriptor_sets{};
77 write_descriptor_sets.reserve ( mMaterial->GetSamplers().size() + ( ( mMaterial->GetUniformBuffer().size() ? 1 : 0 ) ) );
79 if ( mMaterial->GetUniformBuffer().size() > 0 )
81 VkDescriptorSetLayoutBinding descriptor_set_layout_binding
84 .descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
86 .stageFlags = VK_SHADER_STAGE_ALL,
87 .pImmutableSamplers =
nullptr
89 VkDescriptorSetLayoutCreateInfo descriptor_set_layout_create_info
91 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
95 .pBindings = &descriptor_set_layout_binding
98 VkDescriptorSetAllocateInfo descriptor_set_allocate_info{};
99 descriptor_set_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
100 descriptor_set_allocate_info.descriptorPool = mVkDescriptorPool;
101 descriptor_set_allocate_info.descriptorSetCount = 1;
102 descriptor_set_allocate_info.pSetLayouts = &mVulkanRenderer.GetDescriptorSetLayout ( descriptor_set_layout_create_info );
103 if ( VkResult result = vkAllocateDescriptorSets ( mVulkanRenderer.GetDevice(), &descriptor_set_allocate_info, &mUniformDescriptorSet ) )
105 std::ostringstream stream;
108 throw std::runtime_error ( stream.str().c_str() );
110 mUniformBuffer.Initialize (
111 mMaterial->GetUniformBuffer().size(),
112 VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT,
113 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT,
114 mMaterial->GetUniformBuffer().data() );
115 VkDescriptorBufferInfo descriptor_buffer_info
117 mUniformBuffer.GetBuffer(),
119 mMaterial->GetUniformBuffer().size()
121 write_descriptor_sets.emplace_back();
122 auto& write_descriptor_set = write_descriptor_sets.back();
123 write_descriptor_set.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
124 write_descriptor_set.pNext =
nullptr;
125 write_descriptor_set.dstSet = mUniformDescriptorSet;
126 write_descriptor_set.dstBinding = 0;
127 write_descriptor_set.dstArrayElement = 0;
128 write_descriptor_set.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
129 write_descriptor_set.descriptorCount = 1;
130 write_descriptor_set.pBufferInfo = &descriptor_buffer_info;
131 write_descriptor_set.pImageInfo =
nullptr;
132 write_descriptor_set.pTexelBufferView =
nullptr;
135 if ( mMaterial->GetSamplers().size() > 0 )
137 std::vector<VkDescriptorSetLayoutBinding> descriptor_set_layout_bindings{};
138 descriptor_set_layout_bindings.reserve ( mMaterial->GetSamplers().size() );
139 for ( uint32_t i = 0; i < mMaterial->GetSamplers().size(); ++i )
141 descriptor_set_layout_bindings.push_back (
142 VkDescriptorSetLayoutBinding
145 .descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
146 .descriptorCount = 1,
147 .stageFlags = VK_SHADER_STAGE_ALL,
148 .pImmutableSamplers =
nullptr
151 VkDescriptorSetLayoutCreateInfo descriptor_set_layout_create_info
153 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
156 .bindingCount =
static_cast<uint32_t
> ( descriptor_set_layout_bindings.size() ),
157 .pBindings = descriptor_set_layout_bindings.data()
160 VkDescriptorSetAllocateInfo descriptor_set_allocate_info{};
161 descriptor_set_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
162 descriptor_set_allocate_info.descriptorPool = mVkDescriptorPool;
163 descriptor_set_allocate_info.descriptorSetCount = 1;
164 descriptor_set_allocate_info.pSetLayouts = &mVulkanRenderer.GetDescriptorSetLayout ( descriptor_set_layout_create_info );
165 if ( VkResult result = vkAllocateDescriptorSets ( mVulkanRenderer.GetDevice(), &descriptor_set_allocate_info, &mSamplerDescriptorSet ) )
167 std::ostringstream stream;
170 throw std::runtime_error ( stream.str().c_str() );
173 for ( uint32_t i = 0; i < mMaterial->GetSamplers().size(); ++i )
175 write_descriptor_sets.emplace_back();
176 auto& write_descriptor_set = write_descriptor_sets.back();
177 write_descriptor_set.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
178 write_descriptor_set.pNext =
nullptr;
180 write_descriptor_set.dstSet = mSamplerDescriptorSet;
181 write_descriptor_set.dstBinding = i;
182 write_descriptor_set.dstArrayElement = 0;
183 write_descriptor_set.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
184 write_descriptor_set.descriptorCount = 1;
185 write_descriptor_set.pBufferInfo =
nullptr;
186 write_descriptor_set.pImageInfo = mVulkanRenderer.GetTextureDescriptorImageInfo ( *std::get<1> ( mMaterial->GetSamplers() [i] ).Get<
Texture>() );
187 write_descriptor_set.pTexelBufferView =
nullptr;
190 if ( !write_descriptor_sets.empty() )
192 vkUpdateDescriptorSets ( mVulkanRenderer.GetDevice(),
static_cast<uint32_t
> ( write_descriptor_sets.size() ), write_descriptor_sets.data(), 0,
nullptr );