e09534e08ef96718058acaba260d34be725f1c82
[WebKit-https.git] / Source / WebCore / platform / graphics / opengl / Extensions3DOpenGL.cpp
1 /*
2  * Copyright (C) 2010 Google Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  *
8  * 1.  Redistributions of source code must retain the above copyright
9  *     notice, this list of conditions and the following disclaimer.
10  * 2.  Redistributions in binary form must reproduce the above copyright
11  *     notice, this list of conditions and the following disclaimer in the
12  *     documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
15  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
16  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
17  * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
18  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
19  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
20  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
21  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
23  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #include "config.h"
27
28 #if ENABLE(WEBGL)
29
30 #include "Extensions3DOpenGL.h"
31
32 #include "GraphicsContext3D.h"
33 #include <wtf/Vector.h>
34
35 #if PLATFORM(MAC)
36 #include "ANGLE/ShaderLang.h"
37 #include <OpenGL/gl.h>
38 #endif
39
40 namespace WebCore {
41
42 Extensions3DOpenGL::Extensions3DOpenGL(GraphicsContext3D* context)
43     : m_initializedAvailableExtensions(false)
44     , m_context(context)
45 {
46 }
47
48 Extensions3DOpenGL::~Extensions3DOpenGL()
49 {
50 }
51
52 bool Extensions3DOpenGL::supports(const String& name)
53 {
54     // Note on support for BGRA:
55     //
56     // For OpenGL ES2.0, requires checking for
57     // GL_EXT_texture_format_BGRA8888 and GL_EXT_read_format_bgra.
58     // For desktop GL, BGRA has been supported since OpenGL 1.2.
59     //
60     // However, note that the GL ES2 extension requires the
61     // internalFormat to glTexImage2D() be GL_BGRA, while desktop GL
62     // will not accept GL_BGRA (must be GL_RGBA), so this must be
63     // checked on each platform. Desktop GL offers neither
64     // GL_EXT_texture_format_BGRA8888 or GL_EXT_read_format_bgra, so
65     // treat them as unsupported here.
66     if (!m_initializedAvailableExtensions) {
67         String extensionsString(reinterpret_cast<const char*>(::glGetString(GL_EXTENSIONS)));
68         Vector<String> availableExtensions;
69         extensionsString.split(" ", availableExtensions);
70         for (size_t i = 0; i < availableExtensions.size(); ++i)
71             m_availableExtensions.add(availableExtensions[i]);
72         m_initializedAvailableExtensions = true;
73     }
74     
75     // GL_ANGLE_framebuffer_blit and GL_ANGLE_framebuffer_multisample are "fake". They are implemented using other
76     // extensions. In particular GL_EXT_framebuffer_blit and GL_EXT_framebuffer_multisample
77     if (name == "GL_ANGLE_framebuffer_blit")
78         return m_availableExtensions.contains("GL_EXT_framebuffer_blit");
79     if (name == "GL_ANGLE_framebuffer_multisample")
80         return m_availableExtensions.contains("GL_EXT_framebuffer_multisample");
81
82     // Desktop GL always supports GL_OES_rgb8_rgba8.
83     if (name == "GL_OES_rgb8_rgba8")
84         return true;
85
86     // If GL_ARB_texture_float is available then we report GL_OES_texture_float and
87     // GL_OES_texture_half_float as available.
88     if (name == "GL_OES_texture_float" || name == "GL_OES_texture_half_float")
89         return m_availableExtensions.contains("GL_ARB_texture_float");
90     
91     // GL_OES_vertex_array_object
92     if (name == "GL_OES_vertex_array_object")
93         return m_availableExtensions.contains("GL_APPLE_vertex_array_object");
94
95     // Desktop GL always supports the standard derivative functions
96     if (name == "GL_OES_standard_derivatives")
97         return true;
98
99     return m_availableExtensions.contains(name);
100 }
101
102 void Extensions3DOpenGL::ensureEnabled(const String& name)
103 {
104 #if PLATFORM(MAC)
105     if (name == "GL_OES_standard_derivatives") {
106         // Enable support in ANGLE (if not enabled already)
107         ANGLEWebKitBridge& compiler = m_context->m_compiler;
108         ShBuiltInResources ANGLEResources = compiler.getResources();
109         if (!ANGLEResources.OES_standard_derivatives) {
110             ANGLEResources.OES_standard_derivatives = 1;
111             compiler.setResources(ANGLEResources);
112         }
113     }
114 #else
115     ASSERT_UNUSED(name, supports(name));
116 #endif
117 }
118
119 int Extensions3DOpenGL::getGraphicsResetStatusARB()
120 {
121     return GraphicsContext3D::NO_ERROR;
122 }
123
124 void Extensions3DOpenGL::blitFramebuffer(long srcX0, long srcY0, long srcX1, long srcY1, long dstX0, long dstY0, long dstX1, long dstY1, unsigned long mask, unsigned long filter)
125 {
126     ::glBlitFramebufferEXT(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
127 }
128
129 void Extensions3DOpenGL::renderbufferStorageMultisample(unsigned long target, unsigned long samples, unsigned long internalformat, unsigned long width, unsigned long height)
130 {
131     ::glRenderbufferStorageMultisampleEXT(target, samples, internalformat, width, height);
132 }
133
134 Platform3DObject Extensions3DOpenGL::createVertexArrayOES()
135 {
136     m_context->makeContextCurrent();
137 #if defined GL_APPLE_vertex_array_object && GL_APPLE_vertex_array_object
138     GLuint array = 0;
139     glGenVertexArraysAPPLE(1, &array);
140     return array;
141 #else
142     return 0;
143 #endif
144 }
145
146 void Extensions3DOpenGL::deleteVertexArrayOES(Platform3DObject array)
147 {
148     if (!array)
149         return;
150     
151     m_context->makeContextCurrent();
152 #if defined GL_APPLE_vertex_array_object && GL_APPLE_vertex_array_object
153     glDeleteVertexArraysAPPLE(1, &array);
154 #endif
155 }
156
157 GC3Dboolean Extensions3DOpenGL::isVertexArrayOES(Platform3DObject array)
158 {
159     if (!array)
160         return GL_FALSE;
161     
162     m_context->makeContextCurrent();
163 #if defined GL_APPLE_vertex_array_object && GL_APPLE_vertex_array_object
164     return glIsVertexArrayAPPLE(array);
165 #else
166     return GL_FALSE;
167 #endif
168 }
169
170 void Extensions3DOpenGL::bindVertexArrayOES(Platform3DObject array)
171 {
172     if (!array)
173         return;
174
175     m_context->makeContextCurrent();
176 #if defined GL_APPLE_vertex_array_object && GL_APPLE_vertex_array_object
177     glBindVertexArrayAPPLE(array);
178 #endif
179 }
180
181 } // namespace WebCore
182
183 #endif // ENABLE(WEBGL)