Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(309)

Unified Diff: gpu/command_buffer/service/context_state.cc

Issue 12321068: Add GL State Restoring Functions (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase Created 7 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « gpu/command_buffer/service/context_state.h ('k') | gpu/command_buffer/service/gles2_cmd_decoder.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 9942e9d249e3f071c353a68bf00dec794c17e581..7eaaa17805ab225a0aeba3d7ec5ef39a0422a777 100644
--- a/gpu/command_buffer/service/context_state.cc
+++ b/gpu/command_buffer/service/context_state.cc
@@ -44,7 +44,84 @@ ContextState::ContextState(FeatureInfo* feature_info)
ContextState::~ContextState() {
}
-void ContextState::RestoreState() const {
+void ContextState::RestoreTextureUnitBindings(GLuint unit) const {
+ DCHECK_LT(unit, texture_units.size());
+ const TextureUnit& texture_unit = texture_units[unit];
+ glActiveTexture(GL_TEXTURE0 + unit);
+ 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);
+
+ if (feature_info_->feature_flags().oes_egl_image_external) {
+ service_id = texture_unit.bound_texture_external_oes ?
+ texture_unit.bound_texture_external_oes->service_id() : 0;
+ glBindTexture(GL_TEXTURE_EXTERNAL_OES, service_id);
+ }
+
+ if (feature_info_->feature_flags().arb_texture_rectangle) {
+ service_id = texture_unit.bound_texture_rectangle_arb ?
+ texture_unit.bound_texture_rectangle_arb->service_id() : 0;
+ glBindTexture(GL_TEXTURE_RECTANGLE_ARB, service_id);
+ }
+}
+
+void ContextState::RestoreBufferBindings() const {
+ if (vertex_attrib_manager) {
+ 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);
+ }
+ glBindBuffer(
+ GL_ARRAY_BUFFER,
+ bound_array_buffer ? bound_array_buffer->service_id() : 0);
+}
+
+void ContextState::RestoreRenderbufferBindings() const {
+ // Restore Bindings
+ glBindRenderbufferEXT(
+ GL_RENDERBUFFER,
+ bound_renderbuffer ? bound_renderbuffer->service_id() : 0);
+}
+
+void ContextState::RestoreProgramBindings() const {
+ glUseProgram(current_program ? current_program->service_id() : 0);
+}
+
+void ContextState::RestoreActiveTexture() const {
+ glActiveTexture(GL_TEXTURE0 + active_texture_unit);
+}
+
+void ContextState::RestoreAttribute(GLuint attrib) const {
+ 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);
+ }
+ }
+ glVertexAttrib4fv(attrib, attrib_values[attrib].v);
+}
+
+void ContextState::RestoreGlobalState() const {
InitCapabilities();
InitState();
@@ -54,31 +131,14 @@ void ContextState::RestoreState() const {
glHint(GL_GENERATE_MIPMAP_HINT, hint_generate_mipmap);
// TODO: If OES_standard_derivatives is available
// restore GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES
+}
+void ContextState::RestoreState() const {
// 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);
-
- if (feature_info_->feature_flags().oes_egl_image_external) {
- service_id = texture_unit.bound_texture_external_oes ?
- texture_unit.bound_texture_external_oes->service_id() : 0;
- glBindTexture(GL_TEXTURE_EXTERNAL_OES, service_id);
- }
-
- if (feature_info_->feature_flags().arb_texture_rectangle) {
- service_id = texture_unit.bound_texture_rectangle_arb ?
- texture_unit.bound_texture_rectangle_arb->service_id() : 0;
- glBindTexture(GL_TEXTURE_RECTANGLE_ARB, service_id);
- }
+ RestoreTextureUnitBindings(ii);
}
- glActiveTexture(GL_TEXTURE0 + active_texture_unit);
+ RestoreActiveTexture();
// Restore Attrib State
// TODO: This if should not be needed. RestoreState is getting called
@@ -87,45 +147,12 @@ void ContextState::RestoreState() const {
// TODO(gman): Move this restoration to VertexAttribManager.
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);
- }
- }
- glVertexAttrib4fv(attrib, attrib_values[attrib].v);
+ RestoreAttribute(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);
+ RestoreRenderbufferBindings();
+ RestoreProgramBindings();
}
// Include the auto-generated part of this file. We split this because it means
« no previous file with comments | « gpu/command_buffer/service/context_state.h ('k') | gpu/command_buffer/service/gles2_cmd_decoder.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698