summaryrefslogtreecommitdiff
path: root/Source/WebCore/platform/graphics/opengl/Extensions3DOpenGL.cpp
diff options
context:
space:
mode:
authorLorry Tar Creator <lorry-tar-importer@lorry>2017-06-27 06:07:23 +0000
committerLorry Tar Creator <lorry-tar-importer@lorry>2017-06-27 06:07:23 +0000
commit1bf1084f2b10c3b47fd1a588d85d21ed0eb41d0c (patch)
tree46dcd36c86e7fbc6e5df36deb463b33e9967a6f7 /Source/WebCore/platform/graphics/opengl/Extensions3DOpenGL.cpp
parent32761a6cee1d0dee366b885b7b9c777e67885688 (diff)
downloadWebKitGtk-tarball-master.tar.gz
Diffstat (limited to 'Source/WebCore/platform/graphics/opengl/Extensions3DOpenGL.cpp')
-rw-r--r--Source/WebCore/platform/graphics/opengl/Extensions3DOpenGL.cpp124
1 files changed, 94 insertions, 30 deletions
diff --git a/Source/WebCore/platform/graphics/opengl/Extensions3DOpenGL.cpp b/Source/WebCore/platform/graphics/opengl/Extensions3DOpenGL.cpp
index f8321cac0..5da632035 100644
--- a/Source/WebCore/platform/graphics/opengl/Extensions3DOpenGL.cpp
+++ b/Source/WebCore/platform/graphics/opengl/Extensions3DOpenGL.cpp
@@ -25,20 +25,17 @@
#include "config.h"
-#if USE(3D_GRAPHICS)
+#if ENABLE(GRAPHICS_CONTEXT_3D)
#include "Extensions3DOpenGL.h"
#include "GraphicsContext3D.h"
-#include <wtf/Vector.h>
#if PLATFORM(IOS)
-#include "ANGLE/ShaderLang.h"
#include <OpenGLES/ES2/glext.h>
#elif PLATFORM(MAC)
-#include "ANGLE/ShaderLang.h"
#include <OpenGL/gl.h>
-#elif PLATFORM(GTK) || PLATFORM(EFL) || PLATFORM(WIN)
+#elif PLATFORM(GTK) || PLATFORM(WIN)
#include "OpenGLShims.h"
#endif
@@ -48,8 +45,8 @@
namespace WebCore {
-Extensions3DOpenGL::Extensions3DOpenGL(GraphicsContext3D* context)
- : Extensions3DOpenGLCommon(context)
+Extensions3DOpenGL::Extensions3DOpenGL(GraphicsContext3D* context, bool useIndexedGetString)
+ : Extensions3DOpenGLCommon(context, useIndexedGetString)
{
}
@@ -86,7 +83,7 @@ Platform3DObject Extensions3DOpenGL::createVertexArrayOES()
{
m_context->makeContextCurrent();
GLuint array = 0;
-#if (PLATFORM(GTK) || PLATFORM(EFL) || PLATFORM(WIN))
+#if (PLATFORM(GTK) || PLATFORM(WIN) || PLATFORM(IOS))
if (isVertexArrayObjectSupported())
glGenVertexArrays(1, &array);
#elif defined(GL_APPLE_vertex_array_object) && GL_APPLE_vertex_array_object
@@ -101,7 +98,7 @@ void Extensions3DOpenGL::deleteVertexArrayOES(Platform3DObject array)
return;
m_context->makeContextCurrent();
-#if (PLATFORM(GTK) || PLATFORM(EFL) || PLATFORM(WIN))
+#if (PLATFORM(GTK) || PLATFORM(WIN) || PLATFORM(IOS))
if (isVertexArrayObjectSupported())
glDeleteVertexArrays(1, &array);
#elif defined(GL_APPLE_vertex_array_object) && GL_APPLE_vertex_array_object
@@ -115,7 +112,7 @@ GC3Dboolean Extensions3DOpenGL::isVertexArrayOES(Platform3DObject array)
return GL_FALSE;
m_context->makeContextCurrent();
-#if (PLATFORM(GTK) || PLATFORM(EFL) || PLATFORM(WIN))
+#if (PLATFORM(GTK) || PLATFORM(WIN) || PLATFORM(IOS))
if (isVertexArrayObjectSupported())
return glIsVertexArray(array);
#elif defined(GL_APPLE_vertex_array_object) && GL_APPLE_vertex_array_object
@@ -126,12 +123,8 @@ GC3Dboolean Extensions3DOpenGL::isVertexArrayOES(Platform3DObject array)
void Extensions3DOpenGL::bindVertexArrayOES(Platform3DObject array)
{
-#if PLATFORM(IOS)
- UNUSED_PARAM(array);
-#endif
-
m_context->makeContextCurrent();
-#if (PLATFORM(GTK) || PLATFORM(EFL) || PLATFORM(WIN))
+#if (PLATFORM(GTK) || PLATFORM(WIN) || PLATFORM(IOS))
if (isVertexArrayObjectSupported())
glBindVertexArray(array);
#elif defined(GL_APPLE_vertex_array_object) && GL_APPLE_vertex_array_object
@@ -141,12 +134,6 @@ void Extensions3DOpenGL::bindVertexArrayOES(Platform3DObject array)
#endif
}
-void Extensions3DOpenGL::copyTextureCHROMIUM(GC3Denum, Platform3DObject, Platform3DObject, GC3Dint, GC3Denum)
-{
- // FIXME: implement this function and add GL_CHROMIUM_copy_texture in supports().
- return;
-}
-
void Extensions3DOpenGL::insertEventMarkerEXT(const String&)
{
// FIXME: implement this function and add GL_EXT_debug_marker in supports().
@@ -168,25 +155,50 @@ void Extensions3DOpenGL::popGroupMarkerEXT(void)
bool Extensions3DOpenGL::supportsExtension(const String& name)
{
// GL_ANGLE_framebuffer_blit and GL_ANGLE_framebuffer_multisample are "fake". They are implemented using other
- // extensions. In particular GL_EXT_framebuffer_blit and GL_EXT_framebuffer_multisample
+ // extensions. In particular GL_EXT_framebuffer_blit and GL_EXT_framebuffer_multisample/GL_APPLE_framebuffer_multisample.
if (name == "GL_ANGLE_framebuffer_blit")
return m_availableExtensions.contains("GL_EXT_framebuffer_blit");
if (name == "GL_ANGLE_framebuffer_multisample")
+#if PLATFORM(IOS)
+ return m_availableExtensions.contains("GL_APPLE_framebuffer_multisample");
+#else
return m_availableExtensions.contains("GL_EXT_framebuffer_multisample");
+#endif
+
+ 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"));
+ }
+
+ if (name == "GL_EXT_sRGB")
+#if PLATFORM(IOS)
+ return m_availableExtensions.contains("GL_EXT_sRGB");
+#else
+ return m_availableExtensions.contains("GL_EXT_texture_sRGB") && (m_availableExtensions.contains("GL_EXT_framebuffer_sRGB") || m_availableExtensions.contains("GL_ARB_framebuffer_sRGB"));
+#endif
+
+ if (name == "GL_EXT_frag_depth")
+#if PLATFORM(MAC)
+ return true;
+#else
+ return m_availableExtensions.contains("GL_EXT_frag_depth");
+#endif
// Desktop GL always supports GL_OES_rgb8_rgba8.
if (name == "GL_OES_rgb8_rgba8")
return true;
- // If GL_ARB_texture_float is available then we report GL_OES_texture_float,
+ // If GL_ARB_texture_float or GL_OES_texture_float is available then we report
// GL_OES_texture_half_float, GL_OES_texture_float_linear and GL_OES_texture_half_float_linear as available.
if (name == "GL_OES_texture_float" || name == "GL_OES_texture_half_float" || name == "GL_OES_texture_float_linear" || name == "GL_OES_texture_half_float_linear")
- return m_availableExtensions.contains("GL_ARB_texture_float");
+ return m_availableExtensions.contains("GL_ARB_texture_float") || m_availableExtensions.contains("GL_OES_texture_float");
// GL_OES_vertex_array_object
if (name == "GL_OES_vertex_array_object") {
-#if (PLATFORM(GTK) || PLATFORM(EFL))
+#if (PLATFORM(GTK))
return m_availableExtensions.contains("GL_ARB_vertex_array_object");
+#elif PLATFORM(IOS)
+ return m_availableExtensions.contains("GL_OES_vertex_array_object");
#else
return m_availableExtensions.contains("GL_APPLE_vertex_array_object");
#endif
@@ -199,12 +211,17 @@ bool Extensions3DOpenGL::supportsExtension(const String& name)
// Desktop GL always supports UNSIGNED_INT indices
if (name == "GL_OES_element_index_uint")
return true;
-
+
+ if (name == "GL_EXT_shader_texture_lod")
+ return m_availableExtensions.contains("GL_EXT_shader_texture_lod");
+
if (name == "GL_EXT_texture_filter_anisotropic")
return m_availableExtensions.contains("GL_EXT_texture_filter_anisotropic");
if (name == "GL_EXT_draw_buffers") {
-#if PLATFORM(MAC)
+#if PLATFORM(IOS)
+ return m_availableExtensions.contains(name);
+#elif PLATFORM(MAC) || PLATFORM(GTK)
return m_availableExtensions.contains("GL_ARB_draw_buffers");
#else
// FIXME: implement support for other platforms.
@@ -223,20 +240,67 @@ bool Extensions3DOpenGL::supportsExtension(const String& name)
void Extensions3DOpenGL::drawBuffersEXT(GC3Dsizei n, const GC3Denum* bufs)
{
// FIXME: implement support for other platforms.
-#if PLATFORM(MAC) && !PLATFORM(IOS)
+#if PLATFORM(MAC)
::glDrawBuffersARB(n, bufs);
+#elif PLATFORM(GTK)
+ ::glDrawBuffers(n, bufs);
#else
UNUSED_PARAM(n);
UNUSED_PARAM(bufs);
#endif
}
+void Extensions3DOpenGL::drawArraysInstanced(GC3Denum mode, GC3Dint first, GC3Dsizei count, GC3Dsizei primcount)
+{
+ m_context->makeContextCurrent();
+#if PLATFORM(GTK)
+ ::glDrawArraysInstanced(mode, first, count, primcount);
+#elif PLATFORM(COCOA)
+ ::glDrawArraysInstancedARB(mode, first, count, primcount);
+#else
+ UNUSED_PARAM(mode);
+ UNUSED_PARAM(first);
+ UNUSED_PARAM(count);
+ UNUSED_PARAM(primcount);
+#endif
+}
+
+void Extensions3DOpenGL::drawElementsInstanced(GC3Denum mode, GC3Dsizei count, GC3Denum type, long long offset, GC3Dsizei primcount)
+{
+ m_context->makeContextCurrent();
+#if PLATFORM(GTK)
+ ::glDrawElementsInstanced(mode, count, type, reinterpret_cast<GLvoid*>(static_cast<intptr_t>(offset)), primcount);
+#elif PLATFORM(COCOA)
+ ::glDrawElementsInstancedARB(mode, count, type, reinterpret_cast<GLvoid*>(static_cast<intptr_t>(offset)), primcount);
+#else
+ UNUSED_PARAM(mode);
+ UNUSED_PARAM(count);
+ UNUSED_PARAM(type);
+ UNUSED_PARAM(offset);
+ UNUSED_PARAM(primcount);
+#endif
+}
+
+void Extensions3DOpenGL::vertexAttribDivisor(GC3Duint index, GC3Duint divisor)
+{
+ m_context->makeContextCurrent();
+#if PLATFORM(GTK)
+ ::glVertexAttribDivisor(index, divisor);
+#elif PLATFORM(COCOA)
+ ::glVertexAttribDivisorARB(index, divisor);
+#else
+ UNUSED_PARAM(index);
+ UNUSED_PARAM(divisor);
+#endif
+}
+
String Extensions3DOpenGL::getExtensions()
{
+ ASSERT(!m_useIndexedGetString);
return String(reinterpret_cast<const char*>(::glGetString(GL_EXTENSIONS)));
}
-#if (PLATFORM(GTK) || PLATFORM(EFL) || PLATFORM(WIN))
+#if (PLATFORM(GTK) || PLATFORM(WIN) || PLATFORM(IOS))
bool Extensions3DOpenGL::isVertexArrayObjectSupported()
{
static const bool supportsVertexArrayObject = supports("GL_OES_vertex_array_object");
@@ -246,4 +310,4 @@ bool Extensions3DOpenGL::isVertexArrayObjectSupported()
} // namespace WebCore
-#endif // USE(3D_GRAPHICS)
+#endif // ENABLE(GRAPHICS_CONTEXT_3D)