Isolate draw merge background shader setup

This commit is contained in:
2026-06-13 04:59:48 +02:00
parent a9d3c63ee0
commit 65d084ad8e
4 changed files with 89 additions and 9 deletions

View File

@@ -18,6 +18,11 @@ agent or engineer to remove them without reconstructing context from chat.
## Recent Reductions ## 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 - 2026-06-13: DEBT-0036 was narrowed again. `Canvas::layer_merge` now reuses
`legacy_canvas_stroke_composite_services.h` for retained layer-merge `legacy_canvas_stroke_composite_services.h` for retained layer-merge
`kShader::CompDraw` binding and source/destination blend uniform writes. `kShader::CompDraw` binding and source/destination blend uniform writes.

View File

@@ -2988,6 +2988,10 @@ Results:
for its source-over-destination `CompDraw` uniform setup, while keeping the for its source-over-destination `CompDraw` uniform setup, while keeping the
existing layer dirty mutation, framebuffer copy, texture binding, and draw existing layer dirty mutation, framebuffer copy, texture binding, and draw
order local to the Canvas layer-merge path. 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 - Canvas thumbnail layer blending now uses the same canvas destination-feedback
plan for framebuffer-fetch versus texture-copy decisions; the thumbnail draw plan for framebuffer-fetch versus texture-copy decisions; the thumbnail draw
itself still executes through retained OpenGL canvas code under DEBT-0036. itself still executes through retained OpenGL canvas code under DEBT-0036.

View File

@@ -2,6 +2,7 @@
#include "log.h" #include "log.h"
#include "canvas.h" #include "canvas.h"
#include "app.h" #include "app.h"
#include "legacy_canvas_draw_merge_services.h"
#include "legacy_gl_renderbuffer_dispatch.h" #include "legacy_gl_renderbuffer_dispatch.h"
#include "legacy_canvas_stroke_commit_services.h" #include "legacy_canvas_stroke_commit_services.h"
#include "legacy_canvas_stroke_composite_services.h" #include "legacy_canvas_stroke_composite_services.h"
@@ -1273,9 +1274,11 @@ void Canvas::draw_merge(bool draw_checkerboard, std::array<bool, 6> faces /*= SI
{ {
if (draw_checkerboard) if (draw_checkerboard)
{ {
ShaderManager::use(kShader::Checkerboard); pp::panopainter::setup_legacy_canvas_draw_merge_checkerboard_shader(
ShaderManager::u_int(kShaderUniform::Colorize, false); pp::panopainter::LegacyCanvasDrawMergeCheckerboardUniforms {
ShaderManager::u_mat4(kShaderUniform::MVP, ortho); .mvp = ortho,
.colorize = false,
});
m_plane.draw_fill(); m_plane.draw_fill();
} }
apply_canvas_capability(blend_state(), true); apply_canvas_capability(blend_state(), true);
@@ -1454,9 +1457,11 @@ void Canvas::draw_merge(bool draw_checkerboard, std::array<bool, 6> faces /*= SI
//draw the grid //draw the grid
if (draw_checkerboard) if (draw_checkerboard)
{ {
ShaderManager::use(kShader::Checkerboard); pp::panopainter::setup_legacy_canvas_draw_merge_checkerboard_shader(
ShaderManager::u_int(kShaderUniform::Colorize, false); pp::panopainter::LegacyCanvasDrawMergeCheckerboardUniforms {
ShaderManager::u_mat4(kShaderUniform::MVP, ortho); .mvp = ortho,
.colorize = false,
});
m_plane.draw_fill(); m_plane.draw_fill();
} }
@@ -1464,9 +1469,11 @@ void Canvas::draw_merge(bool draw_checkerboard, std::array<bool, 6> faces /*= SI
m_sampler.bind(0); m_sampler.bind(0);
set_active_texture_unit(0); set_active_texture_unit(0);
m_merge_tex.bind(); m_merge_tex.bind();
ShaderManager::use(kShader::Texture); pp::panopainter::setup_legacy_canvas_draw_merge_texture_shader(
ShaderManager::u_int(kShaderUniform::Tex, 0); pp::panopainter::LegacyCanvasDrawMergeTextureUniforms {
ShaderManager::u_mat4(kShaderUniform::MVP, ortho); .mvp = ortho,
.texture_slot = 0,
});
m_plane.draw_fill(); m_plane.draw_fill();
m_merge_tex.unbind(); m_merge_tex.unbind();
} }

View File

@@ -0,0 +1,64 @@
#pragma once
#include "shader.h"
#include <functional>
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<void(kShader)> use_shader;
std::function<void(kShaderUniform, int)> set_int;
std::function<void(kShaderUniform, const glm::mat4&)> 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