webgl_rs/
query.rs

1//! WebGLQuery and methods
2use glenum::{Query, QueryParameter, QueryTarget};
3use rendering_context::WebGL2RenderingContext;
4use wasm_bindgen::prelude::*;
5
6impl WebGL2RenderingContext {
7    /// Creates and initializes a `WebGLRSQuery` object, that provide ways to asynchronously query for information.
8    pub fn create_query(&self) -> WebGLRSQuery {
9        WebGLRSQuery {
10            context: self,
11            inner: self._create_query(),
12        }
13    }
14
15    /// Returns the currently active WebGLQuery for the target, or null.
16    ///
17    /// # Arguments
18    /// * `target` - specifying the target of the query
19    /// TODO nullable -> Option
20    pub fn query(&self, target: QueryTarget) -> WebGLRSQuery {
21        WebGLRSQuery {
22            context: self,
23            inner: self._get_query(target, Query::Current),
24        }
25    }
26}
27
28#[derive(Clone)]
29pub struct WebGLRSQuery<'ctx> {
30    context: &'ctx WebGL2RenderingContext,
31    inner: WebGLQuery,
32}
33
34impl<'ctx> WebGLRSQuery<'ctx> {
35    /// Deletes this `WebGLRSQuery` object.
36    pub fn delete(self) {
37        self.context._delete_query(self.inner);
38    }
39
40    /// Returns true if this is a valid `WebGLRSQuery` object.
41    pub fn is_valid(&self) -> bool {
42        self.context._is_query(&self.inner)
43    }
44
45    /// Starts an asynchronous query. The target parameter indicates which kind of query to begin.
46    ///
47    /// # Arguments
48    /// * `target` - specifying the target of the query
49    pub fn begin(&self, target: QueryTarget) {
50        self.context._begin_query(target, &self.inner);
51    }
52
53    /// Indicates whether the `WebGLRSQuery` has a result available.
54    pub fn result_available(&self) -> bool {
55        self.context
56            ._get_query_parameter_bool(&self.inner, QueryParameter::ResultAvailable)
57    }
58
59    /// Returns the result of the `WebGLRSQuery`
60    pub fn result(&self) -> u32 {
61        self.context
62            ._get_query_parameter_u32(&self.inner, QueryParameter::Result)
63    }
64}
65
66/// Binding for WebGLQuery
67#[wasm_bindgen]
68#[derive(Clone, Copy)]
69extern "C" {
70    #[derive(Clone)]
71    type WebGLQuery;
72
73    /// Binding for `WebGL2RenderingContext.createQuery()`
74    #[wasm_bindgen(method, js_name = createQuery)]
75    fn _create_query(this: &WebGL2RenderingContext) -> WebGLQuery;
76
77    /// Binding for `WebGL2RenderingContext.deleteQuery()`
78    #[wasm_bindgen(method, js_name = deleteQuery)]
79    fn _delete_query(this: &WebGL2RenderingContext, query: WebGLQuery);
80
81    /// Binding for `WebGL2RenderingContext.isQuery()`
82    #[wasm_bindgen(method, js_name = isQuery)]
83    fn _is_query(this: &WebGL2RenderingContext, query: &WebGLQuery) -> bool;
84
85    /// Binding for `WebGL2RenderingContext.beginQuery()`
86    #[wasm_bindgen(method, js_name = beginQuery)]
87    fn _begin_query(this: &WebGL2RenderingContext, target: QueryTarget, query: &WebGLQuery);
88
89    /// Binding for `WebGL2RenderingContext.getQuery()`
90    #[wasm_bindgen(method, js_name = getQuery)]
91    fn _get_query(this: &WebGL2RenderingContext, target: QueryTarget, pname: Query) -> WebGLQuery;
92
93    /// Binding for `WebGL2RenderingContext.getQueryParameter()` if return type is bool
94    #[wasm_bindgen(method, js_name = getQueryParameter)]
95    fn _get_query_parameter_bool(
96        this: &WebGL2RenderingContext,
97        query: &WebGLQuery,
98        pname: QueryParameter,
99    ) -> bool;
100    /// Binding for `WebGL2RenderingContext.getQueryParameter()` if return type is u32
101    #[wasm_bindgen(method, js_name = getQueryParameter)]
102    fn _get_query_parameter_u32(
103        this: &WebGL2RenderingContext,
104        query: &WebGLQuery,
105        pname: QueryParameter,
106    ) -> u32;
107}