17dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Copyright 2013 The Chromium Authors. All rights reserved. 27dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 37dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// found in the LICENSE file. 47dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 57dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "android_webview/browser/scoped_app_gl_state_restore.h" 67dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 70529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include <string> 80529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 9a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#include "base/debug/trace_event.h" 107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/lazy_instance.h" 110de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)#include "ui/gl/gl_bindings.h" 127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "ui/gl/gl_context.h" 137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "ui/gl/gl_surface_stub.h" 147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochnamespace android_webview { 167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochnamespace { 187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// "App" context is a bit of a stretch. Basically we use this context while 207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// saving and restoring the App GL state. 217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass AppContextSurface { 227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch public: 237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch AppContextSurface() 247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch : surface(new gfx::GLSurfaceStub), 257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch context(gfx::GLContext::CreateGLContext(NULL, 267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch surface.get(), 277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch gfx::PreferDiscreteGpu)) {} 287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch void MakeCurrent() { context->MakeCurrent(surface.get()); } 297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch private: 317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scoped_refptr<gfx::GLSurfaceStub> surface; 327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scoped_refptr<gfx::GLContext> context; 337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DISALLOW_COPY_AND_ASSIGN(AppContextSurface); 357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}; 367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochbase::LazyInstance<AppContextSurface> g_app_context_surface = 387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch LAZY_INSTANCE_INITIALIZER; 397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Make the global g_app_context_surface current so that the gl_binding is not 417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// NULL for making gl* calls. The binding can be null if another GlContext was 427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// destroyed immediately before gl* calls here. 437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid MakeAppContextCurrent() { 447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch g_app_context_surface.Get().MakeCurrent(); 457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 47a3f7b4e666c476898878fa745f637129375cd889Ben Murdochvoid GLEnableDisable(GLenum cap, bool enable) { 48a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch if (enable) 49a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch glEnable(cap); 50a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch else 51a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch glDisable(cap); 52a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch} 53a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 54cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool ClearGLErrors(bool warn, const char* msg) { 55cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool no_error = true; 56cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GLenum error; 57cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) while ((error = glGetError()) != GL_NO_ERROR) { 58cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DLOG_IF(WARNING, warn) << error << " " << msg; 59cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) no_error = false; 60cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 61cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 62cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return no_error; 63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 64cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 650529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochbool g_globals_initialized = false; 66a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)GLint g_gl_max_texture_units = 0; 675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liubool g_supports_oes_vertex_array_object = false; 68a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} // namespace 707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 710de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)namespace internal { 720de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) 730de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)class ScopedAppGLStateRestoreImpl { 740de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) public: 750de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) ScopedAppGLStateRestoreImpl(ScopedAppGLStateRestore::CallMode mode); 760de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) ~ScopedAppGLStateRestoreImpl(); 770de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) 780de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) bool stencil_enabled() const { return stencil_test_; } 790de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) GLint framebuffer_binding_ext() const { return framebuffer_binding_ext_; } 800de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) 810de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) private: 820de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) const ScopedAppGLStateRestore::CallMode mode_; 830de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) 840de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) GLint pack_alignment_; 850de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) GLint unpack_alignment_; 860de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) 870de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) struct { 880de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) GLint enabled; 890de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) GLint size; 900de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) GLint type; 910de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) GLint normalized; 920de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) GLint stride; 930de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) GLvoid* pointer; 940de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) GLint vertex_attrib_array_buffer_binding; 950de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) GLfloat current_vertex_attrib[4]; 960de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) } vertex_attrib_[3]; 970de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) 980de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) GLint vertex_array_buffer_binding_; 990de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) GLint index_array_buffer_binding_; 1000de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) 1010de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) GLboolean depth_test_; 1020de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) GLboolean cull_face_; 1030de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) GLint cull_face_mode_; 1040de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) GLboolean color_mask_[4]; 1050de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) GLfloat color_clear_[4]; 106f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) GLfloat blend_color_[4]; 1070de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) GLfloat depth_clear_; 1080de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) GLint current_program_; 1090de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) GLint depth_func_; 1100de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) GLboolean depth_mask_; 1110de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) GLfloat depth_rage_[2]; 1120de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) GLint front_face_; 1130de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) GLint hint_generate_mipmap_; 1140de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) GLfloat line_width_; 1150de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) GLfloat polygon_offset_factor_; 1160de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) GLfloat polygon_offset_units_; 1170de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) GLfloat sample_coverage_value_; 1180de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) GLboolean sample_coverage_invert_; 119f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) GLint blend_equation_rgb_; 120f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) GLint blend_equation_alpha_; 1210de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) 1220de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) GLboolean enable_dither_; 1230de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) GLboolean enable_polygon_offset_fill_; 1240de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) GLboolean enable_sample_alpha_to_coverage_; 1250de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) GLboolean enable_sample_coverage_; 1260de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) 1270de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) // Not saved/restored in MODE_DRAW. 1280de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) GLboolean blend_enabled_; 1290de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) GLint blend_src_rgb_; 1300de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) GLint blend_src_alpha_; 1310de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) GLint blend_dest_rgb_; 1320de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) GLint blend_dest_alpha_; 1330de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) GLint active_texture_; 1340de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) GLint viewport_[4]; 1350de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) GLboolean scissor_test_; 1360de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) GLint scissor_box_[4]; 1370de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) 1380de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) GLboolean stencil_test_; 139f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) GLint stencil_front_func_; 140f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) GLint stencil_front_ref_; 141f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) GLint stencil_front_mask_; 142f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) GLint stencil_back_func_; 143f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) GLint stencil_back_ref_; 144f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) GLint stencil_back_mask_; 145f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) GLint stencil_clear_; 146f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) GLint stencil_front_writemask_; 147f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) GLint stencil_back_writemask_; 148f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) GLint stencil_front_fail_op_; 149f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) GLint stencil_front_z_fail_op_; 150f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) GLint stencil_front_z_pass_op_; 151f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) GLint stencil_back_fail_op_; 152f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) GLint stencil_back_z_fail_op_; 153f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) GLint stencil_back_z_pass_op_; 1540de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) 1550de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) GLint framebuffer_binding_ext_; 1560de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) 1570de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) struct TextureBindings { 1580de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) GLint texture_2d; 1590de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) GLint texture_cube_map; 1600de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) GLint texture_external_oes; 1610de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) // TODO(boliu): TEXTURE_RECTANGLE_ARB 1620de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) }; 1630de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) 1640de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) std::vector<TextureBindings> texture_bindings_; 1650de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) 1660de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) GLint vertex_array_bindings_oes_; 1670de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) 1680de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ScopedAppGLStateRestoreImpl); 1690de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)}; 1700de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) 1710de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)ScopedAppGLStateRestoreImpl::ScopedAppGLStateRestoreImpl( 1720de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) ScopedAppGLStateRestore::CallMode mode) 1730de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) : mode_(mode) { 174a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch TRACE_EVENT0("android_webview", "AppGLStateSave"); 1757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch MakeAppContextCurrent(); 1767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 177cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ClearGLErrors(true, "Incoming GLError"); 178cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (!g_globals_initialized) { 1805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu g_globals_initialized = true; 1815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu glGetIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, &g_gl_max_texture_units); 1835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu DCHECK_GT(g_gl_max_texture_units, 0); 1845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu std::string extensions( 1865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu reinterpret_cast<const char*>(glGetString(GL_EXTENSIONS))); 1875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu g_supports_oes_vertex_array_object = 1885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu extensions.find("GL_OES_vertex_array_object") != std::string::npos; 1895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 1905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch glGetIntegerv(GL_ARRAY_BUFFER_BINDING, &vertex_array_buffer_binding_); 1927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch glGetIntegerv(GL_ELEMENT_ARRAY_BUFFER_BINDING, &index_array_buffer_binding_); 1937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 194a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch switch(mode_) { 1950de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) case ScopedAppGLStateRestore::MODE_DRAW: 19668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) DCHECK_EQ(0, vertex_array_buffer_binding_); 19768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) DCHECK_EQ(0, index_array_buffer_binding_); 1989ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch break; 1990de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) case ScopedAppGLStateRestore::MODE_RESOURCE_MANAGEMENT: 200a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch glGetBooleanv(GL_BLEND, &blend_enabled_); 201a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch glGetIntegerv(GL_BLEND_SRC_RGB, &blend_src_rgb_); 202a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch glGetIntegerv(GL_BLEND_SRC_ALPHA, &blend_src_alpha_); 203a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch glGetIntegerv(GL_BLEND_DST_RGB, &blend_dest_rgb_); 204a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch glGetIntegerv(GL_BLEND_DST_ALPHA, &blend_dest_alpha_); 205a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch glGetIntegerv(GL_VIEWPORT, viewport_); 206a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch glGetBooleanv(GL_SCISSOR_TEST, &scissor_test_); 207a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch glGetIntegerv(GL_SCISSOR_BOX, scissor_box_); 2089ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch break; 2099ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch } 2109ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch 2117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch glGetIntegerv(GL_PACK_ALIGNMENT, &pack_alignment_); 2127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch glGetIntegerv(GL_UNPACK_ALIGNMENT, &unpack_alignment_); 2137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 2147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch glGetBooleanv(GL_DEPTH_TEST, &depth_test_); 2157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch glGetBooleanv(GL_CULL_FACE, &cull_face_); 216a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch glGetIntegerv(GL_CULL_FACE_MODE, &cull_face_mode_); 2177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch glGetBooleanv(GL_COLOR_WRITEMASK, color_mask_); 2187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch glGetIntegerv(GL_CURRENT_PROGRAM, ¤t_program_); 219a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch glGetFloatv(GL_COLOR_CLEAR_VALUE, color_clear_); 220a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch glGetFloatv(GL_DEPTH_CLEAR_VALUE, &depth_clear_); 221f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) glGetFloatv(GL_BLEND_COLOR, blend_color_); 222a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch glGetIntegerv(GL_DEPTH_FUNC, &depth_func_); 223a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch glGetBooleanv(GL_DEPTH_WRITEMASK, &depth_mask_); 224a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch glGetFloatv(GL_DEPTH_RANGE, depth_rage_); 225a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch glGetIntegerv(GL_FRONT_FACE, &front_face_); 226a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch glGetIntegerv(GL_GENERATE_MIPMAP_HINT, &hint_generate_mipmap_); 227a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch glGetFloatv(GL_LINE_WIDTH, &line_width_); 228a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch glGetFloatv(GL_POLYGON_OFFSET_FACTOR, &polygon_offset_factor_); 229a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch glGetFloatv(GL_POLYGON_OFFSET_UNITS, &polygon_offset_units_); 230a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch glGetFloatv(GL_SAMPLE_COVERAGE_VALUE, &sample_coverage_value_); 231a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch glGetBooleanv(GL_SAMPLE_COVERAGE_INVERT, &sample_coverage_invert_); 232f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) glGetIntegerv(GL_BLEND_EQUATION_RGB, &blend_equation_rgb_); 233f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) glGetIntegerv(GL_BLEND_EQUATION_ALPHA, &blend_equation_alpha_); 234a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 235a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch glGetBooleanv(GL_DITHER, &enable_dither_); 236a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch glGetBooleanv(GL_POLYGON_OFFSET_FILL, &enable_polygon_offset_fill_); 237a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch glGetBooleanv(GL_SAMPLE_ALPHA_TO_COVERAGE, &enable_sample_alpha_to_coverage_); 238a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch glGetBooleanv(GL_SAMPLE_COVERAGE, &enable_sample_coverage_); 239a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 240fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch glGetBooleanv(GL_STENCIL_TEST, &stencil_test_); 241f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) glGetIntegerv(GL_STENCIL_FUNC, &stencil_front_func_); 242f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) glGetIntegerv(GL_STENCIL_VALUE_MASK, &stencil_front_mask_); 243f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) glGetIntegerv(GL_STENCIL_REF, &stencil_front_ref_); 244f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) glGetIntegerv(GL_STENCIL_BACK_FUNC, &stencil_back_func_); 245f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) glGetIntegerv(GL_STENCIL_BACK_VALUE_MASK, &stencil_back_mask_); 246f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) glGetIntegerv(GL_STENCIL_BACK_REF, &stencil_back_ref_); 247f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) glGetIntegerv(GL_STENCIL_CLEAR_VALUE, &stencil_clear_); 248f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) glGetIntegerv(GL_STENCIL_WRITEMASK, &stencil_front_writemask_); 249f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) glGetIntegerv(GL_STENCIL_BACK_WRITEMASK, &stencil_back_writemask_); 250f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) glGetIntegerv(GL_STENCIL_FAIL, &stencil_front_fail_op_); 251f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) glGetIntegerv(GL_STENCIL_PASS_DEPTH_FAIL, &stencil_front_z_fail_op_); 252f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) glGetIntegerv(GL_STENCIL_PASS_DEPTH_PASS, &stencil_front_z_pass_op_); 253f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) glGetIntegerv(GL_STENCIL_BACK_FAIL, &stencil_back_fail_op_); 254f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) glGetIntegerv(GL_STENCIL_BACK_PASS_DEPTH_FAIL, &stencil_back_z_fail_op_); 255f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) glGetIntegerv(GL_STENCIL_BACK_PASS_DEPTH_PASS, &stencil_back_z_pass_op_); 256a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 257bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch glGetIntegerv(GL_FRAMEBUFFER_BINDING_EXT, &framebuffer_binding_ext_); 258a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 259a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) glGetIntegerv(GL_ACTIVE_TEXTURE, &active_texture_); 260a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 261a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) texture_bindings_.resize(g_gl_max_texture_units); 262a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) for (int ii = 0; ii < g_gl_max_texture_units; ++ii) { 263a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) glActiveTexture(GL_TEXTURE0 + ii); 264a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) TextureBindings& bindings = texture_bindings_[ii]; 265a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) glGetIntegerv(GL_TEXTURE_BINDING_2D, &bindings.texture_2d); 266a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) glGetIntegerv(GL_TEXTURE_BINDING_CUBE_MAP, &bindings.texture_cube_map); 267a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) glGetIntegerv(GL_TEXTURE_BINDING_EXTERNAL_OES, 268a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) &bindings.texture_external_oes); 269a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 2700529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 2715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (g_supports_oes_vertex_array_object) { 2720529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch glGetIntegerv(GL_VERTEX_ARRAY_BINDING_OES, &vertex_array_bindings_oes_); 2735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu glBindVertexArrayOES(0); 2745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 2755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 2765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu for (size_t i = 0; i < ARRAYSIZE_UNSAFE(vertex_attrib_); ++i) { 2775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu glGetVertexAttribiv( 2785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu i, GL_VERTEX_ATTRIB_ARRAY_ENABLED, &vertex_attrib_[i].enabled); 2795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu glGetVertexAttribiv( 2805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu i, GL_VERTEX_ATTRIB_ARRAY_SIZE, &vertex_attrib_[i].size); 2815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu glGetVertexAttribiv( 2825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu i, GL_VERTEX_ATTRIB_ARRAY_TYPE, &vertex_attrib_[i].type); 2835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu glGetVertexAttribiv( 2845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu i, GL_VERTEX_ATTRIB_ARRAY_NORMALIZED, &vertex_attrib_[i].normalized); 2855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu glGetVertexAttribiv( 2865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu i, GL_VERTEX_ATTRIB_ARRAY_STRIDE, &vertex_attrib_[i].stride); 2875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu glGetVertexAttribPointerv( 2885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu i, GL_VERTEX_ATTRIB_ARRAY_POINTER, &vertex_attrib_[i].pointer); 2895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu glGetVertexAttribPointerv( 2905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu i, GL_VERTEX_ATTRIB_ARRAY_POINTER, &vertex_attrib_[i].pointer); 2915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu glGetVertexAttribiv(i, 2925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING, 2935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu &vertex_attrib_[i].vertex_attrib_array_buffer_binding); 2945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu glGetVertexAttribfv( 2955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu i, GL_CURRENT_VERTEX_ATTRIB, vertex_attrib_[i].current_vertex_attrib); 2965c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 29782266bf9494bbc751c5d727835bf0988a6c51004boliu 29882266bf9494bbc751c5d727835bf0988a6c51004boliu // Android 5.0.0 specific qualcomm workaround. See crbug.com/434570. 29982266bf9494bbc751c5d727835bf0988a6c51004boliu glBindRenderbufferEXT(GL_RENDERBUFFER, 0); 300cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DCHECK(ClearGLErrors(false, NULL)); 3017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 3027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 3030de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)ScopedAppGLStateRestoreImpl::~ScopedAppGLStateRestoreImpl() { 304a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch TRACE_EVENT0("android_webview", "AppGLStateRestore"); 3057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch MakeAppContextCurrent(); 3067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 307cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DCHECK(ClearGLErrors(false, NULL)); 308cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 309bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch glBindFramebufferEXT(GL_FRAMEBUFFER, framebuffer_binding_ext_); 3107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, index_array_buffer_binding_); 3117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 3125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (g_supports_oes_vertex_array_object) 3135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu glBindVertexArrayOES(0); 3147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 3157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch for (size_t i = 0; i < ARRAYSIZE_UNSAFE(vertex_attrib_); ++i) { 3165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu glBindBuffer(GL_ARRAY_BUFFER, 3175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu vertex_attrib_[i].vertex_attrib_array_buffer_binding); 3187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch glVertexAttribPointer(i, 3197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch vertex_attrib_[i].size, 3207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch vertex_attrib_[i].type, 3217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch vertex_attrib_[i].normalized, 3227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch vertex_attrib_[i].stride, 3237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch vertex_attrib_[i].pointer); 3247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 3255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu glVertexAttrib4fv(i, vertex_attrib_[i].current_vertex_attrib); 3265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 3277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (vertex_attrib_[i].enabled) { 3287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch glEnableVertexAttribArray(i); 3297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } else { 3307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch glDisableVertexAttribArray(i); 3317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 3327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 3337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 3345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (g_supports_oes_vertex_array_object && vertex_array_bindings_oes_ != 0) 3355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu glBindVertexArrayOES(vertex_array_bindings_oes_); 3365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 3375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu glBindBuffer(GL_ARRAY_BUFFER, vertex_array_buffer_binding_); 3385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 3395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu for (int ii = 0; ii < g_gl_max_texture_units; ++ii) { 3405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu glActiveTexture(GL_TEXTURE0 + ii); 3415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu TextureBindings& bindings = texture_bindings_[ii]; 3425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu glBindTexture(GL_TEXTURE_2D, bindings.texture_2d); 3435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu glBindTexture(GL_TEXTURE_CUBE_MAP, bindings.texture_cube_map); 3445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu glBindTexture(GL_TEXTURE_EXTERNAL_OES, bindings.texture_external_oes); 3455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 3465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu glActiveTexture(active_texture_); 3475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 3485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu glPixelStorei(GL_PACK_ALIGNMENT, pack_alignment_); 3495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu glPixelStorei(GL_UNPACK_ALIGNMENT, unpack_alignment_); 3505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 351a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch GLEnableDisable(GL_DEPTH_TEST, depth_test_); 3527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 353a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch GLEnableDisable(GL_CULL_FACE, cull_face_); 354a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch glCullFace(cull_face_mode_); 3557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 3567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch glColorMask(color_mask_[0], color_mask_[1], color_mask_[2], color_mask_[3]); 3577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 358a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch glUseProgram(current_program_); 3597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 360a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch glClearColor( 361a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch color_clear_[0], color_clear_[1], color_clear_[2], color_clear_[3]); 362f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) glBlendColor( 363f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) blend_color_[0], blend_color_[1], blend_color_[2], blend_color_[3]); 364a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch glClearDepth(depth_clear_); 365a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch glDepthFunc(depth_func_); 366a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch glDepthMask(depth_mask_); 367a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch glDepthRange(depth_rage_[0], depth_rage_[1]); 368a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch glFrontFace(front_face_); 369a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch glHint(GL_GENERATE_MIPMAP_HINT, hint_generate_mipmap_); 370a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch // TODO(boliu): GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES ?? 371a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch glLineWidth(line_width_); 372a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch glPolygonOffset(polygon_offset_factor_, polygon_offset_units_); 373a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch glSampleCoverage(sample_coverage_value_, sample_coverage_invert_); 374f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) glBlendEquationSeparate(blend_equation_rgb_, blend_equation_alpha_); 375a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 376a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch GLEnableDisable(GL_DITHER, enable_dither_); 377a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch GLEnableDisable(GL_POLYGON_OFFSET_FILL, enable_polygon_offset_fill_); 378a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch GLEnableDisable(GL_SAMPLE_ALPHA_TO_COVERAGE, 379a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch enable_sample_alpha_to_coverage_); 380a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch GLEnableDisable(GL_SAMPLE_COVERAGE, enable_sample_coverage_); 381a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 3824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) switch(mode_) { 3830de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) case ScopedAppGLStateRestore::MODE_DRAW: 3844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // No-op. 3854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) break; 3860de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) case ScopedAppGLStateRestore::MODE_RESOURCE_MANAGEMENT: 3874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) GLEnableDisable(GL_BLEND, blend_enabled_); 3884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) glBlendFuncSeparate( 3894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) blend_src_rgb_, blend_dest_rgb_, blend_src_alpha_, blend_dest_alpha_); 390a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 3914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) glViewport(viewport_[0], viewport_[1], viewport_[2], viewport_[3]); 392a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 3934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) GLEnableDisable(GL_SCISSOR_TEST, scissor_test_); 394a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 3954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) glScissor( 3964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scissor_box_[0], scissor_box_[1], scissor_box_[2], scissor_box_[3]); 3974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) break; 3987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 399fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch 400fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch GLEnableDisable(GL_STENCIL_TEST, stencil_test_); 401f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) glStencilFuncSeparate( 402f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) GL_FRONT, stencil_front_func_, stencil_front_mask_, stencil_front_ref_); 403f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) glStencilFuncSeparate( 404f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) GL_BACK, stencil_back_func_, stencil_back_mask_, stencil_back_ref_); 405f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) glClearStencil(stencil_clear_); 406f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) glStencilMaskSeparate(GL_FRONT, stencil_front_writemask_); 407f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) glStencilMaskSeparate(GL_BACK, stencil_back_writemask_); 408f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) glStencilOpSeparate(GL_FRONT, 409f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) stencil_front_fail_op_, 410f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) stencil_front_z_fail_op_, 411f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) stencil_front_z_pass_op_); 412f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) glStencilOpSeparate(GL_BACK, 413f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) stencil_back_fail_op_, 414f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) stencil_back_z_fail_op_, 415f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) stencil_back_z_pass_op_); 416cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 417cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Do not leak GLError out of chromium. 418cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ClearGLErrors(true, "Chromium GLError"); 4197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 4207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 4210de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)} // namespace internal 4220de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) 4230de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)ScopedAppGLStateRestore::ScopedAppGLStateRestore(CallMode mode) 4240de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) : impl_(new internal::ScopedAppGLStateRestoreImpl(mode)) { 4250de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)} 4260de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) 4270de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)ScopedAppGLStateRestore::~ScopedAppGLStateRestore() {} 4280de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) 4290de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)bool ScopedAppGLStateRestore::stencil_enabled() const { 4300de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) return impl_->stencil_enabled(); 4310de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)} 4320de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)int ScopedAppGLStateRestore::framebuffer_binding_ext() const { 4330de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) return impl_->framebuffer_binding_ext(); 4340de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)} 4350de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) 4367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} // namespace android_webview 437