Prepare renderer snapshots before legacy exports
This commit is contained in:
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user