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 WorkerShareGroupState::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 Workervoid 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 Workervoid 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 WorkerShareGroup::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 WorkerShareGroup::~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 Workervoid 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 Workervoid 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 Workervoid 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 Workervoid 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 Workervoid 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