Skip to content

Commit

Permalink
Don't use the present time extensions (but keep the code around for f…
Browse files Browse the repository at this point in the history
…uture experiments)

Seen some suspicious crashes on Poco F1.
  • Loading branch information
hrydgard committed Aug 30, 2023
1 parent 86b37dc commit 6485240
Show file tree
Hide file tree
Showing 4 changed files with 21 additions and 15 deletions.
22 changes: 13 additions & 9 deletions Common/GPU/Vulkan/VulkanFrameData.cpp
Expand Up @@ -116,14 +116,17 @@ VkResult FrameData::QueuePresent(VulkanContext *vulkan, FrameDataShared &shared)

uint64_t frameId = this->frameId;
VkPresentTimeGOOGLE presentTimeGOOGLE{ (uint32_t)frameId, 0 }; // it's ok to truncate this. it'll wrap around and work (if we ever reach 4 billion frames..)
if (vulkan->Extensions().KHR_present_id && vulkan->GetDeviceFeatures().enabled.presentId.presentId) {
presentID.pPresentIds = &frameId;
presentID.swapchainCount = 1;
present.pNext = &presentID;
} else if (vulkan->Extensions().GOOGLE_display_timing) {
presentGOOGLE.pTimes = &presentTimeGOOGLE;
presentGOOGLE.swapchainCount = 1;
present.pNext = &presentGOOGLE;

if (shared.measurePresentTime) {
if (vulkan->Extensions().KHR_present_id && vulkan->GetDeviceFeatures().enabled.presentId.presentId) {
presentID.pPresentIds = &frameId;
presentID.swapchainCount = 1;
present.pNext = &presentID;
} else if (vulkan->Extensions().GOOGLE_display_timing) {
presentGOOGLE.pTimes = &presentTimeGOOGLE;
presentGOOGLE.swapchainCount = 1;
present.pNext = &presentGOOGLE;
}
}

return vkQueuePresentKHR(vulkan->GetGraphicsQueue(), &present);
Expand Down Expand Up @@ -245,7 +248,7 @@ void FrameData::SubmitPending(VulkanContext *vulkan, FrameSubmitType type, Frame
}
}

void FrameDataShared::Init(VulkanContext *vulkan, bool useMultiThreading) {
void FrameDataShared::Init(VulkanContext *vulkan, bool useMultiThreading, bool measurePresentTime) {
VkSemaphoreCreateInfo semaphoreCreateInfo = { VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO };
semaphoreCreateInfo.flags = 0;
VkResult res = vkCreateSemaphore(vulkan->GetDevice(), &semaphoreCreateInfo, nullptr, &acquireSemaphore);
Expand All @@ -258,6 +261,7 @@ void FrameDataShared::Init(VulkanContext *vulkan, bool useMultiThreading) {
vulkan->SetDebugName(readbackFence, VK_OBJECT_TYPE_FENCE, "readbackFence");

this->useMultiThreading = useMultiThreading;
this->measurePresentTime = measurePresentTime;
}

void FrameDataShared::Destroy(VulkanContext *vulkan) {
Expand Down
3 changes: 2 additions & 1 deletion Common/GPU/Vulkan/VulkanFrameData.h
Expand Up @@ -55,8 +55,9 @@ struct FrameDataShared {
// For synchronous readbacks.
VkFence readbackFence = VK_NULL_HANDLE;
bool useMultiThreading;
bool measurePresentTime;

void Init(VulkanContext *vulkan, bool useMultiThreading);
void Init(VulkanContext *vulkan, bool useMultiThreading, bool measurePresentTime);
void Destroy(VulkanContext *vulkan);
};

Expand Down
10 changes: 5 additions & 5 deletions Common/GPU/Vulkan/VulkanRenderManager.cpp
Expand Up @@ -25,9 +25,6 @@
#define UINT64_MAX 0xFFFFFFFFFFFFFFFFULL
#endif


#define USE_PRESENT_WAIT 0

using namespace PPSSPP_VK;

// renderPass is an example of the "compatibility class" or RenderPassType type.
Expand Down Expand Up @@ -260,7 +257,10 @@ VulkanRenderManager::VulkanRenderManager(VulkanContext *vulkan, bool useThread,
{
inflightFramesAtStart_ = vulkan_->GetInflightFrames();

frameDataShared_.Init(vulkan, useThread);
// For present timing experiments. Disabled for now.
measurePresentTime_ = false;

frameDataShared_.Init(vulkan, useThread, measurePresentTime_);

for (int i = 0; i < inflightFramesAtStart_; i++) {
frameData_[i].Init(vulkan, i);
Expand Down Expand Up @@ -308,7 +308,7 @@ bool VulkanRenderManager::CreateBackbuffers() {
INFO_LOG(G3D, "Starting Vulkan compiler thread");
compileThread_ = std::thread(&VulkanRenderManager::CompileThreadFunc, this);

if (USE_PRESENT_WAIT && vulkan_->Extensions().KHR_present_wait && vulkan_->GetPresentMode() == VK_PRESENT_MODE_FIFO_KHR) {
if (measurePresentTime_ && vulkan_->Extensions().KHR_present_wait && vulkan_->GetPresentMode() == VK_PRESENT_MODE_FIFO_KHR) {
INFO_LOG(G3D, "Starting Vulkan present wait thread");
presentWaitThread_ = std::thread(&VulkanRenderManager::PresentWaitThreadFunc, this);
}
Expand Down
1 change: 1 addition & 0 deletions Common/GPU/Vulkan/VulkanRenderManager.h
Expand Up @@ -495,6 +495,7 @@ class VulkanRenderManager {
bool run_ = false;

bool useRenderThread_ = true;
bool measurePresentTime_ = false;

// This is the offset within this frame, in case of a mid-frame sync.
VKRStep *curRenderStep_ = nullptr;
Expand Down

0 comments on commit 6485240

Please sign in to comment.