Index: android_webview/browser/scoped_app_gl_state_restore.cc |
diff --git a/android_webview/browser/scoped_app_gl_state_restore.cc b/android_webview/browser/scoped_app_gl_state_restore.cc |
index f7987dab8211f86772e210548b364a8d098c3282..71a5711a26f7967fdbef4830738e810a673b98c3 100644 |
--- a/android_webview/browser/scoped_app_gl_state_restore.cc |
+++ b/android_webview/browser/scoped_app_gl_state_restore.cc |
@@ -8,6 +8,7 @@ |
#include "base/debug/trace_event.h" |
#include "base/lazy_instance.h" |
+#include "ui/gl/gl_bindings.h" |
#include "ui/gl/gl_context.h" |
#include "ui/gl/gl_surface_stub.h" |
@@ -56,7 +57,94 @@ bool g_supports_oes_vertex_array_object = false; |
} // namespace |
-ScopedAppGLStateRestore::ScopedAppGLStateRestore(CallMode mode) : mode_(mode) { |
+namespace internal { |
+ |
+class ScopedAppGLStateRestoreImpl { |
+ public: |
+ ScopedAppGLStateRestoreImpl(ScopedAppGLStateRestore::CallMode mode); |
+ ~ScopedAppGLStateRestoreImpl(); |
+ |
+ bool stencil_enabled() const { return stencil_test_; } |
+ GLint framebuffer_binding_ext() const { return framebuffer_binding_ext_; } |
+ |
+ private: |
+ const ScopedAppGLStateRestore::CallMode mode_; |
+ |
+ GLint pack_alignment_; |
+ GLint unpack_alignment_; |
+ |
+ struct { |
+ GLint enabled; |
+ GLint size; |
+ GLint type; |
+ GLint normalized; |
+ GLint stride; |
+ GLvoid* pointer; |
+ GLint vertex_attrib_array_buffer_binding; |
+ GLfloat current_vertex_attrib[4]; |
+ } vertex_attrib_[3]; |
+ |
+ GLint vertex_array_buffer_binding_; |
+ GLint index_array_buffer_binding_; |
+ |
+ GLboolean depth_test_; |
+ GLboolean cull_face_; |
+ GLint cull_face_mode_; |
+ GLboolean color_mask_[4]; |
+ GLfloat color_clear_[4]; |
+ GLfloat depth_clear_; |
+ GLint current_program_; |
+ GLint depth_func_; |
+ GLboolean depth_mask_; |
+ GLfloat depth_rage_[2]; |
+ GLint front_face_; |
+ GLint hint_generate_mipmap_; |
+ GLfloat line_width_; |
+ GLfloat polygon_offset_factor_; |
+ GLfloat polygon_offset_units_; |
+ GLfloat sample_coverage_value_; |
+ GLboolean sample_coverage_invert_; |
+ |
+ GLboolean enable_dither_; |
+ GLboolean enable_polygon_offset_fill_; |
+ GLboolean enable_sample_alpha_to_coverage_; |
+ GLboolean enable_sample_coverage_; |
+ |
+ // Not saved/restored in MODE_DRAW. |
+ 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]; |
+ |
+ GLboolean stencil_test_; |
+ GLint stencil_func_; |
+ GLint stencil_mask_; |
+ GLint stencil_ref_; |
+ |
+ GLint framebuffer_binding_ext_; |
+ |
+ struct TextureBindings { |
+ GLint texture_2d; |
+ GLint texture_cube_map; |
+ GLint texture_external_oes; |
+ // TODO(boliu): TEXTURE_RECTANGLE_ARB |
+ }; |
+ |
+ std::vector<TextureBindings> texture_bindings_; |
+ |
+ GLint vertex_array_bindings_oes_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(ScopedAppGLStateRestoreImpl); |
+}; |
+ |
+ScopedAppGLStateRestoreImpl::ScopedAppGLStateRestoreImpl( |
+ ScopedAppGLStateRestore::CallMode mode) |
+ : mode_(mode) { |
TRACE_EVENT0("android_webview", "AppGLStateSave"); |
MakeAppContextCurrent(); |
@@ -76,11 +164,11 @@ ScopedAppGLStateRestore::ScopedAppGLStateRestore(CallMode mode) : mode_(mode) { |
glGetIntegerv(GL_ELEMENT_ARRAY_BUFFER_BINDING, &index_array_buffer_binding_); |
switch(mode_) { |
- case MODE_DRAW: |
+ case ScopedAppGLStateRestore::MODE_DRAW: |
DCHECK_EQ(0, vertex_array_buffer_binding_); |
DCHECK_EQ(0, index_array_buffer_binding_); |
break; |
- case MODE_RESOURCE_MANAGEMENT: |
+ case ScopedAppGLStateRestore::MODE_RESOURCE_MANAGEMENT: |
glGetBooleanv(GL_BLEND, &blend_enabled_); |
glGetIntegerv(GL_BLEND_SRC_RGB, &blend_src_rgb_); |
glGetIntegerv(GL_BLEND_SRC_ALPHA, &blend_src_alpha_); |
@@ -165,7 +253,7 @@ ScopedAppGLStateRestore::ScopedAppGLStateRestore(CallMode mode) : mode_(mode) { |
} |
} |
-ScopedAppGLStateRestore::~ScopedAppGLStateRestore() { |
+ScopedAppGLStateRestoreImpl::~ScopedAppGLStateRestoreImpl() { |
TRACE_EVENT0("android_webview", "AppGLStateRestore"); |
MakeAppContextCurrent(); |
@@ -240,10 +328,10 @@ ScopedAppGLStateRestore::~ScopedAppGLStateRestore() { |
GLEnableDisable(GL_SAMPLE_COVERAGE, enable_sample_coverage_); |
switch(mode_) { |
- case MODE_DRAW: |
+ case ScopedAppGLStateRestore::MODE_DRAW: |
// No-op. |
break; |
- case MODE_RESOURCE_MANAGEMENT: |
+ case ScopedAppGLStateRestore::MODE_RESOURCE_MANAGEMENT: |
GLEnableDisable(GL_BLEND, blend_enabled_); |
glBlendFuncSeparate( |
blend_src_rgb_, blend_dest_rgb_, blend_src_alpha_, blend_dest_alpha_); |
@@ -261,4 +349,19 @@ ScopedAppGLStateRestore::~ScopedAppGLStateRestore() { |
glStencilFunc(stencil_func_, stencil_mask_, stencil_ref_); |
} |
+} // namespace internal |
+ |
+ScopedAppGLStateRestore::ScopedAppGLStateRestore(CallMode mode) |
+ : impl_(new internal::ScopedAppGLStateRestoreImpl(mode)) { |
+} |
+ |
+ScopedAppGLStateRestore::~ScopedAppGLStateRestore() {} |
+ |
+bool ScopedAppGLStateRestore::stencil_enabled() const { |
+ return impl_->stencil_enabled(); |
+} |
+int ScopedAppGLStateRestore::framebuffer_binding_ext() const { |
+ return impl_->framebuffer_binding_ext(); |
+} |
+ |
} // namespace android_webview |