// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "ui/gl/scoped_binders.h" #include "ui/gl/gl_bindings.h" #include "ui/gl/gl_context.h" #include "ui/gl/gl_state_restorer.h" namespace gfx { ScopedFrameBufferBinder::ScopedFrameBufferBinder(unsigned int fbo) : state_restorer_(!GLContext::GetCurrent() ? NULL : GLContext::GetCurrent()->GetGLStateRestorer()), old_fbo_(-1) { if (!state_restorer_) glGetIntegerv(GL_FRAMEBUFFER_BINDING, &old_fbo_); glBindFramebufferEXT(GL_FRAMEBUFFER, fbo); } ScopedFrameBufferBinder::~ScopedFrameBufferBinder() { if (state_restorer_) { DCHECK(!!GLContext::GetCurrent()); DCHECK_EQ(state_restorer_, GLContext::GetCurrent()->GetGLStateRestorer()); state_restorer_->RestoreFramebufferBindings(); } else { glBindFramebufferEXT(GL_FRAMEBUFFER, old_fbo_); } } ScopedTextureBinder::ScopedTextureBinder(unsigned int target, unsigned int id) : state_restorer_(!GLContext::GetCurrent() ? NULL : GLContext::GetCurrent()->GetGLStateRestorer()), target_(target), old_id_(-1) { if (!state_restorer_) { GLenum target_getter = 0; switch (target) { case GL_TEXTURE_2D: target_getter = GL_TEXTURE_BINDING_2D; break; case GL_TEXTURE_CUBE_MAP: target_getter = GL_TEXTURE_BINDING_CUBE_MAP; break; case GL_TEXTURE_EXTERNAL_OES: target_getter = GL_TEXTURE_BINDING_EXTERNAL_OES; break; default: NOTIMPLEMENTED() << "Target not part of OpenGL ES 2.0 spec."; } glGetIntegerv(target_getter, &old_id_); } glBindTexture(target_, id); } ScopedTextureBinder::~ScopedTextureBinder() { if (state_restorer_) { DCHECK(!!GLContext::GetCurrent()); DCHECK_EQ(state_restorer_, GLContext::GetCurrent()->GetGLStateRestorer()); state_restorer_->RestoreActiveTextureUnitBinding(target_); } else { glBindTexture(target_, old_id_); } } } // namespace gfx