Name ANGLE_power_preference Name Strings EGL_ANGLE_power_preference Contributors Kenneth Russell Kimmo Kinnunen Contacts Kenneth Russell, Google Inc. (kbr 'at' google.com) Status Draft Version Version 3, March 10, 2022 Number EGL Extension #?? Dependencies This extension is written against the wording of the EGL 1.4 Specification. Overview This extension allows selection of the high- or low-power GPU on dual-GPU systems, specifically on macOS. New Types None New Procedures and Functions void eglReleaseHighPowerGPUANGLE( EGLDisplay dpy, EGLContext context); void eglReacquireHighPowerGPUANGLE( EGLDisplay dpy, EGLContext context); void eglHandleGPUSwitchANGLE(EGLDisplay dpy); void eglForceGPUSwitchANGLE(EGLDisplay dpy, EGLint gpuIDHigh, EGLint gpuIDLow); New Tokens Accepted as an attribute name in the <*attrib_list> argument to eglCreateContext: EGL_POWER_PREFERENCE_ANGLE 0x3482 Accepted as an attribute value in the <*attrib_list> argument to eglCreateContext: EGL_LOW_POWER_ANGLE 0x0001 EGL_HIGH_POWER_ANGLE 0x0002 Additions to the EGL 1.4 Specification Add the following to section 3.7.1 "Creating Rendering Contexts": EGL_POWER_PREFERENCE_ANGLE indicates whether the context should be created on the integrated (low-power) or discrete (high-power) GPU on dual-GPU systems. EGL_POWER_PREFERENCE_ANGLE is only a legal context creation attribute when the EGL_ANGLE_power_preference extension is advertised. The valid values for this attribute are EGL_LOW_POWER_ANGLE and EGL_HIGH_POWER_ANGLE. If this extension is advertised and this context creation attribute is not specified, the default value is EGL_LOW_POWER_ANGLE. The containing application must set the NSSupportsAutomaticGraphicsSwitching attribute to true in its Info.plist in order for this extension to operate as advertised. eglReleaseHighPowerGPUANGLE, when passed an EGLContext allocated with the EGL_POWER_PREFERENCE_ANGLE context creation attribute set to EGL_HIGH_POWER_ANGLE, will cause that context to release its hold on the high-power GPU. eglReacquireHighPowerGPUANGLE, when passed an EGLContext allocated with the EGL_POWER_PREFERENCE_ANGLE context creation attribute set to EGL_HIGH_POWER_ANGLE and which was previously released via eglReleaseHighPowerGPUANGLE, will cause that context to reacquire its hold on the high-power GPU. eglReleaseHighPowerGPUANGLE and eglReacquireHighPowerGPUANGLE have no effect on contexts that were allocated with the EGL_LOW_POWER_ANGLE preference, or contexts not allocated with either preference. For either eglReleaseHighPowerGPUANGLE or eglReacquireHighPowerGPUANGLE: If |dpy| is not a valid display, an EGL_BAD_DISPLAY error is generated. if |dpy| is an uninitialized display, an EGL_NOT_INITIALIZED error is generated. If |context| is not a valid context, an EGL_BAD_CONTEXT error is generated. eglHandleGPUSwitchANGLE should be called in response to a display reconfiguration callback (registered via CGDisplayRegisterReconfigurationCallback) in order to complete transitions between the low-power and high-power GPUs. For calls to this function: If |dpy| is not a valid display, an EGL_BAD_DISPLAY error is generated. if |dpy| is an uninitialized display, an EGL_NOT_INITIALIZED error is generated. eglForceGPUSwitchANGLE should be called with an explicit gpuID to transition between the low-power and high-power GPUs. This should be called if the environment is altered in such a way that eglHandleGPUSwitchANGLE will not work. On the macOS platform, the sandbox policy might prevent eglHandleGPUSwitchANGLE from obtaining the current main active GPU. In these cases, the gpuID can be obtained another way (e.g in other process) and communicated via eglForceGPUSwitchANGLE to the OpenGL display. If gpuID does not match any available GPUs in the system, nothing happens. For calls to this function: If |dpy| is not a valid display, an EGL_BAD_DISPLAY error is generated. if |dpy| is an uninitialized display, an EGL_NOT_INITIALIZED error is generated. |gpuIDHigh| the high 32 bits of the IOKit registry ID of the GPU to use for all contexts in the display. |gpuIDLow| the low 32 bits of the IOKit registry ID of the GPU to use for all contexts in the display. Issues None yet. Revision History Rev. Date Author Changes ---- ------------- --------- ---------------------------------------- 1 Apr 16, 2019 kbr Initial version 2 June 5, 2020 kbr Add eglReleaseHighPowerGPUANGLE, eglReacquireHighPowerGPUANGLE, and eglHandleGPUSwitchANGLE 3 March 10, 2022 kkinnunen Add eglForceGPUSwitchANGLE