Skip to content

Commit

Permalink
Some renaming, add a bunch of sanity debug-asserts
Browse files Browse the repository at this point in the history
  • Loading branch information
hrydgard committed Jan 30, 2024
1 parent ea180e5 commit 25a1e6a
Show file tree
Hide file tree
Showing 4 changed files with 19 additions and 12 deletions.
12 changes: 7 additions & 5 deletions Common/GPU/Vulkan/VulkanFrameData.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -169,7 +169,7 @@ VkCommandBuffer FrameData::GetInitCmd(VulkanContext *vulkan) {
return initCmd;
}

void FrameData::SubmitPending(VulkanContext *vulkan, FrameSubmitType type, FrameDataShared &sharedData) {
void FrameData::Submit(VulkanContext *vulkan, FrameSubmitType type, FrameDataShared &sharedData) {
VkCommandBuffer cmdBufs[3];
int numCmdBufs = 0;

Expand Down Expand Up @@ -200,14 +200,16 @@ void FrameData::SubmitPending(VulkanContext *vulkan, FrameSubmitType type, Frame
hasMainCommands = false;
}

if (hasPresentCommands && type != FrameSubmitType::Pending) {
if (hasPresentCommands) {
_dbg_assert_(type == FrameSubmitType::FinishFrame);
VkResult res = vkEndCommandBuffer(presentCmd);

_assert_msg_(res == VK_SUCCESS, "vkEndCommandBuffer failed (present)! result=%s", VulkanResultToString(res));

cmdBufs[numCmdBufs++] = presentCmd;
hasPresentCommands = false;

if (type == FrameSubmitType::Present) {
if (type == FrameSubmitType::FinishFrame) {
fenceToTrigger = fence;
}
}
Expand All @@ -219,15 +221,15 @@ void FrameData::SubmitPending(VulkanContext *vulkan, FrameSubmitType type, Frame

VkSubmitInfo submit_info{ VK_STRUCTURE_TYPE_SUBMIT_INFO };
VkPipelineStageFlags waitStage[1]{ VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT };
if (type == FrameSubmitType::Present && !skipSwap) {
if (type == FrameSubmitType::FinishFrame && !skipSwap) {
_dbg_assert_(hasAcquired);
submit_info.waitSemaphoreCount = 1;
submit_info.pWaitSemaphores = &acquireSemaphore;
submit_info.pWaitDstStageMask = waitStage;
}
submit_info.commandBufferCount = (uint32_t)numCmdBufs;
submit_info.pCommandBuffers = cmdBufs;
if (type == FrameSubmitType::Present && !skipSwap) {
if (type == FrameSubmitType::FinishFrame && !skipSwap) {
submit_info.signalSemaphoreCount = 1;
submit_info.pSignalSemaphores = &renderingCompleteSemaphore;
}
Expand Down
6 changes: 3 additions & 3 deletions Common/GPU/Vulkan/VulkanFrameData.h
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ struct FrameDataShared {
enum class FrameSubmitType {
Pending,
Sync,
Present,
FinishFrame,
};

// Per-frame data, round-robin so we can overlap submission with execution of the previous frame.
Expand Down Expand Up @@ -121,8 +121,8 @@ struct FrameData {
// Generally called from the main thread, unlike most of the rest.
VkCommandBuffer GetInitCmd(VulkanContext *vulkan);

// This will only submit if we are actually recording init commands.
void SubmitPending(VulkanContext *vulkan, FrameSubmitType type, FrameDataShared &shared);
// Submits pending command buffers.
void Submit(VulkanContext *vulkan, FrameSubmitType type, FrameDataShared &shared);

private:
// Metadata for logging etc
Expand Down
2 changes: 1 addition & 1 deletion Common/GPU/Vulkan/VulkanQueueRunner.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -369,7 +369,7 @@ void VulkanQueueRunner::RunSteps(std::vector<VKRStep *> &steps, int curFrame, Fr
if (emitLabels) {
vkCmdEndDebugUtilsLabelEXT(cmd);
}
frameData.SubmitPending(vulkan_, FrameSubmitType::Pending, frameDataShared);
frameData.Submit(vulkan_, FrameSubmitType::Pending, frameDataShared);

// When stepping in the GE debugger, we can end up here multiple times in a "frame".
// So only acquire once.
Expand Down
11 changes: 8 additions & 3 deletions Common/GPU/Vulkan/VulkanRenderManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -952,6 +952,11 @@ void VulkanRenderManager::BindFramebufferAsRenderTarget(VKRFramebuffer *fb, VKRR
EndCurRenderStep();
}

// Sanity check that we don't have binds to the backbuffer before binds to other buffers. It must always be bound last.
if (steps_.size() >= 1 && steps_.back()->stepType == VKRStepType::RENDER && steps_.back()->render.framebuffer == nullptr && fb != nullptr) {
_dbg_assert_(false);
}

// Older Mali drivers have issues with depth and stencil don't match load/clear/etc.
// TODO: Determine which versions and do this only where necessary.
u32 lateClearMask = 0;
Expand Down Expand Up @@ -1470,7 +1475,7 @@ void VulkanRenderManager::Run(VKRRenderThreadTask &task) {
if (!frameTimeHistory_[frameData.frameId].firstSubmit) {
frameTimeHistory_[frameData.frameId].firstSubmit = time_now_d();
}
frameData.SubmitPending(vulkan_, FrameSubmitType::Pending, frameDataShared_);
frameData.Submit(vulkan_, FrameSubmitType::Pending, frameDataShared_);

// Flush descriptors.
double descStart = time_now_d();
Expand Down Expand Up @@ -1507,12 +1512,12 @@ void VulkanRenderManager::Run(VKRRenderThreadTask &task) {

switch (task.runType) {
case VKRRunType::SUBMIT:
frameData.SubmitPending(vulkan_, FrameSubmitType::Present, frameDataShared_);
frameData.Submit(vulkan_, FrameSubmitType::FinishFrame, frameDataShared_);
break;

case VKRRunType::SYNC:
// The submit will trigger the readbackFence, and also do the wait for it.
frameData.SubmitPending(vulkan_, FrameSubmitType::Sync, frameDataShared_);
frameData.Submit(vulkan_, FrameSubmitType::Sync, frameDataShared_);

if (useRenderThread_) {
std::unique_lock<std::mutex> lock(syncMutex_);
Expand Down

0 comments on commit 25a1e6a

Please sign in to comment.