Report depth export readiness in CLI snapshots

This commit is contained in:
2026-06-05 21:09:03 +02:00
parent 3be7171010
commit 875a0127d9
5 changed files with 60 additions and 4 deletions

View File

@@ -280,7 +280,10 @@ powershell -ExecutionPolicy Bypass -File scripts\automation\apple-remote-build.p
snapshots also feed the active frame through the shared `pp_paint_renderer` snapshots also feed the active frame through the shared `pp_paint_renderer`
export-readiness report, reporting texture, transition, command, byte, and export-readiness report, reporting texture, transition, command, byte, and
active-frame payload counts in `rendererUpload` JSON plus `facePngExport` active-frame payload counts in `rendererUpload` JSON plus `facePngExport`
readiness, face count, byte count, and payload count. It is covered by readiness, face count, byte count, and payload count. They also report
`depthExport` readiness from the tested paint-renderer depth plan: pending
snapshots keep it unavailable, and payload-complete snapshots expose the
1024x1024 draw/readback plan counts. It is covered by
`pano_cli_plan_canvas_document_snapshot_smoke` plus the payload-bearing `pano_cli_plan_canvas_document_snapshot_smoke` plus the payload-bearing
snapshot smoke. snapshot smoke.
- Live equirectangular, layer, animation-frame, and cube-face export adapters - Live equirectangular, layer, animation-frame, and cube-face export adapters

View File

@@ -551,6 +551,13 @@ agent or engineer to remove them without reconstructing context from chat.
document snapshot before retained `Canvas::export_depth` runs. The actual document snapshot before retained `Canvas::export_depth` runs. The actual
1024x1024 perspective/depth rendering, readback, worker-thread behavior, and 1024x1024 perspective/depth rendering, readback, worker-thread behavior, and
the legacy `.png` path names carrying JPEG-encoded bytes remain open. the legacy `.png` path names carrying JPEG-encoded bytes remain open.
- 2026-06-05: DEBT-0010/DEBT-0036 were narrowed again.
`pano_cli plan-canvas-document-snapshot` now emits the same depth export
render-plan readiness as the live adapter. Metadata-only snapshots report
depth export unavailable until renderer payload readback is captured;
payload-complete snapshots report the 1024x1024 merged-face and per-layer
depth draw counts while still marking final depth image readback as
renderer-owned.
## Open Debt ## Open Debt

View File

@@ -684,6 +684,11 @@ automation and live export adapters the same document/canvas-to-renderer
readiness boundary before broader writer replacement. Live save writer readiness boundary before broader writer replacement. Live save writer
replacement, export adoption, and renderer-owned readback remain under replacement, export adoption, and renderer-owned readback remain under
`DEBT-0010`/`DEBT-0013`/`DEBT-0036`. `DEBT-0010`/`DEBT-0013`/`DEBT-0036`.
The same CLI snapshot report now emits `depthExport` readiness from
`pp_paint_renderer::plan_document_depth_export_render`: metadata-only snapshots
report pending renderer payload readback, while payload-complete snapshots
report the legacy 1024x1024 depth-render draw plan and still flag the final
3D view/depth image readback as renderer-owned.
Live equirectangular, layer, animation-frame, and cube-face export adapters now Live equirectangular, layer, animation-frame, and cube-face export adapters now
prepare the same payload-bearing document snapshot and shared renderer export prepare the same payload-bearing document snapshot and shared renderer export
readiness report. Cube-face export writes those readiness report. Cube-face export writes those
@@ -2535,7 +2540,10 @@ Results:
through `pp_paint_renderer::prepare_document_frame_export_readiness`, which through `pp_paint_renderer::prepare_document_frame_export_readiness`, which
records the renderer-neutral active-frame texture upload stream and encodes records the renderer-neutral active-frame texture upload stream and encodes
the composited active-frame cube faces as PNG bytes, so agents validate the the composited active-frame cube faces as PNG bytes, so agents validate the
same document/canvas-to-renderer readiness report consumed by live export. same document/canvas-to-renderer readiness report consumed by live export. It
also emits `depthExport` readiness from the paint-renderer depth plan, keeping
CLI automation aligned with the live depth export adapter while final renderer
readback remains retained.
- Live image/collection/cube export adapters now prepare and log the same - Live image/collection/cube export adapters now prepare and log the same
document/canvas plus shared renderer-upload and face-PNG export readiness document/canvas plus shared renderer-upload and face-PNG export readiness
reports. Cube-face export now writes the pure document/renderer PNG bytes to reports. Cube-face export now writes the pure document/renderer PNG bytes to

