Own preview and recording workers

This commit is contained in:
2026-06-16 07:18:08 +02:00
parent 4d7a23a1fd
commit 3366b54c7f
8 changed files with 78 additions and 51 deletions

View File

@@ -19,6 +19,7 @@
#include "util.h"
#include <array>
#include <cstdint>
#include <stop_token>
namespace {
@@ -410,7 +411,6 @@ void execute_stroke_preview_background_capture_pass(
std::atomic_int NodeStrokePreview::s_instances{ 0 };
std::atomic_bool NodeStrokePreview::s_running{ false };
std::mutex NodeStrokePreview::s_render_mutex;
std::thread NodeStrokePreview::s_renderer;
BlockingQueue<std::shared_ptr<NodeStrokePreview>> NodeStrokePreview::s_queue;
RTT NodeStrokePreview::m_rtt;
@@ -422,16 +422,18 @@ Sampler NodeStrokePreview::m_sampler_linear;
Sampler NodeStrokePreview::m_sampler_linear_repeat;
Sampler NodeStrokePreview::m_sampler_mipmap;
DynamicShape NodeStrokePreview::m_brush_shape;
std::jthread NodeStrokePreview::s_renderer;
void NodeStrokePreview::terminate_renderer()
{
if (s_running && s_renderer.joinable())
{
s_running = false;
s_queue.UnlockGetters();
s_renderer.join();
}
if (!s_renderer.joinable())
return;
s_running = false;
s_renderer.request_stop();
s_queue.UnlockGetters();
s_renderer.join();
}
void NodeStrokePreview::empty_queue()
@@ -906,11 +908,11 @@ void NodeStrokePreview::draw_stroke()
{
if (m_size.x == 0 || m_size.y == 0)
return;
s_queue.mutex.lock();
if (!s_running)
std::unique_lock<std::mutex> queue_lock(s_queue.mutex);
if (!s_renderer.joinable())
{
s_running = true;
s_renderer = std::thread([] {
s_renderer = std::jthread([](std::stop_token stop_token) {
BT_SetTerminate();
m_sampler_linear.create();
@@ -922,7 +924,7 @@ void NodeStrokePreview::draw_stroke()
pp::renderer::gl::linear_mipmap_linear_texture_filter(),
pp::renderer::gl::linear_texture_filter());
m_brush_shape.create();
while (s_running)
while (s_running && !stop_token.stop_requested())
{
auto node = s_queue.Get();
if (node)
@@ -970,9 +972,10 @@ void NodeStrokePreview::draw_stroke()
m_tex_dual.destroy();
m_tex_background.destroy();
m_brush_shape.destroy();
s_running = false;
});
}
s_queue.mutex.unlock();
queue_lock.unlock();
s_queue.PostUnique(std::static_pointer_cast<NodeStrokePreview>(shared_from_this()), m_draw_first);
}