Skip to content

Commit

Permalink
renderer: minor direct scanout fixes (#7594)
Browse files Browse the repository at this point in the history
  • Loading branch information
ikalco authored Aug 31, 2024
1 parent 76b82fd commit 838ed87
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 4 deletions.
15 changes: 15 additions & 0 deletions src/helpers/Monitor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -832,6 +832,21 @@ bool CMonitor::attemptDirectScanout() {

// FIXME: make sure the buffer actually follows the available scanout dmabuf formats
// 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->setPresentationMode(tearingState.activelyTearing ? Aquamarine::eOutputPresentationMode::AQ_OUTPUT_PRESENTATION_IMMEDIATE :
Aquamarine::eOutputPresentationMode::AQ_OUTPUT_PRESENTATION_VSYNC);
Expand Down
3 changes: 2 additions & 1 deletion src/helpers/Monitor.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,8 @@ class CMonitor {
std::optional<Vector2D> forceSize;
SP<Aquamarine::SOutputMode> currentMode;
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 vrrActive = false; // this can be TRUE even if VRR is not active in the case that this display does not support it.
Expand Down
9 changes: 6 additions & 3 deletions src/render/Renderer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1277,7 +1277,8 @@ void CHyprRenderer::renderMonitor(CMonitor* pMonitor) {
pMonitor->lastScanout.reset();

// 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;
}
}

Expand Down Expand Up @@ -1978,7 +1979,8 @@ bool CHyprRenderer::applyMonitorRule(CMonitor* pMonitor, SMonitorRule* pMonitorR
pMonitor->currentMode = nullptr;

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();

bool autoScale = false;
Expand Down Expand Up @@ -2219,7 +2221,8 @@ bool CHyprRenderer::applyMonitorRule(CMonitor* pMonitor, SMonitorRule* pMonitorR

for (auto const& fmt : formats[(int)!RULE->enable10bit]) {
pMonitor->output->state->setFormat(fmt.second);
pMonitor->drmFormat = fmt.second;
pMonitor->prevDrmFormat = pMonitor->drmFormat;
pMonitor->drmFormat = fmt.second;

if (!pMonitor->state.test()) {
Debug::log(ERR, "output {} failed basic test on format {}", pMonitor->szName, fmt.first);
Expand Down

0 comments on commit 838ed87

Please sign in to comment.