54 auto logicalDevice = mRenderer->GetLogicalDevice();
56 vkDestroyDescriptorPool(logicalDevice, mDescriptorPool,
nullptr);
60 vkDestroyBuffer(logicalDevice, mTransformationBuffers[i],
nullptr);
61 vkFreeMemory(logicalDevice, mTransformationBuffersMemory[i],
nullptr);
63 if (!mMaterialParametersBuffers.empty())
65 vkDestroyBuffer(logicalDevice, mMaterialParametersBuffers[i],
nullptr);
66 vkFreeMemory(logicalDevice, mMaterialParametersMemory[i],
nullptr);
103 VkDeviceSize transformationBufferSize;
118 mRenderer->CreateBuffer(transformationBufferSize, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT,
119 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT,
120 mTransformationBuffers[i], mTransformationBuffersMemory[i]);
123 auto materialParameters = mMaterial->PackMaterialParameters();
124 if (materialParameters.buffer.empty())
129 VkDeviceSize matVarBufferSize = materialParameters.buffer.size();
135 mRenderer->CreateBuffer(matVarBufferSize, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT,
136 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT,
137 mMaterialParametersBuffers[i], mMaterialParametersMemory[i]);
144 std::vector<VkDescriptorPoolSize> poolSizes;
146 VkDescriptorPoolSize tranformationPool;
147 tranformationPool.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
148 tranformationPool.descriptorCount = maxFramesInFlight;
150 poolSizes.push_back(tranformationPool);
152 auto materialParameters = mMaterial->PackMaterialParameters();
153 if (!materialParameters.buffer.empty())
155 VkDescriptorPoolSize materialParameterPool;
156 materialParameterPool.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
157 materialParameterPool.descriptorCount = maxFramesInFlight;
159 poolSizes.push_back(materialParameterPool);
162 for (
const auto& texture : mMaterial->GetTextures())
165 VkDescriptorPoolSize textureSamplerPool;
166 textureSamplerPool.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
167 textureSamplerPool.descriptorCount = maxFramesInFlight;
169 poolSizes.push_back(textureSamplerPool);
172 VkDescriptorPoolCreateInfo poolInfo{};
173 poolInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
174 poolInfo.poolSizeCount =
static_cast<uint32_t
>(poolSizes.size());
175 poolInfo.pPoolSizes = poolSizes.data();
176 poolInfo.maxSets = maxFramesInFlight;
178 if (vkCreateDescriptorPool(mRenderer->GetLogicalDevice(), &poolInfo,
nullptr, &mDescriptorPool) != VK_SUCCESS)
180 throw std::runtime_error(
"failed to create descriptor pool!");
197 std::vector<VkDescriptorSetLayout> layouts(maxFramesInFlight, descriptorSetLayout);
198 VkDescriptorSetAllocateInfo allocInfo{};
199 allocInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
200 allocInfo.descriptorPool = mDescriptorPool;
201 allocInfo.descriptorSetCount = maxFramesInFlight;
202 allocInfo.pSetLayouts = layouts.data();
205 VkResult result = vkAllocateDescriptorSets(mRenderer->GetLogicalDevice(), &allocInfo, mDescriptorSets.data());
206 if (result != VK_SUCCESS)
208 throw std::runtime_error(
"failed to allocate descriptor sets! Error: " + std::to_string(result));
213 unsigned int dstBinding = 0;
214 std::vector<VkWriteDescriptorSet> descriptorWrites;
217 VkDescriptorBufferInfo transformationBufferInfo{};
218 transformationBufferInfo.buffer = mTransformationBuffers[i];
219 transformationBufferInfo.offset = 0;
228 VkWriteDescriptorSet transformationsDescSet;
229 transformationsDescSet.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
230 transformationsDescSet.pNext =
nullptr;
231 transformationsDescSet.dstSet = mDescriptorSets[i];
232 transformationsDescSet.dstBinding = dstBinding;
233 transformationsDescSet.dstArrayElement = 0;
234 transformationsDescSet.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
235 transformationsDescSet.descriptorCount = 1;
236 transformationsDescSet.pBufferInfo = &transformationBufferInfo;
237 descriptorWrites.push_back(transformationsDescSet);
240 auto materialParameters = mMaterial->PackMaterialParameters();
241 if (!materialParameters.buffer.empty())
244 VkDescriptorBufferInfo matVarBufferInfo{};
245 matVarBufferInfo.buffer = mMaterialParametersBuffers[i];
246 matVarBufferInfo.offset = 0;
247 matVarBufferInfo.range = materialParameters.buffer.size();
249 VkWriteDescriptorSet matVarDescSet;
250 matVarDescSet.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
251 matVarDescSet.pNext =
nullptr;
252 matVarDescSet.dstSet = mDescriptorSets[i];
253 matVarDescSet.dstBinding = dstBinding;
254 matVarDescSet.dstArrayElement = 0;
255 matVarDescSet.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
256 matVarDescSet.descriptorCount = 1;
257 matVarDescSet.pBufferInfo = &matVarBufferInfo;
258 descriptorWrites.push_back(matVarDescSet);
262 for (
const auto& texture : mMaterial->GetTextures())
265 auto imageData = mTextureCache->GetTextureResources(texture);
267 VkDescriptorImageInfo imageInfo{};
268 imageInfo.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
272 VkWriteDescriptorSet imageDescSet;
273 imageDescSet.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
274 imageDescSet.pNext =
nullptr;
275 imageDescSet.dstSet = mDescriptorSets[i];
276 imageDescSet.dstBinding = dstBinding;
277 imageDescSet.dstArrayElement = 0;
278 imageDescSet.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
279 imageDescSet.descriptorCount = 1;
280 imageDescSet.pImageInfo = &imageInfo;
282 descriptorWrites.push_back(imageDescSet);
285 vkUpdateDescriptorSets(mRenderer->GetLogicalDevice(),
static_cast<uint32_t
>(descriptorWrites.size()), descriptorWrites.data(), 0,
nullptr);
332 auto commandBuffers = mRenderer->GetComandBuffers();
333 auto frame = mRenderer->GetCurrentFrame();
335 VkBuffer vertexBuffer[] = { mVertexBuffer };
336 VkDeviceSize offsets[] = { 0 };
338 vkCmdBindPipeline(commandBuffers[frame], VK_PIPELINE_BIND_POINT_GRAPHICS, mGraphicsPipeline);
355 vkCmdBindVertexBuffers(commandBuffers[frame], 0, 1, vertexBuffer, offsets);
356 vkCmdBindIndexBuffer(commandBuffers[frame], mIndexBuffer, 0, VK_INDEX_TYPE_UINT32);
357 vkCmdBindDescriptorSets(commandBuffers[frame], VK_PIPELINE_BIND_POINT_GRAPHICS,
358 mPipelineLayout, 0, 1, &mDescriptorSets[frame], 0,
nullptr);
359 vkCmdDrawIndexed(commandBuffers[frame],
static_cast<uint32_t
>(mMeshData->GetIndices().size()), 1, 0, 0, 0);
Manages texture loading, GPU uploading, and caching for reuse.
Vulkan-specific implementation of ITextureRenderResources.
VkImageView GetVkImageView() const
Returns the Vulkan image view associated with this texture resource.
VkSampler GetVkSampler() const
Returns the Vulkan sampler associated with this texture resource.