Index: gpu/command_buffer/service/context_state.cc |
diff --git a/gpu/command_buffer/service/context_state.cc b/gpu/command_buffer/service/context_state.cc |
index f0524abb5722ebb6a8e5771b07ede0c5450edce4..ec3ca144a7c78e59811b5ac78d15ecf7d694e416 100644 |
--- a/gpu/command_buffer/service/context_state.cc |
+++ b/gpu/command_buffer/service/context_state.cc |
@@ -5,6 +5,8 @@ |
#include "gpu/command_buffer/service/context_state.h" |
#include "gpu/command_buffer/common/gles2_cmd_utils.h" |
+#include "ui/gl/gl_bindings.h" |
+#include "ui/gl/gl_implementation.h" |
namespace gpu { |
namespace gles2 { |
@@ -32,8 +34,6 @@ ContextState::ContextState() |
: pack_alignment(4), |
unpack_alignment(4), |
active_texture_unit(0), |
- viewport_max_width(0), |
- viewport_max_height(0), |
hint_generate_mipmap(GL_DONT_CARE), |
hint_fragment_shader_derivative(GL_DONT_CARE), |
pack_reverse_row_order(false) { |
@@ -43,6 +43,78 @@ ContextState::ContextState() |
ContextState::~ContextState() { |
} |
+void ContextState::RestoreState() const { |
+ InitCapabilities(); |
+ InitState(); |
+ |
+ glPixelStorei(GL_PACK_ALIGNMENT, pack_alignment); |
+ glPixelStorei(GL_UNPACK_ALIGNMENT, unpack_alignment); |
+ |
+ glHint(GL_GENERATE_MIPMAP_HINT, hint_generate_mipmap); |
+ // TODO: If OES_standard_derivatives is available |
+ // restore GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES |
+ |
+ // Restore Texture state. |
+ for (size_t ii = 0; ii < texture_units.size(); ++ii) { |
+ const TextureUnit& texture_unit = texture_units[ii]; |
+ glActiveTexture(GL_TEXTURE0 + ii); |
+ GLuint service_id = texture_unit.bound_texture_2d ? |
+ texture_unit.bound_texture_2d->service_id() : 0; |
+ glBindTexture(GL_TEXTURE_2D, service_id); |
+ service_id = texture_unit.bound_texture_cube_map ? |
+ texture_unit.bound_texture_cube_map->service_id() : 0; |
+ glBindTexture(GL_TEXTURE_CUBE_MAP, service_id); |
+ // TODO: Restore bindings for GL_TEXTURE_RECTANGLE_ARB and |
+ // GL_TEXTURE_EXTERNAL_OES. |
+ } |
+ glActiveTexture(GL_TEXTURE0 + active_texture_unit); |
+ |
+ // Restore Attrib State |
+ // TODO: This if should not be needed. RestoreState is getting called |
+ // before GLES2Decoder::Initialize which is a bug. |
+ if (vertex_attrib_manager) { |
+ for (size_t attrib = 0; attrib < vertex_attrib_manager->num_attribs(); |
+ ++attrib) { |
+ const VertexAttribManager::VertexAttribInfo* info = |
+ vertex_attrib_manager->GetVertexAttribInfo(attrib); |
+ const void* ptr = reinterpret_cast<const void*>(info->offset()); |
+ BufferManager::BufferInfo* buffer_info = info->buffer(); |
+ glBindBuffer( |
+ GL_ARRAY_BUFFER, buffer_info ? buffer_info->service_id() : 0); |
+ glVertexAttribPointer( |
+ attrib, info->size(), info->type(), info->normalized(), |
+ info->gl_stride(), ptr); |
+ if (info->divisor()) |
+ glVertexAttribDivisorANGLE(attrib, info->divisor()); |
+ // Never touch vertex attribute 0's state (in particular, never |
+ // disable it) when running on desktop GL because it will never be |
+ // re-enabled. |
+ if (attrib != 0 || |
+ gfx::GetGLImplementation() == gfx::kGLImplementationEGLGLES2) { |
+ if (info->enabled()) { |
+ glEnableVertexAttribArray(attrib); |
+ } else { |
+ glDisableVertexAttribArray(attrib); |
+ } |
+ } |
+ } |
+ BufferManager::BufferInfo* element_array_buffer = |
+ vertex_attrib_manager->element_array_buffer(); |
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, |
+ element_array_buffer ? element_array_buffer->service_id() : 0); |
+ } |
+ |
+ // Restore Bindings |
+ glBindBuffer( |
+ GL_ARRAY_BUFFER, |
+ bound_array_buffer ? bound_array_buffer->service_id() : 0); |
+ glBindRenderbufferEXT( |
+ GL_RENDERBUFFER, |
+ bound_renderbuffer ? bound_renderbuffer->service_id() : 0); |
+ |
+ glUseProgram(current_program ? current_program->service_id() : 0); |
+} |
+ |
// Include the auto-generated part of this file. We split this because it means |
// we can easily edit the non-auto generated parts right here in this file |
// instead of having to edit some template or the code generator. |