ecere/gfx/drivers/OpenGL: Fixed warnings
[sdk] / ecere / src / gfx / drivers / OpenGLDisplayDriver.ec
index 80a3f66..5baefff 100644 (file)
@@ -1,13 +1,13 @@
+// #define DIAGNOSTICS
+
 namespace gfx::drivers;
 
 #if defined(_GLES)
-#define ES1_1
+   #define ES1_1
 #else
- #define SHADERS
  #define SHADERS
 #endif
 
-#define GL_BGRA_EXT  0x80E1
-
 #if !defined(__ANDROID__) && !defined(__EMSCRIPTEN__) && !defined(__ODROID__)
 #  if defined(SHADERS)
 #     include "gl_core_3_3.h"
@@ -25,6 +25,8 @@ import "immediate"
 import "matrixStack"
 import "shading"
 
+#define GL_BGRA_EXT  0x80E1
+
 #ifdef SHADERS
 
 #undef glEnableClientState
@@ -47,11 +49,11 @@ import "shading"
 // #define USEPBUFFER
 #if defined(__unix__) || defined(__APPLE__)
 
-#if !defined(__MINGW32__)
-   #define GL_GLEXT_PROTOTYPES
-#endif
+   #if !defined(__MINGW32__)
+      #define GL_GLEXT_PROTOTYPES
+   #endif
 
-#define pointer _pointer
+   #define pointer _pointer
 
 
    #if !defined(__ANDROID__) && !defined(__ODROID__) && !defined(__EMSCRIPTEN__)
@@ -95,95 +97,91 @@ import "shading"
 #endif
 
 #if defined(__APPLE__)
-#include <OpenGl/gl.h>
+   #include <OpenGl/gl.h>
 #endif
 
 #if defined(__WIN32__) || defined(__unix__) || defined(__APPLE__)
 
-#if defined(__WIN32__)
-   //#define WIN32_LEAN_AND_MEAN
-   #undef _WIN32_WINNT
-   #define _WIN32_WINNT 0x0502
-   #define String Sting_
-   #include <windows.h>
-   #undef String
-#endif
+   #if defined(__WIN32__)
+      //#define WIN32_LEAN_AND_MEAN
+      #undef _WIN32_WINNT
+      #define _WIN32_WINNT 0x0502
+      #define String Sting_
+      #include <windows.h>
+      #undef String
+   #endif
 
-#if defined(__ANDROID__) || defined(__ODROID__)
+   #if defined(__ANDROID__) || defined(__ODROID__)
+      #if defined(__ODROID__) && !defined(ES1_1)
+         #define ES1_1
+      #endif
 
-#define uint _uint
-#define property _property
-#define new _new
-#define class _class
-#define Window    X11Window
-#define Cursor    X11Cursor
-#define Font      X11Font
-#define Display   X11Display
-#define Time      X11Time
-#define KeyCode   X11KeyCode
-#define Picture   X11Picture
-#define Bool      X11Bool
-
-   #include <GLES/gl.h>
-
-#undef Bool
-#undef Picture
-#undef Window
-#undef Cursor
-#undef Font
-#undef Display
-#undef Time
-#undef KeyCode
-#undef uint
-#undef new
-#undef property
-#undef class
+      #define uint _uint
+      #define property _property
+      #define new _new
+      #define class _class
+      #define Window    X11Window
+      #define Cursor    X11Cursor
+      #define Font      X11Font
+      #define Display   X11Display
+      #define Time      X11Time
+      #define KeyCode   X11KeyCode
+      #define Picture   X11Picture
+      #define Bool      X11Bool
 
-#elif defined(__EMSCRIPTEN__)
+      #include <GLES/gl.h>
 
-   #define property _property
-   #define uint _uint
+      #undef Bool
+      #undef Picture
+      #undef Window
+      #undef Cursor
+      #undef Font
+      #undef Display
+      #undef Time
+      #undef KeyCode
+      #undef uint
+      #undef new
+      #undef property
+      #undef class
 
-   #include <GL/gl.h>
+   #elif defined(__EMSCRIPTEN__)
+      #define ES2
+      // #define ES1_1
 
-   //#include <GLES/gl.h>
-   //#include <GLES2/gl.h>
-   #include <GL/glfw.h>
-   #include <emscripten/emscripten.h>
+      #define property _property
+      #define uint _uint
 
-   #undef property
-   #undef uint
+      //#include <GL/gl.h>
+      //#include <GLES/gl.h>
+      #include <GLES2/gl2.h>
 
-#else
-   #include <GL/gl.h>
-#endif
+      #include <emscripten/emscripten.h>
+      #include <emscripten/html5.h>
 
