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

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

Issue 12647003: Refactor a bunch of Texture related GPU code (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 9 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
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(
« no previous file with comments | « gpu/command_buffer/service/texture_manager.h ('k') | gpu/command_buffer/service/texture_manager_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698