Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(63)

Side by Side Diff: ui/gl/gl_gl_api_implementation.cc

Issue 104833007: Restore only modified texture state during virtual context switches (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: More cleanup Created 7 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « ui/gl/gl_gl_api_implementation.h ('k') | ui/gl/gl_state_restorer.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "ui/gl/gl_gl_api_implementation.h" 5 #include "ui/gl/gl_gl_api_implementation.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <vector> 8 #include <vector>
9 9
10 #include "base/command_line.h" 10 #include "base/command_line.h"
(...skipping 236 matching lines...) Expand 10 before | Expand all | Expand 10 after
247 247
248 void RealGLApi::Initialize(DriverGL* driver) { 248 void RealGLApi::Initialize(DriverGL* driver) {
249 InitializeBase(driver); 249 InitializeBase(driver);
250 } 250 }
251 251
252 TraceGLApi::~TraceGLApi() { 252 TraceGLApi::~TraceGLApi() {
253 } 253 }
254 254
255 VirtualGLApi::VirtualGLApi() 255 VirtualGLApi::VirtualGLApi()
256 : real_context_(NULL), 256 : real_context_(NULL),
257 current_context_(NULL) { 257 current_context_(NULL),
258 current_active_texture_unit_(GL_TEXTURE0) {
258 } 259 }
259 260
260 VirtualGLApi::~VirtualGLApi() { 261 VirtualGLApi::~VirtualGLApi() {
261 } 262 }
262 263
263 void VirtualGLApi::Initialize(DriverGL* driver, GLContext* real_context) { 264 void VirtualGLApi::Initialize(DriverGL* driver, GLContext* real_context) {
264 InitializeBase(driver); 265 InitializeBase(driver);
265 real_context_ = real_context; 266 real_context_ = real_context;
266 267
267 DCHECK(real_context->IsCurrent(NULL)); 268 DCHECK(real_context->IsCurrent(NULL));
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
299 DCHECK_EQ(real_context_, GLContext::GetRealCurrent()); 300 DCHECK_EQ(real_context_, GLContext::GetRealCurrent());
300 DCHECK(real_context_->IsCurrent(NULL)); 301 DCHECK(real_context_->IsCurrent(NULL));
301 DCHECK(virtual_context->IsCurrent(surface)); 302 DCHECK(virtual_context->IsCurrent(surface));
302 303
303 if (switched_contexts || virtual_context != current_context_) { 304 if (switched_contexts || virtual_context != current_context_) {
304 // There should be no errors from the previous context leaking into the 305 // There should be no errors from the previous context leaking into the
305 // new context. 306 // new context.
306 DCHECK_EQ(glGetErrorFn(), static_cast<GLenum>(GL_NO_ERROR)); 307 DCHECK_EQ(glGetErrorFn(), static_cast<GLenum>(GL_NO_ERROR));
307 308
308 current_context_ = virtual_context; 309 current_context_ = virtual_context;
309 // Set all state that is different from the real state 310 // Set all state that is different from the real state.
310 // NOTE: !!! This is a temporary implementation that just restores all
311 // state to let us test that it works.
312 // TODO: ASAP, change this to something that only restores the state
313 // needed for individual GL calls.
314 GLApi* temp = GetCurrentGLApi(); 311 GLApi* temp = GetCurrentGLApi();
315 SetGLToRealGLApi(); 312 SetGLToRealGLApi();
316 if (virtual_context->GetGLStateRestorer()->IsInitialized()) 313 if (virtual_context->GetGLStateRestorer()->IsInitialized()) {
317 virtual_context->GetGLStateRestorer()->RestoreState(); 314 virtual_context->GetGLStateRestorer()->RestoreState(
315 &dirty_texture_state_);
316 // Clear our dirty state after restoring state.
317 ClearDirtyTextureState();
318 }
318 SetGLApi(temp); 319 SetGLApi(temp);
319 } 320 }
320 SetGLApi(this); 321 SetGLApi(this);
321 322
322 virtual_context->SetCurrent(surface); 323 virtual_context->SetCurrent(surface);
323 if (!surface->OnMakeCurrent(virtual_context)) { 324 if (!surface->OnMakeCurrent(virtual_context)) {
324 LOG(ERROR) << "Could not make GLSurface current."; 325 LOG(ERROR) << "Could not make GLSurface current.";
325 return false; 326 return false;
326 } 327 }
327 return true; 328 return true;
328 } 329 }
329 330
330 void VirtualGLApi::OnReleaseVirtuallyCurrent(GLContext* virtual_context) { 331 void VirtualGLApi::OnReleaseVirtuallyCurrent(GLContext* virtual_context) {
331 if (current_context_ == virtual_context) 332 if (current_context_ == virtual_context) {
332 current_context_ = NULL; 333 current_context_ = NULL;
334 ClearDirtyTextureState();
335 }
333 } 336 }
334 337
335 const GLubyte* VirtualGLApi::glGetStringFn(GLenum name) { 338 const GLubyte* VirtualGLApi::glGetStringFn(GLenum name) {
336 switch (name) { 339 switch (name) {
337 case GL_EXTENSIONS: 340 case GL_EXTENSIONS:
338 return reinterpret_cast<const GLubyte*>(extensions_.c_str()); 341 return reinterpret_cast<const GLubyte*>(extensions_.c_str());
339 default: 342 default:
340 return driver_->fn.glGetStringFn(name); 343 return driver_->fn.glGetStringFn(name);
341 } 344 }
342 } 345 }
343 346
347 void VirtualGLApi::glBindTextureFn(GLenum target, GLuint texture_id) {
348 dirty_texture_state_.AddBinding(current_active_texture_unit_, target);
349 driver_->fn.glBindTextureFn(target, texture_id);
350 }
351
352 void VirtualGLApi::glActiveTextureFn(GLenum texture_unit) {
353 current_active_texture_unit_ = texture_unit;
354 dirty_texture_state_.UpdateMaxTextureUnit(texture_unit);
355 driver_->fn.glActiveTextureFn(texture_unit);
356 }
357
358 void VirtualGLApi::ClearDirtyTextureState() {
359 current_active_texture_unit_ = GL_TEXTURE0;
360 dirty_texture_state_.Clear();
361 }
362
344 } // namespace gfx 363 } // namespace gfx
OLDNEW
« no previous file with comments | « ui/gl/gl_gl_api_implementation.h ('k') | ui/gl/gl_state_restorer.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698