Skip to content

Commit 1b0c334

Browse files
committed
Change to specialise pipelines ahead and validate cached bins.
1 parent 3cf356f commit 1b0c334

6 files changed

Lines changed: 381 additions & 173 deletions

File tree

src/lib.rs

Lines changed: 29 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -31,14 +31,15 @@
3131
use std::any::TypeId;
3232

3333
use bevy::asset::load_internal_asset;
34+
use bevy::asset::AssetEvents;
3435
use bevy::core_pipeline::core_3d::graph::{Core3d, Node3d};
3536
use bevy::pbr::{MeshInputUniform, MeshUniform};
3637
use bevy::prelude::*;
3738
use bevy::render::batching::gpu_preprocessing::{self, GpuPreprocessingSupport};
3839
use bevy::render::batching::no_gpu_preprocessing::{
3940
clear_batched_cpu_instance_buffers, write_batched_instance_buffer, BatchedInstanceBuffer,
4041
};
41-
use bevy::render::extract_component::{ExtractComponentPlugin, UniformComponentPlugin};
42+
use bevy::render::extract_component::UniformComponentPlugin;
4243
use bevy::render::mesh::MeshVertexAttribute;
4344
use bevy::render::render_graph::{EmptyNode, RenderGraphApp, RenderLabel, ViewNodeRunner};
4445
use bevy::render::render_phase::{
@@ -47,17 +48,24 @@ use bevy::render::render_phase::{
4748
};
4849
use bevy::render::render_resource::{SpecializedMeshPipelines, VertexFormat};
4950
use bevy::render::renderer::RenderDevice;
51+
use bevy::render::sync_component::SyncComponentPlugin;
5052
use bevy::render::view::{RenderLayers, VisibilitySystems};
5153
use bevy::render::{Render, RenderApp, RenderDebugFlags, RenderSet};
5254
use bevy::transform::TransformSystem;
53-
use uniforms::{prepare_render_outlines, AlphaMaskBindGroups, RenderOutlines};
55+
use uniforms::extract_outlines;
56+
use uniforms::AlphaMaskBindGroups;
57+
use uniforms::RenderOutlineInstances;
5458

5559
use crate::msaa::MsaaExtraWritebackNode;
5660
use crate::node::{OpaqueOutline, OutlineNode, StencilOutline, TransparentOutline};
5761
use crate::pipeline::{
5862
OutlinePipeline, COMMON_SHADER_HANDLE, FRAGMENT_SHADER_HANDLE, OUTLINE_SHADER_HANDLE,
5963
};
60-
use crate::queue::queue_outline_mesh;
64+
use crate::queue::{
65+
check_outline_entities_needing_specialisation, extract_outline_entities_needing_specialisation,
66+
queue_outline_mesh, specialise_outlines, OutlineEntitiesNeedingSpecialisation,
67+
OutlineEntitySpecialisationTicks, OutlinePipelineCache,
68+
};
6169
use crate::render::DrawOutline;
6270
use crate::uniforms::set_outline_visibility;
6371
use crate::uniforms::{
@@ -342,7 +350,7 @@ impl Plugin for OutlinePlugin {
342350
);
343351

344352
app.add_plugins((
345-
ExtractComponentPlugin::<ComputedOutline>::default(),
353+
SyncComponentPlugin::<ComputedOutline>::default(),
346354
UniformComponentPlugin::<OutlineViewUniform>::default(),
347355
BinnedRenderPhasePlugin::<StencilOutline, OutlinePipeline>::new(
348356
RenderDebugFlags::empty(),
@@ -357,6 +365,11 @@ impl Plugin for OutlinePlugin {
357365
.register_required_components::<OutlineStencil, ComputedOutline>()
358366
.register_required_components::<OutlineVolume, ComputedOutline>()
359367
.register_required_components::<InheritOutline, ComputedOutline>()
368+
.init_resource::<OutlineEntitiesNeedingSpecialisation>()
369+
.add_systems(
370+
PostUpdate,
371+
check_outline_entities_needing_specialisation.after(AssetEvents),
372+
)
360373
.add_systems(
361374
PostUpdate,
362375
(
@@ -374,7 +387,14 @@ impl Plugin for OutlinePlugin {
374387
.add_render_command::<StencilOutline, DrawOutline>()
375388
.add_render_command::<OpaqueOutline, DrawOutline>()
376389
.add_render_command::<TransparentOutline, DrawOutline>()
377-
.add_systems(ExtractSchedule, extract_outline_view_uniforms)
390+
.add_systems(
391+
ExtractSchedule,
392+
(
393+
extract_outline_view_uniforms,
394+
extract_outlines,
395+
extract_outline_entities_needing_specialisation,
396+
),
397+
)
378398
.add_systems(
379399
Render,
380400
msaa::prepare_msaa_extra_writeback_pipelines.in_set(RenderSet::Prepare),
@@ -388,10 +408,7 @@ impl Plugin for OutlinePlugin {
388408
)
389409
.in_set(RenderSet::PrepareBindGroups),
390410
)
391-
.add_systems(
392-
Render,
393-
prepare_render_outlines.in_set(RenderSet::PrepareMeshes),
394-
)
411+
.add_systems(Render, specialise_outlines.in_set(RenderSet::PrepareMeshes))
395412
.add_systems(Render, queue_outline_mesh.in_set(RenderSet::QueueMeshes))
396413
.add_systems(
397414
Render,
@@ -442,7 +459,9 @@ impl Plugin for OutlinePlugin {
442459
fn finish(&self, app: &mut App) {
443460
let render_app = app.sub_app_mut(RenderApp);
444461
render_app
445-
.init_resource::<RenderOutlines>()
462+
.init_resource::<RenderOutlineInstances>()
463+
.init_resource::<OutlineEntitySpecialisationTicks>()
464+
.init_resource::<OutlinePipelineCache>()
446465
.init_resource::<OutlinePipeline>()
447466
.init_resource::<AlphaMaskBindGroups>();
448467

src/node.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ use crate::view_uniforms::OutlineQueueStatus;
2727
pub(crate) struct OutlineBatchSetKey {
2828
pub pipeline: CachedRenderPipelineId,
2929
pub draw_function: DrawFunctionId,
30-
pub material_bind_group_id: Option<u32>,
3130
pub vertex_slab: SlabId,
3231
pub index_slab: Option<SlabId>,
3332
}

src/pipeline.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ use bitfield::{bitfield_bitrange, bitfield_fields};
3131
use nonmax::NonMaxU32;
3232
use wgpu_types::{Backends, PushConstantRange, SamplerBindingType, TextureSampleType};
3333

34-
use crate::uniforms::{DepthMode, OutlineInstanceUniform, RenderOutlines};
34+
use crate::uniforms::{DepthMode, OutlineInstanceUniform, RenderOutlineInstances};
3535
use crate::view_uniforms::OutlineViewUniform;
3636
use crate::{TextureChannel, ATTRIBUTE_OUTLINE_NORMAL};
3737

@@ -416,15 +416,15 @@ impl SpecializedMeshPipeline for OutlinePipeline {
416416
}
417417

418418
impl GetBatchData for OutlinePipeline {
419-
type Param = (SRes<RenderOutlines>, SRes<MeshAllocator>);
419+
type Param = (SRes<RenderOutlineInstances>, SRes<MeshAllocator>);
420420
type CompareData = (AssetId<Mesh>, Option<AssetId<Image>>);
421421
type BufferData = OutlineInstanceUniform;
422422

423423
fn get_batch_data(
424424
(render_outlines, mesh_allocator): &SystemParamItem<Self::Param>,
425425
(_entity, main_entity): (Entity, MainEntity),
426426
) -> Option<(Self::BufferData, Option<Self::CompareData>)> {
427-
let outline = render_outlines.get(main_entity)?;
427+
let outline = render_outlines.get(&main_entity)?;
428428
let mut instance_data = outline.instance_data.clone();
429429
instance_data.first_vertex_index = mesh_allocator
430430
.mesh_vertex_slice(&outline.mesh_id)
@@ -449,7 +449,7 @@ impl GetFullBatchData for OutlinePipeline {
449449
(render_outlines, mesh_allocator): &SystemParamItem<Self::Param>,
450450
main_entity: MainEntity,
451451
) -> Option<Self::BufferData> {
452-
let outline = render_outlines.get(main_entity)?;
452+
let outline = render_outlines.get(&main_entity)?;
453453
let mut instance_data = outline.instance_data.clone();
454454
instance_data.first_vertex_index = mesh_allocator
455455
.mesh_vertex_slice(&outline.mesh_id)

0 commit comments

Comments
 (0)