From 266e34a34bac9ee47977d22a98dec7c021d1eb07 Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Tue, 31 Mar 2026 19:31:49 +0300 Subject: [PATCH] [qrhi] Added button over-state via 2-draw and removed dead stubs. --- .../media/view/media_view_pip_rhi.cpp | 112 ++++++++---------- .../media/view/media_view_pip_rhi.h | 14 --- 2 files changed, 49 insertions(+), 77 deletions(-) diff --git a/Telegram/SourceFiles/media/view/media_view_pip_rhi.cpp b/Telegram/SourceFiles/media/view/media_view_pip_rhi.cpp index 3c5c824a70..e90253e24d 100644 --- a/Telegram/SourceFiles/media/view/media_view_pip_rhi.cpp +++ b/Telegram/SourceFiles/media/view/media_view_pip_rhi.cpp @@ -40,7 +40,7 @@ static_assert(sizeof(PipUniforms) % 16 == 0); struct ImageUniforms { float viewport[2]; float g_opacity; - float o_opacity; + float _pad0; }; static_assert(sizeof(ImageUniforms) % 16 == 0); @@ -242,9 +242,11 @@ void Pip::RendererRhi::render( _cb = cb; const auto size = rt->pixelSize(); - _factor = rt->devicePixelRatio(); + _factor = style::DevicePixelRatio(); _ifactor = int(std::ceil(_factor)); - _viewport = QSize(size.width() / _factor, size.height() / _factor); + _viewport = QSize( + int(size.width() / _factor), + int(size.height() / _factor)); _rub = rhi->nextResourceUpdateBatch(); @@ -280,38 +282,18 @@ void Pip::RendererRhi::releaseResources() { delete _argb32Pipeline; _argb32Pipeline = nullptr; - delete _yuv420Pipeline; - _yuv420Pipeline = nullptr; - delete _nv12Pipeline; - _nv12Pipeline = nullptr; delete _imagePipeline; _imagePipeline = nullptr; delete _imageBlendPipeline; _imageBlendPipeline = nullptr; - delete _controlsPipeline; - _controlsPipeline = nullptr; delete _argb32Srb; _argb32Srb = nullptr; - delete _yuv420Srb; - _yuv420Srb = nullptr; - delete _nv12Srb; - _nv12Srb = nullptr; delete _imageSrb; _imageSrb = nullptr; - delete _controlsSrb; - _controlsSrb = nullptr; delete _rgbaTexture; _rgbaTexture = nullptr; - delete _yTexture; - _yTexture = nullptr; - delete _uTexture; - _uTexture = nullptr; - delete _vTexture; - _vTexture = nullptr; - delete _uvTexture; - _uvTexture = nullptr; delete _vertexBuffer; _vertexBuffer = nullptr; @@ -555,40 +537,42 @@ void Pip::RendererRhi::paintButton( : *tryIndex(2); Assert(meta.icon == &icon && meta.iconOver == &iconOver); - const auto iconRect = _controlsImage.texturedRect( - button.icon, - _controlsTextures[meta.index * 2 + 0]); - const auto geometry = transformRect(iconRect.geometry); - const float coords[] = { - geometry.left(), geometry.top(), - iconRect.texture.left(), iconRect.texture.bottom(), - - geometry.right(), geometry.top(), - iconRect.texture.right(), iconRect.texture.bottom(), - - geometry.left(), geometry.bottom(), - iconRect.texture.left(), iconRect.texture.top(), - - geometry.right(), geometry.bottom(), - iconRect.texture.right(), iconRect.texture.top(), - }; - _rub->updateDynamicBuffer(_vertexBuffer, 0, sizeof(coords), coords); - - ImageUniforms uniforms{}; - uniforms.viewport[0] = _viewport.width() * _factor; - uniforms.viewport[1] = _viewport.height() * _factor; - uniforms.g_opacity = float(shown); - uniforms.o_opacity = float(over); - - _rub->updateDynamicBuffer( - _uniformBuffer, - 0, - sizeof(ImageUniforms), - &uniforms); - _controlsImage.upload(_rhi, _rub); + if (!_controlsImage.texture()) { + return; + } + + const auto vw = _viewport.width() * _factor; + const auto vh = _viewport.height() * _factor; + + const auto drawIcon = [&](int atlasIndex, float opacity) { + if (opacity <= 0.f) { + return; + } + const auto texRect = _controlsImage.texturedRect( + button.icon, + _controlsTextures[meta.index * 2 + atlasIndex]); + const auto geo = transformRect(texRect.geometry); + const float coords[] = { + geo.left(), geo.top(), + texRect.texture.left(), texRect.texture.bottom(), + geo.right(), geo.top(), + texRect.texture.right(), texRect.texture.bottom(), + geo.left(), geo.bottom(), + texRect.texture.left(), texRect.texture.top(), + geo.right(), geo.bottom(), + texRect.texture.right(), texRect.texture.top(), + }; + _rub->updateDynamicBuffer( + _vertexBuffer, 0, sizeof(coords), coords); + + ImageUniforms uniforms{}; + uniforms.viewport[0] = vw; + uniforms.viewport[1] = vh; + uniforms.g_opacity = opacity; + _rub->updateDynamicBuffer( + _uniformBuffer, 0, sizeof(ImageUniforms), &uniforms); - if (_controlsImage.texture()) { _imageSrb->setBindings({ QRhiShaderResourceBinding::uniformBuffer( 0, @@ -602,14 +586,17 @@ void Pip::RendererRhi::paintButton( _sampler), }); _imageSrb->create(); - } - _drawCommands.push_back({ - .pipeline = _imageBlendPipeline, - .srb = _imageSrb, - .vertexBuffer = _vertexBuffer, - .vertexOffset = 0, - }); + _drawCommands.push_back({ + .pipeline = _imageBlendPipeline, + .srb = _imageSrb, + .vertexBuffer = _vertexBuffer, + .vertexOffset = 0, + }); + }; + + drawIcon(0, float(shown * (1. - over))); + drawIcon(1, float(shown * over)); } auto Pip::RendererRhi::ControlMeta(OverState control, int index) @@ -749,7 +736,6 @@ void Pip::RendererRhi::paintUsingRaster( uniforms.viewport[0] = _viewport.width() * _factor; uniforms.viewport[1] = _viewport.height() * _factor; uniforms.g_opacity = 1.0f; - uniforms.o_opacity = 0.0f; _rub->updateDynamicBuffer( _uniformBuffer, diff --git a/Telegram/SourceFiles/media/view/media_view_pip_rhi.h b/Telegram/SourceFiles/media/view/media_view_pip_rhi.h index 6d593940b3..85b6ef3714 100644 --- a/Telegram/SourceFiles/media/view/media_view_pip_rhi.h +++ b/Telegram/SourceFiles/media/view/media_view_pip_rhi.h @@ -121,29 +121,15 @@ private: QRhiSampler *_sampler = nullptr; QRhiTexture *_rgbaTexture = nullptr; - QRhiTexture *_yTexture = nullptr; - QRhiTexture *_uTexture = nullptr; - QRhiTexture *_vTexture = nullptr; - QRhiTexture *_uvTexture = nullptr; QSize _rgbaSize; - QSize _lumaSize; - QSize _chromaSize; quint64 _cacheKey = 0; - int _trackFrameIndex = 0; - bool _chromaNV12 = false; QRhiGraphicsPipeline *_argb32Pipeline = nullptr; - QRhiGraphicsPipeline *_yuv420Pipeline = nullptr; - QRhiGraphicsPipeline *_nv12Pipeline = nullptr; QRhiGraphicsPipeline *_imagePipeline = nullptr; QRhiGraphicsPipeline *_imageBlendPipeline = nullptr; - QRhiGraphicsPipeline *_controlsPipeline = nullptr; QRhiShaderResourceBindings *_argb32Srb = nullptr; - QRhiShaderResourceBindings *_yuv420Srb = nullptr; - QRhiShaderResourceBindings *_nv12Srb = nullptr; QRhiShaderResourceBindings *_imageSrb = nullptr; - QRhiShaderResourceBindings *_controlsSrb = nullptr; Ui::Rhi::Image _shadowImage; Ui::Rhi::Image _radialImage;