aboutsummaryrefslogtreecommitdiff
path: root/src/render_helpers
diff options
context:
space:
mode:
Diffstat (limited to 'src/render_helpers')
-rw-r--r--src/render_helpers/shaders/close_epilogue.frag16
-rw-r--r--src/render_helpers/shaders/close_prelude.frag21
-rw-r--r--src/render_helpers/shaders/mod.rs54
3 files changed, 91 insertions, 0 deletions
diff --git a/src/render_helpers/shaders/close_epilogue.frag b/src/render_helpers/shaders/close_epilogue.frag
new file mode 100644
index 00000000..ed05c110
--- /dev/null
+++ b/src/render_helpers/shaders/close_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 = close_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/close_prelude.frag b/src/render_helpers/shaders/close_prelude.frag
new file mode 100644
index 00000000..db42190b
--- /dev/null
+++ b/src/render_helpers/shaders/close_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;
+
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,