Fix Live stories display without OpenGL.

This commit is contained in:
John Preston
2025-11-24 09:58:37 +04:00
parent 644744ac9e
commit 4342c8d761
6 changed files with 52 additions and 19 deletions
@@ -65,14 +65,18 @@ Viewport::Viewport(
}
Viewport::~Viewport() {
if (_borrowed && _opengl) {
const auto w = static_cast<QOpenGLWidget*>(widget().get());
w->makeCurrent();
const auto context = w->context();
const auto valid = w->isValid()
&& context
&& (QOpenGLContext::currentContext() == context);
ensureBorrowedCleared(valid ? context->functions() : nullptr);
if (_borrowed) {
if (_opengl) {
const auto w = static_cast<QOpenGLWidget*>(widget().get());
w->makeCurrent();
const auto context = w->context();
const auto valid = w->isValid()
&& context
&& (QOpenGLContext::currentContext() == context);
ensureBorrowedCleared(valid ? context->functions() : nullptr);
} else {
ensureBorrowedCleared();
}
}
}
@@ -925,6 +929,7 @@ rpl::producer<bool> Viewport::mouseInsideValue() const {
void Viewport::ensureBorrowedRenderer(QOpenGLFunctions &f) {
Expects(_borrowed != nullptr);
Expects(_opengl);
if (_borrowedRenderer) {
return;
@@ -935,6 +940,7 @@ void Viewport::ensureBorrowedRenderer(QOpenGLFunctions &f) {
void Viewport::ensureBorrowedCleared(QOpenGLFunctions *f) {
Expects(_borrowed != nullptr);
Expects(_opengl);
if (const auto renderer = base::take(_borrowedRenderer)) {
renderer->deinit(f);
@@ -948,6 +954,23 @@ void Viewport::borrowedPaint(QOpenGLFunctions &f) {
_borrowedRenderer->paint(static_cast<QOpenGLWidget*>(widget().get()), f);
}
void Viewport::ensureBorrowedRenderer() {
Expects(_borrowed != nullptr);
Expects(!_opengl);
if (_borrowedRenderer) {
return;
}
_borrowedRenderer = makeRenderer();
}
void Viewport::ensureBorrowedCleared() {
Expects(_borrowed != nullptr);
Expects(!_opengl);
base::take(_borrowedRenderer);
}
void Viewport::borrowedPaint(Painter &p, const QRegion &clip) {
Expects(_borrowedRenderer != nullptr);
Expects(!_opengl);
@@ -103,7 +103,11 @@ public:
void ensureBorrowedRenderer(QOpenGLFunctions &f);
void ensureBorrowedCleared(QOpenGLFunctions *f);
void borrowedPaint(QOpenGLFunctions &f);
void ensureBorrowedRenderer();
void ensureBorrowedCleared();
void borrowedPaint(Painter &p, const QRegion &clip);
[[nodiscard]] QPoint borrowedOrigin() const;
[[nodiscard]] rpl::lifetime &lifetime();
@@ -52,12 +52,14 @@ void Viewport::RendererSW::paintFallback(
}
paintTile(p, tile.get(), bounding, bg);
}
const auto fullscreen = _owner->_fullscreen;
const auto color = fullscreen
? QColor(0, 0, 0)
: st::groupCallBg->c;
for (const auto &rect : bg) {
p.fillRect(rect, color);
if (_owner->borrowedOrigin().isNull()) {
const auto fullscreen = _owner->_fullscreen;
const auto color = fullscreen
? QColor(0, 0, 0)
: st::groupCallBg->c;
for (const auto &rect : bg) {
p.fillRect(rect, color);
}
}
for (auto i = _tileData.begin(); i != _tileData.end();) {
if (i->second.stale) {
@@ -36,6 +36,9 @@ void OverlayWidget::RendererSW::paintFallback(
p.fillRect(clip.boundingRect(), Qt::transparent);
return;
}
if (const auto stream = _owner->_videoStream.get()) {
stream->ensureBorrowedRenderer();
}
_p = &p;
_clip = &clip;
_clipOuter = clip.boundingRect();
@@ -272,14 +272,14 @@ void VideoStream::ensureBorrowedRenderer(QOpenGLFunctions &f) {
_viewport->ensureBorrowedRenderer(f);
}
void VideoStream::ensureBorrowedCleared(QOpenGLFunctions *f) {
_viewport->ensureBorrowedCleared(f);
}
void VideoStream::borrowedPaint(QOpenGLFunctions &f) {
_viewport->borrowedPaint(f);
}
void VideoStream::ensureBorrowedRenderer() {
_viewport->ensureBorrowedRenderer();
}
void VideoStream::borrowedPaint(Painter &p, const QRegion &clip) {
_viewport->borrowedPaint(p, clip);
}
@@ -63,8 +63,9 @@ public:
void toggleCommentsOn(rpl::producer<bool> shown);
void ensureBorrowedRenderer(QOpenGLFunctions &f);
void ensureBorrowedCleared(QOpenGLFunctions *f);
void borrowedPaint(QOpenGLFunctions &f);
void ensureBorrowedRenderer();
void borrowedPaint(Painter &p, const QRegion &clip);
[[nodiscard]] rpl::lifetime &lifetime();