Title: [163858] trunk/Source/WebCore
Revision
163858
Author
changseok...@collabora.com
Date
2014-02-10 21:24:44 -0800 (Mon, 10 Feb 2014)

Log Message

Support ANGLE_instanced_arrays for linux
https://bugs.webkit.org/show_bug.cgi?id=127465

Reviewed by Martin Robinson.

Support the instanced drawing WebGL extension, ANGLE_instanced_arrays for linux platform.
This is a following patch for r162565. Relevant opengl APIs are exposed
for WebGLRenderingContext to access them.

Covered by fast/canvas/webgl/angle-instanced-arrays.html

* html/canvas/ANGLEInstancedArrays.cpp:
(WebCore::ANGLEInstancedArrays::supported):
* platform/graphics/OpenGLShims.cpp:
(WebCore::initializeOpenGLShims):
* platform/graphics/OpenGLShims.h:
* platform/graphics/opengl/Extensions3DOpenGL.cpp:
(WebCore::Extensions3DOpenGL::supportsExtension):
* platform/graphics/opengl/GraphicsContext3DOpenGL.cpp:
(WebCore::GraphicsContext3D::drawArraysInstanced):
(WebCore::GraphicsContext3D::drawElementsInstanced):
(WebCore::GraphicsContext3D::vertexAttribDivisor):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (163857 => 163858)


--- trunk/Source/WebCore/ChangeLog	2014-02-11 05:17:15 UTC (rev 163857)
+++ trunk/Source/WebCore/ChangeLog	2014-02-11 05:24:44 UTC (rev 163858)
@@ -1,3 +1,28 @@
+2014-02-10  ChangSeok Oh  <changseok...@collabora.com>
+
+        Support ANGLE_instanced_arrays for linux
+        https://bugs.webkit.org/show_bug.cgi?id=127465
+
+        Reviewed by Martin Robinson.
+
+        Support the instanced drawing WebGL extension, ANGLE_instanced_arrays for linux platform.
+        This is a following patch for r162565. Relevant opengl APIs are exposed
+        for WebGLRenderingContext to access them.
+
+        Covered by fast/canvas/webgl/angle-instanced-arrays.html
+
+        * html/canvas/ANGLEInstancedArrays.cpp:
+        (WebCore::ANGLEInstancedArrays::supported):
+        * platform/graphics/OpenGLShims.cpp:
+        (WebCore::initializeOpenGLShims):
+        * platform/graphics/OpenGLShims.h:
+        * platform/graphics/opengl/Extensions3DOpenGL.cpp:
+        (WebCore::Extensions3DOpenGL::supportsExtension):
+        * platform/graphics/opengl/GraphicsContext3DOpenGL.cpp:
+        (WebCore::GraphicsContext3D::drawArraysInstanced):
+        (WebCore::GraphicsContext3D::drawElementsInstanced):
+        (WebCore::GraphicsContext3D::vertexAttribDivisor):
+
 2014-02-10  Mark Lam  <mark....@apple.com>
 
         Removing limitation on JSLock’s lockDropDepth.

Modified: trunk/Source/WebCore/html/canvas/ANGLEInstancedArrays.cpp (163857 => 163858)


--- trunk/Source/WebCore/html/canvas/ANGLEInstancedArrays.cpp	2014-02-11 05:17:15 UTC (rev 163857)
+++ trunk/Source/WebCore/html/canvas/ANGLEInstancedArrays.cpp	2014-02-11 05:24:44 UTC (rev 163858)
@@ -28,6 +28,10 @@
 #if ENABLE(WEBGL)
 #include "ANGLEInstancedArrays.h"
 
+#if PLATFORM(GTK)
+#include "Extensions3D.h"
+#endif
+
 namespace WebCore {
 
 ANGLEInstancedArrays::ANGLEInstancedArrays(WebGLRenderingContext* context)
@@ -49,11 +53,16 @@
     return adoptPtr(new ANGLEInstancedArrays(context));
 }
 
-bool ANGLEInstancedArrays::supported(WebGLRenderingContext*)
+bool ANGLEInstancedArrays::supported(WebGLRenderingContext* context)
 {
 #if PLATFORM(IOS) || PLATFORM(MAC) && __MAC_OS_X_VERSION_MIN_REQUIRED >= 1090
+    UNUSED_PARAM(context);
     return true;
+#elif PLATFORM(GTK)
+    Extensions3D* extensions = context->graphicsContext3D()->getExtensions();
+    return extensions->supports("GL_ANGLE_instanced_arrays");
 #else
+    UNUSED_PARAM(context);
     return false;
 #endif
 }

Modified: trunk/Source/WebCore/platform/graphics/OpenGLShims.cpp (163857 => 163858)


