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

Unified Diff: gpu/command_buffer/client/gles2_implementation.cc

Issue 11363191: Cache more GL state both service and client side. (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Created 8 years, 1 month 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
Index: gpu/command_buffer/client/gles2_implementation.cc
diff --git a/gpu/command_buffer/client/gles2_implementation.cc b/gpu/command_buffer/client/gles2_implementation.cc
index 8960cff9767e1fd7c46ccaecce8f2eca089577bc..8f67194c56c55621b0490d16898cd382122b8144 100644
--- a/gpu/command_buffer/client/gles2_implementation.cc
+++ b/gpu/command_buffer/client/gles2_implementation.cc
@@ -391,7 +391,7 @@ const size_t GLES2Implementation::kMaxSizeOfSimpleResult;
const unsigned int GLES2Implementation::kStartingOffset;
#endif
-GLES2Implementation::GLCachedState::IntState::IntState()
+GLES2Implementation::GLStaticState::IntState::IntState()
: max_combined_texture_image_units(0),
max_cube_map_texture_size(0),
max_fragment_uniform_vectors(0),
@@ -437,6 +437,7 @@ GLES2Implementation::GLES2Implementation(
active_texture_unit_(0),
bound_framebuffer_(0),
bound_renderbuffer_(0),
+ current_program_(0),
bound_array_buffer_id_(0),
bound_element_array_buffer_id_(0),
client_side_array_id_(0),
@@ -503,16 +504,17 @@ bool GLES2Implementation::Initialize(
GetMultipleIntegervCHROMIUM(
pnames, arraysize(pnames),
- &gl_state_.int_state.max_combined_texture_image_units,
- sizeof(gl_state_.int_state));
+ &static_state_.int_state.max_combined_texture_image_units,
+ sizeof(static_state_.int_state));
util_.set_num_compressed_texture_formats(
- gl_state_.int_state.num_compressed_texture_formats);
+ static_state_.int_state.num_compressed_texture_formats);
util_.set_num_shader_binary_formats(
- gl_state_.int_state.num_shader_binary_formats);
+ static_state_.int_state.num_shader_binary_formats);
texture_units_.reset(
- new TextureUnit[gl_state_.int_state.max_combined_texture_image_units]);
+ new TextureUnit[
+ static_state_.int_state.max_combined_texture_image_units]);
query_tracker_.reset(new QueryTracker(mapped_memory_.get()));
@@ -521,7 +523,7 @@ bool GLES2Implementation::Initialize(
this, kClientSideArrayId, arraysize(reserved_ids_), &reserved_ids_[0]);
client_side_buffer_helper_.reset(new ClientSideBufferHelper(
- gl_state_.int_state.max_vertex_attribs,
+ static_state_.int_state.max_vertex_attribs,
reserved_ids_[0],
reserved_ids_[1]));
#endif
@@ -810,54 +812,24 @@ void GLES2Implementation::SetBucketAsString(
SetBucketContents(bucket_id, str.c_str(), str.size() + 1);
}
-bool GLES2Implementation::SetCapabilityState(GLenum cap, bool enabled) {
- switch (cap) {
- case GL_DITHER:
- gl_state_.enable_state.dither = enabled;
- return true;
- case GL_BLEND:
- gl_state_.enable_state.blend = enabled;
- return true;
- case GL_CULL_FACE:
- gl_state_.enable_state.cull_face = enabled;
- return true;
- case GL_DEPTH_TEST:
- gl_state_.enable_state.depth_test = enabled;
- return true;
- case GL_POLYGON_OFFSET_FILL:
- gl_state_.enable_state.polygon_offset_fill = enabled;
- return true;
- case GL_SAMPLE_ALPHA_TO_COVERAGE:
- gl_state_.enable_state.sample_alpha_to_coverage = enabled;
- return true;
- case GL_SAMPLE_COVERAGE:
- gl_state_.enable_state.sample_coverage = enabled;
- return true;
- case GL_SCISSOR_TEST:
- gl_state_.enable_state.scissor_test = enabled;
- return true;
- case GL_STENCIL_TEST:
- gl_state_.enable_state.stencil_test = enabled;
- return true;
- default:
- return false;
- }
-}
-
void GLES2Implementation::Disable(GLenum cap) {
GPU_CLIENT_SINGLE_THREAD_CHECK();
GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glDisable("
<< GLES2Util::GetStringCapability(cap) << ")");
- SetCapabilityState(cap, false);
- helper_->Disable(cap);
+ bool changed = false;
+ if (!state_.SetCapabilityState(cap, false, &changed) || changed) {
+ helper_->Disable(cap);
+ }
}
void GLES2Implementation::Enable(GLenum cap) {
GPU_CLIENT_SINGLE_THREAD_CHECK();
GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glEnable("
<< GLES2Util::GetStringCapability(cap) << ")");
- SetCapabilityState(cap, true);
- helper_->Enable(cap);
+ bool changed = false;
+ if (!state_.SetCapabilityState(cap, true, &changed) || changed) {
+ helper_->Enable(cap);
+ }
}
GLboolean GLES2Implementation::IsEnabled(GLenum cap) {
@@ -865,47 +837,18 @@ GLboolean GLES2Implementation::IsEnabled(GLenum cap) {
GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glIsEnabled("
<< GLES2Util::GetStringCapability(cap) << ")");
bool state = false;
- switch (cap) {
- case GL_DITHER:
- state = gl_state_.enable_state.dither;
- break;
- case GL_BLEND:
- state = gl_state_.enable_state.blend;
- break;
- case GL_CULL_FACE:
- state = gl_state_.enable_state.cull_face;
- break;
- case GL_DEPTH_TEST:
- state = gl_state_.enable_state.depth_test;
- break;
- case GL_POLYGON_OFFSET_FILL:
- state = gl_state_.enable_state.polygon_offset_fill;
- break;
- case GL_SAMPLE_ALPHA_TO_COVERAGE:
- state = gl_state_.enable_state.sample_alpha_to_coverage;
- break;
- case GL_SAMPLE_COVERAGE:
- state = gl_state_.enable_state.sample_coverage;
- break;
- case GL_SCISSOR_TEST:
- state = gl_state_.enable_state.scissor_test;
- break;
- case GL_STENCIL_TEST:
- state = gl_state_.enable_state.stencil_test;
- break;
- default: {
- typedef IsEnabled::Result Result;
- Result* result = GetResultAs<Result*>();
- if (!result) {
- return GL_FALSE;
- }
- *result = 0;
- helper_->IsEnabled(cap, GetResultShmId(), GetResultShmOffset());
- WaitForCmd();
- state = (*result) != 0;
- break;
+ if (!state_.GetEnabled(cap, &state)) {
+ typedef IsEnabled::Result Result;
+ Result* result = GetResultAs<Result*>();
+ if (!result) {
+ return GL_FALSE;
}
+ *result = 0;
+ helper_->IsEnabled(cap, GetResultShmId(), GetResultShmOffset());
+ WaitForCmd();
+ state = (*result) != 0;
}
+
GPU_CLIENT_LOG("returned " << state);
return state;
}
@@ -913,40 +856,40 @@ GLboolean GLES2Implementation::IsEnabled(GLenum cap) {
bool GLES2Implementation::GetHelper(GLenum pname, GLint* params) {
switch (pname) {
case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:
- *params = gl_state_.int_state.max_combined_texture_image_units;
+ *params = static_state_.int_state.max_combined_texture_image_units;
return true;
case GL_MAX_CUBE_MAP_TEXTURE_SIZE:
- *params = gl_state_.int_state.max_cube_map_texture_size;
+ *params = static_state_.int_state.max_cube_map_texture_size;
return true;
case GL_MAX_FRAGMENT_UNIFORM_VECTORS:
- *params = gl_state_.int_state.max_fragment_uniform_vectors;
+ *params = static_state_.int_state.max_fragment_uniform_vectors;
return true;
case GL_MAX_RENDERBUFFER_SIZE:
- *params = gl_state_.int_state.max_renderbuffer_size;
+ *params = static_state_.int_state.max_renderbuffer_size;
return true;
case GL_MAX_TEXTURE_IMAGE_UNITS:
- *params = gl_state_.int_state.max_texture_image_units;
+ *params = static_state_.int_state.max_texture_image_units;
return true;
case GL_MAX_TEXTURE_SIZE:
- *params = gl_state_.int_state.max_texture_size;
+ *params = static_state_.int_state.max_texture_size;
return true;
case GL_MAX_VARYING_VECTORS:
- *params = gl_state_.int_state.max_varying_vectors;
+ *params = static_state_.int_state.max_varying_vectors;
return true;
case GL_MAX_VERTEX_ATTRIBS:
- *params = gl_state_.int_state.max_vertex_attribs;
+ *params = static_state_.int_state.max_vertex_attribs;
return true;
case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:
- *params = gl_state_.int_state.max_vertex_texture_image_units;
+ *params = static_state_.int_state.max_vertex_texture_image_units;
return true;
case GL_MAX_VERTEX_UNIFORM_VECTORS:
- *params = gl_state_.int_state.max_vertex_uniform_vectors;
+ *params = static_state_.int_state.max_vertex_uniform_vectors;
return true;
case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
- *params = gl_state_.int_state.num_compressed_texture_formats;
+ *params = static_state_.int_state.num_compressed_texture_formats;
return true;
case GL_NUM_SHADER_BINARY_FORMATS:
- *params = gl_state_.int_state.num_shader_binary_formats;
+ *params = static_state_.int_state.num_shader_binary_formats;
return true;
case GL_ARRAY_BUFFER_BINDING:
if (share_group_->bind_generates_resource()) {
@@ -1316,6 +1259,9 @@ bool GLES2Implementation::DeleteProgramHelper(GLuint program) {
"glDeleteProgram", "id not created by this context.");
return false;
}
+ if (program == current_program_) {
+ current_program_ = 0;
+ }
return true;
}
@@ -1401,6 +1347,15 @@ GLint GLES2Implementation::GetUniformLocation(
return loc;
}
+void GLES2Implementation::UseProgram(GLuint program) {
+ GPU_CLIENT_SINGLE_THREAD_CHECK();
+ GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUseProgram(" << program << ")");
+ if (current_program_ != program) {
+ current_program_ = program;
+ helper_->UseProgram(program);
+ }
+}
+
bool GLES2Implementation::GetProgramivHelper(
GLuint program, GLenum pname, GLint* params) {
bool got_value = share_group_->program_info_manager()->GetProgramiv(
@@ -2390,7 +2345,7 @@ void GLES2Implementation::ActiveTexture(GLenum texture) {
<< GLES2Util::GetStringEnum(texture) << ")");
GLuint texture_index = texture - GL_TEXTURE0;
if (texture_index >= static_cast<GLuint>(
- gl_state_.int_state.max_combined_texture_image_units)) {
+ static_state_.int_state.max_combined_texture_image_units)) {
SetGLErrorInvalidEnum(
"glActiveTexture", texture, "texture");
return;
@@ -2407,77 +2362,111 @@ void GLES2Implementation::ActiveTexture(GLenum texture) {
// the old model but possibly not true in the new model if another context has
// deleted the resource.
-void GLES2Implementation::BindBufferHelper(
+bool GLES2Implementation::BindBufferHelper(
GLenum target, GLuint buffer) {
// TODO(gman): See note #1 above.
+ bool changed = false;
switch (target) {
case GL_ARRAY_BUFFER:
- bound_array_buffer_id_ = buffer;
+ if (bound_array_buffer_id_ != buffer) {
+ bound_array_buffer_id_ = buffer;
+ changed = true;
+ }
break;
case GL_ELEMENT_ARRAY_BUFFER:
- bound_element_array_buffer_id_ = buffer;
+ if (bound_element_array_buffer_id_ != buffer) {
+ bound_element_array_buffer_id_ = buffer;
+ changed = true;
+ }
break;
default:
+ changed = true;
break;
}
// TODO(gman): There's a bug here. If the target is invalid the ID will not be
// used even though it's marked it as used here.
GetIdHandler(id_namespaces::kBuffers)->MarkAsUsedForBind(buffer);
+ return changed;
}
-void GLES2Implementation::BindFramebufferHelper(
+bool GLES2Implementation::BindFramebufferHelper(
GLenum target, GLuint framebuffer) {
// TODO(gman): See note #1 above.
+ bool changed = false;
switch (target) {
case GL_FRAMEBUFFER:
- bound_framebuffer_ = framebuffer;
+ if (bound_framebuffer_ != framebuffer) {
+ bound_framebuffer_ = framebuffer;
+ changed = true;
+ }
break;
default:
+ changed = true;
break;
}
// TODO(gman): There's a bug here. If the target is invalid the ID will not be
// used even though it's marked it as used here.
GetIdHandler(id_namespaces::kFramebuffers)->MarkAsUsedForBind(framebuffer);
+ return changed;
}
-void GLES2Implementation::BindRenderbufferHelper(
+bool GLES2Implementation::BindRenderbufferHelper(
GLenum target, GLuint renderbuffer) {
// TODO(gman): See note #1 above.
+ bool changed = false;
switch (target) {
case GL_RENDERBUFFER:
- bound_renderbuffer_ = renderbuffer;
+ if (bound_renderbuffer_ != renderbuffer) {
+ bound_renderbuffer_ = renderbuffer;
+ changed = true;
+ }
break;
default:
+ changed = true;
break;
}
// TODO(gman): There's a bug here. If the target is invalid the ID will not be
// used even though it's marked it as used here.
GetIdHandler(id_namespaces::kRenderbuffers)->MarkAsUsedForBind(renderbuffer);
+ return changed;
}
-void GLES2Implementation::BindTextureHelper(GLenum target, GLuint texture) {
+bool GLES2Implementation::BindTextureHelper(GLenum target, GLuint texture) {
// TODO(gman): See note #1 above.
+ bool changed = false;
TextureUnit& unit = texture_units_[active_texture_unit_];
switch (target) {
case GL_TEXTURE_2D:
- unit.bound_texture_2d = texture;
+ if (unit.bound_texture_2d != texture) {
+ unit.bound_texture_2d = texture;
+ changed = true;
+ }
break;
case GL_TEXTURE_CUBE_MAP:
- unit.bound_texture_cube_map = texture;
+ if (unit.bound_texture_cube_map != texture) {
+ unit.bound_texture_cube_map = texture;
+ changed = true;
+ }
break;
default:
+ changed = true;
break;
}
// TODO(gman): There's a bug here. If the target is invalid the ID will not be
// used. even though it's marked it as used here.
GetIdHandler(id_namespaces::kTextures)->MarkAsUsedForBind(texture);
+ return changed;
}
-void GLES2Implementation::BindVertexArrayHelper(GLuint array) {
+bool GLES2Implementation::BindVertexArrayHelper(GLuint array) {
// TODO(gman): See note #1 above.
- bound_vertex_array_id_ = array;
-
+ bool changed = false;
+ if (bound_vertex_array_id_ != array) {
+ bound_vertex_array_id_ = array;
+ changed = true;
+ }
GetIdHandler(id_namespaces::kVertexArrays)->MarkAsUsedForBind(array);
+ return changed;
}
#if defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS)
@@ -2573,7 +2562,7 @@ void GLES2Implementation::DeleteTexturesHelper(
}
for (GLsizei ii = 0; ii < n; ++ii) {
for (GLint tt = 0;
- tt < gl_state_.int_state.max_combined_texture_image_units;
+ tt < static_state_.int_state.max_combined_texture_image_units;
++tt) {
TextureUnit& unit = texture_units_[tt];
if (textures[ii] == unit.bound_texture_2d) {
« no previous file with comments | « gpu/command_buffer/client/gles2_implementation.h ('k') | gpu/command_buffer/client/gles2_implementation_impl_autogen.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698