Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
710b654
bump versions
ChristopherBiscardi Dec 24, 2025
8f9aa8c
implement Froms for MipmapFilterMode and ImageFilterMode
ChristopherBiscardi Dec 24, 2025
ee743f8
push constants are now immediates
ChristopherBiscardi Dec 24, 2025
d487417
push_constant address space is now the immediate address space
ChristopherBiscardi Dec 25, 2025
75d0a0b
update full feature list for capability detection
ChristopherBiscardi Dec 24, 2025
3ee13c6
update limits values. Some were moved to adapterinfo and thus are no …
ChristopherBiscardi Dec 24, 2025
5dda602
set multiview_mask to none
ChristopherBiscardi Dec 24, 2025
d60c0cd
error scope is now a guard
ChristopherBiscardi Dec 24, 2025
fcb2e31
find_adapter_by_name is now async because enumerate_adapters is async
ChristopherBiscardi Dec 25, 2025
f76b7f3
enable solari
ChristopherBiscardi Dec 25, 2025
f497164
multiview mask in examples
ChristopherBiscardi Dec 25, 2025
fd8d4e5
also use wgpu 28 in dlss_wgpu
ChristopherBiscardi Dec 25, 2025
067b4b9
enumerate_adapters is async; wait for it if necessary on linux
ChristopherBiscardi Dec 25, 2025
c53d84c
optional telemetry on vulkan
ChristopherBiscardi Dec 25, 2025
fe99a1e
the all important comma
ChristopherBiscardi Dec 25, 2025
0753f20
and the semicolon
ChristopherBiscardi Dec 25, 2025
18c5d68
meshlet pipelines push constants -> immediates
ChristopherBiscardi Dec 25, 2025
a9c6f2a
push constants are now immediates
ChristopherBiscardi Dec 25, 2025
bdacbf0
multiview mask in material_shade_nodes
ChristopherBiscardi Dec 25, 2025
3b2b655
push constants are now immediates: visibility_buffer_raster_node
ChristopherBiscardi Dec 25, 2025
bb5f440
more meshlets multiview_mask + push constants
ChristopherBiscardi Dec 25, 2025
e222549
wgpu 28 requires a minimum of rust 1.92
ChristopherBiscardi Dec 25, 2025
1789194
multiview_mask for wasm
ChristopherBiscardi Dec 25, 2025
53db3a5
bring up to date with dlss-wgpu encoder changes
ChristopherBiscardi Jan 10, 2026
2712514
Merge remote-tracking branch 'upstream' into wgpu-28
ChristopherBiscardi Jan 13, 2026
694270b
more push constants
ChristopherBiscardi Jan 13, 2026
5d3ffe7
mipmapfiltermode
ChristopherBiscardi Jan 13, 2026
cf30512
cleanup import from merge
ChristopherBiscardi Jan 13, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ keywords = ["game", "engine", "gamedev", "graphics", "bevy"]
license = "MIT OR Apache-2.0"
repository = "https://github.com/bevyengine/bevy"
documentation = "https://docs.rs/bevy"
rust-version = "1.89.0"
rust-version = "1.92.0"

[workspace]
resolver = "2"
Expand Down
3 changes: 2 additions & 1 deletion crates/bevy_anti_alias/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,8 @@ bevy_diagnostic = { path = "../bevy_diagnostic", version = "0.18.0-dev" }

# other
tracing = { version = "0.1", default-features = false, features = ["std"] }
dlss_wgpu = { version = "2", optional = true }
# dlss_wgpu = { version = "2", optional = true }
dlss_wgpu = { git = "https://github.com/ChristopherBiscardi/dlss_wgpu.git", branch = "wgpu-28", optional = true }
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This needs to land upstream and have a release before we can merge this PR.

uuid = { version = "1", optional = true }

[lints]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,7 @@ impl Node for CasNode {
depth_stencil_attachment: None,
timestamp_writes: None,
occlusion_query_set: None,
multiview_mask: None,
};

