1// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef UI_GL_SCOPED_CGL_H_
6#define UI_GL_SCOPED_CGL_H_
7
8#include <OpenGL/OpenGL.h>
9
10#include "base/mac/scoped_typeref.h"
11#include "ui/gl/gl_export.h"
12
13namespace base {
14
15template<>
16struct ScopedTypeRefTraits<CGLContextObj> {
17  static void Retain(CGLContextObj object) {
18    CGLRetainContext(object);
19  }
20  static void Release(CGLContextObj object) {
21    CGLReleaseContext(object);
22  }
23};
24
25template<>
26struct ScopedTypeRefTraits<CGLPixelFormatObj> {
27  static void Retain(CGLPixelFormatObj object) {
28    CGLRetainPixelFormat(object);
29  }
30  static void Release(CGLPixelFormatObj object) {
31    CGLReleasePixelFormat(object);
32  }
33};
34
35}  // namespace base
36
37namespace gfx {
38
39class GL_EXPORT ScopedCGLSetCurrentContext {
40 public:
41  explicit ScopedCGLSetCurrentContext(CGLContextObj context);
42  ~ScopedCGLSetCurrentContext();
43 private:
44  // Note that if a context is destroyed when it is current, then the current
45  // context is changed to NULL. Take out a reference on |previous_context_| to
46  // preserve this behavior (when this falls out of scope, |previous_context_|
47  // will be made current, then released, so NULL will be current if that
48  // release destroys the context).
49  base::ScopedTypeRef<CGLContextObj> previous_context_;
50
51  DISALLOW_COPY_AND_ASSIGN(ScopedCGLSetCurrentContext);
52};
53
54}  // namespace gfx
55
56#endif  // UI_GL_SCOPED_CGL_H_
57