Merge branch 'main' into dlss3
This commit is contained in:
commit
950f3e8707
@ -20,8 +20,7 @@ use tracing::warn;
|
||||
|
||||
use super::{
|
||||
ClusterConfig, ClusterFarZMode, ClusteredDecal, Clusters, GlobalClusterSettings,
|
||||
GlobalVisibleClusterableObjects, ViewClusterBindings, VisibleClusterableObjects,
|
||||
MAX_UNIFORM_BUFFER_CLUSTERABLE_OBJECTS,
|
||||
GlobalVisibleClusterableObjects, VisibleClusterableObjects,
|
||||
};
|
||||
use crate::{
|
||||
prelude::EnvironmentMapLight, ExtractedPointLight, LightProbe, PointLight, SpotLight,
|
||||
@ -263,7 +262,7 @@ pub(crate) fn assign_objects_to_clusters(
|
||||
}));
|
||||
}
|
||||
|
||||
if clusterable_objects.len() > MAX_UNIFORM_BUFFER_CLUSTERABLE_OBJECTS
|
||||
if clusterable_objects.len() > global_cluster_settings.max_uniform_buffer_clusterable_objects
|
||||
&& !global_cluster_settings.supports_storage_buffers
|
||||
{
|
||||
clusterable_objects.sort_by_cached_key(|clusterable_object| {
|
||||
@ -282,7 +281,9 @@ pub(crate) fn assign_objects_to_clusters(
|
||||
let mut clusterable_objects_in_view_count = 0;
|
||||
clusterable_objects.retain(|clusterable_object| {
|
||||
// take one extra clusterable object to check if we should emit the warning
|
||||
if clusterable_objects_in_view_count == MAX_UNIFORM_BUFFER_CLUSTERABLE_OBJECTS + 1 {
|
||||
if clusterable_objects_in_view_count
|
||||
== global_cluster_settings.max_uniform_buffer_clusterable_objects + 1
|
||||
{
|
||||
false
|
||||
} else {
|
||||
let clusterable_object_sphere = clusterable_object.sphere();
|
||||
@ -298,17 +299,19 @@ pub(crate) fn assign_objects_to_clusters(
|
||||
}
|
||||
});
|
||||
|
||||
if clusterable_objects.len() > MAX_UNIFORM_BUFFER_CLUSTERABLE_OBJECTS
|
||||
if clusterable_objects.len()
|
||||
> global_cluster_settings.max_uniform_buffer_clusterable_objects
|
||||
&& !*max_clusterable_objects_warning_emitted
|
||||
{
|
||||
warn!(
|
||||
"MAX_UNIFORM_BUFFER_CLUSTERABLE_OBJECTS ({}) exceeded",
|
||||
MAX_UNIFORM_BUFFER_CLUSTERABLE_OBJECTS
|
||||
"max_uniform_buffer_clusterable_objects ({}) exceeded",
|
||||
global_cluster_settings.max_uniform_buffer_clusterable_objects
|
||||
);
|
||||
*max_clusterable_objects_warning_emitted = true;
|
||||
}
|
||||
|
||||
clusterable_objects.truncate(MAX_UNIFORM_BUFFER_CLUSTERABLE_OBJECTS);
|
||||
clusterable_objects
|
||||
.truncate(global_cluster_settings.max_uniform_buffer_clusterable_objects);
|
||||
}
|
||||
|
||||
for (
|
||||
@ -448,14 +451,17 @@ pub(crate) fn assign_objects_to_clusters(
|
||||
(xy_count.x + x_overlap) * (xy_count.y + y_overlap) * z_count as f32;
|
||||
}
|
||||
|
||||
if cluster_index_estimate > ViewClusterBindings::MAX_INDICES as f32 {
|
||||
if cluster_index_estimate
|
||||
> global_cluster_settings.view_cluster_bindings_max_indices as f32
|
||||
{
|
||||
// scale x and y cluster count to be able to fit all our indices
|
||||
|
||||
// we take the ratio of the actual indices over the index estimate.
|
||||
// this is not guaranteed to be small enough due to overlapped tiles, but
|
||||
// the conservative estimate is more than sufficient to cover the
|
||||
// difference
|
||||
let index_ratio = ViewClusterBindings::MAX_INDICES as f32 / cluster_index_estimate;
|
||||
let index_ratio = global_cluster_settings.view_cluster_bindings_max_indices as f32
|
||||
/ cluster_index_estimate;
|
||||
let xy_ratio = index_ratio.sqrt();
|
||||
|
||||
requested_cluster_dimensions.x =
|
||||
|
@ -47,6 +47,8 @@ pub(crate) fn make_global_cluster_settings(world: &World) -> GlobalClusterSettin
|
||||
GlobalClusterSettings {
|
||||
supports_storage_buffers,
|
||||
clustered_decals_are_usable,
|
||||
max_uniform_buffer_clusterable_objects: MAX_UNIFORM_BUFFER_CLUSTERABLE_OBJECTS,
|
||||
view_cluster_bindings_max_indices: ViewClusterBindings::MAX_INDICES,
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -43,6 +43,8 @@ mod test;
|
||||
pub struct GlobalClusterSettings {
|
||||
pub supports_storage_buffers: bool,
|
||||
pub clustered_decals_are_usable: bool,
|
||||
pub max_uniform_buffer_clusterable_objects: usize,
|
||||
pub view_cluster_bindings_max_indices: usize,
|
||||
}
|
||||
|
||||
/// Configure the far z-plane mode used for the furthest depth slice for clustered forward
|
||||
|
@ -251,7 +251,7 @@ fn fragment(@builtin(position) position: vec4<f32>) -> @location(0) vec4<f32> {
|
||||
// case.
|
||||
let P_uvw = Ro_uvw + Rd_step_uvw * f32(step);
|
||||
if (all(P_uvw >= vec3(0.0)) && all(P_uvw <= vec3(1.0))) {
|
||||
density *= textureSample(density_texture, density_sampler, P_uvw + density_texture_offset).r;
|
||||
density *= textureSampleLevel(density_texture, density_sampler, P_uvw + density_texture_offset, 0.0).r;
|
||||
} else {
|
||||
density = 0.0;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user