-#if defined(__ODROID__) && !defined(ES1_1)
-#define ES1_1
-#endif
+      #undef property
+      #undef uint
 
-#if defined(__EMSCRIPTEN__)
-#define EM_MODE
-// #define ES1_1
-#endif
+   #else
+      #include <GL/gl.h>
+   #endif
 
-#undef pointer
+   #undef pointer
 
-import "Display"
+   import "Display"
 
-#if defined(__unix__) || defined(__APPLE__)
+   #if defined(__unix__) || defined(__APPLE__)
 
    #if !defined(__ANDROID__) && !defined(__ODROID__) && !defined(__EMSCRIPTEN__)
    import "XInterface"
    #endif
 
-#endif
+   #endif
 
-#define glLoadMatrix glLoadMatrixd
-#define glMultMatrix glMultMatrixd
-#define glGetMatrix  glGetDoublev
-#define glTranslate glTranslated
-#define glScale glScaled
+   #define glLoadMatrix glLoadMatrixd
+   #define glMultMatrix glMultMatrixd
+   #define glGetMatrix  glGetDoublev
+   #define glTranslate glTranslated
+   #define glScale glScaled
 
 /*
 #define glVertex3v glVertex3dv
@@ -245,11 +243,23 @@ import "Display"
    static PFNWGLSWAPINTERVALEXTPROC wglSwapIntervalEXT = null;
    static PFNWGLCREATECONTEXTATTRIBSARBPROC wglCreateContextAttribsARB = null;
 
-#elif defined(__ANDROID__) || defined(__ODROID__)
+#else
 
+#if !defined(__ANDROID__) && !defined(__APPLE__) && !defined(__ODROID__) && !defined(__EMSCRIPTEN__)
+default:
+   GLAPI void APIENTRY glLockArraysEXT (GLint first, GLsizei count);
+   GLAPI void APIENTRY glUnlockArraysEXT (void);
+private:
+#endif
+
+#if defined(__ANDROID__) || defined(__ODROID__)
    #define GL_FRAMEBUFFER           GL_FRAMEBUFFER_OES
    #define GL_RENDERBUFFER          GL_RENDERBUFFER_OES
    #define GL_COLOR_ATTACHMENT0     GL_COLOR_ATTACHMENT0_OES
+   #define GL_BGRA_EXT           0
+#endif
+
+#if defined(__ANDROID__) || defined(__ODROID__) || defined(__EMSCRIPTEN__)
 
    #define GL_POLYGON_STIPPLE 0xFFFF
    #define GL_LINE_STIPPLE 0xFFFF
@@ -268,7 +278,6 @@ import "Display"
    //#define GL_FILL               0
    //#define GL_LINE               0
    //#define GL_LINE_STIPPLE       0
-   #define GL_BGRA_EXT           0
    #define GL_UNPACK_ROW_LENGTH  0
    #define GL_UNPACK_SKIP_PIXELS 0
    #define GL_UNPACK_SKIP_ROWS   0
@@ -276,6 +285,7 @@ import "Display"
    #define GL_PACK_ROW_LENGTH    0
    #define GL_PACK_SKIP_ROWS     0
    #define GL_PACK_SKIP_PIXELS   0
+#endif
 
 #endif
 
@@ -288,14 +298,16 @@ import "Display"
    #define glGenRenderbuffers       glGenRenderbuffersOES
    #define glDeleteFramebuffers     glDeleteFramebuffersOES
    #define glDeleteRenderbuffers    glDeleteRenderbuffersOES
+#endif
 
+#if defined(__ANDROID__) || defined(__ODROID__) || defined(__EMSCRIPTEN__)
    #define GL_INT                                  0x1404
    #define GL_UNSIGNED_INT                         0x1405
    #define GL_DOUBLE                               0x140A
    #define APIENTRY
 #endif
 
-#if defined(ES1_1) || defined(SHADERS)
+#if defined(ES1_1) || defined(ES2) || defined(SHADERS)
 
    #undef glRecti
    #undef glBegin
@@ -379,7 +391,7 @@ public void glesColorMaterial(int a, int b)
 }
 
 static GLuint stippleTexture;
-#if defined(ES1_1) || defined(SHADERS) || defined(EM_MODE)
+#if defined(ES1_1) || defined(ES2) || defined(SHADERS)
 static bool stippleEnabled;
 #endif
 
@@ -413,14 +425,17 @@ public void glesLineStipple( int i, unsigned short j )
 
 public void glesLightModeli( unsigned int pname, int param )
 {
-#if !defined(EM_MODE) && !defined(SHADERS)
+#if !defined(SHADERS)
    if(pname == GL_LIGHT_MODEL_TWO_SIDE)
       glLightModelf(GL_LIGHT_MODEL_TWO_SIDE, param);
 #endif
 }
 
-#if defined(__ANDROID__) || defined(__ODROID__)
+#if defined(__ANDROID__) || defined(__ODROID__) || defined(__EMSCRIPTEN__)
 void glClearDepth( double depth ) { glClearDepthf((float)depth); }
+#endif
+
+#if defined(__ANDROID__) || defined(__ODROID__)
 void glFogi( unsigned int pname, int param ) { }
 void glPolygonMode( unsigned int i, unsigned int j ) { }
 
@@ -446,7 +461,14 @@ void glDrawPixels(int a, int b, int c, int d, void * e) { }
 #if !defined(ECERE_NO3D) && !defined(ECERE_VANILLA)
 static int primitiveTypes[RenderPrimitiveType] =
 {
-   GL_POINTS, GL_LINES, GL_TRIANGLES, GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN, GLIMTKMode::quads, GLIMTKMode::quadStrip, GL_LINE_STRIP
+   GL_POINTS, GL_LINES, GL_TRIANGLES, GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN,
+#if defined(SHADERS) || defined(ES1_1) || defined(ES2)
+   GL_TRIANGLE_FAN,     // NOTE: This will only work for single quads
+#else
+   GLIMTKMode::quads,
+#endif
+   GLIMTKMode::quadStrip,
+   GL_LINE_STRIP
 };
 #endif
 
@@ -459,18 +481,27 @@ public void GLSetupTexturing(bool enable)
 #endif
 }
 
+public void GLSetupFog(bool enable)
+{
+#ifdef SHADERS
+   shader_fog(enable);
+#else
+   (enable ? glEnable : glDisable)(GL_FOG);
+#endif
+}
+
 public void GLSetupLighting(bool enable)
 {
 #if defined(SHADERS)
    shader_lighting(enable);
-#elif !defined(EM_MODE)
+#else
    (enable ? glEnable : glDisable)(GL_LIGHTING);
 #endif
 }
 
 // Non OpenGL ES friendly stuff
 
-#if defined(ES1_1)
+#if defined(ES1_1) || defined(ES2)
 
 //#undef GL_UNSIGNED_INT
 //#undef GL_DOUBLE
@@ -491,7 +522,7 @@ static int displayWidth, displayHeight;
 
 #define GL_CLAMP_TO_EDGE 0x812F
 
-static bool vboAvailable;
+/*static */bool vboAvailable;
 
 static bool useSingleGLContext = false;
 class OGLDisplay : struct