View File

@@ -1480,13 +1480,13 @@ if(TARGET pano_cli)
COMMAND pano_cli plan-canvas-document-snapshot --width 128 --height 64 --layers 3 --frames 2 --current-layer 2 --current-frame 1 --hidden-layer 0 --alpha-locked-layer 2 --opacity 0.5 --blend-mode 4 --pending-face-payloads-per-layer 6) COMMAND pano_cli plan-canvas-document-snapshot --width 128 --height 64 --layers 3 --frames 2 --current-layer 2 --current-frame 1 --hidden-layer 0 --alpha-locked-layer 2 --opacity 0.5 --blend-mode 4 --pending-face-payloads-per-layer 6)
set_tests_properties(pano_cli_plan_canvas_document_snapshot_smoke PROPERTIES set_tests_properties(pano_cli_plan_canvas_document_snapshot_smoke PROPERTIES
LABELS "app;document;integration;desktop-fast" LABELS "app;document;integration;desktop-fast"
PASS_REGULAR_EXPRESSION "\"command\":\"plan-canvas-document-snapshot\".*\"width\":128.*\"height\":64.*\"layers\":3.*\"frames\":2.*\"activeLayer\":2.*\"activeFrame\":1.*\"activeLayerName\":\"Layer 3\".*\"activeLayerOpacity\":0.5.*\"activeLayerBlend\":\"overlay\".*\"activeLayerAlphaLocked\":true.*\"pendingFacePayloads\":18.*\"metadataOnly\":true.*\"requiresRendererPayloadReadback\":true.*\"documentFacePayloads\":0.*\"saveReport\":\\{\"payloadComplete\":false,\"canExportPpi\":false\\}.*\"ppiExport\":\\{\"ready\":false,\"bytes\":0,\"dirtyFaces\":0\\}.*\"rendererUpload\":\\{\"ready\":false,\"textures\":0,\"bytes\":0,\"transitions\":0,\"facePayloads\":0,\"compositedLayerFaces\":0,\"commands\":0,\"uploadCommands\":0,\"transitionCommands\":0\\}.*\"facePngExport\":\\{\"ready\":false,\"faces\":0,\"bytes\":0,\"facePayloads\":0\\}") PASS_REGULAR_EXPRESSION "\"command\":\"plan-canvas-document-snapshot\".*\"width\":128.*\"height\":64.*\"layers\":3.*\"frames\":2.*\"activeLayer\":2.*\"activeFrame\":1.*\"activeLayerName\":\"Layer 3\".*\"activeLayerOpacity\":0.5.*\"activeLayerBlend\":\"overlay\".*\"activeLayerAlphaLocked\":true.*\"pendingFacePayloads\":18.*\"metadataOnly\":true.*\"requiresRendererPayloadReadback\":true.*\"documentFacePayloads\":0.*\"saveReport\":\\{\"payloadComplete\":false,\"canExportPpi\":false\\}.*\"ppiExport\":\\{\"ready\":false,\"bytes\":0,\"dirtyFaces\":0\\}.*\"rendererUpload\":\\{\"ready\":false,\"textures\":0,\"bytes\":0,\"transitions\":0,\"facePayloads\":0,\"compositedLayerFaces\":0,\"commands\":0,\"uploadCommands\":0,\"transitionCommands\":0\\}.*\"facePngExport\":\\{\"ready\":false,\"faces\":0,\"bytes\":0,\"facePayloads\":0\\}.*\"depthExport\":\\{\"ready\":false,\"width\":0,\"height\":0,\"mergedFaceDraws\":0,\"layerDepthDraws\":0,\"visitedLayers\":0,\"visibleLayers\":0,\"facePayloads\":0,\"requiresRendererReadback\":true\\}")
add_test(NAME pano_cli_plan_canvas_document_snapshot_payload_smoke add_test(NAME pano_cli_plan_canvas_document_snapshot_payload_smoke
COMMAND pano_cli plan-canvas-document-snapshot --width 128 --height 64 --layers 2 --frames 2 --current-layer 1 --current-frame 1 --pending-face-payloads-per-layer 2 --captured-face-payloads-per-layer 2) COMMAND pano_cli plan-canvas-document-snapshot --width 128 --height 64 --layers 2 --frames 2 --current-layer 1 --current-frame 1 --pending-face-payloads-per-layer 2 --captured-face-payloads-per-layer 2)
set_tests_properties(pano_cli_plan_canvas_document_snapshot_payload_smoke PROPERTIES set_tests_properties(pano_cli_plan_canvas_document_snapshot_payload_smoke PROPERTIES
LABELS "app;document;integration;desktop-fast" LABELS "app;document;integration;desktop-fast"
PASS_REGULAR_EXPRESSION "\"command\":\"plan-canvas-document-snapshot\".*\"layers\":2.*\"frames\":2.*\"activeLayer\":1.*\"activeFrame\":1.*\"pendingFacePayloads\":4.*\"capturedFacePayloads\":4.*\"metadataOnly\":false.*\"requiresRendererPayloadReadback\":false.*\"documentFacePayloads\":4.*\"saveReport\":\\{\"payloadComplete\":true,\"canExportPpi\":true\\}.*\"ppiExport\":\\{\"ready\":true,\"bytes\":[1-9][0-9]*,\"dirtyFaces\":4\\}.*\"rendererUpload\":\\{\"ready\":true,\"textures\":6,\"bytes\":[1-9][0-9]*,\"transitions\":6,\"facePayloads\":2,\"compositedLayerFaces\":2,\"commands\":12,\"uploadCommands\":6,\"transitionCommands\":6\\}.*\"facePngExport\":\\{\"ready\":true,\"faces\":6,\"bytes\":[1-9][0-9]*,\"facePayloads\":2\\}") PASS_REGULAR_EXPRESSION "\"command\":\"plan-canvas-document-snapshot\".*\"layers\":2.*\"frames\":2.*\"activeLayer\":1.*\"activeFrame\":1.*\"pendingFacePayloads\":4.*\"capturedFacePayloads\":4.*\"metadataOnly\":false.*\"requiresRendererPayloadReadback\":false.*\"documentFacePayloads\":4.*\"saveReport\":\\{\"payloadComplete\":true,\"canExportPpi\":true\\}.*\"ppiExport\":\\{\"ready\":true,\"bytes\":[1-9][0-9]*,\"dirtyFaces\":4\\}.*\"rendererUpload\":\\{\"ready\":true,\"textures\":6,\"bytes\":[1-9][0-9]*,\"transitions\":6,\"facePayloads\":2,\"compositedLayerFaces\":2,\"commands\":12,\"uploadCommands\":6,\"transitionCommands\":6\\}.*\"facePngExport\":\\{\"ready\":true,\"faces\":6,\"bytes\":[1-9][0-9]*,\"facePayloads\":2\\}.*\"depthExport\":\\{\"ready\":true,\"width\":1024,\"height\":1024,\"mergedFaceDraws\":6,\"layerDepthDraws\":2,\"visitedLayers\":2,\"visibleLayers\":1,\"facePayloads\":2,\"requiresRendererReadback\":true\\}")
add_test(NAME pano_cli_plan_canvas_document_snapshot_no_canvas add_test(NAME pano_cli_plan_canvas_document_snapshot_no_canvas
COMMAND pano_cli plan-canvas-document-snapshot --no-canvas) COMMAND pano_cli plan-canvas-document-snapshot --no-canvas)

