preliminary/isolated opengl es support, requires USE_EGL/Makefile changes and es headers
git-svn-id: https://svn.code.sf.net/p/fteqw/code/branches/wip@3734 fc73d0e0-1445-4013-8a0c-d673dee63da5
This commit is contained in:
parent
456e13bf81
commit
40a18f65bb
7 changed files with 360 additions and 50 deletions
|
@ -616,6 +616,9 @@ void GLDraw_TransPicTranslate (int x, int y, int width, int height, qbyte *pic,
|
||||||
qbyte *src;
|
qbyte *src;
|
||||||
int p;
|
int p;
|
||||||
|
|
||||||
|
if (gl_config.gles)
|
||||||
|
return; // TODO: NOT FIXED YET
|
||||||
|
|
||||||
GL_Bind (translate_texture);
|
GL_Bind (translate_texture);
|
||||||
|
|
||||||
c = width * height;
|
c = width * height;
|
||||||
|
@ -654,6 +657,9 @@ void GLDraw_TransPicTranslate (int x, int y, int width, int height, qbyte *pic,
|
||||||
|
|
||||||
void GLDraw_FillRGB (int x, int y, int w, int h, float r, float g, float b)
|
void GLDraw_FillRGB (int x, int y, int w, int h, float r, float g, float b)
|
||||||
{
|
{
|
||||||
|
if (gl_config.gles)
|
||||||
|
return; //TODO: DRAW FILL NOT FIXED YET
|
||||||
|
|
||||||
qglDisable (GL_TEXTURE_2D);
|
qglDisable (GL_TEXTURE_2D);
|
||||||
qglColor3f (r, g, b);
|
qglColor3f (r, g, b);
|
||||||
|
|
||||||
|
@ -1514,7 +1520,11 @@ void GL_Upload32_Int (char *name, unsigned *data, int width, int height, unsigne
|
||||||
if (scaled_width * scaled_height > sizeofuploadmemorybuffer/4)
|
if (scaled_width * scaled_height > sizeofuploadmemorybuffer/4)
|
||||||
Sys_Error ("GL_LoadTexture: too big");
|
Sys_Error ("GL_LoadTexture: too big");
|
||||||
|
|
||||||
samples = (flags&IF_NOALPHA) ? GL_RGB : GL_RGBA;
|
if (gl_config.gles)
|
||||||
|
samples = GL_RGBA; /* GL ES doesn't allow for format conversion */
|
||||||
|
else
|
||||||
|
samples = (flags&IF_NOALPHA) ? GL_RGB : GL_RGBA;
|
||||||
|
|
||||||
if (gl_config.arb_texture_compression && gl_compress.value && name && !(flags&IF_NOMIPMAP))
|
if (gl_config.arb_texture_compression && gl_compress.value && name && !(flags&IF_NOMIPMAP))
|
||||||
samples = (flags&IF_NOALPHA) ? GL_COMPRESSED_RGB_ARB : GL_COMPRESSED_RGBA_ARB;
|
samples = (flags&IF_NOALPHA) ? GL_COMPRESSED_RGB_ARB : GL_COMPRESSED_RGBA_ARB;
|
||||||
|
|
||||||
|
|
|
@ -254,7 +254,9 @@ void Font_Init(void)
|
||||||
|
|
||||||
fontplanes.shader = R_RegisterShader("ftefont",
|
fontplanes.shader = R_RegisterShader("ftefont",
|
||||||
"{\n"
|
"{\n"
|
||||||
// "program default2d\n"
|
#ifdef USE_EGL
|
||||||
|
"program default2d\n"
|
||||||
|
#endif
|
||||||
"nomipmaps\n"
|
"nomipmaps\n"
|
||||||
"{\n"
|
"{\n"
|
||||||
"map $diffuse\n"
|
"map $diffuse\n"
|
||||||
|
|
|
@ -795,8 +795,11 @@ struct sbuiltin_s
|
||||||
gles versioning started at 100 and only had a single one defined
|
gles versioning started at 100 and only had a single one defined
|
||||||
with gl3's combined support, gl3 supports 130+ and 100, but 110 requries compat extension
|
with gl3's combined support, gl3 supports 130+ and 100, but 110 requries compat extension
|
||||||
with gl4, versions are meant to match the gl version more closely, so gl4.0 uses 400.*/
|
with gl4, versions are meant to match the gl version more closely, so gl4.0 uses 400.*/
|
||||||
|
/*glsl es shaders require precisions to be defined for fragment shader variables
|
||||||
|
more precision for shaders would be a good candidate for a cvar */
|
||||||
{QR_OPENGL/*ES*/, 100, "default2d",
|
{QR_OPENGL/*ES*/, 100, "default2d",
|
||||||
"#version 100\n"
|
//SGX requires #version to come before defines
|
||||||
|
//"#version 100\n"
|
||||||
"#ifdef VERTEX_SHADER\n"
|
"#ifdef VERTEX_SHADER\n"
|
||||||
"uniform mat4 m_view;\n"
|
"uniform mat4 m_view;\n"
|
||||||
"uniform mat4 m_projection;\n"
|
"uniform mat4 m_projection;\n"
|
||||||
|
@ -816,8 +819,8 @@ struct sbuiltin_s
|
||||||
|
|
||||||
"#ifdef FRAGMENT_SHADER\n"
|
"#ifdef FRAGMENT_SHADER\n"
|
||||||
"uniform sampler2D s_t0;\n"
|
"uniform sampler2D s_t0;\n"
|
||||||
"in vec2 tc;\n"
|
"varying mediump vec2 tc;\n"
|
||||||
"varying vec4 vc;\n"
|
"varying lowp vec4 vc;\n"
|
||||||
|
|
||||||
"void main (void)\n"
|
"void main (void)\n"
|
||||||
"{\n"
|
"{\n"
|
||||||
|
@ -889,7 +892,7 @@ struct sbuiltin_s
|
||||||
},
|
},
|
||||||
{QR_OPENGL/*ES*/, 100, "defaultwall",
|
{QR_OPENGL/*ES*/, 100, "defaultwall",
|
||||||
"!!permu FULLBRIGHT\n"
|
"!!permu FULLBRIGHT\n"
|
||||||
"#version 100\n"
|
//"#version 100\n"
|
||||||
"#ifdef VERTEX_SHADER\n"
|
"#ifdef VERTEX_SHADER\n"
|
||||||
"uniform mat4 m_modelview;\n"
|
"uniform mat4 m_modelview;\n"
|
||||||
"uniform mat4 m_projection;\n"
|
"uniform mat4 m_projection;\n"
|
||||||
|
@ -914,7 +917,7 @@ struct sbuiltin_s
|
||||||
"#ifdef FULLBRIGHT\n"
|
"#ifdef FULLBRIGHT\n"
|
||||||
"uniform sampler2D s_t4;\n" /*tex_fullbright*/
|
"uniform sampler2D s_t4;\n" /*tex_fullbright*/
|
||||||
"#endif\n"
|
"#endif\n"
|
||||||
"varying vec2 tc, lm;\n"
|
"varying mediump vec2 tc, lm;\n"
|
||||||
|
|
||||||
"void main (void)\n"
|
"void main (void)\n"
|
||||||
"{\n"
|
"{\n"
|
||||||
|
@ -926,8 +929,8 @@ struct sbuiltin_s
|
||||||
"#endif\n"
|
"#endif\n"
|
||||||
},
|
},
|
||||||
{QR_OPENGL/*ES*/, 100, "defaultwarp",
|
{QR_OPENGL/*ES*/, 100, "defaultwarp",
|
||||||
"#version 100\n"
|
//"#version 100\n"
|
||||||
"varying vec2 tc;\n"
|
"varying mediump vec2 tc;\n"
|
||||||
"#ifdef VERTEX_SHADER\n"
|
"#ifdef VERTEX_SHADER\n"
|
||||||
"uniform mat4 m_modelview;\n"
|
"uniform mat4 m_modelview;\n"
|
||||||
"uniform mat4 m_projection;\n"
|
"uniform mat4 m_projection;\n"
|
||||||
|
@ -942,15 +945,15 @@ struct sbuiltin_s
|
||||||
|
|
||||||
"#ifdef FRAGMENT_SHADER\n"
|
"#ifdef FRAGMENT_SHADER\n"
|
||||||
"uniform sampler2D watertexture;\n"
|
"uniform sampler2D watertexture;\n"
|
||||||
"uniform float e_time;\n"
|
"uniform mediump float e_time;\n"
|
||||||
"uniform float wateralpha;\n"
|
"uniform lowp float wateralpha;\n"
|
||||||
|
|
||||||
"void main (void)\n"
|
"void main (void)\n"
|
||||||
"{\n"
|
"{\n"
|
||||||
" vec2 ntc;\n"
|
" mediump vec2 ntc;\n"
|
||||||
" ntc.s = tc.s + sin(tc.t+e_time)*0.125;\n"
|
" ntc.s = tc.s + sin(tc.t+e_time)*0.125;\n"
|
||||||
" ntc.t = tc.t + sin(tc.s+e_time)*0.125;\n"
|
" ntc.t = tc.t + sin(tc.s+e_time)*0.125;\n"
|
||||||
" vec3 ts = vec3(texture2D(watertexture, ntc));\n"
|
" lowp vec3 ts = vec3(texture2D(watertexture, ntc));\n"
|
||||||
|
|
||||||
" gl_FragColor = vec4(ts, wateralpha);\n"
|
" gl_FragColor = vec4(ts, wateralpha);\n"
|
||||||
"}\n"
|
"}\n"
|
||||||
|
@ -984,7 +987,7 @@ struct sbuiltin_s
|
||||||
"#endif\n"
|
"#endif\n"
|
||||||
},
|
},
|
||||||
{QR_OPENGL/*ES*/, 100, "defaultsky",
|
{QR_OPENGL/*ES*/, 100, "defaultsky",
|
||||||
"#version 100\n"
|
//"#version 100\n"
|
||||||
"#ifdef VERTEX_SHADER\n"
|
"#ifdef VERTEX_SHADER\n"
|
||||||
"uniform mat4 m_modelview;\n"
|
"uniform mat4 m_modelview;\n"
|
||||||
"uniform mat4 m_projection;\n"
|
"uniform mat4 m_projection;\n"
|
||||||
|
@ -1002,24 +1005,24 @@ struct sbuiltin_s
|
||||||
"uniform sampler2D s_t0;\n"
|
"uniform sampler2D s_t0;\n"
|
||||||
"uniform sampler2D s_t1;\n"
|
"uniform sampler2D s_t1;\n"
|
||||||
|
|
||||||
"uniform float e_time;\n"
|
"uniform mediump float e_time;\n"
|
||||||
"uniform vec3 eyepos;\n"
|
"uniform mediump vec3 eyepos;\n"
|
||||||
"varying vec3 pos;\n"
|
"varying mediump vec3 pos;\n"
|
||||||
|
|
||||||
"void main (void)\n"
|
"void main (void)\n"
|
||||||
"{\n"
|
"{\n"
|
||||||
" vec2 tccoord;\n"
|
" mediump vec2 tccoord;\n"
|
||||||
|
|
||||||
" vec3 dir = pos - eyepos;\n"
|
" mediump vec3 dir = pos - eyepos;\n"
|
||||||
|
|
||||||
" dir.z *= 3.0;\n"
|
" dir.z *= 3.0;\n"
|
||||||
" dir.xy /= 0.5*length(dir);\n"
|
" dir.xy /= 0.5*length(dir);\n"
|
||||||
|
|
||||||
" tccoord = (dir.xy + e_time*0.03125);\n"
|
" tccoord = (dir.xy + e_time*0.03125);\n"
|
||||||
" vec3 solid = vec3(texture2D(s_t0, tccoord));\n"
|
" lowp vec3 solid = vec3(texture2D(s_t0, tccoord));\n"
|
||||||
|
|
||||||
" tccoord = (dir.xy + e_time*0.0625);\n"
|
" tccoord = (dir.xy + e_time*0.0625);\n"
|
||||||
" vec4 clouds = texture2D(s_t1, tccoord);\n"
|
" lowp vec4 clouds = texture2D(s_t1, tccoord);\n"
|
||||||
|
|
||||||
" gl_FragColor.rgb = (solid.rgb*(1.0-clouds.a)) + (clouds.a*clouds.rgb);\n"
|
" gl_FragColor.rgb = (solid.rgb*(1.0-clouds.a)) + (clouds.a*clouds.rgb);\n"
|
||||||
// " gl_FragColor.rgb = solid.rgb;/*gl_FragColor.g = clouds.r;*/gl_FragColor.b = clouds.a;\n"
|
// " gl_FragColor.rgb = solid.rgb;/*gl_FragColor.g = clouds.r;*/gl_FragColor.b = clouds.a;\n"
|
||||||
|
@ -1069,7 +1072,7 @@ struct sbuiltin_s
|
||||||
"!!permu FULLBRIGHT\n"
|
"!!permu FULLBRIGHT\n"
|
||||||
"!!permu LOWER\n"
|
"!!permu LOWER\n"
|
||||||
"!!permu UPPER\n"
|
"!!permu UPPER\n"
|
||||||
"#version 100\n"
|
//"#version 100\n"
|
||||||
"#ifdef VERTEX_SHADER\n"
|
"#ifdef VERTEX_SHADER\n"
|
||||||
"uniform mat4 m_modelview;\n"
|
"uniform mat4 m_modelview;\n"
|
||||||
"uniform mat4 m_projection;\n"
|
"uniform mat4 m_projection;\n"
|
||||||
|
@ -1095,17 +1098,17 @@ struct sbuiltin_s
|
||||||
"uniform sampler2D s_t0;\n" /*tex_diffuse*/
|
"uniform sampler2D s_t0;\n" /*tex_diffuse*/
|
||||||
"#ifdef LOWER\n"
|
"#ifdef LOWER\n"
|
||||||
"uniform sampler2D s_t1;\n" /*tex_lower*/
|
"uniform sampler2D s_t1;\n" /*tex_lower*/
|
||||||
"uniform vec3 e_lowercolour;\n"
|
"uniform lowp vec3 e_lowercolour;\n"
|
||||||
"#endif\n"
|
"#endif\n"
|
||||||
"#ifdef UPPER\n"
|
"#ifdef UPPER\n"
|
||||||
"uniform sampler2D s_t2;\n" /*tex_upper*/
|
"uniform sampler2D s_t2;\n" /*tex_upper*/
|
||||||
"uniform vec3 e_uppercolour;\n"
|
"uniform lowp vec3 e_uppercolour;\n"
|
||||||
"#endif\n"
|
"#endif\n"
|
||||||
"#ifdef FULLBRIGHT\n"
|
"#ifdef FULLBRIGHT\n"
|
||||||
"uniform sampler2D s_t3;\n" /*tex_fullbright*/
|
"uniform sampler2D s_t3;\n" /*tex_fullbright*/
|
||||||
"#endif\n"
|
"#endif\n"
|
||||||
"varying vec2 tc;\n"
|
"varying mediump vec2 tc;\n"
|
||||||
"varying vec3 light;\n"
|
"varying lowp vec3 light;\n"
|
||||||
|
|
||||||
"void main (void)\n"
|
"void main (void)\n"
|
||||||
"{\n"
|
"{\n"
|
||||||
|
@ -1141,6 +1144,7 @@ static void Shader_LoadGeneric(union programhandle_u *shader, char *name, int qr
|
||||||
{
|
{
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
void *file;
|
void *file;
|
||||||
|
|
||||||
sgeneric_t *g;
|
sgeneric_t *g;
|
||||||
for (g = sgenerics; g; g = g->next)
|
for (g = sgenerics; g; g = g->next)
|
||||||
{
|
{
|
||||||
|
@ -3584,7 +3588,9 @@ void Shader_Default2D(char *shortname, shader_t *s, const void *genargs)
|
||||||
{
|
{
|
||||||
Shader_DefaultScript(shortname, s,
|
Shader_DefaultScript(shortname, s,
|
||||||
"{\n"
|
"{\n"
|
||||||
// "program default2d\n"
|
#ifdef USE_EGL
|
||||||
|
"program default2d\n"
|
||||||
|
#endif
|
||||||
"nomipmaps\n"
|
"nomipmaps\n"
|
||||||
"{\n"
|
"{\n"
|
||||||
"clampmap $diffuse\n"
|
"clampmap $diffuse\n"
|
||||||
|
|
|
@ -333,6 +333,10 @@ void APIENTRY GL_BindBufferARBStub(GLenum target, GLuint id)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void APIENTRY GL_ClientStateStub(GLenum array)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
#define getglcore getglfunction
|
#define getglcore getglfunction
|
||||||
#define getglext(name) getglfunction(name)
|
#define getglext(name) getglfunction(name)
|
||||||
void GL_CheckExtensions (void *(*getglfunction) (char *name), float ver)
|
void GL_CheckExtensions (void *(*getglfunction) (char *name), float ver)
|
||||||
|
@ -943,13 +947,12 @@ void GL_Init(void *(*getglfunction) (char *name))
|
||||||
qglEndList = (void*)getglcore("glEndList");
|
qglEndList = (void*)getglcore("glEndList");
|
||||||
qglCallList = (void*)getglcore("glCallList");
|
qglCallList = (void*)getglcore("glCallList");
|
||||||
|
|
||||||
qglBindBufferARB = (void *)getglext("qglBindBufferARB");
|
qglBindBufferARB = (void *)getglext("glBindBufferARB");
|
||||||
if (!qglBindBufferARB)
|
if (!qglBindBufferARB)
|
||||||
qglBindBufferARB = (void *)getglext("qglBindBuffer");
|
qglBindBufferARB = (void *)getglext("glBindBuffer");
|
||||||
if (!qglBindBufferARB)
|
if (!qglBindBufferARB)
|
||||||
qglBindBufferARB = GL_BindBufferARBStub;
|
qglBindBufferARB = GL_BindBufferARBStub;
|
||||||
|
|
||||||
|
|
||||||
gl_vendor = qglGetString (GL_VENDOR);
|
gl_vendor = qglGetString (GL_VENDOR);
|
||||||
Con_SafePrintf ("GL_VENDOR: %s\n", gl_vendor);
|
Con_SafePrintf ("GL_VENDOR: %s\n", gl_vendor);
|
||||||
gl_renderer = qglGetString (GL_RENDERER);
|
gl_renderer = qglGetString (GL_RENDERER);
|
||||||
|
@ -1014,8 +1017,8 @@ void GL_Init(void *(*getglfunction) (char *name))
|
||||||
qglShadeModel = NULL;
|
qglShadeModel = NULL;
|
||||||
qglDepthRange = NULL;
|
qglDepthRange = NULL;
|
||||||
|
|
||||||
qglEnableClientState = NULL;
|
qglEnableClientState = GL_ClientStateStub;
|
||||||
qglDisableClientState = NULL;
|
qglDisableClientState = GL_ClientStateStub;
|
||||||
|
|
||||||
qglDrawRangeElements = GL_DrawRangeElementsEmul;
|
qglDrawRangeElements = GL_DrawRangeElementsEmul;
|
||||||
}
|
}
|
||||||
|
|
232
engine/gl/gl_vidgles.c
Normal file
232
engine/gl/gl_vidgles.c
Normal file
|
@ -0,0 +1,232 @@
|
||||||
|
#include "gl_vidgles.h"
|
||||||
|
|
||||||
|
EGLContext eglctx = EGL_NO_CONTEXT;
|
||||||
|
EGLDisplay egldpy = EGL_NO_DISPLAY;
|
||||||
|
EGLSurface eglsurf = EGL_NO_SURFACE;
|
||||||
|
|
||||||
|
static void *egllibrary;
|
||||||
|
static void *eslibrary;
|
||||||
|
|
||||||
|
static EGLint (*qeglGetError)(void);
|
||||||
|
|
||||||
|
static EGLDisplay (*qeglGetDisplay)(EGLNativeDisplayType display_id);
|
||||||
|
static EGLBoolean (*qeglInitialize)(EGLDisplay dpy, EGLint *major, EGLint *minor);
|
||||||
|
static EGLBoolean (*qeglTerminate)(EGLDisplay dpy);
|
||||||
|
|
||||||
|
static EGLBoolean (*qeglGetConfigs)(EGLDisplay dpy, EGLConfig *configs, EGLint config_size, EGLint *num_config);
|
||||||
|
static EGLBoolean (*qeglChooseConfig)(EGLDisplay dpy, const EGLint *attrib_list, EGLConfig *configs, EGLint config_size, EGLint *num_config);
|
||||||
|
|
||||||
|
static EGLSurface (*qeglCreateWindowSurface)(EGLDisplay dpy, EGLConfig config, EGLNativeWindowType win, const EGLint *attrib_list);
|
||||||
|
static EGLBoolean (*qeglDestroySurface)(EGLDisplay dpy, EGLSurface surface);
|
||||||
|
static EGLBoolean (*qeglQuerySurface)(EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint *value);
|
||||||
|
|
||||||
|
static EGLBoolean (*qeglSwapBuffers)(EGLDisplay dpy, EGLSurface surface);
|
||||||
|
static EGLBoolean (*qeglMakeCurrent)(EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx);
|
||||||
|
static EGLContext (*qeglCreateContext)(EGLDisplay dpy, EGLConfig config, EGLContext share_context, const EGLint *attrib_list);
|
||||||
|
static EGLBoolean (*qeglDestroyContext)(EGLDisplay dpy, EGLContext ctx);
|
||||||
|
static void *(*qeglGetProcAddress) (char *name);
|
||||||
|
|
||||||
|
/*
|
||||||
|
static dllfunction_t qeglfuncs[] =
|
||||||
|
{
|
||||||
|
{(void*)&qeglGetError, "eglGetError"},
|
||||||
|
{(void*)&qeglInitialize, "eglInitialize"},
|
||||||
|
{(void*)&qeglTerminate, "eglTerminate"},
|
||||||
|
|
||||||
|
{(void*)&qeglGetConfigs, "eglGetConfigs"},
|
||||||
|
{(void*)&qeglChooseConfig, "eglChooseConfig"},
|
||||||
|
|
||||||
|
{(void*)&qeglCreateWindowSurface, "eglCreateWindowSurface"},
|
||||||
|
{(void*)&qeglDestroySurface, "eglDestroySurface"},
|
||||||
|
{(void*)&qeglQuerySurface, "eglQuerySurface"},
|
||||||
|
|
||||||
|
{(void*)&qeglSwapBuffers, "eglSwapBuffers"},
|
||||||
|
{(void*)&qeglMakeCurrent, "eglMakeCurrent"},
|
||||||
|
{(void*)&qeglCreateContext, "eglCreateContext"},
|
||||||
|
{(void*)&qeglDestroyContext, "eglDestroyContext"},
|
||||||
|
|
||||||
|
{(void*)&qeglGetProcAddress, "eglGetProcAddress"},
|
||||||
|
|
||||||
|
{NULL}
|
||||||
|
};
|
||||||
|
*/
|
||||||
|
|
||||||
|
void *EGL_Proc(char *f)
|
||||||
|
{
|
||||||
|
void *proc = NULL;
|
||||||
|
|
||||||
|
/*
|
||||||
|
char fname[512];
|
||||||
|
{
|
||||||
|
sprintf(fname, "wrap_%s", f);
|
||||||
|
f = fname;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (qeglGetProcAddress)
|
||||||
|
proc = qeglGetProcAddress(f);
|
||||||
|
if (!proc)
|
||||||
|
proc = dlsym(eslibrary, f);
|
||||||
|
if (!proc)
|
||||||
|
proc = dlsym(egllibrary, f);
|
||||||
|
|
||||||
|
return proc;
|
||||||
|
}
|
||||||
|
|
||||||
|
void EGL_UnloadLibrary(void)
|
||||||
|
{
|
||||||
|
if (egllibrary)
|
||||||
|
dlclose(egllibrary);
|
||||||
|
if (egllibrary == eslibrary)
|
||||||
|
eslibrary = NULL;
|
||||||
|
if (eslibrary)
|
||||||
|
dlclose(eslibrary);
|
||||||
|
eslibrary = egllibrary = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
qboolean EGL_LoadLibrary(char *driver)
|
||||||
|
{
|
||||||
|
/* ignore driver for now */
|
||||||
|
egllibrary = dlopen("libEGL.so", RTLD_LAZY);
|
||||||
|
if (!egllibrary)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
/*eslibrary = dlopen("GLESwrap.so", RTLD_LAZY);*/
|
||||||
|
eslibrary = dlopen("libGLESv2.so", RTLD_LAZY);
|
||||||
|
if (!eslibrary)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
qeglGetError = dlsym(egllibrary, "eglGetError");
|
||||||
|
|
||||||
|
qeglGetDisplay = dlsym(egllibrary, "eglGetDisplay");
|
||||||
|
qeglInitialize = dlsym(egllibrary, "eglInitialize");
|
||||||
|
qeglTerminate = dlsym(egllibrary, "eglTerminate");
|
||||||
|
|
||||||
|
qeglGetConfigs = dlsym(egllibrary, "eglGetConfigs");
|
||||||
|
qeglChooseConfig = dlsym(egllibrary, "eglChooseConfig");
|
||||||
|
|
||||||
|
qeglCreateWindowSurface = dlsym(egllibrary, "eglCreateWindowSurface");
|
||||||
|
qeglDestroySurface = dlsym(egllibrary, "eglDestroySurface");
|
||||||
|
qeglQuerySurface = dlsym(egllibrary, "eglQuerySurface");
|
||||||
|
|
||||||
|
qeglSwapBuffers = dlsym(egllibrary, "eglSwapBuffers");
|
||||||
|
qeglMakeCurrent = dlsym(egllibrary, "eglMakeCurrent");
|
||||||
|
qeglCreateContext = dlsym(egllibrary, "eglCreateContext");
|
||||||
|
qeglDestroyContext = dlsym(egllibrary, "eglDestroyContext");
|
||||||
|
|
||||||
|
qeglGetProcAddress = dlsym(egllibrary, "eglGetProcAddress");
|
||||||
|
|
||||||
|
// TODO: properly unload on error
|
||||||
|
if (!qeglGetError || !qeglGetDisplay || !qeglInitialize || !qeglTerminate || !qeglCreateWindowSurface ||
|
||||||
|
!qeglDestroySurface || !qeglGetConfigs || !qeglChooseConfig || !qeglQuerySurface ||
|
||||||
|
!qeglSwapBuffers || !qeglMakeCurrent || !qeglCreateContext || !qeglDestroyContext ||
|
||||||
|
!qeglGetProcAddress)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void EGL_Shutdown(void)
|
||||||
|
{
|
||||||
|
if (eglctx == EGL_NO_CONTEXT)
|
||||||
|
return;
|
||||||
|
|
||||||
|
qeglMakeCurrent(EGL_NO_DISPLAY, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
|
||||||
|
qeglDestroyContext(egldpy, eglctx);
|
||||||
|
|
||||||
|
if (eglsurf != EGL_NO_SURFACE)
|
||||||
|
qeglDestroySurface(egldpy, eglsurf);
|
||||||
|
|
||||||
|
qeglTerminate(egldpy);
|
||||||
|
|
||||||
|
eglctx = EGL_NO_CONTEXT;
|
||||||
|
egldpy = EGL_NO_DISPLAY;
|
||||||
|
eglsurf = EGL_NO_SURFACE;
|
||||||
|
}
|
||||||
|
|
||||||
|
void EGL_BeginRendering (void)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void EGL_EndRendering (void)
|
||||||
|
{
|
||||||
|
qeglSwapBuffers(egldpy, eglsurf);
|
||||||
|
/* TODO: check result? */
|
||||||
|
}
|
||||||
|
|
||||||
|
qboolean EGL_Init (rendererstate_t *info, unsigned char *palette, EGLNativeWindowType window)
|
||||||
|
{
|
||||||
|
EGLint numconfig;
|
||||||
|
EGLConfig cfg;
|
||||||
|
EGLint attrib[] =
|
||||||
|
{
|
||||||
|
EGL_BUFFER_SIZE, info->bpp,
|
||||||
|
EGL_SAMPLES, info->multisample,
|
||||||
|
EGL_STENCIL_SIZE, 8,
|
||||||
|
EGL_ALPHA_MASK_SIZE, 8,
|
||||||
|
EGL_DEPTH_SIZE, 16,
|
||||||
|
EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
|
||||||
|
EGL_NONE
|
||||||
|
};
|
||||||
|
EGLint contextattr[] =
|
||||||
|
{
|
||||||
|
EGL_CONTEXT_CLIENT_VERSION, 2,
|
||||||
|
EGL_NONE, EGL_NONE
|
||||||
|
};
|
||||||
|
|
||||||
|
if (!EGL_LoadLibrary(""))
|
||||||
|
{
|
||||||
|
Con_Printf(CON_ERROR "EGL: unable to load library!\n");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
egldpy = qeglGetDisplay(EGL_DEFAULT_DISPLAY);
|
||||||
|
if (egldpy == EGL_NO_DISPLAY)
|
||||||
|
{
|
||||||
|
Con_Printf(CON_ERROR "EGL: can't get display!\n");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!qeglInitialize(egldpy, NULL, NULL))
|
||||||
|
{
|
||||||
|
Con_Printf(CON_ERROR "EGL: can't initialize display!");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
if (!qeglGetConfigs(egldpy, NULL, 0, &numconfigs) || !numconfigs)
|
||||||
|
{
|
||||||
|
Con_Printf(CON_ERROR "EGL: can't get configs!");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (!qeglChooseConfig(egldpy, attrib, &cfg, 1, &numconfig))
|
||||||
|
{
|
||||||
|
Con_Printf(CON_ERROR "EGL: can't choose config!");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
eglsurf = qeglCreateWindowSurface(egldpy, cfg, window, NULL);
|
||||||
|
if (eglsurf == EGL_NO_SURFACE)
|
||||||
|
{
|
||||||
|
Con_Printf(CON_ERROR "EGL: no surface!");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
eglctx = qeglCreateContext(egldpy, cfg, EGL_NO_SURFACE, contextattr);
|
||||||
|
if (eglctx == EGL_NO_CONTEXT)
|
||||||
|
{
|
||||||
|
Con_Printf(CON_ERROR "EGL: no context!");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!qeglMakeCurrent(egldpy, eglsurf, eglsurf, eglctx))
|
||||||
|
{
|
||||||
|
Con_Printf(CON_ERROR "EGL: can't make current!");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
16
engine/gl/gl_vidgles.h
Normal file
16
engine/gl/gl_vidgles.h
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
#ifndef __GL_VIDGLES_H__
|
||||||
|
#define __GL_VIDGLES_H__
|
||||||
|
|
||||||
|
#include "quakedef.h"
|
||||||
|
#include <EGL/egl.h>
|
||||||
|
#include <dlfcn.h>
|
||||||
|
|
||||||
|
void *EGL_Proc(char *f);
|
||||||
|
void EGL_UnloadLibrary(void);
|
||||||
|
qboolean EGL_LoadLibrary(char *driver);
|
||||||
|
void EGL_Shutdown(void);
|
||||||
|
void EGL_BeginRendering (void);
|
||||||
|
void EGL_EndRendering (void);
|
||||||
|
qboolean EGL_Init (rendererstate_t *info, unsigned char *palette, EGLNativeWindowType window);
|
||||||
|
|
||||||
|
#endif
|
|
@ -33,12 +33,15 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
#include "glquake.h"
|
#include "glquake.h"
|
||||||
|
|
||||||
#include <GL/glx.h>
|
#include <GL/glx.h>
|
||||||
|
#ifdef USE_EGL
|
||||||
|
#include "gl_vidgles.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <X11/keysym.h>
|
#include <X11/keysym.h>
|
||||||
#include <X11/cursorfont.h>
|
#include <X11/cursorfont.h>
|
||||||
|
|
||||||
#ifdef USE_DGA
|
#ifdef USE_DGA
|
||||||
#include <X11/extensions/xf86dga.h>
|
#include <X11/extensions/Xxf86dga.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef __linux__
|
#ifdef __linux__
|
||||||
|
@ -148,7 +151,6 @@ qboolean GLX_InitLibrary(char *driver)
|
||||||
qglXMakeCurrent = dlsym(gllibrary, "glXMakeCurrent");
|
qglXMakeCurrent = dlsym(gllibrary, "glXMakeCurrent");
|
||||||
qglXCreateContext = dlsym(gllibrary, "glXCreateContext");
|
qglXCreateContext = dlsym(gllibrary, "glXCreateContext");
|
||||||
qglXDestroyContext = dlsym(gllibrary, "glXDestroyContext");
|
qglXDestroyContext = dlsym(gllibrary, "glXDestroyContext");
|
||||||
qglXDestroyContext = dlsym(gllibrary, "glXDestroyContext");
|
|
||||||
qglXGetProcAddress = dlsym(gllibrary, "glXGetProcAddress");
|
qglXGetProcAddress = dlsym(gllibrary, "glXGetProcAddress");
|
||||||
if (!qglXGetProcAddress)
|
if (!qglXGetProcAddress)
|
||||||
qglXGetProcAddress = dlsym(gllibrary, "glXGetProcAddressARB");
|
qglXGetProcAddress = dlsym(gllibrary, "glXGetProcAddressARB");
|
||||||
|
@ -585,6 +587,9 @@ static void GetEvent(void)
|
||||||
|
|
||||||
void GLVID_Shutdown(void)
|
void GLVID_Shutdown(void)
|
||||||
{
|
{
|
||||||
|
#ifdef USE_EGL
|
||||||
|
EGL_Shutdown();
|
||||||
|
#else
|
||||||
printf("GLVID_Shutdown\n");
|
printf("GLVID_Shutdown\n");
|
||||||
if (!ctx)
|
if (!ctx)
|
||||||
return;
|
return;
|
||||||
|
@ -618,6 +623,7 @@ void GLVID_Shutdown(void)
|
||||||
XCloseDisplay(vid_dpy);
|
XCloseDisplay(vid_dpy);
|
||||||
vid_dpy = NULL;
|
vid_dpy = NULL;
|
||||||
vid_window = (Window)NULL;
|
vid_window = (Window)NULL;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void GLVID_DeInit(void) //FIXME:....
|
void GLVID_DeInit(void) //FIXME:....
|
||||||
|
@ -730,15 +736,22 @@ GL_BeginRendering
|
||||||
*/
|
*/
|
||||||
void GL_BeginRendering (void)
|
void GL_BeginRendering (void)
|
||||||
{
|
{
|
||||||
|
#ifdef USE_EGL
|
||||||
|
EGL_BeginRendering();
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void GL_EndRendering (void)
|
void GL_EndRendering (void)
|
||||||
{
|
{
|
||||||
|
#ifdef USE_EGL
|
||||||
|
EGL_EndRendering();
|
||||||
|
#else
|
||||||
//return;
|
//return;
|
||||||
//we don't need the flush, XSawpBuffers does it for us.
|
//we don't need the flush, XSawpBuffers does it for us.
|
||||||
//chances are, it's version is more suitable anyway. At least there's the chance that it might be.
|
//chances are, it's version is more suitable anyway. At least there's the chance that it might be.
|
||||||
qglXSwapBuffers(vid_dpy, vid_window);
|
qglXSwapBuffers(vid_dpy, vid_window);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
qboolean GLVID_Is8bit(void)
|
qboolean GLVID_Is8bit(void)
|
||||||
|
@ -762,6 +775,9 @@ qboolean GLVID_Init (rendererstate_t *info, unsigned char *palette)
|
||||||
XSetWindowAttributes attr;
|
XSetWindowAttributes attr;
|
||||||
unsigned long mask;
|
unsigned long mask;
|
||||||
Window root;
|
Window root;
|
||||||
|
#ifdef USE_EGL
|
||||||
|
XVisualInfo vinfodef;
|
||||||
|
#endif
|
||||||
XVisualInfo *visinfo;
|
XVisualInfo *visinfo;
|
||||||
qboolean fullscreen = false;
|
qboolean fullscreen = false;
|
||||||
Atom prots[1];
|
Atom prots[1];
|
||||||
|
@ -776,11 +792,19 @@ qboolean GLVID_Init (rendererstate_t *info, unsigned char *palette)
|
||||||
|
|
||||||
S_Startup();
|
S_Startup();
|
||||||
|
|
||||||
|
#ifdef USE_EGL
|
||||||
|
if (!EGL_LoadLibrary(info->glrenderer))
|
||||||
|
{
|
||||||
|
Con_Printf("couldn't load EGL library\n");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
#else
|
||||||
if (!GLX_InitLibrary(info->glrenderer))
|
if (!GLX_InitLibrary(info->glrenderer))
|
||||||
{
|
{
|
||||||
Con_Printf("Couldn't intialise GLX\nEither your drivers are not installed or you need to specify the library name with the gl_driver cvar\n");
|
Con_Printf("Couldn't intialise GLX\nEither your drivers are not installed or you need to specify the library name with the gl_driver cvar\n");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
vid.colormap = host_colormap;
|
vid.colormap = host_colormap;
|
||||||
|
|
||||||
|
@ -828,12 +852,6 @@ qboolean GLVID_Init (rendererstate_t *info, unsigned char *palette)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
visinfo = qglXChooseVisual(vid_dpy, scrnum, attrib);
|
|
||||||
if (!visinfo)
|
|
||||||
{
|
|
||||||
Sys_Error("qkHack: Error couldn't get an RGB, Double-buffered, Depth visual\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef WITH_VMODE
|
#ifdef WITH_VMODE
|
||||||
vidmode_usemode = -1;
|
vidmode_usemode = -1;
|
||||||
if (vidmode_ext)
|
if (vidmode_ext)
|
||||||
|
@ -880,6 +898,21 @@ qboolean GLVID_Init (rendererstate_t *info, unsigned char *palette)
|
||||||
|
|
||||||
vidglx_fullscreen = fullscreen;
|
vidglx_fullscreen = fullscreen;
|
||||||
|
|
||||||
|
#ifdef USE_EGL
|
||||||
|
visinfo = &vinfodef;
|
||||||
|
if (!XMatchVisualInfo(vid_dpy, scrnum, info->bpp, TrueColor, visinfo))
|
||||||
|
// if (!XMatchVisualInfo(vid_dpy, scrnum, DefaultDepth(vid_dpy, scrnum), TrueColor, &visinfo))
|
||||||
|
{
|
||||||
|
Sys_Error("Couldn't choose visual for EGL\n");
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
visinfo = qglXChooseVisual(vid_dpy, scrnum, attrib);
|
||||||
|
if (!visinfo)
|
||||||
|
{
|
||||||
|
Sys_Error("qkHack: Error couldn't get an RGB, Double-buffered, Depth visual\n");
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/* window attributes */
|
/* window attributes */
|
||||||
attr.background_pixel = 0;
|
attr.background_pixel = 0;
|
||||||
attr.border_pixel = 0;
|
attr.border_pixel = 0;
|
||||||
|
@ -898,10 +931,11 @@ qboolean GLVID_Init (rendererstate_t *info, unsigned char *palette)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
ActiveApp = false;
|
|
||||||
vid_window = XCreateWindow(vid_dpy, root, 0, 0, info->width, info->height,
|
vid_window = XCreateWindow(vid_dpy, root, 0, 0, info->width, info->height,
|
||||||
0, visinfo->depth, InputOutput,
|
0, visinfo->depth, InputOutput,
|
||||||
visinfo->visual, mask, &attr);
|
visinfo->visual, mask, &attr);
|
||||||
|
|
||||||
|
ActiveApp = false;
|
||||||
/*ask the window manager to stop triggering bugs in Xlib*/
|
/*ask the window manager to stop triggering bugs in Xlib*/
|
||||||
prots[0] = XInternAtom(vid_dpy, "WM_DELETE_WINDOW", False);
|
prots[0] = XInternAtom(vid_dpy, "WM_DELETE_WINDOW", False);
|
||||||
XSetWMProtocols(vid_dpy, vid_window, prots, sizeof(prots)/sizeof(prots[0]));
|
XSetWMProtocols(vid_dpy, vid_window, prots, sizeof(prots)/sizeof(prots[0]));
|
||||||
|
@ -911,7 +945,7 @@ qboolean GLVID_Init (rendererstate_t *info, unsigned char *palette)
|
||||||
XMapWindow(vid_dpy, vid_window);
|
XMapWindow(vid_dpy, vid_window);
|
||||||
/*put it somewhere*/
|
/*put it somewhere*/
|
||||||
XMoveWindow(vid_dpy, vid_window, 0, 0);
|
XMoveWindow(vid_dpy, vid_window, 0, 0);
|
||||||
|
|
||||||
//XFree(visinfo);
|
//XFree(visinfo);
|
||||||
|
|
||||||
#ifdef WITH_VMODE
|
#ifdef WITH_VMODE
|
||||||
|
@ -929,6 +963,7 @@ qboolean GLVID_Init (rendererstate_t *info, unsigned char *palette)
|
||||||
|
|
||||||
XFlush(vid_dpy);
|
XFlush(vid_dpy);
|
||||||
|
|
||||||
|
#ifndef USE_EGL
|
||||||
#ifdef WITH_VMODE
|
#ifdef WITH_VMODE
|
||||||
if (vidmode_ext >= 2)
|
if (vidmode_ext >= 2)
|
||||||
{
|
{
|
||||||
|
@ -961,6 +996,20 @@ qboolean GLVID_Init (rendererstate_t *info, unsigned char *palette)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GL_Init(&GLX_GetSymbol);
|
||||||
|
|
||||||
|
#else
|
||||||
|
EGL_Init(info, palette, vid_window);
|
||||||
|
GL_Init(&EGL_Proc);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
GLVID_SetPalette(palette);
|
||||||
|
GLVID_ShiftPalette(palette);
|
||||||
|
|
||||||
|
qglGetIntegerv(GL_STENCIL_BITS, &gl_canstencil);
|
||||||
|
|
||||||
|
InitSig(); // trap evil signals
|
||||||
|
|
||||||
vid.pixelwidth = info->width;
|
vid.pixelwidth = info->width;
|
||||||
vid.pixelheight = info->height;
|
vid.pixelheight = info->height;
|
||||||
|
|
||||||
|
@ -971,14 +1020,6 @@ qboolean GLVID_Init (rendererstate_t *info, unsigned char *palette)
|
||||||
|
|
||||||
vid.numpages = 2;
|
vid.numpages = 2;
|
||||||
|
|
||||||
InitSig(); // trap evil signals
|
|
||||||
|
|
||||||
GL_Init(&GLX_GetSymbol);
|
|
||||||
qglGetIntegerv(GL_STENCIL_BITS, &gl_canstencil);
|
|
||||||
|
|
||||||
GLVID_SetPalette(palette);
|
|
||||||
GLVID_ShiftPalette(palette);
|
|
||||||
|
|
||||||
Con_SafePrintf ("Video mode %dx%d initialized.\n", info->width, info->height);
|
Con_SafePrintf ("Video mode %dx%d initialized.\n", info->width, info->height);
|
||||||
|
|
||||||
vid.recalc_refdef = 1; // force a surface cache flush
|
vid.recalc_refdef = 1; // force a surface cache flush
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue