Commit Graph
4037 Commits
Author SHA1 Message Date
NetterSilverandClaude Opus 5.5 93487af3b3 Cut serial work from raw development and GPU transfers
- RawImage::develop demosaics only the default crop with AHD when there
  is no OpcodeList3 (ahd_window), instead of demosaicing the margin too
  and then copying the crop out of the full picture on one thread.
- Gpu::upload writes through queue.write_buffer_with and copies into
  the staging buffer in parallel parts. create_buffer_init zeroed a
  staging buffer and then copied over it, two single-threaded passes
  over a full-size photo's ~290 MB.
- finish_and_read copies the mapped readback out in parallel parts (one
  thread read the 91 MB of a 24 MP export at ~2 GB/s, ~45 ms).

Output is byte-identical (ahd_window_is_the_crop_of_the_whole,
uploads_read_back_exactly).

Export of a 24 MP ARW to full-size JPEG (examples/export_bench, 75
interleaved runs each on a shared 16-thread Ryzen):
main 802 ms median / 614 ms min -> this branch 647 / 525 (-19.3% / -14.5%).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-27 15:43:41 +01:00
NetterSilverandClaude Opus 5.5 3ce8dbc55b Drop copies and libm calls from 8-bit export encoding
- finish_8bit/finish_deep hand back the render itself when there is no
  output sharpening and no watermark. Before, every export cloned the
  image (~100 MB at 24 MP) and output_sharpen built a ~290 MB float copy
  of it even for SharpenFor::None, all on one thread.
- Output sharpening's box blurs run row-parallel (par_rows); each pixel
  is computed as before.
- The parallel JPEG encoder converts each band's rows to YCbCr inside the
  band's task instead of first filling whole-image planes (~290 MB for
  4:4:4 at 24 MP, written once and read back).
- fdct_quant rounds with plain arithmetic (round_i16) instead of
  f32::round, a libm call per coefficient without SSE4.1; it equals
  `x.round() as i16` for all 2^32 inputs.

