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

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: Key texture manager memory dump provider registration off of memory_tracker_ 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 // When created from InProcessCommandBuffer, we won't have a |memory_tracker_|
1386 // so don't register a dump provider.
1387 if (memory_tracker_) {
1388 base::trace_event::MemoryDumpManager::GetInstance()->RegisterDumpProvider(
1389 this, base::ThreadTaskRunnerHandle::Get());
1390 }
1391
1378 return true; 1392 return true;
1379 } 1393 }
1380 1394
1381 scoped_refptr<TextureRef> 1395 scoped_refptr<TextureRef>
1382 TextureManager::CreateDefaultAndBlackTextures( 1396 TextureManager::CreateDefaultAndBlackTextures(
1383 GLenum target, 1397 GLenum target,
1384 GLuint* black_texture) { 1398 GLuint* black_texture) {
1385 static uint8 black[] = {0, 0, 0, 255}; 1399 static uint8 black[] = {0, 0, 0, 255};
1386 1400
1387 // Sampling a texture not associated with any EGLImage sibling will return 1401 // 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), 2034 : texture_state_(texture_state),
2021 begin_time_(base::TimeTicks::Now()) { 2035 begin_time_(base::TimeTicks::Now()) {
2022 } 2036 }
2023 2037
2024 ScopedTextureUploadTimer::~ScopedTextureUploadTimer() { 2038 ScopedTextureUploadTimer::~ScopedTextureUploadTimer() {
2025 texture_state_->texture_upload_count++; 2039 texture_state_->texture_upload_count++;
2026 texture_state_->total_texture_upload_time += 2040 texture_state_->total_texture_upload_time +=
2027 base::TimeTicks::Now() - begin_time_; 2041 base::TimeTicks::Now() - begin_time_;
2028 } 2042 }
2029 2043
2044 bool TextureManager::OnMemoryDump(base::trace_event::ProcessMemoryDump* pmd) {
2045 for (const auto& resource : textures_) {
2046 // Only dump memory info for textures actually owned by this TextureManager.
2047 DumpTextureRef(pmd, resource.second.get());
2048 }
2049
2050 // Also dump TextureManager internal textures, if allocated.
2051 for (int i = 0; i < kNumDefaultTextures; i++) {
2052 if (default_textures_[i]) {
2053 DumpTextureRef(pmd, default_textures_[i].get());
2054 }
2055 }
2056
2057 return true;
2058 }
2059
2060 void TextureManager::DumpTextureRef(base::trace_event::ProcessMemoryDump* pmd,
2061 TextureRef* ref) {
2062 // TODO(ericrk): Trace image-backed textures. crbug.com/514914
2063 if (ref->texture()->HasImages())
2064 return;
2065
2066 uint32_t size = ref->texture()->estimated_size();
2067
2068 // Ignore unallocated texture IDs.
2069 if (size == 0)
2070 return;
2071
2072 std::string dump_name =
2073 base::StringPrintf("gl/textures/client_%d/texture_%d",
2074 memory_tracker_->ClientId(), ref->client_id());
2075 base::trace_event::MemoryAllocatorDump* dump =
2076 pmd->CreateAllocatorDump(dump_name);
2077 dump->AddScalar(base::trace_event::MemoryAllocatorDump::kNameSize,
2078 base::trace_event::MemoryAllocatorDump::kUnitsBytes,
2079 static_cast<uint64_t>(size));
2080
2081 // Add the |client_guid| which expresses shared ownership with the client
2082 // process.
2083 auto client_guid = gfx::GetGLTextureGUIDForTracing(
2084 memory_tracker_->ClientTracingId(), ref->client_id());
2085 pmd->CreateSharedGlobalAllocatorDump(client_guid);
2086 pmd->AddOwnershipEdge(dump->guid(), client_guid);
2087
2088 // Add a |service_guid| which expresses shared ownership between the various
2089 // |client_guid|s.
2090 // TODO(ericrk): May need to ensure uniqueness using GLShareGroup and
2091 // potentially cross-share-group sharing via EGLImages. crbug.com/512534
2092 auto service_guid =
2093 gfx::GetGLTextureGUIDForTracing(0, ref->texture()->service_id());
2094 pmd->CreateSharedGlobalAllocatorDump(service_guid);
2095
2096 int importance = 0; // Default importance.
2097 // The link to the memory tracking |client_id| is given a higher importance
2098 // than other refs.
2099 if (ref == ref->texture()->memory_tracking_ref_)
2100 importance = 2;
2101
2102 pmd->AddOwnershipEdge(client_guid, service_guid, importance);
2103 }
2104
2030 } // namespace gles2 2105 } // namespace gles2
2031 } // namespace gpu 2106 } // 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