From d79eceeb1ca15c13b45773696ef656dd1f209954 Mon Sep 17 00:00:00 2001 From: Torstein Grindvik Date: Sun, 5 Feb 2023 16:53:42 +0100 Subject: [PATCH 1/4] Refactor globals struct into own shader Signed-off-by: Torstein Grindvik --- crates/bevy_pbr/src/render/globals.wgsl | 16 ++++++++++++++++ crates/bevy_pbr/src/render/mesh.rs | 3 +++ crates/bevy_pbr/src/render/mesh_view_types.wgsl | 16 +--------------- 3 files changed, 20 insertions(+), 15 deletions(-) create mode 100644 crates/bevy_pbr/src/render/globals.wgsl diff --git a/crates/bevy_pbr/src/render/globals.wgsl b/crates/bevy_pbr/src/render/globals.wgsl new file mode 100644 index 0000000000000..810e381681d58 --- /dev/null +++ b/crates/bevy_pbr/src/render/globals.wgsl @@ -0,0 +1,16 @@ +#define_import_path bevy_pbr::globals + +struct Globals { + // The time since startup in seconds + // Wraps to 0 after 1 hour. + time: f32, + // The delta time since the previous frame in seconds + delta_time: f32, + // Frame count since the start of the app. + // It wraps to zero when it reaches the maximum value of a u32. + frame_count: u32, +#ifdef SIXTEEN_BYTE_ALIGNMENT + // WebGL2 structs must be 16 byte aligned. + _wasm_padding: f32 +#endif +} diff --git a/crates/bevy_pbr/src/render/mesh.rs b/crates/bevy_pbr/src/render/mesh.rs index e69477df7e87c..8a1a8e65338d2 100644 --- a/crates/bevy_pbr/src/render/mesh.rs +++ b/crates/bevy_pbr/src/render/mesh.rs @@ -47,6 +47,8 @@ pub const MESH_VERTEX_OUTPUT: HandleUntyped = HandleUntyped::weak_from_u64(Shader::TYPE_UUID, 2645551199423808407); pub const MESH_VIEW_TYPES_HANDLE: HandleUntyped = HandleUntyped::weak_from_u64(Shader::TYPE_UUID, 8140454348013264787); +pub const GLOBALS_HANDLE: HandleUntyped = + HandleUntyped::weak_from_u64(Shader::TYPE_UUID, 17924628719070609599); pub const MESH_VIEW_BINDINGS_HANDLE: HandleUntyped = HandleUntyped::weak_from_u64(Shader::TYPE_UUID, 9076678235888822571); pub const MESH_TYPES_HANDLE: HandleUntyped = @@ -74,6 +76,7 @@ impl Plugin for MeshRenderPlugin { "mesh_view_types.wgsl", Shader::from_wgsl ); + load_internal_asset!(app, GLOBALS_HANDLE, "globals.wgsl", Shader::from_wgsl); load_internal_asset!( app, MESH_VIEW_BINDINGS_HANDLE, diff --git a/crates/bevy_pbr/src/render/mesh_view_types.wgsl b/crates/bevy_pbr/src/render/mesh_view_types.wgsl index c732cabc9453c..8e843a19bce06 100644 --- a/crates/bevy_pbr/src/render/mesh_view_types.wgsl +++ b/crates/bevy_pbr/src/render/mesh_view_types.wgsl @@ -1,4 +1,5 @@ #define_import_path bevy_pbr::mesh_view_types +#import bevy_pbr::globals struct View { view_proj: mat4x4, @@ -119,18 +120,3 @@ struct ClusterOffsetsAndCounts { data: array, 1024u>, }; #endif - -struct Globals { - // The time since startup in seconds - // Wraps to 0 after 1 hour. - time: f32, - // The delta time since the previous frame in seconds - delta_time: f32, - // Frame count since the start of the app. - // It wraps to zero when it reaches the maximum value of a u32. - frame_count: u32, -#ifdef SIXTEEN_BYTE_ALIGNMENT - // WebGL2 structs must be 16 byte aligned. - _wasm_padding: f32 -#endif -} From 9fe40e4c9e49ca03db953044a7329201a8518141 Mon Sep 17 00:00:00 2001 From: Torstein Grindvik Date: Tue, 7 Feb 2023 22:17:16 +0100 Subject: [PATCH 2/4] WIP: View, globals individual shaders Signed-off-by: Torstein Grindvik --- crates/bevy_pbr/src/render/mesh.rs | 3 -- .../bevy_pbr/src/render/mesh_view_types.wgsl | 14 ++-------- crates/bevy_render/src/globals.rs | 8 +++++- .../render => bevy_render/src}/globals.wgsl | 4 +-- crates/bevy_render/src/view/mod.rs | 10 +++++-- crates/bevy_render/src/view/view.wgsl | 13 +++++++++ .../src/mesh2d/mesh2d_view_types.wgsl | 28 ++----------------- crates/bevy_sprite/src/render/sprite.wgsl | 12 +------- crates/bevy_ui/src/render/ui.wgsl | 13 ++------- 9 files changed, 37 insertions(+), 68 deletions(-) rename crates/{bevy_pbr/src/render => bevy_render/src}/globals.wgsl (90%) create mode 100644 crates/bevy_render/src/view/view.wgsl diff --git a/crates/bevy_pbr/src/render/mesh.rs b/crates/bevy_pbr/src/render/mesh.rs index 8a1a8e65338d2..e69477df7e87c 100644 --- a/crates/bevy_pbr/src/render/mesh.rs +++ b/crates/bevy_pbr/src/render/mesh.rs @@ -47,8 +47,6 @@ pub const MESH_VERTEX_OUTPUT: HandleUntyped = HandleUntyped::weak_from_u64(Shader::TYPE_UUID, 2645551199423808407); pub const MESH_VIEW_TYPES_HANDLE: HandleUntyped = HandleUntyped::weak_from_u64(Shader::TYPE_UUID, 8140454348013264787); -pub const GLOBALS_HANDLE: HandleUntyped = - HandleUntyped::weak_from_u64(Shader::TYPE_UUID, 17924628719070609599); pub const MESH_VIEW_BINDINGS_HANDLE: HandleUntyped = HandleUntyped::weak_from_u64(Shader::TYPE_UUID, 9076678235888822571); pub const MESH_TYPES_HANDLE: HandleUntyped = @@ -76,7 +74,6 @@ impl Plugin for MeshRenderPlugin { "mesh_view_types.wgsl", Shader::from_wgsl ); - load_internal_asset!(app, GLOBALS_HANDLE, "globals.wgsl", Shader::from_wgsl); load_internal_asset!( app, MESH_VIEW_BINDINGS_HANDLE, diff --git a/crates/bevy_pbr/src/render/mesh_view_types.wgsl b/crates/bevy_pbr/src/render/mesh_view_types.wgsl index 8e843a19bce06..57ac0cfa27d92 100644 --- a/crates/bevy_pbr/src/render/mesh_view_types.wgsl +++ b/crates/bevy_pbr/src/render/mesh_view_types.wgsl @@ -1,17 +1,7 @@ #define_import_path bevy_pbr::mesh_view_types -#import bevy_pbr::globals -struct View { - view_proj: mat4x4, - inverse_view_proj: mat4x4, - view: mat4x4, - inverse_view: mat4x4, - projection: mat4x4, - inverse_projection: mat4x4, - world_position: vec3, - // viewport(x_origin, y_origin, width, height) - viewport: vec4, -}; +#import bevy_render::view +#import bevy_render::globals struct PointLight { // For point lights: the lower-right 2x2 values of the projection matrix [2][2] [2][3] [3][2] [3][3] diff --git a/crates/bevy_render/src/globals.rs b/crates/bevy_render/src/globals.rs index f0a4989467f66..474defa802e1b 100644 --- a/crates/bevy_render/src/globals.rs +++ b/crates/bevy_render/src/globals.rs @@ -1,19 +1,25 @@ use crate::{ extract_resource::ExtractResource, + prelude::Shader, render_resource::{ShaderType, UniformBuffer}, renderer::{RenderDevice, RenderQueue}, Extract, ExtractSchedule, RenderApp, RenderSet, }; use bevy_app::{App, Plugin}; +use bevy_asset::{load_internal_asset, HandleUntyped}; use bevy_core::FrameCount; use bevy_ecs::prelude::*; -use bevy_reflect::Reflect; +use bevy_reflect::{Reflect, TypeUuid}; use bevy_time::Time; +pub const GLOBALS_TYPE_HANDLE: HandleUntyped = + HandleUntyped::weak_from_u64(Shader::TYPE_UUID, 17924628719070609599); + pub struct GlobalsPlugin; impl Plugin for GlobalsPlugin { fn build(&self, app: &mut App) { + load_internal_asset!(app, GLOBALS_TYPE_HANDLE, "globals.wgsl", Shader::from_wgsl); app.register_type::(); if let Ok(render_app) = app.get_sub_app_mut(RenderApp) { diff --git a/crates/bevy_pbr/src/render/globals.wgsl b/crates/bevy_render/src/globals.wgsl similarity index 90% rename from crates/bevy_pbr/src/render/globals.wgsl rename to crates/bevy_render/src/globals.wgsl index 810e381681d58..22e98ccdef298 100644 --- a/crates/bevy_pbr/src/render/globals.wgsl +++ b/crates/bevy_render/src/globals.wgsl @@ -1,4 +1,4 @@ -#define_import_path bevy_pbr::globals +#define_import_path bevy_render::globals struct Globals { // The time since startup in seconds @@ -13,4 +13,4 @@ struct Globals { // WebGL2 structs must be 16 byte aligned. _wasm_padding: f32 #endif -} +}; diff --git a/crates/bevy_render/src/view/mod.rs b/crates/bevy_render/src/view/mod.rs index 5d278223c9e0e..b70db4693324c 100644 --- a/crates/bevy_render/src/view/mod.rs +++ b/crates/bevy_render/src/view/mod.rs @@ -1,13 +1,14 @@ pub mod visibility; pub mod window; +use bevy_asset::{load_internal_asset, HandleUntyped}; pub use visibility::*; pub use window::*; use crate::{ camera::ExtractedCamera, extract_resource::{ExtractResource, ExtractResourcePlugin}, - prelude::Image, + prelude::{Image, Shader}, render_asset::RenderAssets, render_phase::ViewRangefinder3d, render_resource::{DynamicUniformBuffer, ShaderType, Texture, TextureView}, @@ -18,7 +19,7 @@ use crate::{ use bevy_app::{App, Plugin}; use bevy_ecs::prelude::*; use bevy_math::{Mat4, UVec4, Vec3, Vec4}; -use bevy_reflect::Reflect; +use bevy_reflect::{Reflect, TypeUuid}; use bevy_transform::components::GlobalTransform; use bevy_utils::HashMap; use std::sync::atomic::{AtomicUsize, Ordering}; @@ -27,10 +28,15 @@ use wgpu::{ TextureFormat, TextureUsages, }; +pub const VIEW_TYPE_HANDLE: HandleUntyped = + HandleUntyped::weak_from_u64(Shader::TYPE_UUID, 15421373904451797197); + pub struct ViewPlugin; impl Plugin for ViewPlugin { fn build(&self, app: &mut App) { + load_internal_asset!(app, VIEW_TYPE_HANDLE, "view.wgsl", Shader::from_wgsl); + app.register_type::() .register_type::() .register_type::() diff --git a/crates/bevy_render/src/view/view.wgsl b/crates/bevy_render/src/view/view.wgsl new file mode 100644 index 0000000000000..00a2fcbd5f931 --- /dev/null +++ b/crates/bevy_render/src/view/view.wgsl @@ -0,0 +1,13 @@ +#define_import_path bevy_render::view + +struct View { + view_proj: mat4x4, + inverse_view_proj: mat4x4, + view: mat4x4, + inverse_view: mat4x4, + projection: mat4x4, + inverse_projection: mat4x4, + world_position: vec3, + // viewport(x_origin, y_origin, width, height) + viewport: vec4, +}; diff --git a/crates/bevy_sprite/src/mesh2d/mesh2d_view_types.wgsl b/crates/bevy_sprite/src/mesh2d/mesh2d_view_types.wgsl index 78c3459235a16..7868a05d40ff8 100644 --- a/crates/bevy_sprite/src/mesh2d/mesh2d_view_types.wgsl +++ b/crates/bevy_sprite/src/mesh2d/mesh2d_view_types.wgsl @@ -1,28 +1,4 @@ #define_import_path bevy_sprite::mesh2d_view_types -struct View { - view_proj: mat4x4, - inverse_view_proj: mat4x4, - view: mat4x4, - inverse_view: mat4x4, - projection: mat4x4, - inverse_projection: mat4x4, - world_position: vec3, - // viewport(x_origin, y_origin, width, height) - viewport: vec4, -}; - -struct Globals { - // The time since startup in seconds - // Wraps to 0 after 1 hour. - time: f32, - // The delta time since the previous frame in seconds - delta_time: f32, - // Frame count since the start of the app. - // It wraps to zero when it reaches the maximum value of a u32. - frame_count: u32, -#ifdef SIXTEEN_BYTE_ALIGNMENT - // WebGL2 structs must be 16 byte aligned. - _wasm_padding: f32 -#endif -} +#import bevy_render::view +#import bevy_render::globals diff --git a/crates/bevy_sprite/src/render/sprite.wgsl b/crates/bevy_sprite/src/render/sprite.wgsl index d1097e61af6fc..defad876204bc 100644 --- a/crates/bevy_sprite/src/render/sprite.wgsl +++ b/crates/bevy_sprite/src/render/sprite.wgsl @@ -2,17 +2,7 @@ #import bevy_core_pipeline::tonemapping #endif -struct View { - view_proj: mat4x4, - inverse_view_proj: mat4x4, - view: mat4x4, - inverse_view: mat4x4, - projection: mat4x4, - inverse_projection: mat4x4, - world_position: vec3, - // viewport(x_origin, y_origin, width, height) - viewport: vec4, -}; +#import bevy_render::view @group(0) @binding(0) var view: View; diff --git a/crates/bevy_ui/src/render/ui.wgsl b/crates/bevy_ui/src/render/ui.wgsl index 0cf8ed8aa784c..11ce13aa5468d 100644 --- a/crates/bevy_ui/src/render/ui.wgsl +++ b/crates/bevy_ui/src/render/ui.wgsl @@ -1,14 +1,5 @@ -struct View { - view_proj: mat4x4, - inverse_view_proj: mat4x4, - view: mat4x4, - inverse_view: mat4x4, - projection: mat4x4, - inverse_projection: mat4x4, - world_position: vec3, - // viewport(x_origin, y_origin, width, height) - viewport: vec4, -}; +#import bevy_render::view + @group(0) @binding(0) var view: View; From c63cc8451a25c08c972bc11f0005846ddf6de83a Mon Sep 17 00:00:00 2001 From: Torstein Grindvik <52322338+torsteingrindvik@users.noreply.github.com> Date: Sat, 11 Feb 2023 17:43:48 +0100 Subject: [PATCH 3/4] Update crates/bevy_sprite/src/render/sprite.wgsl Co-authored-by: Robert Swain --- crates/bevy_sprite/src/render/sprite.wgsl | 1 + 1 file changed, 1 insertion(+) diff --git a/crates/bevy_sprite/src/render/sprite.wgsl b/crates/bevy_sprite/src/render/sprite.wgsl index defad876204bc..0bb90e61507e7 100644 --- a/crates/bevy_sprite/src/render/sprite.wgsl +++ b/crates/bevy_sprite/src/render/sprite.wgsl @@ -3,6 +3,7 @@ #endif #import bevy_render::view + @group(0) @binding(0) var view: View; From d16a3e9118b1335b7aad266627dac9fbe6f1d74b Mon Sep 17 00:00:00 2001 From: Torstein Grindvik <52322338+torsteingrindvik@users.noreply.github.com> Date: Sat, 11 Feb 2023 17:43:55 +0100 Subject: [PATCH 4/4] Update crates/bevy_render/src/globals.wgsl Co-authored-by: Robert Swain --- crates/bevy_render/src/globals.wgsl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/bevy_render/src/globals.wgsl b/crates/bevy_render/src/globals.wgsl index 22e98ccdef298..6e0f271982b20 100644 --- a/crates/bevy_render/src/globals.wgsl +++ b/crates/bevy_render/src/globals.wgsl @@ -11,6 +11,6 @@ struct Globals { frame_count: u32, #ifdef SIXTEEN_BYTE_ALIGNMENT // WebGL2 structs must be 16 byte aligned. - _wasm_padding: f32 + _webgl2_padding: f32 #endif };