diff options
Diffstat (limited to 'src/render_helpers')
| -rw-r--r-- | src/render_helpers/shaders/mod.rs | 54 | ||||
| -rw-r--r-- | src/render_helpers/shaders/open_epilogue.frag | 16 | ||||
| -rw-r--r-- | src/render_helpers/shaders/open_prelude.frag | 21 |
3 files changed, 91 insertions, 0 deletions
diff --git a/src/render_helpers/shaders/mod.rs b/src/render_helpers/shaders/mod.rs index 21287a55..12e9d4ed 100644 --- a/src/render_helpers/shaders/mod.rs +++ b/src/render_helpers/shaders/mod.rs @@ -15,6 +15,7 @@ pub struct Shaders { pub resize: Option<ShaderProgram>, pub custom_resize: RefCell<Option<ShaderProgram>>, pub custom_close: RefCell<Option<ShaderProgram>>, + pub custom_open: RefCell<Option<ShaderProgram>>, } #[derive(Debug, Clone, Copy)] @@ -22,6 +23,7 @@ pub enum ProgramType { Border, Resize, Close, + Open, } impl Shaders { @@ -75,6 +77,7 @@ impl Shaders { resize, custom_resize: RefCell::new(None), custom_close: RefCell::new(None), + custom_open: RefCell::new(None), } } @@ -105,6 +108,13 @@ impl Shaders { self.custom_close.replace(program) } + pub fn replace_custom_open_program( + &self, + program: Option<ShaderProgram>, + ) -> Option<ShaderProgram> { + self.custom_open.replace(program) + } + pub fn program(&self, program: ProgramType) -> Option<ShaderProgram> { match program { ProgramType::Border => self.border.clone(), @@ -114,6 +124,7 @@ impl Shaders { .clone() .or_else(|| self.resize.clone()), ProgramType::Close => self.custom_close.borrow().clone(), + ProgramType::Open => self.custom_open.borrow().clone(), } } } @@ -216,6 +227,49 @@ pub fn set_custom_close_program(renderer: &mut GlesRenderer, src: Option<&str>) } } +fn compile_open_program( + renderer: &mut GlesRenderer, + src: &str, +) -> Result<ShaderProgram, GlesError> { + let mut program = include_str!("open_prelude.frag").to_string(); + program.push_str(src); + program.push_str(include_str!("open_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_open_program(renderer: &mut GlesRenderer, src: Option<&str>) { + let program = if let Some(src) = src { + match compile_open_program(renderer, src) { + Ok(program) => Some(program), + Err(err) => { + warn!("error compiling custom open shader: {err:?}"); + return; + } + } + } else { + None + }; + + if let Some(prev) = Shaders::get(renderer).replace_custom_open_program(program) { + if let Err(err) = prev.destroy(renderer) { + warn!("error destroying previous custom open shader: {err:?}"); + } + } +} + pub fn mat3_uniform(name: &str, mat: Mat3) -> Uniform { Uniform::new( name, diff --git a/src/render_helpers/shaders/open_epilogue.frag b/src/render_helpers/shaders/open_epilogue.frag new file mode 100644 index 00000000..1e5f5375 --- /dev/null +++ b/src/render_helpers/shaders/open_epilogue.frag @@ -0,0 +1,16 @@ + +void main() { + vec3 coords_geo = niri_input_to_geo * vec3(niri_v_coords, 1.0); + vec3 size_geo = vec3(niri_geo_size, 1.0); + + vec4 color = open_color(coords_geo, size_geo); + + color = color * niri_alpha; + +#if defined(DEBUG_FLAGS) + if (niri_tint == 1.0) + color = vec4(0.0, 0.2, 0.0, 0.2) + color * 0.8; +#endif + + gl_FragColor = color; +} diff --git a/src/render_helpers/shaders/open_prelude.frag b/src/render_helpers/shaders/open_prelude.frag new file mode 100644 index 00000000..db42190b --- /dev/null +++ b/src/render_helpers/shaders/open_prelude.frag @@ -0,0 +1,21 @@ +precision mediump float; + +#if defined(DEBUG_FLAGS) +uniform float niri_tint; +#endif + +varying vec2 niri_v_coords; +uniform vec2 niri_size; + +uniform mat3 niri_input_to_geo; +uniform vec2 niri_geo_size; + +uniform sampler2D niri_tex; +uniform mat3 niri_geo_to_tex; + +uniform float niri_progress; +uniform float niri_clamped_progress; +uniform float niri_random_seed; + +uniform float niri_alpha; + |
