Reduce retained stroke preview helper surface

This commit is contained in:
2026-06-15 19:28:29 +02:00
parent 565564c061
commit e1e686d3f7
7 changed files with 245 additions and 474 deletions

View File

@@ -92,24 +92,6 @@ struct LegacyNodeStrokePreviewMixPassRequest {
int blend_mode = 0;
};
struct LegacyNodeStrokePreviewMixExecutionRequest {
LegacyNodeStrokePreviewMixPassPlan::ShaderPlan shader {};
int mixer_width = 0;
int mixer_height = 0;
int scissor_x = 0;
int scissor_y = 0;
int scissor_width = 0;
int scissor_height = 0;
std::function<void()> save_state;
std::function<void(const LegacyNodeStrokePreviewMixPassPlan::ShaderPlan&)> setup_mix_shader;
std::function<void()> bind_mixer_framebuffer;
std::function<void(int, int, int, int, int, int)> configure_mix_target_state;
std::function<void()> bind_mix_inputs;
std::function<void()> draw_mix;
std::function<void()> unbind_mixer_framebuffer;
std::function<void()> restore_state;
};
[[nodiscard]] inline LegacyNodeStrokePreviewMixPassPlan plan_legacy_node_stroke_preview_mix_pass(
const LegacyNodeStrokePreviewMixPassRequest& request) noexcept
{
@@ -153,80 +135,6 @@ struct LegacyNodeStrokePreviewMixExecutionRequest {
return plan;
}
[[nodiscard]] inline bool execute_legacy_node_stroke_preview_mix_pass(
const LegacyNodeStrokePreviewMixExecutionRequest& request)
{
if (request.mixer_width <= 0 ||
request.mixer_height <= 0 ||
!request.save_state ||
!request.setup_mix_shader ||
!request.bind_mixer_framebuffer ||
!request.configure_mix_target_state ||
!request.bind_mix_inputs ||
!request.draw_mix ||
!request.unbind_mixer_framebuffer ||
!request.restore_state) {
return false;
}
request.save_state();
request.setup_mix_shader(request.shader);
request.bind_mixer_framebuffer();
request.configure_mix_target_state(
request.mixer_width,
request.mixer_height,
request.scissor_x,
request.scissor_y,
request.scissor_width,
request.scissor_height);
request.bind_mix_inputs();
request.draw_mix();
request.unbind_mixer_framebuffer();
request.restore_state();
return true;
}
struct LegacyNodeStrokePreviewPassSequenceRequest {
bool dual_pass_enabled = false;
std::function<void()> prepare_dual_pass;
std::function<void()> execute_dual_pass;
std::function<void()> capture_background;
std::function<void()> prepare_main_pass;
std::function<void()> execute_main_pass;
std::function<void()> finish_main_pass;
std::function<void()> execute_final_composite;
std::function<void()> copy_preview_result;
};
[[nodiscard]] inline bool execute_legacy_node_stroke_preview_pass_sequence(
const LegacyNodeStrokePreviewPassSequenceRequest& request)
{
if (!request.capture_background ||
!request.prepare_main_pass ||
!request.execute_main_pass ||
!request.finish_main_pass ||
!request.execute_final_composite ||
!request.copy_preview_result) {
return false;
}
if (request.dual_pass_enabled) {
if (!request.prepare_dual_pass || !request.execute_dual_pass) {
return false;
}
request.prepare_dual_pass();
request.execute_dual_pass();
}
request.capture_background();
request.prepare_main_pass();
request.execute_main_pass();
request.finish_main_pass();
request.execute_final_composite();
request.copy_preview_result();
return true;
}
struct LegacyNodeStrokePreviewPassOrchestrationPlan {
pp::paint_renderer::CanvasStrokeFeedbackPlan feedback {};
pp::paint_renderer::CanvasStrokeMaterialPlan material {};
@@ -244,69 +152,6 @@ struct LegacyNodeStrokePreviewMainPassTextureDispatch {
std::function<void()> bind_mixer;
};
struct LegacyNodeStrokePreviewFinalCompositeRequest {
glm::vec2 resolution {};
glm::vec2 pattern_scale {};
const Brush* brush = nullptr;
const pp::paint_renderer::CanvasStrokeCompositePassPlan* composite_pass = nullptr;
std::function<void()> setup_composite_shader;
std::function<void()> bind_composite_samplers;
std::function<void()> bind_composite_inputs;
std::function<void()> draw_composite;
};
[[nodiscard]] inline bool execute_legacy_node_stroke_preview_final_composite(
const LegacyNodeStrokePreviewFinalCompositeRequest& request)
{
if (!request.brush ||
!request.composite_pass ||
!request.setup_composite_shader ||
!request.bind_composite_samplers ||
!request.bind_composite_inputs ||
!request.draw_composite) {
return false;
}
pp::panopainter::execute_legacy_stroke_preview_final_composite(
[&] {
request.setup_composite_shader();
},
[&] {
request.bind_composite_samplers();
},
[&] {
request.bind_composite_inputs();
},
[&] {
request.draw_composite();
});
return true;
}
struct LegacyNodeStrokePreviewCopyResultRequest {
Texture2D* preview_texture = nullptr;
glm::vec2 size {};
std::function<void(int, int, int, int, int, int)> copy_framebuffer_to_texture;
};
[[nodiscard]] inline bool copy_legacy_node_stroke_preview_result(
const LegacyNodeStrokePreviewCopyResultRequest& request)
{
if (!request.preview_texture || !request.copy_framebuffer_to_texture) {
return false;
}
pp::panopainter::copy_legacy_stroke_preview_texture(
[&] {
request.preview_texture->bind();
},
request.copy_framebuffer_to_texture,
pp::panopainter::LegacyStrokePreviewCopySize {
.width = static_cast<int>(request.size.x),
.height = static_cast<int>(request.size.y),
});
return true;
}
[[nodiscard]] inline LegacyNodeStrokePreviewMainPassTextureDispatch make_legacy_node_stroke_preview_main_pass_texture_dispatch(
std::function<void(int)> activate_texture_unit,
std::function<void()> bind_brush_tip,