Files
Aethera/render_3D/render_3D/detail/Async_Render_Backend.hpp
T
2026-08-22 00:57:37 +08:00

27 lines
1.4 KiB
C++

#pragma once
#include "../base/Frame_3D.hpp"
#include "Backend_Types.hpp"
#include <functional>
#include <memory>
namespace aethera::render_3d::detail {
class Async_Render_Backend final {
public:
using Frame_Callback = std::function<void(Frame_3D*)>;
Async_Render_Backend(std::uint32_t gpu_index, bool validation_enabled, Visual_Family visual_family, Scene_3D_Parameters parameters);
~Async_Render_Backend();
Async_Render_Backend(const Async_Render_Backend&) = delete;
Async_Render_Backend& operator=(const Async_Render_Backend&) = delete;
/* 将绘制意图无等待提交到调用方拥有的帧;frame 必须存活到完成回调返回。 */
void render(const Prepared_Visual& visual, Scene_3D_Parameters parameters, Frame_3D* frame);
/* 设置完成帧出口;回调在 Datoviz Render Domain 线程执行。 */
void set_frame_callback(Frame_Callback callback);
[[nodiscard]] bool available() const noexcept;
enum class Dispatch_Event_Result : std::uint8_t { queued, ignored, invalid_event, queue_full, backend_unavailable };
/* 无等待提交事件所有权;queue_full 时调用方保留事件并在下一次 Prepare 重试。 */
[[nodiscard]] Dispatch_Event_Result dispatch_event(std::shared_ptr<const Event> event, Extent viewport);
private:
struct Implementation;
std::shared_ptr<Implementation> implementation_; /* 隔离实现并覆盖所有已入队异步工作的生命周期。 */
};
}