Skip to content

Commit

Permalink
rebase
Browse files Browse the repository at this point in the history
  • Loading branch information
robtfm committed Aug 20, 2024
1 parent f59a6a9 commit 2b65c83
Show file tree
Hide file tree
Showing 6 changed files with 55 additions and 3 deletions.
3 changes: 3 additions & 0 deletions crates/bevy_pbr/src/material.rs
Original file line number Diff line number Diff line change
Expand Up @@ -953,6 +953,9 @@ impl<M: Material> RenderAsset for PreparedMaterial<M> {
Err(AsBindGroupError::RetryNextUpdate) => {
Err(PrepareAssetError::RetryNextUpdate(material))
}
Err(other) => {
Err(PrepareAssetError::AsBindGroupError(other))
}
}
}
}
Expand Down
35 changes: 34 additions & 1 deletion crates/bevy_render/macros/src/as_bind_group.rs
Original file line number Diff line number Diff line change
Expand Up @@ -355,14 +355,47 @@ pub fn derive_as_bind_group(ast: syn::DeriveInput) -> Result<TokenStream> {

let fallback_image = get_fallback_image(&render_path, *dimension);

let expected_samplers = match sampler_binding_type {
SamplerBindingType::Filtering => {
quote!( [#render_path::render_resource::TextureSampleType::Float { filterable: true }] )
}
SamplerBindingType::NonFiltering => quote!([
#render_path::render_resource::TextureSampleType::Float { filterable: false },
#render_path::render_resource::TextureSampleType::Sint,
#render_path::render_resource::TextureSampleType::Uint,
]),
SamplerBindingType::Comparison => {
quote!( [#render_path::render_resource::TextureSampleType::Depth] )
}
};

// insert fallible texture-based entries at 0 so that if we fail here, we exit before allocating any buffers
binding_impls.insert(0, quote! {
(
#binding_index,
#render_path::render_resource::OwnedBindingResource::Sampler({
let handle: Option<&#asset_path::Handle<#render_path::texture::Image>> = (&self.#field_name).into();
if let Some(handle) = handle {
images.get(handle).ok_or_else(|| #render_path::render_resource::AsBindGroupError::RetryNextUpdate)?.sampler.clone()
let image = images.get(handle).ok_or_else(|| #render_path::render_resource::AsBindGroupError::RetryNextUpdate)?;

let Some(sample_type) = image.texture_format.sample_type(None, None) else {
return Err(#render_path::render_resource::AsBindGroupError::InvalidSamplerType(
#binding_index,
"None".to_string(),
format!("{:?}", #expected_samplers),
));
};

let valid = #expected_samplers.contains(&sample_type);

if !valid {
return Err(#render_path::render_resource::AsBindGroupError::InvalidSamplerType(
#binding_index,
format!("{:?}", sample_type),
format!("{:?}", #expected_samplers),
));
}
image.sampler.clone()
} else {
#fallback_image.sampler.clone()
}
Expand Down
12 changes: 10 additions & 2 deletions crates/bevy_render/src/render_asset.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
use crate::{ExtractSchedule, MainWorld, Render, RenderApp, RenderSet};
use crate::{render_resource::AsBindGroupError, ExtractSchedule, MainWorld, Render, RenderApp, RenderSet};
use bevy_app::{App, Plugin, SubApp};
use bevy_asset::{Asset, AssetEvent, AssetId, Assets};
use bevy_ecs::{
Expand All @@ -9,7 +9,7 @@ use bevy_ecs::{
};
use bevy_reflect::{Reflect, ReflectDeserialize, ReflectSerialize};
use bevy_render_macros::ExtractResource;
use bevy_utils::{tracing::debug, HashMap, HashSet};
use bevy_utils::{tracing::{debug, error}, HashMap, HashSet};
use serde::{Deserialize, Serialize};
use std::marker::PhantomData;
use thiserror::Error;
Expand All @@ -18,6 +18,8 @@ use thiserror::Error;
pub enum PrepareAssetError<E: Send + Sync + 'static> {
#[error("Failed to prepare asset")]
RetryNextUpdate(E),
#[error("Failed to build bind group: {0}")]
AsBindGroupError(AsBindGroupError),
}

/// Describes how an asset gets extracted and prepared for rendering.
Expand Down Expand Up @@ -359,6 +361,9 @@ pub fn prepare_assets<A: RenderAsset>(
Err(PrepareAssetError::RetryNextUpdate(extracted_asset)) => {
prepare_next_frame.assets.push((id, extracted_asset));
}
Err(PrepareAssetError::AsBindGroupError(e)) => {
error!("{} Bind group construction failed: {e}", std::any::type_name::<A>()) ;
}
}
}

Expand Down Expand Up @@ -391,6 +396,9 @@ pub fn prepare_assets<A: RenderAsset>(
Err(PrepareAssetError::RetryNextUpdate(extracted_asset)) => {
prepare_next_frame.assets.push((id, extracted_asset));
}
Err(PrepareAssetError::AsBindGroupError(e)) => {
error!("{} Bind group construction failed: {e}", std::any::type_name::<A>()) ;
}
}
}

Expand Down
2 changes: 2 additions & 0 deletions crates/bevy_render/src/render_resource/bind_group.rs
Original file line number Diff line number Diff line change
Expand Up @@ -352,6 +352,8 @@ pub enum AsBindGroupError {
/// The bind group could not be generated. Try again next frame.
#[error("The bind group could not be generated")]
RetryNextUpdate,
#[error("At binding index{0}, the provided image sampler `{1}` does not match the required sampler type(s) `{2}`.")]
InvalidSamplerType(u32, String, String),
}

/// A prepared bind group returned as a result of [`AsBindGroup::as_bind_group`].
Expand Down
3 changes: 3 additions & 0 deletions crates/bevy_sprite/src/mesh2d/material.rs
Original file line number Diff line number Diff line change
Expand Up @@ -615,6 +615,9 @@ impl<M: Material2d> RenderAsset for PreparedMaterial2d<M> {
Err(AsBindGroupError::RetryNextUpdate) => {
Err(PrepareAssetError::RetryNextUpdate(material))
}
Err(other) => {
Err(PrepareAssetError::AsBindGroupError(other))
}
}
}
}
Expand Down
3 changes: 3 additions & 0 deletions crates/bevy_ui/src/render/ui_material_pipeline.rs
Original file line number Diff line number Diff line change
Expand Up @@ -624,6 +624,9 @@ impl<M: UiMaterial> RenderAsset for PreparedUiMaterial<M> {
Err(AsBindGroupError::RetryNextUpdate) => {
Err(PrepareAssetError::RetryNextUpdate(material))
}
Err(other) => {
Err(PrepareAssetError::AsBindGroupError(other))
}
}
}
}
Expand Down

0 comments on commit 2b65c83

Please sign in to comment.