Remove wait for free buffer

Previously we would first attempt to use any buffer that was free,
meaning whichever buffer has already been displayed. This has poor
interactions when the operating system throttles the update rate of the
window, so if there isn't any free buffers available, just reuse the
oldest frame instead.
This commit is contained in:
James Rowe 2019-12-16 20:02:01 -07:00
parent 439d550850
commit f369196c9f

View File

@ -77,7 +77,6 @@ public:
std::scoped_lock lock(swap_chain_lock); std::scoped_lock lock(swap_chain_lock);
std::queue<Frontend::Frame*>().swap(free_queue); std::queue<Frontend::Frame*>().swap(free_queue);
present_queue.clear(); present_queue.clear();
free_cv.notify_all();
present_cv.notify_all(); present_cv.notify_all();
} }
@ -126,10 +125,6 @@ public:
Frontend::Frame* GetRenderFrame() override { Frontend::Frame* GetRenderFrame() override {
std::unique_lock<std::mutex> lock(swap_chain_lock); std::unique_lock<std::mutex> lock(swap_chain_lock);
// wait for new entries in the free_queue
// we want to break at some point to prevent a softlock on close if the presentation thread
// stops consuming buffers
free_cv.wait_for(lock, std::chrono::milliseconds(100), [&] { return !free_queue.empty(); });
// If theres no free frames, we will reuse the oldest render frame // If theres no free frames, we will reuse the oldest render frame
if (free_queue.empty()) { if (free_queue.empty()) {
@ -162,7 +157,6 @@ public:
// free the previous frame and add it back to the free queue // free the previous frame and add it back to the free queue
if (previous_frame) { if (previous_frame) {
free_queue.push(previous_frame); free_queue.push(previous_frame);
free_cv.notify_one();
} }
// the newest entries are pushed to the front of the queue // the newest entries are pushed to the front of the queue
@ -172,7 +166,6 @@ public:
for (auto f : present_queue) { for (auto f : present_queue) {
free_queue.push(f); free_queue.push(f);
} }
free_cv.notify_one();
present_queue.clear(); present_queue.clear();
previous_frame = frame; previous_frame = frame;
return frame; return frame;