• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
3 // found in the LICENSE file.
4 
5 #include "ui/gl/scoped_binders.h"
6 #include "ui/gl/gl_bindings.h"
7 #include "ui/gl/gl_context.h"
8 #include "ui/gl/gl_state_restorer.h"
9 
10 namespace gfx {
11 
ScopedFrameBufferBinder(unsigned int fbo)12 ScopedFrameBufferBinder::ScopedFrameBufferBinder(unsigned int fbo)
13     : state_restorer_(!GLContext::GetCurrent()
14                           ? NULL
15                           : GLContext::GetCurrent()->GetGLStateRestorer()),
16       old_fbo_(-1) {
17   if (!state_restorer_)
18     glGetIntegerv(GL_FRAMEBUFFER_BINDING, &old_fbo_);
19   glBindFramebufferEXT(GL_FRAMEBUFFER, fbo);
20 }
21 
~ScopedFrameBufferBinder()22 ScopedFrameBufferBinder::~ScopedFrameBufferBinder() {
23   if (state_restorer_) {
24     DCHECK(!!GLContext::GetCurrent());
25     DCHECK_EQ(state_restorer_, GLContext::GetCurrent()->GetGLStateRestorer());
26     state_restorer_->RestoreFramebufferBindings();
27   } else {
28     glBindFramebufferEXT(GL_FRAMEBUFFER, old_fbo_);
29   }
30 }
31 
ScopedTextureBinder(unsigned int target,unsigned int id)32 ScopedTextureBinder::ScopedTextureBinder(unsigned int target, unsigned int id)
33     : state_restorer_(!GLContext::GetCurrent()
34                           ? NULL
35                           : GLContext::GetCurrent()->GetGLStateRestorer()),
36       target_(target),
37       old_id_(-1) {
38   if (!state_restorer_) {
39     GLenum target_getter = 0;
40     switch (target) {
41       case GL_TEXTURE_2D:
42         target_getter = GL_TEXTURE_BINDING_2D;
43         break;
44       case GL_TEXTURE_CUBE_MAP:
45         target_getter = GL_TEXTURE_BINDING_CUBE_MAP;
46         break;
47       case GL_TEXTURE_EXTERNAL_OES:
48         target_getter = GL_TEXTURE_BINDING_EXTERNAL_OES;
49         break;
50       default:
51         NOTIMPLEMENTED() << "Target not part of OpenGL ES 2.0 spec.";
52     }
53     glGetIntegerv(target_getter, &old_id_);
54   }
55   glBindTexture(target_, id);
56 }
57 
~ScopedTextureBinder()58 ScopedTextureBinder::~ScopedTextureBinder() {
59   if (state_restorer_) {
60     DCHECK(!!GLContext::GetCurrent());
61     DCHECK_EQ(state_restorer_, GLContext::GetCurrent()->GetGLStateRestorer());
62     state_restorer_->RestoreActiveTextureUnitBinding(target_);
63   } else {
64     glBindTexture(target_, old_id_);
65   }
66 }
67 
68 }  // namespace gfx
69