重定义模块职责
This commit is contained in:
@@ -16,11 +16,10 @@ Frame_3D::Frame_3D(Frame_Identity identity, Frame_3D_Output output,
|
||||
begin(identity, output, output_format);
|
||||
}
|
||||
void Frame_3D::begin(Frame_Identity identity, Frame_3D_Output output,
|
||||
Pixel_Format output_format, Frame_Request_Source source,
|
||||
const Frame_Policy::State& frame_policy) {
|
||||
Pixel_Format output_format, Frame_Request_Source source) {
|
||||
if (output_format != native_pixel_format)
|
||||
throw std::invalid_argument("Frame_3D output pixel format is unsupported");
|
||||
Render_Frame::begin(identity, source, frame_policy);
|
||||
Render_Frame::begin(identity, source);
|
||||
d->output = output;
|
||||
d->output_format = output_format;
|
||||
d->extent = {};
|
||||
|
||||
@@ -38,8 +38,7 @@ public:
|
||||
void begin(Frame_Identity identity,
|
||||
Frame_3D_Output output = Frame_3D_Output::pixels,
|
||||
Pixel_Format output_format = native_pixel_format,
|
||||
Frame_Request_Source source = Frame_Request_Source::unspecified,
|
||||
const Frame_Policy::State& frame_policy = {});
|
||||
Frame_Request_Source source = Frame_Request_Source::unspecified);
|
||||
[[nodiscard]] Extent extent() const noexcept;
|
||||
[[nodiscard]] std::span<const std::byte> pixels() const noexcept;
|
||||
[[nodiscard]] std::shared_ptr<const std::vector<std::byte>> share_pixels() const noexcept;
|
||||
|
||||
@@ -7,4 +7,36 @@ Render_Scene_3D::Render_Result Render_Scene_3D::render(
|
||||
return double_buffer::detail::Internal_Access::get(this).render(
|
||||
this, frame, std::move(callbacks));
|
||||
}
|
||||
|
||||
Render_Frame_Result Render_Scene_3D::render_frame(
|
||||
not_null<Render_Frame*> frame, Render_Frame_Callbacks callbacks) {
|
||||
auto* concrete = dynamic_cast<Frame_3D*>(frame.get());
|
||||
if (!concrete) return Render_Frame_Result::incompatible_frame;
|
||||
const auto result = render(
|
||||
not_null{concrete},
|
||||
Frame_Callbacks{
|
||||
.submitted = [callback = std::move(callbacks.submitted)](
|
||||
not_null<Frame_3D*> submitted,
|
||||
bool released_after_submission) mutable {
|
||||
if (callback)
|
||||
callback(submitted, released_after_submission);
|
||||
},
|
||||
.completed = [callback = std::move(callbacks.completed)](
|
||||
not_null<Frame_3D*> completed) mutable {
|
||||
if (callback) callback(completed);
|
||||
}});
|
||||
switch (result) {
|
||||
case Render_Result::submitted:
|
||||
return Render_Frame_Result::submitted;
|
||||
case Render_Result::frame_pipeline_busy:
|
||||
return Render_Frame_Result::frame_pipeline_busy;
|
||||
case Render_Result::view_inactive:
|
||||
return Render_Frame_Result::view_inactive;
|
||||
case Render_Result::empty_viewport:
|
||||
return Render_Frame_Result::empty_viewport;
|
||||
case Render_Result::backend_unavailable:
|
||||
return Render_Frame_Result::backend_unavailable;
|
||||
}
|
||||
return Render_Frame_Result::backend_unavailable;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
namespace aethera::render_3d {
|
||||
namespace detail { struct Datoviz_Visual_Operations; }
|
||||
/* 执行公共 Renderable 图,并把结果无等待地提交给 Datoviz 渲染域。 */
|
||||
struct Render_Scene_3D : Def<Render_Scene_3D, Scene> {
|
||||
struct Render_Scene_3D : Def<Render_Scene_3D, Scene>, Render_Frame_Scene {
|
||||
struct Prop : Prev_Prop {
|
||||
Extent viewport{560, 320}; /* 离屏渲染目标尺寸,单位为像素。 */
|
||||
Linear_Color clear_color{}; /* 每帧开始时写入的线性背景色。 */
|
||||
@@ -59,6 +59,9 @@ struct Render_Scene_3D : Def<Render_Scene_3D, Scene> {
|
||||
using Render_Result_Type = Render_Result;
|
||||
using Render_Frame_Type = Frame_3D;
|
||||
[[nodiscard]] Render_Result render(not_null<Frame_3D*> frame, Frame_Callbacks callbacks);
|
||||
[[nodiscard]] Render_Frame_Result render_frame(
|
||||
not_null<Render_Frame*> frame,
|
||||
Render_Frame_Callbacks callbacks) override;
|
||||
/*
|
||||
* 无等待写入调用方拥有的 Frame;Scene 始终只借用地址。最多三个借用可在
|
||||
* CPU Prepare、GPU 和读回阶段重叠,完成全部写入并清除借用后调用唯一完成回调。
|
||||
|
||||
Reference in New Issue
Block a user