Output is byte-identical (pinned by encoded_bytes_are_pinned and
sharpened_pixels_are_pinned, whose hashes come from main).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-27 15:43:41 +01:00
NetterSilverandClaude Opus 5.5 30d0a37051 Add a single-photo export benchmark
examples/export_bench imports the files given and runs export_photo
(decode, full-size render, encode) N times, forgetting the decoded
original between runs like a batch export does, and prints the median
and minimum wall time. OPT takes export options as app.export JSON,
PHASES=1 times render and encode separately, OUT=dir writes the files
for byte comparisons between builds.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-27 15:43:41 +01:00
skylar taylor-barrick 662df66f1c Preserve queued file drops across dialogs and restore Flatpak sources (#2975) 2026-10-27 03:50:41 +01:00
aiongg c9860ea7a3 Merge pull request #3103 from aiongg/layout
refactor: shared module layout (craft-contrib#20)
2026-10-26 21:31:21 -04:00
aiongg 259208948b test: the format-message scan skips only inline test modules 2026-10-26 21:51:51 +00:00
aiongg 69048937d0 docs: update source paths after the layout moves 2026-10-26 21:39:56 +00:00
aiongg 26760e44d2 refactor(lightcraft-ui-egui): split app.rs into app/ 2026-10-26 21:39:56 +00:00
aiongg cb2a922383 refactor(lightcraft-ui-egui): split lib.rs into crate-root modules 2026-10-26 21:39:56 +00:00
aiongg 20c26b83c8 refactor(lightcraft-ui-egui): split dialogs/import.rs into dialogs/import/ 2026-10-26 21:39:56 +00:00
aiongg b0356787e3 refactor(lightcraft-ui-egui): split dialogs/settings.rs into dialogs/settings/ 2026-10-26 21:39:56 +00:00
aiongg 56494a1308 refactor(lightcraft-ui-egui): split dialogs.rs into dialogs/ 2026-10-26 21:39:56 +00:00
aiongg 0896aa86ce refactor(lightcraft-ui-egui): split state.rs into state/ 2026-10-26 21:39:56 +00:00
aiongg db31bf3e59 refactor(lightcraft-ui-egui): split panels/right.rs into panels/right/ 2026-10-26 21:39:56 +00:00
aiongg 8c194d155e refactor(lightcraft-ui-egui): split panels/edit.rs into panels/edit/ 2026-10-26 21:39:56 +00:00
aiongg 4e13f61ba0 refactor(lightcraft-ui-egui): split panels/left.rs into panels/left/ 2026-10-26 21:39:56 +00:00
aiongg 15ece5cbd0 refactor(lightcraft-ui-egui): split menus.rs into menus/ 2026-10-26 21:39:56 +00:00
aiongg 401e047acc refactor(lightcraft-ui-egui): split panels/detail.rs into panels/detail/ 2026-10-26 21:39:56 +00:00
aiongg 2e5597d48a refactor(lightcraft): split main.rs into crate-root modules 2026-10-26 21:39:56 +00:00
aiongg 59d1d6f0f8 refactor(xtask): point the raw corpus test and ci-quick map at the moved sources 2026-10-26 21:39:56 +00:00
aiongg 27abe75572 refactor(xtask): split main.rs into crate-root modules 2026-10-26 21:39:56 +00:00
aiongg 8d8994ec87 refactor(lightcraft-engine): split cmd/library.rs into cmd/library/ 2026-10-26 21:39:56 +00:00
aiongg ff614cbe43 refactor(lightcraft-engine): split import.rs into import/ 2026-10-26 21:39:56 +00:00
aiongg 39d6a8d668 refactor(lightcraft-engine): split rename.rs into rename/ 2026-10-26 21:39:55 +00:00
aiongg 8942984c35 refactor(lightcraft-engine): split denoise.rs into denoise/ 2026-10-26 21:39:55 +00:00
aiongg 21304db29b refactor(lightcraft-engine): split media.rs into media/ 2026-10-26 21:08:55 +00:00
aiongg 50509093b6 refactor(lightcraft-engine): split camera_preview.rs into camera_preview/ 2026-10-26 21:08:55 +00:00
aiongg e3c594cab8 refactor(lightcraft-engine): split export.rs into export/ 2026-10-26 21:08:55 +00:00
aiongg 9b197d8215 refactor(lightcraft-engine): split files.rs into files/ 2026-10-26 21:08:55 +00:00
aiongg 745111dc6d refactor(lightcraft-ui-egui): move panels/right tests to panels/right/tests.rs 2026-10-26 21:05:54 +00:00
aiongg 658f3c26d5 refactor(lightcraft-engine): move denoise gpu_tests to denoise/gpu_tests.rs 2026-10-26 21:05:53 +00:00
aiongg 7707047684 refactor(lightcraft-engine): move media thumbnail_hash_tests to media/thumbnail_hash_tests.rs 2026-10-26 21:05:53 +00:00
aiongg b17f6cbe93 refactor(lightcraft-ui-egui): move progress.rs to widgets/progress.rs 2026-10-26 20:41:12 +00:00
aiongg 0d3ee604f3 refactor(lightcraft-ui-egui): move text_field.rs to widgets/text_field.rs 2026-10-26 20:41:12 +00:00
aiongg 8a9de1f616 refactor(lightcraft-ui-egui): move rating.rs to widgets/rating.rs 2026-10-26 20:41:12 +00:00
aiongg 204f8ea365 refactor(lightcraft-ui-egui): move button.rs to widgets/button.rs 2026-10-26 20:41:12 +00:00
aiongg 2a4bd99a4d refactor(lightcraft-ui-egui): move date_picker.rs to widgets/date_picker.rs 2026-10-26 20:41:12 +00:00
aiongg 6ea7f1dc55 refactor(lightcraft-ui-egui): move album_picker.rs to widgets/album_picker.rs 2026-10-26 20:41:12 +00:00
aiongg 74836daa84 refactor(lightcraft-ui-egui): move menu_level.rs to menus/menu_level.rs 2026-10-26 20:41:12 +00:00
aiongg 64b6a0e3c2 refactor(lightcraft-ui-egui): move menubar.rs to menus/menubar.rs 2026-10-26 20:41:12 +00:00
aiongg c7171d6834 refactor(lightcraft-ui-egui): move panels/slide_titles.rs to dialogs/settings/slide_titles.rs 2026-10-26 20:41:12 +00:00
aiongg f3d8862239 refactor(lightcraft-ui-egui): move panels/slide_templates.rs to dialogs/settings/slide_templates.rs 2026-10-26 20:41:12 +00:00
aiongg 34daf9dd60 refactor(lightcraft-ui-egui): move panels/slide_overlays.rs to dialogs/settings/slide_overlays.rs 2026-10-26 20:41:12 +00:00
aiongg f6e6d5ebc4 refactor(lightcraft-ui-egui): move panels/slide_layout.rs to dialogs/settings/slide_layout.rs 2026-10-26 20:41:12 +00:00
aiongg 56640576e0 refactor(lightcraft-ui-egui): move panels/rules_move.rs to dialogs/rules_editor/rules_move.rs 2026-10-26 20:41:12 +00:00
aiongg 0419f5b38b refactor(lightcraft-ui-egui): move panels/rules_editor.rs to dialogs/rules_editor.rs 2026-10-26 20:41:12 +00:00
aiongg 1dd486dec9 refactor(lightcraft-ui-egui): move panels/keymap.rs to dialogs/keymap.rs 2026-10-26 20:41:12 +00:00
aiongg d6db5a34a7 refactor(lightcraft-ui-egui): move panels/faces.rs to dialogs/faces.rs 2026-10-26 20:41:12 +00:00
aiongg 906150ae50 refactor(lightcraft-ui-egui): move panels/settings.rs to dialogs/settings.rs 2026-10-26 20:41:12 +00:00
aiongg fb5334a167 refactor(lightcraft-ui-egui): move updates_ui.rs to dialogs/updates_ui.rs 2026-10-26 20:41:08 +00:00