Render captured canvas snapshots through renderer boundary

This commit is contained in:
2026-06-05 18:31:39 +02:00
parent ba5c3069e1
commit 9cafc39788
6 changed files with 78 additions and 8 deletions

View File

@@ -5998,6 +5998,15 @@ int plan_canvas_document_snapshot(int argc, char** argv)
bool ppi_export_ready = false;
std::size_t ppi_export_bytes = 0;
std::uint32_t ppi_export_dirty_faces = 0;
bool renderer_upload_ready = false;
std::size_t renderer_texture_count = 0;
std::size_t renderer_transition_count = 0;
std::uint64_t renderer_uploaded_bytes = 0;
std::size_t renderer_face_payloads = 0;
std::size_t renderer_composited_layer_faces = 0;
std::size_t renderer_command_count = 0;
std::size_t renderer_upload_command_count = 0;
std::size_t renderer_transition_command_count = 0;
if (save_report.can_export_ppi) {
const auto exported = pp::app::export_document_canvas_save_snapshot_to_ppi(value);
if (!exported) {
@@ -6014,6 +6023,37 @@ int plan_canvas_document_snapshot(int argc, char** argv)
ppi_export_ready = true;
ppi_export_bytes = exported.value().bytes.size();
ppi_export_dirty_faces = decoded.value().project.body.summary.dirty_face_count;
constexpr pp::paint::Rgba clear_color {};
pp::renderer::RecordingRenderDevice render_device;
const auto uploaded = pp::paint_renderer::upload_document_frame_faces(
render_device,
pp::paint_renderer::DocumentFrameUploadRequest {
.document = &document,
.frame_index = document.active_frame_index(),
.clear_color = clear_color,
});
if (!uploaded) {
print_error("plan-canvas-document-snapshot", uploaded.status().message);
return 2;
}
renderer_upload_ready = true;
renderer_texture_count = uploaded.value().texture_count;
renderer_transition_count = uploaded.value().transition_count;
renderer_uploaded_bytes = uploaded.value().uploaded_bytes;
renderer_face_payloads = uploaded.value().composite.face_payload_count;
renderer_composited_layer_faces = uploaded.value().composite.composited_layer_face_count;
const auto commands = render_device.commands();
renderer_command_count = commands.size();
for (const auto& command : commands) {
if (command.kind == pp::renderer::RecordedRenderCommandKind::upload_texture) {
++renderer_upload_command_count;
}
if (command.kind == pp::renderer::RecordedRenderCommandKind::transition_texture) {
++renderer_transition_command_count;
}
}
}
std::cout << "{\"ok\":true,\"command\":\"plan-canvas-document-snapshot\""
@@ -6045,6 +6085,15 @@ int plan_canvas_document_snapshot(int argc, char** argv)
<< "},\"ppiExport\":{\"ready\":" << json_bool(ppi_export_ready)
<< ",\"bytes\":" << ppi_export_bytes
<< ",\"dirtyFaces\":" << ppi_export_dirty_faces
<< "},\"rendererUpload\":{\"ready\":" << json_bool(renderer_upload_ready)
<< ",\"textures\":" << renderer_texture_count
<< ",\"bytes\":" << renderer_uploaded_bytes
<< ",\"transitions\":" << renderer_transition_count
<< ",\"facePayloads\":" << renderer_face_payloads
<< ",\"compositedLayerFaces\":" << renderer_composited_layer_faces
<< ",\"commands\":" << renderer_command_count
<< ",\"uploadCommands\":" << renderer_upload_command_count
<< ",\"transitionCommands\":" << renderer_transition_command_count
<< "}"
<< "}}\n";
return 0;