Skip to content

Commit 1dac7e9

Browse files
committed
Merge pull request #385 from bjz/rename-ns
Improvements to gl_generator API
2 parents 16e2b5a + a7fa0f8 commit 1dac7e9

File tree

18 files changed

+508
-879
lines changed

18 files changed

+508
-879
lines changed

gl/Cargo.toml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ readme = "README.md"
1515

1616
[build-dependencies]
1717
gl_generator = { version = "0.4.2", path = "../gl_generator" }
18-
khronos_api = { version = "1.0.0", path = "../khronos_api" }
1918

2019
[dev-dependencies]
2120
glutin = "0.4"

gl/build.rs

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,20 +13,16 @@
1313
// limitations under the License.
1414

1515
extern crate gl_generator;
16-
extern crate khronos_api;
1716

18-
use gl_generator::{Fallbacks, GlobalGenerator, Ns};
17+
use gl_generator::{Fallbacks, GlobalGenerator, Api, Profile};
1918
use std::env;
2019
use std::fs::File;
21-
use std::io::BufWriter;
2220
use std::path::Path;
2321

2422
fn main() {
2523
let out_dir = env::var("OUT_DIR").unwrap();
26-
let dest = Path::new(&out_dir);
24+
let mut file = File::create(&Path::new(&out_dir).join("bindings.rs")).unwrap();
2725

28-
let mut file = BufWriter::new(File::create(&dest.join("bindings.rs")).unwrap());
29-
gl_generator::generate_bindings(GlobalGenerator, Ns::Gl, Fallbacks::All,
30-
khronos_api::GL_XML, vec![], "4.5", "core",
31-
&mut file).unwrap();
26+
gl_generator::generate_bindings(GlobalGenerator, Api::Gl, Fallbacks::All,
27+
vec![], "4.5", Profile::Core, &mut file).unwrap();
3228
}

gl_generator/README.md

Lines changed: 17 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ Add this to your `Cargo.toml`:
2020
```toml
2121
[build-dependencies]
2222
gl_generator = "0.4.2"
23-
khronos_api = "1.0.0"
2423
```
2524

2625
Under the `[package]` section, add:
@@ -33,22 +32,18 @@ Create a `build.rs` to pull your specific version/API:
3332

3433
```rust
3534
extern crate gl_generator;
36-
extern crate khronos_api;
3735

38-
use gl_generator::{Fallbacks, GlobalGenerator, Ns};
36+
use gl_generator::{Fallbacks, GlobalGenerator, Api, Profile};
3937
use std::env;
4038
use std::fs::File;
41-
use std::io::BufWriter;
4239
use std::path::Path;
4340

4441
fn main() {
45-
let out_dir = env::var("OUT_DIR").unwrap();
46-
let dest = Path::new(&out_dir);
42+
let dest = env::var("OUT_DIR").unwrap();
43+
let mut file = File::create(&Path::new(&dest).join("bindings.rs")).unwrap();
4744

48-
let mut file = BufWriter::new(File::create(&dest.join("bindings.rs")).unwrap());
49-
gl_generator::generate_bindings(GlobalGenerator, Ns::Gl, Fallbacks::All,
50-
khronos_api::GL_XML, vec![], "4.5", "core",
51-
&mut file).unwrap();
45+
gl_generator::generate_bindings(GlobalGenerator, Api::Gl, Fallbacks::All,
46+
vec![], "4.5", Profile::Core, &mut file).unwrap();
5247
}
5348
```
5449

