Files
oak-editor/crates/oakrender/COVERAGE.md
T
Mike-Solar 013a175707 refactor: workspace layout — crates/, app at root, legacy C++ removed
Single mechanical restructure commit:
- root Cargo.toml = oakapp bin + workspace; one cargo build produces
  oakapp, oak-cli, oak-worker, liboakengine.dylib
- app/rust/src -> src/ (app at repo root, no rust/ nesting)
- src/<mod>/rust -> crates/oak<mod>; src/oakcore-rs -> crates/oakcore;
  src/bindings/oakotio -> crates/oakotio; src/engine/rust ->
  crates/oakengine (keeps cdylib+staticlib+rlib)
- public C headers include/<mod>/ -> crates/oakengine/include/<mod>/
- OFX SDK headers vendored into crates/oakplugin/ofx/ (HostSupport gone)
- legacy deleted: old src/ C++ modules, engine/, core/, ffmpeg_bridge/,
  app/ (Qt), cli/worker C++, root CMakeLists, third_party/KDDockWidgets
  submodule, otio-install, all build-* output (~40GB)
- oakstorage kept but excluded from the workspace (skeleton w/ todos);
  gpui excluded (own workspace)
- verified: cargo build green, cargo test --workspace 1845/0
  (with the documented OCIO_RS_* env override for the homebrew OCIO)
2026-08-10 20:24:25 +08:00

12 KiB
Raw Blame History

oakrender 类完整覆盖映射表(C++ src/render/src → oakrender Rust crate

实现状态(2026-08:本表全部落点已在 src/render/rust/ 落地; cargo test 全绿(130 passed / 6 ignored)。原落点 backend = 留在 C++ 后端插件 已过时 —— Rust 侧用 wgpu 直连(backend.rs),无 liboakgl2/liboakvulkan。延后项见 README "Deferred" oakcodec 帧载荷(bridge/codec)、oaknode 深拷贝(bridge/node)、 进程隔离 workeroakengine_ipc)、颜色管理 GPU blitOCIO→WGSL)。

逐类盘点 C++ oakrender 的全部公开/内部类。落点标注:crate 模块 = src/render/rust/src/ 下的文件;bridge = 经 C ABI 出模块; plugin = 归 M11 oakplugin cratedrop = 刻意不迁移(附理由)。

1. RenderManager / RenderThreadrendermanager.h

C++ Rust 落点
create_instance / destroy_instance / instance manager::RenderManager::init/shutdown/global
render_frame / render_audioRenderVideoParams/RenderAudioParams manager + ticket::TicketArena::submit_video/submit_audioparams 结构在 ticket.rs marshalling
RenderThreadstart/add_ticket/remove_ticket/quit/wait/run worker::WorkerPoolscoped 线程 + channelquit/wait → shutdown
backend() / requested_backend / backend_from_string / backend_to_string backend::BackendKind + 字符串互转
get_cacher manager.autocacher
set_project manager(持有项目身份,不持指针)
set_aggressive_garbage_collection / clear_old_decoders / decoder_clear_loop manager.set_aggressive_gcdecoder 清理由 bridge::codec 的缓存管理替代(见 §9 决策注记)
create_thread worker.rs 内部

2. RenderTicket / RenderTicketWatcherrenderticket.h

C++ Rust 落点
start / finish(_internal) / is_running / get_finish_count / has_result / get / wait_for_finished / lock ticket.rs 内部状态机(watcher 不再存在——回调 directly on ticketwait_for_finished 为阻塞 API
set_property / propertyVariant 属性包) ticket::TicketMeta(限 string/enum 已知键,不再用 Variant
set_finished_callback ticket::CompletionFnOnce,恰好一次)
Watcher 全类(get_ticket/set_ticket/cancel/ticket_finished…) 合入 ticketTicketId + cancel + resultwatcher 是 Qt 信号时代的转发器,不需要

3. RenderWorkerPool / workerprocess / workerjson(进程隔离)

