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