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

Es2 #26

Open
wants to merge 9 commits into
base: es2
Choose a base branch
from
16 changes: 14 additions & 2 deletions neo/SConstruct
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ conf_filename='site.conf'
serialized=['CC', 'CXX', 'JOBS', 'BUILD', 'IDNET_HOST', 'DEDICATED',
'DEBUG_MEMORY', 'LIBC_MALLOC', 'ID_NOLANADDRESS', 'ID_MCHECK', 'ALSA',
'TARGET_CORE', 'TARGET_GAME', 'TARGET_D3XP', 'TARGET_MONO', 'TARGET_DEMO', 'NOCURL',
'BUILD_ROOT', 'BUILD_GAMEPAK', 'BASEFLAGS', 'SILENT', 'TARGET_OPENGL',
'BUILD_ROOT', 'BUILD_GAMEPAK', 'BASEFLAGS', 'SILENT', 'TARGET_OPENGL', 'TARGET_OPENGL_EGL',
'TARGET_ANDROID', 'NDK' ]

# global build mode ------------------------------
Expand Down Expand Up @@ -95,7 +95,13 @@ TARGET_DEMO (default 0)
TARGET_OPENGL (default 0)
Build an OpenGL renderer instead of OpenGL ES2.0.
GLSL shaders are compatible.
NOTE: This default Contexts to Enable OpenGL. For Linux, This is GLX.

TARGET_OPENGL_EGL (default 0)
Build an OpenGL renderer instead of OpenGL ES2.0.
GLSL shaders are compatible.
NOTE: This use EGL contexts to activate OpenGL.

TARGET_ANDROID (default 0)
Build the Android version.

Expand Down Expand Up @@ -176,6 +182,7 @@ TARGET_D3XP = '1'
TARGET_MONO = '0'
TARGET_DEMO = '0'
TARGET_OPENGL = '0'
TARGET_OPENGL_EGL = '0'
TARGET_ANDROID = '0'
NDK = ''
IDNET_HOST = ''
Expand Down Expand Up @@ -395,8 +402,9 @@ local_idlibpic = 0
local_d3xp = 0
# OpenGL
local_opengl = 0
local_opengl_egl = 0

GLOBALS = 'g_env g_env_noopt g_game_env g_os ID_MCHECK ALSA idlib_objects game_objects local_dedicated local_gamedll local_demo local_idlibpic local_curl local_d3xp local_opengl OPTCPPFLAGS NDK'
GLOBALS = 'g_env g_env_noopt g_game_env g_os ID_MCHECK ALSA idlib_objects game_objects local_dedicated local_gamedll local_demo local_idlibpic local_curl local_d3xp local_opengl local_opengl_egl OPTCPPFLAGS NDK'

# end general configuration ----------------------

Expand All @@ -415,6 +423,10 @@ if ( TARGET_OPENGL != '0' ):
local_opengl = 1
Export( 'GLOBALS ' + GLOBALS )

if ( TARGET_OPENGL_EGL != '0' ):
local_opengl_egl = local_opengl = 1
Export( 'GLOBALS ' + GLOBALS )

if ( TARGET_ANDROID != '0' ):
Export( 'GLOBALS ' + GLOBALS )

