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.
6 #include "platform/graphics/gpu/Extensions3DUtil.h"
8 #include "public/platform/WebGraphicsContext3D.h"
9 #include "wtf/text/CString.h"
10 #include "wtf/text/StringHash.h"
16 void splitStringHelper(const String& str, HashSet<String>& set)
18 Vector<String> substrings;
19 str.split(' ', substrings);
20 for (size_t i = 0; i < substrings.size(); ++i)
21 set.add(substrings[i]);
24 } // anonymous namespace
26 PassOwnPtr<Extensions3DUtil> Extensions3DUtil::create(WebGraphicsContext3D* context)
28 OwnPtr<Extensions3DUtil> out = adoptPtr(new Extensions3DUtil(context));
29 if (!out->initializeExtensions())
34 Extensions3DUtil::Extensions3DUtil(WebGraphicsContext3D* context)
39 Extensions3DUtil::~Extensions3DUtil()
43 bool Extensions3DUtil::initializeExtensions()
45 if (m_context->isContextLost()) {
46 // Need to try to restore the context again later.
50 String extensionsString = m_context->getString(GL_EXTENSIONS);
51 splitStringHelper(extensionsString, m_enabledExtensions);
53 String requestableExtensionsString = m_context->getRequestableExtensionsCHROMIUM();
54 splitStringHelper(requestableExtensionsString, m_requestableExtensions);
60 bool Extensions3DUtil::supportsExtension(const String& name)
62 return m_enabledExtensions.contains(name) || m_requestableExtensions.contains(name);
65 bool Extensions3DUtil::ensureExtensionEnabled(const String& name)
67 if (m_enabledExtensions.contains(name))
70 if (m_requestableExtensions.contains(name)) {
71 m_context->requestExtensionCHROMIUM(name.ascii().data());
72 m_enabledExtensions.clear();
73 m_requestableExtensions.clear();
74 initializeExtensions();
76 return m_enabledExtensions.contains(name);
79 bool Extensions3DUtil::isExtensionEnabled(const String& name)
81 return m_enabledExtensions.contains(name);
84 bool Extensions3DUtil::canUseCopyTextureCHROMIUM(GLenum destFormat, GLenum destType, GLint level)
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