1use glenum::{ProgramParameter, ShaderKind, ShaderParameter, TransformFeedbackBufferMode};
3use rendering_context::WebGL2RenderingContext;
4use uniform_location::{WebGLRSUniformLocation, WebGLUniformLocation};
5use wasm_bindgen::prelude::*;
6
7impl WebGL2RenderingContext {
19 pub fn create_program(&self) -> WebGLRSProgram {
21 WebGLRSProgram {
22 context: self,
23 inner: self._create_program(),
24 }
25 }
26}
27
28#[derive(Clone)]
32pub struct WebGLRSProgram<'ctx> {
33 context: &'ctx WebGL2RenderingContext,
34 inner: WebGLProgram,
35}
36
37impl<'ctx> WebGLRSProgram<'ctx> {
38 pub fn delete(self) {
40 self.context._delete_program(self.inner);
41 }
42
43 pub fn detach_shader(&self, shader: &WebGLRSShader) {
48 self.context._detach_shader(&self.inner, &shader.inner);
49 }
50
51 pub fn attach_shader(&self, shader: &WebGLRSShader) {
56 self.context._attach_shader(&self.inner, &shader.inner)
57 }
58
59 pub fn bind_attrib_location(&self, index: u32, name: &str) {
66 self.context._bind_attrib_location(&self.inner, index, name);
67 }
68
69 pub fn info_log(&self) -> String {
72 self.context._get_program_info_log(&self.inner)
73 }
74
75 pub fn is_valid(&self) -> bool {
77 self.context._is_program(&self.inner)
78 }
79
80 pub fn link(&self) {
82 self.context._link_program(&self.inner);
83 }
84
85 pub fn enable(&self) {
87 self.context._use_program(&self.inner);
88 }
89
90 pub fn validate(&self) {
93 self.context._validate_program(&self.inner);
94 }
95
96 pub fn active_attrib(&self, index: u32) -> WebGLActiveInfo {
103 self.context._get_active_attrib(&self.inner, index)
104 }
105
106 pub fn active_uniform(&self, index: u32) -> WebGLActiveInfo {
113 self.context._get_active_uniform(&self.inner, index)
114 }
115
116 pub fn attrib_location(&self, name: &str) -> u32 {
121 self.context._get_attrib_location(&self.inner, name)
122 }
123
124 pub fn uniform_location(&self, name: &str) -> WebGLRSUniformLocation {
135 WebGLRSUniformLocation {
136 context: &self.context,
137 inner: self.context._get_uniform_location(&self.inner, name),
138 }
139 }
140
141 pub fn frag_data_location(&self, name: &str) -> i32 {
146 self.context._get_frag_data_location(&self.inner, name)
147 }
148
149 pub fn transform_feedback_varying(&self, index: u32) -> WebGLActiveInfo {
154 self.context
155 ._get_transform_feedback_varying(&self.inner, index)
156 }
157
158 pub fn uniform_block_index(&self, uniform_block_name: &str) -> u32 {
163 self.context
164 ._get_uniform_block_index(&self.inner, uniform_block_name)
165 }
166
167 pub fn active_uniform_block_name(&self, uniform_block_index: u32) -> String {
172 self.context
173 ._get_active_uniform_block_name(&self.inner, uniform_block_index)
174 }
175
176 pub fn assign_uniform_block_binding(
182 &self,
183 uniform_block_index: u32,
184 uniform_block_binding: u32,
185 ) {
186 self.context._uniform_block_binding(
187 &self.inner,
188 uniform_block_index,
189 uniform_block_binding,
190 );
191 }
192
193 pub fn delete_status(&self) -> bool {
195 self.context
196 ._get_program_parameter_bool(&self.inner, ProgramParameter::DeleteStatus)
197 }
198
199 pub fn link_status(&self) -> bool {
201 self.context
202 ._get_program_parameter_bool(&self.inner, ProgramParameter::LinkStatus)
203 }
204
205 pub fn validate_status(&self) -> bool {
207 self.context
208 ._get_program_parameter_bool(&self.inner, ProgramParameter::ValidateStatus)
209 }
210
211 pub fn attached_shaders(&self) -> i32 {
213 self.context
214 ._get_program_parameter_i32(&self.inner, ProgramParameter::AttachedShaders)
215 }
216
217 pub fn active_attributes(&self) -> i32 {
219 self.context
220 ._get_program_parameter_i32(&self.inner, ProgramParameter::ActiveAttributes)
221 }
222
223 pub fn active_uniforms(&self) -> i32 {
225 self.context
226 ._get_program_parameter_i32(&self.inner, ProgramParameter::ActiveUniforms)
227 }
228
229 pub fn transform_feedback_buffer_mode(&self) -> TransformFeedbackBufferMode {
231 self.context
232 ._get_program_parameter_enum(&self.inner, ProgramParameter::TransformFeedbackBufferMode)
233 }
234
235 pub fn transform_feedback_varyings(&self) -> i32 {
237 self.context
238 ._get_program_parameter_i32(&self.inner, ProgramParameter::TransformFeedbackVaryings)
239 }
240
241 pub fn active_uniform_blocks(&self) -> i32 {
243 self.context
244 ._get_program_parameter_i32(&self.inner, ProgramParameter::ActiveUniformBlocks)
245 }
246}
247
248#[wasm_bindgen]
250#[derive(Clone, Copy)]
251extern "C" {
252
253 #[derive(Clone)]
254 type WebGLProgram;
255
256 #[wasm_bindgen(method, js_name = createProgram)]
258 fn _create_program(this: &WebGL2RenderingContext) -> WebGLProgram;
259
260 #[wasm_bindgen(method, js_name = deleteProgram)]
262 fn _delete_program(this: &WebGL2RenderingContext, program: WebGLProgram);
263
264 #[wasm_bindgen(method, js_name = detachShader)]
266 fn _detach_shader(this: &WebGL2RenderingContext, program: &WebGLProgram, shader: &WebGLShader);
267
268 #[wasm_bindgen(method, js_name = attachShader)]
270 fn _attach_shader(this: &WebGL2RenderingContext, program: &WebGLProgram, shader: &WebGLShader);
271
272 #[wasm_bindgen(method, js_name = bindAttribLocation)]
274 fn _bind_attrib_location(
275 this: &WebGL2RenderingContext,
276 program: &WebGLProgram,
277 index: u32,
278 name: &str,
279 );
280
281 #[wasm_bindgen(method, js_name = getProgramInfoLog)]
283 fn _get_program_info_log(this: &WebGL2RenderingContext, program: &WebGLProgram) -> String;
284
285 #[wasm_bindgen(method, js_name = isProgram)]
287 fn _is_program(this: &WebGL2RenderingContext, program: &WebGLProgram) -> bool;
288
289 #[wasm_bindgen(method, js_name = linkProgram)]
291 fn _link_program(this: &WebGL2RenderingContext, program: &WebGLProgram);
292
293 #[wasm_bindgen(method, js_name = useProgram)]
295 fn _use_program(this: &WebGL2RenderingContext, program: &WebGLProgram);
296
297 #[wasm_bindgen(method, js_name = validateProgram)]
299 fn _validate_program(this: &WebGL2RenderingContext, program: &WebGLProgram);
300
301 #[wasm_bindgen(method, js_name = getActiveAttrib)]
303 fn _get_active_attrib(
304 this: &WebGL2RenderingContext,
305 program: &WebGLProgram,
306 index: u32,
307 ) -> WebGLActiveInfo;
308
309 #[wasm_bindgen(method, js_name = getActiveUniform)]
311 fn _get_active_uniform(
312 this: &WebGL2RenderingContext,
313 program: &WebGLProgram,
314 index: u32,
315 ) -> WebGLActiveInfo;
316
317 #[wasm_bindgen(method, js_name = getAttribLocation)]
319 fn _get_attrib_location(
320 this: &WebGL2RenderingContext,
321 program: &WebGLProgram,
322 name: &str,
323 ) -> u32;
324
325 #[wasm_bindgen(method, js_name = getUniformLocation)]
327 fn _get_uniform_location(
328 this: &WebGL2RenderingContext,
329 program: &WebGLProgram,
330 name: &str,
331 ) -> WebGLUniformLocation;
332
333 #[wasm_bindgen(method, js_name = getFragDataLocation)]
335 fn _get_frag_data_location(
336 this: &WebGL2RenderingContext,
337 program: &WebGLProgram,
338 name: &str,
339 ) -> i32;
340
341 #[wasm_bindgen(method, js_name = getTransfromFeedbackVarying)]
343 fn _get_transform_feedback_varying(
344 this: &WebGL2RenderingContext,
345 program: &WebGLProgram,
346 index: u32,
347 ) -> WebGLActiveInfo;
348
349 #[wasm_bindgen(method, js_name = getUniformBlockIndex)]
351 fn _get_uniform_block_index(
352 this: &WebGL2RenderingContext,
353 program: &WebGLProgram,
354 uniform_block_name: &str,
355 ) -> u32;
356
357 #[wasm_bindgen(method, js_name = getActiveUniformBlockName)]
359 fn _get_active_uniform_block_name(
360 this: &WebGL2RenderingContext,
361 program: &WebGLProgram,
362 uniform_block_index: u32,
363 ) -> String;
364
365 #[wasm_bindgen(method, js_name = uniformBlockBinding)]
367 fn _uniform_block_binding(
368 this: &WebGL2RenderingContext,
369 program: &WebGLProgram,
370 uniform_block_index: u32,
371 uniform_block_binding: u32,
372 );
373
374 #[wasm_bindgen(method, js_name = getProgramParameter)]
376 fn _get_program_parameter_i32(
377 this: &WebGL2RenderingContext,
378 program: &WebGLProgram,
379 pname: ProgramParameter,
380 ) -> i32;
381 #[wasm_bindgen(method, js_name = getProgramParameter)]
383 fn _get_program_parameter_bool(
384 this: &WebGL2RenderingContext,
385 program: &WebGLProgram,
386 pname: ProgramParameter,
387 ) -> bool;
388 #[wasm_bindgen(method, js_name = getProgramParameter)]
390 fn _get_program_parameter_enum(
391 this: &WebGL2RenderingContext,
392 program: &WebGLProgram,
393 pname: ProgramParameter,
394 ) -> TransformFeedbackBufferMode;
395}
396
397impl WebGL2RenderingContext {
400 pub fn create_shader(&self, kind: ShaderKind) -> WebGLRSShader {
405 WebGLRSShader {
406 context: self,
407 inner: self._create_shader(kind),
408 }
409 }
410}
411
412#[derive(Clone)]
415pub struct WebGLRSShader<'ctx> {
416 context: &'ctx WebGL2RenderingContext,
417 inner: WebGLShader,
418}
419
420impl<'ctx> WebGLRSShader<'ctx> {
421 pub fn compile(&self) {
423 self.context._compile_shader(&self.inner);
424 }
425
426 pub fn delete(self) {
428 self.context._delete_shader(self.inner);
429 }
430
431 pub fn info_log(&self) -> String {
434 self.context._get_shader_info_log(&self.inner)
435 }
436
437 pub fn shader_source(&self) -> String {
439 self.context._get_shader_info_log(&self.inner)
440 }
441
442 pub fn is_valid(&self) -> bool {
444 self.context._is_shader(&self.inner)
445 }
446
447 pub fn set_shader_source(&self, source: &str) {
449 self.context._shader_source(&self.inner, source);
450 }
451
452 pub fn delete_status(&self) -> bool {
454 self.context
455 ._get_shader_parameter_bool(&self.inner, ShaderParameter::DeleteStatus)
456 }
457
458 pub fn compile_status(&self) -> bool {
460 self.context
461 ._get_shader_parameter_bool(&self.inner, ShaderParameter::CompileStatus)
462 }
463
464 pub fn kind(&self) -> ShaderKind {
466 self.context
467 ._get_shader_parameter_enum(&self.inner, ShaderParameter::ShaderType)
468 }
469}
470
471#[wasm_bindgen]
473#[derive(Clone, Copy)]
474extern "C" {
475 #[derive(Clone)]
476 type WebGLShader;
477
478 #[wasm_bindgen(method, js_name = createShader)]
480 fn _create_shader(this: &WebGL2RenderingContext, kind: ShaderKind) -> WebGLShader;
481
482 #[wasm_bindgen(method, js_name = compileShader)]
484 fn _compile_shader(this: &WebGL2RenderingContext, shader: &WebGLShader);
485
486 #[wasm_bindgen(method, js_name = deleteShader)]
488 fn _delete_shader(this: &WebGL2RenderingContext, shader: WebGLShader);
489
490 #[wasm_bindgen(method, js_name = getShaderInfoLog)]
492 fn _get_shader_info_log(this: &WebGL2RenderingContext, shader: &WebGLShader) -> String;
493
494 #[wasm_bindgen(method, js_name = getShaderSource)]
496 fn _get_shader_source(this: &WebGL2RenderingContext, shader: &WebGLShader) -> String;
497
498 #[wasm_bindgen(method, js_name = isShader)]
500 fn _is_shader(this: &WebGL2RenderingContext, shader: &WebGLShader) -> bool;
501
502 #[wasm_bindgen(method, js_name = shaderSource)]
504 fn _shader_source(this: &WebGL2RenderingContext, shader: &WebGLShader, source: &str);
505
506 #[wasm_bindgen(method, js_name = getShaderParameter)]
508 fn _get_shader_parameter_bool(
509 this: &WebGL2RenderingContext,
510 shader: &WebGLShader,
511 pname: ShaderParameter,
512 ) -> bool;
513 #[wasm_bindgen(method, js_name = getShaderParameter)]
515 fn _get_shader_parameter_enum(
516 this: &WebGL2RenderingContext,
517 shader: &WebGLShader,
518 pname: ShaderParameter,
519 ) -> ShaderKind;
520}
521
522#[wasm_bindgen]
524#[derive(Clone, Copy)]
525extern "C" {
526 pub type WebGLActiveInfo;
527
528 #[wasm_bindgen(method, getter)]
530 pub fn name(this: &WebGLActiveInfo) -> String;
531
532 #[wasm_bindgen(method, getter)]
534 pub fn size(this: &WebGLActiveInfo) -> u32;
535
536 #[wasm_bindgen(method, getter = type)]
538 pub fn data_type(this: &WebGLActiveInfo) -> u32;
539}