diff options
| author | Ivan Molodetskikh <yalterz@gmail.com> | 2024-05-12 09:52:21 +0400 |
|---|---|---|
| committer | Ivan Molodetskikh <yalterz@gmail.com> | 2024-05-12 09:52:36 +0400 |
| commit | 9004c8395438038d69f7b479a8a9035663cb4be0 (patch) | |
| tree | 349acfc1e9ac7df31bb52db66f7f9e8a59d19e79 /src/render_helpers/shaders/mod.rs | |
| parent | 29c7552852874a08f9e70ed52ddfb6be8f55bc69 (diff) | |
| download | niri-9004c8395438038d69f7b479a8a9035663cb4be0.tar.gz niri-9004c8395438038d69f7b479a8a9035663cb4be0.tar.bz2 niri-9004c8395438038d69f7b479a8a9035663cb4be0.zip | |
Implement custom shader for window-close anim
Diffstat (limited to 'src/render_helpers/shaders/mod.rs')
| -rw-r--r-- | src/render_helpers/shaders/mod.rs | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/src/render_helpers/shaders/mod.rs b/src/render_helpers/shaders/mod.rs index 034d8db1..21287a55 100644 --- a/src/render_helpers/shaders/mod.rs +++ b/src/render_helpers/shaders/mod.rs @@ -14,12 +14,14 @@ pub struct Shaders { pub clipped_surface: Option<GlesTexProgram>, pub resize: Option<ShaderProgram>, pub custom_resize: RefCell<Option<ShaderProgram>>, + pub custom_close: RefCell<Option<ShaderProgram>>, } #[derive(Debug, Clone, Copy)] pub enum ProgramType { Border, Resize, + Close, } impl Shaders { @@ -72,6 +74,7 @@ impl Shaders { clipped_surface, resize, custom_resize: RefCell::new(None), + custom_close: RefCell::new(None), } } @@ -95,6 +98,13 @@ impl Shaders { self.custom_resize.replace(program) } + pub fn replace_custom_close_program( + &self, + program: Option<ShaderProgram>, + ) -> Option<ShaderProgram> { + self.custom_close.replace(program) + } + pub fn program(&self, program: ProgramType) -> Option<ShaderProgram> { match program { ProgramType::Border => self.border.clone(), @@ -103,6 +113,7 @@ impl Shaders { .borrow() .clone() .or_else(|| self.resize.clone()), + ProgramType::Close => self.custom_close.borrow().clone(), } } } @@ -162,6 +173,49 @@ pub fn set_custom_resize_program(renderer: &mut GlesRenderer, src: Option<&str>) } } +fn compile_close_program( + renderer: &mut GlesRenderer, + src: &str, +) -> Result<ShaderProgram, GlesError> { + let mut program = include_str!("close_prelude.frag").to_string(); + program.push_str(src); + program.push_str(include_str!("close_epilogue.frag")); + + ShaderProgram::compile( + renderer, + &program, + &[ + UniformName::new("niri_input_to_geo", UniformType::Matrix3x3), + UniformName::new("niri_geo_size", UniformType::_2f), + UniformName::new("niri_geo_to_tex", UniformType::Matrix3x3), + UniformName::new("niri_progress", UniformType::_1f), + UniformName::new("niri_clamped_progress", UniformType::_1f), + UniformName::new("niri_random_seed", UniformType::_1f), + ], + &["niri_tex"], + ) +} + +pub fn set_custom_close_program(renderer: &mut GlesRenderer, src: Option<&str>) { + let program = if let Some(src) = src { + match compile_close_program(renderer, src) { + Ok(program) => Some(program), + Err(err) => { + warn!("error compiling custom close shader: {err:?}"); + return; + } + } + } else { + None + }; + + if let Some(prev) = Shaders::get(renderer).replace_custom_close_program(program) { + if let Err(err) = prev.destroy(renderer) { + warn!("error destroying previous custom close shader: {err:?}"); + } + } +} + pub fn mat3_uniform(name: &str, mat: Mat3) -> Uniform { Uniform::new( name, |
