diff options
author | boliu@chromium.org <boliu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-05-26 06:04:15 +0000 |
---|---|---|
committer | boliu@chromium.org <boliu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-05-26 06:04:15 +0000 |
commit | 132983f9e12bf5650d1bd4ddf90687c05bbfd100 (patch) | |
tree | cde6e2c19507ac6b1452e761edf4b9d9385672e5 | |
parent | d7005628e3079da789479ec8748d03c7a6c1d628 (diff) | |
download | chromium_src-132983f9e12bf5650d1bd4ddf90687c05bbfd100.zip chromium_src-132983f9e12bf5650d1bd4ddf90687c05bbfd100.tar.gz chromium_src-132983f9e12bf5650d1bd4ddf90687c05bbfd100.tar.bz2 |
Bring back Leandro's GL state restore
BUG=230195
NOTRY=true
Review URL: https://chromiumcodereview.appspot.com/14860017
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@202348 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | android_webview/browser/in_process_renderer/in_process_view_renderer.cc | 154 |
1 files changed, 149 insertions, 5 deletions
diff --git a/android_webview/browser/in_process_renderer/in_process_view_renderer.cc b/android_webview/browser/in_process_renderer/in_process_view_renderer.cc index e0b9e8f..6ecdd62 100644 --- a/android_webview/browser/in_process_renderer/in_process_view_renderer.cc +++ b/android_webview/browser/in_process_renderer/in_process_view_renderer.cc @@ -25,6 +25,17 @@ #include "ui/gfx/vector2d_f.h" #include "ui/gl/gl_bindings.h" +// TODO(leandrogracia): Borrowed from gl2ext.h. Cannot be included due to +// conflicts with gl_bindings.h and the EGL library methods +// (eglGetCurrentContext). +#ifndef GL_TEXTURE_EXTERNAL_OES +#define GL_TEXTURE_EXTERNAL_OES 0x8D65 +#endif + +#ifndef GL_TEXTURE_BINDING_EXTERNAL_OES +#define GL_TEXTURE_BINDING_EXTERNAL_OES 0x8D67 +#endif + using base::android::AttachCurrentThread; using base::android::JavaRef; using base::android::ScopedJavaLocalRef; @@ -34,6 +45,142 @@ using content::ContentViewCore; namespace android_webview { namespace { + +class GLStateRestore { + public: + GLStateRestore() { + glGetIntegerv(GL_TEXTURE_BINDING_EXTERNAL_OES, + &texture_external_oes_binding_); + glGetIntegerv(GL_ARRAY_BUFFER_BINDING, &vertex_array_buffer_binding_); + glGetIntegerv(GL_ELEMENT_ARRAY_BUFFER_BINDING, + &index_array_buffer_binding_); + glGetIntegerv(GL_PACK_ALIGNMENT, &pack_alignment_); + glGetIntegerv(GL_UNPACK_ALIGNMENT, &unpack_alignment_); + + for (size_t i = 0; i < ARRAYSIZE_UNSAFE(vertex_attrib_); ++i) { + glGetVertexAttribiv( + i, GL_VERTEX_ATTRIB_ARRAY_ENABLED, &vertex_attrib_[i].enabled); + glGetVertexAttribiv( + i, GL_VERTEX_ATTRIB_ARRAY_SIZE, &vertex_attrib_[i].size); + glGetVertexAttribiv( + i, GL_VERTEX_ATTRIB_ARRAY_TYPE, &vertex_attrib_[i].type); + glGetVertexAttribiv( + i, GL_VERTEX_ATTRIB_ARRAY_NORMALIZED, &vertex_attrib_[i].normalized); + glGetVertexAttribiv( + i, GL_VERTEX_ATTRIB_ARRAY_STRIDE, &vertex_attrib_[i].stride); + glGetVertexAttribPointerv( + i, GL_VERTEX_ATTRIB_ARRAY_POINTER, &vertex_attrib_[i].pointer); + } + + glGetBooleanv(GL_DEPTH_TEST, &depth_test_); + glGetBooleanv(GL_CULL_FACE, &cull_face_); + glGetBooleanv(GL_COLOR_WRITEMASK, color_mask_); + glGetBooleanv(GL_BLEND, &blend_enabled_); + glGetIntegerv(GL_BLEND_SRC_RGB, &blend_src_rgb_); + glGetIntegerv(GL_BLEND_SRC_ALPHA, &blend_src_alpha_); + glGetIntegerv(GL_BLEND_DST_RGB, &blend_dest_rgb_); + glGetIntegerv(GL_BLEND_DST_ALPHA, &blend_dest_alpha_); + glGetIntegerv(GL_ACTIVE_TEXTURE, &active_texture_); + glGetIntegerv(GL_VIEWPORT, viewport_); + glGetBooleanv(GL_SCISSOR_TEST, &scissor_test_); + glGetIntegerv(GL_SCISSOR_BOX, scissor_box_); + glGetIntegerv(GL_CURRENT_PROGRAM, ¤t_program_); + + DCHECK_EQ(0, vertex_array_buffer_binding_); + DCHECK_EQ(0, index_array_buffer_binding_); + } + + ~GLStateRestore() { + glBindTexture(GL_TEXTURE_EXTERNAL_OES, texture_external_oes_binding_); + glBindBuffer(GL_ARRAY_BUFFER, vertex_array_buffer_binding_); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, index_array_buffer_binding_); + glPixelStorei(GL_PACK_ALIGNMENT, pack_alignment_); + glPixelStorei(GL_UNPACK_ALIGNMENT, unpack_alignment_); + + for (size_t i = 0; i < ARRAYSIZE_UNSAFE(vertex_attrib_); ++i) { + glVertexAttribPointer(i, + vertex_attrib_[i].size, + vertex_attrib_[i].type, + vertex_attrib_[i].normalized, + vertex_attrib_[i].stride, + vertex_attrib_[i].pointer); + + if (vertex_attrib_[i].enabled) { + glEnableVertexAttribArray(i); + } else { + glDisableVertexAttribArray(i); + } + } + + if (depth_test_) { + glEnable(GL_DEPTH_TEST); + } else { + glDisable(GL_DEPTH_TEST); + } + + if (cull_face_) { + glEnable(GL_CULL_FACE); + } else { + glDisable(GL_CULL_FACE); + } + + glColorMask(color_mask_[0], color_mask_[1], color_mask_[2], color_mask_[3]); + + if (blend_enabled_) { + glEnable(GL_BLEND); + } else { + glDisable(GL_BLEND); + } + + glBlendFuncSeparate( + blend_src_rgb_, blend_dest_rgb_, blend_src_alpha_, blend_dest_alpha_); + glActiveTexture(active_texture_); + + glViewport(viewport_[0], viewport_[1], viewport_[2], viewport_[3]); + + if (scissor_test_) { + glEnable(GL_SCISSOR_TEST); + } else { + glDisable(GL_SCISSOR_TEST); + } + + glScissor( + scissor_box_[0], scissor_box_[1], scissor_box_[2], scissor_box_[3]); + + glUseProgram(current_program_); + } + + private: + GLint texture_external_oes_binding_; + GLint vertex_array_buffer_binding_; + GLint index_array_buffer_binding_; + GLint pack_alignment_; + GLint unpack_alignment_; + + struct { + GLint enabled; + GLint size; + GLint type; + GLint normalized; + GLint stride; + GLvoid* pointer; + } vertex_attrib_[3]; + + GLboolean depth_test_; + GLboolean cull_face_; + GLboolean color_mask_[4]; + GLboolean blend_enabled_; + GLint blend_src_rgb_; + GLint blend_src_alpha_; + GLint blend_dest_rgb_; + GLint blend_dest_alpha_; + GLint active_texture_; + GLint viewport_[4]; + GLboolean scissor_test_; + GLint scissor_box_[4]; + GLint current_program_; +}; + const void* kUserDataKey = &kUserDataKey; class UserData : public content::WebContents::Data { @@ -198,6 +345,8 @@ void InProcessViewRenderer::DrawGL(AwDrawGLInfo* draw_info) { return; } + GLStateRestore state_restore; + if (attached_to_window_ && compositor_ && !hardware_initialized_) { // TODO(boliu): Actually initialize the compositor GL path. hardware_initialized_ = true; @@ -228,11 +377,6 @@ void InProcessViewRenderer::DrawGL(AwDrawGLInfo* draw_info) { draw_info->clip_right - draw_info->clip_left, draw_info->clip_bottom - draw_info->clip_top)); - // The GL functor must ensure these are set to zero before returning. - // Not setting them leads to graphical artifacts that can affect other apps. - glBindBuffer(GL_ARRAY_BUFFER, 0); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); - EnsureContinuousInvalidation(); } |