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

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

Issue 1256613002: Add tracing for GL texture objects (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@browser_process_id
Patch Set: build fixes Created 5 years, 4 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
11 #include "base/bits.h" 11 #include "base/bits.h"
12 #include "base/lazy_instance.h" 12 #include "base/lazy_instance.h"
13 #include "base/strings/stringprintf.h" 13 #include "base/strings/stringprintf.h"
14 #include "base/thread_task_runner_handle.h"
15 #include "base/trace_event/memory_dump_manager.h"
14 #include "gpu/command_buffer/common/gles2_cmd_utils.h" 16 #include "gpu/command_buffer/common/gles2_cmd_utils.h"
15 #include "gpu/command_buffer/service/context_state.h" 17 #include "gpu/command_buffer/service/context_state.h"
16 #include "gpu/command_buffer/service/error_state.h" 18 #include "gpu/command_buffer/service/error_state.h"
17 #include "gpu/command_buffer/service/feature_info.h" 19 #include "gpu/command_buffer/service/feature_info.h"
18 #include "gpu/command_buffer/service/framebuffer_manager.h" 20 #include "gpu/command_buffer/service/framebuffer_manager.h"
19 #include "gpu/command_buffer/service/gles2_cmd_decoder.h" 21 #include "gpu/command_buffer/service/gles2_cmd_decoder.h"
20 #include "gpu/command_buffer/service/mailbox_manager.h" 22 #include "gpu/command_buffer/service/mailbox_manager.h"
21 #include "gpu/command_buffer/service/memory_tracking.h" 23 #include "gpu/command_buffer/service/memory_tracking.h"
22 #include "ui/gl/gl_implementation.h" 24 #include "ui/gl/gl_implementation.h"
25 #include "ui/gl/trace_util.h"
23 26
24 namespace gpu { 27 namespace gpu {
25 namespace gles2 { 28 namespace gles2 {
26 29
27 namespace { 30 namespace {
28 31
29 // This should contain everything to uniquely identify a Texture. 32 // This should contain everything to uniquely identify a Texture.
30 const char TextureTag[] = "|Texture|"; 33 const char TextureTag[] = "|Texture|";
31 struct TextureSignature { 34 struct TextureSignature {
32 GLenum target_; 35 GLenum target_;
(...skipping 243 matching lines...) Expand 10 before | Expand all | Expand 10 after
276 DCHECK(textures_.empty()); 279 DCHECK(textures_.empty());
277 280
278 // If this triggers, that means something is keeping a reference to 281 // If this triggers, that means something is keeping a reference to
279 // a Texture belonging to this. 282 // a Texture belonging to this.
280 CHECK_EQ(texture_count_, 0u); 283 CHECK_EQ(texture_count_, 0u);
281 284
282 DCHECK_EQ(0, num_unrenderable_textures_); 285 DCHECK_EQ(0, num_unrenderable_textures_);
283 DCHECK_EQ(0, num_unsafe_textures_); 286 DCHECK_EQ(0, num_unsafe_textures_);
284 DCHECK_EQ(0, num_uncleared_mips_); 287 DCHECK_EQ(0, num_uncleared_mips_);
285 DCHECK_EQ(0, num_images_); 288 DCHECK_EQ(0, num_images_);
289
290 base::trace_event::MemoryDumpManager::GetInstance()->UnregisterDumpProvider(
291 this);
286 } 292 }
287 293
288 void TextureManager::Destroy(bool have_context) { 294 void TextureManager::Destroy(bool have_context) {
289 have_context_ = have_context; 295 have_context_ = have_context;
290 textures_.clear(); 296 textures_.clear();
291 for (int ii = 0; ii < kNumDefaultTextures; ++ii) { 297 for (int ii = 0; ii < kNumDefaultTextures; ++ii) {
292 default_textures_[ii] = NULL; 298 default_textures_[ii] = NULL;
293 } 299 }
294 300
295 if (have_context) { 301 if (have_context) {
(...skipping 1021 matching lines...) Expand 10 before | Expand all | Expand 10 after
1317 FeatureInfo* feature_info, 1323 FeatureInfo* feature_info,
1318 GLint max_texture_size, 1324 GLint max_texture_size,
1319 GLint max_cube_map_texture_size, 1325 GLint max_cube_map_texture_size,
1320 GLint max_rectangle_texture_size, 1326 GLint max_rectangle_texture_size,
1321 GLint max_3d_texture_size, 1327 GLint max_3d_texture_size,
1322 bool use_default_textures) 1328 bool use_default_textures)
1323 : memory_tracker_managed_( 1329 : memory_tracker_managed_(
1324 new MemoryTypeTracker(memory_tracker, MemoryTracker::kManaged)), 1330 new MemoryTypeTracker(memory_tracker, MemoryTracker::kManaged)),
1325 memory_tracker_unmanaged_( 1331 memory_tracker_unmanaged_(
1326 new MemoryTypeTracker(memory_tracker, MemoryTracker::kUnmanaged)), 1332 new MemoryTypeTracker(memory_tracker, MemoryTracker::kUnmanaged)),
1333 memory_tracker_(memory_tracker),
1327 feature_info_(feature_info), 1334 feature_info_(feature_info),
1328 framebuffer_manager_(NULL), 1335 framebuffer_manager_(NULL),
1329 max_texture_size_(max_texture_size), 1336 max_texture_size_(max_texture_size),
1330 max_cube_map_texture_size_(max_cube_map_texture_size), 1337 max_cube_map_texture_size_(max_cube_map_texture_size),
1331 max_rectangle_texture_size_(max_rectangle_texture_size), 1338 max_rectangle_texture_size_(max_rectangle_texture_size),
1332 max_3d_texture_size_(max_3d_texture_size), 1339 max_3d_texture_size_(max_3d_texture_size),
1333 max_levels_(ComputeMipMapCount(GL_TEXTURE_2D, 1340 max_levels_(ComputeMipMapCount(GL_TEXTURE_2D,
1334 max_texture_size, 1341 max_texture_size,
1335 max_texture_size, 1342 max_texture_size,
1336 max_texture_size)), 1343 max_texture_size)),
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
1368 if (feature_info_->feature_flags().oes_egl_image_external) { 1375 if (feature_info_->feature_flags().oes_egl_image_external) {
1369 default_textures_[kExternalOES] = CreateDefaultAndBlackTextures( 1376 default_textures_[kExternalOES] = CreateDefaultAndBlackTextures(
1370 GL_TEXTURE_EXTERNAL_OES, &black_texture_ids_[kExternalOES]); 1377 GL_TEXTURE_EXTERNAL_OES, &black_texture_ids_[kExternalOES]);
1371 } 1378 }
1372 1379
1373 if (feature_info_->feature_flags().arb_texture_rectangle) { 1380 if (feature_info_->feature_flags().arb_texture_rectangle) {
1374 default_textures_[kRectangleARB] = CreateDefaultAndBlackTextures( 1381 default_textures_[kRectangleARB] = CreateDefaultAndBlackTextures(
1375 GL_TEXTURE_RECTANGLE_ARB, &black_texture_ids_[kRectangleARB]); 1382 GL_TEXTURE_RECTANGLE_ARB, &black_texture_ids_[kRectangleARB]);
1376 } 1383 }
1377 1384
1385 base::trace_event::MemoryDumpManager::GetInstance()->RegisterDumpProvider(
1386 this, base::ThreadTaskRunnerHandle::Get());
1387
1378 return true; 1388 return true;
1379 } 1389 }
1380 1390
1381 scoped_refptr<TextureRef> 1391 scoped_refptr<TextureRef>
1382 TextureManager::CreateDefaultAndBlackTextures( 1392 TextureManager::CreateDefaultAndBlackTextures(
1383 GLenum target, 1393 GLenum target,
1384 GLuint* black_texture) { 1394 GLuint* black_texture) {
1385 static uint8 black[] = {0, 0, 0, 255}; 1395 static uint8 black[] = {0, 0, 0, 255};
1386 1396
1387 // Sampling a texture not associated with any EGLImage sibling will return 1397 // Sampling a texture not associated with any EGLImage sibling will return
(...skipping 632 matching lines...) Expand 10 before | Expand all | Expand 10 after
2020 : texture_state_(texture_state), 2030 : texture_state_(texture_state),
2021 begin_time_(base::TimeTicks::Now()) { 2031 begin_time_(base::TimeTicks::Now()) {
2022 } 2032 }
2023 2033
2024 ScopedTextureUploadTimer::~ScopedTextureUploadTimer() { 2034 ScopedTextureUploadTimer::~ScopedTextureUploadTimer() {
2025 texture_state_->texture_upload_count++; 2035 texture_state_->texture_upload_count++;
2026 texture_state_->total_texture_upload_time += 2036 texture_state_->total_texture_upload_time +=
2027 base::TimeTicks::Now() - begin_time_; 2037 base::TimeTicks::Now() - begin_time_;
2028 } 2038 }
2029 2039
2040 bool TextureManager::OnMemoryDump(base::trace_event::ProcessMemoryDump* pmd) {
2041 for (const auto& resource : textures_) {
2042 // Only dump memory info for textures actually owned by this TextureManager.
2043 DumpTextureRef(pmd, resource.second.get());
2044 }
2045
2046 // Also dump TextureManager internal textures, if allocated.
2047 for (int i = 0; i < kNumDefaultTextures; i++) {
2048 if (default_textures_[i]) {
2049 DumpTextureRef(pmd, default_textures_[i].get());
2050 }
2051 }
2052
2053 return true;
2054 }
2055
2056 void TextureManager::DumpTextureRef(base::trace_event::ProcessMemoryDump* pmd,
2057 TextureRef* ref) {
2058 // TODO(ericrk): Trace image-backed textures. crbug.com/514914
2059 if (ref->texture()->HasImages())
2060 return;
2061
2062 uint32_t size = ref->texture()->estimated_size();
2063
2064 // Ignore unallocated texture IDs.
2065 if (size == 0)
2066 return;
2067
2068 std::string dump_name =
2069 base::StringPrintf("gl/textures/client_%d/texture_%d",
2070 memory_tracker_->ClientId(), ref->client_id());
2071 base::trace_event::MemoryAllocatorDump* dump =
2072 pmd->CreateAllocatorDump(dump_name);
2073 dump->AddScalar(base::trace_event::MemoryAllocatorDump::kNameSize,
2074 base::trace_event::MemoryAllocatorDump::kUnitsBytes,
2075 static_cast<uint64_t>(size));
2076
2077 // Add the |client_guid| which expresses shared ownership with the client
2078 // process.
2079 auto client_guid = gfx::GetGLTextureGUIDForTracing(
2080 memory_tracker_->ClientTracingId(), ref->client_id());
2081 pmd->CreateSharedGlobalAllocatorDump(client_guid);
2082 pmd->AddOwnershipEdge(dump->guid(), client_guid);
2083
2084 // Add a |service_guid| which expresses shared ownership between the various
2085 // |client_guid|s.
2086 auto service_guid =
2087 gfx::GetGLTextureGUIDForTracing(0, ref->texture()->service_id());
piman 2015/08/03 21:36:21 This is fine as a first pass. For Android WebView,
ericrk 2015/08/03 22:11:04 Done.
2088 pmd->CreateSharedGlobalAllocatorDump(service_guid);
2089
2090 int importance = 0; // Default importance.
2091 // The link to the memory tracking |client_id| is given a higher importance
2092 // than other refs.
2093 if (ref == ref->texture()->memory_tracking_ref_)
2094 importance = 2;
2095
2096 pmd->AddOwnershipEdge(client_guid, service_guid, importance);
2097 }
2098
2030 } // namespace gles2 2099 } // namespace gles2
2031 } // namespace gpu 2100 } // 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