diff options
Diffstat (limited to 'src/render_helpers')
| -rw-r--r-- | src/render_helpers/border.rs | 59 | ||||
| -rw-r--r-- | src/render_helpers/resize.rs | 2 | ||||
| -rw-r--r-- | src/render_helpers/shader_element.rs | 46 |
3 files changed, 57 insertions, 50 deletions
diff --git a/src/render_helpers/border.rs b/src/render_helpers/border.rs index 3f2e69dd..6f2b7795 100644 --- a/src/render_helpers/border.rs +++ b/src/render_helpers/border.rs @@ -21,7 +21,6 @@ use crate::backend::tty::{TtyFrame, TtyRenderer, TtyRendererError}; #[derive(Debug, Clone)] pub struct BorderRenderElement { inner: ShaderRenderElement, - shader: ShaderProgram, params: Parameters, } @@ -41,7 +40,7 @@ struct Parameters { impl BorderRenderElement { #[allow(clippy::too_many_arguments)] pub fn new( - shader: ShaderProgram, + shader: &ShaderProgram, scale: Scale<f64>, area: Rectangle<i32, Logical>, gradient_area: Rectangle<i32, Logical>, @@ -52,19 +51,10 @@ impl BorderRenderElement { border_width: f32, corner_radius: CornerRadius, ) -> Self { - let inner = ShaderRenderElement::new( - shader.clone(), - Default::default(), - Default::default(), - None, - 1., - vec![], - HashMap::new(), - Kind::Unspecified, - ); + let mut inner = ShaderRenderElement::empty(Kind::Unspecified); + inner.update_shader(Some(shader)); let mut rv = Self { inner, - shader, params: Parameters { scale, area, @@ -81,20 +71,10 @@ impl BorderRenderElement { rv } - pub fn empty(shader: ShaderProgram) -> Self { - let inner = ShaderRenderElement::new( - shader.clone(), - Default::default(), - Default::default(), - None, - 1., - vec![], - HashMap::new(), - Kind::Unspecified, - ); + pub fn empty() -> Self { + let inner = ShaderRenderElement::empty(Kind::Unspecified); Self { inner, - shader, params: Parameters { scale: Scale::from(1.), area: Default::default(), @@ -109,23 +89,8 @@ impl BorderRenderElement { } } - pub fn update_shader(&mut self, shader: &ShaderProgram) { - if &self.shader == shader { - return; - } - - self.inner = ShaderRenderElement::new( - shader.clone(), - Default::default(), - Default::default(), - None, - 1., - vec![], - HashMap::new(), - Kind::Unspecified, - ); - self.update_inner(); - self.shader = shader.clone(); + pub fn update_shader(&mut self, shader: Option<&ShaderProgram>) { + self.inner.update_shader(shader); } #[allow(clippy::too_many_arguments)] @@ -222,11 +187,21 @@ impl BorderRenderElement { ); } + pub fn has_shader(&self) -> bool { + self.inner.has_shader() + } + pub fn shader(renderer: &mut impl NiriRenderer) -> Option<&ShaderProgram> { Shaders::get(renderer).border.as_ref() } } +impl Default for BorderRenderElement { + fn default() -> Self { + Self::empty() + } +} + impl Element for BorderRenderElement { fn id(&self) -> &Id { self.inner.id() diff --git a/src/render_helpers/resize.rs b/src/render_helpers/resize.rs index d01e4eb9..c728689a 100644 --- a/src/render_helpers/resize.rs +++ b/src/render_helpers/resize.rs @@ -92,7 +92,7 @@ impl ResizeRenderElement { // Create the shader. Self(ShaderRenderElement::new( - shader, + Some(shader), area, size, None, diff --git a/src/render_helpers/shader_element.rs b/src/render_helpers/shader_element.rs index 4e313fe3..75ed2780 100644 --- a/src/render_helpers/shader_element.rs +++ b/src/render_helpers/shader_element.rs @@ -19,8 +19,7 @@ use crate::backend::tty::{TtyFrame, TtyRenderer, TtyRendererError}; /// Renders a shader with optional texture input, on the primary GPU. #[derive(Debug, Clone)] pub struct ShaderRenderElement { - shader: ShaderProgram, - textures: HashMap<String, GlesTexture>, + shader: Option<ShaderProgram>, id: Id, commit_counter: CommitCounter, area: Rectangle<i32, Logical>, @@ -28,6 +27,7 @@ pub struct ShaderRenderElement { opaque_regions: Vec<Rectangle<i32, Logical>>, alpha: f32, additional_uniforms: Vec<Uniform<'static>>, + textures: HashMap<String, GlesTexture>, kind: Kind, } @@ -197,7 +197,7 @@ impl ShaderProgram { impl ShaderRenderElement { #[allow(clippy::too_many_arguments)] pub fn new( - shader: ShaderProgram, + shader: Option<ShaderProgram>, area: Rectangle<i32, Logical>, size: Size<f64, Buffer>, opaque_regions: Option<Vec<Rectangle<i32, Logical>>>, @@ -208,7 +208,6 @@ impl ShaderRenderElement { ) -> Self { Self { shader, - textures, id: Id::new(), commit_counter: CommitCounter::default(), area, @@ -216,10 +215,35 @@ impl ShaderRenderElement { opaque_regions: opaque_regions.unwrap_or_default(), alpha, additional_uniforms: uniforms.into_iter().map(|u| u.into_owned()).collect(), + textures, + kind, + } + } + + pub fn empty(kind: Kind) -> Self { + Self { + shader: None, + id: Id::new(), + commit_counter: CommitCounter::default(), + area: Rectangle::default(), + size: Size::default(), + opaque_regions: vec![], + alpha: 1., + additional_uniforms: vec![], + textures: HashMap::new(), kind, } } + pub fn update_shader(&mut self, shader: Option<&ShaderProgram>) { + if self.shader.as_ref() == shader { + return; + } + + self.shader = shader.cloned(); + self.commit_counter.increment(); + } + pub fn update( &mut self, area: Rectangle<i32, Logical>, @@ -236,6 +260,10 @@ impl ShaderRenderElement { self.commit_counter.increment(); } + + pub fn has_shader(&self) -> bool { + self.shader.is_some() + } } impl Element for ShaderRenderElement { @@ -281,6 +309,10 @@ impl RenderElement<GlesRenderer> for ShaderRenderElement { ) -> Result<(), GlesError> { let frame = frame.as_gles_frame(); + let Some(shader) = &self.shader else { + return Ok(()); + }; + let Some(resources) = Resources::get(frame) else { return Ok(()); }; @@ -358,9 +390,9 @@ impl RenderElement<GlesRenderer> for ShaderRenderElement { let has_tint = frame.debug_flags().contains(DebugFlags::TINT); let program = if has_debug { - &self.shader.0.debug + &shader.0.debug } else { - &self.shader.0.normal + &shader.0.normal }; // render @@ -406,7 +438,7 @@ impl RenderElement<GlesRenderer> for ShaderRenderElement { let tint = if has_tint { 1.0f32 } else { 0.0f32 }; if has_debug { - gl.Uniform1f(self.shader.0.uniform_tint, tint); + gl.Uniform1f(shader.0.uniform_tint, tint); } for uniform in &self.additional_uniforms { |
