Isolate draw merge background shader setup
This commit is contained in:
@@ -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.
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
64
src/legacy_canvas_draw_merge_services.h
Normal file
64
src/legacy_canvas_draw_merge_services.h
Normal 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
|
||||||
Reference in New Issue
Block a user