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