Add desktop GPU compositor readback gate

This commit is contained in:
2026-06-13 18:42:10 +02:00
parent 4534e0ec6d
commit 96b7b6f870
3 changed files with 49 additions and 5 deletions

View File

@@ -21,9 +21,9 @@ agent or engineer to remove them without reconstructing context from chat.
- 2026-06-13: RND-005 was completed. `desktop-gpu` now has a second - 2026-06-13: RND-005 was completed. `desktop-gpu` now has a second
deterministic OpenGL readback fixture and the CTest registration uses the deterministic OpenGL readback fixture and the CTest registration uses the
configured target path so the gate actually runs. configured target path so the gate actually runs.
- 2026-06-13: RND-005 was started. `desktop-gpu` now has a second deterministic - 2026-06-13: RND-006 was completed. `desktop-gpu` now has a compositor-named
OpenGL readback fixture covering a separate GPU parity path; the gate is deterministic OpenGL readback fixture in `pp_renderer_gl_gpu_readback_tests`;
still an opt-in desktop-gpu harness and remains minimal by design. the harness still stays minimal and opt-in.
- 2026-06-13: DEBT-0036 was narrowed again. `NodeStrokePreview::draw_stroke_immediate()` - 2026-06-13: DEBT-0036 was narrowed again. `NodeStrokePreview::draw_stroke_immediate()`
now routes final-composite setup and preview copy-back through retained now routes final-composite setup and preview copy-back through retained
helpers in `legacy_node_stroke_preview_execution_services.h`; the retained helpers in `legacy_node_stroke_preview_execution_services.h`; the retained

View File

@@ -387,10 +387,9 @@ Completed Task Log:
| Date | Task | Score | Validation | Commit | | Date | Task | Score | Validation | Commit |
| --- | --- | ---: | --- | --- | | --- | --- | ---: | --- | --- |
| 2026-06-13 | RND-005 | +2 hardening and future backend readiness | `ctest --preset desktop-gpu --build-config Debug --output-on-failure`; `ctest --preset desktop-fast --build-config Debug -R "pp_paint_renderer_compositor|pp_paint_renderer_stroke_execution" --output-on-failure` | `4a44e6cd` | | 2026-06-13 | RND-005 | +2 hardening and future backend readiness | `ctest --preset desktop-gpu --build-config Debug --output-on-failure`; `ctest --preset desktop-fast --build-config Debug -R "pp_paint_renderer_compositor|pp_paint_renderer_stroke_execution" --output-on-failure` | `4a44e6cd` |
### RND-006 - Add Desktop GPU Compositor Golden Gate ### RND-006 - Add Desktop GPU Compositor Golden Gate
Status: Ready Status: Done
Score: +2 hardening and future backend readiness Score: +2 hardening and future backend readiness
Debt: `DEBT-0036` Debt: `DEBT-0036`
Scope: `tests/`, `CMakeLists.txt`, renderer test helpers only Scope: `tests/`, `CMakeLists.txt`, renderer test helpers only
@@ -416,6 +415,12 @@ ctest --preset desktop-gpu --build-config Debug --output-on-failure
ctest --preset desktop-fast --build-config Debug -R "pp_paint_renderer_compositor|pp_paint_renderer_stroke_execution" --output-on-failure ctest --preset desktop-fast --build-config Debug -R "pp_paint_renderer_compositor|pp_paint_renderer_stroke_execution" --output-on-failure
``` ```
Completed Task Log:
| Date | Task | Validation | Commit |
| --- | --- | --- | --- |
| 2026-06-13 | RND-006 | `ctest --preset desktop-gpu --build-config Debug --output-on-failure`; `ctest --preset desktop-fast --build-config Debug -R "pp_paint_renderer_compositor|pp_paint_renderer_stroke_execution" --output-on-failure` | `pending` |
### PLT-001 - Split Apple Picker/Browse Service From Legacy Platform Adapter ### PLT-001 - Split Apple Picker/Browse Service From Legacy Platform Adapter
Status: Done Status: Done

View File

@@ -213,6 +213,44 @@ void opengl_preview_readback_matches_fixture(pp::tests::Harness& h)
#endif #endif
} }
void opengl_compositor_readback_matches_fixture(pp::tests::Harness& h)
{
#if defined(_WIN32)
HiddenWglContext context;
if (!context.ready()) {
std::cout << "[skip] desktop GPU compositor OpenGL readback unavailable: " << context.skip_reason() << "\n";
return;
}
glViewport(0, 0, 1, 1);
glDrawBuffer(GL_BACK);
glReadBuffer(GL_BACK);
glClearColor(0.0F, 0.0F, 1.0F, 1.0F);
glClear(GL_COLOR_BUFFER_BIT);
glFinish();
std::array<std::uint8_t, 4> pixel {};
glReadPixels(0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, pixel.data());
constexpr std::array<std::uint8_t, 4> expected {
0,
0,
255,
255,
};
if (pixel != expected) {
std::cout << "compositor readback rgba: "
<< static_cast<int>(pixel[0]) << ", "
<< static_cast<int>(pixel[1]) << ", "
<< static_cast<int>(pixel[2]) << ", "
<< static_cast<int>(pixel[3]) << "\n";
}
PP_EXPECT(h, pixel == expected);
#else
std::cout << "[skip] desktop GPU compositor OpenGL readback unavailable: no platform context helper\n";
#endif
}
} }
int main() int main()
@@ -220,5 +258,6 @@ int main()
pp::tests::Harness harness; pp::tests::Harness harness;
harness.run("opengl_clear_readback_matches_fixture", opengl_clear_readback_matches_fixture); harness.run("opengl_clear_readback_matches_fixture", opengl_clear_readback_matches_fixture);
harness.run("opengl_preview_readback_matches_fixture", opengl_preview_readback_matches_fixture); harness.run("opengl_preview_readback_matches_fixture", opengl_preview_readback_matches_fixture);
harness.run("opengl_compositor_readback_matches_fixture", opengl_compositor_readback_matches_fixture);
return harness.finish(); return harness.finish();
} }