let mut render_pass = render_context
Expand Down
7 changes: 5 additions & 2 deletions crates/bevy_anti_alias/src/dlss/node.rs
Original file line number Diff line number Diff line change
Expand Up @@ -77,12 +77,13 @@ impl ViewNode for DlssNode<DlssSuperResolutionFeature> {
command_encoder.push_debug_group("dlss_super_resolution");
let time_span = diagnostics.time_span(command_encoder, "dlss_super_resolution");

dlss_context
let dlss_command_buffer = dlss_context
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why is this necessary? I might be missing something

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Mixing the wgpu encoding API with the raw encoding API is not longer allowed, so dlss_wgpu needed some changes, and this reflects the new usage.

.render(render_parameters, command_encoder, &adapter)
.expect("Failed to render DLSS Super Resolution");

time_span.end(command_encoder);
command_encoder.pop_debug_group();
render_context.add_command_buffer(dlss_command_buffer);

Ok(())
}
Expand Down Expand Up @@ -153,13 +154,15 @@ impl ViewNode for DlssNode<DlssRayReconstructionFeature> {
command_encoder.push_debug_group("dlss_ray_reconstruction");
let time_span = diagnostics.time_span(command_encoder, "dlss_ray_reconstruction");

dlss_context
let dlss_command_buffer = dlss_context
.render(render_parameters, command_encoder, &adapter)
.expect("Failed to render DLSS Ray Reconstruction");

time_span.end(command_encoder);
command_encoder.pop_debug_group();
Comment on lines 161 to 162
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think we need to move these to a new command encoder after add_command_buffer.

We basically need 3 command encoders:

  1. Regular bevy encoder, puts start timestamp before dlss, and records the barriers needed before dlss
  2. Dlss encoder
  3. Regular bevy encoder, puts end timestamp after dlss

However I think we'll need some changes to bevy's diagnostics API in order to make this work, as currently it expects you to use the same encoder to start/end a timestamp query iirc.

I can work on this after this PR, but just wanted to note it.


render_context.add_command_buffer(dlss_command_buffer);

Ok(())
}
}
2 changes: 1 addition & 1 deletion crates/bevy_anti_alias/src/fxaa/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,7 @@ pub fn init_fxaa_pipeline(
);

let sampler = render_device.create_sampler(&SamplerDescriptor {
mipmap_filter: FilterMode::Linear,
mipmap_filter: MipmapFilterMode::Linear,
mag_filter: FilterMode::Linear,
min_filter: FilterMode::Linear,
..default()
Expand Down
1 change: 1 addition & 0 deletions crates/bevy_anti_alias/src/fxaa/node.rs
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@ impl ViewNode for FxaaNode {
depth_stencil_attachment: None,
timestamp_writes: None,
occlusion_query_set: None,
multiview_mask: None,
};

let mut render_pass = render_context
Expand Down
3 changes: 3 additions & 0 deletions crates/bevy_anti_alias/src/smaa/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -944,6 +944,7 @@ fn perform_edge_detection(
}),
timestamp_writes: None,
occlusion_query_set: None,
multiview_mask: None,
};

// Run the actual render pass.
Expand Down Expand Up @@ -1003,6 +1004,7 @@ fn perform_blending_weight_calculation(
}),
timestamp_writes: None,
occlusion_query_set: None,
multiview_mask: None,
};

// Run the actual render pass.
Expand Down Expand Up @@ -1056,6 +1058,7 @@ fn perform_neighborhood_blending(
depth_stencil_attachment: None,
timestamp_writes: None,
occlusion_query_set: None,
multiview_mask: None,
};

let mut neighborhood_blending_render_pass = render_context
Expand Down
1 change: 1 addition & 0 deletions crates/bevy_anti_alias/src/taa/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -216,6 +216,7 @@ impl ViewNode for TemporalAntiAliasNode {
depth_stencil_attachment: None,
timestamp_writes: None,
occlusion_query_set: None,
multiview_mask: None,
});
let pass_span = diagnostics.pass_span(&mut taa_pass, "taa");

Expand Down
2 changes: 1 addition & 1 deletion crates/bevy_camera/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ bevy_color = { path = "../bevy_color", version = "0.18.0-dev", features = [
bevy_window = { path = "../bevy_window", version = "0.18.0-dev" }

# other
wgpu-types = { version = "27", default-features = false }
wgpu-types = { version = "28", default-features = false }
serde = { version = "1", default-features = false, features = ["derive"] }
thiserror = { version = "2", default-features = false }
downcast-rs = { version = "2", default-features = false, features = ["std"] }
Expand Down
2 changes: 1 addition & 1 deletion crates/bevy_color/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ serde = { version = "1.0", features = [
], default-features = false, optional = true }
thiserror = { version = "2", default-features = false }
derive_more = { version = "2", default-features = false, features = ["from"] }
wgpu-types = { version = "27", default-features = false, optional = true }
wgpu-types = { version = "28", default-features = false, optional = true }
encase = { version = "0.12", default-features = false, optional = true }

[features]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@ impl ViewNode for MainOpaquePass2dNode {
depth_stencil_attachment,
timestamp_writes: None,
occlusion_query_set: None,
multiview_mask: None,
});
let mut render_pass = TrackedRenderPass::new(&render_device, render_pass);
let pass_span = diagnostics.pass_span(&mut render_pass, "main_opaque_pass_2d");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@ impl ViewNode for MainTransparentPass2dNode {
depth_stencil_attachment,
timestamp_writes: None,
occlusion_query_set: None,
multiview_mask: None,
});
let mut render_pass = TrackedRenderPass::new(&render_device, render_pass);

