Own preview and recording workers
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user