1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
use crate::render_features::{
RenderFeatureDebugConstants, RenderFeatureIndex, RenderJobBeginExecuteGraphContext,
RenderJobCommandBufferContext, RenderPhaseIndex, SubmitNodeId, ViewFrameIndex,
};
use rafx_api::RafxResult;
pub struct BeginSubmitNodeBatchArgs {
pub view_frame_index: ViewFrameIndex,
pub render_phase_index: RenderPhaseIndex,
pub feature_changed: bool,
pub sort_key: u32,
}
pub struct RenderSubmitNodeArgs {
pub view_frame_index: ViewFrameIndex,
pub render_phase_index: RenderPhaseIndex,
pub submit_node_id: SubmitNodeId,
}
/// A type-erased trait used by the `Renderer`, `RenderFrameJob`, and `RendererThreadPool`
/// to control the workload of the rendering process without identifying specific types
/// used in each `RenderFeature`'s frame packet or workload.
pub trait RenderFeatureWriteJob<'write>: Sync + Send {
/// Called once at the start of executing the `PreparedRenderData` in `PreparedRenderGraph::execute_graph`.
/// This can be used to start GPU transfers or other work prior to drawing any submit nodes related to
/// this `RenderFeature`.
fn on_begin_execute_graph(
&self,
_begin_execute_graph_context: &mut RenderJobBeginExecuteGraphContext,
) -> RafxResult<()> {
Ok(())
}
/// Called by `PreparedRenderData` in `write_view_phase` whenever the current `RenderFeatureIndex`
/// changes **into** this `RenderFeature` OR when the `sort_key` changes. This can be used to
/// setup pipelines or other expensive state changes that can remain constant for subsequent
/// `render_submit_node` calls.
fn begin_submit_node_batch(
&self,
_write_context: &mut RenderJobCommandBufferContext,
_args: BeginSubmitNodeBatchArgs,
) -> RafxResult<()> {
Ok(())
}
/// Called by `PreparedRenderData` in `write_view_phase` for each `RenderFeatureSubmitNode` associated
/// with this `RenderFeature`. This is normally where the actual GPU draw commands are implemented for
/// the `RenderFeature`. Each series of calls to `render_submit_node` will be preceded by a single call to
/// `begin_submit_node_batch`.
fn render_submit_node(
&self,
_write_context: &mut RenderJobCommandBufferContext,
args: RenderSubmitNodeArgs,
) -> RafxResult<()>;
fn feature_debug_constants(&self) -> &'static RenderFeatureDebugConstants;
fn feature_index(&self) -> RenderFeatureIndex;
}