[qrhi] Added button over-state via 2-draw and removed dead stubs.

This commit is contained in:
23rd
2026-03-31 19:31:49 +03:00
parent f6cc1179f9
commit 266e34a34b
2 changed files with 49 additions and 77 deletions
@@ -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,
@@ -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;