OLD | NEW |
(Empty) | |
| 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 |
| 3 # found in the LICENSE file. |
| 4 import memory_expectations |
| 5 import page_sets |
| 6 |
| 7 from telemetry import benchmark |
| 8 from telemetry.page import page_test |
| 9 from telemetry.core.platform import tracing_category_filter |
| 10 from telemetry.core.platform import tracing_options |
| 11 from telemetry.timeline import counter |
| 12 from telemetry.timeline import model |
| 13 |
| 14 MEMORY_LIMIT_MB = 192 |
| 15 SINGLE_TAB_LIMIT_MB = 192 |
| 16 WIGGLE_ROOM_MB = 12 |
| 17 |
| 18 test_harness_script = r""" |
| 19 var domAutomationController = {}; |
| 20 domAutomationController._finished = false; |
| 21 |
| 22 domAutomationController.send = function(msg) { |
| 23 // This should wait until all effects of memory management complete. |
| 24 // We will need to wait until all |
| 25 // 1. pending commits from the main thread to the impl thread in the |
| 26 // compositor complete (for visible compositors). |
| 27 // 2. allocations that the renderer's impl thread will make due to the |
| 28 // compositor and WebGL are completed. |
| 29 // 3. pending GpuMemoryManager::Manage() calls to manage are made. |
| 30 // 4. renderers' OnMemoryAllocationChanged callbacks in response to |
| 31 // manager are made. |
| 32 // Each step in this sequence can cause trigger the next (as a 1-2-3-4-1 |
| 33 // cycle), so we will need to pump this cycle until it stabilizes. |
| 34 |
| 35 // Pump the cycle 8 times (in principle it could take an infinite number |
| 36 // of iterations to settle). |
| 37 |
| 38 var rafCount = 0; |
| 39 |
| 40 // Impl-side painting has changed the behavior of this test. |
| 41 // Currently the background of the page shows up checkerboarded |
| 42 // initially, causing the test to fail because the memory |
| 43 // allocation is too low (no root layer). Temporarily increase the |
| 44 // rAF count to 32 in order to make the test work reliably again. |
| 45 // crbug.com/373098 |
| 46 // TODO(kbr): revert this change and put it back to 8 iterations. |
| 47 var totalRafCount = 32; |
| 48 |
| 49 function pumpRAF() { |
| 50 if (rafCount == totalRafCount) { |
| 51 domAutomationController._finished = true; |
| 52 return; |
| 53 } |
| 54 ++rafCount; |
| 55 window.requestAnimationFrame(pumpRAF); |
| 56 } |
| 57 pumpRAF(); |
| 58 } |
| 59 |
| 60 window.domAutomationController = domAutomationController; |
| 61 |
| 62 window.addEventListener("load", function() { |
| 63 useGpuMemory(%d); |
| 64 }, false); |
| 65 """ % MEMORY_LIMIT_MB |
| 66 |
| 67 class _MemoryValidator(page_test.PageTest): |
| 68 def ValidateAndMeasurePage(self, page, tab, results): |
| 69 timeline_data = tab.browser.platform.tracing_controller.Stop() |
| 70 timeline_model = model.TimelineModel(timeline_data) |
| 71 for process in timeline_model.GetAllProcesses(): |
| 72 if 'gpu.GpuMemoryUsage' in process.counters: |
| 73 counter = process.GetCounter('gpu', 'GpuMemoryUsage') |
| 74 mb_used = counter.samples[-1] / 1048576 |
| 75 |
| 76 if mb_used + WIGGLE_ROOM_MB < SINGLE_TAB_LIMIT_MB: |
| 77 raise page_test.Failure(self._FormatException('low', mb_used)) |
| 78 |
| 79 if mb_used - WIGGLE_ROOM_MB > MEMORY_LIMIT_MB: |
| 80 raise page_test.Failure(self._FormatException('high', mb_used)) |
| 81 |
| 82 def CustomizeBrowserOptions(self, options): |
| 83 options.AppendExtraBrowserArgs('--enable-logging') |
| 84 options.AppendExtraBrowserArgs( |
| 85 '--force-gpu-mem-available-mb=%s' % MEMORY_LIMIT_MB) |
| 86 |
| 87 def WillNavigateToPage(self, page, tab): |
| 88 # FIXME: Remove webkit.console when blink.console lands in chromium and the |
| 89 # ref builds are updated. crbug.com/386847 |
| 90 custom_categories = ['webkit.console', 'blink.console', 'gpu'] |
| 91 category_filter = tracing_category_filter.TracingCategoryFilter() |
| 92 for c in custom_categories: |
| 93 category_filter.AddIncludedCategory(c) |
| 94 options = tracing_options.TracingOptions() |
| 95 options.enable_chrome_trace = True |
| 96 tab.browser.platform.tracing_controller.Start(options, category_filter, 60) |
| 97 |
| 98 def _FormatException(self, low_or_high, mb_used): |
| 99 return 'Memory allocation too %s (was %d MB, should be %d MB +/- %d MB)' % ( |
| 100 low_or_high, mb_used, SINGLE_TAB_LIMIT_MB, WIGGLE_ROOM_MB) |
| 101 |
| 102 class Memory(benchmark.Benchmark): |
| 103 """Tests GPU memory limits""" |
| 104 test = _MemoryValidator |
| 105 page_set = page_sets.MemoryTestsPageSet |
| 106 |
| 107 def CreateExpectations(self, page_set): |
| 108 return memory_expectations.MemoryExpectations() |
| 109 |
| 110 def CreatePageSet(self, options): |
| 111 page_set = super(Memory, self).CreatePageSet(options) |
| 112 for page in page_set.pages: |
| 113 page.script_to_evaluate_on_commit = test_harness_script |
| 114 return page_set |
OLD | NEW |