renderer: clean up surface UV size calcs, fix issues (#12070)

This commit is contained in:
Vaxry 2025-10-19 02:56:55 +02:00 committed by GitHub
parent 39d62e1487
commit ba077d8ff0
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 27 additions and 10 deletions

View file

@ -117,11 +117,13 @@ CRegion CWLSurface::computeDamage() const {
// go from buffer coords in the damage to hl logical
const auto BOX = getSurfaceBoxGlobal();
const Vector2D SCALE = BOX.has_value() ? BOX->size() / m_resource->m_current.bufferSize :
Vector2D{1.0 / m_resource->m_current.scale, 1.0 / m_resource->m_current.scale /* Wrong... but we can't really do better */};
const auto BOX = getSurfaceBoxGlobal();
const auto SURFSIZE = m_resource->m_current.size;
const Vector2D SCALE = SURFSIZE / m_resource->m_current.bufferSize;
damage.scale(SCALE);
if (BOX.has_value())
damage.intersect(CBox{{}, BOX->size()});
if (m_windowOwner)
damage.scale(m_windowOwner->m_X11SurfaceScaledBy); // fix xwayland:force_zero_scaling stuff that will be fucked by the above a bit

View file

@ -1087,6 +1087,25 @@ void CHyprRenderer::renderSessionLockMissing(PHLMONITOR pMonitor) {
}
}
static std::optional<Vector2D> getSurfaceExpectedSize(PHLWINDOW pWindow, SP<CWLSurfaceResource> pSurface, PHLMONITOR pMonitor, bool main) {
const auto CAN_USE_WINDOW = pWindow && main;
const auto WINDOW_SIZE_MISALIGN = CAN_USE_WINDOW && pWindow->getReportedSize() != pWindow->m_wlSurface->resource()->m_current.size;
if (pSurface->m_current.viewport.hasDestination)
return (pSurface->m_current.viewport.destination * pMonitor->m_scale).round();
if (pSurface->m_current.viewport.hasSource)
return (pSurface->m_current.viewport.source.size() * pMonitor->m_scale).round();
if (WINDOW_SIZE_MISALIGN)
return (pSurface->m_current.size * pMonitor->m_scale).round();
if (CAN_USE_WINDOW)
return (pWindow->getReportedSize() * pMonitor->m_scale).round();
return std::nullopt;
}
void CHyprRenderer::calculateUVForSurface(PHLWINDOW pWindow, SP<CWLSurfaceResource> pSurface, PHLMONITOR pMonitor, bool main, const Vector2D& projSize,
const Vector2D& projSizeUnscaled, bool fixMisalignedFSV1) {
if (!pWindow || !pWindow->m_isX11) {
@ -1123,14 +1142,10 @@ void CHyprRenderer::calculateUVForSurface(PHLWINDOW pWindow, SP<CWLSurfaceResour
// this will break if later on xdg geometry is hit, but we really try
// to let the apps know to NOT add CSD. Also if source is there.
// there is no way to fix this if that's the case
if (*PEXPANDEDGES) {
{
const auto MONITOR_WL_SCALE = std::ceil(pMonitor->m_scale);
const bool SCALE_UNAWARE = MONITOR_WL_SCALE == pSurface->m_current.scale || !pSurface->m_current.viewport.hasDestination;
const auto EXPECTED_SIZE = ((pSurface->m_current.viewport.hasDestination ?
pSurface->m_current.viewport.destination :
(pSurface->m_current.viewport.hasSource ? pSurface->m_current.viewport.source.size() / pSurface->m_current.scale : projSize)) *
pMonitor->m_scale)
.round();
const bool SCALE_UNAWARE = MONITOR_WL_SCALE > 1 && (MONITOR_WL_SCALE == pSurface->m_current.scale || !pSurface->m_current.viewport.hasDestination);
const auto EXPECTED_SIZE = getSurfaceExpectedSize(pWindow, pSurface, pMonitor, main).value_or((projSize * pMonitor->m_scale).round());
const auto RATIO = projSize / EXPECTED_SIZE;
if (!SCALE_UNAWARE || MONITOR_WL_SCALE == 1) {