OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |