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