Expand Down Expand Up @@ -107,6 +108,7 @@ impl ViewNode for MainTransparentPass2dNode {
depth_stencil_attachment: None,
timestamp_writes: None,
occlusion_query_set: None,
multiview_mask: None,
};

command_encoder.begin_render_pass(&pass_descriptor);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,7 @@ impl ViewNode for MainOpaquePass3dNode {
depth_stencil_attachment,
timestamp_writes: None,
occlusion_query_set: None,
multiview_mask: None,
});
let mut render_pass = TrackedRenderPass::new(&render_device, render_pass);
let pass_span = diagnostics.pass_span(&mut render_pass, "main_opaque_pass_3d");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@ impl ViewNode for MainTransmissivePass3dNode {
depth_stencil_attachment: Some(depth.get_attachment(StoreOp::Store)),
timestamp_writes: None,
occlusion_query_set: None,
multiview_mask: None,
};

// Run the transmissive pass, sorted back-to-front
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@ impl ViewNode for MainTransparentPass3dNode {
depth_stencil_attachment: Some(depth.get_attachment(StoreOp::Store)),
timestamp_writes: None,
occlusion_query_set: None,
multiview_mask: None,
});

let pass_span = diagnostics.pass_span(&mut render_pass, "main_transparent_pass_3d");
Expand Down Expand Up @@ -95,6 +96,7 @@ impl ViewNode for MainTransparentPass3dNode {
depth_stencil_attachment: None,
timestamp_writes: None,
occlusion_query_set: None,
multiview_mask: None,
};

render_context
Expand Down
1 change: 1 addition & 0 deletions crates/bevy_core_pipeline/src/deferred/copy_lighting_id.rs
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,7 @@ impl ViewNode for CopyDeferredLightingIdNode {
}),
timestamp_writes: None,
occlusion_query_set: None,
multiview_mask: None,
});

let pass_span = diagnostics.pass_span(&mut render_pass, "copy_deferred_lighting_id");
Expand Down
1 change: 1 addition & 0 deletions crates/bevy_core_pipeline/src/deferred/node.rs
Original file line number Diff line number Diff line change
Expand Up @@ -223,6 +223,7 @@ fn run_deferred_prepass<'w>(
depth_stencil_attachment,
timestamp_writes: None,
occlusion_query_set: None,
multiview_mask: None,
});
let mut render_pass = TrackedRenderPass::new(&render_device, render_pass);
let pass_span = diagnostic.pass_span(&mut render_pass, label);
Expand Down
1 change: 1 addition & 0 deletions crates/bevy_core_pipeline/src/fullscreen_material.rs
Original file line number Diff line number Diff line change
Expand Up @@ -318,6 +318,7 @@ impl<T: FullscreenMaterial> ViewNode for FullscreenMaterialNode<T> {
depth_stencil_attachment: None,
timestamp_writes: None,
occlusion_query_set: None,
multiview_mask: None,
});

