Allow a non-zero default framebuffer

This commit is contained in:
Alan Jeffrey 2019-03-21 13:34:59 -05:00
parent 26fea26f87
commit ab3b28f82b
3 changed files with 11 additions and 6 deletions

View File

@ -112,7 +112,7 @@ impl<W> DemoApp<W> where W: Window {
pub fn new(window: W, window_size: WindowSize) -> DemoApp<W> { pub fn new(window: W, window_size: WindowSize) -> DemoApp<W> {
let expire_message_event_id = window.create_user_event_id(); let expire_message_event_id = window.create_user_event_id();
let device = GLDevice::new(window.gl_version()); let device = GLDevice::new(window.gl_version(), window.gl_default_framebuffer());
let resources = window.resource_loader(); let resources = window.resource_loader();
let options = Options::get(); let options = Options::get();

View File

@ -10,6 +10,7 @@
//! A minimal cross-platform windowing layer. //! A minimal cross-platform windowing layer.
use gl::types::GLuint;
use pathfinder_geometry::basic::point::Point2DI32; use pathfinder_geometry::basic::point::Point2DI32;
use pathfinder_geometry::distortion::BarrelDistortionCoefficients; use pathfinder_geometry::distortion::BarrelDistortionCoefficients;
use pathfinder_gl::GLVersion; use pathfinder_gl::GLVersion;
@ -18,6 +19,7 @@ use std::path::PathBuf;
pub trait Window { pub trait Window {
fn gl_version(&self) -> GLVersion; fn gl_version(&self) -> GLVersion;
fn gl_default_framebuffer(&self) -> GLuint { 0 }
fn mouse_position(&self) -> Point2DI32; fn mouse_position(&self) -> Point2DI32;
fn present(&self); fn present(&self);
fn resource_loader(&self) -> &dyn ResourceLoader; fn resource_loader(&self) -> &dyn ResourceLoader;

View File

@ -24,15 +24,18 @@ use std::mem;
use std::ptr; use std::ptr;
use std::str; use std::str;
use std::time::Duration; use std::time::Duration;
pub struct GLDevice { pub struct GLDevice {
version: GLVersion, version: GLVersion,
default_framebuffer: GLuint,
} }
impl GLDevice { impl GLDevice {
#[inline] #[inline]
pub fn new(version: GLVersion) -> GLDevice { pub fn new(version: GLVersion, default_framebuffer: GLuint) -> GLDevice {
GLDevice { version } GLDevice {
version,
default_framebuffer,
}
} }
fn set_texture_parameters(&self, texture: &GLTexture) { fn set_texture_parameters(&self, texture: &GLTexture) {
@ -455,7 +458,7 @@ impl Device for GLDevice {
fn read_pixels_from_default_framebuffer(&self, size: Point2DI32) -> Vec<u8> { fn read_pixels_from_default_framebuffer(&self, size: Point2DI32) -> Vec<u8> {
let mut pixels = vec![0; size.x() as usize * size.y() as usize * 4]; let mut pixels = vec![0; size.x() as usize * size.y() as usize * 4];
unsafe { unsafe {
gl::BindFramebuffer(gl::FRAMEBUFFER, 0); ck(); gl::BindFramebuffer(gl::FRAMEBUFFER, self.default_framebuffer); ck();
gl::ReadPixels(0, gl::ReadPixels(0,
0, 0,
size.x() as GLsizei, size.x() as GLsizei,
@ -594,7 +597,7 @@ impl Device for GLDevice {
#[inline] #[inline]
fn bind_default_framebuffer(&self, viewport: RectI32) { fn bind_default_framebuffer(&self, viewport: RectI32) {
unsafe { unsafe {
gl::BindFramebuffer(gl::FRAMEBUFFER, 0); ck(); gl::BindFramebuffer(gl::FRAMEBUFFER, self.default_framebuffer); ck();
gl::Viewport(viewport.origin().x(), gl::Viewport(viewport.origin().x(),
viewport.origin().y(), viewport.origin().y(),
viewport.size().x(), viewport.size().x(),