xref: /aosp_15_r20/external/angle/src/libANGLE/renderer/gl/egl/ContextEGL.cpp (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1 //
2 // Copyright 2018 The ANGLE Project Authors. All rights reserved.
3 // Use of this source code is governed by a BSD-style license that can be
4 // found in the LICENSE file.
5 //
6 
7 #include "libANGLE/renderer/gl/egl/ContextEGL.h"
8 
9 #include "libANGLE/renderer/gl/FramebufferGL.h"
10 #include "libANGLE/renderer/gl/StateManagerGL.h"
11 
12 namespace rx
13 {
14 
ContextEGL(const gl::State & state,gl::ErrorSet * errorSet,const std::shared_ptr<RendererEGL> & renderer,RobustnessVideoMemoryPurgeStatus robustnessVideoMemoryPurgeStatus)15 ContextEGL::ContextEGL(const gl::State &state,
16                        gl::ErrorSet *errorSet,
17                        const std::shared_ptr<RendererEGL> &renderer,
18                        RobustnessVideoMemoryPurgeStatus robustnessVideoMemoryPurgeStatus)
19     : ContextGL(state, errorSet, renderer, robustnessVideoMemoryPurgeStatus), mRendererEGL(renderer)
20 {}
21 
~ContextEGL()22 ContextEGL::~ContextEGL() {}
23 
acquireExternalContext(const gl::Context * context)24 void ContextEGL::acquireExternalContext(const gl::Context *context)
25 {
26     ASSERT(context->isExternal());
27 
28     if (!mExtState)
29     {
30         mExtState        = std::make_unique<ExternalContextState>();
31         const auto &caps = getCaps();
32         mExtState->textureBindings.resize(static_cast<size_t>(caps.maxCombinedTextureImageUnits));
33     }
34 
35     getStateManager()->syncFromNativeContext(getNativeExtensions(), mExtState.get());
36 
37     // Use current FBO as the default framebuffer when the external context is current.
38     // First save the current ID of the default framebuffer to restore in
39     // onUnMakeCurrent().
40     gl::Framebuffer *framebuffer = mState.getDefaultFramebuffer();
41     auto framebufferGL           = GetImplAs<FramebufferGL>(framebuffer);
42     mPrevDefaultFramebufferID    = framebufferGL->getFramebufferID();
43     framebufferGL->updateDefaultFramebufferID(mExtState->framebufferBinding);
44 }
45 
releaseExternalContext(const gl::Context * context)46 void ContextEGL::releaseExternalContext(const gl::Context *context)
47 {
48     ASSERT(context->isExternal());
49     ASSERT(mExtState);
50 
51     getStateManager()->restoreNativeContext(getNativeExtensions(), mExtState.get());
52 
53     // If the default framebuffer exists, update its ID (note that there can
54     // be multiple consecutive onUnMakeCurrent() calls in destruction, and
55     // the default FBO will have been unset by the first one).
56     gl::Framebuffer *framebuffer = mState.getDefaultFramebuffer();
57     if (framebuffer)
58     {
59         auto framebufferGL = GetImplAs<FramebufferGL>(framebuffer);
60         framebufferGL->updateDefaultFramebufferID(mPrevDefaultFramebufferID);
61     }
62 }
63 
getContext() const64 EGLContext ContextEGL::getContext() const
65 {
66     return mRendererEGL->getContext();
67 }
68 
69 }  // namespace rx
70