ad5f8c5c59
Currently, we estimate the expected render time purely based on the latency policy. The problem with doing so is that the real render time might be larger, this can result in frame drops. In order to avoid frame drops, we need to take into account previous render times while estimating the next render time. For now, we just measure how long it takes to record rendering commands on the CPU. In the future, we might want consider using OpenGL timer queries for measuring the real render time, but for now, it's good enough.
44 lines
1 KiB
C++
44 lines
1 KiB
C++
/*
|
|
SPDX-FileCopyrightText: 2020 Vlad Zahorodnii <vlad.zahorodnii@kde.org>
|
|
|
|
SPDX-License-Identifier: GPL-2.0-or-later
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include "renderloop.h"
|
|
#include "renderjournal.h"
|
|
|
|
#include <QTimer>
|
|
|
|
namespace KWin
|
|
{
|
|
|
|
class KWIN_EXPORT RenderLoopPrivate
|
|
{
|
|
public:
|
|
static RenderLoopPrivate *get(RenderLoop *loop);
|
|
explicit RenderLoopPrivate(RenderLoop *q);
|
|
|
|
void dispatch();
|
|
void invalidate();
|
|
|
|
void delayScheduleRepaint();
|
|
void scheduleRepaint();
|
|
void maybeScheduleRepaint();
|
|
|
|
void notifyFrameCompleted(std::chrono::nanoseconds timestamp);
|
|
|
|
RenderLoop *q;
|
|
std::chrono::nanoseconds lastPresentationTimestamp = std::chrono::nanoseconds::zero();
|
|
std::chrono::nanoseconds nextPresentationTimestamp = std::chrono::nanoseconds::zero();
|
|
QTimer compositeTimer;
|
|
RenderJournal renderJournal;
|
|
int refreshRate = 60000;
|
|
int pendingFrameCount = 0;
|
|
int inhibitCount = 0;
|
|
bool pendingReschedule = false;
|
|
bool pendingRepaint = false;
|
|
};
|
|
|
|
} // namespace KWin
|