Skip to content

Commit 04c6124

Browse files
cartsuperdump
authored andcommitted
Move storage buffer specialization out of key and into "pipeline type"
1 parent 8c9a8a5 commit 04c6124

File tree

5 files changed

+28
-39
lines changed

5 files changed

+28
-39
lines changed

crates/bevy_pbr/src/material.rs

Lines changed: 10 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ use std::marker::PhantomData;
3939
/// way to render [`Mesh`] entities with custom shader logic. For materials that can specialize their [`RenderPipelineDescriptor`]
4040
/// based on specific material values, see [`SpecializedMaterial`]. [`Material`] automatically implements [`SpecializedMaterial`]
4141
/// and can be used anywhere that type is used (such as [`MaterialPlugin`]).
42-
pub trait Material: Asset + RenderAsset {
42+
pub trait Material: Asset + RenderAsset + Sized {
4343
/// Returns this material's [`BindGroup`]. This should match the layout returned by [`Material::bind_group_layout`].
4444
fn bind_group(material: &<Self as RenderAsset>::PreparedAsset) -> &BindGroup;
4545

@@ -78,6 +78,7 @@ pub trait Material: Asset + RenderAsset {
7878
#[allow(unused_variables)]
7979
#[inline]
8080
fn specialize(
81+
pipeline: &MaterialPipeline<Self>,
8182
descriptor: &mut RenderPipelineDescriptor,
8283
layout: &MeshVertexBufferLayout,
8384
) -> Result<(), SpecializedMeshPipelineError> {
@@ -89,19 +90,16 @@ impl<M: Material> SpecializedMaterial for M {
8990
type Key = ();
9091

9192
#[inline]
92-
fn key(
93-
_render_device: &RenderDevice,
94-
_material: &<Self as RenderAsset>::PreparedAsset,
95-
) -> Self::Key {
96-
}
93+
fn key(_material: &<Self as RenderAsset>::PreparedAsset) -> Self::Key {}
9794

9895
#[inline]
9996
fn specialize(
97+
pipeline: &MaterialPipeline<Self>,
10098
descriptor: &mut RenderPipelineDescriptor,
10199
_key: Self::Key,
102100
layout: &MeshVertexBufferLayout,
103101
) -> Result<(), SpecializedMeshPipelineError> {
104-
<M as Material>::specialize(descriptor, layout)
102+
<M as Material>::specialize(pipeline, descriptor, layout)
105103
}
106104

107105
#[inline]
@@ -141,20 +139,18 @@ impl<M: Material> SpecializedMaterial for M {
141139
/// way to render [`Mesh`] entities with custom shader logic. [`SpecializedMaterials`](SpecializedMaterial) use their [`SpecializedMaterial::Key`]
142140
/// to customize their [`RenderPipelineDescriptor`] based on specific material values. The slightly simpler [`Material`] trait
143141
/// should be used for materials that do not need specialization. [`Material`] types automatically implement [`SpecializedMaterial`].
144-
pub trait SpecializedMaterial: Asset + RenderAsset {
142+
pub trait SpecializedMaterial: Asset + RenderAsset + Sized {
145143
/// The key used to specialize this material's [`RenderPipelineDescriptor`].
146144
type Key: PartialEq + Eq + Hash + Clone + Send + Sync;
147145

148146
/// Extract the [`SpecializedMaterial::Key`] for the "prepared" version of this material. This key will be
149147
/// passed in to the [`SpecializedMaterial::specialize`] function when compiling the [`RenderPipeline`](bevy_render::render_resource::RenderPipeline)
150148
/// for a given entity's material.
151-
fn key(
152-
render_device: &RenderDevice,
153-
material: &<Self as RenderAsset>::PreparedAsset,
154-
) -> Self::Key;
149+
fn key(material: &<Self as RenderAsset>::PreparedAsset) -> Self::Key;
155150

156151
/// Specializes the given `descriptor` according to the given `key`.
157152
fn specialize(
153+
pipeline: &MaterialPipeline<Self>,
158154
descriptor: &mut RenderPipelineDescriptor,
159155
key: Self::Key,
160156
layout: &MeshVertexBufferLayout,
@@ -258,7 +254,7 @@ impl<M: SpecializedMaterial> SpecializedMeshPipeline for MaterialPipeline<M> {
258254
let descriptor_layout = descriptor.layout.as_mut().unwrap();
259255
descriptor_layout.insert(1, self.material_layout.clone());
260256

261-
M::specialize(&mut descriptor, key.material_key, layout)?;
257+
M::specialize(self, &mut descriptor, key.material_key, layout)?;
262258
Ok(descriptor)
263259
}
264260
}
@@ -315,7 +311,6 @@ pub fn queue_material_meshes<M: SpecializedMaterial>(
315311
material_pipeline: Res<MaterialPipeline<M>>,
316312
mut pipelines: ResMut<SpecializedMeshPipelines<MaterialPipeline<M>>>,
317313
mut pipeline_cache: ResMut<PipelineCache>,
318-
render_device: Res<RenderDevice>,
319314
msaa: Res<Msaa>,
320315
render_meshes: Res<RenderAssets<Mesh>>,
321316
render_materials: Res<RenderAssets<M>>,
@@ -328,7 +323,6 @@ pub fn queue_material_meshes<M: SpecializedMaterial>(
328323
&mut RenderPhase<Transparent3d>,
329324
)>,
330325
) {
331-
let render_device = render_device.into_inner();
332326
for (view, visible_entities, mut opaque_phase, mut alpha_mask_phase, mut transparent_phase) in
333327
views.iter_mut()
334328
{
@@ -363,7 +357,7 @@ pub fn queue_material_meshes<M: SpecializedMaterial>(
363357
mesh_key |= MeshPipelineKey::TRANSPARENT_MAIN_PASS;
364358
}
365359

366-
let material_key = M::key(render_device, material);
360+
let material_key = M::key(material);
367361

368362
let pipeline_id = pipelines.specialize(
369363
&mut pipeline_cache,

crates/bevy_pbr/src/pbr_material.rs

Lines changed: 3 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,4 @@
1-
use crate::{
2-
AlphaMode, MaterialPipeline, SpecializedMaterial, CLUSTERED_FORWARD_STORAGE_BUFFER_COUNT,
3-
PBR_SHADER_HANDLE,
4-
};
1+
use crate::{AlphaMode, MaterialPipeline, SpecializedMaterial, PBR_SHADER_HANDLE};
52
use bevy_asset::{AssetServer, Handle};
63
use bevy_ecs::system::{lifetimeless::SRes, SystemParamItem};
74
use bevy_math::Vec4;
@@ -360,28 +357,20 @@ impl RenderAsset for StandardMaterial {
360357
pub struct StandardMaterialKey {
361358
normal_map: bool,
362359
cull_mode: Option<Face>,
363-
use_storage_buffers: bool,
364360
}
365361

366362
impl SpecializedMaterial for StandardMaterial {
367363
type Key = StandardMaterialKey;
368364

369-
fn key(
370-
render_device: &RenderDevice,
371-
render_asset: &<Self as RenderAsset>::PreparedAsset,
372-
) -> Self::Key {
365+
fn key(render_asset: &<Self as RenderAsset>::PreparedAsset) -> Self::Key {
373366
StandardMaterialKey {
374367
normal_map: render_asset.has_normal_map,
375368
cull_mode: render_asset.cull_mode,
376-
use_storage_buffers: matches!(
377-
render_device
378-
.get_supported_read_only_binding_type(CLUSTERED_FORWARD_STORAGE_BUFFER_COUNT),
379-
BufferBindingType::Storage { .. }
380-
),
381369
}
382370
}
383371

384372
fn specialize(
373+
_pipeline: &MaterialPipeline<Self>,
385374
descriptor: &mut RenderPipelineDescriptor,
386375
key: Self::Key,
387376
_layout: &MeshVertexBufferLayout,
@@ -395,14 +384,6 @@ impl SpecializedMaterial for StandardMaterial {
395384
.push(String::from("STANDARDMATERIAL_NORMAL_MAP"));
396385
}
397386
descriptor.primitive.cull_mode = key.cull_mode;
398-
if !key.use_storage_buffers {
399-
descriptor
400-
.fragment
401-
.as_mut()
402-
.unwrap()
403-
.shader_defs
404-
.push(String::from("NO_STORAGE_BUFFERS_SUPPORT"));
405-
}
406387
if let Some(label) = &mut descriptor.label {
407388
*label = format!("pbr_{}", *label).into();
408389
}

crates/bevy_pbr/src/render/mesh.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -560,6 +560,18 @@ impl SpecializedMeshPipeline for MeshPipeline {
560560
vertex_attributes.push(Mesh::ATTRIBUTE_TANGENT.at_shader_location(3));
561561
}
562562

563+
// TODO: consider exposing this in shaders in a more generally useful way, such as:
564+
// # if AVAILABLE_STORAGE_BUFFER_BINDINGS == 3
565+
// /* use storage buffers here */
566+
// # elif
567+
// /* use uniforms here */
568+
if !matches!(
569+
self.clustered_forward_buffer_binding_type,
570+
BufferBindingType::Storage { .. }
571+
) {
572+
shader_defs.push(String::from("NO_STORAGE_BUFFERS_SUPPORT"));
573+
}
574+
563575
let mut bind_group_layout = vec![self.view_layout.clone()];
564576
if layout.contains(Mesh::ATTRIBUTE_JOINT_INDEX)
565577
&& layout.contains(Mesh::ATTRIBUTE_JOINT_WEIGHT)

examples/shader/custom_vertex_attribute.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,7 @@ impl Material for CustomMaterial {
137137
}
138138

139139
fn specialize(
140+
_pipeline: &MaterialPipeline<Self>,
140141
descriptor: &mut RenderPipelineDescriptor,
141142
layout: &MeshVertexBufferLayout,
142143
) -> Result<(), SpecializedMeshPipelineError> {

examples/shader/shader_material_glsl.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,9 +94,10 @@ impl RenderAsset for CustomMaterial {
9494
impl SpecializedMaterial for CustomMaterial {
9595
type Key = ();
9696

97-
fn key(_: &RenderDevice, _: &<CustomMaterial as RenderAsset>::PreparedAsset) -> Self::Key {}
97+
fn key(_: &<CustomMaterial as RenderAsset>::PreparedAsset) -> Self::Key {}
9898

9999
fn specialize(
100+
_pipeline: &MaterialPipeline<Self>,
100101
descriptor: &mut RenderPipelineDescriptor,
101102
_: Self::Key,
102103
_layout: &MeshVertexBufferLayout,

0 commit comments

Comments
 (0)