@@ -532,7 +563,11 @@ class OGLDisplay : struct
    int x, y;
 };
 
-#ifdef _DEBUG
+#if defined(_DEBUG) && !defined(__ANDROID__) && !defined(__EMSCRIPTEN__) && !defined(__ODROID__)
+//#define GL_DEBUGGING
+#endif
+
+#ifdef GL_DEBUGGING
 static void APIENTRY openglCallbackFunction(GLenum source,
                                            GLenum type,
                                            GLuint id,
@@ -577,7 +612,9 @@ class OGLSystem : struct
    HDC hdc;
    HGLRC glrc;
    HWND hwnd;
-#elif !defined(__ANDROID__) && !defined(__ODROID__) && !defined(__EMSCRIPTEN__)
+#elif defined(__EMSCRIPTEN__)
+   EMSCRIPTEN_WEBGL_CONTEXT_HANDLE glc;
+#elif !defined(__ANDROID__) && !defined(__ODROID__)
    XVisualInfo * visualInfo;
    GLXContext glContext;
    GLXDrawable glxDrawable;
@@ -614,14 +651,15 @@ class OGLIndices : struct
 int current;
 void * previous;
 
+#ifdef GL_DEBUGGING
 static void setupDebugging()
 {
-#ifdef _DEBUG
    if(glDebugMessageCallback)
    {
       GLuint unusedIds = 0;
 
       glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS);
+
       glDebugMessageCallback(openglCallbackFunction, null);
       glDebugMessageControl(GL_DONT_CARE,
           GL_DONT_CARE,
@@ -630,12 +668,14 @@ static void setupDebugging()
           &unusedIds,
           GL_TRUE);
    }
-#endif
 }
