summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engine/src/lib.rs4
-rw-r--r--engine/src/rendering.rs7
-rw-r--r--engine/src/rendering/backend/opengl.rs14
-rw-r--r--engine/src/rendering/backend/opengl/graphics_mesh.rs2
-rw-r--r--engine/src/rendering/main_render_pass.rs20
-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.rs15
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,