1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
|
// Copyright 2014 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "third_party/blink/renderer/platform/graphics/gpu/extensions_3d_util.h"
#include <memory>
#include "base/memory/ptr_util.h"
#include "gpu/GLES2/gl2extchromium.h"
#include "gpu/command_buffer/client/gles2_interface.h"
#include "gpu/command_buffer/common/gles2_cmd_copy_texture_chromium_utils.h"
#include "third_party/blink/renderer/platform/wtf/text/string_hash.h"
namespace blink {
namespace {
void SplitStringHelper(const String& str, HashSet<String>& set) {
Vector<String> substrings;
str.Split(' ', substrings);
for (const auto& substring : substrings)
set.insert(substring);
}
} // anonymous namespace
std::unique_ptr<Extensions3DUtil> Extensions3DUtil::Create(
gpu::gles2::GLES2Interface* gl) {
std::unique_ptr<Extensions3DUtil> out =
base::WrapUnique(new Extensions3DUtil(gl));
out->InitializeExtensions();
return out;
}
Extensions3DUtil::Extensions3DUtil(gpu::gles2::GLES2Interface* gl)
: gl_(gl), is_valid_(true) {}
Extensions3DUtil::~Extensions3DUtil() = default;
void Extensions3DUtil::InitializeExtensions() {
if (gl_->GetGraphicsResetStatusKHR() != GL_NO_ERROR) {
// If the context is lost don't initialize the extension strings.
// This will cause supportsExtension, ensureExtensionEnabled, and
// isExtensionEnabled to always return false.
is_valid_ = false;
return;
}
String extensions_string(gl_->GetString(GL_EXTENSIONS));
SplitStringHelper(extensions_string, enabled_extensions_);
String requestable_extensions_string(gl_->GetRequestableExtensionsCHROMIUM());
SplitStringHelper(requestable_extensions_string, requestable_extensions_);
}
bool Extensions3DUtil::SupportsExtension(const String& name) {
return enabled_extensions_.Contains(name) ||
requestable_extensions_.Contains(name);
}
bool Extensions3DUtil::EnsureExtensionEnabled(const String& name) {
if (enabled_extensions_.Contains(name))
return true;
if (requestable_extensions_.Contains(name)) {
gl_->RequestExtensionCHROMIUM(name.Ascii().c_str());
enabled_extensions_.clear();
requestable_extensions_.clear();
InitializeExtensions();
}
return enabled_extensions_.Contains(name);
}
bool Extensions3DUtil::IsExtensionEnabled(const String& name) {
return enabled_extensions_.Contains(name);
}
// static
bool Extensions3DUtil::CopyTextureCHROMIUMNeedsESSL3(GLenum dest_format) {
return gpu::gles2::CopyTextureCHROMIUMNeedsESSL3(dest_format);
}
// static
bool Extensions3DUtil::CanUseCopyTextureCHROMIUM(GLenum dest_target) {
switch (dest_target) {
case GL_TEXTURE_2D:
case GL_TEXTURE_RECTANGLE_ARB:
case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
return true;
default:
return false;
}
}
} // namespace blink
|