Add latency to surface updates (#3056)
This commit is contained in:
@@ -146,7 +146,7 @@ public:
|
||||
void enqueueDeletion(std::function<void(Context&)>&& function);
|
||||
void submitOneTimeCommand(const std::function<void(const vk::UniqueCommandBuffer&)>& function) const;
|
||||
|
||||
void requestSurfaceUpdate() { surfaceUpdateRequested = true; }
|
||||
void requestSurfaceUpdate(bool useDelay = true);
|
||||
|
||||
private:
|
||||
struct FrameResources {
|
||||
@@ -197,6 +197,7 @@ private:
|
||||
uint8_t frameResourceIndex = 0;
|
||||
std::vector<FrameResources> frameResources;
|
||||
bool surfaceUpdateRequested{false};
|
||||
int32_t surfaceUpdateLatency{0};
|
||||
int32_t currentFrameCount{0};
|
||||
|
||||
struct {
|
||||
|
||||
@@ -171,6 +171,19 @@ void Context::submitOneTimeCommand(const std::function<void(const vk::UniqueComm
|
||||
}
|
||||
}
|
||||
|
||||
void Context::requestSurfaceUpdate(bool useDelay) {
|
||||
if (surfaceUpdateRequested) {
|
||||
if (!useDelay) {
|
||||
surfaceUpdateLatency = 0;
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
surfaceUpdateRequested = true;
|
||||
surfaceUpdateLatency = useDelay ? backend.getMaxFrames() * 3 : 0;
|
||||
}
|
||||
|
||||
void Context::waitFrame() const {
|
||||
MLN_TRACE_FUNC();
|
||||
const auto& device = backend.getDevice();
|
||||
@@ -203,7 +216,7 @@ void Context::beginFrame() {
|
||||
}
|
||||
}
|
||||
|
||||
if (platformSurface && surfaceUpdateRequested) {
|
||||
if (platformSurface && surfaceUpdateRequested && --surfaceUpdateLatency <= 0) {
|
||||
renderableResource.recreateSwapchain();
|
||||
|
||||
// we wait for an idle device to recreate the swapchain
|
||||
@@ -243,14 +256,13 @@ void Context::beginFrame() {
|
||||
if (acquireImageResult.result == vk::Result::eSuccess) {
|
||||
renderableResource.setAcquiredImageIndex(acquireImageResult.value);
|
||||
} else if (acquireImageResult.result == vk::Result::eSuboptimalKHR) {
|
||||
renderableResource.setAcquiredImageIndex(acquireImageResult.value);
|
||||
requestSurfaceUpdate();
|
||||
beginFrame();
|
||||
return;
|
||||
}
|
||||
|
||||
} catch (const vk::OutOfDateKHRError& e) {
|
||||
// request an update and restart frame
|
||||
requestSurfaceUpdate();
|
||||
requestSurfaceUpdate(false);
|
||||
beginFrame();
|
||||
return;
|
||||
}
|
||||
@@ -310,7 +322,7 @@ void Context::submitFrame() {
|
||||
requestSurfaceUpdate();
|
||||
}
|
||||
} catch (const vk::OutOfDateKHRError& e) {
|
||||
requestSurfaceUpdate();
|
||||
requestSurfaceUpdate(false);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user