Skip to content

Commit

Permalink
Have FrameData structs for each pipeline layout, instead of multiple …
Browse files Browse the repository at this point in the history
…arrays
  • Loading branch information
hrydgard committed Oct 10, 2023
1 parent 397745c commit 2b0192d
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 28 deletions.
10 changes: 5 additions & 5 deletions Common/GPU/Vulkan/VulkanQueueRunner.cpp
Expand Up @@ -1199,7 +1199,7 @@ void VulkanQueueRunner::PerformRenderPass(const VKRStep &step, VkCommandBuffer c
// The stencil ones are very commonly mostly redundant so let's eliminate them where possible.
// Might also want to consider scissor and viewport.
VkPipeline lastPipeline = VK_NULL_HANDLE;
VKRPipelineLayout *vkrPipelineLayout = nullptr;
FastVec<PendingDescSet> *descSets = nullptr;
VkPipelineLayout pipelineLayout = VK_NULL_HANDLE;

bool pipelineOK = false;
Expand Down Expand Up @@ -1242,8 +1242,8 @@ void VulkanQueueRunner::PerformRenderPass(const VKRStep &step, VkCommandBuffer c

if (pipeline != VK_NULL_HANDLE) {
vkCmdBindPipeline(cmd, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
vkrPipelineLayout = c.pipeline.pipelineLayout;
pipelineLayout = vkrPipelineLayout->pipelineLayout;
descSets = &c.pipeline.pipelineLayout->frameData[curFrame].descSets_;
pipelineLayout = c.pipeline.pipelineLayout->pipelineLayout;
lastGraphicsPipeline = graphicsPipeline;
pipelineOK = true;
} else {
Expand Down Expand Up @@ -1338,7 +1338,7 @@ void VulkanQueueRunner::PerformRenderPass(const VKRStep &step, VkCommandBuffer c

case VKRRenderCommand::DRAW_INDEXED:
if (pipelineOK) {
VkDescriptorSet set = vkrPipelineLayout->descSets_[curFrame][c.drawIndexed.descSetIndex].set;
VkDescriptorSet set = (*descSets)[c.drawIndexed.descSetIndex].set;
vkCmdBindDescriptorSets(cmd, VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayout, 0, 1, &set, c.drawIndexed.numUboOffsets, c.drawIndexed.uboOffsets);
vkCmdBindIndexBuffer(cmd, c.drawIndexed.ibuffer, c.drawIndexed.ioffset, VK_INDEX_TYPE_UINT16);
VkDeviceSize voffset = c.drawIndexed.voffset;
Expand All @@ -1349,7 +1349,7 @@ void VulkanQueueRunner::PerformRenderPass(const VKRStep &step, VkCommandBuffer c

case VKRRenderCommand::DRAW:
if (pipelineOK) {
VkDescriptorSet set = vkrPipelineLayout->descSets_[curFrame][c.drawIndexed.descSetIndex].set;
VkDescriptorSet set = (*descSets)[c.drawIndexed.descSetIndex].set;
_dbg_assert_(set != VK_NULL_HANDLE);
vkCmdBindDescriptorSets(cmd, VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayout, 0, 1, &set, c.draw.numUboOffsets, c.draw.uboOffsets);
if (c.draw.vbuffer) {
Expand Down
26 changes: 15 additions & 11 deletions Common/GPU/Vulkan/VulkanRenderManager.cpp
Expand Up @@ -1647,8 +1647,8 @@ VKRPipelineLayout *VulkanRenderManager::CreatePipelineLayout(BindingType *bindin
vulkan_->SetDebugName(layout->pipelineLayout, VK_OBJECT_TYPE_PIPELINE_LAYOUT, tag);

for (int i = 0; i < VulkanContext::MAX_INFLIGHT_FRAMES; i++) {
layout->descPools[i].Create(vulkan_, bindingTypes, (uint32_t)bindingTypesCount, 512);
layout->descPools[i].Setup([]() {});
layout->frameData[i].pool.Create(vulkan_, bindingTypes, (uint32_t)bindingTypesCount, 512);
layout->frameData[i].pool.Setup([]() {});
}

pipelineLayouts_.push_back(layout);
Expand All @@ -1657,7 +1657,7 @@ VKRPipelineLayout *VulkanRenderManager::CreatePipelineLayout(BindingType *bindin

void VulkanRenderManager::DestroyPipelineLayout(VKRPipelineLayout *layout) {
for (int i = 0; i < VulkanContext::MAX_INFLIGHT_FRAMES; i++) {
layout->descPools[i].Destroy();
layout->frameData[i].pool.Destroy();
}

vulkan_->Delete().QueueDeletePipelineLayout(layout->pipelineLayout);
Expand All @@ -1678,18 +1678,22 @@ void VulkanRenderManager::FlushDescriptors(int frame) {

void VulkanRenderManager::ResetDescriptorLists(int frame) {
for (auto iter : pipelineLayouts_) {
iter->flushedDescriptors_[frame] = 0;
iter->descSets_[frame].clear();
iter->descData_[frame].clear();
VKRPipelineLayout::FrameData &data = iter->frameData[frame];

data.flushedDescriptors_ = 0;
data.descSets_.clear();
data.descData_.clear();
}
}

void VKRPipelineLayout::FlushDescSets(VulkanContext *vulkan, int frame, QueueProfileContext *profile) {
_dbg_assert_(frame < VulkanContext::MAX_INFLIGHT_FRAMES);

VulkanDescSetPool &pool = descPools[frame];
FastVec<PackedDescriptor> &descData = descData_[frame];
FastVec<PendingDescSet> &descSets = descSets_[frame];
FrameData &data = frameData[frame];

VulkanDescSetPool &pool = data.pool;
FastVec<PackedDescriptor> &descData = data.descData_;
FastVec<PendingDescSet> &descSets = data.descSets_;

pool.Reset();

Expand All @@ -1702,7 +1706,7 @@ void VKRPipelineLayout::FlushDescSets(VulkanContext *vulkan, int frame, QueuePro
VkDescriptorImageInfo imageInfo[MAX_DESC_SET_BINDINGS]; // just picked a practical number
VkDescriptorBufferInfo bufferInfo[MAX_DESC_SET_BINDINGS];

size_t start = flushedDescriptors_[frame];
size_t start = data.flushedDescriptors_;
int writeCount = 0;

for (size_t index = start; index < descSets.size(); index++) {
Expand Down Expand Up @@ -1788,6 +1792,6 @@ void VKRPipelineLayout::FlushDescSets(VulkanContext *vulkan, int frame, QueuePro
writeCount++;
}

flushedDescriptors_[frame] = (int)descSets.size();
data.flushedDescriptors_ = (int)descSets.size();
profile->descriptorsWritten += writeCount;
}
28 changes: 16 additions & 12 deletions Common/GPU/Vulkan/VulkanRenderManager.h
Expand Up @@ -213,7 +213,7 @@ struct VKRPipelineLayout {
VKRPipelineLayout() {}
~VKRPipelineLayout() {
_assert_(!pipelineLayout && !descriptorSetLayout);
_assert_(descPools[0].IsDestroyed());
_assert_(frameData[0].pool.IsDestroyed());
}
enum { MAX_DESC_SET_BINDINGS = 10 };
BindingType bindingTypes[MAX_DESC_SET_BINDINGS];
Expand All @@ -224,14 +224,16 @@ struct VKRPipelineLayout {
int pushConstSize = 0;
const char *tag = nullptr;

// The pipeline layout owns the descriptor set pools. Don't go create excessive layouts.
VulkanDescSetPool descPools[VulkanContext::MAX_INFLIGHT_FRAMES];
struct FrameData {
VulkanDescSetPool pool;
FastVec<PackedDescriptor> descData_;
FastVec<PendingDescSet> descSets_;
// TODO: We should be able to get away with a single descData_/descSets_ and then send it along,
// but it's easier to just segregate by frame id.
int flushedDescriptors_ = 0;
};

// TODO: We should be able to get away with a single descData_/descSets_ and then send it along,
// but it's easier to just segregate by frame id.
FastVec<PackedDescriptor> descData_[VulkanContext::MAX_INFLIGHT_FRAMES];
FastVec<PendingDescSet> descSets_[VulkanContext::MAX_INFLIGHT_FRAMES];
int flushedDescriptors_[VulkanContext::MAX_INFLIGHT_FRAMES]{};
FrameData frameData[VulkanContext::MAX_INFLIGHT_FRAMES];

void FlushDescSets(VulkanContext *vulkan, int frame, QueueProfileContext *profile);
};
Expand Down Expand Up @@ -459,11 +461,13 @@ class VulkanRenderManager {

int curFrame = vulkan_->GetCurFrame();

size_t offset = curPipelineLayout_->descData_[curFrame].size();
curPipelineLayout_->descData_[curFrame].extend(desc, count);
VKRPipelineLayout::FrameData &data = curPipelineLayout_->frameData[curFrame];

size_t offset = data.descData_.size();
data.descData_.extend(desc, count);

int setIndex = (int)curPipelineLayout_->descSets_[curFrame].size();
PendingDescSet &descSet = curPipelineLayout_->descSets_[curFrame].push_uninitialized();
int setIndex = (int)data.descSets_.size();
PendingDescSet &descSet = data.descSets_.push_uninitialized();
descSet.offset = (uint32_t)offset;
descSet.count = count;
// descSet.set = VK_NULL_HANDLE; // to be filled in
Expand Down

0 comments on commit 2b0192d

Please sign in to comment.