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, &current_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