Skip to content

Commit 92170b6

Browse files
committed
Fix incorrect synchronisation of command buffers, and associated resources, as semaphores/fences should be on the current frame index, not the swap buffer image index.
1 parent c8c79bc commit 92170b6

12 files changed

+34
-34
lines changed

src/RayTracer.cpp

+3-3
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ void RayTracer::DrawFrame()
141141
Application::DrawFrame();
142142
}
143143

144-
void RayTracer::Render(VkCommandBuffer commandBuffer, const uint32_t imageIndex)
144+
void RayTracer::Render(VkCommandBuffer commandBuffer, const size_t currentFrame, const uint32_t imageIndex)
145145
{
146146
// Record delta time between calls to Render.
147147
const auto prevTime = time_;
@@ -156,8 +156,8 @@ void RayTracer::Render(VkCommandBuffer commandBuffer, const uint32_t imageIndex)
156156

157157
// Render the scene
158158
userSettings_.IsRayTraced
159-
? Vulkan::RayTracing::Application::Render(commandBuffer, imageIndex)
160-
: Vulkan::Application::Render(commandBuffer, imageIndex);
159+
? Vulkan::RayTracing::Application::Render(commandBuffer, currentFrame, imageIndex)
160+
: Vulkan::Application::Render(commandBuffer, currentFrame, imageIndex);
161161

162162
// Render the UI
163163
Statistics stats = {};

src/RayTracer.hpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ class RayTracer final : public Vulkan::RayTracing::Application
2929
void CreateSwapChain() override;
3030
void DeleteSwapChain() override;
3131
void DrawFrame() override;
32-
void Render(VkCommandBuffer commandBuffer, uint32_t imageIndex) override;
32+
void Render(VkCommandBuffer commandBuffer, size_t currentFrame, uint32_t imageIndex) override;
3333

3434
void OnKey(int key, int scancode, int action, int mods) override;
3535
void OnCursorPosition(double xpos, double ypos) override;

src/Vulkan/Application.cpp

+9-9
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,7 @@ void Application::DeleteSwapChain()
161161

162162
void Application::DrawFrame()
163163
{
164-
const auto noTimeout = std::numeric_limits<uint64_t>::max();
164+
constexpr auto noTimeout = std::numeric_limits<uint64_t>::max();
165165

166166
auto& inFlightFence = inFlightFences_[currentFrame_];
167167
const auto imageAvailableSemaphore = imageAvailableSemaphores_[currentFrame_].Handle();
@@ -183,11 +183,11 @@ void Application::DrawFrame()
183183
Throw(std::runtime_error(std::string("failed to acquire next image (") + ToString(result) + ")"));
184184
}
185185

186-
const auto commandBuffer = commandBuffers_->Begin(imageIndex);
187-
Render(commandBuffer, imageIndex);
188-
commandBuffers_->End(imageIndex);
186+
const auto commandBuffer = commandBuffers_->Begin(currentFrame_);
187+
Render(commandBuffer, currentFrame_, imageIndex);
188+
commandBuffers_->End(currentFrame_);
189189

190-
UpdateUniformBuffer(imageIndex);
190+
UpdateUniformBuffer();
191191

192192
VkSubmitInfo submitInfo = {};
193193
submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
@@ -236,7 +236,7 @@ void Application::DrawFrame()
236236
currentFrame_ = (currentFrame_ + 1) % inFlightFences_.size();
237237
}
238238

