Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Squashed] 0.23 Api Changes #1239

Merged
merged 106 commits into from
Feb 1, 2020
Merged
Changes from 1 commit
Commits
Show all changes
106 commits
Select commit Hold shift + click to select a range
47a0188
Squashed commit of the following:
goddessfreya Nov 21, 2019
dd7398e
Fixes
goddessfreya Nov 21, 2019
e795eed
Misc
goddessfreya Nov 21, 2019
1615718
Minor changes + rustfmt
goddessfreya Nov 21, 2019
03abfb1
Misc.
goddessfreya Nov 21, 2019
03fb9ee
2 hours of work.
goddessfreya Nov 28, 2019
cfd93b7
Changes, wayland almost works... again!
goddessfreya Dec 3, 2019
c7fb965
Wayland up and flying (multiple day's work)
goddessfreya Dec 13, 2019
236616f
Struct variants.
goddessfreya Dec 13, 2019
24fe143
X11 basics
goddessfreya Dec 14, 2019
2617faf
Misc changes
goddessfreya Dec 14, 2019
5d78420
Changes
goddessfreya Dec 17, 2019
9199b52
Cargo fmt and other
goddessfreya Dec 17, 2019
56269a6
More x11 from last couple days.
goddessfreya Dec 24, 2019
f46a29b
Unnecessary
goddessfreya Dec 24, 2019
9d8b594
Improve common issues readme. (#1248)
goddessfreya Dec 12, 2019
2ee7304
Merge remote-tracking branch 'upstream/master' into 0.23maj
goddessfreya Dec 24, 2019
2e0eae5
Progress...
goddessfreya Dec 28, 2019
4e08ac0
Copy paste
goddessfreya Dec 28, 2019
881f221
Changes for the night
goddessfreya Dec 28, 2019
b7bfefa
More x11 changes.
goddessfreya Dec 29, 2019
04497bb
Minor refactor.
goddessfreya Dec 29, 2019
4b464e4
Push for reject your reality.
goddessfreya Dec 29, 2019
2150e66
Config vec part 1
goddessfreya Dec 31, 2019
789d155
Config vec p2
goddessfreya Dec 31, 2019
08cdf68
Vec config part 3
goddessfreya Dec 31, 2019
dbbedf3
Srgb and flush support with egl.
goddessfreya Dec 31, 2019
7bb3860
GLX p1
goddessfreya Jan 1, 2020
f23042b
Api changes.
goddessfreya Jan 2, 2020
67bc14f
Error handling improvements
goddessfreya Jan 2, 2020
f845de0
Remove comment
goddessfreya Jan 2, 2020
3f8e777
Merge glutin-old back in
goddessfreya Jan 2, 2020
6d49596
Ossi's suggestion of removing display.
goddessfreya Jan 5, 2020
0a5fde2
Final API changes by me. Some docs.
goddessfreya Jan 5, 2020
a59ad1b
Fixes.
goddessfreya Jan 5, 2020
7c6862b
Prepare for takeoff
goddessfreya Jan 5, 2020
4a618c0
Update.
goddessfreya Jan 12, 2020
377757c
Switch to github actions. (#1258)
goddessfreya Jan 5, 2020
d352f73
Update publish.yml (#1259)
goddessfreya Jan 5, 2020
215a686
Update publish.yml
goddessfreya Jan 5, 2020
c7def58
Update publish.yml
goddessfreya Jan 5, 2020
1af0bcd
New release of glutin. (#1261)
goddessfreya Jan 7, 2020
89961ae
Bad cherrypicking.
goddessfreya Jan 12, 2020
ca27339
Docs and shit p1
goddessfreya Jan 13, 2020
96623a5
Native api
goddessfreya Jan 13, 2020
43a0559
Config docs p2
goddessfreya Jan 13, 2020
7a81a0a
FIXMEs so I can grep the source for them latter
goddessfreya Jan 13, 2020
1168e6c
Docs and inling
goddessfreya Jan 14, 2020
fd20019
More docs and whatnot
goddessfreya Jan 15, 2020
969ff19
Docs and spelling
goddessfreya Jan 15, 2020
8a9c585
Changes for the night
goddessfreya Jan 16, 2020
81b27fe
Merge remote-tracking branch 'upstream/master' into 0.23maj
goddessfreya Jan 16, 2020
2cfa6fe
Merge remote-tracking branch 'upstream/master' into 0.23maj
goddessfreya Jan 16, 2020
e31df41
Fix
goddessfreya Jan 16, 2020
477c95e
More docs.
goddessfreya Jan 18, 2020
602da61
OsMesa docs
goddessfreya Jan 18, 2020
558c4d5
One example
goddessfreya Jan 18, 2020
5db3b06
The remaining examples
goddessfreya Jan 19, 2020
c62b61d
Docs
goddessfreya Jan 19, 2020
353937c
Fixes and add example
goddessfreya Jan 19, 2020
5daf2bf
Temp CI
goddessfreya Jan 21, 2020
21e186a
Plz work
goddessfreya Jan 21, 2020
970cdc1
CI how about now?
goddessfreya Jan 21, 2020
f8660c6
Ciiiiiiii!
goddessfreya Jan 21, 2020
bd6d07e
Shuffling but no compile
goddessfreya Jan 22, 2020
ba2b612
Glx marches ever so complete
goddessfreya Jan 23, 2020
244fa95
Getting close
goddessfreya Jan 24, 2020
bc7857a
make_current_rw and more glx.
goddessfreya Jan 24, 2020
7fa95f2
Finish up glx
goddessfreya Jan 26, 2020
85977f1
serde
goddessfreya Jan 26, 2020
26bf90c
Merge remote-tracking branch 'upstream/master' into 0.23maj + docs
goddessfreya Jan 26, 2020
19ba8b8
Bump
goddessfreya Jan 26, 2020
5d4fff7
Fix
goddessfreya Jan 26, 2020
21a1006
Prepare for gbm support
goddessfreya Jan 26, 2020
b438968
Fix bugs
goddessfreya Jan 26, 2020
8985596
fmt
goddessfreya Jan 26, 2020
c8cc88c
Rm debug line
goddessfreya Jan 27, 2020
5060239
Oooops
goddessfreya Jan 27, 2020
52e62c3
EGLMesaSurfaceless
goddessfreya Jan 27, 2020
3ffc956
Gbm support and a example with broken vsync
goddessfreya Jan 29, 2020
4ec2ec9
Fixes.
goddessfreya Jan 29, 2020
4dcf94f
Fixed with help of folks at #dri-devel
goddessfreya Jan 29, 2020
78991cb
Examples fixed
goddessfreya Jan 29, 2020
33098ac
Merge remote-tracking branch 'upstream/master' into 0.23maj
goddessfreya Jan 29, 2020
d6b4af3
EGLDevice
goddessfreya Jan 30, 2020
3f0289b
fmt
goddessfreya Jan 30, 2020
01e6db2
ci
goddessfreya Jan 30, 2020
b138437
ci 2
goddessfreya Jan 30, 2020
900960a
Largest
goddessfreya Jan 30, 2020
84697e6
Make current rw example based on sharing example
goddessfreya Jan 30, 2020
e3c0540
TODO
goddessfreya Jan 30, 2020
a4458f2
DRM ci
goddessfreya Jan 30, 2020
f48c387
CI now?
goddessfreya Jan 30, 2020
201b3f4
Fix
goddessfreya Jan 31, 2020
6ddf31a
Doc, one word.
goddessfreya Jan 31, 2020
37a31ee
Prepare for #dri-devel
goddessfreya Jan 31, 2020
d0a4957
Rework EGL to use eglGetConfigs as suggested by #dri-devel
goddessfreya Jan 31, 2020
c3a1a92
Similiar rework for glx.
goddessfreya Jan 31, 2020
92182cf
Doc updates.
goddessfreya Jan 31, 2020
e7f1c94
Pixmaps, x11
goddessfreya Feb 1, 2020
1d4e513
Doc
goddessfreya Feb 1, 2020
b9f4aa4
Clippy
goddessfreya Feb 1, 2020
621f6bf
CLippy derp
goddessfreya Feb 1, 2020
ec602ce
Clippy examples
goddessfreya Feb 1, 2020
a3aeb81
Merge remote-tracking branch 'upstream/master' into 0.23maj
goddessfreya Feb 1, 2020
3f82a51
Changelog
goddessfreya Feb 1, 2020
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Gbm support and a example with broken vsync
Signed-off-by: Freya Gentz <zegentzy@protonmail.com>
goddessfreya committed Jan 29, 2020

Verified

This commit was created on github.com and signed with GitHub’s verified signature.
commit 3ffc9565be1dfb8ed0f06e21fd8b446cef362d83
5 changes: 5 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -44,6 +44,11 @@ jobs:
repository: goddessfreya/winit
path: winit
ref: winit-glutin-next
- uses: actions/checkout@v1
with:
repository: goddessfreya/gbm.rs
path: gbm.rs
ref: glutin-fun

- uses: actions/checkout@v1
- uses: hecrj/setup-rust-action@v1
5 changes: 4 additions & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
@@ -28,11 +28,14 @@ gl_generator = "0.14.0"

[dev-dependencies]
winit = { path = "../winit" }
winit_types = { version = "0.1.0", path = "../winit_types" }
takeable-option = "0.5.0"
image = "0.22.4"
simple_logger = "1.4.0"

[target.'cfg(any(target_os = "linux", target_os = "freebsd", target_os = "dragonfly", target_os = "netbsd", target_os = "openbsd"))'.dev-dependencies]
gbm = { path = "../gbm.rs" }
drm = "0.3.4"

[target.'cfg(target_os = "android")'.dependencies]
android_glue = "0.2.3"
glutin_egl_sys = { version = "0.1.4", path = "../glutin_sys/glutin_egl_sys" }
167 changes: 167 additions & 0 deletions examples/gbm.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,167 @@
#![cfg(any(
target_os = "linux",
target_os = "dragonfly",
target_os = "freebsd",
target_os = "netbsd",
target_os = "openbsd",
))]

#[macro_use]
extern crate log;

mod support;

use drm::control::connector::Info as ConnectorInfo;
use drm::control::{crtc, framebuffer, Device as ControlDevice, Mode, ResourceInfo};
use drm::Device as BasicDevice;
use gbm::{BufferObjectFlags, Device, DeviceGlutinWrapper, Format};
use glutin::config::{Config, ConfigsFinder, SwapInterval, SwapIntervalRange};
use glutin::context::ContextBuilder;
use glutin::platform::unix::{ConfigExt, RawConfig, RawDisplay};
use glutin::surface::Surface;
use libloading;
use winit_types::dpi::PhysicalSize;

use std::fs::{File, OpenOptions};
use std::os::raw;
use std::os::unix::io::{AsRawFd, RawFd};

struct Card(File);

impl AsRawFd for Card {
fn as_raw_fd(&self) -> RawFd {
self.0.as_raw_fd()
}
}

impl BasicDevice for Card {}
impl ControlDevice for Card {}

fn init_drm_device() -> Card {
let mut options = OpenOptions::new();
options.read(true);
options.write(true);
let file = options.open("/dev/dri/card0").unwrap();
Card(file)
}

type FnNull = unsafe extern "C" fn();
unsafe fn load_egl_sym(lib: &libloading::Library, name: &str) -> FnNull {
type FnEglGetProcAddress = unsafe extern "C" fn(*mut raw::c_char) -> *mut raw::c_void;

let name = std::ffi::CString::new(name.as_bytes()).unwrap();

let name = name.as_bytes_with_nul();
match lib.get::<Option<FnNull>>(name) {
Ok(sym) => (*sym).unwrap(),
Err(_) => {
let egl_get_proc_address_fn: libloading::Symbol<FnEglGetProcAddress> =
lib.get(b"eglGetProcAddress\0").unwrap();
let func = (egl_get_proc_address_fn)(name.as_ptr() as *mut raw::c_char);
std::mem::transmute::<*mut raw::c_void, Option<FnNull>>(func).unwrap()
}
}
}

unsafe fn choose_conf<'a, T: AsRawFd>(
gbm: &Device<T>,
confs: &'a [Config],
flags: BufferObjectFlags,
) -> &'a Config {
type FnEglGetConfigAttrib =
unsafe extern "C" fn(*mut raw::c_void, *mut raw::c_void, i32, *mut i32) -> raw::c_uint;
type FnEglGetError = unsafe extern "C" fn() -> i32;

let lib = libloading::Library::new("libEGL.so.1")
.unwrap_or_else(|_| libloading::Library::new("libEGL.so").unwrap());
let egl_get_config_attrib_fn: FnEglGetConfigAttrib =
std::mem::transmute(load_egl_sym(&lib, "eglGetConfigAttrib"));

let egl_get_error_fn: FnEglGetError = std::mem::transmute(load_egl_sym(&lib, "eglGetError"));

for conf in confs {
let raw_conf = match conf.raw_config() {
RawConfig::Egl(conf) => conf,
_ => panic!(),
};

let raw_disp = match conf.raw_display() {
RawDisplay::Egl(disp) => disp,
_ => panic!(),
};

let mut format = 0;
const NATIVE_VISUAL_ID: i32 = 0x302E;
if (egl_get_config_attrib_fn)(raw_disp, raw_conf, NATIVE_VISUAL_ID, &mut format) == 0 {
warn!(
"Failed to get NATIVE_VISUAL_ID for disp {:?} w/ conf {:?}, err {:?}",
raw_disp,
raw_conf,
(egl_get_error_fn)()
);
} else {
match Format::from_ffi(format as _) {
Some(format) if gbm.is_format_supported(format, flags) => return conf,
Some(format) => warn!(
"{:?}'s format {:?} incompatible with flags",
raw_conf, format
),
None => warn!(
"Skipped over {:?} as format {:?} unkown to gbm-rs",
raw_conf, format
),
}
}
}

panic!()
}

