6ccf4b26c664e1a827aa841736c0e9434c973925
[WebKit-https.git] / Source / WebCore / platform / graphics / opengl / Extensions3DOpenGL.cpp
1 /*
2  * Copyright (C) 2011 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 USE(3D_GRAPHICS)
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 #elif PLATFORM(GTK) || PLATFORM(EFL) || PLATFORM(QT)
39 #include "OpenGLShims.h"
40 #endif
41
42 namespace WebCore {
43
44 Extensions3DOpenGL::Extensions3DOpenGL(GraphicsContext3D* context)
45     : Extensions3DOpenGLCommon(context)
46 {
47 }
48
49 Extensions3DOpenGL::~Extensions3DOpenGL()
50 {
51 }
52
53
54 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)
55 {
56     ::glBlitFramebufferEXT(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
57 }
58
59 void Extensions3DOpenGL::renderbufferStorageMultisample(unsigned long target, unsigned long samples, unsigned long internalformat, unsigned long width, unsigned long height)
60 {
61     ::glRenderbufferStorageMultisampleEXT(target, samples, internalformat, width, height);
62 }
63
64 Platform3DObject Extensions3DOpenGL::createVertexArrayOES()
65 {
66     m_context->makeContextCurrent();
67 #if !PLATFORM(GTK) && !PLATFORM(QT) && !PLATFORM(EFL) && defined(GL_APPLE_vertex_array_object) && GL_APPLE_vertex_array_object
68     GLuint array = 0;
69     glGenVertexArraysAPPLE(1, &array);
70     return array;
71 #else
72     return 0;
73 #endif
74 }
75
76 void Extensions3DOpenGL::deleteVertexArrayOES(Platform3DObject array)
77 {
78     if (!array)
79         return;
80     
81     m_context->makeContextCurrent();
82 #if !PLATFORM(GTK) && !PLATFORM(QT) && !PLATFORM(EFL) && defined(GL_APPLE_vertex_array_object) && GL_APPLE_vertex_array_object
83     glDeleteVertexArraysAPPLE(1, &array);
84 #endif
85 }
86
87 GC3Dboolean Extensions3DOpenGL::isVertexArrayOES(Platform3DObject array)
88 {
89     if (!array)
90         return GL_FALSE;
91     
92     m_context->makeContextCurrent();
93 #if !PLATFORM(GTK) && !PLATFORM(QT) && !PLATFORM(EFL) && defined(GL_APPLE_vertex_array_object) && GL_APPLE_vertex_array_object
94     return glIsVertexArrayAPPLE(array);
95 #else
96     return GL_FALSE;
97 #endif
98 }
99
100 void Extensions3DOpenGL::bindVertexArrayOES(Platform3DObject array)
101 {
102     m_context->makeContextCurrent();
103 #if !PLATFORM(GTK) && !PLATFORM(QT) && !PLATFORM(EFL) && defined(GL_APPLE_vertex_array_object) && GL_APPLE_vertex_array_object
104     glBindVertexArrayAPPLE(array);
105 #else
106     UNUSED_PARAM(array);
107 #endif
108 }
109
110 void Extensions3DOpenGL::copyTextureCHROMIUM(GC3Denum, Platform3DObject, Platform3DObject, GC3Dint, GC3Denum)
111 {
112     // FIXME: implement this function and add GL_CHROMIUM_copy_texture in supports().
113     return;
114 }
115
116 void Extensions3DOpenGL::insertEventMarkerEXT(const String&)
117 {
118     // FIXME: implement this function and add GL_EXT_debug_marker in supports().
119     return;
120 }
121
122 void Extensions3DOpenGL::pushGroupMarkerEXT(const String&)
123 {
124     // FIXME: implement this function and add GL_EXT_debug_marker in supports().
125     return;
126 }
127
128 void Extensions3DOpenGL::popGroupMarkerEXT(void)
129 {
130     // FIXME: implement this function and add GL_EXT_debug_marker in supports().
131     return;
132 }
133
134 bool Extensions3DOpenGL::supportsExtension(const String& name)
135 {
136     // GL_ANGLE_framebuffer_blit and GL_ANGLE_framebuffer_multisample are "fake". They are implemented using other
137     // extensions. In particular GL_EXT_framebuffer_blit and GL_EXT_framebuffer_multisample
138     if (name == "GL_ANGLE_framebuffer_blit")
139         return m_availableExtensions.contains("GL_EXT_framebuffer_blit");
140     if (name == "GL_ANGLE_framebuffer_multisample")
141         return m_availableExtensions.contains("GL_EXT_framebuffer_multisample");
142
143     // Desktop GL always supports GL_OES_rgb8_rgba8.
144     if (name == "GL_OES_rgb8_rgba8")
145         return true;
146
147     // If GL_ARB_texture_float is available then we report GL_OES_texture_float and
148     // GL_OES_texture_half_float as available.
149     if (name == "GL_OES_texture_float" || name == "GL_OES_texture_half_float")
150         return m_availableExtensions.contains("GL_ARB_texture_float");
151
152     // GL_OES_vertex_array_object
153     if (name == "GL_OES_vertex_array_object")
154         return m_availableExtensions.contains("GL_APPLE_vertex_array_object");
155
156     // Desktop GL always supports the standard derivative functions
157     if (name == "GL_OES_standard_derivatives")
158         return true;
159
160     // Desktop GL always supports UNSIGNED_INT indices
161     if (name == "GL_OES_element_index_uint")
162         return true;
163
164     if (name == "GL_EXT_texture_filter_anisotropic")
165         return m_availableExtensions.contains("GL_EXT_texture_filter_anisotropic");
166
167     return m_availableExtensions.contains(name);
168 }
169
170 String Extensions3DOpenGL::getExtensions()
171 {
172     return String(reinterpret_cast<const char*>(::glGetString(GL_EXTENSIONS)));
173 }
174
175 } // namespace WebCore
176
177 #endif // USE(3D_GRAPHICS)