+#endif
 
 #if defined(__WIN32__)
 static HGLRC winCreateContext(HDC hdc)
 {
+   HGLRC result = 0;
+#ifdef SHADERS
    if(wglCreateContextAttribsARB)
    {
       int attribs[] =
@@ -646,10 +686,19 @@ static HGLRC winCreateContext(HDC hdc)
          WGL_CONTEXT_PROFILE_MASK_ARB, WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB /*WGL_CONTEXT_CORE_PROFILE_BIT_ARB*/,
          0,0
       };
-      return wglCreateContextAttribsARB(hdc, null, attribs);
+      result = wglCreateContextAttribsARB(hdc, null, attribs);
+      if(!result)
+      {
+         attribs[1] = 2;
+         attribs[3] = 0;
+         attribs[7] = 0;
+         result = wglCreateContextAttribsARB(hdc, null, attribs);
+      }
    }
-   else
-      return wglCreateContext(hdc);
+#endif
+   if(!result)
+      result = wglCreateContext(hdc);
+   return result;
 }
 #endif
 
@@ -659,7 +708,10 @@ class OpenGLDisplayDriver : DisplayDriver
 
    bool LockSystem(DisplaySystem displaySystem)
    {
-#if !defined(__ANDROID__) && !defined(__ODROID__) && !defined(__EMSCRIPTEN__)
+#if defined(__EMSCRIPTEN__)
+      OGLSystem oglSystem = displaySystem.driverData;
+      emscripten_webgl_make_context_current(oglSystem.glc);
+#elif !defined(__ANDROID__) && !defined(__ODROID__)
       OGLSystem oglSystem = displaySystem.driverData;
       if(useSingleGLContext) return true;
    #if defined(__WIN32__)
@@ -787,9 +839,15 @@ class OpenGLDisplayDriver : DisplayDriver
    void ::CheckExtensions(OGLSystem oglSystem)
    {
       const char * extensions = (const char *)glGetString(GL_EXTENSIONS);
-      if(extensions)
-         oglSystem.pow2textures = strstr(extensions, "GL_ARB_texture_non_power_of_two") ? false : true;
+#ifdef DIAGNOSTICS
+      printf("extensions: %s\n", extensions);
+#endif
+
+      oglSystem.pow2textures = (extensions && strstr(extensions, "GL_ARB_texture_non_power_of_two")) ? false : true;
       glGetIntegerv(GL_MAX_TEXTURE_SIZE, &oglSystem.maxTextureSize);
+#ifdef DIAGNOSTICS
+      PrintLn("max texture size: ", oglSystem.maxTextureSize);
+#endif
    }
 
    bool CreateDisplaySystem(DisplaySystem displaySystem)
@@ -797,6 +855,10 @@ class OpenGLDisplayDriver : DisplayDriver
       bool result = false;
       OGLSystem oglSystem = displaySystem.driverData = OGLSystem { };
 
+#ifdef DIAGNOSTICS
+      PrintLn("OpenGL driver's CreateDisplaySystem()");
+#endif
+
    #ifdef __WIN32__
       oglSystem.hwnd = CreateWindow("static", null, 0,0,0,0,0,null,null,null,null);
 
@@ -889,7 +951,13 @@ class OpenGLDisplayDriver : DisplayDriver
                      SetPixelFormat(oglSystem.hdc, oglSystem.format, &oglSystem.pfd);
                      //Log("Successfully set pixel format\n");
 
+#ifdef DIAGNOSTICS
+                     PrintLn("winCreateContext()");
+#endif
                      oglSystem.glrc = winCreateContext(oglSystem.hdc);
+#ifdef DIAGNOSTICS
+                     PrintLn("wglMakeCurrent()");
+#endif
                      wglMakeCurrent(oglSystem.hdc, oglSystem.glrc);
                   }
                }
@@ -955,19 +1023,35 @@ class OpenGLDisplayDriver : DisplayDriver
 
          result = true;
       #elif defined(__EMSCRIPTEN__)
-         if(glfwInit() == GL_TRUE)
          {
-            const int width = 640, height = 480;
-            if(glfwOpenWindow(width, height, 8, 8, 8, 8, 16, 0, GLFW_WINDOW) == GL_TRUE)
-            {
-               //glfwSwapBuffers();
+            EmscriptenWebGLContextAttributes attribs = { 0 };
+            attribs.depth = 1;
+            attribs.antialias = 1;
+
+            /*
+              EM_BOOL alpha;
+              EM_BOOL depth;
+              EM_BOOL stencil;
+              EM_BOOL antialias;
+              EM_BOOL premultipliedAlpha;
+              EM_BOOL preserveDrawingBuffer;
+              EM_BOOL preferLowPowerToHighPerformance;
+              EM_BOOL failIfMajorPerformanceCaveat;
+              int majorVersion;
+              int minorVersion;
+              EM_BOOL enableExtensionsByDefault;
+              */
+
+            emscripten_webgl_init_context_attributes(&attribs);
+            oglSystem.pow2textures = true;
+            oglSystem.maxTextureSize = 16384;
+            oglSystem.glc = emscripten_webgl_create_context("canvas", &attribs);
+            if(emscripten_webgl_make_context_current(oglSystem.glc) == EMSCRIPTEN_RESULT_SUCCESS)
                result = true;
-            }
-            else
-               printf("glfwOpenWindow() failed\n"); //glfwTerminate();
+
+            /*glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+            glEnable(GL_BLEND);*/
          }
