From 65d084ad8e841370ac50200131012834064d96d7 Mon Sep 17 00:00:00 2001 From: omigamedev Date: Sat, 13 Jun 2026 04:59:48 +0200 Subject: [PATCH] Isolate draw merge background shader setup --- docs/modernization/debt.md | 5 ++ docs/modernization/roadmap.md | 4 ++ src/canvas.cpp | 25 ++++++---- src/legacy_canvas_draw_merge_services.h | 64 +++++++++++++++++++++++++ 4 files changed, 89 insertions(+), 9 deletions(-) create mode 100644 src/legacy_canvas_draw_merge_services.h diff --git a/docs/modernization/debt.md b/docs/modernization/debt.md index edfa513..b93e1e6 100644 --- a/docs/modernization/debt.md +++ b/docs/modernization/debt.md @@ -18,6 +18,11 @@ agent or engineer to remove them without reconstructing context from chat. ## Recent Reductions +- 2026-06-13: DEBT-0036 was narrowed again. `Canvas::draw_merge` checkerboard + background shader setup and final merged-texture redraw setup now route + through `legacy_canvas_draw_merge_services.h`. The retained Canvas path still + owns draw-merge layer iteration, blend-gate branching, framebuffer copies, + sampler/texture binding, and draw ordering. - 2026-06-13: DEBT-0036 was narrowed again. `Canvas::layer_merge` now reuses `legacy_canvas_stroke_composite_services.h` for retained layer-merge `kShader::CompDraw` binding and source/destination blend uniform writes. diff --git a/docs/modernization/roadmap.md b/docs/modernization/roadmap.md index ef65be1..c58b4e3 100644 --- a/docs/modernization/roadmap.md +++ b/docs/modernization/roadmap.md @@ -2988,6 +2988,10 @@ Results: for its source-over-destination `CompDraw` uniform setup, while keeping the existing layer dirty mutation, framebuffer copy, texture binding, and draw order local to the Canvas layer-merge path. +- `Canvas::draw_merge` now shares a retained draw-merge shader setup helper for + checkerboard backgrounds and the final merged texture redraw over the grid; + layer traversal, blend destination copies, sampler/texture binding, and draw + ordering remain in the legacy Canvas path. - Canvas thumbnail layer blending now uses the same canvas destination-feedback plan for framebuffer-fetch versus texture-copy decisions; the thumbnail draw itself still executes through retained OpenGL canvas code under DEBT-0036. diff --git a/src/canvas.cpp b/src/canvas.cpp index 21032d0..69677e1 100644 --- a/src/canvas.cpp +++ b/src/canvas.cpp @@ -2,6 +2,7 @@ #include "log.h" #include "canvas.h" #include "app.h" +#include "legacy_canvas_draw_merge_services.h" #include "legacy_gl_renderbuffer_dispatch.h" #include "legacy_canvas_stroke_commit_services.h" #include "legacy_canvas_stroke_composite_services.h" @@ -1273,9 +1274,11 @@ void Canvas::draw_merge(bool draw_checkerboard, std::array faces /*= SI { if (draw_checkerboard) { - ShaderManager::use(kShader::Checkerboard); - ShaderManager::u_int(kShaderUniform::Colorize, false); - ShaderManager::u_mat4(kShaderUniform::MVP, ortho); + pp::panopainter::setup_legacy_canvas_draw_merge_checkerboard_shader( + pp::panopainter::LegacyCanvasDrawMergeCheckerboardUniforms { + .mvp = ortho, + .colorize = false, + }); m_plane.draw_fill(); } apply_canvas_capability(blend_state(), true); @@ -1454,9 +1457,11 @@ void Canvas::draw_merge(bool draw_checkerboard, std::array faces /*= SI //draw the grid if (draw_checkerboard) { - ShaderManager::use(kShader::Checkerboard); - ShaderManager::u_int(kShaderUniform::Colorize, false); - ShaderManager::u_mat4(kShaderUniform::MVP, ortho); + pp::panopainter::setup_legacy_canvas_draw_merge_checkerboard_shader( + pp::panopainter::LegacyCanvasDrawMergeCheckerboardUniforms { + .mvp = ortho, + .colorize = false, + }); m_plane.draw_fill(); } @@ -1464,9 +1469,11 @@ void Canvas::draw_merge(bool draw_checkerboard, std::array faces /*= SI m_sampler.bind(0); set_active_texture_unit(0); m_merge_tex.bind(); - ShaderManager::use(kShader::Texture); - ShaderManager::u_int(kShaderUniform::Tex, 0); - ShaderManager::u_mat4(kShaderUniform::MVP, ortho); + pp::panopainter::setup_legacy_canvas_draw_merge_texture_shader( + pp::panopainter::LegacyCanvasDrawMergeTextureUniforms { + .mvp = ortho, + .texture_slot = 0, + }); m_plane.draw_fill(); m_merge_tex.unbind(); } diff --git a/src/legacy_canvas_draw_merge_services.h b/src/legacy_canvas_draw_merge_services.h new file mode 100644 index 0000000..6f20094 --- /dev/null +++ b/src/legacy_canvas_draw_merge_services.h @@ -0,0 +1,64 @@ +#pragma once + +#include "shader.h" + +#include + +namespace pp::panopainter { + +struct LegacyCanvasDrawMergeCheckerboardUniforms { + glm::mat4 mvp { 1.0f }; + bool colorize = false; +}; + +struct LegacyCanvasDrawMergeTextureUniforms { + glm::mat4 mvp { 1.0f }; + int texture_slot = 0; +}; + +struct LegacyCanvasDrawMergeShaderExecution { + std::function use_shader; + std::function set_int; + std::function set_mat4; +}; + +[[nodiscard]] inline LegacyCanvasDrawMergeShaderExecution legacy_shader_manager_draw_merge_execution() noexcept +{ + return { + .use_shader = [](kShader shader) { ShaderManager::use(shader); }, + .set_int = [](kShaderUniform uniform, int value) { ShaderManager::u_int(uniform, value); }, + .set_mat4 = [](kShaderUniform uniform, const glm::mat4& value) { ShaderManager::u_mat4(uniform, value); }, + }; +} + +inline void setup_legacy_canvas_draw_merge_checkerboard_shader( + const LegacyCanvasDrawMergeCheckerboardUniforms& uniforms, + const LegacyCanvasDrawMergeShaderExecution& execution) noexcept +{ + execution.use_shader(kShader::Checkerboard); + execution.set_int(kShaderUniform::Colorize, uniforms.colorize); + execution.set_mat4(kShaderUniform::MVP, uniforms.mvp); +} + +inline void setup_legacy_canvas_draw_merge_checkerboard_shader( + const LegacyCanvasDrawMergeCheckerboardUniforms& uniforms) +{ + setup_legacy_canvas_draw_merge_checkerboard_shader(uniforms, legacy_shader_manager_draw_merge_execution()); +} + +inline void setup_legacy_canvas_draw_merge_texture_shader( + const LegacyCanvasDrawMergeTextureUniforms& uniforms, + const LegacyCanvasDrawMergeShaderExecution& execution) noexcept +{ + execution.use_shader(kShader::Texture); + execution.set_int(kShaderUniform::Tex, uniforms.texture_slot); + execution.set_mat4(kShaderUniform::MVP, uniforms.mvp); +} + +inline void setup_legacy_canvas_draw_merge_texture_shader( + const LegacyCanvasDrawMergeTextureUniforms& uniforms) +{ + setup_legacy_canvas_draw_merge_texture_shader(uniforms, legacy_shader_manager_draw_merge_execution()); +} + +} // namespace pp::panopainter