static void WriteDescriptorTables(alloc* Scratch) { uint8_t* ScratchMark = Scratch->at; #define MAX_DESCRIPTOR_UPDATES_PER_FRAME 128 VkWriteDescriptorSet* descriptorUpdates = PUSH_ALLOC(Scratch, VkWriteDescriptorSet, MAX_DESCRIPTOR_UPDATES_PER_FRAME); uint32_t descriptorUpdatesCount = 0; VkDescriptorImageInfo* descriptorImageInfos = PUSH_ALLOC(Scratch, VkDescriptorImageInfo, MAX_DESCRIPTOR_UPDATES_PER_FRAME); uint32_t descriptorImageInfosCount = 0; VkDescriptorBufferInfo* descriptorBufferInfos = PUSH_ALLOC(Scratch, VkDescriptorBufferInfo, MAX_DESCRIPTOR_UPDATES_PER_FRAME); uint32_t descriptorBufferInfosCount = 0; { // TEXTURES for (uint32_t i = 0; i < rhi->limits.SampledTextureViewsCount; ++i) { rhi_texture_view_data* View = &rhi->SampledTextureViews[i]; if (!(View->Flags & VulkanFlag_Used)) continue; if (!(View->Flags & VulkanFlag_DescriptorWritten)) { ASSERT(descriptorBufferInfosCount < MAX_DESCRIPTOR_UPDATES_PER_FRAME); VkWriteDescriptorSet* descriptorWrite = &descriptorUpdates[descriptorUpdatesCount++]; descriptorWrite->sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; descriptorWrite->dstSet = rhi->texturesDescriptorTable.set; descriptorWrite->dstBinding = 0; descriptorWrite->dstArrayElement = i; descriptorWrite->descriptorCount = 1; descriptorWrite->descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE; ASSERT(descriptorImageInfosCount < MAX_DESCRIPTOR_UPDATES_PER_FRAME); VkDescriptorImageInfo* imageInfo = &descriptorImageInfos[descriptorImageInfosCount++]; descriptorWrite->pImageInfo = imageInfo; imageInfo->imageView = View->imageView; rhi_texture_data* Texture = (rhi_texture_data*)View->texture; imageInfo->imageLayout = Texture->layout; View->Flags |= VulkanFlag_DescriptorWritten; continue; } } } { // SAMPLERS for (uint32_t i = 0; i < rhi->limits.SamplersCount; ++i) { rhi_sampler_data* Sampler = &rhi->Samplers[i]; if (!(Sampler->Flags & VulkanFlag_Used)) continue; if (!(Sampler->Flags & VulkanFlag_DescriptorWritten)) { ASSERT(descriptorBufferInfosCount < MAX_DESCRIPTOR_UPDATES_PER_FRAME); VkWriteDescriptorSet* descriptorWrite = &descriptorUpdates[descriptorUpdatesCount++]; descriptorWrite->sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; descriptorWrite->dstSet = rhi->SamplersDescriptorTable.set; descriptorWrite->dstBinding = 0; descriptorWrite->dstArrayElement = i; descriptorWrite->descriptorCount = 1; descriptorWrite->descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER; ASSERT(descriptorImageInfosCount < MAX_DESCRIPTOR_UPDATES_PER_FRAME); VkDescriptorImageInfo* imageInfo = &descriptorImageInfos[descriptorImageInfosCount++]; descriptorWrite->pImageInfo = imageInfo; imageInfo->sampler = Sampler->sampler; Sampler->Flags |= VulkanFlag_DescriptorWritten; continue; } } } vkUpdateDescriptorSets(rhi->dev, descriptorUpdatesCount, descriptorUpdates, 0, nullptr); Scratch->at = ScratchMark; }