Prepare renderer snapshots before legacy exports

This commit is contained in:
2026-06-05 18:38:45 +02:00
parent 9cafc39788
commit 81898a5dcc
5 changed files with 111 additions and 7 deletions

View File

@@ -3,6 +3,9 @@
#include "legacy_document_export_services.h"
#include "app.h"
#include "legacy_document_canvas_services.h"
#include "paint_renderer/compositor.h"
#include "renderer_api/recording_renderer.h"
#include <string>
#include <thread>
@@ -19,6 +22,76 @@ void show_export_success_dialog(
}
}
pp::foundation::Status prepare_legacy_document_export_snapshot(App& app, const char* context)
{
auto snapshot = capture_legacy_canvas_document_payload_snapshot(app);
if (!snapshot) {
LOG("%s document export snapshot failed: %s", context, snapshot.status().message);
return snapshot.status();
}
const auto report = pp::app::make_document_canvas_save_snapshot_report(snapshot.value());
LOG(
"%s document export snapshot: %ux%u layers=%zu frames=%zu capturedFaces=%zu pendingFaces=%zu ppiReady=%s",
context,
report.width,
report.height,
report.layer_count,
report.frame_count,
report.captured_face_payloads,
report.pending_face_payloads,
report.can_export_ppi ? "true" : "false");
if (!report.can_export_ppi) {
return pp::foundation::Status::success();
}
pp::renderer::RecordingRenderDevice render_device;
const auto uploaded = pp::paint_renderer::upload_document_frame_faces(
render_device,
pp::paint_renderer::DocumentFrameUploadRequest {
.document = &snapshot.value().document,
.frame_index = snapshot.value().document.active_frame_index(),
.clear_color = {},
});
if (!uploaded) {
LOG("%s document export renderer upload failed: %s", context, uploaded.status().message);
return uploaded.status();
}
std::size_t upload_commands = 0;
std::size_t transition_commands = 0;
const auto commands = render_device.commands();
for (const auto& command : commands) {
if (command.kind == pp::renderer::RecordedRenderCommandKind::upload_texture) {
++upload_commands;
}
if (command.kind == pp::renderer::RecordedRenderCommandKind::transition_texture) {
++transition_commands;
}
}
LOG(
"%s document export renderer upload: textures=%zu bytes=%llu transitions=%zu facePayloads=%zu commands=%zu uploadCommands=%zu transitionCommands=%zu",
context,
uploaded.value().texture_count,
static_cast<unsigned long long>(uploaded.value().uploaded_bytes),
uploaded.value().transition_count,
uploaded.value().composite.face_payload_count,
commands.size(),
upload_commands,
transition_commands);
return pp::foundation::Status::success();
}
void prepare_legacy_document_export_snapshot_or_continue(App& app, const char* context)
{
const auto status = prepare_legacy_document_export_snapshot(app, context);
if (!status.ok()) {
LOG("%s document export snapshot bridge retained legacy export after failure: %s", context, status.message);
}
}
class LegacyDocumentExportServices final : public pp::app::DocumentExportServices {
public:
explicit LegacyDocumentExportServices(App& app) noexcept
@@ -34,6 +107,7 @@ public:
void export_equirectangular(const pp::app::DocumentExportFileTarget& target) override
{
auto* app = &app_;
prepare_legacy_document_export_snapshot_or_continue(app_, "export-equirectangular");
app_.canvas->m_canvas->export_equirectangular(target.path, [app, target] {
#if __WEB__
app->ui_task([app, target] {
@@ -54,6 +128,7 @@ public:
void export_layers_to_stem(const pp::app::DocumentExportStemTarget& target) override
{
auto* app = &app_;
prepare_legacy_document_export_snapshot_or_continue(app_, "export-layers");
app_.canvas->m_canvas->export_layers(target.stem_path, [app, target] {
show_export_success_dialog(
*app,
@@ -67,6 +142,7 @@ public:
void export_layers_to_collection(const pp::app::DocumentExportCollectionTarget& target) override
{
auto* app = &app_;
prepare_legacy_document_export_snapshot_or_continue(app_, "export-layers");
app_.canvas->m_canvas->export_layers(target.stem_path, [app] {
show_export_success_dialog(
*app,
@@ -79,6 +155,7 @@ public:
void export_animation_frames_to_stem(const pp::app::DocumentExportStemTarget& target) override
{
auto* app = &app_;
prepare_legacy_document_export_snapshot_or_continue(app_, "export-animation-frames");
app_.canvas->m_canvas->export_anim_frames(target.stem_path, [app, target] {
show_export_success_dialog(
*app,
@@ -92,6 +169,7 @@ public:
void export_animation_frames_to_collection(const pp::app::DocumentExportCollectionTarget& target) override
{
auto* app = &app_;
prepare_legacy_document_export_snapshot_or_continue(app_, "export-animation-frames");
app_.canvas->m_canvas->export_anim_frames(target.stem_path, [app] {
show_export_success_dialog(
*app,
@@ -117,6 +195,7 @@ public:
void export_cube_faces(std::string_view document_name) override
{
auto* app = &app_;
prepare_legacy_document_export_snapshot_or_continue(app_, "export-cube-faces");
app_.canvas->m_canvas->export_cube_faces(std::string(document_name), [app] {
show_export_success_dialog(
*app,