-         else
-            printf("glfwInit() failed\n"); //glfwTerminate();
       #else
       {
          X11Window root = RootWindow( xGlobalDisplay, DefaultScreen( xGlobalDisplay ) );
@@ -1024,6 +1108,8 @@ class OpenGLDisplayDriver : DisplayDriver
          stippleTexture = 0;
       }
 
+      glimtkTerminate();
+
    #if defined(__WIN32__)
       wglMakeCurrent( null, null );
 
@@ -1038,7 +1124,7 @@ class OpenGLDisplayDriver : DisplayDriver
       #if defined(__ANDROID__) || defined(__ODROID__)
          egl_term_display();
       #elif defined(__EMSCRIPTEN__)
-         glfwTerminate();
+         emscripten_webgl_destroy_context(oglSystem.glc);
       #else
       if(oglSystem.visualInfo)
       {
@@ -1111,7 +1197,7 @@ class OpenGLDisplayDriver : DisplayDriver
    {
       bool result = false;
       OGLDisplay oglDisplay = display.driverData;
-#if !defined(__ANDROID__) && !defined(__ODROID__) && !defined(__EMSCRIPTEN__)
+#if !defined(__ANDROID__) && !defined(__ODROID__)
       OGLSystem oglSystem = display.displaySystem.driverData;
 #endif
 
@@ -1123,7 +1209,7 @@ class OpenGLDisplayDriver : DisplayDriver
       if(!display.alphaBlend)
 #endif
       {
-   #if defined(__WIN32__)
+#if defined(__WIN32__)
          oglDisplay.hdc = GetDC(display.window);
          SetPixelFormat(oglDisplay.hdc, oglSystem.format, &oglSystem.pfd);
          if((oglDisplay.glrc = winCreateContext(oglDisplay.hdc)))
@@ -1134,9 +1220,10 @@ class OpenGLDisplayDriver : DisplayDriver
          }
          else
             ReleaseDC(display.window, oglDisplay.hdc);
-   #elif defined(__unix__) || defined(__APPLE__)
-      #if defined(__ANDROID__) || defined(__ODROID__) || defined(__EMSCRIPTEN__)
-      #else
+#elif defined(__unix__) || defined(__APPLE__)
+#  if defined(__ANDROID__) || defined(__EMSCRIPTEN__) || defined(__ODROID__)
+         result = true;
+#  else
          XVisualInfo * visualInfo = ((XWindowData)display.windowDriverData).visual;
          /*
 #if defined(__APPLE__)
@@ -1170,8 +1257,8 @@ class OpenGLDisplayDriver : DisplayDriver
             glXMakeCurrent(xGlobalDisplay, (GLXDrawable)display.window, oglDisplay.glContext);
             result = true;
          }
-      #endif
-   #endif
+#  endif
+#endif
       }
 #if defined(__WIN32__) || defined(USEPBUFFER)
       else
@@ -1183,11 +1270,33 @@ class OpenGLDisplayDriver : DisplayDriver
       if(result)
       {
 #if !defined(__ANDROID__) && !defined(__EMSCRIPTEN__) && !defined(__ODROID__)
-         ogl_LoadFunctions();
+
+#ifdef DIAGNOSTICS
+         PrintLn("Calling ogl_LoadFunctions() in CreateDisplay()");
+#endif
+         if(ogl_LoadFunctions() == ogl_LOAD_FAILED)
+            PrintLn("ogl_LoadFunctions() failed!");
+
+#ifdef DIAGNOSTICS
+         PrintLn("CheckExtensions()");
 #endif
          CheckExtensions(oglSystem);
          vboAvailable = glBindBuffer != null;
+
+#ifdef DIAGNOSTICS
+         PrintLn("vboAvailable is: ", vboAvailable);
+#endif
+
+#  ifdef GL_DEBUGGING
          setupDebugging();
+#  endif
+
+#endif
+
+#if defined(__EMSCRIPTEN__)
+         emscripten_webgl_make_context_current(oglSystem.glc);
+#endif
+
          initialDisplaySetup(display);
       }
 
@@ -1543,9 +1652,11 @@ class OpenGLDisplayDriver : DisplayDriver
 #if defined(__WIN32__)
          wglMakeCurrent(oglDisplay.hdc, oglDisplay.glrc);
 #elif defined(__unix__) || defined(__APPLE__)
-      #if defined(__ANDROID__) || defined(__ODROID__) || defined(__EMSCRIPTEN__)
+      #if defined(__ANDROID__) || defined(__ODROID__)
          width = eglWidth;
          height = eglHeight;
+      #elif defined(__EMSCRIPTEN__)
+         emscripten_webgl_make_context_current(oglSystem.glc);
       #else
          glXMakeCurrent(xGlobalDisplay, (GLXDrawable)display.window, oglDisplay.glContext);
       #endif
@@ -1578,7 +1689,7 @@ class OpenGLDisplayDriver : DisplayDriver
       {
          oglDisplay.flipBufW = width;
          oglDisplay.flipBufH = height;
-#ifdef ES1_1
+#if defined(ES1_1) || defined(ES2)
          result = true;
 #else
          oglDisplay.flippingBuffer = renew oglDisplay.flippingBuffer ColorAlpha [width * height];
@@ -1718,11 +1829,11 @@ class OpenGLDisplayDriver : DisplayDriver
 #if defined(__WIN32__)
          //wglSwapLayerBuffers(oglDisplay.hdc,WGL_SWAP_MAIN_PLANE);
          SwapBuffers(oglDisplay.hdc);
+         //ecere::sys::Sleep(0.1);
 #elif defined(__unix__) || defined(__APPLE__)
       #if defined(__ANDROID__) || defined(__ODROID__)
          egl_swap_buffers();
       #elif defined(__EMSCRIPTEN__)
-         glfwSwapBuffers();
       #else
          glXSwapBuffers(xGlobalDisplay, (GLXDrawable)display.window);
       #endif
@@ -2117,7 +2228,7 @@ class OpenGLDisplayDriver : DisplayDriver
 
       glColor4fv(oglSurface.foreground);
       glBegin(GL_LINES);
-#if defined(ES1_1) || defined(EM_MODE) || defined(SHADERS)
+#if defined(ES1_1) || defined(ES2) || defined(SHADERS)
       if(stippleEnabled)
       {
          glTexCoord2f(0.5f, 0);
@@ -2150,7 +2261,7 @@ class OpenGLDisplayDriver : DisplayDriver
       //Logf("Rectangle\n");
 
       glColor4fv(oglSurface.foreground);
-#if defined(ES1_1) || defined(EM_MODE) || defined(SHADERS)
+#if defined(ES1_1) || defined(ES2) || defined(SHADERS)
       if(stippleEnabled)
       {
          glBegin(GL_LINES);
@@ -2200,17 +2311,8 @@ class OpenGLDisplayDriver : DisplayDriver
 
       glColor4fv(oglSurface.background);
 
-#ifdef EM_MODE
-      glBegin(GL_QUADS);
-      glVertex2f(x1+surface.offset.x, y1+surface.offset.y);
-      glVertex2f(x1+surface.offset.x, y2+surface.offset.y+1);
-      glVertex2f(x2+surface.offset.x+1, y2+surface.offset.y+1);
-      glVertex2f(x2+surface.offset.x+1, y1+surface.offset.y);
-      glEnd();
-#else
       glRecti(x1+surface.offset.x, y1+surface.offset.y,
               x2+surface.offset.x + 1, y2+surface.offset.y + 1);
-#endif
       /*
       glRectf(x1+surface.offset.x, y1+surface.offset.y,
               x2+surface.offset.x + 1, y2+surface.offset.y + 1);
@@ -2359,7 +2461,6 @@ class OpenGLDisplayDriver : DisplayDriver
 
    void StretchDI(Display display, Surface surface, Bitmap bitmap, int dx, int dy, int sx, int sy, int w, int h, int sw, int sh)
    {
-#if !defined(EM_MODE)
       float s2dw,s2dh,d2sw,d2sh;
       //bool flipX = false, flipY = false;
 
@@ -2458,12 +2559,10 @@ class OpenGLDisplayDriver : DisplayDriver
          glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0);
          glPixelStorei(GL_UNPACK_SKIP_ROWS, 0);
       }
-#endif
    }
 
    void BlitDI(Display display, Surface surface, Bitmap bitmap, int dx, int dy, int sx, int sy, int w, int h)
    {
-#if !defined(EM_MODE)
       //Logf("BlitDI\n");
 
       //Clip against the edges of the source
@@ -2526,7 +2625,6 @@ class OpenGLDisplayDriver : DisplayDriver
          glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0);
          glPixelStorei(GL_UNPACK_SKIP_ROWS, 0);
       }
-#endif
    }
 
    void FilterDI(Display display, Surface surface, Bitmap bitmap, int dx, int dy, int sx, int sy, int w, int h, int sw, int sh)
@@ -2625,7 +2723,7 @@ class OpenGLDisplayDriver : DisplayDriver
 
       if(stipple)
       {
-#if defined(ES1_1) || defined(EM_MODE) || defined(SHADERS)
+#if defined(ES1_1) || defined(ES2) || defined(SHADERS)
          stippleEnabled = true;
          glesLineStipple(1, (uint16)stipple);
 #else
@@ -2635,7 +2733,7 @@ class OpenGLDisplayDriver : DisplayDriver
       }
       else
       {
-#if defined(ES1_1) || defined(EM_MODE) || defined(SHADERS)
+#if defined(ES1_1) || defined(ES2) || defined(SHADERS)
          stippleEnabled = false;
          glMatrixMode(GL_TEXTURE);
          glLoadIdentity();
@@ -2646,6 +2744,7 @@ class OpenGLDisplayDriver : DisplayDriver
 #endif
       }
    }
+
 #if !defined(ECERE_NO3D) && !defined(ECERE_VANILLA)
    void SetRenderState(Display display, RenderState state, uint value)
    {
@@ -2655,13 +2754,15 @@ class OpenGLDisplayDriver : DisplayDriver
       switch(state)
       {
          case antiAlias:
+#ifndef __EMSCRIPTEN__
             if(value)
                glEnable(GL_MULTISAMPLE_ARB);
             else
                glDisable(GL_MULTISAMPLE_ARB);
+#endif
             break;
          case fillMode:
-#if !defined(ES1_1)
+#if !defined(ES1_1) && !defined(ES2)
             glPolygonMode(GL_FRONT_AND_BACK, ((FillModeValue)value == solid) ? GL_FILL : GL_LINE);
 #endif
             break;
@@ -2674,25 +2775,31 @@ class OpenGLDisplayDriver : DisplayDriver
             break;
          case fogColor:
          {
-#if !defined(SHADERS)
             float color[4] = { ((Color)value).r/255.0f, ((Color)value).g/255.0f, ((Color)value).b/255.0f, 1.0f };
+#if defined(SHADERS)
+            shader_fogColor(color[0], color[1], color[2]);
+#else
             glFogfv(GL_FOG_COLOR, (float *)&color);
 #endif
             break;
          }
          case fogDensity:
-#if !defined(SHADERS)
+#if defined(SHADERS)
+            shader_fogDensity((float)(RenderStateFloat { ui = value }.f * nearPlane));
+#else
             glFogf(GL_FOG_DENSITY, (float)(RenderStateFloat { ui = value }.f * nearPlane));
 #endif
             break;
          case blend:
+//#if !defined(__EMSCRIPTEN__)
             if(value) glEnable(GL_BLEND); else glDisable(GL_BLEND);
+//#endif
             break;
          case ambient:
          {
 #if defined(SHADERS)
             shader_setGlobalAmbient(((Color)value).r / 255.0f, ((Color)value).g / 255.0f, ((Color)value).b / 255.0f, 1.0f);
-#elif !defined(EM_MODE)
+#else
             float ambient[4] = { ((Color)value).r/255.0f, ((Color)value).g/255.0f, ((Color)value).b/255.0f, 1.0f };
             glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambient);
 #endif
@@ -2706,7 +2813,8 @@ class OpenGLDisplayDriver : DisplayDriver
          case vSync:
          {
 #if defined(__WIN32__)
-            wglSwapIntervalEXT(value ? 1 : 0);
+            if(wglSwapIntervalEXT)
+               wglSwapIntervalEXT(value ? 1 : 0);
 #endif
             break;
          }
@@ -2717,7 +2825,7 @@ class OpenGLDisplayDriver : DisplayDriver
    {
 #if defined(SHADERS)
       shader_setLight(display, id, light);
-#elif !defined(EM_MODE)
+#else
       //Logf("SetLight\n");
 
       if(light != null)
@@ -2942,30 +3050,41 @@ class OpenGLDisplayDriver : DisplayDriver
          glEnable(GL_DEPTH_TEST);
 
          GLSetupLighting(true);
-#if !defined(EM_MODE) && !defined(SHADERS)
+#if !defined(SHADERS)
          glShadeModel(GL_SMOOTH);
 #endif
          glDepthMask((byte)bool::true);
          oglDisplay.depthWrite = true;
 
+#ifndef __EMSCRIPTEN__
          glEnable(GL_MULTISAMPLE_ARB);
+#endif
       }
       else if(surface && display.display3D.camera)
       {
+         nearPlane = 1;
          oglDisplay.depthWrite = false;
          glViewport(0,0,display.width,display.height);
 
          glDisable(GL_CULL_FACE);
          glDisable(GL_DEPTH_TEST);
 
+
          GLSetupTexturing(false);
          GLSetupLighting(false);
-#if !defined(SHADERS) && !defined(EM_MODE)
-         glDisable(GL_FOG);
+         GLSetupFog(false);
+
+         glDisableClientState(GL_COLOR_ARRAY);
+
+#if defined(SHADERS)
+         shader_setPerVertexColor(false);
+#else
          glShadeModel(GL_FLAT);
 #endif
          glEnable(GL_BLEND);
+#if !defined(__EMSCRIPTEN__)
          glDisable(GL_MULTISAMPLE_ARB);
+#endif
 
          // *** Restore 2D MODELVIEW Matrix ***
          glPopMatrix();
@@ -2984,26 +3103,21 @@ class OpenGLDisplayDriver : DisplayDriver
       // Basic Properties
       if(material.flags.doubleSided)
       {
-#if !defined(EM_MODE) && !defined(SHADERS)
+#if !defined(SHADERS)
          glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, !material.flags.singleSideLight);
 #endif
          glDisable(GL_CULL_FACE);
       }
       else
       {
-#if !defined(EM_MODE) && !defined(SHADERS)
+#if !defined(SHADERS)
          glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, bool::false);
 #endif
          glEnable(GL_CULL_FACE);
       }
 
-#if !defined(SHADERS)
       // Fog
-      if(material.flags.noFog)
-         glDisable(GL_FOG);
-      else
-         glEnable(GL_FOG);
-#endif
+      GLSetupFog(!material.flags.noFog);
 
       // Maps
       if(material.baseMap && (mesh.texCoords || mesh.flags.texCoords1))
@@ -3034,8 +3148,6 @@ class OpenGLDisplayDriver : DisplayDriver
 
 #if defined(SHADERS)
       shader_setMaterial(material, mesh.flags.colors);
-#elif defined(EM_MODE)
-      glimtkColor4f(material.diffuse.r, material.diffuse.g, material.diffuse.b, material.opacity);
 #else
       if(mesh.flags.colors)
       {
@@ -3239,7 +3351,7 @@ class OpenGLDisplayDriver : DisplayDriver
    {
       if(vboAvailable)
       {
-#ifdef ES1_1
+#if defined(ES1_1) || defined(ES2)
          if(indices32bit)
          {
             if(!oglIndices.buffer.buffer)
@@ -3386,8 +3498,20 @@ class OpenGLDisplayDriver : DisplayDriver
 
          {
             OGLIndices oglIndices = primitive->data;
-            GLEAB eab = ((!display.display3D.collectingHits && oglIndices) ? oglIndices.buffer : noEAB);
-
+            GLEAB eab = ((!display.display3D.collectingHits && oglIndices && vboAvailable) ? oglIndices.buffer : noEAB);
+#if defined(ES1_1) || defined(ES2)
+            if(!vboAvailable && primitive->type.indices32bit)
+            {
+               uint16 * temp = new uint16[primitive->nIndices];
+               uint32 * src = (uint32 *)(oglIndices ? oglIndices.indices : primitive->indices);
+               int i;
+               for(i = 0; i < primitive->nIndices; i++)
+                  temp[i] = (uint16)src[i];
+               eab.draw(primitiveTypes[primitive->type.primitiveType], primitive->nIndices, GL_UNSIGNED_SHORT, temp);
+               delete temp;
+            }
+            else
+#endif
             eab.draw(primitiveTypes[primitive->type.primitiveType], primitive->nIndices,
                primitive->type.indices32bit ? GL_UNSIGNED_INT : GL_UNSIGNED_SHORT,
                eab.buffer ? 0 : (oglIndices ? oglIndices.indices : primitive->indices));
@@ -3457,6 +3581,8 @@ IS_GLGetContext(DisplaySystem displaySystem)
 #elif defined(__ANDROID__) || defined(__ODROID__)
       return eglContext;
 #elif defined(__EMSCRIPTEN__)
+      OGLSystem system = displaySystem.driverData;
+      return (void *)system.glc;
 #else
       OGLSystem system = displaySystem.driverData;
       return system.glContext;