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

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

Issue 11734037: Restore gl scissor state when switching FBO targets on Qualcomm (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 7 years, 11 months 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 | « no previous file | no next file » | 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/string_util.h" 10 #include "base/string_util.h"
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
105 // queries. 105 // queries.
106 it = std::find(ext.begin(), ext.end(), "GL_EXT_occlusion_query_boolean"); 106 it = std::find(ext.begin(), ext.end(), "GL_EXT_occlusion_query_boolean");
107 if (it != ext.end()) 107 if (it != ext.end())
108 ext.erase(it); 108 ext.erase(it);
109 109
110 extensions_ = JoinString(ext, " "); 110 extensions_ = JoinString(ext, " ");
111 } 111 }
112 112
113 bool VirtualGLApi::MakeCurrent(GLContext* virtual_context, GLSurface* surface) { 113 bool VirtualGLApi::MakeCurrent(GLContext* virtual_context, GLSurface* surface) {
114 bool switched_contexts = g_current_gl_context != this; 114 bool switched_contexts = g_current_gl_context != this;
115 GLSurface* current_surface = GLSurface::GetCurrent(); 115 bool switched_surfaces = GLSurface::GetCurrent() != surface;
brianderson 2013/01/04 22:00:56 Note: This comparison is almost always false beca
116 if (switched_contexts || surface != current_surface) { 116 if (switched_contexts || switched_surfaces) {
117 if (!switched_contexts && current_surface && 117 if (!switched_contexts && GLSurface::GetCurrent() &&
118 virtual_context->IsCurrent(surface)) { 118 virtual_context->IsCurrent(surface)) {
119 // MakeCurrent 'lite' path that avoids potentially expensive MakeCurrent() 119 // MakeCurrent 'lite' path that avoids potentially expensive MakeCurrent()
120 // calls if the GLSurface uses the same underlying surface or renders to 120 // calls if the GLSurface uses the same underlying surface or renders to
121 // an FBO. 121 // an FBO.
122 if (!surface->OnMakeCurrent(real_context_)) { 122 if (!surface->OnMakeCurrent(real_context_)) {
123 LOG(ERROR) << "Could not make GLSurface current."; 123 LOG(ERROR) << "Could not make GLSurface current.";
124 return false; 124 return false;
125 } 125 }
126 } else if (!real_context_->MakeCurrent(surface)) { 126 } else if (!real_context_->MakeCurrent(surface)) {
127 return false; 127 return false;
128 } 128 }
129 } 129 }
130 130
131 DCHECK(GLSurface::GetCurrent()); 131 DCHECK(GLSurface::GetCurrent());
132 DCHECK(real_context_->IsCurrent(GLSurface::GetCurrent())); 132 DCHECK(real_context_->IsCurrent(GLSurface::GetCurrent()));
133 DCHECK(virtual_context->IsCurrent(surface)); 133 DCHECK(virtual_context->IsCurrent(surface));
134 134
135 if (switched_contexts || virtual_context != current_context_) { 135 // This work around restores gl state on virtual context switches
136 // where only the surface changes.
137 bool qualcomm_WAR_enabled = true; // TODO: Set this only when needed.
138 bool use_qualcomm_WAR = qualcomm_WAR_enabled && switched_surfaces;
139
140 if (switched_contexts || virtual_context != current_context_ ||
141 use_qualcomm_WAR) {
136 // There should be no errors from the previous context leaking into the 142 // There should be no errors from the previous context leaking into the
137 // new context. 143 // new context.
138 DCHECK_EQ(glGetErrorFn(), static_cast<GLenum>(GL_NO_ERROR)); 144 DCHECK_EQ(glGetErrorFn(), static_cast<GLenum>(GL_NO_ERROR));
139 145
140 current_context_ = virtual_context; 146 current_context_ = virtual_context;
141 // Set all state that is different from the real state 147 // Set all state that is different from the real state
142 // NOTE: !!! This is a temporary implementation that just restores all 148 // NOTE: !!! This is a temporary implementation that just restores all
143 // state to let us test that it works. 149 // state to let us test that it works.
144 // TODO: ASAP, change this to something that only restores the state 150 // TODO: ASAP, change this to something that only restores the state
145 // needed for individual GL calls. 151 // needed for individual GL calls.
(...skipping 14 matching lines...) Expand all
160 const GLubyte* VirtualGLApi::glGetStringFn(GLenum name) { 166 const GLubyte* VirtualGLApi::glGetStringFn(GLenum name) {
161 switch (name) { 167 switch (name) {
162 case GL_EXTENSIONS: 168 case GL_EXTENSIONS:
163 return reinterpret_cast<const GLubyte*>(extensions_.c_str()); 169 return reinterpret_cast<const GLubyte*>(extensions_.c_str());
164 default: 170 default:
165 return driver_->fn.glGetStringFn(name); 171 return driver_->fn.glGetStringFn(name);
166 } 172 }
167 } 173 }
168 174
169 } // namespace gfx 175 } // namespace gfx
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698