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

Side by Side Diff: gpu/command_buffer/service/texture_manager.cc

Issue 1418603002: Revert of Re-land: ui: Move GLImage::BindTexImage fallback from GLImage implementations to GLES2CmdDecoder. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 2 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 unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "gpu/command_buffer/service/texture_manager.h" 5 #include "gpu/command_buffer/service/texture_manager.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <set> 8 #include <set>
9 #include <utility> 9 #include <utility>
10 10
(...skipping 374 matching lines...) Expand 10 before | Expand all | Expand 10 after
385 Texture::LevelInfo::LevelInfo() 385 Texture::LevelInfo::LevelInfo()
386 : target(0), 386 : target(0),
387 level(-1), 387 level(-1),
388 internal_format(0), 388 internal_format(0),
389 width(0), 389 width(0),
390 height(0), 390 height(0),
391 depth(0), 391 depth(0),
392 border(0), 392 border(0),
393 format(0), 393 format(0),
394 type(0), 394 type(0),
395 image_state(UNBOUND), 395 estimated_size(0) {
396 estimated_size(0) {} 396 }
397 397
398 Texture::LevelInfo::LevelInfo(const LevelInfo& rhs) 398 Texture::LevelInfo::LevelInfo(const LevelInfo& rhs)
399 : cleared_rect(rhs.cleared_rect), 399 : cleared_rect(rhs.cleared_rect),
400 target(rhs.target), 400 target(rhs.target),
401 level(rhs.level), 401 level(rhs.level),
402 internal_format(rhs.internal_format), 402 internal_format(rhs.internal_format),
403 width(rhs.width), 403 width(rhs.width),
404 height(rhs.height), 404 height(rhs.height),
405 depth(rhs.depth), 405 depth(rhs.depth),
406 border(rhs.border), 406 border(rhs.border),
407 format(rhs.format), 407 format(rhs.format),
408 type(rhs.type), 408 type(rhs.type),
409 image(rhs.image), 409 image(rhs.image),
410 image_state(rhs.image_state), 410 estimated_size(rhs.estimated_size) {
411 estimated_size(rhs.estimated_size) {} 411 }
412 412
413 Texture::LevelInfo::~LevelInfo() { 413 Texture::LevelInfo::~LevelInfo() {
414 } 414 }
415 415
416 Texture::FaceInfo::FaceInfo() 416 Texture::FaceInfo::FaceInfo()
417 : num_mip_levels(0) { 417 : num_mip_levels(0) {
418 } 418 }
419 419
420 Texture::FaceInfo::~FaceInfo() { 420 Texture::FaceInfo::~FaceInfo() {
421 } 421 }
(...skipping 403 matching lines...) Expand 10 before | Expand all | Expand 10 after
825 } 825 }
826 826
827 info.target = target; 827 info.target = target;
828 info.level = level; 828 info.level = level;
829 info.internal_format = internal_format; 829 info.internal_format = internal_format;
830 info.depth = depth; 830 info.depth = depth;
831 info.border = border; 831 info.border = border;
832 info.format = format; 832 info.format = format;
833 info.type = type; 833 info.type = type;
834 info.image = 0; 834 info.image = 0;
835 info.image_state = UNBOUND;
836 835
837 UpdateMipCleared(&info, width, height, cleared_rect); 836 UpdateMipCleared(&info, width, height, cleared_rect);
838 837
839 estimated_size_ -= info.estimated_size; 838 estimated_size_ -= info.estimated_size;
840 GLES2Util::ComputeImageDataSizes( 839 GLES2Util::ComputeImageDataSizes(
841 width, height, 1, format, type, 4, &info.estimated_size, NULL, NULL); 840 width, height, 1, format, type, 4, &info.estimated_size, NULL, NULL);
842 estimated_size_ += info.estimated_size; 841 estimated_size_ += info.estimated_size;
843 842
844 max_level_set_ = std::max(max_level_set_, level); 843 max_level_set_ = std::max(max_level_set_, level);
845 Update(feature_info); 844 Update(feature_info);
(...skipping 385 matching lines...) Expand 10 before | Expand all | Expand 10 after
1231 if (!cleared) 1230 if (!cleared)
1232 return false; 1231 return false;
1233 } 1232 }
1234 } 1233 }
1235 1234
1236 UpdateMipCleared(&info, info.width, info.height, 1235 UpdateMipCleared(&info, info.width, info.height,
1237 gfx::Rect(info.width, info.height)); 1236 gfx::Rect(info.width, info.height));
1238 return true; 1237 return true;
1239 } 1238 }
1240 1239
1241 void Texture::SetLevelImage(GLenum target, 1240 void Texture::SetLevelImage(
1242 GLint level, 1241 const FeatureInfo* feature_info,
1243 gfx::GLImage* image, 1242 GLenum target,
1244 ImageState state) { 1243 GLint level,
1244 gfx::GLImage* image) {
1245 DCHECK_GE(level, 0); 1245 DCHECK_GE(level, 0);
1246 size_t face_index = GLES2Util::GLTargetToFaceIndex(target); 1246 size_t face_index = GLES2Util::GLTargetToFaceIndex(target);
1247 DCHECK_LT(static_cast<size_t>(face_index), 1247 DCHECK_LT(static_cast<size_t>(face_index),
1248 face_infos_.size()); 1248 face_infos_.size());
1249 DCHECK_LT(static_cast<size_t>(level), 1249 DCHECK_LT(static_cast<size_t>(level),
1250 face_infos_[face_index].level_infos.size()); 1250 face_infos_[face_index].level_infos.size());
1251 Texture::LevelInfo& info = 1251 Texture::LevelInfo& info =
1252 face_infos_[face_index].level_infos[level]; 1252 face_infos_[face_index].level_infos[level];
1253 DCHECK_EQ(info.target, target); 1253 DCHECK_EQ(info.target, target);
1254 DCHECK_EQ(info.level, level); 1254 DCHECK_EQ(info.level, level);
1255 info.image = image; 1255 info.image = image;
1256 info.image_state = state;
1257 UpdateCanRenderCondition(); 1256 UpdateCanRenderCondition();
1258 UpdateHasImages(); 1257 UpdateHasImages();
1258
1259 // TODO(ericrk): Images may have complex sizing not accounted for by
1260 // |estimated_size_|, we should add logic here to update |estimated_size_|
1261 // based on the new GLImage. crbug.com/526298
1259 } 1262 }
1260 1263
1261 gfx::GLImage* Texture::GetLevelImage(GLint target, 1264 gfx::GLImage* Texture::GetLevelImage(GLint target, GLint level) const {
1262 GLint level,
1263 ImageState* state) const {
1264 if (target != GL_TEXTURE_2D && target != GL_TEXTURE_EXTERNAL_OES && 1265 if (target != GL_TEXTURE_2D && target != GL_TEXTURE_EXTERNAL_OES &&
1265 target != GL_TEXTURE_RECTANGLE_ARB) { 1266 target != GL_TEXTURE_RECTANGLE_ARB) {
1266 return NULL; 1267 return NULL;
1267 } 1268 }
1268 1269
1269 size_t face_index = GLES2Util::GLTargetToFaceIndex(target); 1270 size_t face_index = GLES2Util::GLTargetToFaceIndex(target);
1270 if (level >= 0 && face_index < face_infos_.size() && 1271 if (level >= 0 && face_index < face_infos_.size() &&
1271 static_cast<size_t>(level) < face_infos_[face_index].level_infos.size()) { 1272 static_cast<size_t>(level) < face_infos_[face_index].level_infos.size()) {
1272 const LevelInfo& info = face_infos_[face_index].level_infos[level]; 1273 const LevelInfo& info = face_infos_[face_index].level_infos[level];
1273 if (info.target != 0) { 1274 if (info.target != 0) {
1274 if (state)
1275 *state = info.image_state;
1276 return info.image.get(); 1275 return info.image.get();
1277 } 1276 }
1278 } 1277 }
1279 return NULL; 1278 return NULL;
1280 } 1279 }
1281 1280
1282 gfx::GLImage* Texture::GetLevelImage(GLint target, GLint level) const { 1281 void Texture::OnWillModifyPixels() {
1283 return GetLevelImage(target, level, nullptr); 1282 gfx::GLImage* image = GetLevelImage(target(), 0);
1283 if (image)
1284 image->WillModifyTexImage();
1285 }
1286
1287 void Texture::OnDidModifyPixels() {
1288 gfx::GLImage* image = GetLevelImage(target(), 0);
1289 if (image)
1290 image->DidModifyTexImage();
1284 } 1291 }
1285 1292
1286 void Texture::DumpLevelMemory(base::trace_event::ProcessMemoryDump* pmd, 1293 void Texture::DumpLevelMemory(base::trace_event::ProcessMemoryDump* pmd,
1287 uint64_t client_tracing_id, 1294 uint64_t client_tracing_id,
1288 const std::string& dump_name) const { 1295 const std::string& dump_name) const {
1289 for (uint32_t face_index = 0; face_index < face_infos_.size(); ++face_index) { 1296 for (uint32_t face_index = 0; face_index < face_infos_.size(); ++face_index) {
1290 const auto& level_infos = face_infos_[face_index].level_infos; 1297 const auto& level_infos = face_infos_[face_index].level_infos;
1291 for (uint32_t level_index = 0; level_index < level_infos.size(); 1298 for (uint32_t level_index = 0; level_index < level_infos.size();
1292 ++level_index) { 1299 ++level_index) {
1293 // Skip levels with no size. Textures will have empty levels for all 1300 // Skip levels with no size. Textures will have empty levels for all
1294 // potential mip levels which are not in use. 1301 // potential mip levels which are not in use.
1295 if (!level_infos[level_index].estimated_size) 1302 if (!level_infos[level_index].estimated_size)
1296 continue; 1303 continue;
1297 1304
1298 // If a level has a GLImage, ask the GLImage to dump itself.
1299 if (level_infos[level_index].image) { 1305 if (level_infos[level_index].image) {
1306 // If a level is backed by a GLImage, ask the GLImage to dump itself.
1300 level_infos[level_index].image->OnMemoryDump( 1307 level_infos[level_index].image->OnMemoryDump(
1301 pmd, client_tracing_id, 1308 pmd, client_tracing_id,
1302 base::StringPrintf("%s/face_%d/level_%d", dump_name.c_str(), 1309 base::StringPrintf("%s/face_%d/level_%d", dump_name.c_str(),
1303 face_index, level_index)); 1310 face_index, level_index));
1304 } 1311 } else {
1305 1312 // If a level is not backed by a GLImage, create a simple dump.
1306 // If a level does not have a GLImage bound to it, then dump the
1307 // texture allocation also as the storage is not provided by the
1308 // GLImage in that case.
1309 if (level_infos[level_index].image_state != BOUND) {
1310 base::trace_event::MemoryAllocatorDump* dump = pmd->CreateAllocatorDump( 1313 base::trace_event::MemoryAllocatorDump* dump = pmd->CreateAllocatorDump(
1311 base::StringPrintf("%s/face_%d/level_%d", dump_name.c_str(), 1314 base::StringPrintf("%s/face_%d/level_%d", dump_name.c_str(),
1312 face_index, level_index)); 1315 face_index, level_index));
1313 dump->AddScalar( 1316 dump->AddScalar(
1314 base::trace_event::MemoryAllocatorDump::kNameSize, 1317 base::trace_event::MemoryAllocatorDump::kNameSize,
1315 base::trace_event::MemoryAllocatorDump::kUnitsBytes, 1318 base::trace_event::MemoryAllocatorDump::kUnitsBytes,
1316 static_cast<uint64_t>(level_infos[level_index].estimated_size)); 1319 static_cast<uint64_t>(level_infos[level_index].estimated_size));
1317 } 1320 }
1318 } 1321 }
1319 } 1322 }
(...skipping 395 matching lines...) Expand 10 before | Expand all | Expand 10 after
1715 GLsizei depth) { 1718 GLsizei depth) {
1716 switch (target) { 1719 switch (target) {
1717 case GL_TEXTURE_EXTERNAL_OES: 1720 case GL_TEXTURE_EXTERNAL_OES:
1718 return 1; 1721 return 1;
1719 default: 1722 default:
1720 return 1 + 1723 return 1 +
1721 base::bits::Log2Floor(std::max(std::max(width, height), depth)); 1724 base::bits::Log2Floor(std::max(std::max(width, height), depth));
1722 } 1725 }
1723 } 1726 }
1724 1727
1725 void TextureManager::SetLevelImage(TextureRef* ref, 1728 void TextureManager::SetLevelImage(
1726 GLenum target, 1729 TextureRef* ref,
1727 GLint level, 1730 GLenum target,
1728 gfx::GLImage* image, 1731 GLint level,
1729 Texture::ImageState state) { 1732 gfx::GLImage* image) {
1730 DCHECK(ref); 1733 DCHECK(ref);
1731 ref->texture()->SetLevelImage(target, level, image, state); 1734 ref->texture()->SetLevelImage(feature_info_.get(), target, level, image);
1732 } 1735 }
1733 1736
1734 size_t TextureManager::GetSignatureSize() const { 1737 size_t TextureManager::GetSignatureSize() const {
1735 return sizeof(TextureTag) + sizeof(TextureSignature); 1738 return sizeof(TextureTag) + sizeof(TextureSignature);
1736 } 1739 }
1737 1740
1738 void TextureManager::AddToSignature( 1741 void TextureManager::AddToSignature(
1739 TextureRef* ref, 1742 TextureRef* ref,
1740 GLenum target, 1743 GLenum target,
1741 GLint level, 1744 GLint level,
(...skipping 421 matching lines...) Expand 10 before | Expand all | Expand 10 after
2163 pmd->AddOwnershipEdge(client_guid, service_guid, importance); 2166 pmd->AddOwnershipEdge(client_guid, service_guid, importance);
2164 2167
2165 // Dump all sub-levels held by the texture. They will appear below the main 2168 // Dump all sub-levels held by the texture. They will appear below the main
2166 // gl/textures/client_X/texture_Y dump. 2169 // gl/textures/client_X/texture_Y dump.
2167 ref->texture()->DumpLevelMemory(pmd, memory_tracker_->ClientTracingId(), 2170 ref->texture()->DumpLevelMemory(pmd, memory_tracker_->ClientTracingId(),
2168 dump_name); 2171 dump_name);
2169 } 2172 }
2170 2173
2171 } // namespace gles2 2174 } // namespace gles2
2172 } // namespace gpu 2175 } // namespace gpu
OLDNEW
« 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