239-
void Application::Render(VkCommandBuffer commandBuffer, const uint32_t imageIndex)
239+
void Application::Render(VkCommandBuffer commandBuffer, const size_t currentFrame, const uint32_t imageIndex)
240240
{
241241
std::array<VkClearValue, 2> clearValues = {};
242242
clearValues[0].color = { {0.0f, 0.0f, 0.0f, 1.0f} };
@@ -255,7 +255,7 @@ void Application::Render(VkCommandBuffer commandBuffer, const uint32_t imageInde
255255
{
256256
const auto& scene = GetScene();
257257

258-
VkDescriptorSet descriptorSets[] = { graphicsPipeline_->DescriptorSet(imageIndex) };
258+
VkDescriptorSet descriptorSets[] = { graphicsPipeline_->DescriptorSet(currentFrame) };
259259
VkBuffer vertexBuffers[] = { scene.VertexBuffer().Handle() };
260260
const VkBuffer indexBuffer = scene.IndexBuffer().Handle();
261261
VkDeviceSize offsets[] = { 0 };
@@ -282,9 +282,9 @@ void Application::Render(VkCommandBuffer commandBuffer, const uint32_t imageInde
282282
vkCmdEndRenderPass(commandBuffer);
283283
}
284284

285-
void Application::UpdateUniformBuffer(const uint32_t imageIndex)
285+
void Application::UpdateUniformBuffer()
286286
{
287-
uniformBuffers_[imageIndex].SetValue(GetUniformBufferObject(swapChain_->Extent()));
287+
uniformBuffers_[currentFrame_].SetValue(GetUniformBufferObject(swapChain_->Extent()));
288288
}
289289

290290
void Application::RecreateSwapChain()

src/Vulkan/Application.hpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ namespace Vulkan
5959
virtual void CreateSwapChain();
6060
virtual void DeleteSwapChain();
6161
virtual void DrawFrame();
62-
virtual void Render(VkCommandBuffer commandBuffer, uint32_t imageIndex);
62+
virtual void Render(VkCommandBuffer commandBuffer, size_t currentFrame, uint32_t imageIndex);
6363

6464
virtual void OnKey(int key, int scancode, int action, int mods) { }
6565
virtual void OnCursorPosition(double xpos, double ypos) { }
@@ -70,7 +70,7 @@ namespace Vulkan
7070

7171
private:
7272

73-
void UpdateUniformBuffer(uint32_t imageIndex);
73+
void UpdateUniformBuffer();
7474
void RecreateSwapChain();
7575

7676
const VkPresentModeKHR presentMode_;

src/Vulkan/DescriptorSets.cpp

+5-5
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ DescriptorSets::~DescriptorSets()
4444
//}
4545
}
4646

47-
VkWriteDescriptorSet DescriptorSets::Bind(const uint32_t index, const uint32_t binding, const VkDescriptorBufferInfo& bufferInfo, const uint32_t count) const
47+
VkWriteDescriptorSet DescriptorSets::Bind(const size_t index, const uint32_t binding, const VkDescriptorBufferInfo& bufferInfo, const uint32_t count) const
4848
{
4949
VkWriteDescriptorSet descriptorWrite = {};
5050
descriptorWrite.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
@@ -58,7 +58,7 @@ VkWriteDescriptorSet DescriptorSets::Bind(const uint32_t index, const uint32_t b
5858
return descriptorWrite;
5959
}
6060

61-
VkWriteDescriptorSet DescriptorSets::Bind(const uint32_t index, const uint32_t binding, const VkDescriptorImageInfo& imageInfo, const uint32_t count) const
61+
VkWriteDescriptorSet DescriptorSets::Bind(const size_t index, const uint32_t binding, const VkDescriptorImageInfo& imageInfo, const uint32_t count) const
6262
{
6363
VkWriteDescriptorSet descriptorWrite = {};
6464
descriptorWrite.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
@@ -72,7 +72,7 @@ VkWriteDescriptorSet DescriptorSets::Bind(const uint32_t index, const uint32_t b
7272
return descriptorWrite;
7373
}
7474

75-
VkWriteDescriptorSet DescriptorSets::Bind(uint32_t index, uint32_t binding, const VkWriteDescriptorSetAccelerationStructureKHR& structureInfo, const uint32_t count) const
75+
VkWriteDescriptorSet DescriptorSets::Bind(const size_t index, const uint32_t binding, const VkWriteDescriptorSetAccelerationStructureKHR& structureInfo, const uint32_t count) const
7676
{
7777
VkWriteDescriptorSet descriptorWrite = {};
7878
descriptorWrite.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
@@ -86,15 +86,15 @@ VkWriteDescriptorSet DescriptorSets::Bind(uint32_t index, uint32_t binding, cons
8686
return descriptorWrite;
8787
}
8888

89-
void DescriptorSets::UpdateDescriptors(uint32_t index, const std::vector<VkWriteDescriptorSet>& descriptorWrites)
89+
void DescriptorSets::UpdateDescriptors(const std::vector<VkWriteDescriptorSet>& descriptorWrites)
9090
{
9191
vkUpdateDescriptorSets(
9292
descriptorPool_.Device().Handle(),
9393
static_cast<uint32_t>(descriptorWrites.size()),
9494
descriptorWrites.data(), 0, nullptr);
9595
}
9696

97-
VkDescriptorType DescriptorSets::GetBindingType(uint32_t binding) const
97+
VkDescriptorType DescriptorSets::GetBindingType(const uint32_t binding) const
9898
{
9999
const auto it = bindingTypes_.find(binding);
100100
if (it == bindingTypes_.end())

src/Vulkan/DescriptorSets.hpp

+5-5
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,13 @@ namespace Vulkan
2525

2626
~DescriptorSets();
2727

28-
VkDescriptorSet Handle(uint32_t index) const { return descriptorSets_[index]; }
28+
VkDescriptorSet Handle(size_t index) const { return descriptorSets_[index]; }
2929

30-
VkWriteDescriptorSet Bind(uint32_t index, uint32_t binding, const VkDescriptorBufferInfo& bufferInfo, uint32_t count = 1) const;
31-
VkWriteDescriptorSet Bind(uint32_t index, uint32_t binding, const VkDescriptorImageInfo& imageInfo, uint32_t count = 1) const;
32-
VkWriteDescriptorSet Bind(uint32_t index, uint32_t binding, const VkWriteDescriptorSetAccelerationStructureKHR& structureInfo, uint32_t count = 1) const;
30+
VkWriteDescriptorSet Bind(size_t index, uint32_t binding, const VkDescriptorBufferInfo& bufferInfo, uint32_t count = 1) const;
31+
VkWriteDescriptorSet Bind(size_t index, uint32_t binding, const VkDescriptorImageInfo& imageInfo, uint32_t count = 1) const;
32+
VkWriteDescriptorSet Bind(size_t index, uint32_t binding, const VkWriteDescriptorSetAccelerationStructureKHR& structureInfo, uint32_t count = 1) const;
3333

34-
void UpdateDescriptors(uint32_t index, const std::vector<VkWriteDescriptorSet>& descriptorWrites);
34+
void UpdateDescriptors(const std::vector<VkWriteDescriptorSet>& descriptorWrites);
3535

3636
private:
3737

src/Vulkan/GraphicsPipeline.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ GraphicsPipeline::GraphicsPipeline(
155155
descriptorSets.Bind(i, 2, *imageInfos.data(), static_cast<uint32_t>(imageInfos.size()))
156156
};
157157

158-
descriptorSets.UpdateDescriptors(i, descriptorWrites);
158+
descriptorSets.UpdateDescriptors(descriptorWrites);
159159
}
160160

161161
// Create pipeline layout and render pass.
@@ -208,7 +208,7 @@ GraphicsPipeline::~GraphicsPipeline()
208208
descriptorSetManager_.reset();
209209
}
210210

211-
VkDescriptorSet GraphicsPipeline::DescriptorSet(const uint32_t index) const
211+
VkDescriptorSet GraphicsPipeline::DescriptorSet(const size_t index) const
212212
{
213213
return descriptorSetManager_->DescriptorSets().Handle(index);
214214
}

src/Vulkan/GraphicsPipeline.hpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ namespace Vulkan
3131
bool isWireFrame);
3232
~GraphicsPipeline();
3333

34-
VkDescriptorSet DescriptorSet(uint32_t index) const;
34+
VkDescriptorSet DescriptorSet(size_t index) const;
3535
bool IsWireFrame() const { return isWireFrame_; }
3636
const class PipelineLayout& PipelineLayout() const { return *pipelineLayout_; }
3737
const class RenderPass& RenderPass() const { return *renderPass_; }

src/Vulkan/RayTracing/Application.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -166,11 +166,11 @@ void Application::DeleteSwapChain()
166166
Vulkan::Application::DeleteSwapChain();
167167
}
168168

169-
void Application::Render(VkCommandBuffer commandBuffer, const uint32_t imageIndex)
169+
void Application::Render(VkCommandBuffer commandBuffer, const size_t currentFrame, const uint32_t imageIndex)
170170
{
171171
const auto extent = SwapChain().Extent();
172172

173-
VkDescriptorSet descriptorSets[] = { rayTracingPipeline_->DescriptorSet(imageIndex) };
173+
VkDescriptorSet descriptorSets[] = { rayTracingPipeline_->DescriptorSet(currentFrame) };
174174

175175
VkImageSubresourceRange subresourceRange = {};
176176
subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;

src/Vulkan/RayTracing/Application.hpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ namespace Vulkan::RayTracing
3535
void DeleteAccelerationStructures();
3636
void CreateSwapChain() override;
3737
void DeleteSwapChain() override;
38-
void Render(VkCommandBuffer commandBuffer, uint32_t imageIndex) override;
38+
void Render(VkCommandBuffer commandBuffer, size_t currentFrame, uint32_t imageIndex) override;
3939

4040
private:
4141

src/Vulkan/RayTracing/RayTracingPipeline.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ RayTracingPipeline::RayTracingPipeline(
137137
descriptorWrites.push_back(descriptorSets.Bind(i, 9, proceduralBufferInfo));
138138
}
139139

140-
descriptorSets.UpdateDescriptors(i, descriptorWrites);
140+
descriptorSets.UpdateDescriptors(descriptorWrites);
141141
}
142142

143143
pipelineLayout_.reset(new class PipelineLayout(device, descriptorSetManager_->DescriptorSetLayout()));
@@ -237,7 +237,7 @@ RayTracingPipeline::~RayTracingPipeline()
237237
descriptorSetManager_.reset();
238238
}
239239

240-
VkDescriptorSet RayTracingPipeline::DescriptorSet(const uint32_t index) const
240+
VkDescriptorSet RayTracingPipeline::DescriptorSet(const size_t index) const
241241
{
242242
return descriptorSetManager_->DescriptorSets().Handle(index);
243243
}

src/Vulkan/RayTracing/RayTracingPipeline.hpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ namespace Vulkan::RayTracing
4444
uint32_t TriangleHitGroupIndex() const { return triangleHitGroupIndex_; }
4545
uint32_t ProceduralHitGroupIndex() const { return proceduralHitGroupIndex_; }
4646

47-
VkDescriptorSet DescriptorSet(uint32_t index) const;
47+
VkDescriptorSet DescriptorSet(size_t index) const;
4848
const class PipelineLayout& PipelineLayout() const { return *pipelineLayout_; }
4949

5050
private:

0 commit comments

Comments
 (0)