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 104cadd9d0775f13a847f589dfbdc5ee6ba6dc2d..94d623bedd00d90748f94967b4e1942e449be3e3 100644 |
--- a/gpu/command_buffer/service/texture_manager.cc |
+++ b/gpu/command_buffer/service/texture_manager.cc |
@@ -60,11 +60,11 @@ static size_t FaceIndexToGLTarget(size_t index) { |
} |
TextureManager::~TextureManager() { |
- DCHECK(texture_infos_.empty()); |
+ DCHECK(textures_.empty()); |
// If this triggers, that means something is keeping a reference to |
// a Texture belonging to this. |
- CHECK_EQ(texture_info_count_, 0u); |
+ CHECK_EQ(texture_count_, 0u); |
DCHECK_EQ(0, num_unrenderable_textures_); |
DCHECK_EQ(0, num_unsafe_textures_); |
@@ -73,7 +73,7 @@ TextureManager::~TextureManager() { |
void TextureManager::Destroy(bool have_context) { |
have_context_ = have_context; |
- texture_infos_.clear(); |
+ textures_.clear(); |
for (int ii = 0; ii < kNumDefaultTextures; ++ii) { |
default_textures_[ii] = NULL; |
} |
@@ -86,8 +86,7 @@ void TextureManager::Destroy(bool have_context) { |
DCHECK_EQ(0u, memory_tracker_unmanaged_->GetMemRepresented()); |
} |
-Texture::Texture(TextureManager* manager, |
- GLuint service_id) |
+Texture::Texture(TextureManager* manager, GLuint service_id) |
: manager_(manager), |
service_id_(service_id), |
deleted_(false), |
@@ -159,8 +158,7 @@ Texture::LevelInfo::LevelInfo(const LevelInfo& rhs) |
Texture::LevelInfo::~LevelInfo() { |
} |
-bool Texture::CanRender( |
- const FeatureInfo* feature_info) const { |
+bool Texture::CanRender(const FeatureInfo* feature_info) const { |
if (target_ == 0) { |
return false; |
} |
@@ -717,7 +715,7 @@ TextureManager::TextureManager( |
num_unrenderable_textures_(0), |
num_unsafe_textures_(0), |
num_uncleared_mips_(0), |
- texture_info_count_(0), |
+ texture_count_(0), |
have_context_(true) { |
for (int ii = 0; ii < kNumDefaultTextures; ++ii) { |
black_texture_ids_[ii] = 0; |
@@ -781,7 +779,7 @@ scoped_refptr<Texture> |
// we need to manually manipulate some of the their bookkeeping. |
++num_unrenderable_textures_; |
scoped_refptr<Texture> default_texture(new Texture(this, ids[1])); |
- SetInfoTarget(default_texture, target); |
+ SetTarget(default_texture, target); |
if (needs_faces) { |
for (int ii = 0; ii < GLES2Util::kNumFaces; ++ii) { |
SetLevelInfo( |
@@ -823,79 +821,78 @@ bool TextureManager::ValidForTarget( |
(target != GL_TEXTURE_2D || (depth == 1)); |
} |
-void TextureManager::SetInfoTarget( |
- Texture* info, GLenum target) { |
- DCHECK(info); |
- if (!info->CanRender(feature_info_)) { |
+void TextureManager::SetTarget(Texture* texture, GLenum target) { |
+ DCHECK(texture); |
+ if (!texture->CanRender(feature_info_)) { |
DCHECK_NE(0, num_unrenderable_textures_); |
--num_unrenderable_textures_; |
} |
- info->SetTarget(target, MaxLevelsForTarget(target)); |
- if (!info->CanRender(feature_info_)) { |
+ texture->SetTarget(target, MaxLevelsForTarget(target)); |
+ if (!texture->CanRender(feature_info_)) { |
++num_unrenderable_textures_; |
} |
} |
-void TextureManager::SetLevelCleared(Texture* info, |
+void TextureManager::SetLevelCleared(Texture* texture, |
GLenum target, |
GLint level, |
bool cleared) { |
- DCHECK(info); |
- if (!info->SafeToRenderFrom()) { |
+ DCHECK(texture); |
+ if (!texture->SafeToRenderFrom()) { |
DCHECK_NE(0, num_unsafe_textures_); |
--num_unsafe_textures_; |
} |
- num_uncleared_mips_ -= info->num_uncleared_mips(); |
+ num_uncleared_mips_ -= texture->num_uncleared_mips(); |
DCHECK_GE(num_uncleared_mips_, 0); |
- info->SetLevelCleared(target, level, cleared); |
- num_uncleared_mips_ += info->num_uncleared_mips(); |
- if (!info->SafeToRenderFrom()) { |
+ texture->SetLevelCleared(target, level, cleared); |
+ num_uncleared_mips_ += texture->num_uncleared_mips(); |
+ if (!texture->SafeToRenderFrom()) { |
++num_unsafe_textures_; |
} |
} |
bool TextureManager::ClearRenderableLevels( |
- GLES2Decoder* decoder,Texture* info) { |
- DCHECK(info); |
- if (info->SafeToRenderFrom()) { |
+ GLES2Decoder* decoder,Texture* texture) { |
+ DCHECK(texture); |
+ if (texture->SafeToRenderFrom()) { |
return true; |
} |
DCHECK_NE(0, num_unsafe_textures_); |
--num_unsafe_textures_; |
- num_uncleared_mips_ -= info->num_uncleared_mips(); |
+ num_uncleared_mips_ -= texture->num_uncleared_mips(); |
DCHECK_GE(num_uncleared_mips_, 0); |
- bool result = info->ClearRenderableLevels(decoder); |
- num_uncleared_mips_ += info->num_uncleared_mips(); |
- if (!info->SafeToRenderFrom()) { |
+ bool result = texture->ClearRenderableLevels(decoder); |
+ num_uncleared_mips_ += texture->num_uncleared_mips(); |
+ if (!texture->SafeToRenderFrom()) { |
++num_unsafe_textures_; |
} |
return result; |
} |
bool TextureManager::ClearTextureLevel( |
- GLES2Decoder* decoder,Texture* info, |
+ GLES2Decoder* decoder,Texture* texture, |
GLenum target, GLint level) { |
- DCHECK(info); |
- if (info->num_uncleared_mips() == 0) { |
+ DCHECK(texture); |
+ if (texture->num_uncleared_mips() == 0) { |
return true; |
} |
- num_uncleared_mips_ -= info->num_uncleared_mips(); |
+ num_uncleared_mips_ -= texture->num_uncleared_mips(); |
DCHECK_GE(num_uncleared_mips_, 0); |
- if (!info->SafeToRenderFrom()) { |
+ if (!texture->SafeToRenderFrom()) { |
DCHECK_NE(0, num_unsafe_textures_); |
--num_unsafe_textures_; |
} |
- bool result = info->ClearLevel(decoder, target, level); |
- info->UpdateCleared(); |
- num_uncleared_mips_ += info->num_uncleared_mips(); |
- if (!info->SafeToRenderFrom()) { |
+ bool result = texture->ClearLevel(decoder, target, level); |
+ texture->UpdateCleared(); |
+ num_uncleared_mips_ += texture->num_uncleared_mips(); |
+ if (!texture->SafeToRenderFrom()) { |
++num_unsafe_textures_; |
} |
return result; |
} |
void TextureManager::SetLevelInfo( |
- Texture* info, |
+ Texture* texture, |
GLenum target, |
GLint level, |
GLenum internal_format, |
@@ -906,46 +903,47 @@ void TextureManager::SetLevelInfo( |
GLenum format, |
GLenum type, |
bool cleared) { |
- DCHECK(info); |
- if (!info->CanRender(feature_info_)) { |
+ DCHECK(texture); |
+ if (!texture->CanRender(feature_info_)) { |
DCHECK_NE(0, num_unrenderable_textures_); |
--num_unrenderable_textures_; |
} |
- if (!info->SafeToRenderFrom()) { |
+ if (!texture->SafeToRenderFrom()) { |
DCHECK_NE(0, num_unsafe_textures_); |
--num_unsafe_textures_; |
} |
- num_uncleared_mips_ -= info->num_uncleared_mips(); |
+ num_uncleared_mips_ -= texture->num_uncleared_mips(); |
DCHECK_GE(num_uncleared_mips_, 0); |
- GetMemTracker(info->pool_)->TrackMemFree(info->estimated_size()); |
- info->SetLevelInfo( |
+ GetMemTracker(texture->pool_)->TrackMemFree(texture->estimated_size()); |
+ texture->SetLevelInfo( |
feature_info_, target, level, internal_format, width, height, depth, |
border, format, type, cleared); |
- GetMemTracker(info->pool_)->TrackMemAlloc(info->estimated_size()); |
+ GetMemTracker(texture->pool_)->TrackMemAlloc(texture->estimated_size()); |
- num_uncleared_mips_ += info->num_uncleared_mips(); |
- if (!info->CanRender(feature_info_)) { |
+ num_uncleared_mips_ += texture->num_uncleared_mips(); |
+ if (!texture->CanRender(feature_info_)) { |
++num_unrenderable_textures_; |
} |
- if (!info->SafeToRenderFrom()) { |
+ if (!texture->SafeToRenderFrom()) { |
++num_unsafe_textures_; |
} |
} |
-TextureDefinition* TextureManager::Save(Texture* info) { |
- DCHECK(info->owned_); |
+TextureDefinition* TextureManager::Save(Texture* texture) { |
+ DCHECK(texture->owned_); |
- if (info->IsAttachedToFramebuffer()) |
+ if (texture->IsAttachedToFramebuffer()) |
return NULL; |
- TextureDefinition::LevelInfos level_infos(info->level_infos_.size()); |
+ TextureDefinition::LevelInfos level_infos(texture->level_infos_.size()); |
for (size_t face = 0; face < level_infos.size(); ++face) { |
- GLenum target = info->target() == GL_TEXTURE_2D ? |
+ GLenum target = texture->target() == GL_TEXTURE_2D ? |
GL_TEXTURE_2D : FaceIndexToGLTarget(face); |
- for (size_t level = 0; level < info->level_infos_[face].size(); ++level) { |
+ for (size_t level = 0; level < texture->level_infos_[face].size(); |
+ ++level) { |
const Texture::LevelInfo& level_info = |
- info->level_infos_[face][level]; |
+ texture->level_infos_[face][level]; |
level_infos[face].push_back( |
TextureDefinition::LevelInfo(target, |
level_info.internal_format, |
@@ -957,7 +955,7 @@ TextureDefinition* TextureManager::Save(Texture* info) { |
level_info.type, |
level_info.cleared)); |
- SetLevelInfo(info, |
+ SetLevelInfo(texture, |
target, |
level, |
GL_RGBA, |
@@ -971,50 +969,54 @@ TextureDefinition* TextureManager::Save(Texture* info) { |
} |
} |
- GLuint old_service_id = info->service_id(); |
- bool immutable = info->IsImmutable(); |
+ GLuint old_service_id = texture->service_id(); |
+ bool immutable = texture->IsImmutable(); |
GLuint new_service_id = 0; |
glGenTextures(1, &new_service_id); |
- info->SetServiceId(new_service_id); |
- info->SetImmutable(false); |
+ texture->SetServiceId(new_service_id); |
+ texture->SetImmutable(false); |
- return new TextureDefinition(info->target(), |
+ return new TextureDefinition(texture->target(), |
old_service_id, |
- info->min_filter(), |
- info->mag_filter(), |
- info->wrap_s(), |
- info->wrap_t(), |
- info->usage(), |
+ texture->min_filter(), |
+ texture->mag_filter(), |
+ texture->wrap_s(), |
+ texture->wrap_t(), |
+ texture->usage(), |
immutable, |
level_infos); |
} |
-bool TextureManager::Restore(Texture* info, |
- TextureDefinition* definition) { |
- DCHECK(info->owned_); |
+bool TextureManager::Restore( |
+ const char* function_name, |
+ GLES2Decoder* decoder, |
+ Texture* texture, |
+ TextureDefinition* definition) { |
+ DCHECK(texture->owned_); |
scoped_ptr<TextureDefinition> scoped_definition(definition); |
- if (info->IsAttachedToFramebuffer()) |
+ if (texture->IsAttachedToFramebuffer()) |
return false; |
- if (info->target() != definition->target()) |
+ if (texture->target() != definition->target()) |
return false; |
- if (info->level_infos_.size() != definition->level_infos().size()) |
+ if (texture->level_infos_.size() != definition->level_infos().size()) |
return false; |
- if (info->level_infos_[0].size() != definition->level_infos()[0].size()) |
+ if (texture->level_infos_[0].size() != definition->level_infos()[0].size()) |
return false; |
- for (size_t face = 0; face < info->level_infos_.size(); ++face) { |
- GLenum target = info->target() == GL_TEXTURE_2D ? |
+ for (size_t face = 0; face < texture->level_infos_.size(); ++face) { |
+ GLenum target = texture->target() == GL_TEXTURE_2D ? |
GL_TEXTURE_2D : FaceIndexToGLTarget(face); |
- for (size_t level = 0; level < info->level_infos_[face].size(); ++level) { |
+ for (size_t level = 0; level < texture->level_infos_[face].size(); |
+ ++level) { |
const TextureDefinition::LevelInfo& level_info = |
definition->level_infos()[face][level]; |
- SetLevelInfo(info, |
+ SetLevelInfo(texture, |
target, |
level, |
level_info.internal_format, |
@@ -1028,61 +1030,86 @@ bool TextureManager::Restore(Texture* info, |
} |
} |
- GLuint old_service_id = info->service_id(); |
+ GLuint old_service_id = texture->service_id(); |
glDeleteTextures(1, &old_service_id); |
- info->SetServiceId(definition->ReleaseServiceId()); |
- info->SetImmutable(definition->immutable()); |
- SetParameter(info, GL_TEXTURE_MIN_FILTER, definition->min_filter()); |
- SetParameter(info, GL_TEXTURE_MAG_FILTER, definition->mag_filter()); |
- SetParameter(info, GL_TEXTURE_WRAP_S, definition->wrap_s()); |
- SetParameter(info, GL_TEXTURE_WRAP_T, definition->wrap_t()); |
- SetParameter(info, GL_TEXTURE_USAGE_ANGLE, definition->usage()); |
+ texture->SetServiceId(definition->ReleaseServiceId()); |
+ glBindTexture(texture->target(), texture->service_id()); |
+ texture->SetImmutable(definition->immutable()); |
+ SetParameter(function_name, decoder, texture, GL_TEXTURE_MIN_FILTER, |
+ definition->min_filter()); |
+ SetParameter(function_name, decoder, texture, GL_TEXTURE_MAG_FILTER, |
+ definition->mag_filter()); |
+ SetParameter(function_name, decoder, texture, GL_TEXTURE_WRAP_S, |
+ definition->wrap_s()); |
+ SetParameter(function_name, decoder, texture, GL_TEXTURE_WRAP_T, |
+ definition->wrap_t()); |
+ if (feature_info_->validators()->texture_parameter.IsValid( |
+ GL_TEXTURE_USAGE_ANGLE)) { |
+ SetParameter(function_name, decoder, texture, GL_TEXTURE_USAGE_ANGLE, |
+ definition->usage()); |
+ } |
return true; |
} |
-GLenum TextureManager::SetParameter( |
- Texture* info, GLenum pname, GLint param) { |
- DCHECK(info); |
- if (!info->CanRender(feature_info_)) { |
+void TextureManager::SetParameter( |
+ const char* function_name, GLES2Decoder* decoder, |
+ Texture* texture, GLenum pname, GLint param) { |
+ DCHECK(decoder); |
+ DCHECK(texture); |
+ if (!texture->CanRender(feature_info_)) { |
DCHECK_NE(0, num_unrenderable_textures_); |
--num_unrenderable_textures_; |
} |
- if (!info->SafeToRenderFrom()) { |
+ if (!texture->SafeToRenderFrom()) { |
DCHECK_NE(0, num_unsafe_textures_); |
--num_unsafe_textures_; |
} |
- GLenum result = info->SetParameter(feature_info_, pname, param); |
- if (!info->CanRender(feature_info_)) { |
+ GLenum result = texture->SetParameter(feature_info_, pname, param); |
+ if (result != GL_NO_ERROR) { |
+ if (result == GL_INVALID_ENUM) { |
+ decoder->SetGLErrorInvalidEnum(function_name, param, "param"); |
+ } else { |
+ decoder->SetGLErrorInvalidParam( |
+ result, function_name, pname, static_cast<GLint>(param)); |
+ } |
+ } else { |
+ // Texture tracking pools exist only for the command decoder, so |
+ // do not pass them on to the native GL implementation. |
+ if (pname != GL_TEXTURE_POOL_CHROMIUM) { |
+ glTexParameteri(texture->target(), pname, param); |
+ } |
+ } |
+ |
+ if (!texture->CanRender(feature_info_)) { |
++num_unrenderable_textures_; |
} |
- if (!info->SafeToRenderFrom()) { |
+ if (!texture->SafeToRenderFrom()) { |
++num_unsafe_textures_; |
} |
- return result; |
} |
-bool TextureManager::MarkMipmapsGenerated(Texture* info) { |
- DCHECK(info); |
- if (!info->CanRender(feature_info_)) { |
+bool TextureManager::MarkMipmapsGenerated(Texture* texture) { |
+ DCHECK(texture); |
+ if (!texture->CanRender(feature_info_)) { |
DCHECK_NE(0, num_unrenderable_textures_); |
--num_unrenderable_textures_; |
} |
- if (!info->SafeToRenderFrom()) { |
+ if (!texture->SafeToRenderFrom()) { |
DCHECK_NE(0, num_unsafe_textures_); |
--num_unsafe_textures_; |
} |
- num_uncleared_mips_ -= info->num_uncleared_mips(); |
+ num_uncleared_mips_ -= texture->num_uncleared_mips(); |
DCHECK_GE(num_uncleared_mips_, 0); |
- GetMemTracker(info->pool_)->TrackMemFree(info->estimated_size()); |
- bool result = info->MarkMipmapsGenerated(feature_info_); |
- GetMemTracker(info->pool_)->TrackMemAlloc(info->estimated_size()); |
+ GetMemTracker(texture->pool_)->TrackMemFree(texture->estimated_size()); |
+ bool result = texture->MarkMipmapsGenerated(feature_info_); |
+ GetMemTracker(texture->pool_)->TrackMemAlloc(texture->estimated_size()); |
- num_uncleared_mips_ += info->num_uncleared_mips(); |
- if (!info->CanRender(feature_info_)) { |
+ num_uncleared_mips_ += texture->num_uncleared_mips(); |
+ if (!texture->CanRender(feature_info_)) { |
++num_unrenderable_textures_; |
} |
- if (!info->SafeToRenderFrom()) { |
+ if (!texture->SafeToRenderFrom()) { |
++num_unsafe_textures_; |
} |
return result; |
@@ -1091,41 +1118,41 @@ bool TextureManager::MarkMipmapsGenerated(Texture* info) { |
Texture* TextureManager::CreateTexture( |
GLuint client_id, GLuint service_id) { |
DCHECK_NE(0u, service_id); |
- scoped_refptr<Texture> info(new Texture(this, service_id)); |
- std::pair<TextureInfoMap::iterator, bool> result = |
- texture_infos_.insert(std::make_pair(client_id, info)); |
+ scoped_refptr<Texture> texture(new Texture(this, service_id)); |
+ std::pair<TextureMap::iterator, bool> result = |
+ textures_.insert(std::make_pair(client_id, texture)); |
DCHECK(result.second); |
- if (!info->CanRender(feature_info_)) { |
+ if (!texture->CanRender(feature_info_)) { |
++num_unrenderable_textures_; |
} |
- if (!info->SafeToRenderFrom()) { |
+ if (!texture->SafeToRenderFrom()) { |
++num_unsafe_textures_; |
} |
- num_uncleared_mips_ += info->num_uncleared_mips(); |
- return info.get(); |
+ num_uncleared_mips_ += texture->num_uncleared_mips(); |
+ return texture.get(); |
} |
Texture* TextureManager::GetTexture( |
GLuint client_id) const { |
- TextureInfoMap::const_iterator it = texture_infos_.find(client_id); |
- return it != texture_infos_.end() ? it->second : NULL; |
+ TextureMap::const_iterator it = textures_.find(client_id); |
+ return it != textures_.end() ? it->second : NULL; |
} |
void TextureManager::RemoveTexture(GLuint client_id) { |
- TextureInfoMap::iterator it = texture_infos_.find(client_id); |
- if (it != texture_infos_.end()) { |
- Texture* info = it->second; |
- info->MarkAsDeleted(); |
- texture_infos_.erase(it); |
+ TextureMap::iterator it = textures_.find(client_id); |
+ if (it != textures_.end()) { |
+ Texture* texture = it->second; |
+ texture->MarkAsDeleted(); |
+ textures_.erase(it); |
} |
} |
void TextureManager::StartTracking(Texture* /* texture */) { |
- ++texture_info_count_; |
+ ++texture_count_; |
} |
void TextureManager::StopTracking(Texture* texture) { |
- --texture_info_count_; |
+ --texture_count_; |
if (!texture->CanRender(feature_info_)) { |
DCHECK_NE(0, num_unrenderable_textures_); |
--num_unrenderable_textures_; |
@@ -1156,8 +1183,8 @@ MemoryTypeTracker* TextureManager::GetMemTracker(GLenum tracking_pool) { |
bool TextureManager::GetClientId(GLuint service_id, GLuint* client_id) const { |
// This doesn't need to be fast. It's only used during slow queries. |
- for (TextureInfoMap::const_iterator it = texture_infos_.begin(); |
- it != texture_infos_.end(); ++it) { |
+ for (TextureMap::const_iterator it = textures_.begin(); |
+ it != textures_.end(); ++it) { |
if (it->second->service_id() == service_id) { |
*client_id = it->first; |
return true; |
@@ -1172,39 +1199,39 @@ GLsizei TextureManager::ComputeMipMapCount( |
} |
void TextureManager::SetLevelImage( |
- Texture* info, |
+ Texture* texture, |
GLenum target, |
GLint level, |
gfx::GLImage* image) { |
- DCHECK(info); |
- if (!info->CanRender(feature_info_)) { |
+ DCHECK(texture); |
+ if (!texture->CanRender(feature_info_)) { |
DCHECK_NE(0, num_unrenderable_textures_); |
--num_unrenderable_textures_; |
} |
- if (!info->SafeToRenderFrom()) { |
+ if (!texture->SafeToRenderFrom()) { |
DCHECK_NE(0, num_unsafe_textures_); |
--num_unsafe_textures_; |
} |
- info->SetLevelImage(feature_info_, target, level, image); |
- if (!info->CanRender(feature_info_)) { |
+ texture->SetLevelImage(feature_info_, target, level, image); |
+ if (!texture->CanRender(feature_info_)) { |
++num_unrenderable_textures_; |
} |
- if (!info->SafeToRenderFrom()) { |
+ if (!texture->SafeToRenderFrom()) { |
++num_unsafe_textures_; |
} |
} |
void TextureManager::AddToSignature( |
- Texture* info, |
+ Texture* texture, |
GLenum target, |
GLint level, |
std::string* signature) const { |
- info->AddToSignature(feature_info_.get(), target, level, signature); |
+ texture->AddToSignature(feature_info_.get(), target, level, signature); |
} |
void TextureManager::AddPendingAsyncPixelTransfer( |
- base::WeakPtr<gfx::AsyncPixelTransferState> state, Texture* info) { |
- pending_async_transfers_.push_back(PendingAsyncTransfer(state,info)); |
+ base::WeakPtr<gfx::AsyncPixelTransferState> state, Texture* texture) { |
+ pending_async_transfers_.push_back(PendingAsyncTransfer(state, texture)); |
} |
void TextureManager::BindFinishedAsyncPixelTransfers( |