1#![allow(deprecated)]
5
6use crate::{ffi, GLUniformType, Renderer};
7use glib::{prelude::*, translate::*};
8
9glib::wrapper! {
10 #[doc(alias = "GskGLShader")]
11 pub struct GLShader(Object<ffi::GskGLShader, ffi::GskGLShaderClass>);
12
13 match fn {
14 type_ => || ffi::gsk_gl_shader_get_type(),
15 }
16}
17
18impl GLShader {
19 #[cfg_attr(feature = "v4_16", deprecated = "Since 4.16")]
20 #[allow(deprecated)]
21 #[doc(alias = "gsk_gl_shader_new_from_bytes")]
22 #[doc(alias = "new_from_bytes")]
23 pub fn from_bytes(sourcecode: &glib::Bytes) -> GLShader {
24 assert_initialized_main_thread!();
25 unsafe {
26 from_glib_full(ffi::gsk_gl_shader_new_from_bytes(
27 sourcecode.to_glib_none().0,
28 ))
29 }
30 }
31
32 #[cfg_attr(feature = "v4_16", deprecated = "Since 4.16")]
33 #[allow(deprecated)]
34 #[doc(alias = "gsk_gl_shader_new_from_resource")]
35 #[doc(alias = "new_from_resource")]
36 pub fn from_resource(resource_path: &str) -> GLShader {
37 assert_initialized_main_thread!();
38 unsafe {
39 from_glib_full(ffi::gsk_gl_shader_new_from_resource(
40 resource_path.to_glib_none().0,
41 ))
42 }
43 }
44
45 pub fn builder() -> GLShaderBuilder {
50 GLShaderBuilder::new()
51 }
52
53 #[cfg_attr(feature = "v4_16", deprecated = "Since 4.16")]
54 #[allow(deprecated)]
55 #[doc(alias = "gsk_gl_shader_compile")]
56 pub fn compile(&self, renderer: &impl IsA<Renderer>) -> Result<(), glib::Error> {
57 unsafe {
58 let mut error = std::ptr::null_mut();
59 let is_ok = ffi::gsk_gl_shader_compile(
60 self.to_glib_none().0,
61 renderer.as_ref().to_glib_none().0,
62 &mut error,
63 );
64 debug_assert_eq!(is_ok == glib::ffi::GFALSE, !error.is_null());
65 if error.is_null() {
66 Ok(())
67 } else {
68 Err(from_glib_full(error))
69 }
70 }
71 }
72
73 #[cfg_attr(feature = "v4_16", deprecated = "Since 4.16")]
74 #[allow(deprecated)]
75 #[doc(alias = "gsk_gl_shader_find_uniform_by_name")]
76 pub fn find_uniform_by_name(&self, name: &str) -> i32 {
77 unsafe {
78 ffi::gsk_gl_shader_find_uniform_by_name(self.to_glib_none().0, name.to_glib_none().0)
79 }
80 }
81
82 #[cfg_attr(feature = "v4_16", deprecated = "Since 4.16")]
83 #[allow(deprecated)]
84 #[doc(alias = "gsk_gl_shader_get_arg_bool")]
85 #[doc(alias = "get_arg_bool")]
86 pub fn arg_bool(&self, args: &glib::Bytes, idx: i32) -> bool {
87 unsafe {
88 from_glib(ffi::gsk_gl_shader_get_arg_bool(
89 self.to_glib_none().0,
90 args.to_glib_none().0,
91 idx,
92 ))
93 }
94 }
95
96 #[cfg_attr(feature = "v4_16", deprecated = "Since 4.16")]
97 #[allow(deprecated)]
98 #[doc(alias = "gsk_gl_shader_get_arg_float")]
99 #[doc(alias = "get_arg_float")]
100 pub fn arg_float(&self, args: &glib::Bytes, idx: i32) -> f32 {
101 unsafe {
102 ffi::gsk_gl_shader_get_arg_float(self.to_glib_none().0, args.to_glib_none().0, idx)
103 }
104 }
105
106 #[cfg_attr(feature = "v4_16", deprecated = "Since 4.16")]
107 #[allow(deprecated)]
108 #[doc(alias = "gsk_gl_shader_get_arg_int")]
109 #[doc(alias = "get_arg_int")]
110 pub fn arg_int(&self, args: &glib::Bytes, idx: i32) -> i32 {
111 unsafe { ffi::gsk_gl_shader_get_arg_int(self.to_glib_none().0, args.to_glib_none().0, idx) }
112 }
113
114 #[cfg_attr(feature = "v4_16", deprecated = "Since 4.16")]
115 #[allow(deprecated)]
116 #[doc(alias = "gsk_gl_shader_get_arg_uint")]
117 #[doc(alias = "get_arg_uint")]
118 pub fn arg_uint(&self, args: &glib::Bytes, idx: i32) -> u32 {
119 unsafe {
120 ffi::gsk_gl_shader_get_arg_uint(self.to_glib_none().0, args.to_glib_none().0, idx)
121 }
122 }
123
124 #[cfg_attr(feature = "v4_16", deprecated = "Since 4.16")]
125 #[allow(deprecated)]
126 #[doc(alias = "gsk_gl_shader_get_args_size")]
127 #[doc(alias = "get_args_size")]
128 pub fn args_size(&self) -> usize {
129 unsafe { ffi::gsk_gl_shader_get_args_size(self.to_glib_none().0) }
130 }
131
132 #[cfg_attr(feature = "v4_16", deprecated = "Since 4.16")]
133 #[allow(deprecated)]
134 #[doc(alias = "gsk_gl_shader_get_n_textures")]
135 #[doc(alias = "get_n_textures")]
136 pub fn n_textures(&self) -> i32 {
137 unsafe { ffi::gsk_gl_shader_get_n_textures(self.to_glib_none().0) }
138 }
139
140 #[cfg_attr(feature = "v4_16", deprecated = "Since 4.16")]
141 #[allow(deprecated)]
142 #[doc(alias = "gsk_gl_shader_get_n_uniforms")]
143 #[doc(alias = "get_n_uniforms")]
144 pub fn n_uniforms(&self) -> i32 {
145 unsafe { ffi::gsk_gl_shader_get_n_uniforms(self.to_glib_none().0) }
146 }
147
148 #[cfg_attr(feature = "v4_16", deprecated = "Since 4.16")]
149 #[allow(deprecated)]
150 #[doc(alias = "gsk_gl_shader_get_resource")]
151 #[doc(alias = "get_resource")]
152 pub fn resource(&self) -> Option<glib::GString> {
153 unsafe { from_glib_none(ffi::gsk_gl_shader_get_resource(self.to_glib_none().0)) }
154 }
155
156 #[cfg_attr(feature = "v4_16", deprecated = "Since 4.16")]
157 #[allow(deprecated)]
158 #[doc(alias = "gsk_gl_shader_get_source")]
159 #[doc(alias = "get_source")]
160 pub fn source(&self) -> glib::Bytes {
161 unsafe { from_glib_none(ffi::gsk_gl_shader_get_source(self.to_glib_none().0)) }
162 }
163
164 #[cfg_attr(feature = "v4_16", deprecated = "Since 4.16")]
165 #[allow(deprecated)]
166 #[doc(alias = "gsk_gl_shader_get_uniform_name")]
167 #[doc(alias = "get_uniform_name")]
168 pub fn uniform_name(&self, idx: i32) -> glib::GString {
169 unsafe {
170 from_glib_none(ffi::gsk_gl_shader_get_uniform_name(
171 self.to_glib_none().0,
172 idx,
173 ))
174 }
175 }
176
177 #[cfg_attr(feature = "v4_16", deprecated = "Since 4.16")]
178 #[allow(deprecated)]
179 #[doc(alias = "gsk_gl_shader_get_uniform_offset")]
180 #[doc(alias = "get_uniform_offset")]
181 pub fn uniform_offset(&self, idx: i32) -> i32 {
182 unsafe { ffi::gsk_gl_shader_get_uniform_offset(self.to_glib_none().0, idx) }
183 }
184
185 #[cfg_attr(feature = "v4_16", deprecated = "Since 4.16")]
186 #[allow(deprecated)]
187 #[doc(alias = "gsk_gl_shader_get_uniform_type")]
188 #[doc(alias = "get_uniform_type")]
189 pub fn uniform_type(&self, idx: i32) -> GLUniformType {
190 unsafe {
191 from_glib(ffi::gsk_gl_shader_get_uniform_type(
192 self.to_glib_none().0,
193 idx,
194 ))
195 }
196 }
197}
198
199#[must_use = "The builder must be built to be used"]
204pub struct GLShaderBuilder {
205 builder: glib::object::ObjectBuilder<'static, GLShader>,
206}
207
208impl GLShaderBuilder {
209 fn new() -> Self {
210 Self {
211 builder: glib::object::Object::builder(),
212 }
213 }
214
215 pub fn resource(self, resource: impl Into<glib::GString>) -> Self {
216 Self {
217 builder: self.builder.property("resource", resource.into()),
218 }
219 }
220
221 pub fn source(self, source: &glib::Bytes) -> Self {
222 Self {
223 builder: self.builder.property("source", source.clone()),
224 }
225 }
226
227 #[must_use = "Building the object from the builder is usually expensive and is not expected to have side effects"]
230 pub fn build(self) -> GLShader {
231 assert_initialized_main_thread!();
232 self.builder.build()
233 }
234}