| Index: gpu/command_buffer/service/context_group.cc
|
| diff --git a/gpu/command_buffer/service/context_group.cc b/gpu/command_buffer/service/context_group.cc
|
| index d8487c73fc3fd1fb3d48fe8236319afebe38d5a5..abf262d844d296d2e8c2bd14568a2c07927f3b15 100644
|
| --- a/gpu/command_buffer/service/context_group.cc
|
| +++ b/gpu/command_buffer/service/context_group.cc
|
| @@ -36,7 +36,6 @@ ContextGroup::ContextGroup(
|
| : mailbox_manager_(mailbox_manager ? mailbox_manager : new MailboxManager),
|
| image_manager_(image_manager ? image_manager : new ImageManager),
|
| memory_tracker_(memory_tracker),
|
| - num_contexts_(0),
|
| enforce_gl_minimums_(CommandLine::ForCurrentProcess()->HasSwitch(
|
| switches::kEnforceGLMinimums)),
|
| bind_generates_resource_(bind_generates_resource),
|
| @@ -71,10 +70,13 @@ static void GetIntegerv(GLenum pname, uint32* var) {
|
| *var = value;
|
| }
|
|
|
| -bool ContextGroup::Initialize(const DisallowedFeatures& disallowed_features,
|
| - const char* allowed_features) {
|
| - if (num_contexts_ > 0) {
|
| - ++num_contexts_;
|
| +bool ContextGroup::Initialize(
|
| + GLES2Decoder* decoder,
|
| + const DisallowedFeatures& disallowed_features,
|
| + const char* allowed_features) {
|
| + // If we've already initialized the group just add the context.
|
| + if (HaveContexts()) {
|
| + decoders_.push_back(base::AsWeakPtr<GLES2Decoder>(decoder));
|
| return true;
|
| }
|
|
|
| @@ -201,14 +203,31 @@ bool ContextGroup::Initialize(const DisallowedFeatures& disallowed_features,
|
| return false;
|
| }
|
|
|
| - ++num_contexts_;
|
| + decoders_.push_back(base::AsWeakPtr<GLES2Decoder>(decoder));
|
| return true;
|
| }
|
|
|
| -void ContextGroup::Destroy(bool have_context) {
|
| - DCHECK(num_contexts_ > 0);
|
| - if (--num_contexts_ > 0)
|
| +namespace {
|
| +
|
| +bool IsNull(const base::WeakPtr<gles2::GLES2Decoder>& decoder) {
|
| + return !decoder;
|
| +}
|
| +
|
| +} // namespace anonymous
|
| +
|
| +bool ContextGroup::HaveContexts() {
|
| + decoders_.erase(std::remove_if(decoders_.begin(), decoders_.end(), IsNull),
|
| + decoders_.end());
|
| + return !decoders_.empty();
|
| +}
|
| +
|
| +void ContextGroup::Destroy(GLES2Decoder* decoder, bool have_context) {
|
| + decoders_.erase(std::remove(decoders_.begin(), decoders_.end(), decoder),
|
| + decoders_.end());
|
| + // If we still have contexts do nothing.
|
| + if (HaveContexts()) {
|
| return;
|
| + }
|
|
|
| if (buffer_manager_ != NULL) {
|
| buffer_manager_->Destroy(have_context);
|
| @@ -263,8 +282,16 @@ uint32 ContextGroup::GetMemRepresented() const {
|
| return total;
|
| }
|
|
|
| +void ContextGroup::LoseContexts(GLenum reset_status) {
|
| + for (size_t ii = 0; ii < decoders_.size(); ++ii) {
|
| + if (decoders_[ii]) {
|
| + decoders_[ii]->LoseContext(reset_status);
|
| + }
|
| + }
|
| +}
|
| +
|
| ContextGroup::~ContextGroup() {
|
| - CHECK(num_contexts_ == 0);
|
| + CHECK(!HaveContexts());
|
| }
|
|
|
| bool ContextGroup::CheckGLFeature(GLint min_required, GLint* v) {
|
|
|