| Index: content/test/gpu/gpu_tests/memory.py
|
| diff --git a/content/test/gpu/gpu_tests/memory.py b/content/test/gpu/gpu_tests/memory.py
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..c8eadc426c25257d8e0153dea2f6e44297906c5a
|
| --- /dev/null
|
| +++ b/content/test/gpu/gpu_tests/memory.py
|
| @@ -0,0 +1,114 @@
|
| +# Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
| +# Use of this source code is governed by a BSD-style license that can be
|
| +# found in the LICENSE file.
|
| +import memory_expectations
|
| +import page_sets
|
| +
|
| +from telemetry import benchmark
|
| +from telemetry.page import page_test
|
| +from telemetry.core.platform import tracing_category_filter
|
| +from telemetry.core.platform import tracing_options
|
| +from telemetry.timeline import counter
|
| +from telemetry.timeline import model
|
| +
|
| +MEMORY_LIMIT_MB = 192
|
| +SINGLE_TAB_LIMIT_MB = 192
|
| +WIGGLE_ROOM_MB = 12
|
| +
|
| +test_harness_script = r"""
|
| + var domAutomationController = {};
|
| + domAutomationController._finished = false;
|
| +
|
| + domAutomationController.send = function(msg) {
|
| + // This should wait until all effects of memory management complete.
|
| + // We will need to wait until all
|
| + // 1. pending commits from the main thread to the impl thread in the
|
| + // compositor complete (for visible compositors).
|
| + // 2. allocations that the renderer's impl thread will make due to the
|
| + // compositor and WebGL are completed.
|
| + // 3. pending GpuMemoryManager::Manage() calls to manage are made.
|
| + // 4. renderers' OnMemoryAllocationChanged callbacks in response to
|
| + // manager are made.
|
| + // Each step in this sequence can cause trigger the next (as a 1-2-3-4-1
|
| + // cycle), so we will need to pump this cycle until it stabilizes.
|
| +
|
| + // Pump the cycle 8 times (in principle it could take an infinite number
|
| + // of iterations to settle).
|
| +
|
| + var rafCount = 0;
|
| +
|
| + // Impl-side painting has changed the behavior of this test.
|
| + // Currently the background of the page shows up checkerboarded
|
| + // initially, causing the test to fail because the memory
|
| + // allocation is too low (no root layer). Temporarily increase the
|
| + // rAF count to 32 in order to make the test work reliably again.
|
| + // crbug.com/373098
|
| + // TODO(kbr): revert this change and put it back to 8 iterations.
|
| + var totalRafCount = 32;
|
| +
|
| + function pumpRAF() {
|
| + if (rafCount == totalRafCount) {
|
| + domAutomationController._finished = true;
|
| + return;
|
| + }
|
| + ++rafCount;
|
| + window.requestAnimationFrame(pumpRAF);
|
| + }
|
| + pumpRAF();
|
| + }
|
| +
|
| + window.domAutomationController = domAutomationController;
|
| +
|
| + window.addEventListener("load", function() {
|
| + useGpuMemory(%d);
|
| + }, false);
|
| +""" % MEMORY_LIMIT_MB
|
| +
|
| +class _MemoryValidator(page_test.PageTest):
|
| + def ValidateAndMeasurePage(self, page, tab, results):
|
| + timeline_data = tab.browser.platform.tracing_controller.Stop()
|
| + timeline_model = model.TimelineModel(timeline_data)
|
| + for process in timeline_model.GetAllProcesses():
|
| + if 'gpu.GpuMemoryUsage' in process.counters:
|
| + counter = process.GetCounter('gpu', 'GpuMemoryUsage')
|
| + mb_used = counter.samples[-1] / 1048576
|
| +
|
| + if mb_used + WIGGLE_ROOM_MB < SINGLE_TAB_LIMIT_MB:
|
| + raise page_test.Failure(self._FormatException('low', mb_used))
|
| +
|
| + if mb_used - WIGGLE_ROOM_MB > MEMORY_LIMIT_MB:
|
| + raise page_test.Failure(self._FormatException('high', mb_used))
|
| +
|
| + def CustomizeBrowserOptions(self, options):
|
| + options.AppendExtraBrowserArgs('--enable-logging')
|
| + options.AppendExtraBrowserArgs(
|
| + '--force-gpu-mem-available-mb=%s' % MEMORY_LIMIT_MB)
|
| +
|
| + def WillNavigateToPage(self, page, tab):
|
| + # FIXME: Remove webkit.console when blink.console lands in chromium and the
|
| + # ref builds are updated. crbug.com/386847
|
| + custom_categories = ['webkit.console', 'blink.console', 'gpu']
|
| + category_filter = tracing_category_filter.TracingCategoryFilter()
|
| + for c in custom_categories:
|
| + category_filter.AddIncludedCategory(c)
|
| + options = tracing_options.TracingOptions()
|
| + options.enable_chrome_trace = True
|
| + tab.browser.platform.tracing_controller.Start(options, category_filter, 60)
|
| +
|
| + def _FormatException(self, low_or_high, mb_used):
|
| + return 'Memory allocation too %s (was %d MB, should be %d MB +/- %d MB)' % (
|
| + low_or_high, mb_used, SINGLE_TAB_LIMIT_MB, WIGGLE_ROOM_MB)
|
| +
|
| +class Memory(benchmark.Benchmark):
|
| + """Tests GPU memory limits"""
|
| + test = _MemoryValidator
|
| + page_set = page_sets.MemoryTestsPageSet
|
| +
|
| + def CreateExpectations(self, page_set):
|
| + return memory_expectations.MemoryExpectations()
|
| +
|
| + def CreatePageSet(self, options):
|
| + page_set = super(Memory, self).CreatePageSet(options)
|
| + for page in page_set.pages:
|
| + page.script_to_evaluate_on_commit = test_harness_script
|
| + return page_set
|
|
|