blob: 93b5ad51be63ef2827d8cdf25e7e6c03cca5b7fa [file] [log] [blame]
Ben Murdoch7dbb3d52013-07-17 14:55:54 +01001// Copyright 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
Torne (Richard Coles)a36e5922013-08-05 13:57:33 +01005#include <vector>
6
Ben Murdoch7dbb3d52013-07-17 14:55:54 +01007#include "base/basictypes.h"
8#include "ui/gl/gl_bindings.h"
9
10namespace gfx {
11class GLContext;
12}
13
14namespace android_webview {
15
16// This class is not thread safe and should only be used on the UI thread.
17class ScopedAppGLStateRestore {
18 public:
Ben Murdoch9ab55632013-07-18 11:57:30 +010019 enum CallMode {
20 MODE_DRAW,
21 MODE_DETACH_FROM_WINDOW
22 };
23
24 ScopedAppGLStateRestore(CallMode mode);
Ben Murdoch7dbb3d52013-07-17 14:55:54 +010025 ~ScopedAppGLStateRestore();
26
Ben Murdochfb250652013-07-31 11:42:55 +010027 bool stencil_enabled() const { return stencil_test_; }
Ben Murdochbb1529c2013-08-08 10:24:53 +010028 GLint framebuffer_binding_ext() const { return framebuffer_binding_ext_; }
Ben Murdochfb250652013-07-31 11:42:55 +010029
Ben Murdoch7dbb3d52013-07-17 14:55:54 +010030 private:
Ben Murdocha3f7b4e2013-07-24 10:36:34 +010031 const CallMode mode_;
32
Ben Murdoch7dbb3d52013-07-17 14:55:54 +010033 GLint pack_alignment_;
34 GLint unpack_alignment_;
35
36 struct {
37 GLint enabled;
38 GLint size;
39 GLint type;
40 GLint normalized;
41 GLint stride;
42 GLvoid* pointer;
43 } vertex_attrib_[3];
44
45 GLint vertex_array_buffer_binding_;
46 GLint index_array_buffer_binding_;
47
48 GLboolean depth_test_;
49 GLboolean cull_face_;
Ben Murdocha3f7b4e2013-07-24 10:36:34 +010050 GLint cull_face_mode_;
Ben Murdoch7dbb3d52013-07-17 14:55:54 +010051 GLboolean color_mask_[4];
Ben Murdocha3f7b4e2013-07-24 10:36:34 +010052 GLfloat color_clear_[4];
53 GLfloat depth_clear_;
54 GLint current_program_;
55 GLint depth_func_;
56 GLboolean depth_mask_;
57 GLfloat depth_rage_[2];
58 GLint front_face_;
59 GLint hint_generate_mipmap_;
60 GLfloat line_width_;
61 GLfloat polygon_offset_factor_;
62 GLfloat polygon_offset_units_;
63 GLfloat sample_coverage_value_;
64 GLboolean sample_coverage_invert_;
65
66 GLboolean enable_dither_;
67 GLboolean enable_polygon_offset_fill_;
68 GLboolean enable_sample_alpha_to_coverage_;
69 GLboolean enable_sample_coverage_;
70
71 // Not saved/restored in MODE_DRAW.
Ben Murdoch7dbb3d52013-07-17 14:55:54 +010072 GLboolean blend_enabled_;
73 GLint blend_src_rgb_;
74 GLint blend_src_alpha_;
75 GLint blend_dest_rgb_;
76 GLint blend_dest_alpha_;
77 GLint active_texture_;
78 GLint viewport_[4];
79 GLboolean scissor_test_;
80 GLint scissor_box_[4];
Ben Murdoch7dbb3d52013-07-17 14:55:54 +010081
Ben Murdochfb250652013-07-31 11:42:55 +010082 GLboolean stencil_test_;
83 GLint stencil_func_;
84 GLint stencil_mask_;
85 GLint stencil_ref_;
86
Ben Murdochbb1529c2013-08-08 10:24:53 +010087 GLint framebuffer_binding_ext_;
88
Torne (Richard Coles)a36e5922013-08-05 13:57:33 +010089 struct TextureBindings {
90 GLint texture_2d;
91 GLint texture_cube_map;
92 GLint texture_external_oes;
93 // TODO(boliu): TEXTURE_RECTANGLE_ARB
94 };
95
96 std::vector<TextureBindings> texture_bindings_;
97
Ben Murdoch7dbb3d52013-07-17 14:55:54 +010098 DISALLOW_COPY_AND_ASSIGN(ScopedAppGLStateRestore);
99};
100
101} // namespace android_webview