ecere/gfx/OpenGL: Fixes for basic 2D and 3D support without VBOs
authorJerome St-Louis <jerome@ecere.com>
Sat, 16 Jan 2016 07:54:56 +0000 (02:54 -0500)
committerJerome St-Louis <jerome@ecere.com>
Sun, 3 Jul 2016 08:23:17 +0000 (04:23 -0400)
- Tested with OpenGL 1.1 (GDI software driver)

ecere/src/gfx/drivers/OpenGLDisplayDriver.ec
ecere/src/gfx/drivers/gl3/glab.ec
ecere/src/gfx/drivers/gl3/immediate.ec
ecere/src/gfx/drivers/gl3/shading.ec

index 36af8ca..3cf9cda 100644 (file)
@@ -522,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
@@ -844,6 +844,9 @@ class OpenGLDisplayDriver : DisplayDriver
 
       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)
@@ -2809,7 +2812,8 @@ class OpenGLDisplayDriver : DisplayDriver
          case vSync:
          {
 #if defined(__WIN32__)
-            wglSwapIntervalEXT(value ? 1 : 0);
+            if(wglSwapIntervalEXT)
+               wglSwapIntervalEXT(value ? 1 : 0);
 #endif
             break;
          }
@@ -3493,8 +3497,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));
index b37838f..ef28267 100644 (file)
@@ -32,29 +32,35 @@ import "Display"
 // Kept public for now
 public void GLABDeleteBuffers(int count, GLAB * buffers)
 {
-   int i;
-   for(i = 0; i < count; i++)
+   if(vboAvailable)
    {
-      uint buffer = buffers[i].buffer;
-      if(buffer)
+      int i;
+      for(i = 0; i < count; i++)
       {
-         if(buffer == glabCurArrayBuffer)
-            GLABBindBuffer(GL_ARRAY_BUFFER, 0);
-         else if(buffer == glabCurElementBuffer)
-            GLABBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
+         uint buffer = buffers[i].buffer;
+         if(buffer)
+         {
+            if(buffer == glabCurArrayBuffer)
+               GLABBindBuffer(GL_ARRAY_BUFFER, 0);
+            else if(buffer == glabCurElementBuffer)
+               GLABBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
+         }
       }
+      if(count && buffers[0].buffer)
+         glDeleteBuffers(count, (GLuint *)buffers);
    }
-   if(count && buffers[0].buffer)
-      glDeleteBuffers(count, (GLuint *)buffers);
 }
 
 void GLABBindBuffer(int target, uint buffer)
 {
-   glBindBuffer(target, buffer);
-   if(target == GL_ARRAY_BUFFER)
-      glabCurArrayBuffer = buffer;
-   else if(target == GL_ELEMENT_ARRAY_BUFFER)
-      glabCurElementBuffer = buffer;
+   if(vboAvailable)
+   {
+      glBindBuffer(target, buffer);
+      if(target == GL_ARRAY_BUFFER)
+         glabCurArrayBuffer = buffer;
+      else if(target == GL_ELEMENT_ARRAY_BUFFER)
+         glabCurElementBuffer = buffer;
+   }
 }
 
 public enum GLBufferContents { vertex, normal, texCoord, color };
@@ -71,11 +77,16 @@ public struct GLAB
    {
       if(this != null)
       {
-         if(!buffer)
-            glGenBuffers(1, &buffer);
-         if(glabCurArrayBuffer != buffer)
-            GLABBindBuffer(GL_ARRAY_BUFFER, buffer);
-         glBufferData(GL_ARRAY_BUFFER, size, data, GL_STATIC_DRAW);  //GL_DYNAMIC_DRAW);
+         if(vboAvailable)
+         {
+            if(!buffer)
+               glGenBuffers(1, &buffer);
+            if(glabCurArrayBuffer != buffer)
+               GLABBindBuffer(GL_ARRAY_BUFFER, buffer);
+            glBufferData(GL_ARRAY_BUFFER, size, data, GL_STATIC_DRAW);  //GL_DYNAMIC_DRAW);
+         }
+         else
+            buffer = 1;
       }
    }
 
@@ -83,14 +94,15 @@ public struct GLAB
    {
       if(this != null && buffer)
       {
-         GLABDeleteBuffers(1, this);
+         if(vboAvailable)
+            GLABDeleteBuffers(1, this);
          buffer = 0;
       }
    }
 
    void use(GLBufferContents contents, int n, int type, uint stride, void * pointer)
    {
-      if(glabCurArrayBuffer != ((this != null) ? buffer : 0))
+      if(glabCurArrayBuffer != ((this != null) ? buffer : 0) && vboAvailable)
          GLABBindBuffer(GL_ARRAY_BUFFER, ((this != null) ? buffer : 0));
 #ifdef SHADERS
       glVertexAttribPointer(contents, n, type, GL_FALSE, stride, pointer);
@@ -108,7 +120,7 @@ public struct GLAB
    void useVertTrans(uint count, int n, int type, uint stride, void * pointer)
    {
 #if defined(_GLES) || defined(ES1_1) || defined(ES2)
-      if(glabCurArrayBuffer != ((this != null) ? buffer : 0))
+      if(glabCurArrayBuffer != ((this != null) ? buffer : 0) && vboAvailable)
          GLABBindBuffer(GL_ARRAY_BUFFER, ((this != null) ? buffer : 0));
       if(type == GL_INT)
          glimtkVertexPointeri(n, stride, pointer, count);
@@ -138,15 +150,20 @@ public struct GLEAB
    {
       if(this != null)
       {
-         if(!buffer)
-            glGenBuffers(1, &buffer);
-
-         if(glabCurElementBuffer != buffer)
-            GLABBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffer);
-         if(size)
-            glBufferData(GL_ELEMENT_ARRAY_BUFFER, size, data, GL_STATIC_DRAW);  //GL_DYNAMIC_DRAW);
+         if(vboAvailable)
+         {
+            if(!buffer)
+               glGenBuffers(1, &buffer);
+
+            if(glabCurElementBuffer != buffer)
+               GLABBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffer);
+            if(size)
+               glBufferData(GL_ELEMENT_ARRAY_BUFFER, size, data, GL_STATIC_DRAW);  //GL_DYNAMIC_DRAW);
+            else
+               ;
+         }
          else
-            ;
+            buffer = 1;
       }
    }
 
