xref: /aosp_15_r20/external/angle/src/libANGLE/renderer/gl/cgl/ContextCGL.cpp (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1 //
2 // Copyright 2019 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 // ContextCGL:
7 //   Mac-specific subclass of ContextGL.
8 //
9 
10 #include "libANGLE/renderer/gl/cgl/ContextCGL.h"
11 
12 #include "libANGLE/Context.h"
13 #include "libANGLE/Display.h"
14 #include "libANGLE/renderer/gl/cgl/DisplayCGL.h"
15 
16 namespace rx
17 {
18 
ContextCGL(DisplayCGL * display,const gl::State & state,gl::ErrorSet * errorSet,const std::shared_ptr<RendererGL> & renderer,bool usesDiscreteGPU)19 ContextCGL::ContextCGL(DisplayCGL *display,
20                        const gl::State &state,
21                        gl::ErrorSet *errorSet,
22                        const std::shared_ptr<RendererGL> &renderer,
23                        bool usesDiscreteGPU)
24     : ContextGL(state, errorSet, renderer, RobustnessVideoMemoryPurgeStatus::NOT_REQUESTED),
25       mUsesDiscreteGpu(usesDiscreteGPU),
26       mReleasedDiscreteGpu(false)
27 {
28     if (mUsesDiscreteGpu)
29     {
30         (void)display->referenceDiscreteGPU();
31     }
32 }
33 
releaseHighPowerGPU(gl::Context * context)34 egl::Error ContextCGL::releaseHighPowerGPU(gl::Context *context)
35 {
36     if (mUsesDiscreteGpu && !mReleasedDiscreteGpu)
37     {
38         mReleasedDiscreteGpu = true;
39         return GetImplAs<DisplayCGL>(context->getDisplay())->unreferenceDiscreteGPU();
40     }
41 
42     return egl::NoError();
43 }
44 
reacquireHighPowerGPU(gl::Context * context)45 egl::Error ContextCGL::reacquireHighPowerGPU(gl::Context *context)
46 {
47     if (mUsesDiscreteGpu && mReleasedDiscreteGpu)
48     {
49         mReleasedDiscreteGpu = false;
50         return GetImplAs<DisplayCGL>(context->getDisplay())->referenceDiscreteGPU();
51     }
52 
53     return egl::NoError();
54 }
55 
onDestroy(const gl::Context * context)56 void ContextCGL::onDestroy(const gl::Context *context)
57 {
58     if (mUsesDiscreteGpu && !mReleasedDiscreteGpu)
59     {
60         (void)GetImplAs<DisplayCGL>(context->getDisplay())->unreferenceDiscreteGPU();
61     }
62     ContextGL::onDestroy(context);
63 }
64 
65 }  // namespace rx
66