Chromium Code Reviews| Index: gpu/command_buffer/service/texture_manager.cc |
| diff --git a/gpu/command_buffer/service/texture_manager.cc b/gpu/command_buffer/service/texture_manager.cc |
| index 9dc5cc9d924f19a2cd266043f24cb7cc38b4e178..8e1530449057b40937115e583217d45d962610f6 100644 |
| --- a/gpu/command_buffer/service/texture_manager.cc |
| +++ b/gpu/command_buffer/service/texture_manager.cc |
| @@ -21,6 +21,72 @@ |
| namespace gpu { |
| namespace gles2 { |
| +// The should contain everything to uniquely identify a Texture. |
|
vmiura
2014/09/26 23:36:36
nit: This
David Yen
2014/09/29 16:42:58
Done.
|
| +static const char TextureTag[] = "|Texture|"; |
| +struct TextureSignature { |
| + GLenum target_; |
| + GLint level_; |
| + GLenum min_filter_; |
| + GLenum mag_filter_; |
| + GLenum wrap_s_; |
| + GLenum wrap_t_; |
| + GLenum usage_; |
| + GLenum internal_format_; |
| + GLsizei width_; |
| + GLsizei height_; |
| + GLsizei depth_; |
| + GLint border_; |
| + GLenum format_; |
| + GLenum type_; |
| + bool has_image_; |
| + bool can_render_; |
| + bool can_render_to_; |
| + bool npot_; |
| + |
| + // Since we will be hashing this signature structure, the padding must be |
| + // zero initialized. Although the C++11 specifications specify that this is |
| + // true, we will use a constructor with a memset to further enforce it instead |
| + // of relying on compilers adhering to this deep dark corner specification. |
| + TextureSignature(GLenum target, |
| + GLint level, |
| + GLenum min_filter, |
| + GLenum mag_filter, |
| + GLenum wrap_s, |
| + GLenum wrap_t, |
| + GLenum usage, |
| + GLenum internal_format, |
| + GLsizei width, |
| + GLsizei height, |
| + GLsizei depth, |
| + GLint border, |
| + GLenum format, |
| + GLenum type, |
| + bool has_image, |
| + bool can_render, |
| + bool can_render_to, |
| + bool npot) { |
| + memset(this, 0, sizeof(TextureSignature)); |
| + target_ = target; |
| + level_ = level; |
| + min_filter_ = min_filter; |
| + mag_filter_ = mag_filter; |
| + wrap_s_ = wrap_s; |
| + wrap_t_ = wrap_t; |
| + usage_ = usage; |
| + internal_format_ = internal_format; |
| + width_ = width; |
| + height_ = height; |
| + depth_ = depth; |
| + border_ = border; |
| + format_ = format; |
| + type_ = type; |
| + has_image_ = has_image; |
| + can_render_ = can_render; |
| + can_render_to_ = can_render_to; |
| + npot_ = npot; |
| + } |
| +}; |
| + |
| TextureManager::DestructionObserver::DestructionObserver() {} |
| TextureManager::DestructionObserver::~DestructionObserver() {} |
| @@ -218,20 +284,32 @@ void Texture::AddToSignature( |
| level_infos_.size()); |
| DCHECK_LT(static_cast<size_t>(level), |
| level_infos_[face_index].size()); |
| + |
| const Texture::LevelInfo& info = |
| level_infos_[face_index][level]; |
| - *signature += base::StringPrintf( |
| - "|Texture|target=%04x|level=%d|internal_format=%04x" |
| - "|width=%d|height=%d|depth=%d|border=%d|format=%04x|type=%04x" |
| - "|image=%d|canrender=%d|canrenderto=%d|npot_=%d" |
| - "|min_filter=%04x|mag_filter=%04x|wrap_s=%04x|wrap_t=%04x" |
| - "|usage=%04x", |
| - target, level, info.internal_format, |
| - info.width, info.height, info.depth, info.border, |
| - info.format, info.type, info.image.get() != NULL, |
| - CanRender(feature_info), CanRenderTo(), npot_, |
| - min_filter_, mag_filter_, wrap_s_, wrap_t_, |
| - usage_); |
| + |
| + TextureSignature signature_data(target, |
| + level, |
| + min_filter_, |
| + mag_filter_, |
| + wrap_s_, |
| + wrap_t_, |
| + usage_, |
| + info.internal_format, |
| + info.width, |
| + info.height, |
| + info.depth, |
| + info.border, |
| + info.format, |
| + info.type, |
| + info.image.get() != NULL, |
| + CanRender(feature_info), |
| + CanRenderTo(), |
| + npot_); |
| + |
| + signature->append(TextureTag, sizeof(TextureTag)); |
| + signature->append(reinterpret_cast<const char*>(&signature_data), |
| + sizeof(signature_data)); |
| } |
| void Texture::SetMailboxManager(MailboxManager* mailbox_manager) { |
| @@ -1267,6 +1345,10 @@ void TextureManager::SetLevelImage( |
| ref->texture()->SetLevelImage(feature_info_.get(), target, level, image); |
| } |
| +size_t TextureManager::GetSignatureSize() const { |
| + return sizeof(TextureTag) + sizeof(TextureSignature); |
| +} |
| + |
| void TextureManager::AddToSignature( |
| TextureRef* ref, |
| GLenum target, |