@@ -154,18 +171,22 @@ public struct GLEAB
    {
       if(this != null && buffer)
       {
-         GLABDeleteBuffers(1, (GLAB *)this);
+         if(vboAvailable)
+            GLABDeleteBuffers(1, (GLAB *)this);
          buffer = 0;
       }
    }
 
    void draw(int primType, int count, int type, void * indices)
    {
-      if(glabCurElementBuffer != ((this != null) ? buffer : 0))
-         GLABBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ((this != null) ? buffer : 0));
+      if(vboAvailable || !buffer)
+      {
+         if(glabCurElementBuffer != ((this != null) ? buffer : 0))
+            GLABBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ((this != null) ? buffer : 0));
 #if defined(_GLES) || defined(ES1_1) || defined(ES2)
-      type = GL_UNSIGNED_SHORT;
+         type = GL_UNSIGNED_SHORT;
 #endif
-      glDrawElements(primType, count, type, indices);
+         glDrawElements(primType, count, type, indices);
+      }
    }
 };
index cfbd0cc..59be4f4 100644 (file)
@@ -164,33 +164,42 @@ public void glimtkEnd(void)
 
    glEnableClientState(GL_TEXTURE_COORD_ARRAY);
 
-   streamVecAB.upload(vertexStride * sizeof(float) * vertexCount, vertexPointer);
-
-   streamVecAB.use(texCoord, 2, GL_FLOAT, vertexStride * sizeof(float), 0);
-   // noAB.use(texCoord, 2, GL_FLOAT, vertexStride * sizeof(float), vertexPointer);
+   if(vboAvailable)
+   {
+      streamVecAB.upload(vertexStride * sizeof(float) * vertexCount, vertexPointer);
+      streamVecAB.use(texCoord, 2, GL_FLOAT, vertexStride * sizeof(float), 0);
+   }
+   else
+      noAB.use(texCoord, 2, GL_FLOAT, vertexStride * sizeof(float), vertexPointer);
 
    if(vertexColorValues)
    {
       glEnableClientState(GL_COLOR_ARRAY);
-      streamVecAB.use(color, 4, GL_FLOAT, vertexStride * sizeof(float), (void *)(2 * sizeof(float)));
+      if(vboAvailable)
+         streamVecAB.use(color, 4, GL_FLOAT, vertexStride * sizeof(float), (void *)(2 * sizeof(float)));
+      else
+         noAB.use(color, 4, GL_FLOAT, vertexStride * sizeof(float), vertexPointer + 2);
 
 #ifdef SHADERS
       shader_setPerVertexColor(true);
 #endif
-
-
-      //noAB.use(color, 4, GL_FLOAT, vertexStride * sizeof(float), vertexPointer + 2);
    }
 
-   streamVecAB.use(vertex, numVertexCoords, GL_FLOAT, vertexStride * sizeof(float), (void *)(vertexOffset * sizeof(float)));
-   // noAB.use(vertex, numVertexCoords, GL_FLOAT, vertexStride * sizeof(float), vertexPointer + vertexOffset);
+   if(vboAvailable)
+      streamVecAB.use(vertex, numVertexCoords, GL_FLOAT, vertexStride * sizeof(float), (void *)(vertexOffset * sizeof(float)));
+   else
+      noAB.use(vertex, numVertexCoords, GL_FLOAT, vertexStride * sizeof(float), vertexPointer + vertexOffset);
 
    if(normalCount && normalCount == vertexCount)
    {
       glEnableClientState(GL_NORMAL_ARRAY);
-      streamNorAB.upload(3*sizeof(float) * vertexCount, normalPointer);
-      streamNorAB.use(normal, 3, GL_FLOAT, 3*sizeof(float), 0);
-      // noAB.use(normal, 3, GL_FLOAT, 3*sizeof(float),normalPointer);
+      if(vboAvailable)
+      {
+         streamNorAB.upload(3*sizeof(float) * vertexCount, normalPointer);
+         streamNorAB.use(normal, 3, GL_FLOAT, 3*sizeof(float), 0);
+      }
+      else
+         noAB.use(normal, 3, GL_FLOAT, 3*sizeof(float),normalPointer);
    }
 
    glDrawArrays(mode, 0, vertexCount);
index 969d30e..688df00 100644 (file)
@@ -3,7 +3,7 @@ import "matrixStack"
 import "glab"
 
 #ifndef _GLES
-#define SHADERS
+ #define SHADERS
 #endif
 
 #if defined(SHADERS)