mirror of
https://github.com/hyprwm/aquamarine.git
synced 2024-11-17 04:56:00 +01:00
drm: immediately send presentation events for tearing
This commit is contained in:
parent
339337cc7b
commit
18c6a8ccaf
1 changed files with 37 additions and 12 deletions
|
@ -1436,8 +1436,10 @@ bool Aquamarine::CDRMOutput::commitState(bool onlyTest) {
|
||||||
|
|
||||||
if (STATE.enabled && (COMMITTED & COutputState::eOutputStateProperties::AQ_OUTPUT_STATE_BUFFER))
|
if (STATE.enabled && (COMMITTED & COutputState::eOutputStateProperties::AQ_OUTPUT_STATE_BUFFER))
|
||||||
flags |= DRM_MODE_PAGE_FLIP_EVENT;
|
flags |= DRM_MODE_PAGE_FLIP_EVENT;
|
||||||
if (STATE.presentationMode == AQ_OUTPUT_PRESENTATION_IMMEDIATE && (COMMITTED & COutputState::eOutputStateProperties::AQ_OUTPUT_STATE_BUFFER))
|
if (STATE.presentationMode == AQ_OUTPUT_PRESENTATION_IMMEDIATE && (COMMITTED & COutputState::eOutputStateProperties::AQ_OUTPUT_STATE_BUFFER)) {
|
||||||
flags |= DRM_MODE_PAGE_FLIP_ASYNC;
|
flags |= DRM_MODE_PAGE_FLIP_ASYNC;
|
||||||
|
flags &= ~DRM_MODE_PAGE_FLIP_EVENT; // Do not request an event for immediate page flips, as it makes no sense.
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// we can't go further without a blit
|
// we can't go further without a blit
|
||||||
|
@ -1505,6 +1507,7 @@ bool Aquamarine::CDRMOutput::commitState(bool onlyTest) {
|
||||||
fourccToName(STATE.drmFormat), fourccToName(params.format)));
|
fourccToName(STATE.drmFormat), fourccToName(params.format)));
|
||||||
state->setFormat(params.format);
|
state->setFormat(params.format);
|
||||||
formatMismatch = true;
|
formatMismatch = true;
|
||||||
|
// TODO: reject if tearing? We will miss a frame event!
|
||||||
flags &= ~DRM_MODE_PAGE_FLIP_ASYNC; // we cannot modeset with async pf
|
flags &= ~DRM_MODE_PAGE_FLIP_ASYNC; // we cannot modeset with async pf
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1560,6 +1563,28 @@ bool Aquamarine::CDRMOutput::commitState(bool onlyTest) {
|
||||||
if (ok)
|
if (ok)
|
||||||
connector->commitTainted = false;
|
connector->commitTainted = false;
|
||||||
|
|
||||||
|
if (data.flags & DRM_MODE_PAGE_FLIP_ASYNC) {
|
||||||
|
// for tearing commits, we will send presentation feedback instantly, and rotate
|
||||||
|
// drm framebuffers to properly send backendRelease events.
|
||||||
|
// the last FB should already be gone from KMS because it's been immediately replaced
|
||||||
|
|
||||||
|
// no completion and no vsync, because tearing
|
||||||
|
uint32_t flags = IOutput::AQ_OUTPUT_PRESENT_HW_CLOCK | IOutput::AQ_OUTPUT_PRESENT_ZEROCOPY;
|
||||||
|
|
||||||
|
timespec presented;
|
||||||
|
clock_gettime(CLOCK_MONOTONIC, &presented);
|
||||||
|
|
||||||
|
connector->output->events.present.emit(IOutput::SPresentEvent{
|
||||||
|
.presented = backend->sessionActive(),
|
||||||
|
.when = &presented,
|
||||||
|
.seq = 0, /* unknown sequence for tearing */
|
||||||
|
.refresh = (int)(connector->refresh ? (1000000000000LL / connector->refresh) : 0),
|
||||||
|
.flags = flags,
|
||||||
|
});
|
||||||
|
|
||||||
|
connector->onPresent();
|
||||||
|
}
|
||||||
|
|
||||||
return ok;
|
return ok;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue