diff options
| author | HampusM <hampus@hampusmat.com> | 2026-07-10 14:07:03 +0200 |
|---|---|---|
| committer | HampusM <hampus@hampusmat.com> | 2026-07-10 14:07:03 +0200 |
| commit | 3794c39bfd3fd4d03f9f89226fc9c1f16b096572 (patch) | |
| tree | 65bea97c050b3df7b022c583eb813e56881452de | |
| parent | f6b86d55f27c43b239346c6bce1d360b257a2d19 (diff) | |
refactor(engine): move shader module to inside of rendering module
| -rw-r--r-- | engine/src/lib.rs | 4 | ||||
| -rw-r--r-- | engine/src/rendering.rs | 7 | ||||
| -rw-r--r-- | engine/src/rendering/backend/opengl.rs | 14 | ||||
| -rw-r--r-- | engine/src/rendering/backend/opengl/graphics_mesh.rs | 2 | ||||
| -rw-r--r-- | engine/src/rendering/main_render_pass.rs | 20 | ||||
| -rw-r--r-- | engine/src/rendering/shader.rs (renamed from engine/src/shader.rs) | 117 | ||||
| -rw-r--r-- | engine/src/rendering/shader/cursor.rs (renamed from engine/src/shader/cursor.rs) | 2 | ||||
| -rw-r--r-- | engine/src/rendering/shader/default.rs (renamed from engine/src/shader/default.rs) | 30 | ||||
| -rw-r--r-- | engine/src/ui/imgui.rs | 15 |
9 files changed, 111 insertions, 100 deletions
diff --git a/engine/src/lib.rs b/engine/src/lib.rs index 79cf0c7..db20917 100644 --- a/engine/src/lib.rs +++ b/engine/src/lib.rs @@ -9,7 +9,6 @@ use crate::ecs::phase::PRE_UPDATE as PRE_UPDATE_PHASE; use crate::ecs::system::initializable::Initializable; use crate::ecs::system::Into; use crate::ecs::World; -use crate::shader::Extension as ShaderExtension; mod util; mod work_queue; @@ -31,7 +30,6 @@ pub mod model; pub mod projection; pub mod reflection; pub mod rendering; -pub mod shader; pub mod texture; pub mod transform; pub mod ui; @@ -73,12 +71,10 @@ impl Engine crate::model::asset::add_importers(&mut assets); crate::material::asset::add_importers(&mut assets); - crate::shader::add_asset_importers(&mut assets); crate::texture::initialize(&mut assets); world.add_extension(AssetExtension { assets }); - world.add_extension(ShaderExtension); Self { world } } diff --git a/engine/src/rendering.rs b/engine/src/rendering.rs index 51cde39..94e5000 100644 --- a/engine/src/rendering.rs +++ b/engine/src/rendering.rs @@ -22,12 +22,12 @@ use crate::ecs::{declare_entity, Component, Query, Sole}; use crate::mesh::Mesh; use crate::rendering::blending::Config as BlendingConfig; use crate::rendering::object::{Id as ObjectId, Store as ObjectStore}; -use crate::shader::cursor::{ +use crate::rendering::shader::cursor::{ BindingLocation as ShaderBindingLocation, BindingValue as ShaderBindingValue, Cursor as ShaderCursor, }; -use crate::shader::Program as ShaderProgram; +use crate::rendering::shader::Program as ShaderProgram; use crate::texture::Texture; use crate::vector::Vec2; use crate::windowing::dpi::PhysicalSize; @@ -37,6 +37,7 @@ pub mod backend; pub mod blending; pub mod main_render_pass; pub mod object; +pub mod shader; static NEXT_SURFACE_ID: AtomicU64 = AtomicU64::new(0); @@ -110,6 +111,8 @@ impl crate::ecs::extension::Extension for Extension collector.add_observer(handle_window_changed); collector.add_observer(handle_window_removed); + crate::rendering::shader::prepare(&mut collector); + crate::rendering::backend::get_default().collect(collector); } } diff --git a/engine/src/rendering/backend/opengl.rs b/engine/src/rendering/backend/opengl.rs index fbb402c..41d6968 100644 --- a/engine/src/rendering/backend/opengl.rs +++ b/engine/src/rendering/backend/opengl.rs @@ -92,6 +92,13 @@ use crate::rendering::object::{ RawValue as ObjectRawValue, Store as ObjectStore, }; +use crate::rendering::shader::cursor::BindingValue as ShaderBindingValue; +use crate::rendering::shader::{ + Context as ShaderContext, + Error as ShaderError, + Program as ShaderProgram, + Stage as ShaderStage, +}; use crate::rendering::{ BufferClearMask, Command, @@ -105,13 +112,6 @@ use crate::rendering::{ POST_RENDER_PHASE, RENDER_PHASE, }; -use crate::shader::cursor::BindingValue as ShaderBindingValue; -use crate::shader::{ - Context as ShaderContext, - Error as ShaderError, - Program as ShaderProgram, - Stage as ShaderStage, -}; use crate::texture::{ Filtering as TextureFiltering, Properties as TextureProperties, diff --git a/engine/src/rendering/backend/opengl/graphics_mesh.rs b/engine/src/rendering/backend/opengl/graphics_mesh.rs index 4933197..6d5c248 100644 --- a/engine/src/rendering/backend/opengl/graphics_mesh.rs +++ b/engine/src/rendering/backend/opengl/graphics_mesh.rs @@ -9,8 +9,8 @@ use opengl_bindings::vertex_array::{ use opengl_bindings::MaybeCurrentContextWithFns as GlCurrentContextWithFns; use crate::mesh::{Mesh, VertexAttrType}; +use crate::rendering::shader::VertexDescription as ShaderVertexDescription; use crate::rendering::MeshUsage; -use crate::shader::VertexDescription as ShaderVertexDescription; #[derive(Debug)] pub struct GraphicsMesh diff --git a/engine/src/rendering/main_render_pass.rs b/engine/src/rendering/main_render_pass.rs index 3429e34..ec30dc5 100644 --- a/engine/src/rendering/main_render_pass.rs +++ b/engine/src/rendering/main_render_pass.rs @@ -5,15 +5,25 @@ use crate::ecs::sole::Single; use crate::ecs::Query; use crate::model::{MaterialSearchResult, Model}; use crate::rendering::object::{Id as ObjectId, Store as ObjectStore}; -use crate::rendering::{ - BufferClearMask, Command, DrawMeshOptions, DrawProperties, DrawPropertiesUpdateFlags, MeshUsage, PendingShaderBindings, RenderPass, RenderPasses, SurfaceSpec, TargetWindow -}; -use crate::shader::default::ASSET_LABEL as DEFAULT_SHADER_ASSET_LABEL; -use crate::shader::{ +use crate::rendering::shader::default::ASSET_LABEL as DEFAULT_SHADER_ASSET_LABEL; +use crate::rendering::shader::{ Context as ShaderContext, ModuleSource as ShaderModuleSource, Shader, }; +use crate::rendering::{ + BufferClearMask, + Command, + DrawMeshOptions, + DrawProperties, + DrawPropertiesUpdateFlags, + MeshUsage, + PendingShaderBindings, + RenderPass, + RenderPasses, + SurfaceSpec, + TargetWindow, +}; use crate::texture::{Texture, WHITE_1X1_ASSET_LABEL as TEXTURE_WHITE_1X1_ASSET_LABEL}; use crate::windowing::window::Window; diff --git a/engine/src/shader.rs b/engine/src/rendering/shader.rs index dda4191..961bea2 100644 --- a/engine/src/shader.rs +++ b/engine/src/rendering/shader.rs @@ -6,6 +6,7 @@ use std::path::Path; use std::str::Utf8Error; use bitflags::{bitflags, bitflags_match}; +use ecs::phase::INIT as INIT_PHASE; use shader_slang::{ Blob as SlangBlob, ComponentType as SlangComponentType, @@ -29,13 +30,9 @@ use crate::asset::{ }; use crate::builder; use crate::ecs::pair::{ChildOf, Pair}; -use crate::ecs::phase::{Phase, POST_UPDATE as POST_UPDATE_PHASE, START as START_PHASE}; +use crate::ecs::phase::{Phase, POST_UPDATE as POST_UPDATE_PHASE}; use crate::ecs::sole::Single; use crate::ecs::{declare_entity, Component, Sole}; -use crate::shader::default::{ - enqueue_set_shader_bindings as default_shader_enqueue_set_shader_bindings, - ASSET_LABEL, -}; pub mod cursor; pub mod default; @@ -909,11 +906,6 @@ pub enum VertexDescriptionError #[error(transparent)] pub struct Error(#[from] shader_slang::Error); -pub(crate) fn add_asset_importers(assets: &mut Assets) -{ - assets.set_importer::<_, _>(["slang"], import_slang_asset); -} - fn import_slang_asset( asset_submitter: &mut AssetSubmitter<'_>, file_path: &Path, @@ -971,73 +963,62 @@ declare_entity!( ) ); -pub(crate) struct Extension; - -impl crate::ecs::extension::Extension for Extension +pub(super) fn prepare(collector: &mut crate::ecs::extension::Collector<'_>) { - fn collect(self, mut collector: crate::ecs::extension::Collector<'_>) - { - let Some(global_session) = SlangGlobalSession::new() else { - tracing::error!("Unable to create global shader-slang session"); - return; - }; - - let session_options = shader_slang::CompilerOptions::default() - .optimization(shader_slang::OptimizationLevel::None) - .matrix_layout_column(true) - .debug_information(SlangDebugInfoLevel::Maximal) - .no_mangle(true); - - let target_desc = shader_slang::TargetDesc::default() - .format(shader_slang::CompileTarget::Glsl) - // .format(shader_slang::CompileTarget::Spirv) - .profile(global_session.find_profile("glsl_330")); - // .profile(global_session.find_profile("spirv_1_5")); - - let targets = [target_desc]; - - let session_desc = shader_slang::SessionDesc::default() - .targets(&targets) - .search_paths(&[""]) - .options(&session_options); - - let Some(session) = global_session.create_session(&session_desc) else { - tracing::error!("Failed to create shader-slang session"); - return; - }; + let Some(global_session) = SlangGlobalSession::new() else { + tracing::error!("Unable to create global shader-slang session"); + return; + }; + + let session_options = shader_slang::CompilerOptions::default() + .optimization(shader_slang::OptimizationLevel::None) + .matrix_layout_column(true) + .debug_information(SlangDebugInfoLevel::Maximal) + .no_mangle(true); + + let target_desc = shader_slang::TargetDesc::default() + .format(shader_slang::CompileTarget::Glsl) + // .format(shader_slang::CompileTarget::Spirv) + .profile(global_session.find_profile("glsl_330")); + // .profile(global_session.find_profile("spirv_1_5")); + + let targets = [target_desc]; + + let session_desc = shader_slang::SessionDesc::default() + .targets(&targets) + .search_paths(&[""]) + .options(&session_options); + + let Some(session) = global_session.create_session(&session_desc) else { + tracing::error!("Failed to create shader-slang session"); + return; + }; + + collector + .add_sole(Context { + _global_session: global_session, + session, + modules: HashMap::new(), + programs: HashMap::new(), + }) + .ok(); - collector - .add_sole(Context { - _global_session: global_session, - session, - modules: HashMap::new(), - programs: HashMap::new(), - }) - .ok(); + collector.spawn_declared_entity(&IMPORT_SHADERS_PHASE); - collector.spawn_declared_entity(&IMPORT_SHADERS_PHASE); + collector.add_system(*INIT_PHASE, initialize); + collector.add_system(*IMPORT_SHADERS_PHASE, load_modules); - collector.add_system(*START_PHASE, initialize); - collector.add_system(*IMPORT_SHADERS_PHASE, load_modules); + collector.add_system(*INIT_PHASE, crate::rendering::shader::default::initialize); - collector.add_system( - *POST_UPDATE_PHASE, - default_shader_enqueue_set_shader_bindings, - ); - } + collector.add_system( + *POST_UPDATE_PHASE, + crate::rendering::shader::default::enqueue_set_shader_bindings, + ); } fn initialize(mut assets: Single<Assets>) { - assets.store_with_label( - ASSET_LABEL.clone(), - ModuleSource { - name: "default_shader.slang".into(), - file_path: Path::new("@engine/default_shader").into(), - source: include_str!("../res/default_shader.slang").into(), - link_entrypoints: EntrypointFlags::VERTEX | EntrypointFlags::FRAGMENT, - }, - ); + assets.set_importer::<_, _>(["slang"], import_slang_asset); } #[tracing::instrument(skip_all)] diff --git a/engine/src/shader/cursor.rs b/engine/src/rendering/shader/cursor.rs index 8011012..17f5748 100644 --- a/engine/src/shader/cursor.rs +++ b/engine/src/rendering/shader/cursor.rs @@ -1,7 +1,7 @@ use crate::data_types::matrix::Matrix; use crate::data_types::vector::Vec3; use crate::rendering::object::Id as RenderingObjectId; -use crate::shader::{TypeKind, TypeLayout, VariableLayout}; +use crate::rendering::shader::{TypeKind, TypeLayout, VariableLayout}; /// Shader cursor #[derive(Clone)] diff --git a/engine/src/shader/default.rs b/engine/src/rendering/shader/default.rs index c174e8b..a60fd61 100644 --- a/engine/src/shader/default.rs +++ b/engine/src/rendering/shader/default.rs @@ -16,17 +16,21 @@ use crate::material::{Flags as MaterialFlags, Material}; use crate::matrix::Matrix; use crate::model::{MaterialSearchResult, Model}; use crate::projection::{ClipVolume as ProjectionClipVolume, Projection}; -use crate::rendering::{ - PendingShaderBindings, - SurfaceSpec, - TargetWindow as RenderingTargetWindow, +use crate::rendering::shader::cursor::{ + BindingValue as ShaderBindingValue, + Cursor as ShaderCursor, }; -use crate::shader::cursor::{BindingValue as ShaderBindingValue, Cursor as ShaderCursor}; -use crate::shader::{ +use crate::rendering::shader::{ Context as ShaderContext, + EntrypointFlags as ShaderEntrypointFlags, ModuleSource as ShaderModuleSource, Shader, }; +use crate::rendering::{ + PendingShaderBindings, + SurfaceSpec, + TargetWindow as RenderingTargetWindow, +}; use crate::texture::WHITE_1X1_ASSET_LABEL as TEXTURE_WHITE_1X1_ASSET_LABEL; use crate::transform::{Scale, Transform, WorldPosition}; use crate::vector::Vec3; @@ -38,6 +42,20 @@ pub static ASSET_LABEL: LazyLock<AssetLabel> = LazyLock::new(|| AssetLabel { name: Some("default_shader".into()), }); +pub fn initialize(mut assets: Single<Assets>) +{ + assets.store_with_label( + ASSET_LABEL.clone(), + ShaderModuleSource { + name: "default_shader.slang".into(), + file_path: Path::new("@engine/default_shader").into(), + source: include_str!("../../../res/default_shader.slang").into(), + link_entrypoints: ShaderEntrypointFlags::VERTEX + | ShaderEntrypointFlags::FRAGMENT, + }, + ); +} + pub fn enqueue_set_shader_bindings( renderable_query: Query<RenderableEntity<'_>, (Without<NoDraw>,)>, camera_query: Query<(&Camera, &WorldPosition, &ActiveCamera)>, diff --git a/engine/src/ui/imgui.rs b/engine/src/ui/imgui.rs index 5565455..45efc6d 100644 --- a/engine/src/ui/imgui.rs +++ b/engine/src/ui/imgui.rs @@ -49,6 +49,15 @@ use crate::rendering::blending::{ Factor as RenderingBlendingFactor, }; use crate::rendering::object::{Id as RenderingObjectId, Store as RenderingObjectStore}; +use crate::rendering::shader::cursor::{ + BindingValue as ShaderBindingValue, + Cursor as ShaderCursor, +}; +use crate::rendering::shader::{ + Context as ShaderContext, + EntrypointFlags as ShaderEntrypointFlags, + ModuleSource as ShaderModuleSource, +}; use crate::rendering::{ Command as RenderingCommand, DrawMeshOptions, @@ -60,12 +69,6 @@ use crate::rendering::{ SurfaceSpec, PRE_RENDER_PHASE, }; -use crate::shader::cursor::{BindingValue as ShaderBindingValue, Cursor as ShaderCursor}; -use crate::shader::{ - Context as ShaderContext, - EntrypointFlags as ShaderEntrypointFlags, - ModuleSource as ShaderModuleSource, -}; use crate::texture::{ Filtering as TextureFiltering, Properties as TextureProperties, |
