aboutsummaryrefslogtreecommitdiff
path: root/src/render_helpers/shaders/mod.rs
diff options
context:
space:
mode:
authorIvan Molodetskikh <yalterz@gmail.com>2024-02-21 21:27:44 +0400
committerIvan Molodetskikh <yalterz@gmail.com>2024-02-21 22:15:21 +0400
commit48f0f6fb3ceb68fdb559ab38c8dcbb7b9ba3a13e (patch)
treed71dbc10132f38f59e4a72d1d8a509102f701f8c /src/render_helpers/shaders/mod.rs
parent340bac0690972ee6f6badc8d386162320d70b7bd (diff)
downloadniri-48f0f6fb3ceb68fdb559ab38c8dcbb7b9ba3a13e.tar.gz
niri-48f0f6fb3ceb68fdb559ab38c8dcbb7b9ba3a13e.tar.bz2
niri-48f0f6fb3ceb68fdb559ab38c8dcbb7b9ba3a13e.zip
Implement gradient borders
Diffstat (limited to 'src/render_helpers/shaders/mod.rs')
-rw-r--r--src/render_helpers/shaders/mod.rs47
1 files changed, 47 insertions, 0 deletions
diff --git a/src/render_helpers/shaders/mod.rs b/src/render_helpers/shaders/mod.rs
new file mode 100644
index 00000000..72e9fa1c
--- /dev/null
+++ b/src/render_helpers/shaders/mod.rs
@@ -0,0 +1,47 @@
+use smithay::backend::renderer::gles::{GlesPixelProgram, GlesRenderer, UniformName, UniformType};
+
+use super::renderer::NiriRenderer;
+
+pub struct Shaders {
+ pub gradient_border: Option<GlesPixelProgram>,
+}
+
+impl Shaders {
+ fn compile(renderer: &mut GlesRenderer) -> Self {
+ let _span = tracy_client::span!("Shaders::compile");
+
+ let gradient_border = renderer
+ .compile_custom_pixel_shader(
+ include_str!("gradient_border.frag"),
+ &[
+ UniformName::new("color_from", UniformType::_4f),
+ UniformName::new("color_to", UniformType::_4f),
+ UniformName::new("angle", UniformType::_1f),
+ UniformName::new("gradient_offset", UniformType::_2f),
+ UniformName::new("gradient_width", UniformType::_1f),
+ UniformName::new("gradient_total", UniformType::_1f),
+ ],
+ )
+ .map_err(|err| {
+ warn!("error compiling gradient border shader: {err:?}");
+ })
+ .ok();
+
+ Self { gradient_border }
+ }
+
+ pub fn get(renderer: &mut impl NiriRenderer) -> &Self {
+ let renderer = renderer.as_gles_renderer();
+ let data = renderer.egl_context().user_data();
+ data.get()
+ .expect("shaders::init() must be called when creating the renderer")
+ }
+}
+
+pub fn init(renderer: &mut GlesRenderer) {
+ let shaders = Shaders::compile(renderer);
+ let data = renderer.egl_context().user_data();
+ if !data.insert_if_missing(|| shaders) {
+ error!("shaders were already compiled");
+ }
+}