fyrox_graphics/gl/
query.rs1use crate::{
22 error::FrameworkError,
23 gl::server::GlGraphicsServer,
24 query::{Query, QueryKind, QueryResult},
25};
26use glow::HasContext;
27use std::{cell::Cell, rc::Weak};
28
29#[derive(Debug)]
30pub struct GlQuery {
31 id: glow::Query,
32 pipeline_state: Weak<GlGraphicsServer>,
33 active_query: Cell<Option<QueryKind>>,
34}
35
36impl GlQuery {
37 pub fn new(server: &GlGraphicsServer) -> Result<Self, FrameworkError> {
38 let mut inner = server.state.borrow_mut();
39 let id = if let Some(existing) = inner.queries.pop() {
40 existing
41 } else {
42 unsafe { server.gl.create_query()? }
43 };
44 Ok(Self {
45 id,
46 pipeline_state: server.weak(),
47 active_query: Default::default(),
48 })
49 }
50}
51
52impl Query for GlQuery {
53 fn begin(&self, kind: QueryKind) {
54 if let Some(pipeline_state) = self.pipeline_state.upgrade() {
55 unsafe {
56 pipeline_state.gl.begin_query(kind as u32, self.id);
57 }
58
59 self.active_query.set(Some(kind));
60 }
61 }
62
63 fn end(&self) {
64 if let Some(active_query) = self.active_query.get() {
65 if let Some(pipeline_state) = self.pipeline_state.upgrade() {
66 unsafe {
67 pipeline_state.gl.end_query(active_query as u32);
68 }
69 }
70 }
71 }
72
73 fn try_get_result(&self) -> Option<QueryResult> {
74 let pipeline_state = self.pipeline_state.upgrade()?;
75 let active_query = self.active_query.get()?;
76 unsafe {
77 let is_ready = pipeline_state
78 .gl
79 .get_query_parameter_u32(self.id, glow::QUERY_RESULT_AVAILABLE)
80 > 0;
81 if is_ready {
82 let query_result = pipeline_state
83 .gl
84 .get_query_parameter_u32(self.id, glow::QUERY_RESULT);
85 match active_query {
86 QueryKind::SamplesPassed => Some(QueryResult::SamplesPassed(query_result)),
87 QueryKind::AnySamplesPassed => {
88 Some(QueryResult::AnySamplesPassed(query_result > 0))
89 }
90 }
91 } else {
92 None
93 }
94 }
95 }
96}
97
98impl Drop for GlQuery {
99 fn drop(&mut self) {
100 if let Some(pipeline_state) = self.pipeline_state.upgrade() {
101 pipeline_state.state.borrow_mut().queries.push(self.id);
102 }
103 }
104}