1// Copyright 2014 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "config.h" 6#include "platform/graphics/gpu/Extensions3DUtil.h" 7 8#include "public/platform/WebGraphicsContext3D.h" 9#include "wtf/text/CString.h" 10#include "wtf/text/StringHash.h" 11 12namespace blink { 13 14namespace { 15 16void splitStringHelper(const String& str, HashSet<String>& set) 17{ 18 Vector<String> substrings; 19 str.split(' ', substrings); 20 for (size_t i = 0; i < substrings.size(); ++i) 21 set.add(substrings[i]); 22} 23 24} // anonymous namespace 25 26PassOwnPtr<Extensions3DUtil> Extensions3DUtil::create(WebGraphicsContext3D* context) 27{ 28 OwnPtr<Extensions3DUtil> out = adoptPtr(new Extensions3DUtil(context)); 29 if (!out->initializeExtensions()) 30 return nullptr; 31 return out.release(); 32} 33 34Extensions3DUtil::Extensions3DUtil(WebGraphicsContext3D* context) 35 : m_context(context) 36{ 37} 38 39Extensions3DUtil::~Extensions3DUtil() 40{ 41} 42 43bool Extensions3DUtil::initializeExtensions() 44{ 45 if (m_context->isContextLost()) { 46 // Need to try to restore the context again later. 47 return false; 48 } 49 50 String extensionsString = m_context->getString(GL_EXTENSIONS); 51 splitStringHelper(extensionsString, m_enabledExtensions); 52 53 String requestableExtensionsString = m_context->getRequestableExtensionsCHROMIUM(); 54 splitStringHelper(requestableExtensionsString, m_requestableExtensions); 55 56 return true; 57} 58 59 60bool Extensions3DUtil::supportsExtension(const String& name) 61{ 62 return m_enabledExtensions.contains(name) || m_requestableExtensions.contains(name); 63} 64 65bool Extensions3DUtil::ensureExtensionEnabled(const String& name) 66{ 67 if (m_enabledExtensions.contains(name)) 68 return true; 69 70 if (m_requestableExtensions.contains(name)) { 71 m_context->requestExtensionCHROMIUM(name.ascii().data()); 72 m_enabledExtensions.clear(); 73 m_requestableExtensions.clear(); 74 initializeExtensions(); 75 } 76 return m_enabledExtensions.contains(name); 77} 78 79bool Extensions3DUtil::isExtensionEnabled(const String& name) 80{ 81 return m_enabledExtensions.contains(name); 82} 83 84bool Extensions3DUtil::canUseCopyTextureCHROMIUM(GLenum destFormat, GLenum destType, GLint level) 85{ 86 // FIXME: restriction of (RGB || RGBA)/UNSIGNED_BYTE/(Level 0) should be lifted when 87 // WebGraphicsContext3D::copyTextureCHROMIUM(...) are fully functional. 88 if ((destFormat == GL_RGB || destFormat == GL_RGBA) 89 && destType == GL_UNSIGNED_BYTE 90 && !level) 91 return true; 92 return false; 93} 94 95} // namespace blink 96