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

Side by Side Diff: android_webview/browser/scoped_app_gl_state_restore.cc

Issue 19787007: [Android WebView] More App GL state save/restore (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Still need blend etc for detach case Created 7 years, 5 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 | Annotate | Revision Log
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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 "android_webview/browser/scoped_app_gl_state_restore.h" 5 #include "android_webview/browser/scoped_app_gl_state_restore.h"
6 6
7 #include "base/debug/trace_event.h"
7 #include "base/lazy_instance.h" 8 #include "base/lazy_instance.h"
8 #include "ui/gl/gl_context.h" 9 #include "ui/gl/gl_context.h"
9 #include "ui/gl/gl_surface_stub.h" 10 #include "ui/gl/gl_surface_stub.h"
10 11
11 namespace android_webview { 12 namespace android_webview {
12 13
13 namespace { 14 namespace {
14 15
15 // "App" context is a bit of a stretch. Basically we use this context while 16 // "App" context is a bit of a stretch. Basically we use this context while
16 // saving and restoring the App GL state. 17 // saving and restoring the App GL state.
(...skipping 18 matching lines...) Expand all
35 36
36 // Make the global g_app_context_surface current so that the gl_binding is not 37 // Make the global g_app_context_surface current so that the gl_binding is not
37 // NULL for making gl* calls. The binding can be null if another GlContext was 38 // NULL for making gl* calls. The binding can be null if another GlContext was
38 // destroyed immediately before gl* calls here. 39 // destroyed immediately before gl* calls here.
39 void MakeAppContextCurrent() { 40 void MakeAppContextCurrent() {
40 g_app_context_surface.Get().MakeCurrent(); 41 g_app_context_surface.Get().MakeCurrent();
41 } 42 }
42 43
43 } // namespace 44 } // namespace
44 45
45 ScopedAppGLStateRestore::ScopedAppGLStateRestore(CallMode mode) { 46 ScopedAppGLStateRestore::ScopedAppGLStateRestore(CallMode mode) : mode_(mode) {
47 TRACE_EVENT0("android_webview", "AppGLStateSave");
46 MakeAppContextCurrent(); 48 MakeAppContextCurrent();
47 49
48 glGetIntegerv(GL_ARRAY_BUFFER_BINDING, &vertex_array_buffer_binding_); 50 glGetIntegerv(GL_ARRAY_BUFFER_BINDING, &vertex_array_buffer_binding_);
49 glGetIntegerv(GL_ELEMENT_ARRAY_BUFFER_BINDING, &index_array_buffer_binding_); 51 glGetIntegerv(GL_ELEMENT_ARRAY_BUFFER_BINDING, &index_array_buffer_binding_);
50 52
51 switch(mode) { 53 switch(mode_) {
52 case MODE_DRAW: 54 case MODE_DRAW:
53 // TODO(boliu): These should always be 0 in draw case. When we have 55 // TODO(boliu): These should always be 0 in draw case. When we have
54 // guarantee that we are no longer making GL calls outside of draw, DCHECK 56 // guarantee that we are no longer making GL calls outside of draw, DCHECK
55 // these are 0 here. 57 // these are 0 here.
56 LOG_IF(ERROR, vertex_array_buffer_binding_) 58 LOG_IF(ERROR, vertex_array_buffer_binding_)
57 << "GL_ARRAY_BUFFER_BINDING not zero in draw: " 59 << "GL_ARRAY_BUFFER_BINDING not zero in draw: "
58 << vertex_array_buffer_binding_; 60 << vertex_array_buffer_binding_;
59 LOG_IF(ERROR, index_array_buffer_binding_) 61 LOG_IF(ERROR, index_array_buffer_binding_)
60 << "GL_ELEMENT_ARRAY_BUFFER_BINDING not zero in draw: " 62 << "GL_ELEMENT_ARRAY_BUFFER_BINDING not zero in draw: "
61 << index_array_buffer_binding_; 63 << index_array_buffer_binding_;
62 64
63 vertex_array_buffer_binding_ = 0; 65 vertex_array_buffer_binding_ = 0;
64 index_array_buffer_binding_ = 0; 66 index_array_buffer_binding_ = 0;
65 break; 67 break;
66 case MODE_DETACH_FROM_WINDOW: 68 case MODE_DETACH_FROM_WINDOW:
69 glGetBooleanv(GL_BLEND, &blend_enabled_);
70 glGetIntegerv(GL_BLEND_SRC_RGB, &blend_src_rgb_);
71 glGetIntegerv(GL_BLEND_SRC_ALPHA, &blend_src_alpha_);
72 glGetIntegerv(GL_BLEND_DST_RGB, &blend_dest_rgb_);
73 glGetIntegerv(GL_BLEND_DST_ALPHA, &blend_dest_alpha_);
74 glGetIntegerv(GL_ACTIVE_TEXTURE, &active_texture_);
75 glGetIntegerv(GL_VIEWPORT, viewport_);
76 glGetBooleanv(GL_SCISSOR_TEST, &scissor_test_);
77 glGetIntegerv(GL_SCISSOR_BOX, scissor_box_);
67 break; 78 break;
68 } 79 }
69 80
70 glGetIntegerv(GL_TEXTURE_BINDING_EXTERNAL_OES, 81 glGetIntegerv(GL_TEXTURE_BINDING_EXTERNAL_OES,
71 &texture_external_oes_binding_); 82 &texture_external_oes_binding_);
72 glGetIntegerv(GL_PACK_ALIGNMENT, &pack_alignment_); 83 glGetIntegerv(GL_PACK_ALIGNMENT, &pack_alignment_);
73 glGetIntegerv(GL_UNPACK_ALIGNMENT, &unpack_alignment_); 84 glGetIntegerv(GL_UNPACK_ALIGNMENT, &unpack_alignment_);
74 85
75 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(vertex_attrib_); ++i) { 86 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(vertex_attrib_); ++i) {
76 glGetVertexAttribiv( 87 glGetVertexAttribiv(
77 i, GL_VERTEX_ATTRIB_ARRAY_ENABLED, &vertex_attrib_[i].enabled); 88 i, GL_VERTEX_ATTRIB_ARRAY_ENABLED, &vertex_attrib_[i].enabled);
78 glGetVertexAttribiv( 89 glGetVertexAttribiv(
79 i, GL_VERTEX_ATTRIB_ARRAY_SIZE, &vertex_attrib_[i].size); 90 i, GL_VERTEX_ATTRIB_ARRAY_SIZE, &vertex_attrib_[i].size);
80 glGetVertexAttribiv( 91 glGetVertexAttribiv(
81 i, GL_VERTEX_ATTRIB_ARRAY_TYPE, &vertex_attrib_[i].type); 92 i, GL_VERTEX_ATTRIB_ARRAY_TYPE, &vertex_attrib_[i].type);
82 glGetVertexAttribiv( 93 glGetVertexAttribiv(
83 i, GL_VERTEX_ATTRIB_ARRAY_NORMALIZED, &vertex_attrib_[i].normalized); 94 i, GL_VERTEX_ATTRIB_ARRAY_NORMALIZED, &vertex_attrib_[i].normalized);
84 glGetVertexAttribiv( 95 glGetVertexAttribiv(
85 i, GL_VERTEX_ATTRIB_ARRAY_STRIDE, &vertex_attrib_[i].stride); 96 i, GL_VERTEX_ATTRIB_ARRAY_STRIDE, &vertex_attrib_[i].stride);
86 glGetVertexAttribPointerv( 97 glGetVertexAttribPointerv(
87 i, GL_VERTEX_ATTRIB_ARRAY_POINTER, &vertex_attrib_[i].pointer); 98 i, GL_VERTEX_ATTRIB_ARRAY_POINTER, &vertex_attrib_[i].pointer);
88 } 99 }
89 100
90 glGetBooleanv(GL_DEPTH_TEST, &depth_test_); 101 glGetBooleanv(GL_DEPTH_TEST, &depth_test_);
91 glGetBooleanv(GL_CULL_FACE, &cull_face_); 102 glGetBooleanv(GL_CULL_FACE, &cull_face_);
103 glGetIntegerv(GL_CULL_FACE_MODE, &cull_face_mode_);
92 glGetBooleanv(GL_COLOR_WRITEMASK, color_mask_); 104 glGetBooleanv(GL_COLOR_WRITEMASK, color_mask_);
93 glGetBooleanv(GL_BLEND, &blend_enabled_);
94 glGetIntegerv(GL_BLEND_SRC_RGB, &blend_src_rgb_);
95 glGetIntegerv(GL_BLEND_SRC_ALPHA, &blend_src_alpha_);
96 glGetIntegerv(GL_BLEND_DST_RGB, &blend_dest_rgb_);
97 glGetIntegerv(GL_BLEND_DST_ALPHA, &blend_dest_alpha_);
98 glGetIntegerv(GL_ACTIVE_TEXTURE, &active_texture_);
99 glGetIntegerv(GL_VIEWPORT, viewport_);
100 glGetBooleanv(GL_SCISSOR_TEST, &scissor_test_);
101 glGetIntegerv(GL_SCISSOR_BOX, scissor_box_);
102 glGetIntegerv(GL_CURRENT_PROGRAM, &current_program_); 105 glGetIntegerv(GL_CURRENT_PROGRAM, &current_program_);
106 glGetFloatv(GL_COLOR_CLEAR_VALUE, color_clear_);
107 glGetFloatv(GL_DEPTH_CLEAR_VALUE, &depth_clear_);
108 glGetIntegerv(GL_DEPTH_FUNC, &depth_func_);
109 glGetBooleanv(GL_DEPTH_WRITEMASK, &depth_mask_);
110 glGetFloatv(GL_DEPTH_RANGE, depth_rage_);
111 glGetIntegerv(GL_FRONT_FACE, &front_face_);
112 glGetIntegerv(GL_GENERATE_MIPMAP_HINT, &hint_generate_mipmap_);
113 glGetFloatv(GL_LINE_WIDTH, &line_width_);
114 glGetFloatv(GL_POLYGON_OFFSET_FACTOR, &polygon_offset_factor_);
115 glGetFloatv(GL_POLYGON_OFFSET_UNITS, &polygon_offset_units_);
116 glGetFloatv(GL_SAMPLE_COVERAGE_VALUE, &sample_coverage_value_);
117 glGetBooleanv(GL_SAMPLE_COVERAGE_INVERT, &sample_coverage_invert_);
118
119 glGetBooleanv(GL_DITHER, &enable_dither_);
120 glGetBooleanv(GL_POLYGON_OFFSET_FILL, &enable_polygon_offset_fill_);
121 glGetBooleanv(GL_SAMPLE_ALPHA_TO_COVERAGE, &enable_sample_alpha_to_coverage_);
122 glGetBooleanv(GL_SAMPLE_COVERAGE, &enable_sample_coverage_);
123
124 // Intentionally not saving/restoring stencil related state.
103 } 125 }
104 126
105 ScopedAppGLStateRestore::~ScopedAppGLStateRestore() { 127 ScopedAppGLStateRestore::~ScopedAppGLStateRestore() {
128 TRACE_EVENT0("android_webview", "AppGLStateRestore");
106 MakeAppContextCurrent(); 129 MakeAppContextCurrent();
107 130
108 glBindBuffer(GL_ARRAY_BUFFER, vertex_array_buffer_binding_); 131 glBindBuffer(GL_ARRAY_BUFFER, vertex_array_buffer_binding_);
109 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, index_array_buffer_binding_); 132 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, index_array_buffer_binding_);
110 133
111 glBindTexture(GL_TEXTURE_EXTERNAL_OES, texture_external_oes_binding_); 134 glBindTexture(GL_TEXTURE_EXTERNAL_OES, texture_external_oes_binding_);
112 glPixelStorei(GL_PACK_ALIGNMENT, pack_alignment_); 135 glPixelStorei(GL_PACK_ALIGNMENT, pack_alignment_);
113 glPixelStorei(GL_UNPACK_ALIGNMENT, unpack_alignment_); 136 glPixelStorei(GL_UNPACK_ALIGNMENT, unpack_alignment_);
114 137
115 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(vertex_attrib_); ++i) { 138 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(vertex_attrib_); ++i) {
(...skipping 15 matching lines...) Expand all
131 glEnable(GL_DEPTH_TEST); 154 glEnable(GL_DEPTH_TEST);
132 } else { 155 } else {
133 glDisable(GL_DEPTH_TEST); 156 glDisable(GL_DEPTH_TEST);
134 } 157 }
135 158
136 if (cull_face_) { 159 if (cull_face_) {
137 glEnable(GL_CULL_FACE); 160 glEnable(GL_CULL_FACE);
138 } else { 161 } else {
139 glDisable(GL_CULL_FACE); 162 glDisable(GL_CULL_FACE);
140 } 163 }
164 glCullFace(cull_face_mode_);
141 165
142 glColorMask(color_mask_[0], color_mask_[1], color_mask_[2], color_mask_[3]); 166 glColorMask(color_mask_[0], color_mask_[1], color_mask_[2], color_mask_[3]);
143 167
144 if (blend_enabled_) { 168 glUseProgram(current_program_);
145 glEnable(GL_BLEND); 169
146 } else { 170 glClearColor(
147 glDisable(GL_BLEND); 171 color_clear_[0], color_clear_[1], color_clear_[2], color_clear_[3]);
172 glClearDepth(depth_clear_);
173 glDepthFunc(depth_func_);
174 glDepthMask(depth_mask_);
175 glDepthRange(depth_rage_[0], depth_rage_[1]);
176 glFrontFace(front_face_);
177 glHint(GL_GENERATE_MIPMAP_HINT, hint_generate_mipmap_);
178 // TODO(boliu): GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES ??
179 glLineWidth(line_width_);
180 glPolygonOffset(polygon_offset_factor_, polygon_offset_units_);
181 glSampleCoverage(sample_coverage_value_, sample_coverage_invert_);
182
183 if (enable_dither_)
184 glEnable(GL_DITHER);
185 else
186 glDisable(GL_DITHER);
joth 2013/07/23 22:02:54 Maybe extract a helper for all these: glEnable
187
188 if (enable_polygon_offset_fill_)
189 glEnable(GL_POLYGON_OFFSET_FILL);
190 else
191 glDisable(GL_POLYGON_OFFSET_FILL);
192
193 if (enable_sample_alpha_to_coverage_)
194 glEnable(GL_SAMPLE_ALPHA_TO_COVERAGE);
195 else
196 glDisable(GL_SAMPLE_ALPHA_TO_COVERAGE);
197
198 if (enable_sample_coverage_)
199 glEnable(GL_SAMPLE_COVERAGE);
200 else
201 glDisable(GL_SAMPLE_COVERAGE);
202
203 if (mode_ == MODE_DETACH_FROM_WINDOW) {
204 if (blend_enabled_)
205 glEnable(GL_BLEND);
206 else
207 glDisable(GL_BLEND);
208
209 glBlendFuncSeparate(
210 blend_src_rgb_, blend_dest_rgb_, blend_src_alpha_, blend_dest_alpha_);
211 glActiveTexture(active_texture_);
212
213 glViewport(viewport_[0], viewport_[1], viewport_[2], viewport_[3]);
214
215 if (scissor_test_)
216 glEnable(GL_SCISSOR_TEST);
217 else
218 glDisable(GL_SCISSOR_TEST);
219
220 glScissor(
221 scissor_box_[0], scissor_box_[1], scissor_box_[2], scissor_box_[3]);
148 } 222 }
149
150 glBlendFuncSeparate(
151 blend_src_rgb_, blend_dest_rgb_, blend_src_alpha_, blend_dest_alpha_);
152 glActiveTexture(active_texture_);
153
154 glViewport(viewport_[0], viewport_[1], viewport_[2], viewport_[3]);
155
156 if (scissor_test_) {
157 glEnable(GL_SCISSOR_TEST);
158 } else {
159 glDisable(GL_SCISSOR_TEST);
160 }
161
162 glScissor(
163 scissor_box_[0], scissor_box_[1], scissor_box_[2], scissor_box_[3]);
164
165 glUseProgram(current_program_);
166 } 223 }
167 224
168 } // namespace android_webview 225 } // namespace android_webview
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698