mirror of
https://github.com/hyprwm/Hyprland
synced 2025-12-20 04:50:03 +01:00
renderer: clean up surface UV size calcs, fix issues (#12070)
This commit is contained in:
parent
39d62e1487
commit
ba077d8ff0
2 changed files with 27 additions and 10 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue