// // Copyright 2023 The ANGLE Project Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // // ShareGroup.h: Defines the egl::ShareGroup class, representing the collection of contexts in a // share group. #include "libANGLE/ShareGroup.h" #include #include #include #include #include "common/debug.h" #include "common/platform_helpers.h" #include "libANGLE/Context.h" #include "libANGLE/capture/FrameCapture.h" #include "libANGLE/renderer/DisplayImpl.h" #include "libANGLE/renderer/ShareGroupImpl.h" namespace egl { // ShareGroupState ShareGroupState::ShareGroupState() : mAnyContextWithRobustness(false), mAnyContextWithDisplayTextureShareGroup(false) {} ShareGroupState::~ShareGroupState() = default; void ShareGroupState::addSharedContext(gl::Context *context) { mContexts.insert(std::pair(context->id().value, context)); if (context->isRobustnessEnabled()) { mAnyContextWithRobustness = true; } if (context->getState().hasDisplayTextureShareGroup()) { mAnyContextWithDisplayTextureShareGroup = true; } } void ShareGroupState::removeSharedContext(gl::Context *context) { mContexts.erase(context->id().value); } // ShareGroup ShareGroup::ShareGroup(rx::EGLImplFactory *factory) : mRefCount(1), mImplementation(factory->createShareGroup(mState)), mFrameCaptureShared(new angle::FrameCaptureShared) {} ShareGroup::~ShareGroup() { SafeDelete(mImplementation); } void ShareGroup::addRef() { // This is protected by global lock, so no atomic is required mRefCount++; } void ShareGroup::release(const Display *display) { if (--mRefCount == 0) { if (mImplementation) { mImplementation->onDestroy(display); } delete this; } } void ShareGroup::finishAllContexts() { for (auto shareContext : mState.getContexts()) { if (shareContext.second->hasBeenCurrent() && !shareContext.second->isDestroyed()) { shareContext.second->finish(); } } } void ShareGroup::addSharedContext(gl::Context *context) { mState.addSharedContext(context); mImplementation->onContextAdd(); } void ShareGroup::removeSharedContext(gl::Context *context) { mState.removeSharedContext(context); } } // namespace egl