Expand Down
1 change: 1 addition & 0 deletions neo/renderer/RenderSystem_init.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@ idCVar r_znear("r_znear", "3", CVAR_RENDERER | CVAR_FLOAT, "near Z clip plane di

idCVar r_ignoreGLErrors("r_ignoreGLErrors", "1", CVAR_RENDERER | CVAR_BOOL, "ignore GL errors");
idCVar r_finish("r_finish", "0", CVAR_RENDERER | CVAR_BOOL, "force a call to glFinish() every frame");
idCVar r_swapInterval( "r_swapInterval", "0", CVAR_RENDERER | CVAR_ARCHIVE | CVAR_INTEGER, "changes Vertical Sync Setting" );

idCVar r_gamma("r_gamma", "1", CVAR_RENDERER | CVAR_ARCHIVE | CVAR_FLOAT, "changes gamma tables", 0.5f, 3.0f);
idCVar r_brightness("r_brightness", "1", CVAR_RENDERER | CVAR_ARCHIVE | CVAR_FLOAT, "changes gamma tables", 0.5f, 2.0f);
Expand Down
5 changes: 5 additions & 0 deletions neo/renderer/qgl.h
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,12 @@ If you have questions concerning this license or the applicable additional terms
#ifdef ID_TARGET_OPENGL
#include <GL/gl.h>
#include <GL/glext.h>
#ifdef ID_TARGET_OPENGL_GLX
#include <GL/glx.h>
#else
#include <EGL/egl.h>
#include <EGL/eglext.h>
#endif
#define GL_APIENTRY GLAPIENTRY
#else
#include <EGL/egl.h>
Expand Down
1 change: 1 addition & 0 deletions neo/renderer/tr_local.h
Original file line number Diff line number Diff line change
Expand Up @@ -832,6 +832,7 @@ extern idCVar r_znear; // near Z clip plane

extern idCVar r_finish; // force a call to glFinish() every frame
extern idCVar r_frontBuffer; // draw to front buffer for debugging
extern idCVar r_swapInterval; // changes Vertical Sync Swap Interval.
extern idCVar r_offsetFactor; // polygon offset parameter
extern idCVar r_offsetUnits; // polygon offset parameter
extern idCVar r_singleTriangle; // only draw a single triangle per primitive
Expand Down
2 changes: 1 addition & 1 deletion neo/sys/linux/gl_extensions.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ GLExtension_t GLimp_ExtensionPointer(const char *name)
#endif
GLExtension_t ret;

#ifdef ID_TARGET_OPENGL
#ifdef ID_TARGET_OPENGL_GLX
ret = glXGetProcAddressARB(name);
#else
ret = eglGetProcAddress(name);
Expand Down
92 changes: 87 additions & 5 deletions neo/sys/linux/gles2.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,12 @@ bool GLimp_SpawnRenderThread(void (*a)())

void GLimp_ActivateContext()
{
#if ID_TARGET_OPENGL
assert(eglDisplay);
assert(eglSurface);
assert(eglContext);
eglMakeCurrent(eglDisplay, eglSurface, eglSurface, eglContext);
#endif
#if 0
assert(dpy);
assert(ctx);
Expand All @@ -100,6 +106,10 @@ void GLimp_ActivateContext()

void GLimp_DeactivateContext()
{
#if ID_TARGET_OPENGL
assert(eglDisplay);
eglMakeCurrent(eglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
#endif
#if 0
assert(dpy);
glXMakeCurrent(dpy, None, NULL);
Expand Down Expand Up @@ -242,6 +252,15 @@ void GLimp_Shutdown()
void GLimp_SwapBuffers()
{
assert(eglDisplay && eglSurface);

#ifdef ID_TARGET_OPENGL
if (r_swapInterval.IsModified()) {
// Allow disabling of Vertical Sync.
r_swapInterval.ClearModified();
eglSwapInterval(eglDisplay, r_swapInterval.GetInteger());
}
#endif

eglSwapBuffers(eglDisplay, eglSurface);
}

Expand Down Expand Up @@ -336,13 +355,13 @@ bool GLimp_OpenDisplay(void)

/*
===============
GLX_Init
EGL_Init
===============
*/
EGLConfig eglConfig;
EGLint eglNumConfig;

int GLX_Init(glimpParms_t a)
int EGL_Init(glimpParms_t a)
{
EGLint attrib[] = {
EGL_RED_SIZE, 8, // 1, 2
Expand All @@ -352,7 +371,11 @@ int GLX_Init(glimpParms_t a)
EGL_DEPTH_SIZE, 24, // 9, 10
EGL_STENCIL_SIZE, 8, // 11, 12
EGL_BUFFER_SIZE, 24, // 13, 14
#ifdef ID_TARGET_OPENGL
EGL_RENDERABLE_TYPE, EGL_OPENGL_BIT, // 15, 16
#else
EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, // 15, 16
#endif
EGL_NONE, // 17
};
// these match in the array
Expand All @@ -363,6 +386,7 @@ int GLX_Init(glimpParms_t a)
#define ATTR_DEPTH_IDX 9
#define ATTR_STENCIL_IDX 11
#define ATTR_BUFFER_SIZE_IDX 13
#define ATTR_RENDERABLE_TYPE 15
Window root;
XVisualInfo *visinfo;
XSetWindowAttributes attr;
Expand All @@ -374,11 +398,25 @@ int GLX_Init(glimpParms_t a)
int i;
const char *glstring;

common->Printf("Initializing EGL\n");
if (!GLimp_OpenDisplay()) {
return false;
}

common->Printf("Initializing OpenGL display\n");
glstring = (const char *) eglQueryString(eglDisplay,EGL_VENDOR);
common->Printf("EGL_VENDOR: %s\n", (glstring)?glstring:"NULL");

glstring = (const char *) eglQueryString(eglDisplay,EGL_VERSION);
common->Printf("EGL_VERSION: %s\n", (glstring)?glstring:"NULL");

glstring = (const char *) eglQueryString(eglDisplay,EGL_CLIENT_APIS);
common->Printf("EGL_CLIENT_APIS: %s\n", (glstring)?glstring:"NULL");

glstring = (const char *) eglQueryString(eglDisplay,EGL_EXTENSIONS);
common->Printf("EGL_EXTENSIONS: %s\n", (glstring)?glstring:"NULL");

glstring = (attrib[ATTR_RENDERABLE_TYPE]==EGL_OPENGL_ES2_BIT)?"OpenGL ES": "OpenGL";
common->Printf("Initializing %s display\n",glstring);

root = RootWindow(dpy, scrnum);

Expand Down Expand Up @@ -448,10 +486,15 @@ int GLX_Init(glimpParms_t a)
#endif

// color, depth and stencil

colorbits = 24;
depthbits = 24;
stencilbits = 8;

#ifdef ID_TARGET_OPENGL
colorbits = 32;
#endif

for (i = 0; i < 16; i++) {
// 0 - default
// 1 - minus colorbits
Expand Down Expand Up @@ -546,7 +589,7 @@ int GLX_Init(glimpParms_t a)
}

visinfo = malloc(sizeof(XVisualInfo));
if (!(XMatchVisualInfo(dpy, scrnum, glConfig.depthBits, TrueColor, visinfo))) {
if (!(XMatchVisualInfo(dpy, scrnum, glConfig.depthBits, TrueColor, (XVisualInfo*)visinfo))) {
common->Printf("Couldn't get a visual\n");
return false;
}
Expand Down Expand Up @@ -618,10 +661,23 @@ int GLX_Init(glimpParms_t a)
}

EGLint ctxattrib[] = {
#ifndef ID_TARGET_OPENGL
EGL_CONTEXT_CLIENT_VERSION, 2,
#endif
EGL_NONE
};


#ifdef ID_TARGET_OPENGL
// Not all EGL Implementations will bind the current API to OpenGL
// automatically. Simply calling eglChooseConfig with EGL_RENDERABLE_TYPE
// set to EGL_OPENGL_BIT.
if(!eglBindAPI(EGL_OPENGL_API))
{
common->Printf("Couldn't Bind OpenGL API\n");
return false;
}
#endif
eglContext = eglCreateContext(eglDisplay, eglConfig, EGL_NO_CONTEXT, ctxattrib);
if (eglContext == EGL_NO_CONTEXT) {
common->Printf("Couldn't get a EGL context\n");
Expand All @@ -630,12 +686,38 @@ int GLX_Init(glimpParms_t a)

eglMakeCurrent(eglDisplay, eglSurface, eglSurface, eglContext);

EGLint Context_RendererType;

eglQueryContext(eglDisplay, eglContext,EGL_CONTEXT_CLIENT_TYPE,&Context_RendererType);

switch (Context_RendererType)
{
case EGL_OPENGL_API:
glstring = "OpenGL";
break;
case EGL_OPENGL_ES_API:
glstring = "OpenGL ES";
break;
case EGL_OPENVG_API:
common->Printf("Context Query Returned OpenVG. This is Unsupported\n");
return false;
default:
common->Printf("Unknown Context Type. %04X\n",Context_RendererType);
return false;
}
common->Printf("EGL_CONTEXT_CLIENT_TYPE: %s\n", glstring);
glstring = (const char *) glGetString(GL_RENDERER);
common->Printf("GL_RENDERER: %s\n", glstring);

glstring = (const char *) glGetString(GL_EXTENSIONS);
common->Printf("GL_EXTENSIONS: %s\n", glstring);


#ifdef ID_TARGET_OPENGL
// force Update of Vertical Sync setting on next frame
r_swapInterval.SetModified();
#endif

// FIXME: here, software GL test

glConfig.isFullscreen = a.fullScreen;
Expand Down Expand Up @@ -669,7 +751,7 @@ bool GLimp_Init(glimpParms_t a)
return false;
}

if (!GLX_Init(a)) {
if (!EGL_Init(a)) {
return false;
}

Expand Down
11 changes: 11 additions & 0 deletions neo/sys/linux/glimp.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -335,10 +335,21 @@ int GLX_Init(glimpParms_t a)
int i;
const char *glstring;

common->Printf("Initializing GLX\n");

if (!GLimp_OpenDisplay()) {
return false;
}

glstring = glXQueryExtensionsString( dpy, GLX_VENDOR);
common->Printf("GLX_VENDOR: %s\n", (glstring)?glstring:"NULL");

glstring = glXQueryExtensionsString( dpy, GLX_VERSION);
common->Printf("GLX_VERSION: %s\n", (glstring)?glstring:"NULL");

glstring = glXQueryExtensionsString( dpy, GLX_EXTENSIONS);
common->Printf("GLX_EXTENSIONS: %s\n", (glstring)?glstring:"NULL");

common->Printf("Initializing OpenGL display\n");

root = RootWindow(dpy, scrnum);
Expand Down
9 changes: 7 additions & 2 deletions neo/sys/scons/SConscript.core
Original file line number Diff line number Diff line change
Expand Up @@ -264,7 +264,7 @@ if ( local_dedicated == 0 ):
sys_string += ' android/input.cpp'
else:
sys_string += ' linux/input.cpp'
if ( local_opengl == 0 ):
if ( local_opengl == 0 or local_opengl_egl == 1):
if g_os == 'Android':
sys_string += ' android/gles2.cpp'
else:
Expand Down Expand Up @@ -311,7 +311,8 @@ else:

if ( local_opengl == 1 ):
local_env.Append( CPPDEFINES = [ 'ID_TARGET_OPENGL' ] )

if ( local_opengl_egl == 0 ):
local_env.Append( CPPDEFINES = [ 'ID_TARGET_OPENGL_GLX' ] )
sound_env = local_env.Clone()
if g_os == 'Android':
sound_list = [ '../android/sound.cpp' ]
Expand Down Expand Up @@ -358,6 +359,10 @@ if ( local_dedicated == 0 ):
local_env.Append( LIBS = [ 'GLESv2', 'EGL' ] )
else:
local_env.Append( LIBS = [ 'GL' ] )
if ( local_opengl_egl == 1 ):
local_env.Append( LIBS = [ 'EGL' ] )
else:
local_env.Append( LIBS = [ 'Xxf86vm' ] )

source_list = core_list
source_list += idlib_objects
Expand Down