1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
use super::*; pub struct TimerQuery { id: u32, elapsed_time: u64, } impl TimerQuery { pub fn new() -> TimerQuery { let mut id: u32 = 0; unsafe { gl::GenQueries(1, &mut id as *mut u32); } TimerQuery { id: id, elapsed_time: 0u64, } } pub fn begin(&mut self) { unsafe { gl::BeginQuery(gl::TIME_ELAPSED, self.id); } } pub fn end(&mut self) { unsafe { gl::EndQuery(gl::TIME_ELAPSED); } } pub fn end_ns(&mut self) -> u64 { self.end(); self.get_elapsed_time_ns() } pub fn end_ms(&mut self) -> u64 { self.end_ns() / 1_000_000 } pub fn is_available(&self) -> bool { let mut available: i32 = 0; unsafe { gl::GetQueryObjectiv(self.id, gl::QUERY_RESULT_AVAILABLE, &mut available); } available != 0 } pub fn get_elapsed_time_ns(&mut self) -> u64 { while !self.is_available() { } unsafe { gl::GetQueryObjectui64v(self.id, gl::QUERY_RESULT, &mut self.elapsed_time as *mut u64); } self.elapsed_time } pub fn get_elapsed_time_ms(&mut self) -> u64 { self.get_elapsed_time_ns() / 1_000_000 } }