| Index: ui/gl/gl_gl_api_implementation.cc
|
| diff --git a/ui/gl/gl_gl_api_implementation.cc b/ui/gl/gl_gl_api_implementation.cc
|
| index eade3cedaf5e6df54041372b964335aa7937edca..01723b3d9c98565fb3a77a2767d585c89acfed91 100644
|
| --- a/ui/gl/gl_gl_api_implementation.cc
|
| +++ b/ui/gl/gl_gl_api_implementation.cc
|
| @@ -254,7 +254,8 @@ TraceGLApi::~TraceGLApi() {
|
|
|
| VirtualGLApi::VirtualGLApi()
|
| : real_context_(NULL),
|
| - current_context_(NULL) {
|
| + current_context_(NULL),
|
| + current_active_texture_unit_(GL_TEXTURE0) {
|
| }
|
|
|
| VirtualGLApi::~VirtualGLApi() {
|
| @@ -306,15 +307,15 @@ bool VirtualGLApi::MakeCurrent(GLContext* virtual_context, GLSurface* surface) {
|
| DCHECK_EQ(glGetErrorFn(), static_cast<GLenum>(GL_NO_ERROR));
|
|
|
| current_context_ = virtual_context;
|
| - // Set all state that is different from the real state
|
| - // NOTE: !!! This is a temporary implementation that just restores all
|
| - // state to let us test that it works.
|
| - // TODO: ASAP, change this to something that only restores the state
|
| - // needed for individual GL calls.
|
| + // Set all state that is different from the real state.
|
| GLApi* temp = GetCurrentGLApi();
|
| SetGLToRealGLApi();
|
| - if (virtual_context->GetGLStateRestorer()->IsInitialized())
|
| - virtual_context->GetGLStateRestorer()->RestoreState();
|
| + if (virtual_context->GetGLStateRestorer()->IsInitialized()) {
|
| + virtual_context->GetGLStateRestorer()->RestoreState(
|
| + &dirty_texture_state_);
|
| + // Clear our dirty state after restoring state.
|
| + ClearDirtyTextureState();
|
| + }
|
| SetGLApi(temp);
|
| }
|
| SetGLApi(this);
|
| @@ -328,8 +329,10 @@ bool VirtualGLApi::MakeCurrent(GLContext* virtual_context, GLSurface* surface) {
|
| }
|
|
|
| void VirtualGLApi::OnReleaseVirtuallyCurrent(GLContext* virtual_context) {
|
| - if (current_context_ == virtual_context)
|
| + if (current_context_ == virtual_context) {
|
| current_context_ = NULL;
|
| + ClearDirtyTextureState();
|
| + }
|
| }
|
|
|
| const GLubyte* VirtualGLApi::glGetStringFn(GLenum name) {
|
| @@ -341,4 +344,20 @@ const GLubyte* VirtualGLApi::glGetStringFn(GLenum name) {
|
| }
|
| }
|
|
|
| +void VirtualGLApi::glBindTextureFn(GLenum target, GLuint texture_id) {
|
| + dirty_texture_state_.AddBinding(current_active_texture_unit_, target);
|
| + driver_->fn.glBindTextureFn(target, texture_id);
|
| +}
|
| +
|
| +void VirtualGLApi::glActiveTextureFn(GLenum texture_unit) {
|
| + current_active_texture_unit_ = texture_unit;
|
| + dirty_texture_state_.UpdateMaxTextureUnit(texture_unit);
|
| + driver_->fn.glActiveTextureFn(texture_unit);
|
| +}
|
| +
|
| +void VirtualGLApi::ClearDirtyTextureState() {
|
| + current_active_texture_unit_ = GL_TEXTURE0;
|
| + dirty_texture_state_.Clear();
|
| +}
|
| +
|
| } // namespace gfx
|
|
|