View File

@@ -6011,6 +6011,15 @@ int plan_canvas_document_snapshot(int argc, char** argv)
std::size_t face_png_export_faces = 0; std::size_t face_png_export_faces = 0;
std::uint64_t face_png_export_bytes = 0; std::uint64_t face_png_export_bytes = 0;
std::size_t face_png_export_payloads = 0; std::size_t face_png_export_payloads = 0;
bool depth_export_ready = false;
std::uint32_t depth_export_width = 0;
std::uint32_t depth_export_height = 0;
std::size_t depth_export_merged_face_draws = 0;
std::size_t depth_export_layer_depth_draws = 0;
std::size_t depth_export_visited_layers = 0;
std::size_t depth_export_visible_layers = 0;
std::size_t depth_export_face_payloads = 0;
bool depth_export_requires_renderer_readback = value.requires_renderer_payload_readback;
if (save_report.can_export_ppi) { if (save_report.can_export_ppi) {
const auto exported = pp::app::export_document_canvas_save_snapshot_to_ppi(value); const auto exported = pp::app::export_document_canvas_save_snapshot_to_ppi(value);
if (!exported) { if (!exported) {
@@ -6054,6 +6063,26 @@ int plan_canvas_document_snapshot(int argc, char** argv)
face_png_export_faces = readiness.value().face_pngs.face_count; face_png_export_faces = readiness.value().face_pngs.face_count;
face_png_export_bytes = readiness.value().face_pngs.encoded_bytes; face_png_export_bytes = readiness.value().face_pngs.encoded_bytes;
face_png_export_payloads = readiness.value().face_pngs.composite.face_payload_count; face_png_export_payloads = readiness.value().face_pngs.composite.face_payload_count;
const auto depth_plan = pp::paint_renderer::plan_document_depth_export_render(
pp::paint_renderer::DocumentDepthExportRenderPlanRequest {
.document = &document,
.frame_index = document.active_frame_index(),
});
if (!depth_plan) {
print_error("plan-canvas-document-snapshot", depth_plan.status().message);
return 2;
}
depth_export_ready = true;
depth_export_width = depth_plan.value().output_extent.width;
depth_export_height = depth_plan.value().output_extent.height;
depth_export_merged_face_draws = depth_plan.value().merged_face_draw_count;
depth_export_layer_depth_draws = depth_plan.value().layer_depth_draw_count;
depth_export_visited_layers = depth_plan.value().visited_layer_count;
depth_export_visible_layers = depth_plan.value().visible_layer_count;
depth_export_face_payloads = depth_plan.value().face_payload_count;
depth_export_requires_renderer_readback = depth_plan.value().requires_renderer_readback;
} }
std::cout << "{\"ok\":true,\"command\":\"plan-canvas-document-snapshot\"" std::cout << "{\"ok\":true,\"command\":\"plan-canvas-document-snapshot\""
@@ -6098,6 +6127,15 @@ int plan_canvas_document_snapshot(int argc, char** argv)
<< ",\"faces\":" << face_png_export_faces << ",\"faces\":" << face_png_export_faces
<< ",\"bytes\":" << face_png_export_bytes << ",\"bytes\":" << face_png_export_bytes
<< ",\"facePayloads\":" << face_png_export_payloads << ",\"facePayloads\":" << face_png_export_payloads
<< "},\"depthExport\":{\"ready\":" << json_bool(depth_export_ready)
<< ",\"width\":" << depth_export_width
<< ",\"height\":" << depth_export_height
<< ",\"mergedFaceDraws\":" << depth_export_merged_face_draws
<< ",\"layerDepthDraws\":" << depth_export_layer_depth_draws
<< ",\"visitedLayers\":" << depth_export_visited_layers
<< ",\"visibleLayers\":" << depth_export_visible_layers
<< ",\"facePayloads\":" << depth_export_face_payloads
<< ",\"requiresRendererReadback\":" << json_bool(depth_export_requires_renderer_readback)
<< "}" << "}"
<< "}}\n"; << "}}\n";
return 0; return 0;