128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu/*
228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu * Copyright (C) 2010 Google Inc. All rights reserved.
328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu *
428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu * Redistribution and use in source and binary forms, with or without
528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu * modification, are permitted provided that the following conditions
628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu * are met:
728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu *
828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu * 1.  Redistributions of source code must retain the above copyright
928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu *     notice, this list of conditions and the following disclaimer.
1028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu * 2.  Redistributions in binary form must reproduce the above copyright
1128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu *     notice, this list of conditions and the following disclaimer in the
1228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu *     documentation and/or other materials provided with the distribution.
1328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu *
1428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
1528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
1628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
1728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
1828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
1928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
2028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
2128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
2328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu */
2528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
2628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu#include "config.h"
2728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
282fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#if ENABLE(WEBGL)
2928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
3028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu#include "Extensions3DOpenGL.h"
3128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
3228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu#include "GraphicsContext3D.h"
3328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu#include <wtf/Vector.h>
3428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
3528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu#if PLATFORM(MAC)
36ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch#include "ANGLE/ShaderLang.h"
3728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu#include <OpenGL/gl.h>
382daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#elif PLATFORM(GTK)
392daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#include "OpenGLShims.h"
4028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu#endif
4128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
4228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhunamespace WebCore {
4328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
44ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen MurdochExtensions3DOpenGL::Extensions3DOpenGL(GraphicsContext3D* context)
4528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    : m_initializedAvailableExtensions(false)
46ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    , m_context(context)
4728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu{
4828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu}
4928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
5028040489d744e0c5d475a88663056c9040ed5320Teng-Hui ZhuExtensions3DOpenGL::~Extensions3DOpenGL()
5128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu{
5228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu}
5328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
5428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhubool Extensions3DOpenGL::supports(const String& name)
5528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu{
5628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    // Note on support for BGRA:
5728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    //
5828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    // For OpenGL ES2.0, requires checking for
5928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    // GL_EXT_texture_format_BGRA8888 and GL_EXT_read_format_bgra.
6028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    // For desktop GL, BGRA has been supported since OpenGL 1.2.
6128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    //
6228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    // However, note that the GL ES2 extension requires the
6328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    // internalFormat to glTexImage2D() be GL_BGRA, while desktop GL
6428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    // will not accept GL_BGRA (must be GL_RGBA), so this must be
6528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    // checked on each platform. Desktop GL offers neither
6628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    // GL_EXT_texture_format_BGRA8888 or GL_EXT_read_format_bgra, so
6728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    // treat them as unsupported here.
6828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    if (!m_initializedAvailableExtensions) {
6928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        String extensionsString(reinterpret_cast<const char*>(::glGetString(GL_EXTENSIONS)));
7028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        Vector<String> availableExtensions;
7128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        extensionsString.split(" ", availableExtensions);
7228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        for (size_t i = 0; i < availableExtensions.size(); ++i)
7328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu            m_availableExtensions.add(availableExtensions[i]);
7428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        m_initializedAvailableExtensions = true;
7528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    }
766b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
776b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    // GL_ANGLE_framebuffer_blit and GL_ANGLE_framebuffer_multisample are "fake". They are implemented using other
786b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    // extensions. In particular GL_EXT_framebuffer_blit and GL_EXT_framebuffer_multisample
796b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    if (name == "GL_ANGLE_framebuffer_blit")
806b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        return m_availableExtensions.contains("GL_EXT_framebuffer_blit");
816b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    if (name == "GL_ANGLE_framebuffer_multisample")
826b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        return m_availableExtensions.contains("GL_EXT_framebuffer_multisample");
83f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
842fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // Desktop GL always supports GL_OES_rgb8_rgba8.
852fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (name == "GL_OES_rgb8_rgba8")
862fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return true;
872fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
88f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    // If GL_ARB_texture_float is available then we report GL_OES_texture_float and
89f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    // GL_OES_texture_half_float as available.
90f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (name == "GL_OES_texture_float" || name == "GL_OES_texture_half_float")
91f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        return m_availableExtensions.contains("GL_ARB_texture_float");
9281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
9381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    // GL_OES_vertex_array_object
9481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (name == "GL_OES_vertex_array_object")
9581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return m_availableExtensions.contains("GL_APPLE_vertex_array_object");
96f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
97ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    // Desktop GL always supports the standard derivative functions
98ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    if (name == "GL_OES_standard_derivatives")
99ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        return true;
100ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
10128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    return m_availableExtensions.contains(name);
10228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu}
10328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
104f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid Extensions3DOpenGL::ensureEnabled(const String& name)
105f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
106ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch#if PLATFORM(MAC)
107ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    if (name == "GL_OES_standard_derivatives") {
108ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        // Enable support in ANGLE (if not enabled already)
109ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        ANGLEWebKitBridge& compiler = m_context->m_compiler;
110ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        ShBuiltInResources ANGLEResources = compiler.getResources();
111ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        if (!ANGLEResources.OES_standard_derivatives) {
112ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            ANGLEResources.OES_standard_derivatives = 1;
113ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            compiler.setResources(ANGLEResources);
114ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        }
115ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    }
116ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch#else
117f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    ASSERT_UNUSED(name, supports(name));
118ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch#endif
119f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
120f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
1212daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochbool Extensions3DOpenGL::isEnabled(const String& name)
1222daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
1232daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#if PLATFORM(MAC)
1242daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (name == "GL_OES_standard_derivatives") {
1252daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        ANGLEWebKitBridge& compiler = m_context->m_compiler;
1262daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return compiler.getResources().OES_standard_derivatives;
1272daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
1282daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#endif
1292daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    return supports(name);
1302daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
1312daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
13228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhuint Extensions3DOpenGL::getGraphicsResetStatusARB()
13328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu{
13428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    return GraphicsContext3D::NO_ERROR;
13528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu}
13628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
1376b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brennervoid Extensions3DOpenGL::blitFramebuffer(long srcX0, long srcY0, long srcX1, long srcY1, long dstX0, long dstY0, long dstX1, long dstY1, unsigned long mask, unsigned long filter)
1386b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner{
1396b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    ::glBlitFramebufferEXT(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
1406b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner}
1416b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
1426b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brennervoid Extensions3DOpenGL::renderbufferStorageMultisample(unsigned long target, unsigned long samples, unsigned long internalformat, unsigned long width, unsigned long height)
1436b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner{
1446b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    ::glRenderbufferStorageMultisampleEXT(target, samples, internalformat, width, height);
1456b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner}
1466b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
14781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen MurdochPlatform3DObject Extensions3DOpenGL::createVertexArrayOES()
14881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{
14981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    m_context->makeContextCurrent();
1502daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#if !PLATFORM(GTK) && defined(GL_APPLE_vertex_array_object) && GL_APPLE_vertex_array_object
15181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    GLuint array = 0;
15281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    glGenVertexArraysAPPLE(1, &array);
15381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    return array;
15481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#else
15581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    return 0;
15681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#endif
15781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}
15881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
15981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochvoid Extensions3DOpenGL::deleteVertexArrayOES(Platform3DObject array)
16081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{
16181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (!array)
16281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return;
16381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
16481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    m_context->makeContextCurrent();
1652daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#if !PLATFORM(GTK) && defined(GL_APPLE_vertex_array_object) && GL_APPLE_vertex_array_object
16681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    glDeleteVertexArraysAPPLE(1, &array);
16781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#endif
16881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}
16981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
17081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen MurdochGC3Dboolean Extensions3DOpenGL::isVertexArrayOES(Platform3DObject array)
17181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{
17281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (!array)
17381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return GL_FALSE;
17481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
17581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    m_context->makeContextCurrent();
1762daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#if !PLATFORM(GTK) && defined(GL_APPLE_vertex_array_object) && GL_APPLE_vertex_array_object
17781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    return glIsVertexArrayAPPLE(array);
17881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#else
17981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    return GL_FALSE;
18081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#endif
18181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}
18281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
18381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochvoid Extensions3DOpenGL::bindVertexArrayOES(Platform3DObject array)
18481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{
18581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (!array)
18681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return;
18781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
18881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    m_context->makeContextCurrent();
1892daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#if !PLATFORM(GTK) && defined(GL_APPLE_vertex_array_object) && GL_APPLE_vertex_array_object
19081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    glBindVertexArrayAPPLE(array);
19181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#endif
19281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}
19381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
19428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu} // namespace WebCore
19528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
1962fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#endif // ENABLE(WEBGL)
197