blob: 3d66b44fa402c6a8b59bbbe0745af7c43cd75795 [file] [log] [blame]
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "config.h"
#include "platform/graphics/gpu/Extensions3DUtil.h"
#include "public/platform/WebGraphicsContext3D.h"
#include "wtf/text/CString.h"
#include "wtf/text/StringHash.h"
namespace blink {
namespace {
void splitStringHelper(const String& str, HashSet<String>& set)
{
Vector<String> substrings;
str.split(' ', substrings);
for (size_t i = 0; i < substrings.size(); ++i)
set.add(substrings[i]);
}
} // anonymous namespace
PassOwnPtr<Extensions3DUtil> Extensions3DUtil::create(WebGraphicsContext3D* context)
{
OwnPtr<Extensions3DUtil> out = adoptPtr(new Extensions3DUtil(context));
if (!out->initializeExtensions())
return nullptr;
return out.release();
}
Extensions3DUtil::Extensions3DUtil(WebGraphicsContext3D* context)
: m_context(context)
{
}
Extensions3DUtil::~Extensions3DUtil()
{
}
bool Extensions3DUtil::initializeExtensions()
{
if (!m_context->makeContextCurrent()) {
// Most likely the GPU process exited and the attempt to reconnect to it failed.
// Need to try to restore the context again later.
return false;
}
if (m_context->isContextLost()) {
// Need to try to restore the context again later.
return false;
}
String extensionsString = m_context->getString(GL_EXTENSIONS);
splitStringHelper(extensionsString, m_enabledExtensions);
String requestableExtensionsString = m_context->getRequestableExtensionsCHROMIUM();
splitStringHelper(requestableExtensionsString, m_requestableExtensions);
return true;
}
bool Extensions3DUtil::supportsExtension(const String& name)
{
return m_enabledExtensions.contains(name) || m_requestableExtensions.contains(name);
}
bool Extensions3DUtil::ensureExtensionEnabled(const String& name)
{
if (m_enabledExtensions.contains(name))
return true;
if (m_requestableExtensions.contains(name)) {
m_context->requestExtensionCHROMIUM(name.ascii().data());
m_enabledExtensions.clear();
m_requestableExtensions.clear();
initializeExtensions();
}
return m_enabledExtensions.contains(name);
}
bool Extensions3DUtil::isExtensionEnabled(const String& name)
{
return m_enabledExtensions.contains(name);
}
bool Extensions3DUtil::canUseCopyTextureCHROMIUM(GLenum destFormat, GLenum destType, GLint level)
{
// FIXME: restriction of (RGB || RGBA)/UNSIGNED_BYTE/(Level 0) should be lifted when
// WebGraphicsContext3D::copyTextureCHROMIUM(...) are fully functional.
if ((destFormat == GL_RGB || destFormat == GL_RGBA)
&& destType == GL_UNSIGNED_BYTE
&& !level)
return true;
return false;
}
} // namespace blink