118 lines
3.3 KiB
Python
118 lines
3.3 KiB
Python
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)
|
|
|