C++ Rust 落点
start / submit_frame / remove_ticket / shutdown / worker_loop / process_job(_attempt) worker::WorkerPool(线程池路径)
PooledWorker / acquire_worker / return_worker / shutdown_worker / clear_graph_cache worker::ProcessPool(子进程池;复用现有 oakengine_ipc C ABIRust 只做客户端)
write_graph_snapshot / cleanup_graph_file / add/release_graph_path_ref(_locked) / set_graph_path_cached(_locked) worker::GraphSnapshotStore(图快照文件的引用计数缓存)
is_supported / prepare_job / finish_with_frame / cancel_active_process / set/clear_active_worker worker 内部
决策注记:进程隔离 worker 保留(崩溃隔离是线上特性)。线程池与进程池并存于 worker.rsenum WorkerBackend { Threads(WorkerPool), Processes(ProcessPool) },选择策略同 C++(config 键)。

4. Renderer 抽象(renderer.h,后端接口)

C++ Rust 落点
init / post_init / destroy / post_destroy / destroy_internal backend::Backend traitload/unload
create_native_texture / destroy_native_texture / create_texture(_from_native_handle) / destroy_texture / clear_old_textures backend::Backend::create_texture/destroy_texture + texture::Texture
upload_to_texture / download_from_texture / flush backend::Backend::upload/download/flush
blit / blit_to_texture / blit_color_managed3 重载) backend::Backend::blit(_color_managed)
create_native_shader / destroy_native_shader / get_default_shader backend::Backend::shader_*
interlace_texture backend::Backend::interlace
clear_destination / attach_output_texture / detach_output_texture / get_pixel_from_texture backend::Backend
is_open_gl / is_vulkan / get_lifetime / is_renderer_alive backend::BackendKind + 存活由所有权表达(drop 即死)
set_owner_thread_to_current / clear_owner_thread / called_on_owner_thread 类型化消除GL 上下文当前性由 backend::ContextGuard(RAII,Send 约束)表达,不做运行期断言

5. Texture / TextureHandletexture.h/texturehandle.h

C++ Rust 落点
构造族 / ~Texture / id() / params() texture::TextureGpu/Cpu 两态,已在底稿)
upload / download / handle_frame / frame Texture::to_frame / backend.upload
is_dummy / width / height / format / channel_count / divider / pixel_aspect_ratio / virtual_resolution Texture 查询方法
job / to_job / is_job 设计变更:纹理即值;job 关联经 eval.rs 的作业记录,Texture 不再携带 job
renderer() / is_renderer_alive Texture::Gpu.backend(种类;存活见上)
TextureHandle(句柄包装类) 废弃——C ABI 句柄即真相