@@ -71,25 +66,6 @@ fn main() {
7166
The `build.rs` file will generate all the OpenGL functions in a file named,
7267
`bindings.rs` plus all enumerations, and all types in the `types` submodule.
7368

74-
### Arguments
75-
76-
- The type of loader to generate. Can be
77-
`gl_generator::StaticGenerator`, `gl_generator::StaticStructGenerator`,
78-
`gl_generator::StructGenerator`, or `gl_generator::GlobalGenerator`.
79-
- The API to generate. Can be `Gl`, `Gles1`, `Gles2`
80-
(GLES 2 or 3), `Wgl`, `Glx`, `Egl`.
81-
- The file which contains the bindings to parse. Can be `GL_XML` (for GL
82-
and GL ES), `GLX_XML`, `WGL_XML`, `EGL_XML`.
83-
- Extra extensions to include in the bindings. These are
84-
specified as a list of strings.
85-
- The requested API version. This is usually in the form
86-
`"major.minor"`.
87-
- The GL profile. Can be either `"core"` or `"compatibility"`. `"core"` will
88-
only include all functions supported by the
89-
requested version it self, while `"compatibility"` will include all the
90-
functions from previous versions as well.
91-
- The file to save the generated bindings to.
92-
9369
## Generator types
9470

9571
### Global generator
@@ -143,6 +119,18 @@ also attempt to load `glGenFramebuffersEXT` as a fallback.
143119

144120
## Changelog
145121

122+
### vX.X.X
123+
124+
- Rename `Ns` to `API`, and expose at the top level
125+
- Use `Api` for `Extension::supported` and `Filter::api` fields
126+
- Remove `source` argument from `generate_bindings`, removing the need for
127+
clients to depend on the `khronos_api` crate
128+
- Add `Profile` enum for specifying the API profile, and change the `source`
129+
argument to use it instead of a string
130+
- Remove `features` and `extensions` fields from `Registry`
131+
- Hide `registry::{Feature, Filter, Require, Remove, Extension}` from the public API
132+
- Move `registry::{Fallbacks, Api, Profile}` to top level module
133+
146134
### v0.4.2
147135

148136
- Update crate metadata

gl_generator/generators/debug_struct_gen.rs

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -12,21 +12,21 @@
1212
// See the License for the specific language governing permissions and
1313
// limitations under the License.
1414

15-
use registry::{Registry, Ns};
15+
use registry::Registry;
1616
use std::io;
1717

1818
#[allow(missing_copy_implementations)]
1919
pub struct DebugStructGenerator;
2020

2121
impl super::Generator for DebugStructGenerator {
22-
fn write<W>(&self, registry: &Registry, ns: Ns, dest: &mut W) -> io::Result<()> where W: io::Write {
22+
fn write<W>(&self, registry: &Registry, dest: &mut W) -> io::Result<()> where W: io::Write {
2323
try!(write_header(dest));
24-
try!(write_type_aliases(&ns, dest));
24+
try!(write_type_aliases(registry, dest));
2525
try!(write_enums(registry, dest));
2626
try!(write_fnptr_struct_def(dest));
27-
try!(write_panicking_fns(&ns, dest));
28-
try!(write_struct(registry, &ns, dest));
29-
try!(write_impl(registry, &ns, dest));
27+
try!(write_panicking_fns(registry, dest));
28+
try!(write_struct(registry, dest));
29+
try!(write_impl(registry, dest));
3030
Ok(())
3131
}
3232
}
@@ -46,7 +46,7 @@ fn write_header<W>(dest: &mut W) -> io::Result<()> where W: io::Write {
4646
/// Creates a `types` module which contains all the type aliases.
4747
///
4848
/// See also `generators::gen_type_aliases`.
49-
fn write_type_aliases<W>(ns: &Ns, dest: &mut W) -> io::Result<()> where W: io::Write {
49+
fn write_type_aliases<W>(registry: &Registry, dest: &mut W) -> io::Result<()> where W: io::Write {
5050
try!(writeln!(dest, r#"
5151
pub mod types {{
5252
#![allow(non_camel_case_types)]
@@ -55,7 +55,7 @@ fn write_type_aliases<W>(ns: &Ns, dest: &mut W) -> io::Result<()> where W: io::W
5555
#![allow(missing_copy_implementations)]
5656
"#));
5757

58-
try!(super::gen_type_aliases(ns, dest));
58+
try!(super::gen_type_aliases(registry.api, dest));
5959

6060
writeln!(dest, "}}")
6161
}
@@ -111,27 +111,27 @@ fn write_fnptr_struct_def<W>(dest: &mut W) -> io::Result<()> where W: io::Write
111111
/// Creates a `panicking` module which contains one function per GL command.
112112
///
113113
/// These functions are the mocks that are called if the real function could not be loaded.
114-
fn write_panicking_fns<W>(ns: &Ns, dest: &mut W) -> io::Result<()> where W: io::Write {
114+
fn write_panicking_fns<W>(registry: &Registry, dest: &mut W) -> io::Result<()> where W: io::Write {
115115
writeln!(dest,
116116
"#[inline(never)]
117117
fn missing_fn_panic() -> ! {{
118-
panic!(\"{ns} function was not loaded\")
118+
panic!(\"{api} function was not loaded\")
119119
}}",
120-
ns = ns
120+
api = registry.api
121121
)
122122
}
123123

124124
/// Creates a structure which stores all the `FnPtr` of the bindings.
125125
///
126126
/// The name of the struct corresponds to the namespace.
127-
fn write_struct<W>(registry: &Registry, ns: &Ns, dest: &mut W) -> io::Result<()> where W: io::Write {
127+
fn write_struct<W>(registry: &Registry, dest: &mut W) -> io::Result<()> where W: io::Write {
128128
try!(writeln!(dest, "
129129
#[allow(non_camel_case_types)]
130130
#[allow(non_snake_case)]
131131
#[allow(dead_code)]
132132
#[derive(Clone)]
133-
pub struct {ns} {{",
134-
ns = ns.fmt_struct_name()
133+
pub struct {api} {{",
134+
api = super::gen_struct_name(registry.api)
135135
));
136136

137137
for c in registry.cmd_iter() {
@@ -145,9 +145,9 @@ fn write_struct<W>(registry: &Registry, ns: &Ns, dest: &mut W) -> io::Result<()>
145145
}
146146

147147
/// Creates the `impl` of the structure created by `write_struct`.
148-
fn write_impl<W>(registry: &Registry, ns: &Ns, dest: &mut W) -> io::Result<()> where W: io::Write {
148+
fn write_impl<W>(registry: &Registry, dest: &mut W) -> io::Result<()> where W: io::Write {
149149
try!(writeln!(dest,
150-
"impl {ns} {{
150+
"impl {api} {{
151151
/// Load each OpenGL symbol using a custom load function. This allows for the
152152
/// use of functions like `glfwGetProcAddress` or `SDL_GL_GetProcAddress`.
153153
///
@@ -156,7 +156,7 @@ fn write_impl<W>(registry: &Registry, ns: &Ns, dest: &mut W) -> io::Result<()> w
156156
/// ~~~
157157
#[allow(dead_code)]
158158
#[allow(unused_variables)]
159-
pub fn load_with<F>(mut loadfn: F) -> {ns} where F: FnMut(&str) -> *const __gl_imports::raw::c_void {{
159+
pub fn load_with<F>(mut loadfn: F) -> {api} where F: FnMut(&str) -> *const __gl_imports::raw::c_void {{
160160
let mut metaloadfn = |symbol: &str, symbols: &[&str]| {{
161161
let mut ptr = loadfn(symbol);
162162
if ptr.is_null() {{
@@ -167,19 +167,19 @@ fn write_impl<W>(registry: &Registry, ns: &Ns, dest: &mut W) -> io::Result<()> w
167167
}}
168168
ptr
169169
}};
170-
{ns} {{",
171-
ns = ns.fmt_struct_name()
170+
{api} {{",
171+
api = super::gen_struct_name(registry.api)
172172
));
173173

174174
for c in registry.cmd_iter() {
175175
try!(writeln!(dest,
176176
"{name}: FnPtr::new(metaloadfn(\"{symbol}\", &[{fallbacks}])),",
177177
name = c.proto.ident,
178-
symbol = super::gen_symbol_name(ns, &c.proto.ident),
178+
symbol = super::gen_symbol_name(registry.api, &c.proto.ident),
179179
fallbacks = match registry.aliases.get(&c.proto.ident) {
180180
Some(fbs) => {
181181
fbs.iter()
182-
.map(|name| format!("\"{}\"", super::gen_symbol_name(ns, &name)))
182+
.map(|name| format!("\"{}\"", super::gen_symbol_name(registry.api, &name)))
183183
.collect::<Vec<_>>().join(", ")
184184
},
185185
None => format!(""),
@@ -234,7 +234,7 @@ fn write_impl<W>(registry: &Registry, ns: &Ns, dest: &mut W) -> io::Result<()> w
234234
writeln!(dest,
235235
"}}
236236
237-
unsafe impl __gl_imports::Send for {ns} {{}}",
238-
ns = ns.fmt_struct_name()
237+
unsafe impl __gl_imports::Send for {api} {{}}",
238+
api = super::gen_struct_name(registry.api)
239239
)
240240
}

gl_generator/generators/global_gen.rs

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -12,23 +12,23 @@
1212
// See the License for the specific language governing permissions and
1313
// limitations under the License.
1414

15-
use registry::{Registry, Ns};
15+
use registry::Registry;
1616
use std::io;
1717

1818
#[allow(missing_copy_implementations)]
1919
pub struct GlobalGenerator;
2020

2121
impl super::Generator for GlobalGenerator {
22-
fn write<W>(&self, registry: &Registry, ns: Ns, dest: &mut W) -> io::Result<()> where W: io::Write {
22+
fn write<W>(&self, registry: &Registry, dest: &mut W) -> io::Result<()> where W: io::Write {
2323
try!(write_header(dest));
2424
try!(write_metaloadfn(dest));
25-
try!(write_type_aliases(&ns, dest));
25+
try!(write_type_aliases(registry, dest));
2626
try!(write_enums(registry, dest));
2727
try!(write_fns(registry, dest));
2828
try!(write_fnptr_struct_def(dest));
2929
try!(write_ptrs(registry, dest));
30-
try!(write_fn_mods(registry, &ns, dest));
31-
try!(write_panicking_fns(&ns, dest));
30+
try!(write_fn_mods(registry, dest));
31+
try!(write_panicking_fns(registry, dest));
3232
try!(write_load_fn(registry, dest));
3333
Ok(())
3434
}
@@ -67,7 +67,7 @@ fn write_metaloadfn<W>(dest: &mut W) -> io::Result<()> where W: io::Write {
6767
/// Creates a `types` module which contains all the type aliases.
6868
///
6969
/// See also `generators::gen_type_aliases`.
70-
fn write_type_aliases<W>(ns: &Ns, dest: &mut W) -> io::Result<()> where W: io::Write {
70+
fn write_type_aliases<W>(registry: &Registry, dest: &mut W) -> io::Result<()> where W: io::Write {
7171
try!(writeln!(dest, r#"
7272
pub mod types {{
7373
#![allow(non_camel_case_types)]
@@ -76,7 +76,7 @@ fn write_type_aliases<W>(ns: &Ns, dest: &mut W) -> io::Result<()> where W: io::W
7676
#![allow(missing_copy_implementations)]
7777
"#));
7878

79-
try!(super::gen_type_aliases(ns, dest));
79+
try!(super::gen_type_aliases(registry.api, dest));
8080

8181
writeln!(dest, "
8282
}}
@@ -169,16 +169,16 @@ fn write_ptrs<W>(registry: &Registry, dest: &mut W) -> io::Result<()> where W: i
169169
///
170170
/// Each module contains `is_loaded` and `load_with` which interact with the `storage` module
171171
/// created by `write_ptrs`.
172-
fn write_fn_mods<W>(registry: &Registry, ns: &Ns, dest: &mut W) -> io::Result<()> where W: io::Write {
172+
fn write_fn_mods<W>(registry: &Registry, dest: &mut W) -> io::Result<()> where W: io::Write {
173173
for c in registry.cmd_iter() {
174174
let fallbacks = match registry.aliases.get(&c.proto.ident) {
175175
Some(v) => {
176-
let names = v.iter().map(|name| format!("\"{}\"", super::gen_symbol_name(ns, &name[..]))).collect::<Vec<_>>();
176+
let names = v.iter().map(|name| format!("\"{}\"", super::gen_symbol_name(registry.api, &name[..]))).collect::<Vec<_>>();
177177
format!("&[{}]", names.join(", "))
178178
}, None => "&[]".to_string(),
179179
};
180180
let fnname = &c.proto.ident[..];
181-
let symbol = super::gen_symbol_name(ns, &c.proto.ident[..]);
181+
let symbol = super::gen_symbol_name(registry.api, &c.proto.ident[..]);
182182
let symbol = &symbol[..];
183183

184184
try!(writeln!(dest, r##"
@@ -210,13 +210,13 @@ fn write_fn_mods<W>(registry: &Registry, ns: &Ns, dest: &mut W) -> io::Result<()
210210
/// Creates a `missing_fn_panic` function.
211211
///
212212
/// This function is the mock that is called if the real function could not be called.
213-
fn write_panicking_fns<W>(ns: &Ns, dest: &mut W) -> io::Result<()> where W: io::Write {
213+
fn write_panicking_fns<W>(registry: &Registry, dest: &mut W) -> io::Result<()> where W: io::Write {
214214
writeln!(dest,
215215
"#[inline(never)]
216216
fn missing_fn_panic() -> ! {{
217-
panic!(\"{ns} function was not loaded\")
217+
panic!(\"{api} function was not loaded\")
218218
}}
219-
", ns = ns)
219+
", api = registry.api)
220220
}
221221

222222
/// Creates the `load_with` function.

0 commit comments

Comments
 (0)