fn main() {
simple_logger::init().unwrap();
let drm = init_drm_device();
let gbm = Device::new(drm).unwrap();

let res_handles = gbm.resource_handles().unwrap();
let con = *res_handles.connectors().iter().next().unwrap();
let crtc_handle = *res_handles.crtcs().iter().next().unwrap();
let connector_info: ConnectorInfo = gbm.resource_info(con).unwrap();
let mode: Mode = connector_info.modes()[0];
let dims = mode.size();
let dims = PhysicalSize::new(dims.0 as u32, dims.1 as u32);
let flags = BufferObjectFlags::SCANOUT | BufferObjectFlags::RENDERING;

let confs = unsafe {
ConfigsFinder::new()
.with_desired_swap_interval_ranges(vec![SwapIntervalRange::Wait(1..2)])
.find(&gbm)
.unwrap()
};
let conf = unsafe { choose_conf(&gbm, &confs, flags) };
println!("Configeration chosen: {:?}", conf);

let ctx = unsafe { ContextBuilder::new().build(conf).unwrap() };
let (gbmsurf, surf) = unsafe {
let gbm: DeviceGlutinWrapper<_, ()> = (&gbm).into();
Surface::new_window(conf, &gbm, (dims, flags)).unwrap()
};
unsafe { ctx.make_current(&surf).unwrap() }
surf.modify_swap_interval(SwapInterval::Wait(1)).unwrap();
let gl = support::Gl::load(|s| ctx.get_proc_address(s).unwrap());

loop {
gl.draw_frame([1.0, 0.5, 0.7, 1.0]);
surf.swap_buffers().unwrap();
let bo = unsafe { gbmsurf.lock_front_buffer().unwrap() };
let fb_info = framebuffer::create(&gbm, &*bo).unwrap();
crtc::set(
&gbm,
crtc_handle,
fb_info.handle(),
&[con],
(0, 0),
Some(mode),
)
.unwrap();
}
}
55 changes: 32 additions & 23 deletions examples/support/mod.rs
Original file line number Diff line number Diff line change
@@ -12,10 +12,10 @@ use glutin::platform::unix::osmesa::{OsMesaBuffer, OsMesaContext, OsMesaContextB
use glutin::config::{Api, Config, ConfigsFinder, Version};
use glutin::context::{Context, ContextBuilder};
use glutin::surface::{PBuffer, Surface};
use glutin_interface::{NativeDisplay, RawDisplay, Seal};
use winit::event_loop::EventLoop;
use winit_types::dpi::PhysicalSize;
use winit_types::error::{Error, ErrorType};
use glutin_interface::{RawDisplay, NativeDisplay, Seal};

use std::ffi::{c_void, CStr};

@@ -191,7 +191,7 @@ pub enum HeadlessBackend {
}

impl HeadlessBackend {
pub fn new<T>(
pub unsafe fn new<T>(
el: &EventLoop<T>,
size: &PhysicalSize<u32>,
must_support_windows: bool,
@@ -226,7 +226,7 @@ impl HeadlessBackend {
println!("PBuffer configeration chosen: {:?}", conf);

let ctx = ContextBuilder::new().build(&conf).unwrap();
let surf = unsafe { Surface::new_pbuffer(&conf, size).unwrap() };
let surf = Surface::new_pbuffer(&conf, size).unwrap();

return Ok((HeadlessBackend::PBuffer(ctx, surf), Some(conf)));
}
@@ -237,30 +237,39 @@ impl HeadlessBackend {
return Err(errs);
}

struct EglMesaSurfaceless;
impl NativeDisplay for EglMesaSurfaceless {
fn raw_display(&self) -> RawDisplay {
RawDisplay::EglMesaSurfaceless {
_non_exhaustive_do_not_use: Seal,
#[cfg(any(
target_os = "linux",
target_os = "dragonfly",
target_os = "freebsd",
target_os = "netbsd",
target_os = "openbsd",
))]
{
struct EglMesaSurfaceless;
impl NativeDisplay for EglMesaSurfaceless {
fn raw_display(&self) -> RawDisplay {
RawDisplay::EglMesaSurfaceless {
_non_exhaustive_do_not_use: Seal,
}
}
}
}

// You can also try to use PBuffers, but from experience that is very
// buggy.
match ConfigsFinder::new()
.with_must_support_surfaceless(true)
.with_must_support_windows(must_support_windows)
.with_gl((Api::OpenGl, Version(3, 0)))
.find(&EglMesaSurfaceless)
{
Ok(mut confs) => {
let conf = confs.drain(..1).next().unwrap();
println!("EGL Mesa Surfaceless configeration chosen: {:?}", conf);
let ctx = ContextBuilder::new().build(&conf).unwrap();
return Ok((HeadlessBackend::Surfaceless(ctx), Some(conf)));
// You can also try to use PBuffers, but from experience that is very
// buggy.
match ConfigsFinder::new()
.with_must_support_surfaceless(true)
.with_must_support_windows(must_support_windows)
.with_gl((Api::OpenGl, Version(3, 0)))
.find(&EglMesaSurfaceless)
{
Ok(mut confs) => {
let conf = confs.drain(..1).next().unwrap();
println!("EGL Mesa Surfaceless configeration chosen: {:?}", conf);
let ctx = ContextBuilder::new().build(&conf).unwrap();
return Ok((HeadlessBackend::Surfaceless(ctx), Some(conf)));
}
Err(err) => errs.append(err),
}
Err(err) => errs.append(err),
}

#[cfg(any(
Loading