xref: /aosp_15_r20/external/angle/src/libANGLE/ShareGroup.cpp (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2023 The ANGLE Project Authors. All rights reserved.
3*8975f5c5SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
4*8975f5c5SAndroid Build Coastguard Worker // found in the LICENSE file.
5*8975f5c5SAndroid Build Coastguard Worker //
6*8975f5c5SAndroid Build Coastguard Worker 
7*8975f5c5SAndroid Build Coastguard Worker // ShareGroup.h: Defines the egl::ShareGroup class, representing the collection of contexts in a
8*8975f5c5SAndroid Build Coastguard Worker // share group.
9*8975f5c5SAndroid Build Coastguard Worker 
10*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/ShareGroup.h"
11*8975f5c5SAndroid Build Coastguard Worker 
12*8975f5c5SAndroid Build Coastguard Worker #include <algorithm>
13*8975f5c5SAndroid Build Coastguard Worker #include <iterator>
14*8975f5c5SAndroid Build Coastguard Worker 
15*8975f5c5SAndroid Build Coastguard Worker #include <EGL/eglext.h>
16*8975f5c5SAndroid Build Coastguard Worker #include <platform/PlatformMethods.h>
17*8975f5c5SAndroid Build Coastguard Worker 
18*8975f5c5SAndroid Build Coastguard Worker #include "common/debug.h"
19*8975f5c5SAndroid Build Coastguard Worker #include "common/platform_helpers.h"
20*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Context.h"
21*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/capture/FrameCapture.h"
22*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/DisplayImpl.h"
23*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/ShareGroupImpl.h"
24*8975f5c5SAndroid Build Coastguard Worker 
25*8975f5c5SAndroid Build Coastguard Worker namespace egl
26*8975f5c5SAndroid Build Coastguard Worker {
27*8975f5c5SAndroid Build Coastguard Worker // ShareGroupState
ShareGroupState()28*8975f5c5SAndroid Build Coastguard Worker ShareGroupState::ShareGroupState()
29*8975f5c5SAndroid Build Coastguard Worker     : mAnyContextWithRobustness(false), mAnyContextWithDisplayTextureShareGroup(false)
30*8975f5c5SAndroid Build Coastguard Worker {}
31*8975f5c5SAndroid Build Coastguard Worker ShareGroupState::~ShareGroupState() = default;
32*8975f5c5SAndroid Build Coastguard Worker 
addSharedContext(gl::Context * context)33*8975f5c5SAndroid Build Coastguard Worker void ShareGroupState::addSharedContext(gl::Context *context)
34*8975f5c5SAndroid Build Coastguard Worker {
35*8975f5c5SAndroid Build Coastguard Worker     mContexts.insert(std::pair(context->id().value, context));
36*8975f5c5SAndroid Build Coastguard Worker 
37*8975f5c5SAndroid Build Coastguard Worker     if (context->isRobustnessEnabled())
38*8975f5c5SAndroid Build Coastguard Worker     {
39*8975f5c5SAndroid Build Coastguard Worker         mAnyContextWithRobustness = true;
40*8975f5c5SAndroid Build Coastguard Worker     }
41*8975f5c5SAndroid Build Coastguard Worker     if (context->getState().hasDisplayTextureShareGroup())
42*8975f5c5SAndroid Build Coastguard Worker     {
43*8975f5c5SAndroid Build Coastguard Worker         mAnyContextWithDisplayTextureShareGroup = true;
44*8975f5c5SAndroid Build Coastguard Worker     }
45*8975f5c5SAndroid Build Coastguard Worker }
46*8975f5c5SAndroid Build Coastguard Worker 
removeSharedContext(gl::Context * context)47*8975f5c5SAndroid Build Coastguard Worker void ShareGroupState::removeSharedContext(gl::Context *context)
48*8975f5c5SAndroid Build Coastguard Worker {
49*8975f5c5SAndroid Build Coastguard Worker     mContexts.erase(context->id().value);
50*8975f5c5SAndroid Build Coastguard Worker }
51*8975f5c5SAndroid Build Coastguard Worker 
52*8975f5c5SAndroid Build Coastguard Worker // ShareGroup
ShareGroup(rx::EGLImplFactory * factory)53*8975f5c5SAndroid Build Coastguard Worker ShareGroup::ShareGroup(rx::EGLImplFactory *factory)
54*8975f5c5SAndroid Build Coastguard Worker     : mRefCount(1),
55*8975f5c5SAndroid Build Coastguard Worker       mImplementation(factory->createShareGroup(mState)),
56*8975f5c5SAndroid Build Coastguard Worker       mFrameCaptureShared(new angle::FrameCaptureShared)
57*8975f5c5SAndroid Build Coastguard Worker {}
58*8975f5c5SAndroid Build Coastguard Worker 
~ShareGroup()59*8975f5c5SAndroid Build Coastguard Worker ShareGroup::~ShareGroup()
60*8975f5c5SAndroid Build Coastguard Worker {
61*8975f5c5SAndroid Build Coastguard Worker     SafeDelete(mImplementation);
62*8975f5c5SAndroid Build Coastguard Worker }
63*8975f5c5SAndroid Build Coastguard Worker 
addRef()64*8975f5c5SAndroid Build Coastguard Worker void ShareGroup::addRef()
65*8975f5c5SAndroid Build Coastguard Worker {
66*8975f5c5SAndroid Build Coastguard Worker     // This is protected by global lock, so no atomic is required
67*8975f5c5SAndroid Build Coastguard Worker     mRefCount++;
68*8975f5c5SAndroid Build Coastguard Worker }
69*8975f5c5SAndroid Build Coastguard Worker 
release(const Display * display)70*8975f5c5SAndroid Build Coastguard Worker void ShareGroup::release(const Display *display)
71*8975f5c5SAndroid Build Coastguard Worker {
72*8975f5c5SAndroid Build Coastguard Worker     if (--mRefCount == 0)
73*8975f5c5SAndroid Build Coastguard Worker     {
74*8975f5c5SAndroid Build Coastguard Worker         if (mImplementation)
75*8975f5c5SAndroid Build Coastguard Worker         {
76*8975f5c5SAndroid Build Coastguard Worker             mImplementation->onDestroy(display);
77*8975f5c5SAndroid Build Coastguard Worker         }
78*8975f5c5SAndroid Build Coastguard Worker         delete this;
79*8975f5c5SAndroid Build Coastguard Worker     }
80*8975f5c5SAndroid Build Coastguard Worker }
81*8975f5c5SAndroid Build Coastguard Worker 
finishAllContexts()82*8975f5c5SAndroid Build Coastguard Worker void ShareGroup::finishAllContexts()
83*8975f5c5SAndroid Build Coastguard Worker {
84*8975f5c5SAndroid Build Coastguard Worker     for (auto shareContext : mState.getContexts())
85*8975f5c5SAndroid Build Coastguard Worker     {
86*8975f5c5SAndroid Build Coastguard Worker         if (shareContext.second->hasBeenCurrent() && !shareContext.second->isDestroyed())
87*8975f5c5SAndroid Build Coastguard Worker         {
88*8975f5c5SAndroid Build Coastguard Worker             shareContext.second->finish();
89*8975f5c5SAndroid Build Coastguard Worker         }
90*8975f5c5SAndroid Build Coastguard Worker     }
91*8975f5c5SAndroid Build Coastguard Worker }
92*8975f5c5SAndroid Build Coastguard Worker 
addSharedContext(gl::Context * context)93*8975f5c5SAndroid Build Coastguard Worker void ShareGroup::addSharedContext(gl::Context *context)
94*8975f5c5SAndroid Build Coastguard Worker {
95*8975f5c5SAndroid Build Coastguard Worker     mState.addSharedContext(context);
96*8975f5c5SAndroid Build Coastguard Worker     mImplementation->onContextAdd();
97*8975f5c5SAndroid Build Coastguard Worker }
98*8975f5c5SAndroid Build Coastguard Worker 
removeSharedContext(gl::Context * context)99*8975f5c5SAndroid Build Coastguard Worker void ShareGroup::removeSharedContext(gl::Context *context)
100*8975f5c5SAndroid Build Coastguard Worker {
101*8975f5c5SAndroid Build Coastguard Worker     mState.removeSharedContext(context);
102*8975f5c5SAndroid Build Coastguard Worker }
103*8975f5c5SAndroid Build Coastguard Worker }  // namespace egl
104