mirror of
https://github.com/hyprwm/Hyprland
synced 2024-11-22 18:25:59 +01:00
renderer: minor direct scanout fixes (#7594)
This commit is contained in:
parent
76b82fdde7
commit
838ed87d6f
3 changed files with 23 additions and 4 deletions
|
@ -832,6 +832,21 @@ bool CMonitor::attemptDirectScanout() {
|
||||||
|
|
||||||
// FIXME: make sure the buffer actually follows the available scanout dmabuf formats
|
// FIXME: make sure the buffer actually follows the available scanout dmabuf formats
|
||||||
// and comes from the appropriate device. This may implode on multi-gpu!!
|
// and comes from the appropriate device. This may implode on multi-gpu!!
|
||||||
|
|
||||||
|
const auto params = PSURFACE->current.buffer->buffer->dmabuf();
|
||||||
|
// scanout buffer isn't dmabuf, so no scanout
|
||||||
|
if (!params.success)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// entering into scanout, so save monitor format
|
||||||
|
if (lastScanout.expired())
|
||||||
|
prevDrmFormat = drmFormat;
|
||||||
|
|
||||||
|
if (drmFormat != params.format) {
|
||||||
|
output->state->setFormat(params.format);
|
||||||
|
drmFormat = params.format;
|
||||||
|
}
|
||||||
|
|
||||||
output->state->setBuffer(PSURFACE->current.buffer->buffer.lock());
|
output->state->setBuffer(PSURFACE->current.buffer->buffer.lock());
|
||||||
output->state->setPresentationMode(tearingState.activelyTearing ? Aquamarine::eOutputPresentationMode::AQ_OUTPUT_PRESENTATION_IMMEDIATE :
|
output->state->setPresentationMode(tearingState.activelyTearing ? Aquamarine::eOutputPresentationMode::AQ_OUTPUT_PRESENTATION_IMMEDIATE :
|
||||||
Aquamarine::eOutputPresentationMode::AQ_OUTPUT_PRESENTATION_VSYNC);
|
Aquamarine::eOutputPresentationMode::AQ_OUTPUT_PRESENTATION_VSYNC);
|
||||||
|
|
|
@ -100,7 +100,8 @@ class CMonitor {
|
||||||
std::optional<Vector2D> forceSize;
|
std::optional<Vector2D> forceSize;
|
||||||
SP<Aquamarine::SOutputMode> currentMode;
|
SP<Aquamarine::SOutputMode> currentMode;
|
||||||
SP<Aquamarine::CSwapchain> cursorSwapchain;
|
SP<Aquamarine::CSwapchain> cursorSwapchain;
|
||||||
uint32_t drmFormat = DRM_FORMAT_INVALID;
|
uint32_t drmFormat = DRM_FORMAT_INVALID;
|
||||||
|
uint32_t prevDrmFormat = DRM_FORMAT_INVALID;
|
||||||
|
|
||||||
bool dpmsStatus = true;
|
bool dpmsStatus = true;
|
||||||
bool vrrActive = false; // this can be TRUE even if VRR is not active in the case that this display does not support it.
|
bool vrrActive = false; // this can be TRUE even if VRR is not active in the case that this display does not support it.
|
||||||
|
|
|
@ -1277,7 +1277,8 @@ void CHyprRenderer::renderMonitor(CMonitor* pMonitor) {
|
||||||
pMonitor->lastScanout.reset();
|
pMonitor->lastScanout.reset();
|
||||||
|
|
||||||
// reset DRM format, make sure it's the one we want.
|
// reset DRM format, make sure it's the one we want.
|
||||||
pMonitor->output->state->setFormat(pMonitor->drmFormat);
|
pMonitor->output->state->setFormat(pMonitor->prevDrmFormat);
|
||||||
|
pMonitor->drmFormat = pMonitor->prevDrmFormat;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1978,7 +1979,8 @@ bool CHyprRenderer::applyMonitorRule(CMonitor* pMonitor, SMonitorRule* pMonitorR
|
||||||
pMonitor->currentMode = nullptr;
|
pMonitor->currentMode = nullptr;
|
||||||
|
|
||||||
pMonitor->output->state->setFormat(DRM_FORMAT_XRGB8888);
|
pMonitor->output->state->setFormat(DRM_FORMAT_XRGB8888);
|
||||||
pMonitor->drmFormat = DRM_FORMAT_XRGB8888;
|
pMonitor->prevDrmFormat = pMonitor->drmFormat;
|
||||||
|
pMonitor->drmFormat = DRM_FORMAT_XRGB8888;
|
||||||
pMonitor->output->state->resetExplicitFences();
|
pMonitor->output->state->resetExplicitFences();
|
||||||
|
|
||||||
bool autoScale = false;
|
bool autoScale = false;
|
||||||
|
@ -2219,7 +2221,8 @@ bool CHyprRenderer::applyMonitorRule(CMonitor* pMonitor, SMonitorRule* pMonitorR
|
||||||
|
|
||||||
for (auto const& fmt : formats[(int)!RULE->enable10bit]) {
|
for (auto const& fmt : formats[(int)!RULE->enable10bit]) {
|
||||||
pMonitor->output->state->setFormat(fmt.second);
|
pMonitor->output->state->setFormat(fmt.second);
|
||||||
pMonitor->drmFormat = fmt.second;
|
pMonitor->prevDrmFormat = pMonitor->drmFormat;
|
||||||
|
pMonitor->drmFormat = fmt.second;
|
||||||
|
|
||||||
if (!pMonitor->state.test()) {
|
if (!pMonitor->state.test()) {
|
||||||
Debug::log(ERR, "output {} failed basic test on format {}", pMonitor->szName, fmt.first);
|
Debug::log(ERR, "output {} failed basic test on format {}", pMonitor->szName, fmt.first);
|
||||||
|
|
Loading…
Reference in a new issue