Don't use starblit/endblit for renderer switches

This commit is contained in:
Cacodemon345
2025-03-16 15:24:24 +06:00
parent 081e97f1b0
commit 35125e7020
3 changed files with 9 additions and 7 deletions

View File

@@ -2025,8 +2025,8 @@ MainWindow::on_actionRenderer_options_triggered()
ui->stackedWidget->switchRenderer(static_cast<RendererStack::Renderer>(vid_api)); ui->stackedWidget->switchRenderer(static_cast<RendererStack::Renderer>(vid_api));
if (show_second_monitors) { if (show_second_monitors) {
for (int i = 1; i < MONITORS_NUM; i++) { for (int i = 1; i < MONITORS_NUM; i++) {
if (renderers[i] && renderers[i]->reloadRendererOption() && renderers[i]->hasOptions()) { if (renderers[i]) {
ui->stackedWidget->switchRenderer(static_cast<RendererStack::Renderer>(vid_api)); renderers[i]->switchRenderer(static_cast<RendererStack::Renderer>(vid_api));
} }
} }
} }

View File

@@ -288,7 +288,8 @@ RendererStack::leaveEvent(QEvent *event)
void void
RendererStack::switchRenderer(Renderer renderer) RendererStack::switchRenderer(Renderer renderer)
{ {
startblit(); //startblit();
switchInProgress = true;
if (current) { if (current) {
rendererWindow->finalize(); rendererWindow->finalize();
removeWidget(current.get()); removeWidget(current.get());
@@ -349,7 +350,7 @@ RendererStack::createRenderer(Renderer renderer)
connect(hw, &OpenGLRenderer::initialized, [=]() { connect(hw, &OpenGLRenderer::initialized, [=]() {
/* Buffers are available only after initialization. */ /* Buffers are available only after initialization. */
imagebufs = rendererWindow->getBuffers(); imagebufs = rendererWindow->getBuffers();
endblit(); switchInProgress = false;
emit rendererChanged(); emit rendererChanged();
}); });
connect(hw, &OpenGLRenderer::errorInitializing, [=]() { connect(hw, &OpenGLRenderer::errorInitializing, [=]() {
@@ -381,7 +382,7 @@ RendererStack::createRenderer(Renderer renderer)
connect(hw, &VulkanWindowRenderer::rendererInitialized, [=]() { connect(hw, &VulkanWindowRenderer::rendererInitialized, [=]() {
/* Buffers are available only after initialization. */ /* Buffers are available only after initialization. */
imagebufs = rendererWindow->getBuffers(); imagebufs = rendererWindow->getBuffers();
endblit(); switchInProgress = false;
emit rendererChanged(); emit rendererChanged();
}); });
connect(hw, &VulkanWindowRenderer::errorInitializing, [=]() { connect(hw, &VulkanWindowRenderer::errorInitializing, [=]() {
@@ -413,7 +414,7 @@ RendererStack::createRenderer(Renderer renderer)
if (renderer != Renderer::OpenGL3 && renderer != Renderer::Vulkan) { if (renderer != Renderer::OpenGL3 && renderer != Renderer::Vulkan) {
imagebufs = rendererWindow->getBuffers(); imagebufs = rendererWindow->getBuffers();
endblit(); switchInProgress = false;
emit rendererChanged(); emit rendererChanged();
} }
} }
@@ -423,7 +424,7 @@ void
RendererStack::blit(int x, int y, int w, int h) RendererStack::blit(int x, int y, int w, int h)
{ {
if ((x < 0) || (y < 0) || (w <= 0) || (h <= 0) || if ((x < 0) || (y < 0) || (w <= 0) || (h <= 0) ||
(w > 2048) || (h > 2048) || (w > 2048) || (h > 2048) || (switchInProgress) ||
(monitors[m_monitor_index].target_buffer == NULL) || imagebufs.empty() || (monitors[m_monitor_index].target_buffer == NULL) || imagebufs.empty() ||
std::get<std::atomic_flag *>(imagebufs[currentBuf])->test_and_set()) { std::get<std::atomic_flag *>(imagebufs[currentBuf])->test_and_set()) {
video_blit_complete_monitor(m_monitor_index); video_blit_complete_monitor(m_monitor_index);

View File

@@ -113,6 +113,7 @@ private:
std::unique_ptr<QWidget> current; std::unique_ptr<QWidget> current;
std::atomic_bool rendererTakesScreenshots; std::atomic_bool rendererTakesScreenshots;
std::atomic_bool switchInProgress{false};
}; };
#endif // QT_RENDERERCONTAINER_HPP #endif // QT_RENDERERCONTAINER_HPP