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

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

Issue 2762833003: gpu: Use decoder state restoration for scoped_binders (Closed)
Patch Set: Fixed MediaColorTest failures on macOS Created 3 years, 8 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
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/scoped_binders.h" 5 #include "ui/gl/scoped_binders.h"
6 #include "ui/gl/gl_bindings.h" 6 #include "ui/gl/gl_bindings.h"
7 #include "ui/gl/gl_context.h" 7 #include "ui/gl/gl_context.h"
8 #include "ui/gl/gl_state_restorer.h" 8 #include "ui/gl/gl_state_restorer.h"
9 9
10 namespace gl { 10 namespace gl {
(...skipping 12 matching lines...) Expand all
23 if (state_restorer_) { 23 if (state_restorer_) {
24 DCHECK(!!GLContext::GetCurrent()); 24 DCHECK(!!GLContext::GetCurrent());
25 DCHECK_EQ(state_restorer_, GLContext::GetCurrent()->GetGLStateRestorer()); 25 DCHECK_EQ(state_restorer_, GLContext::GetCurrent()->GetGLStateRestorer());
26 state_restorer_->RestoreFramebufferBindings(); 26 state_restorer_->RestoreFramebufferBindings();
27 } else { 27 } else {
28 glBindFramebufferEXT(GL_FRAMEBUFFER, old_fbo_); 28 glBindFramebufferEXT(GL_FRAMEBUFFER, old_fbo_);
29 } 29 }
30 } 30 }
31 31
32 ScopedActiveTexture::ScopedActiveTexture(unsigned int texture) 32 ScopedActiveTexture::ScopedActiveTexture(unsigned int texture)
33 : old_texture_(-1) { 33 : state_restorer_(!GLContext::GetCurrent()
34 glGetIntegerv(GL_ACTIVE_TEXTURE, &old_texture_); 34 ? NULL
35 : GLContext::GetCurrent()->GetGLStateRestorer()),
36 old_texture_(-1) {
37 if (!state_restorer_)
38 glGetIntegerv(GL_ACTIVE_TEXTURE, &old_texture_);
35 glActiveTexture(texture); 39 glActiveTexture(texture);
36 } 40 }
37 41
38 ScopedActiveTexture::~ScopedActiveTexture() { 42 ScopedActiveTexture::~ScopedActiveTexture() {
39 glActiveTexture(old_texture_); 43 if (state_restorer_) {
44 DCHECK(!!GLContext::GetCurrent());
45 DCHECK_EQ(state_restorer_, GLContext::GetCurrent()->GetGLStateRestorer());
46 state_restorer_->RestoreActiveTexture();
47 } else {
48 glActiveTexture(old_texture_);
49 }
40 } 50 }
41 51
42 ScopedTextureBinder::ScopedTextureBinder(unsigned int target, unsigned int id) 52 ScopedTextureBinder::ScopedTextureBinder(unsigned int target, unsigned int id)
43 : state_restorer_(!GLContext::GetCurrent() 53 : state_restorer_(!GLContext::GetCurrent()
44 ? NULL 54 ? NULL
45 : GLContext::GetCurrent()->GetGLStateRestorer()), 55 : GLContext::GetCurrent()->GetGLStateRestorer()),
46 target_(target), 56 target_(target),
47 old_id_(-1) { 57 old_id_(-1) {
48 if (!state_restorer_) { 58 if (!state_restorer_) {
49 GLenum target_getter = 0; 59 GLenum target_getter = 0;
(...skipping 21 matching lines...) Expand all
71 ScopedTextureBinder::~ScopedTextureBinder() { 81 ScopedTextureBinder::~ScopedTextureBinder() {
72 if (state_restorer_) { 82 if (state_restorer_) {
73 DCHECK(!!GLContext::GetCurrent()); 83 DCHECK(!!GLContext::GetCurrent());
74 DCHECK_EQ(state_restorer_, GLContext::GetCurrent()->GetGLStateRestorer()); 84 DCHECK_EQ(state_restorer_, GLContext::GetCurrent()->GetGLStateRestorer());
75 state_restorer_->RestoreActiveTextureUnitBinding(target_); 85 state_restorer_->RestoreActiveTextureUnitBinding(target_);
76 } else { 86 } else {
77 glBindTexture(target_, old_id_); 87 glBindTexture(target_, old_id_);
78 } 88 }
79 } 89 }
80 90
81 ScopedUseProgram::ScopedUseProgram(unsigned int program) : old_program_(-1) { 91 ScopedUseProgram::ScopedUseProgram(unsigned int program)
82 glGetIntegerv(GL_CURRENT_PROGRAM, &old_program_); 92 : state_restorer_(!GLContext::GetCurrent()
93 ? NULL
94 : GLContext::GetCurrent()->GetGLStateRestorer()),
95 old_program_(-1) {
96 if (!state_restorer_)
97 glGetIntegerv(GL_CURRENT_PROGRAM, &old_program_);
83 glUseProgram(program); 98 glUseProgram(program);
84 } 99 }
85 100
86 ScopedUseProgram::~ScopedUseProgram() { 101 ScopedUseProgram::~ScopedUseProgram() {
87 glUseProgram(old_program_); 102 if (state_restorer_) {
103 DCHECK(!!GLContext::GetCurrent());
104 DCHECK_EQ(state_restorer_, GLContext::GetCurrent()->GetGLStateRestorer());
105 state_restorer_->RestoreProgramBindings();
106 } else {
107 glUseProgram(old_program_);
108 }
88 } 109 }
89 110
90 ScopedVertexAttribArray::ScopedVertexAttribArray(unsigned int index, 111 ScopedVertexAttribArray::ScopedVertexAttribArray(unsigned int index,
91 int size, 112 int size,
92 unsigned int type, 113 unsigned int type,
93 char normalized, 114 char normalized,
94 int stride, 115 int stride,
95 const void* pointer) 116 const void* pointer)
96 : buffer_(0), 117 : state_restorer_(!GLContext::GetCurrent()
118 ? NULL
119 : GLContext::GetCurrent()->GetGLStateRestorer()),
120 buffer_(0),
97 enabled_(GL_FALSE), 121 enabled_(GL_FALSE),
98 index_(index), 122 index_(index),
99 size_(-1), 123 size_(-1),
100 type_(-1), 124 type_(-1),
101 normalized_(GL_FALSE), 125 normalized_(GL_FALSE),
102 stride_(0), 126 stride_(0),
103 pointer_(0) { 127 pointer_(0) {
104 glGetVertexAttribiv(index, GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING, &buffer_); 128 if (!state_restorer_) {
105 glGetVertexAttribiv(index, GL_VERTEX_ATTRIB_ARRAY_ENABLED, &enabled_); 129 glGetVertexAttribiv(index, GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING, &buffer_);
130 glGetVertexAttribiv(index, GL_VERTEX_ATTRIB_ARRAY_ENABLED, &enabled_);
131 glGetVertexAttribiv(index, GL_VERTEX_ATTRIB_ARRAY_SIZE, &size_);
132 glGetVertexAttribiv(index, GL_VERTEX_ATTRIB_ARRAY_TYPE, &type_);
133 glGetVertexAttribiv(index, GL_VERTEX_ATTRIB_ARRAY_NORMALIZED, &normalized_);
134 glGetVertexAttribiv(index, GL_VERTEX_ATTRIB_ARRAY_STRIDE, &stride_);
135 glGetVertexAttribPointerv(index, GL_VERTEX_ATTRIB_ARRAY_POINTER, &pointer_);
136 }
137
106 glEnableVertexAttribArray(index); 138 glEnableVertexAttribArray(index);
107
108 glGetVertexAttribiv(index, GL_VERTEX_ATTRIB_ARRAY_SIZE, &size_);
109 glGetVertexAttribiv(index, GL_VERTEX_ATTRIB_ARRAY_TYPE, &type_);
110 glGetVertexAttribiv(index, GL_VERTEX_ATTRIB_ARRAY_NORMALIZED, &normalized_);
111 glGetVertexAttribiv(index, GL_VERTEX_ATTRIB_ARRAY_STRIDE, &stride_);
112 glGetVertexAttribPointerv(index, GL_VERTEX_ATTRIB_ARRAY_POINTER, &pointer_);
113
114 glVertexAttribPointer(index, size, type, normalized, stride, pointer); 139 glVertexAttribPointer(index, size, type, normalized, stride, pointer);
115 } 140 }
116 141
117 ScopedVertexAttribArray::~ScopedVertexAttribArray() { 142 ScopedVertexAttribArray::~ScopedVertexAttribArray() {
118 ScopedBufferBinder buffer_binder(GL_ARRAY_BUFFER, buffer_); 143 if (state_restorer_) {
119 glVertexAttribPointer(index_, size_, type_, normalized_, stride_, pointer_); 144 DCHECK(!!GLContext::GetCurrent());
120 if (enabled_ == GL_FALSE) { 145 DCHECK_EQ(state_restorer_, GLContext::GetCurrent()->GetGLStateRestorer());
121 glDisableVertexAttribArray(index_); 146 state_restorer_->RestoreVertexAttribArray(index_);
147 } else {
148 ScopedBufferBinder buffer_binder(GL_ARRAY_BUFFER, buffer_);
149 glVertexAttribPointer(index_, size_, type_, normalized_, stride_, pointer_);
150 if (enabled_ == GL_FALSE)
151 glDisableVertexAttribArray(index_);
122 } 152 }
123 } 153 }
124 154
125 ScopedBufferBinder::ScopedBufferBinder(unsigned int target, unsigned int id) 155 ScopedBufferBinder::ScopedBufferBinder(unsigned int target, unsigned int id)
126 : target_(target), old_id_(-1) { 156 : state_restorer_(!GLContext::GetCurrent()
127 GLenum target_getter = 0; 157 ? NULL
128 switch (target) { 158 : GLContext::GetCurrent()->GetGLStateRestorer()),
129 case GL_ARRAY_BUFFER: 159 target_(target),
130 target_getter = GL_ARRAY_BUFFER_BINDING; 160 old_id_(-1) {
131 break; 161 if (!state_restorer_) {
132 default: 162 GLenum target_getter = 0;
133 NOTIMPLEMENTED() << " Target not supported."; 163 switch (target) {
164 case GL_ARRAY_BUFFER:
165 target_getter = GL_ARRAY_BUFFER_BINDING;
166 break;
167 default:
168 NOTIMPLEMENTED() << " Target not supported.";
169 }
170 glGetIntegerv(target_getter, &old_id_);
134 } 171 }
135 glGetIntegerv(target_getter, &old_id_);
136 glBindBuffer(target_, id); 172 glBindBuffer(target_, id);
137 } 173 }
138 174
139 ScopedBufferBinder::~ScopedBufferBinder() { 175 ScopedBufferBinder::~ScopedBufferBinder() {
140 glBindBuffer(target_, old_id_); 176 if (state_restorer_) {
177 DCHECK(!!GLContext::GetCurrent());
178 DCHECK_EQ(state_restorer_, GLContext::GetCurrent()->GetGLStateRestorer());
179 state_restorer_->RestoreBufferBinding(target_);
180 } else {
181 glBindBuffer(target_, old_id_);
182 }
141 } 183 }
142 184
143 ScopedViewport::ScopedViewport(int x, int y, int width, int height) { 185 ScopedViewport::ScopedViewport(int x, int y, int width, int height) {
144 glGetIntegerv(GL_VIEWPORT, data_); 186 glGetIntegerv(GL_VIEWPORT, data_);
145 glViewport(x, y, width, height); 187 glViewport(x, y, width, height);
146 } 188 }
147 189
148 ScopedViewport::~ScopedViewport() { 190 ScopedViewport::~ScopedViewport() {
149 glViewport(data_[0], data_[1], data_[2], data_[3]); 191 glViewport(data_[0], data_[1], data_[2], data_[3]);
150 } 192 }
(...skipping 19 matching lines...) Expand all
170 212
171 ScopedCapability::~ScopedCapability() { 213 ScopedCapability::~ScopedCapability() {
172 if (enabled_ == GL_TRUE) { 214 if (enabled_ == GL_TRUE) {
173 glEnable(capability_); 215 glEnable(capability_);
174 } else { 216 } else {
175 glDisable(capability_); 217 glDisable(capability_);
176 } 218 }
177 } 219 }
178 220
179 } // namespace gl 221 } // namespace gl
OLDNEW
« gpu/command_buffer/service/context_state.cc ('K') | « ui/gl/scoped_binders.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698