6. 缓存族(playbackcache/framehashcache/audio(waveform)cache/rendercache/colorprocessorcache/renderjobtracker

C++ Rust 落点
PlaybackCache 全表(uuid/invalidated ranges/invalidate/validate/request/callbacks/passthrough/load_save_state/mutex/indicator_height cache::PlaybackCache(已声明;callbacks → cache::EventSink traitfacade/autocacher 实现)
FrameHashCachetimebase/validate_timestamp/is_frame_cached/valid_cache_filename/save_load_cache_frame/hash_deleted/to_time/to_timestamp/cache_path_name cache.rs 的 frame-hash 子面(kind=VideoFrame/Thumbnailsave/load_cache_frame 经 bridge::codec 帧载荷)
AudioPlaybackCacheget/set_parameters cache.rsAudioPlayback kind + params 字段)
AudioWaveformCacheInvalidateEvent 覆写等) cache.rs(kind 差异内聚;事件经 EventSink
ThumbnailCache cache.rsThumbnail kind
RenderCache<T>(值缓存模板) cache::ValueCache(泛型)
ColorProcessorCache color::ProcessorCache
RenderJobTracker autocacher 内部(作业代际戳)

7. 色彩(colorprocessor/managedcolor/lutlibrary/colortransformjob

C++ Rust 落点
ColorProcessorcreate 两族/convert_frame 两族/convert_color/id/get_processor color::ColorProcessorOCIO 薄封装)
ColorProcessor::Direction color::Direction
ManagedColor / ColorTransformJob / ShaderCode / ShaderJob / GenerateJob / CacheJob / FootageJob / SampleJob / AcceleratedJobjob 族) eval::JobSpecenum 闭合:Shader/ColorTransform/Generate/Cache/Footage/Sample);job 对象不再跨模块流通,只是求值期的内部记录
LUTLibrarysupported_extensions/is_supported_extension color::lut
ColorManager 静态面(default config/display/view/reference 归 oaknode crate 的 colormanager.rs(所有者);render 只保留 color::default_config 客户端查询(bridge::node

8. PreviewAutoCacherpreviewautocacher.h44 方法)

C++ Rust 落点
set_project / project_destroyed / conform_finished autocacher.attach/detach
get_single_frame2 重载)/ clear_single_frame_renders(_that_arent_running) / cancel_queued_single_frame_render autocacher.single_frame(一次性 ticket
get_range_of_audio / render_frame / render_audio autocacher 提交 ticket(经 ticket.rs
force_cache_range / is_rendering_custom_range autocacher.force_range(已在底稿)
set_playhead / cancel_video_tasks / cancel_audio_tasks / set_renders_paused / set_thumbnails_paused / set_multicam_node / set_ignore_cache_requests / set_display_color_processor / set_cache_progress_callback / set_stop_cache_proxy_tasks_callback autocacher 字段/方法(callbacks → EventSink
audio_rendered / video_renderedticket 回调) 内部完成处理
try_render / delayed_requeue_pending / cancel_delayed_requeue / requeue_delay_ms 内部调度
connect_to_node_cache / disconnect_from_node_cache / start_caching_*_range / *_invalidated_from_* / cancel_for_cache / cache_proxy_task_cancelled 内部(事件源是 cache.rs 的 EventSink 注册,不再有 C++ 回调指针)

9. RenderProcessorrenderprocessor.hNodeTraverser 子类)

C++ Rust 落点
generate_database / run / process (static) eval.rsoaknode traverser 引擎 + RenderEvalHooks
process_video_footage / process_audio_footage / process_shader / process_samples / process_color_transform / process_frame_generation / process_plugin_job / process_video_cache_job eval::RenderEvalHooks 的各 hook 方法(plugin job 转发给 oakplugin crate C ABI——render 不再认识 OFX
create_texture / create_sample_buffer / generate_texture / generate_frame / convert_to_reference_space / resolve_decoder_from_input / use_cache eval.rs + texture.rs + bridge::codec

10. ProjectCopierprojectcopier.h33 方法)

整体反转为客户端C++ 里它是 render→node 耦合的最大来源):

C++ Rust 落点
set_project / get_copied_project / get_copy<T> / get_original<T> / get_node_map copier::ProjectCopy(句柄身份映射表在 oaknode 侧维护,render 只存 identity 对)
queue_*node_add/remove、edge_add/remove、value_change、value_hint_change、project_setting_change、footage_proxy+ do_* oaknode ChangeRecord 序列 + oaknode_project_sync_copybridge::node
process_update_queue / has_updates_in_queue / get_graph_change_time / get_last_update_time copier::ProjectCopy::sync + 代际戳字段
set_added/removed_node_handler copier 注册回调(复制后接线用)
insert_into_copy_map / update_graph_change_value / update_last_synced_value oaknode 内部(render 不可见)

11. 其余小件

C++ Rust 落点
CancelAtom ticket::CancelToken(共享原子取消标志)
DiskManager(默认缓存路径/大小/清理) manager::disk_cache_*(已在 C ABI
PreviewAudioDevice facade/app 职责(音频输出设备绑定)→ drop(注释说明)
paths.h / configaccessor.h / alphaassoc.h / rendermodes.h bridge::common / 常量枚举
ShaderCode/ShaderRequest(节点 shader 请求) eval 期记录(见 §7 job 族)
pluginrenderer.cpp / PluginJob pluginM11 crate2 期收编)

12. 刻意不迁移(drop

C++ 理由
Qt 信号残余 / QObject 父子 Rust 所有权原生表达
Variant 属性包(ticket params 闭合键集(TicketMeta),不需要类型擦除
Texture::to_job 的 job 内嵌 求值期关联在 eval.rs,纹理保持纯值
called_on_owner_thread 运行期断言 ContextGuard 类型化替代
PreviewAudioDevice 设备绑定属 facade/app(M 手册边界)