Index: ui/gl/scoped_binders.cc |
diff --git a/ui/gl/scoped_binders.cc b/ui/gl/scoped_binders.cc |
index 62f277dfb7865df6c83d10cec560f47be1e8fec6..0ac1bd6ab455b83e9175352853776dbdf4063e15 100644 |
--- a/ui/gl/scoped_binders.cc |
+++ b/ui/gl/scoped_binders.cc |
@@ -30,13 +30,23 @@ ScopedFramebufferBinder::~ScopedFramebufferBinder() { |
} |
ScopedActiveTexture::ScopedActiveTexture(unsigned int texture) |
- : old_texture_(-1) { |
- glGetIntegerv(GL_ACTIVE_TEXTURE, &old_texture_); |
+ : state_restorer_(!GLContext::GetCurrent() |
+ ? NULL |
+ : GLContext::GetCurrent()->GetGLStateRestorer()), |
+ old_texture_(-1) { |
+ if (!state_restorer_) |
+ glGetIntegerv(GL_ACTIVE_TEXTURE, &old_texture_); |
glActiveTexture(texture); |
} |
ScopedActiveTexture::~ScopedActiveTexture() { |
- glActiveTexture(old_texture_); |
+ if (state_restorer_) { |
+ DCHECK(!!GLContext::GetCurrent()); |
+ DCHECK_EQ(state_restorer_, GLContext::GetCurrent()->GetGLStateRestorer()); |
+ state_restorer_->RestoreActiveTexture(); |
+ } else { |
+ glActiveTexture(old_texture_); |
+ } |
} |
ScopedTextureBinder::ScopedTextureBinder(unsigned int target, unsigned int id) |
@@ -78,13 +88,24 @@ ScopedTextureBinder::~ScopedTextureBinder() { |
} |
} |
-ScopedUseProgram::ScopedUseProgram(unsigned int program) : old_program_(-1) { |
- glGetIntegerv(GL_CURRENT_PROGRAM, &old_program_); |
+ScopedUseProgram::ScopedUseProgram(unsigned int program) |
+ : state_restorer_(!GLContext::GetCurrent() |
+ ? NULL |
+ : GLContext::GetCurrent()->GetGLStateRestorer()), |
+ old_program_(-1) { |
+ if (!state_restorer_) |
+ glGetIntegerv(GL_CURRENT_PROGRAM, &old_program_); |
glUseProgram(program); |
} |
ScopedUseProgram::~ScopedUseProgram() { |
- glUseProgram(old_program_); |
+ if (state_restorer_) { |
+ DCHECK(!!GLContext::GetCurrent()); |
+ DCHECK_EQ(state_restorer_, GLContext::GetCurrent()->GetGLStateRestorer()); |
+ state_restorer_->RestoreProgramBindings(); |
+ } else { |
+ glUseProgram(old_program_); |
+ } |
} |
ScopedVertexAttribArray::ScopedVertexAttribArray(unsigned int index, |
@@ -93,7 +114,10 @@ ScopedVertexAttribArray::ScopedVertexAttribArray(unsigned int index, |
char normalized, |
int stride, |
const void* pointer) |
- : buffer_(0), |
+ : state_restorer_(!GLContext::GetCurrent() |
+ ? NULL |
+ : GLContext::GetCurrent()->GetGLStateRestorer()), |
+ buffer_(0), |
enabled_(GL_FALSE), |
index_(index), |
size_(-1), |
@@ -101,43 +125,61 @@ ScopedVertexAttribArray::ScopedVertexAttribArray(unsigned int index, |
normalized_(GL_FALSE), |
stride_(0), |
pointer_(0) { |
- glGetVertexAttribiv(index, GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING, &buffer_); |
- glGetVertexAttribiv(index, GL_VERTEX_ATTRIB_ARRAY_ENABLED, &enabled_); |
- glEnableVertexAttribArray(index); |
- |
- glGetVertexAttribiv(index, GL_VERTEX_ATTRIB_ARRAY_SIZE, &size_); |
- glGetVertexAttribiv(index, GL_VERTEX_ATTRIB_ARRAY_TYPE, &type_); |
- glGetVertexAttribiv(index, GL_VERTEX_ATTRIB_ARRAY_NORMALIZED, &normalized_); |
- glGetVertexAttribiv(index, GL_VERTEX_ATTRIB_ARRAY_STRIDE, &stride_); |
- glGetVertexAttribPointerv(index, GL_VERTEX_ATTRIB_ARRAY_POINTER, &pointer_); |
+ if (!state_restorer_) { |
+ glGetVertexAttribiv(index, GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING, &buffer_); |
+ glGetVertexAttribiv(index, GL_VERTEX_ATTRIB_ARRAY_ENABLED, &enabled_); |
+ glGetVertexAttribiv(index, GL_VERTEX_ATTRIB_ARRAY_SIZE, &size_); |
+ glGetVertexAttribiv(index, GL_VERTEX_ATTRIB_ARRAY_TYPE, &type_); |
+ glGetVertexAttribiv(index, GL_VERTEX_ATTRIB_ARRAY_NORMALIZED, &normalized_); |
+ glGetVertexAttribiv(index, GL_VERTEX_ATTRIB_ARRAY_STRIDE, &stride_); |
+ glGetVertexAttribPointerv(index, GL_VERTEX_ATTRIB_ARRAY_POINTER, &pointer_); |
+ } |
+ glEnableVertexAttribArray(index); |
glVertexAttribPointer(index, size, type, normalized, stride, pointer); |
} |
ScopedVertexAttribArray::~ScopedVertexAttribArray() { |
- ScopedBufferBinder buffer_binder(GL_ARRAY_BUFFER, buffer_); |
- glVertexAttribPointer(index_, size_, type_, normalized_, stride_, pointer_); |
- if (enabled_ == GL_FALSE) { |
- glDisableVertexAttribArray(index_); |
+ if (state_restorer_) { |
+ DCHECK(!!GLContext::GetCurrent()); |
+ DCHECK_EQ(state_restorer_, GLContext::GetCurrent()->GetGLStateRestorer()); |
+ state_restorer_->RestoreVertexAttribArray(index_); |
+ } else { |
+ ScopedBufferBinder buffer_binder(GL_ARRAY_BUFFER, buffer_); |
+ glVertexAttribPointer(index_, size_, type_, normalized_, stride_, pointer_); |
+ if (enabled_ == GL_FALSE) |
+ glDisableVertexAttribArray(index_); |
} |
} |
ScopedBufferBinder::ScopedBufferBinder(unsigned int target, unsigned int id) |
- : target_(target), old_id_(-1) { |
- GLenum target_getter = 0; |
- switch (target) { |
- case GL_ARRAY_BUFFER: |
- target_getter = GL_ARRAY_BUFFER_BINDING; |
- break; |
- default: |
- NOTIMPLEMENTED() << " Target not supported."; |
+ : state_restorer_(!GLContext::GetCurrent() |
+ ? NULL |
+ : GLContext::GetCurrent()->GetGLStateRestorer()), |
+ target_(target), |
+ old_id_(-1) { |
+ if (!state_restorer_) { |
+ GLenum target_getter = 0; |
+ switch (target) { |
+ case GL_ARRAY_BUFFER: |
+ target_getter = GL_ARRAY_BUFFER_BINDING; |
+ break; |
+ default: |
+ NOTIMPLEMENTED() << " Target not supported."; |
+ } |
+ glGetIntegerv(target_getter, &old_id_); |
} |
- glGetIntegerv(target_getter, &old_id_); |
glBindBuffer(target_, id); |
} |
ScopedBufferBinder::~ScopedBufferBinder() { |
- glBindBuffer(target_, old_id_); |
+ if (state_restorer_) { |
+ DCHECK(!!GLContext::GetCurrent()); |
+ DCHECK_EQ(state_restorer_, GLContext::GetCurrent()->GetGLStateRestorer()); |
+ state_restorer_->RestoreBufferBinding(target_); |
+ } else { |
+ glBindBuffer(target_, old_id_); |
+ } |
} |
ScopedViewport::ScopedViewport(int x, int y, int width, int height) { |