| // | |
| // 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 <algorithm> | |
| #include <iterator> | |
| #include <EGL/eglext.h> | |
| #include <platform/PlatformMethods.h> | |
| #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 |