From ef12120270c6a16a7680a20ded3899140eee48d0 Mon Sep 17 00:00:00 2001 From: vaxerski Date: Sun, 29 Jan 2023 15:58:36 +0000 Subject: [PATCH] fixup LS scaling impl --- src/events/Layers.cpp | 9 ++++----- src/helpers/Vector2D.hpp | 4 ++++ src/render/Renderer.cpp | 14 +++++++++++--- 3 files changed, 19 insertions(+), 8 deletions(-) diff --git a/src/events/Layers.cpp b/src/events/Layers.cpp index 68e36c97..a6369fcd 100644 --- a/src/events/Layers.cpp +++ b/src/events/Layers.cpp @@ -247,9 +247,8 @@ void Events::listener_unmapLayerSurface(void* owner, void* data) { (int)layersurface->layerSurface->surface->current.width, (int)layersurface->layerSurface->surface->current.height}; g_pHyprRenderer->damageBox(&geomFixed); - geomFixed = {layersurface->geometry.x, layersurface->geometry.y, (int)layersurface->layerSurface->surface->current.width, - (int)layersurface->layerSurface->surface->current.height}; - layersurface->geometry = geomFixed; // because the surface can overflow... for some reason? + geomFixed = {layersurface->geometry.x, layersurface->geometry.y, (int)layersurface->layerSurface->current.actual_width, (int)layersurface->layerSurface->current.actual_height}; + // layersurface->geometry = geomFixed; // because the surface can overflow... for some reason? } void Events::listener_commitLayerSurface(void* owner, void* data) { @@ -311,8 +310,8 @@ void Events::listener_commitLayerSurface(void* owner, void* data) { layersurface->position = Vector2D(layersurface->geometry.x, layersurface->geometry.y); // update geom if it changed - layersurface->geometry = {layersurface->geometry.x, layersurface->geometry.y, layersurface->layerSurface->surface->current.width, - layersurface->layerSurface->surface->current.height}; + // layersurface->geometry = {layersurface->geometry.x, layersurface->geometry.y, (int)layersurface->layerSurface->current.actual_width, + // (int)layersurface->layerSurface->current.actual_height}; g_pHyprRenderer->damageSurface(layersurface->layerSurface->surface, layersurface->position.x, layersurface->position.y); diff --git a/src/helpers/Vector2D.hpp b/src/helpers/Vector2D.hpp index f2f47e6b..f38e6a8d 100644 --- a/src/helpers/Vector2D.hpp +++ b/src/helpers/Vector2D.hpp @@ -39,6 +39,10 @@ class Vector2D { return Vector2D(this->x * a.x, this->y * a.y); } + Vector2D operator/(const Vector2D& a) const { + return Vector2D(this->x / a.x, this->y / a.y); + } + Vector2D clamp(const Vector2D& min, const Vector2D& max = Vector2D()); Vector2D floor(); diff --git a/src/render/Renderer.cpp b/src/render/Renderer.cpp index 2ca725bc..f7a15f52 100644 --- a/src/render/Renderer.cpp +++ b/src/render/Renderer.cpp @@ -356,8 +356,8 @@ void CHyprRenderer::renderLayer(SLayerSurface* pLayer, CMonitor* pMonitor, times renderdata.blur = pLayer->forceBlur; renderdata.surface = pLayer->layerSurface->surface; renderdata.decorate = false; - renderdata.w = pLayer->layerSurface->surface->current.width; - renderdata.h = pLayer->layerSurface->surface->current.height; + renderdata.w = pLayer->geometry.width; + renderdata.h = pLayer->geometry.height; renderdata.blockBlurOptimization = pLayer->layer == ZWLR_LAYER_SHELL_V1_LAYER_BOTTOM || pLayer->layer == ZWLR_LAYER_SHELL_V1_LAYER_BACKGROUND; wlr_surface_for_each_surface(pLayer->layerSurface->surface, renderSurface, &renderdata); @@ -550,7 +550,7 @@ void CHyprRenderer::calculateUVForSurface(CWindow* pWindow, wlr_surface* pSurfac Vector2D bufferSize = Vector2D(pSurface->buffer->texture->width, pSurface->buffer->texture->height); - // calculate UV for the basic src_box. Assume dest == size. TODO: don't. + // calculate UV for the basic src_box. Assume dest == size. Scale to dest later uvTL = Vector2D(bufferSource.x / bufferSize.x, bufferSource.y / bufferSize.y); uvBR = Vector2D((bufferSource.x + bufferSource.width) / bufferSize.x, (bufferSource.y + bufferSource.height) / bufferSize.y); @@ -560,6 +560,14 @@ void CHyprRenderer::calculateUVForSurface(CWindow* pWindow, wlr_surface* pSurfac } } + const auto DESTVP = Vector2D{pSurface->current.viewport.dst_width, pSurface->current.viewport.dst_height}; + + if (DESTVP != Vector2D{} && !pWindow /* Layersurface. TODO: is this correct? */) { + const auto DESTSCALE = DESTVP / Vector2D(pSurface->buffer->texture->width, pSurface->buffer->texture->height); + uvTL = uvTL * DESTSCALE; + uvBR = uvBR * DESTSCALE; + } + g_pHyprOpenGL->m_RenderData.primarySurfaceUVTopLeft = uvTL; g_pHyprOpenGL->m_RenderData.primarySurfaceUVBottomRight = uvBR;