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.
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"
12 ScopedFrameBufferBinder::ScopedFrameBufferBinder(unsigned int fbo
)
13 : state_restorer_(!GLContext::GetCurrent()
15 : GLContext::GetCurrent()->GetGLStateRestorer()),
18 glGetIntegerv(GL_FRAMEBUFFER_BINDING
, &old_fbo_
);
19 glBindFramebufferEXT(GL_FRAMEBUFFER
, fbo
);
22 ScopedFrameBufferBinder::~ScopedFrameBufferBinder() {
23 if (state_restorer_
) {
24 DCHECK(!!GLContext::GetCurrent());
25 DCHECK_EQ(state_restorer_
, GLContext::GetCurrent()->GetGLStateRestorer());
26 state_restorer_
->RestoreFramebufferBindings();
28 glBindFramebufferEXT(GL_FRAMEBUFFER
, old_fbo_
);
32 ScopedTextureBinder::ScopedTextureBinder(unsigned int target
, unsigned int id
)
33 : state_restorer_(!GLContext::GetCurrent()
35 : GLContext::GetCurrent()->GetGLStateRestorer()),
38 if (!state_restorer_
) {
39 GLenum target_getter
= 0;
42 target_getter
= GL_TEXTURE_BINDING_2D
;
44 case GL_TEXTURE_CUBE_MAP
:
45 target_getter
= GL_TEXTURE_BINDING_CUBE_MAP
;
47 case GL_TEXTURE_EXTERNAL_OES
:
48 target_getter
= GL_TEXTURE_BINDING_EXTERNAL_OES
;
51 NOTIMPLEMENTED() << "Target not part of OpenGL ES 2.0 spec.";
53 glGetIntegerv(target_getter
, &old_id_
);
55 glBindTexture(target_
, id
);
58 ScopedTextureBinder::~ScopedTextureBinder() {
59 if (state_restorer_
) {
60 DCHECK(!!GLContext::GetCurrent());
61 DCHECK_EQ(state_restorer_
, GLContext::GetCurrent()->GetGLStateRestorer());
62 state_restorer_
->RestoreActiveTextureUnitBinding(target_
);
64 glBindTexture(target_
, old_id_
);