render_pass.set_render_pipeline(pipeline);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,8 @@ use bevy_render::{
binding_types::{sampler, texture_2d, texture_2d_multisampled, texture_storage_2d},
BindGroup, BindGroupEntries, BindGroupLayout, BindGroupLayoutEntries,
CachedComputePipelineId, ComputePassDescriptor, ComputePipeline, ComputePipelineDescriptor,
Extent3d, IntoBinding, PipelineCache, PushConstantRange, Sampler, SamplerBindingType,
SamplerDescriptor, ShaderStages, SpecializedComputePipeline, SpecializedComputePipelines,
Extent3d, IntoBinding, PipelineCache, Sampler, SamplerBindingType, SamplerDescriptor,
ShaderStages, SpecializedComputePipeline, SpecializedComputePipelines,
StorageTextureAccess, TextureAspect, TextureDescriptor, TextureDimension, TextureFormat,
TextureSampleType, TextureUsages, TextureView, TextureViewDescriptor, TextureViewDimension,
},
Expand Down Expand Up @@ -428,10 +428,7 @@ impl SpecializedComputePipeline for DownsampleDepthPipeline {
ComputePipelineDescriptor {
label: Some(label),
layout: vec![self.bind_group_layout.clone()],
push_constant_ranges: vec![PushConstantRange {
stages: ShaderStages::COMPUTE,
range: 0..4,
}],
immediate_size: 4,
shader: self.shader.clone(),
shader_defs,
entry_point: Some(if key.contains(DownsampleDepthPipelineKey::SECOND_PHASE) {
Expand Down Expand Up @@ -624,8 +621,8 @@ impl ViewDepthPyramid {
timestamp_writes: None,
});
downsample_pass.set_pipeline(downsample_depth_first_pipeline);
// Pass the mip count as a push constant, for simplicity.
downsample_pass.set_push_constants(0, &self.mip_count.to_le_bytes());
// Pass the mip count as an immediate, for simplicity.
downsample_pass.set_immediates(0, &self.mip_count.to_le_bytes());
downsample_pass.set_bind_group(0, downsample_depth_bind_group, &[]);
downsample_pass.dispatch_workgroups(view_size.x.div_ceil(64), view_size.y.div_ceil(64), 1);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
@group(0) @binding(12) var mip_12: texture_storage_2d<r32float, write>;
@group(0) @binding(13) var samplr: sampler;
struct Constants { max_mip_level: u32 }
var<push_constant> constants: Constants;
var<immediate> constants: Constants;

/// Generates a hierarchical depth buffer.
/// Based on FidelityFX SPD v2.1 https://github.com/GPUOpen-LibrariesAndSDKs/FidelityFX-SDK/blob/d7531ae47d8b36a5d4025663e731a47a38be882f/sdk/include/FidelityFX/gpu/spd/ffx_spd.h#L528
Expand Down
10 changes: 5 additions & 5 deletions crates/bevy_core_pipeline/src/mip_generation/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -36,8 +36,8 @@ use bevy_render::{
diagnostic::RecordDiagnostics as _,
render_asset::RenderAssets,
render_resource::{
binding_types::uniform_buffer, BindGroupLayoutDescriptor, FilterMode, ShaderType,
TextureFormatFeatureFlags, UniformBuffer,
binding_types::uniform_buffer, BindGroupLayoutDescriptor, FilterMode, MipmapFilterMode,
ShaderType, TextureFormatFeatureFlags, UniformBuffer,
},
renderer::{RenderAdapter, RenderQueue},
settings::WgpuFeatures,
Expand Down Expand Up @@ -372,7 +372,7 @@ impl FromWorld for MipGenerationResources {
label: Some("mip generation sampler"),
mag_filter: FilterMode::Linear,
min_filter: FilterMode::Linear,
mipmap_filter: FilterMode::Nearest,
mipmap_filter: MipmapFilterMode::Nearest,
..default()
}),
}
Expand Down Expand Up @@ -865,7 +865,7 @@ fn create_downsampling_pipelines(
pipeline_cache.queue_compute_pipeline(ComputePipelineDescriptor {
label: Some(format!("mip generation pipeline, pass 1 ({:?})", texture_format).into()),
layout: vec![downsampling_bind_group_layout_pass_1.clone()],
push_constant_ranges: vec![],
immediate_size: 0,
shader: downsample_shader.clone(),
shader_defs: downsampling_first_shader_defs,
entry_point: Some("downsample_first".into()),
Expand All @@ -878,7 +878,7 @@ fn create_downsampling_pipelines(
pipeline_cache.queue_compute_pipeline(ComputePipelineDescriptor {
label: Some(format!("mip generation pipeline, pass 2 ({:?})", texture_format).into()),
layout: vec![downsampling_bind_group_layout_pass_2.clone()],
push_constant_ranges: vec![],
immediate_size: 0,
shader: downsample_shader.clone(),
shader_defs: downsampling_second_shader_defs,
entry_point: Some("downsample_second".into()),
Expand Down
1 change: 1 addition & 0 deletions crates/bevy_core_pipeline/src/oit/resolve/node.rs
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@ impl ViewNode for OitResolveNode {
depth_stencil_attachment: None,
timestamp_writes: None,
occlusion_query_set: None,
multiview_mask: None,
});
let pass_span = diagnostics.pass_span(&mut render_pass, "oit_resolve");

Expand Down
1 change: 1 addition & 0 deletions crates/bevy_core_pipeline/src/prepass/node.rs
Original file line number Diff line number Diff line change
Expand Up @@ -182,6 +182,7 @@ fn run_prepass<'w>(
depth_stencil_attachment,
timestamp_writes: None,
occlusion_query_set: None,
multiview_mask: None,
});

let mut render_pass = TrackedRenderPass::new(&render_device, render_pass);
Expand Down
1 change: 1 addition & 0 deletions crates/bevy_core_pipeline/src/tonemapping/node.rs
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,7 @@ impl ViewNode for TonemappingNode {
depth_stencil_attachment: None,
timestamp_writes: None,
occlusion_query_set: None,
multiview_mask: None,
};

let mut render_pass = render_context
Expand Down
1 change: 1 addition & 0 deletions crates/bevy_core_pipeline/src/upscaling/node.rs
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,7 @@ impl ViewNode for UpscalingNode {
depth_stencil_attachment: None,
timestamp_writes: None,
occlusion_query_set: None,
multiview_mask: None,
};

let mut render_pass = render_context
Expand Down
2 changes: 1 addition & 1 deletion crates/bevy_image/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ image = { version = "0.25.2", default-features = false }
# misc
bitflags = { version = "2.3", features = ["serde"] }
bytemuck = { version = "1.5" }
wgpu-types = { version = "27", default-features = false }
wgpu-types = { version = "28", default-features = false }
serde = { version = "1", features = ["derive"] }
thiserror = { version = "2", default-features = false }
futures-lite = "2.0.1"
Expand Down
24 changes: 21 additions & 3 deletions crates/bevy_image/src/image.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,9 @@ use core::hash::Hash;
use serde::{Deserialize, Serialize};
use thiserror::Error;
use wgpu_types::{
AddressMode, CompareFunction, Extent3d, Features, FilterMode, SamplerBorderColor,
SamplerDescriptor, TextureDataOrder, TextureDescriptor, TextureDimension, TextureFormat,
TextureUsages, TextureViewDescriptor,
AddressMode, CompareFunction, Extent3d, Features, FilterMode, MipmapFilterMode,
SamplerBorderColor, SamplerDescriptor, TextureDataOrder, TextureDescriptor, TextureDimension,
TextureFormat, TextureUsages, TextureViewDescriptor,
};

/// Trait used to provide default values for Bevy-external types that
Expand Down Expand Up @@ -891,6 +891,15 @@ impl From<ImageFilterMode> for FilterMode {
}
}

impl From<ImageFilterMode> for MipmapFilterMode {
fn from(value: ImageFilterMode) -> Self {
match value {
ImageFilterMode::Nearest => MipmapFilterMode::Nearest,
ImageFilterMode::Linear => MipmapFilterMode::Linear,
}
}
}

impl From<ImageCompareFunction> for CompareFunction {
fn from(value: ImageCompareFunction) -> Self {
match value {
Expand Down Expand Up @@ -928,6 +937,15 @@ impl From<AddressMode> for ImageAddressMode {
}
}

impl From<MipmapFilterMode> for ImageFilterMode {
fn from(value: MipmapFilterMode) -> Self {
match value {
MipmapFilterMode::Nearest => ImageFilterMode::Nearest,
MipmapFilterMode::Linear => ImageFilterMode::Linear,
}
}
}

impl From<FilterMode> for ImageFilterMode {
fn from(value: FilterMode) -> Self {
match value {
Expand Down
2 changes: 1 addition & 1 deletion crates/bevy_mesh/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ bevy_platform = { path = "../bevy_platform", version = "0.18.0-dev", default-fea
# other
bitflags = { version = "2.3", features = ["serde"] }
bytemuck = { version = "1.5" }
wgpu-types = { version = "27", default-features = false }
wgpu-types = { version = "28", default-features = false }
serde = { version = "1", default-features = false, features = [
"derive",
], optional = true }
Expand Down
1 change: 1 addition & 0 deletions crates/bevy_pbr/src/atmosphere/node.rs
Original file line number Diff line number Diff line change
Expand Up @@ -212,6 +212,7 @@ impl ViewNode for RenderSkyNode {
depth_stencil_attachment: None,
timestamp_writes: None,
occlusion_query_set: None,
multiview_mask: None,
});
let pass_span = diagnostics.pass_span(&mut render_sky_pass, "render_sky");

Expand Down
2 changes: 1 addition & 1 deletion crates/bevy_pbr/src/atmosphere/resources.rs
Original file line number Diff line number Diff line change
Expand Up @@ -238,7 +238,7 @@ impl FromWorld for AtmosphereSampler {
let sampler = render_device.create_sampler(&SamplerDescriptor {
mag_filter: FilterMode::Linear,
min_filter: FilterMode::Linear,
mipmap_filter: FilterMode::Nearest,
mipmap_filter: MipmapFilterMode::Nearest,
..Default::default()
});

Expand Down
Loading
Loading