| Index: ui/gl/gl_context_cgl.cc
|
| diff --git a/ui/gl/gl_context_cgl.cc b/ui/gl/gl_context_cgl.cc
|
| index 8affe56f683a97bd7cb56aa072337b16e09842c1..1f79ea0eb0b6b308d6cb031b65f5c3acc8c4ae98 100644
|
| --- a/ui/gl/gl_context_cgl.cc
|
| +++ b/ui/gl/gl_context_cgl.cc
|
| @@ -5,6 +5,7 @@
|
| #include "ui/gl/gl_context_cgl.h"
|
|
|
| #include <OpenGL/CGLRenderers.h>
|
| +#include <OpenGL/CGLTypes.h>
|
| #include <vector>
|
|
|
| #include "base/debug/trace_event.h"
|
| @@ -154,6 +155,59 @@ void GLContextCGL::SetSwapInterval(int interval) {
|
| LOG(WARNING) << "GLContex: GLContextCGL::SetSwapInterval is ignored.";
|
| }
|
|
|
| +
|
| +bool GLContextCGL::GetTotalGpuMemory(size_t* bytes) {
|
| + DCHECK(bytes);
|
| + *bytes = 0;
|
| +
|
| + CGLContextObj context = reinterpret_cast<CGLContextObj>(context_);
|
| + if (!context)
|
| + return false;
|
| +
|
| + // Retrieve the current renderer ID
|
| + GLint current_renderer_id = 0;
|
| + if (CGLGetParameter(context,
|
| + kCGLCPCurrentRendererID,
|
| + ¤t_renderer_id) != kCGLNoError)
|
| + return false;
|
| +
|
| + // Iterate through the list of all renderers
|
| + GLuint display_mask = static_cast<GLuint>(-1);
|
| + CGLRendererInfoObj renderer_info = NULL;
|
| + GLint num_renderers = 0;
|
| + if (CGLQueryRendererInfo(display_mask,
|
| + &renderer_info,
|
| + &num_renderers) != kCGLNoError)
|
| + return false;
|
| +
|
| + ScopedCGLRendererInfoObj scoper(renderer_info);
|
| +
|
| + for (GLint renderer_index = 0;
|
| + renderer_index < num_renderers;
|
| + ++renderer_index) {
|
| + // Skip this if this renderer is not the current renderer.
|
| + GLint renderer_id = 0;
|
| + if (CGLDescribeRenderer(renderer_info,
|
| + renderer_index,
|
| + kCGLRPRendererID,
|
| + &renderer_id) != kCGLNoError)
|
| + continue;
|
| + if (renderer_id != current_renderer_id)
|
| + continue;
|
| + // Retrieve the video memory for the renderer.
|
| + GLint video_memory = 0;
|
| + if (CGLDescribeRenderer(renderer_info,
|
| + renderer_index,
|
| + kCGLRPVideoMemory,
|
| + &video_memory) != kCGLNoError)
|
| + continue;
|
| + *bytes = video_memory;
|
| + return true;
|
| + }
|
| +
|
| + return false;
|
| +}
|
| +
|
| GLContextCGL::~GLContextCGL() {
|
| Destroy();
|
| }
|
| @@ -173,4 +227,8 @@ void GLContextCGL::ForceUseOfDiscreteGPU() {
|
| // format is deliberately leaked.
|
| }
|
|
|
| +void ScopedCGLDestroyRendererInfo::operator()(CGLRendererInfoObj x) const {
|
| + CGLDestroyRendererInfo(x);
|
| +}
|
| +
|
| } // namespace gfx
|
|
|