--- trunk/Source/WebCore/platform/graphics/OpenGLShims.cpp	2014-02-11 05:17:15 UTC (rev 163857)
+++ trunk/Source/WebCore/platform/graphics/OpenGLShims.cpp	2014-02-11 05:24:44 UTC (rev 163858)
@@ -146,6 +146,8 @@
     ASSIGN_FUNCTION_TABLE_ENTRY_EXT(glDeleteVertexArrays);
     ASSIGN_FUNCTION_TABLE_ENTRY(glDetachShader, success);
     ASSIGN_FUNCTION_TABLE_ENTRY(glDisableVertexAttribArray, success);
+    ASSIGN_FUNCTION_TABLE_ENTRY(glDrawArraysInstanced, success);
+    ASSIGN_FUNCTION_TABLE_ENTRY(glDrawElementsInstanced, success);
     ASSIGN_FUNCTION_TABLE_ENTRY(glEnableVertexAttribArray, success);
     ASSIGN_FUNCTION_TABLE_ENTRY(glFramebufferRenderbuffer, success);
     ASSIGN_FUNCTION_TABLE_ENTRY(glFramebufferTexture2D, success);
@@ -220,6 +222,7 @@
     ASSIGN_FUNCTION_TABLE_ENTRY(glVertexAttrib3fv, success);
     ASSIGN_FUNCTION_TABLE_ENTRY(glVertexAttrib4f, success);
     ASSIGN_FUNCTION_TABLE_ENTRY(glVertexAttrib4fv, success);
+    ASSIGN_FUNCTION_TABLE_ENTRY(glVertexAttribDivisor, success);
     ASSIGN_FUNCTION_TABLE_ENTRY(glVertexAttribPointer, success);
 
     if (!success)

Modified: trunk/Source/WebCore/platform/graphics/OpenGLShims.h (163857 => 163858)


--- trunk/Source/WebCore/platform/graphics/OpenGLShims.h	2014-02-11 05:17:15 UTC (rev 163857)
+++ trunk/Source/WebCore/platform/graphics/OpenGLShims.h	2014-02-11 05:24:44 UTC (rev 163858)
@@ -69,6 +69,8 @@
 typedef void (GLAPIENTRY *glDeleteVertexArraysType) (GLsizei, const GLuint*);
 typedef void (GLAPIENTRY *glDetachShaderType) (GLuint, GLuint);
 typedef void (GLAPIENTRY *glDisableVertexAttribArrayType) (GLuint);
+typedef void (GLAPIENTRY *glDrawArraysInstancedType) (GLenum, GLint, GLsizei, GLsizei);
+typedef void (GLAPIENTRY *glDrawElementsInstancedType) (GLenum, GLsizei, GLenum, const GLvoid*, GLsizei);
 typedef void (GLAPIENTRY *glEnableVertexAttribArrayType) (GLuint);
 typedef void (GLAPIENTRY *glFramebufferRenderbufferType) (GLenum, GLenum, GLenum, GLuint);
 typedef void (GLAPIENTRY *glFramebufferTexture2DType) (GLenum, GLenum, GLenum, GLuint, GLint);
@@ -138,6 +140,7 @@
 typedef void (GLAPIENTRY *glVertexAttrib3fvType) (GLuint, const GLfloat*);
 typedef void (GLAPIENTRY *glVertexAttrib4fType) (GLuint, const GLfloat, const GLfloat, const GLfloat, const GLfloat);
 typedef void (GLAPIENTRY *glVertexAttrib4fvType) (GLuint, const GLfloat*);
+typedef void (GLAPIENTRY *glVertexAttribDivisorType) (GLuint, GLuint);
 typedef void (GLAPIENTRY *glVertexAttribPointerType) (GLuint, GLint, GLenum, GLboolean, GLsizei, const GLvoid*);
 
 #define FUNCTION_TABLE_ENTRY(FunctionName) FunctionName##Type FunctionName
@@ -171,6 +174,8 @@
     FUNCTION_TABLE_ENTRY(glDeleteVertexArrays);
     FUNCTION_TABLE_ENTRY(glDetachShader);
     FUNCTION_TABLE_ENTRY(glDisableVertexAttribArray);
+    FUNCTION_TABLE_ENTRY(glDrawArraysInstanced);
+    FUNCTION_TABLE_ENTRY(glDrawElementsInstanced);
     FUNCTION_TABLE_ENTRY(glEnableVertexAttribArray);
     FUNCTION_TABLE_ENTRY(glFramebufferRenderbuffer);
     FUNCTION_TABLE_ENTRY(glFramebufferTexture2D);
@@ -240,6 +245,7 @@
     FUNCTION_TABLE_ENTRY(glVertexAttrib3fv);
     FUNCTION_TABLE_ENTRY(glVertexAttrib4f);
     FUNCTION_TABLE_ENTRY(glVertexAttrib4fv);
+    FUNCTION_TABLE_ENTRY(glVertexAttribDivisor);
     FUNCTION_TABLE_ENTRY(glVertexAttribPointer);
 } OpenGLFunctionTable;
 
