diff --git a/docs/modernization/tasks.md b/docs/modernization/tasks.md index 4cf3ae0..927ee80 100644 --- a/docs/modernization/tasks.md +++ b/docs/modernization/tasks.md @@ -1356,6 +1356,7 @@ ctest --preset desktop-fast --build-config Debug -R "pp_paint_renderer_composito | Date | Task | Score | Validation | Commit | | --- | --- | ---: | --- | --- | +| 2026-06-13 | STR-016 | +1 renderer boundary and OpenGL parity | `ctest --preset desktop-fast --build-config Debug -R "pp_paint_renderer_compositor|pp_paint_renderer_stroke_execution" --output-on-failure` | `pending` | | 2026-06-13 | STR-016 | +2 renderer boundary and OpenGL parity | `ctest --preset desktop-fast --build-config Debug -R "pp_paint_renderer_compositor|pp_paint_renderer_stroke_execution" --output-on-failure` | `pending` | ### Completed Task Log diff --git a/tests/paint_renderer/compositor_tests.cpp b/tests/paint_renderer/compositor_tests.cpp index e100c5d..6ab2448 100644 --- a/tests/paint_renderer/compositor_tests.cpp +++ b/tests/paint_renderer/compositor_tests.cpp @@ -3139,6 +3139,38 @@ void canvas_blend_gate_preserves_legacy_fallbacks(pp::tests::Harness& h) } } +void canvas_blend_gate_combines_layer_and_stroke_complexity(pp::tests::Harness& h) +{ + const std::vector layer_blend_modes { 0, 4, 0 }; + const auto plan = plan_canvas_blend_gate( + RenderDeviceFeatures { .framebuffer_fetch = true, .texture_copy = true, .render_target_blit = true }, + CanvasBlendGateRequest { + .extent = Extent2D { .width = 64, .height = 32 }, + .layer_blend_modes = layer_blend_modes, + .has_stroke_blend_mode = true, + .stroke_blend_mode = 10, + .dual_brush_blend = true, + .pattern_blend = true, + }); + + PP_EXPECT(h, plan); + if (!plan) { + return; + } + + PP_EXPECT(h, plan.value().shader_blend); + PP_EXPECT(h, plan.value().complex_blend); + PP_EXPECT(h, plan.value().stroke_complex); + PP_EXPECT(h, plan.value().dual_brush_complex); + PP_EXPECT(h, plan.value().pattern_complex); + PP_EXPECT(h, plan.value().first_complex_layer_index == 1); + PP_EXPECT(h, plan.value().reads_destination_color); + PP_EXPECT(h, plan.value().requires_auxiliary_texture); + PP_EXPECT(h, plan.value().requires_texture_copy); + PP_EXPECT(h, plan.value().requires_render_target_blit); + PP_EXPECT(h, plan.value().path == StrokeCompositePath::framebuffer_fetch); +} + void plans_canvas_stroke_feedback_paths(pp::tests::Harness& h) { const Extent2D extent { .width = 32, .height = 16 }; @@ -3498,6 +3530,7 @@ int main() legacy_node_stroke_preview_pass_orchestration_plan_preserves_feedback_material_and_composite_inputs); harness.run("plans_canvas_blend_gate_from_persisted_indices", plans_canvas_blend_gate_from_persisted_indices); harness.run("canvas_blend_gate_preserves_legacy_fallbacks", canvas_blend_gate_preserves_legacy_fallbacks); + harness.run("canvas_blend_gate_combines_layer_and_stroke_complexity", canvas_blend_gate_combines_layer_and_stroke_complexity); harness.run("plans_canvas_stroke_feedback_paths", plans_canvas_stroke_feedback_paths); harness.run("canvas_stroke_feedback_preserves_legacy_fallback", canvas_stroke_feedback_preserves_legacy_fallback); harness.run("plans_canvas_stroke_rasterization_boundary", plans_canvas_stroke_rasterization_boundary);