Skip to content

Instantly share code, notes, and snippets.

@MortimerGoro
Last active August 7, 2017 17:56
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save MortimerGoro/b7332e5cd0beab1efc3984bd5db88233 to your computer and use it in GitHub Desktop.
Save MortimerGoro/b7332e5cd0beab1efc3984bd5db88233 to your computer and use it in GitHub Desktop.
Gear VR submit frame
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