Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "ui/gl/gl_context_cgl.h" | 5 #include "ui/gl/gl_context_cgl.h" |
| 6 | 6 |
| 7 #include <OpenGL/CGLRenderers.h> | 7 #include <OpenGL/CGLRenderers.h> |
| 8 #include <OpenGL/CGLTypes.h> | 8 #include <OpenGL/CGLTypes.h> |
| 9 | 9 |
| 10 #include <memory> | 10 #include <memory> |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 107 static_cast<GLContextCGL*>(share_group()->GetContext()) : nullptr; | 107 static_cast<GLContextCGL*>(share_group()->GetContext()) : nullptr; |
| 108 | 108 |
| 109 CGLPixelFormatObj format = GetPixelFormat(); | 109 CGLPixelFormatObj format = GetPixelFormat(); |
| 110 if (!format) | 110 if (!format) |
| 111 return false; | 111 return false; |
| 112 | 112 |
| 113 // If using the discrete gpu, create a pixel format requiring it before we | 113 // If using the discrete gpu, create a pixel format requiring it before we |
| 114 // create the context. | 114 // create the context. |
| 115 if (!ui::GpuSwitchingManager::GetInstance()->SupportsDualGpus() || | 115 if (!ui::GpuSwitchingManager::GetInstance()->SupportsDualGpus() || |
| 116 gpu_preference == PreferDiscreteGpu) { | 116 gpu_preference == PreferDiscreteGpu) { |
| 117 std::vector<CGLPixelFormatAttribute> discrete_attribs; | 117 if (!AllocateDiscretePixelFormat()) |
| 118 discrete_attribs.push_back((CGLPixelFormatAttribute) 0); | |
| 119 GLint num_pixel_formats; | |
| 120 if (CGLChoosePixelFormat(&discrete_attribs.front(), | |
| 121 &discrete_pixelformat_, | |
| 122 &num_pixel_formats) != kCGLNoError) { | |
| 123 LOG(ERROR) << "Error choosing pixel format."; | |
| 124 return false; | 118 return false; |
| 125 } | |
| 126 // The renderer might be switched after this, so ignore the saved ID. | |
| 127 share_group()->SetRendererID(-1); | |
| 128 } | 119 } |
| 129 | 120 |
| 130 CGLError res = CGLCreateContext( | 121 CGLError res = CGLCreateContext( |
| 131 format, | 122 format, |
| 132 share_context ? | 123 share_context ? |
| 133 static_cast<CGLContextObj>(share_context->GetHandle()) : nullptr, | 124 static_cast<CGLContextObj>(share_context->GetHandle()) : nullptr, |
| 134 reinterpret_cast<CGLContextObj*>(&context_)); | 125 reinterpret_cast<CGLContextObj*>(&context_)); |
| 135 if (res != kCGLNoError) { | 126 if (res != kCGLNoError) { |
| 136 LOG(ERROR) << "Error creating context."; | 127 LOG(ERROR) << "Error creating context."; |
| 137 Destroy(); | 128 Destroy(); |
| 138 return false; | 129 return false; |
| 139 } | 130 } |
| 140 | 131 |
| 141 gpu_preference_ = gpu_preference; | 132 gpu_preference_ = gpu_preference; |
| 142 // Contexts that prefer integrated gpu are known to use only the subset of GL | 133 // Contexts that prefer integrated gpu are known to use only the subset of GL |
| 143 // that can be safely migrated between the iGPU and the dGPU. Mark those | 134 // that can be safely migrated between the iGPU and the dGPU. Mark those |
| 144 // contexts as safe to forcibly transition between the GPUs by default. | 135 // contexts as safe to forcibly transition between the GPUs by default. |
| 145 // http://crbug.com/180876, http://crbug.com/227228 | 136 // http://crbug.com/180876, http://crbug.com/227228 |
| 146 safe_to_force_gpu_switch_ = gpu_preference == PreferIntegratedGpu; | 137 safe_to_force_gpu_switch_ = gpu_preference == PreferIntegratedGpu; |
| 147 return true; | 138 return true; |
| 148 } | 139 } |
| 149 | 140 |
| 141 bool GLContextCGL::AllocateDiscretePixelFormat() { | |
| 142 std::vector<CGLPixelFormatAttribute> discrete_attribs; | |
| 143 discrete_attribs.push_back((CGLPixelFormatAttribute) 0); | |
| 144 GLint num_pixel_formats; | |
| 145 if (CGLChoosePixelFormat(&discrete_attribs.front(), | |
| 146 &discrete_pixelformat_, | |
| 147 &num_pixel_formats) != kCGLNoError) { | |
| 148 LOG(ERROR) << "Error choosing discrete pixel format."; | |
| 149 return false; | |
| 150 } | |
| 151 // The renderer might be switched after this, so ignore the saved ID. | |
| 152 share_group()->SetRendererID(-1); | |
| 153 return true; | |
| 154 } | |
| 155 | |
| 156 void GLContextCGL::ReleaseDiscretePixelFormat() { | |
| 157 CGLReleasePixelFormat(discrete_pixelformat_); | |
| 158 discrete_pixelformat_ = nullptr; | |
| 159 } | |
| 160 | |
| 150 void GLContextCGL::Destroy() { | 161 void GLContextCGL::Destroy() { |
| 151 if (yuv_to_rgb_converter_) { | 162 if (yuv_to_rgb_converter_) { |
| 152 ScopedCGLSetCurrentContext(static_cast<CGLContextObj>(context_)); | 163 ScopedCGLSetCurrentContext(static_cast<CGLContextObj>(context_)); |
| 153 yuv_to_rgb_converter_.reset(); | 164 yuv_to_rgb_converter_.reset(); |
| 154 } | 165 } |
| 155 if (discrete_pixelformat_) { | 166 if (discrete_pixelformat_) { |
| 156 if (base::MessageLoop::current() != nullptr) { | 167 if (base::MessageLoop::current() != nullptr) { |
| 157 // Delay releasing the pixel format for 10 seconds to reduce the number of | 168 // Delay releasing the pixel format for 10 seconds to reduce the number of |
| 158 // unnecessary GPU switches. | 169 // unnecessary GPU switches. |
| 159 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( | 170 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( |
| (...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 286 | 297 |
| 287 | 298 |
| 288 GLContextCGL::~GLContextCGL() { | 299 GLContextCGL::~GLContextCGL() { |
| 289 Destroy(); | 300 Destroy(); |
| 290 } | 301 } |
| 291 | 302 |
| 292 GpuPreference GLContextCGL::GetGpuPreference() { | 303 GpuPreference GLContextCGL::GetGpuPreference() { |
| 293 return gpu_preference_; | 304 return gpu_preference_; |
| 294 } | 305 } |
| 295 | 306 |
| 307 void GLContextCGL::SetPerformancePreference(GpuPerformancePreference pref) { | |
| 308 if (pref == PreferLowPower) { | |
| 309 if (discrete_pixelformat_) | |
| 310 ReleaseDiscretePixelFormat(); | |
| 311 } else { | |
| 312 if (gpu_preference_ == PreferDiscreteGpu && !discrete_pixelformat_) | |
| 313 AllocateDiscretePixelFormat(); | |
|
jbauman
2017/01/19 01:13:14
I'm not sure this would actually switch the contex
Ken Russell (switch to Gerrit)
2017/01/20 04:34:52
Thanks for tracking down that change. I'd remember
| |
| 314 } | |
| 315 } | |
| 316 | |
| 296 } // namespace gl | 317 } // namespace gl |
| OLD | NEW |