Last active
August 7, 2017 17:56
-
-
Save MortimerGoro/b7332e5cd0beab1efc3984bd5db88233 to your computer and use it in GitHub Desktop.
Gear VR submit frame
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
fn submit_frame(&mut self, layer: &VRLayer) { | |
let mut frame_params = ovr::helpers::vrapi_DefaultFrameParms(self.render_ovr_java.handle(), | |
ovr::ovrFrameInit::VRAPI_FRAME_INIT_DEFAULT, | |
self.predicted_display_time, | |
ptr::null_mut()); | |
frame_params.FrameIndex = self.frame_index; | |
let eye_projection = self.eye_projection.get(); | |
for (i, eye) in self.eye_framebuffers.iter_mut().enumerate() { | |
let swap_chain_index = (self.frame_index % eye.swap_chain_length as i64) as i32; | |
if self.read_texture != layer.texture_id { | |
// Attach external texture to be used later in BlitFramebuffer. | |
unsafe { | |
gl::BindFramebuffer(gl::FRAMEBUFFER, self.read_fbo); | |
gl::FramebufferTexture2D(gl::FRAMEBUFFER, | |
gl::COLOR_ATTACHMENT0, | |
gl::TEXTURE_2D, | |
layer.texture_id, 0); | |
} | |
self.read_texture = layer.texture_id; | |
} | |
let texture_size = layer.texture_size.unwrap_or_else(|| { | |
(eye.width * 2, eye.height) | |
}); | |
// BlitFramebuffer: external texture to gvr pixel buffer. | |
unsafe { | |
gl::BindFramebuffer(gl::FRAMEBUFFER, eye.fbos[swap_chain_index as usize]); | |
gl::BindFramebuffer(gl::READ_FRAMEBUFFER, self.read_fbo); | |
let w = texture_size.0/2; | |
let x0 = (i as u32) * w; | |
let x1 = x0 + w; | |
gl::BlitFramebuffer(x0 as i32, 0, x1 as i32, texture_size.1 as i32, | |
0, 0, eye.width as i32, eye.height as i32, | |
gl::COLOR_BUFFER_BIT, gl::LINEAR); | |
} | |
let target = &mut frame_params.Layers[0].Textures[i]; | |
target.ColorTextureSwapChain = eye.swap_chain; | |
target.TextureSwapChainIndex = swap_chain_index; | |
target.TexCoordsFromTanAngles = ovr::helpers::ovrMatrix4f_TanAngleMatrixFromProjection(&eye_projection); | |
target.HeadPose = self.predicted_tracking.HeadPose; | |
frame_params.Layers[0].Textures[i].CompletionFence = fence; | |
} | |
unsafe { | |
ovr::vrapi_SubmitFrame(self.ovr, &frame_params); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment