Skip to content

Commit cfeae1a

Browse files
committed
Update Renderer to use new render_features code.
- The `RenderFeaturePlugin` has been expanded with additional functions for calculating and allocating frame or submit packets, creating each job type, and determining if a given `RenderView` and `RenderViewVisibilityQuery` is relevant to that feature. - Added `RendererThreadPool` to allow the application to control the parallelization of different stages of the renderer pipeline. `RendererThreadPoolNone` is provided as a single-threaded default if the application does not provide their own implementation. - Seperated `RendererAssetPlugin` from what was previously just a `RendererPlugin` containing both feature code (now moved to `RenderFeaturePlugin`) and asset code. - Added many helper functions to `Renderer` and `RenderFrameJob` to make the implementation of the `RendererThreadPool` easier. The `extract` stage can be seen in `Renderer::try_create_render_job` and the `prepare` or `write` stages are in `RenderFrameJob::do_render_async`.
1 parent 401a3e5 commit cfeae1a

11 files changed

+1097
-123
lines changed

rafx-renderer/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ glam = { version = "0.13.1", features = [ "serde" ] }
2222
crossbeam-channel = "0.5"
2323
log = "0.4"
2424
profiling = "1.0.1"
25+
fnv = "1.0"
2526

2627
[features]
2728
no-render-thread = []

rafx-renderer/src/lib.rs

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
1-
mod renderer_plugin;
2-
pub use renderer_plugin::RendererPlugin;
1+
mod render_feature_plugin;
2+
pub use render_feature_plugin::RenderFeaturePlugin;
3+
4+
mod renderer_asset_plugin;
5+
pub use renderer_asset_plugin::RendererAssetPlugin;
36

47
mod render_graph_generator;
58
pub use render_graph_generator::RenderGraphGenerator;
@@ -15,18 +18,23 @@ mod swapchain_resources;
1518
pub use swapchain_resources::SwapchainResources;
1619

1720
mod render_frame_job;
18-
use render_frame_job::RenderFrameJob;
21+
pub use render_frame_job::RenderFrameJob;
1922

2023
mod renderer_builder;
2124
pub use renderer_builder::AssetSource;
2225
pub use renderer_builder::RendererBuilder;
2326
pub use renderer_builder::RendererBuilderResult;
2427

28+
mod renderer_thread_pool_none;
29+
2530
//TODO: Find a way to not expose this
2631
mod swapchain_handling;
2732
pub use swapchain_handling::SwapchainHandler;
2833

2934
mod renderer;
3035
pub use renderer::*;
3136

37+
mod renderer_thread_pool;
38+
pub use renderer_thread_pool::*;
39+
3240
pub mod daemon;
Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
use crate::Renderer;
2+
use rafx_api::extra::upload::RafxTransferUpload;
3+
use rafx_api::RafxResult;
4+
use rafx_assets::distill_impl::AssetResource;
5+
use rafx_assets::AssetManager;
6+
use rafx_base::resource_map::ResourceMap;
7+
use rafx_framework::render_features::render_features_prelude::*;
8+
use rafx_framework::RenderResources;
9+
use std::sync::Arc;
10+
11+
pub trait RenderFeaturePlugin: Send + Sync {
12+
fn feature_debug_name(&self) -> &'static str;
13+
fn feature_index(&self) -> RenderFeatureIndex;
14+
15+
fn is_relevant(
16+
&self,
17+
view_visibility: &RenderViewVisibilityQuery,
18+
) -> bool {
19+
let is_view_relevant = self.is_view_relevant(&view_visibility.view);
20+
21+
if is_view_relevant {
22+
return if self.requires_visible_render_objects() {
23+
view_visibility
24+
.render_object_instances_per_view(self.feature_index())
25+
.is_some()
26+
} else {
27+
true
28+
};
29+
}
30+
31+
false
32+
}
33+
34+
fn is_view_relevant(
35+
&self,
36+
view: &RenderView,
37+
) -> bool;
38+
39+
fn requires_visible_render_objects(&self) -> bool;
40+
41+
fn configure_render_registry(
42+
&self,
43+
render_registry: RenderRegistryBuilder,
44+
) -> RenderRegistryBuilder {
45+
render_registry
46+
}
47+
48+
fn initialize_static_resources(
49+
&self,
50+
_asset_manager: &mut AssetManager,
51+
_asset_resource: &mut AssetResource,
52+
_extract_resources: &ExtractResources,
53+
_render_resources: &mut ResourceMap,
54+
_upload: &mut RafxTransferUpload,
55+
) -> RafxResult<()> {
56+
Ok(())
57+
}
58+
59+
fn add_render_views(
60+
&self,
61+
_extract_resources: &ExtractResources,
62+
_render_resources: &RenderResources,
63+
_render_view_set: &RenderViewSet,
64+
_render_views: &mut Vec<RenderView>,
65+
) {
66+
}
67+
68+
fn calculate_frame_packet_size<'extract>(
69+
&self,
70+
_extract_context: &RenderJobExtractContext<'extract>,
71+
visibility_results: &Vec<RenderViewVisibilityQuery>,
72+
render_object_instance_entity_ids: &mut RenderObjectInstanceEntityIds,
73+
frame_packet_size: &mut FramePacketSize,
74+
) {
75+
Renderer::calculate_frame_packet_size(
76+
self.feature_debug_name(),
77+
self.feature_index(),
78+
|view_visibility| self.is_relevant(view_visibility),
79+
visibility_results,
80+
render_object_instance_entity_ids,
81+
frame_packet_size,
82+
);
83+
}
84+
85+
fn new_frame_packet(
86+
&self,
87+
frame_packet_size: &FramePacketSize,
88+
) -> Box<dyn RenderFeatureFramePacket>;
89+
90+
fn populate_frame_packet<'extract>(
91+
&self,
92+
_extract_context: &RenderJobExtractContext<'extract>,
93+
visibility_results: &Vec<RenderViewVisibilityQuery>,
94+
_frame_packet_size: &FramePacketSize,
95+
frame_packet: &mut Box<dyn RenderFeatureFramePacket>,
96+
) {
97+
Renderer::populate_frame_packet(
98+
self.feature_debug_name(),
99+
self.feature_index(),
100+
|view_visibility| self.is_relevant(view_visibility),
101+
visibility_results,
102+
frame_packet,
103+
);
104+
}
105+
106+
fn new_extract_job<'extract>(
107+
&self,
108+
extract_context: &RenderJobExtractContext<'extract>,
109+
frame_packet: Box<dyn RenderFeatureFramePacket>,
110+
) -> Arc<dyn RenderFeatureExtractJob<'extract> + 'extract>;
111+
112+
fn new_submit_packet(
113+
&self,
114+
frame_packet: &Box<dyn RenderFeatureFramePacket>,
115+
) -> Box<dyn RenderFeatureSubmitPacket>;
116+
117+
fn new_prepare_job<'prepare>(
118+
&self,
119+
prepare_context: &RenderJobPrepareContext<'prepare>,
120+
frame_packet: Box<dyn RenderFeatureFramePacket>,
121+
submit_packet: Box<dyn RenderFeatureSubmitPacket>,
122+
) -> Arc<dyn RenderFeaturePrepareJob<'prepare> + 'prepare>;
123+
124+
fn new_write_job<'write>(
125+
&self,
126+
write_context: &RenderJobWriteContext<'write>,
127+
frame_packet: Box<dyn RenderFeatureFramePacket>,
128+
submit_packet: Box<dyn RenderFeatureSubmitPacket>,
129+
) -> Arc<dyn RenderFeatureWriteJob<'write> + 'write>;
130+
}

0 commit comments

Comments
 (0)