Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Improve performance by binning together opaque items instead of sorting them. #12453

Merged
merged 25 commits into from Mar 30, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
8625fd3
Improve performance by binning together opaque items instead of sorting
pcwalton Mar 12, 2024
bf394b0
Rustfmt police
pcwalton Mar 13, 2024
f70baba
Rustdoc police
pcwalton Mar 13, 2024
1903a47
Rustdoc police again
pcwalton Mar 13, 2024
6604632
Bin alpha masks too
pcwalton Mar 13, 2024
f26961a
Merge remote-tracking branch 'origin/main' into binning
pcwalton Mar 19, 2024
dd53692
Fix dynamic offsets
pcwalton Mar 20, 2024
c1e9035
Address review comments
pcwalton Mar 20, 2024
c017e6f
Doc check police
pcwalton Mar 20, 2024
d040787
Merge remote-tracking branch 'origin/main' into binning
pcwalton Mar 25, 2024
4178fe8
Address review comments
pcwalton Mar 25, 2024
ef78989
Merge remote-tracking branch 'origin/main' into binning
pcwalton Mar 26, 2024
6692299
Merge remote-tracking branch 'origin/main' into binning
pcwalton Mar 26, 2024
67a5f10
Address review comments
pcwalton Mar 26, 2024
ca56bac
Fix shadows in `3d_shapes` and dynamic uniform indices.
pcwalton Mar 27, 2024
3e4d2cd
Merge remote-tracking branch 'origin/main' into binning
pcwalton Mar 27, 2024
34d7160
Merge remote-tracking branch 'origin/main' into binning
pcwalton Mar 28, 2024
b7570d3
Address review comments
pcwalton Mar 28, 2024
642ad9b
Merge remote-tracking branch 'origin/main' into binning
pcwalton Mar 29, 2024
ac9c978
Doc-check police
pcwalton Mar 29, 2024
269b385
Move "no-prepass-plugin-loaded" bin sorts to the sort render set
pcwalton Mar 29, 2024
23ab07d
Merge remote-tracking branch 'origin/main' into binning
pcwalton Mar 29, 2024
638c7c2
Merge remote-tracking branch 'origin/main' into binning
pcwalton Mar 29, 2024
18392b7
Add trait documentation to `GetBinnedBatchData`
pcwalton Mar 29, 2024
8959f0f
Apply suggestions from code review
james7132 Mar 30, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
4 changes: 2 additions & 2 deletions crates/bevy_core_pipeline/src/core_2d/main_pass_2d_node.rs
Expand Up @@ -4,7 +4,7 @@ use bevy_render::{
camera::ExtractedCamera,
diagnostic::RecordDiagnostics,
render_graph::{Node, NodeRunError, RenderGraphContext},
render_phase::RenderPhase,
render_phase::SortedRenderPhase,
render_resource::RenderPassDescriptor,
renderer::RenderContext,
view::{ExtractedView, ViewTarget},
Expand All @@ -16,7 +16,7 @@ pub struct MainPass2dNode {
query: QueryState<
(
&'static ExtractedCamera,
&'static RenderPhase<Transparent2d>,
&'static SortedRenderPhase<Transparent2d>,
&'static ViewTarget,
),
With<ExtractedView>,
Expand Down
32 changes: 17 additions & 15 deletions crates/bevy_core_pipeline/src/core_2d/mod.rs
Expand Up @@ -38,7 +38,7 @@ use bevy_render::{
render_graph::{EmptyNode, RenderGraphApp, ViewNodeRunner},
render_phase::{
sort_phase_system, CachedRenderPipelinePhaseItem, DrawFunctionId, DrawFunctions, PhaseItem,
RenderPhase,
SortedPhaseItem, SortedRenderPhase,
},
render_resource::CachedRenderPipelineId,
Extract, ExtractSchedule, Render, RenderApp, RenderSet,
Expand Down Expand Up @@ -96,29 +96,16 @@ pub struct Transparent2d {
}

impl PhaseItem for Transparent2d {
type SortKey = FloatOrd;

#[inline]
fn entity(&self) -> Entity {
self.entity
}

#[inline]
fn sort_key(&self) -> Self::SortKey {
self.sort_key
}

#[inline]
fn draw_function(&self) -> DrawFunctionId {
self.draw_function
}

#[inline]
fn sort(items: &mut [Self]) {
// radsort is a stable radix sort that performed better than `slice::sort_by_key` or `slice::sort_unstable_by_key`.
radsort::sort_by_key(items, |item| item.sort_key().0);
}

#[inline]
fn batch_range(&self) -> &Range<u32> {
&self.batch_range
Expand All @@ -140,6 +127,21 @@ impl PhaseItem for Transparent2d {
}
}

impl SortedPhaseItem for Transparent2d {
type SortKey = FloatOrd;

#[inline]
fn sort_key(&self) -> Self::SortKey {
self.sort_key
}

#[inline]
fn sort(items: &mut [Self]) {
// radsort is a stable radix sort that performed better than `slice::sort_by_key` or `slice::sort_unstable_by_key`.
radsort::sort_by_key(items, |item| item.sort_key().0);
}
}

impl CachedRenderPipelinePhaseItem for Transparent2d {
#[inline]
fn cached_pipeline(&self) -> CachedRenderPipelineId {
Expand All @@ -155,7 +157,7 @@ pub fn extract_core_2d_camera_phases(
if camera.is_active {
commands
.get_or_spawn(entity)
.insert(RenderPhase::<Transparent2d>::default());
.insert(SortedRenderPhase::<Transparent2d>::default());
}
}
}
Expand Up @@ -7,7 +7,7 @@ use bevy_render::{
camera::ExtractedCamera,
diagnostic::RecordDiagnostics,
render_graph::{NodeRunError, RenderGraphContext, ViewNode},
render_phase::{RenderPhase, TrackedRenderPass},
render_phase::{BinnedRenderPhase, TrackedRenderPass},
render_resource::{CommandEncoderDescriptor, PipelineCache, RenderPassDescriptor, StoreOp},
renderer::RenderContext,
view::{ViewDepthTexture, ViewTarget, ViewUniformOffset},
Expand All @@ -17,14 +17,16 @@ use bevy_utils::tracing::info_span;

use super::AlphaMask3d;

/// A [`bevy_render::render_graph::Node`] that runs the [`Opaque3d`] and [`AlphaMask3d`] [`RenderPhase`].
/// A [`bevy_render::render_graph::Node`] that runs the [`Opaque3d`]
/// [`BinnedRenderPhase`] and [`AlphaMask3d`]
/// [`bevy_render::render_phase::SortedRenderPhase`]s.
#[derive(Default)]
pub struct MainOpaquePass3dNode;
impl ViewNode for MainOpaquePass3dNode {
type ViewQuery = (
&'static ExtractedCamera,
&'static RenderPhase<Opaque3d>,
&'static RenderPhase<AlphaMask3d>,
&'static BinnedRenderPhase<Opaque3d>,
&'static BinnedRenderPhase<AlphaMask3d>,
&'static ViewTarget,
pcwalton marked this conversation as resolved.
Show resolved Hide resolved
&'static ViewDepthTexture,
Option<&'static SkyboxPipelineId>,
Expand Down Expand Up @@ -80,14 +82,14 @@ impl ViewNode for MainOpaquePass3dNode {
}

// Opaque draws
if !opaque_phase.items.is_empty() {
if !opaque_phase.is_empty() {
#[cfg(feature = "trace")]
let _opaque_main_pass_3d_span = info_span!("opaque_main_pass_3d").entered();
opaque_phase.render(&mut render_pass, world, view_entity);
}

// Alpha draws
if !alpha_mask_phase.items.is_empty() {
if !alpha_mask_phase.is_empty() {
#[cfg(feature = "trace")]
let _alpha_mask_main_pass_3d_span = info_span!("alpha_mask_main_pass_3d").entered();
alpha_mask_phase.render(&mut render_pass, world, view_entity);
Expand Down
Expand Up @@ -4,7 +4,7 @@ use bevy_ecs::{prelude::*, query::QueryItem};
use bevy_render::{
camera::ExtractedCamera,
render_graph::{NodeRunError, RenderGraphContext, ViewNode},
render_phase::RenderPhase,
render_phase::SortedRenderPhase,
render_resource::{Extent3d, RenderPassDescriptor, StoreOp},
renderer::RenderContext,
view::{ViewDepthTexture, ViewTarget},
Expand All @@ -13,15 +13,16 @@ use bevy_render::{
use bevy_utils::tracing::info_span;
use std::ops::Range;

/// A [`bevy_render::render_graph::Node`] that runs the [`Transmissive3d`] [`RenderPhase`].
/// A [`bevy_render::render_graph::Node`] that runs the [`Transmissive3d`]
/// [`SortedRenderPhase`].
#[derive(Default)]
pub struct MainTransmissivePass3dNode;

impl ViewNode for MainTransmissivePass3dNode {
type ViewQuery = (
&'static ExtractedCamera,
&'static Camera3d,
&'static RenderPhase<Transmissive3d>,
&'static SortedRenderPhase<Transmissive3d>,
&'static ViewTarget,
Option<&'static ViewTransmissionTexture>,
&'static ViewDepthTexture,
Expand Down
Expand Up @@ -4,22 +4,23 @@ use bevy_render::{
camera::ExtractedCamera,
diagnostic::RecordDiagnostics,
render_graph::{NodeRunError, RenderGraphContext, ViewNode},
render_phase::RenderPhase,
render_phase::SortedRenderPhase,
render_resource::{RenderPassDescriptor, StoreOp},
renderer::RenderContext,
view::{ViewDepthTexture, ViewTarget},
};
#[cfg(feature = "trace")]
use bevy_utils::tracing::info_span;

/// A [`bevy_render::render_graph::Node`] that runs the [`Transparent3d`] [`RenderPhase`].
/// A [`bevy_render::render_graph::Node`] that runs the [`Transparent3d`]
/// [`SortedRenderPhase`].
#[derive(Default)]
pub struct MainTransparentPass3dNode;

impl ViewNode for MainTransparentPass3dNode {
type ViewQuery = (
&'static ExtractedCamera,
&'static RenderPhase<Transparent3d>,
&'static SortedRenderPhase<Transparent3d>,
&'static ViewTarget,
&'static ViewDepthTexture,
);
Expand Down