added glad generator and a glad runtime
This commit is contained in:
parent
2017f6195e
commit
ac18a84a9c
62 changed files with 32373 additions and 10 deletions
118
tools/glad-0.1.14a0/glad/lang/d/loader/gl.py
Normal file
118
tools/glad-0.1.14a0/glad/lang/d/loader/gl.py
Normal file
|
@ -0,0 +1,118 @@
|
|||
from glad.lang.common.loader import BaseLoader
|
||||
from glad.lang.d.loader import LOAD_OPENGL_DLL
|
||||
|
||||
|
||||
_OPENGL_LOADER = \
|
||||
LOAD_OPENGL_DLL % {'pre':'private', 'init':'open_gl',
|
||||
'proc':'get_proc', 'terminate':'close_gl'} + '''
|
||||
bool gladLoadGL() {
|
||||
bool status = false;
|
||||
|
||||
if(open_gl()) {
|
||||
status = gladLoadGL(x => get_proc(x));
|
||||
close_gl();
|
||||
}
|
||||
|
||||
return status;
|
||||
}
|
||||
'''
|
||||
|
||||
_OPENGL_HAS_EXT = '''
|
||||
static struct GLVersion { static int major = 0; static int minor = 0; }
|
||||
private extern(C) char* strstr(const(char)*, const(char)*) @nogc;
|
||||
private extern(C) int strcmp(const(char)*, const(char)*) @nogc;
|
||||
private extern(C) int strncmp(const(char)*, const(char)*, size_t) @nogc;
|
||||
private extern(C) size_t strlen(const(char)*) @nogc;
|
||||
private bool has_ext(const(char)* ext) @nogc {
|
||||
if(GLVersion.major < 3) {
|
||||
const(char)* extensions = cast(const(char)*)glGetString(GL_EXTENSIONS);
|
||||
const(char)* loc;
|
||||
const(char)* terminator;
|
||||
|
||||
if(extensions is null || ext is null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
while(1) {
|
||||
loc = strstr(extensions, ext);
|
||||
if(loc is null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
terminator = loc + strlen(ext);
|
||||
if((loc is extensions || *(loc - 1) == ' ') &&
|
||||
(*terminator == ' ' || *terminator == '\\0')) {
|
||||
return true;
|
||||
}
|
||||
extensions = terminator;
|
||||
}
|
||||
} else {
|
||||
int num;
|
||||
glGetIntegerv(GL_NUM_EXTENSIONS, &num);
|
||||
|
||||
for(uint i=0; i < cast(uint)num; i++) {
|
||||
if(strcmp(cast(const(char)*)glGetStringi(GL_EXTENSIONS, i), ext) == 0) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
'''
|
||||
|
||||
_FIND_VERSION = '''
|
||||
// Thank you @elmindreda
|
||||
// https://github.com/elmindreda/greg/blob/master/templates/greg.c.in#L176
|
||||
// https://github.com/glfw/glfw/blob/master/src/context.c#L36
|
||||
int i;
|
||||
const(char)* glversion;
|
||||
const(char)*[] prefixes = [
|
||||
"OpenGL ES-CM ".ptr,
|
||||
"OpenGL ES-CL ".ptr,
|
||||
"OpenGL ES ".ptr,
|
||||
];
|
||||
|
||||
glversion = cast(const(char)*)glGetString(GL_VERSION);
|
||||
if (glversion is null) return;
|
||||
|
||||
foreach(prefix; prefixes) {
|
||||
size_t length = strlen(prefix);
|
||||
if (strncmp(glversion, prefix, length) == 0) {
|
||||
glversion += length;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
int major = glversion[0] - \'0\';
|
||||
int minor = glversion[2] - \'0\';
|
||||
GLVersion.major = major; GLVersion.minor = minor;
|
||||
'''
|
||||
|
||||
|
||||
class OpenGLDLoader(BaseLoader):
|
||||
def write_header_end(self, fobj):
|
||||
pass
|
||||
|
||||
def write_header(self, fobj):
|
||||
pass
|
||||
|
||||
def write(self, fobj):
|
||||
fobj.write('alias Loader = void* delegate(const(char)*);\n')
|
||||
if not self.disabled and 'gl' in self.apis:
|
||||
fobj.write(_OPENGL_LOADER)
|
||||
|
||||
def write_begin_load(self, fobj):
|
||||
fobj.write('\tglGetString = cast(typeof(glGetString))load("glGetString");\n')
|
||||
fobj.write('\tif(glGetString is null) { return false; }\n')
|
||||
fobj.write('\tif(glGetString(GL_VERSION) is null) { return false; }\n\n')
|
||||
|
||||
def write_end_load(self, fobj):
|
||||
fobj.write('\treturn GLVersion.major != 0 || GLVersion.minor != 0;\n')
|
||||
|
||||
def write_find_core(self, fobj):
|
||||
fobj.write(_FIND_VERSION)
|
||||
|
||||
def write_has_ext(self, fobj):
|
||||
fobj.write(_OPENGL_HAS_EXT)
|
||||
|
Loading…
Add table
Add a link
Reference in a new issue