@@ -282,6 +288,10 @@
 #define glDeleteVertexArrays                   LOOKUP_GL_FUNCTION(glDeleteVertexArrays)
 #define glDetachShader                         LOOKUP_GL_FUNCTION(glDetachShader)
 #define glDisableVertexAttribArray             LOOKUP_GL_FUNCTION(glDisableVertexAttribArray)
+#define glDrawArraysInstancedEXT               glDrawArraysInstanced
+#define glDrawArraysInstanced                  LOOKUP_GL_FUNCTION(glDrawArraysInstanced)
+#define glDrawElementsInstancedEXT             glDrawElementsInstanced
+#define glDrawElementsInstanced                LOOKUP_GL_FUNCTION(glDrawElementsInstanced)
 #define glEnableVertexAttribArray              LOOKUP_GL_FUNCTION(glEnableVertexAttribArray)
 #define glFramebufferRenderbufferEXT           glFramebufferRenderbuffer
 #define glFramebufferRenderbuffer              LOOKUP_GL_FUNCTION(glFramebufferRenderbuffer)
@@ -365,6 +375,8 @@
 #define glVertexAttrib3fv                      LOOKUP_GL_FUNCTION(glVertexAttrib3fv)
 #define glVertexAttrib4f                       LOOKUP_GL_FUNCTION(glVertexAttrib4f)
 #define glVertexAttrib4fv                      LOOKUP_GL_FUNCTION(glVertexAttrib4fv)
+#define glVertexAttribDivisorEXT               glVertexAttribDivisor
+#define glVertexAttribDivisor                  LOOKUP_GL_FUNCTION(glVertexAttribDivisor)
 #define glVertexAttribPointer                  LOOKUP_GL_FUNCTION(glVertexAttribPointer)
 #endif
 

Modified: trunk/Source/WebCore/platform/graphics/opengl/Extensions3DOpenGL.cpp (163857 => 163858)


--- trunk/Source/WebCore/platform/graphics/opengl/Extensions3DOpenGL.cpp	2014-02-11 05:17:15 UTC (rev 163857)
+++ trunk/Source/WebCore/platform/graphics/opengl/Extensions3DOpenGL.cpp	2014-02-11 05:24:44 UTC (rev 163858)
@@ -174,6 +174,11 @@
     if (name == "GL_ANGLE_framebuffer_multisample")
         return m_availableExtensions.contains("GL_EXT_framebuffer_multisample");
 
+    if (name == "GL_ANGLE_instanced_arrays") {
+        return (m_availableExtensions.contains("GL_ARB_instanced_arrays") || m_availableExtensions.contains("GL_EXT_instanced_arrays"))
+            && (m_availableExtensions.contains("GL_ARB_draw_instanced") || m_availableExtensions.contains("GL_EXT_draw_instanced"));
+    }
+
     // Desktop GL always supports GL_OES_rgb8_rgba8.
     if (name == "GL_OES_rgb8_rgba8")
         return true;

Modified: trunk/Source/WebCore/platform/graphics/opengl/GraphicsContext3DOpenGL.cpp (163857 => 163858)


--- trunk/Source/WebCore/platform/graphics/opengl/GraphicsContext3DOpenGL.cpp	2014-02-11 05:17:15 UTC (rev 163857)
+++ trunk/Source/WebCore/platform/graphics/opengl/GraphicsContext3DOpenGL.cpp	2014-02-11 05:24:44 UTC (rev 163858)
@@ -354,25 +354,20 @@
 #if !PLATFORM(COCOA)
 void GraphicsContext3D::drawArraysInstanced(GC3Denum mode, GC3Dint first, GC3Dsizei count, GC3Dsizei primcount)
 {
-    UNUSED_PARAM(mode);
-    UNUSED_PARAM(first);
-    UNUSED_PARAM(count);
-    UNUSED_PARAM(primcount);
+    makeContextCurrent();
+    ::glDrawArraysInstanced(mode, first, count, primcount);
 }
 
 void GraphicsContext3D::drawElementsInstanced(GC3Denum mode, GC3Dsizei count, GC3Denum type, GC3Dintptr offset, GC3Dsizei primcount)
 {
-    UNUSED_PARAM(mode);
-    UNUSED_PARAM(count);
-    UNUSED_PARAM(type);
-    UNUSED_PARAM(offset);
-    UNUSED_PARAM(primcount);
+    makeContextCurrent();
+    ::glDrawElementsInstanced(mode, count, type, reinterpret_cast<GLvoid*>(static_cast<intptr_t>(offset)), primcount);
 }
 
 void GraphicsContext3D::vertexAttribDivisor(GC3Duint index, GC3Duint divisor)
 {
-    UNUSED_PARAM(index);
-    UNUSED_PARAM(divisor);
+    makeContextCurrent();
+    ::glVertexAttribDivisor(index, divisor);
 }
 #endif
 
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to