From 6d62bdcd69c3f9cb9e9f6c07b0f5e0cf418fa36f Mon Sep 17 00:00:00 2001 From: atlas dostal Date: Wed, 7 Jan 2026 08:23:00 -0500 Subject: [PATCH 1/2] move define_atomic_id to bevy_utils --- .../src/render_resource/bind_group.rs | 2 +- .../src/render_resource/bind_group_layout.rs | 3 +- .../bevy_render/src/render_resource/buffer.rs | 2 +- crates/bevy_render/src/render_resource/mod.rs | 1 - .../src/render_resource/pipeline.rs | 2 +- .../src/render_resource/texture.rs | 2 +- crates/bevy_shader/Cargo.toml | 1 + crates/bevy_shader/src/shader.rs | 30 ++----------------- .../src/atomic_id.rs} | 1 + crates/bevy_utils/src/lib.rs | 1 + 10 files changed, 11 insertions(+), 34 deletions(-) rename crates/{bevy_render/src/render_resource/resource_macros.rs => bevy_utils/src/atomic_id.rs} (94%) diff --git a/crates/bevy_render/src/render_resource/bind_group.rs b/crates/bevy_render/src/render_resource/bind_group.rs index fe750e70c9f33..10d3760f45f6f 100644 --- a/crates/bevy_render/src/render_resource/bind_group.rs +++ b/crates/bevy_render/src/render_resource/bind_group.rs @@ -1,5 +1,4 @@ use crate::{ - define_atomic_id, render_asset::RenderAssets, render_resource::{BindGroupLayout, Buffer, PipelineCache, Sampler, TextureView}, renderer::{RenderDevice, WgpuWrapper}, @@ -9,6 +8,7 @@ use bevy_derive::{Deref, DerefMut}; use bevy_ecs::system::{SystemParam, SystemParamItem}; use bevy_render::render_resource::BindGroupLayoutDescriptor; pub use bevy_render_macros::AsBindGroup; +use bevy_utils::define_atomic_id; use core::ops::Deref; use encase::ShaderType; use thiserror::Error; diff --git a/crates/bevy_render/src/render_resource/bind_group_layout.rs b/crates/bevy_render/src/render_resource/bind_group_layout.rs index 3b8cc000802eb..4b6c610074ce8 100644 --- a/crates/bevy_render/src/render_resource/bind_group_layout.rs +++ b/crates/bevy_render/src/render_resource/bind_group_layout.rs @@ -1,4 +1,5 @@ -use crate::{define_atomic_id, renderer::WgpuWrapper}; +use crate::renderer::WgpuWrapper; +use bevy_utils::define_atomic_id; use core::ops::Deref; define_atomic_id!(BindGroupLayoutId); diff --git a/crates/bevy_render/src/render_resource/buffer.rs b/crates/bevy_render/src/render_resource/buffer.rs index 2a3620b7452a8..6032154d4ec42 100644 --- a/crates/bevy_render/src/render_resource/buffer.rs +++ b/crates/bevy_render/src/render_resource/buffer.rs @@ -1,5 +1,5 @@ -use crate::define_atomic_id; use crate::renderer::WgpuWrapper; +use bevy_utils::define_atomic_id; use core::ops::{Deref, RangeBounds}; define_atomic_id!(BufferId); diff --git a/crates/bevy_render/src/render_resource/mod.rs b/crates/bevy_render/src/render_resource/mod.rs index 0d431b5ac4ed8..70a2d160a1c56 100644 --- a/crates/bevy_render/src/render_resource/mod.rs +++ b/crates/bevy_render/src/render_resource/mod.rs @@ -10,7 +10,6 @@ mod gpu_array_buffer; mod pipeline; mod pipeline_cache; mod pipeline_specializer; -pub mod resource_macros; mod specializer; mod storage_buffer; mod texture; diff --git a/crates/bevy_render/src/render_resource/pipeline.rs b/crates/bevy_render/src/render_resource/pipeline.rs index f3976f68af916..93a7e596d8354 100644 --- a/crates/bevy_render/src/render_resource/pipeline.rs +++ b/crates/bevy_render/src/render_resource/pipeline.rs @@ -1,9 +1,9 @@ -use crate::define_atomic_id; use crate::renderer::WgpuWrapper; use alloc::borrow::Cow; use bevy_asset::Handle; use bevy_mesh::VertexBufferLayout; use bevy_shader::{Shader, ShaderDefVal}; +use bevy_utils::define_atomic_id; use core::iter; use core::ops::Deref; use thiserror::Error; diff --git a/crates/bevy_render/src/render_resource/texture.rs b/crates/bevy_render/src/render_resource/texture.rs index bedbbcd265c99..6fd83b01f8f99 100644 --- a/crates/bevy_render/src/render_resource/texture.rs +++ b/crates/bevy_render/src/render_resource/texture.rs @@ -1,7 +1,7 @@ -use crate::define_atomic_id; use crate::renderer::WgpuWrapper; use bevy_derive::{Deref, DerefMut}; use bevy_ecs::resource::Resource; +use bevy_utils::define_atomic_id; use core::ops::Deref; define_atomic_id!(TextureId); diff --git a/crates/bevy_shader/Cargo.toml b/crates/bevy_shader/Cargo.toml index 3dec1d1eb6a5f..00efb62e67bd9 100644 --- a/crates/bevy_shader/Cargo.toml +++ b/crates/bevy_shader/Cargo.toml @@ -13,6 +13,7 @@ keywords = ["bevy", "shader"] bevy_asset = { path = "../bevy_asset", version = "0.18.0-dev" } bevy_reflect = { path = "../bevy_reflect", version = "0.18.0-dev" } bevy_platform = { path = "../bevy_platform", version = "0.18.0-dev" } +bevy_utils = { path = "../bevy_utils", version = "0.18.0-dev" } # other wgpu-types = { version = "27", default-features = false } diff --git a/crates/bevy_shader/src/shader.rs b/crates/bevy_shader/src/shader.rs index d6e7d9aac4113..fdf7177da65f2 100644 --- a/crates/bevy_shader/src/shader.rs +++ b/crates/bevy_shader/src/shader.rs @@ -2,36 +2,10 @@ use super::ShaderDefVal; use alloc::borrow::Cow; use bevy_asset::{io::Reader, Asset, AssetLoader, AssetPath, Handle, LoadContext}; use bevy_reflect::TypePath; -use core::{marker::Copy, num::NonZero}; +use bevy_utils::define_atomic_id; use thiserror::Error; -#[derive(Copy, Clone, Hash, Eq, PartialEq, PartialOrd, Ord, Debug)] -pub struct ShaderId(NonZero); - -impl ShaderId { - #[expect( - clippy::new_without_default, - reason = "Implementing the `Default` trait on atomic IDs would imply that two `::default()` equal each other. By only implementing `new()`, we indicate that each atomic ID created will be unique." - )] - pub fn new() -> Self { - use core::sync::atomic::{AtomicU32, Ordering}; - static COUNTER: AtomicU32 = AtomicU32::new(1); - let counter = COUNTER.fetch_add(1, Ordering::Relaxed); - Self(NonZero::::new(counter).unwrap_or_else(|| { - panic!("The system ran out of unique `{}`s.", stringify!(ShaderId)); - })) - } -} -impl From for NonZero { - fn from(value: ShaderId) -> Self { - value.0 - } -} -impl From> for ShaderId { - fn from(value: NonZero) -> Self { - Self(value) - } -} +define_atomic_id!(ShaderId); #[derive(Error, Debug)] pub enum ShaderReflectError { diff --git a/crates/bevy_render/src/render_resource/resource_macros.rs b/crates/bevy_utils/src/atomic_id.rs similarity index 94% rename from crates/bevy_render/src/render_resource/resource_macros.rs rename to crates/bevy_utils/src/atomic_id.rs index 6cdf3b69794f5..4832bff74b968 100644 --- a/crates/bevy_render/src/render_resource/resource_macros.rs +++ b/crates/bevy_utils/src/atomic_id.rs @@ -1,3 +1,4 @@ +/// Defines an id type which guarantees global uniqueness via atomics on a static global. #[macro_export] macro_rules! define_atomic_id { ($atomic_id_type:ident) => { diff --git a/crates/bevy_utils/src/lib.rs b/crates/bevy_utils/src/lib.rs index c1ea69b41a0d9..9055b825f1f31 100644 --- a/crates/bevy_utils/src/lib.rs +++ b/crates/bevy_utils/src/lib.rs @@ -48,6 +48,7 @@ pub mod prelude { pub use disqualified::ShortName; } +mod atomic_id; mod debug_info; mod default; mod once; From 5c8260591edf56d7627b304a1684ca5b54bd550f Mon Sep 17 00:00:00 2001 From: atlas dostal Date: Wed, 7 Jan 2026 08:28:14 -0500 Subject: [PATCH 2/2] migration --- release-content/migration-guides/define_atomic_id.md | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 release-content/migration-guides/define_atomic_id.md diff --git a/release-content/migration-guides/define_atomic_id.md b/release-content/migration-guides/define_atomic_id.md new file mode 100644 index 0000000000000..6985dc57ee809 --- /dev/null +++ b/release-content/migration-guides/define_atomic_id.md @@ -0,0 +1,6 @@ +--- +title: "`define_atomic_id` now lives in `bevy_utils`" +pull_requests: [22417] +--- + +`define_atomic_id` was moved out of `bevy_render` and into `bevy_utils`. If you were using `bevy::render::define_atomic_id`, you can update to `bevy::utils::define_atomic_id`.