# Copyright 2014 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
from page_sets.rendering import rendering_story
from page_sets.rendering import story_tags
from page_sets.system_health import platforms
class ToughWebglPage(rendering_story.RenderingStory):
ABSTRACT_STORY = True
TAGS = [story_tags.REQUIRED_WEBGL, story_tags.TOUGH_WEBGL]
def __init__(self,
page_set,
shared_page_state_class,
name_suffix='',
extra_browser_args=None):
if extra_browser_args is None:
extra_browser_args = []
extra_browser_args.append("--enable-webgl-draft-extensions")
extra_browser_args.append("--disable-features=V8TurboFastApiCalls")
super(ToughWebglPage, self).__init__(
page_set=page_set,
shared_page_state_class=shared_page_state_class,
name_suffix=name_suffix,
extra_browser_args=extra_browser_args,
make_javascript_deterministic=False)
@property
def skipped_gpus(self):
# crbug.com/462729
return ['arm', 'broadcom', 'hisilicon', 'imagination', 'vivante']
def RunNavigateSteps(self, action_runner):
super(ToughWebglPage, self).RunNavigateSteps(action_runner)
action_runner.WaitForJavaScriptCondition(
'document.readyState == "complete"')
action_runner.Wait(2)
def RunPageInteractions(self, action_runner):
with action_runner.CreateInteraction('WebGLAnimation'):
action_runner.Wait(10)
class NvidiaVertexBufferObjectPage(ToughWebglPage):
BASE_NAME = 'nvidia_vertex_buffer_object'
# pylint: disable=line-too-long
URL = 'http://www.khronos.org/registry/webgl/sdk/demos/google/nvidia-vertex-buffer-object/index.html'
TAGS = ToughWebglPage.TAGS + [story_tags.REPRESENTATIVE_WIN_DESKTOP]
class SansAngelesPage(ToughWebglPage):
BASE_NAME = 'san_angeles'
# pylint: disable=line-too-long
URL = 'http://www.khronos.org/registry/webgl/sdk/demos/google/san-angeles/index.html'
class ParticlesPage(ToughWebglPage):
BASE_NAME = 'particles'
# pylint: disable=line-too-long
URL = 'http://www.khronos.org/registry/webgl/sdk/demos/google/particles/index.html'
class EarthPage(ToughWebglPage):
BASE_NAME = 'earth'
URL = 'http://www.khronos.org/registry/webgl/sdk/demos/webkit/Earth.html'
class ManyPlanetsDeepPage(ToughWebglPage):
BASE_NAME = 'many_planets_deep'
# pylint: disable=line-too-long
URL = 'http://www.khronos.org/registry/webgl/sdk/demos/webkit/ManyPlanetsDeep.html'
TAGS = ToughWebglPage.TAGS + [story_tags.REPRESENTATIVE_WIN_DESKTOP]
class Aquarium(ToughWebglPage):
BASE_NAME = 'aquarium'
URL = 'http://webglsamples.org/aquarium/aquarium.html'
TAGS = ToughWebglPage.TAGS + [story_tags.REPRESENTATIVE_WIN_DESKTOP]
class Aquarium20KFish(ToughWebglPage):
BASE_NAME = 'aquarium_20k'
URL = 'http://webglsamples.org/aquarium/aquarium.html?numFish=20000'
TAGS = ToughWebglPage.TAGS + [story_tags.REPRESENTATIVE_WIN_DESKTOP]
class Blob(ToughWebglPage):
BASE_NAME = 'blob'
URL = 'http://webglsamples.org/blob/blob.html'
class DynamicCubeMap(ToughWebglPage):
BASE_NAME = 'dynamic_cube_map'
URL = 'http://webglsamples.org/dynamic-cubemap/dynamic-cubemap.html'
class AnimometerWebGL(ToughWebglPage):
BASE_NAME = 'animometer_webgl'
# pylint: disable=line-too-long
URL = 'http://kenrussell.github.io/webgl-animometer/Animometer/tests/3d/webgl.html'
class AnimometerWebGLMultiDraw(ToughWebglPage):
BASE_NAME = 'animometer_webgl_multi_draw'
# pylint: disable=line-too-long
URL = 'http://kenrussell.github.io/webgl-animometer/Animometer/tests/3d/webgl.html?webgl_version=2&use_ubos=1&use_multi_draw=1'
class AnimometerWebGLIndexed(ToughWebglPage):
BASE_NAME = 'animometer_webgl_indexed'
SUPPORTED_PLATFORMS = platforms.DESKTOP_ONLY
# pylint: disable=line-too-long
URL = 'http://kenrussell.github.io/webgl-animometer/Animometer/tests/3d/webgl-indexed-instanced.html?webgl_version=2&use_attributes=1&num_geometries=120000'
class AnimometerWebGLIndexedMultiDraw(ToughWebglPage):
BASE_NAME = 'animometer_webgl_indexed_multi_draw'
SUPPORTED_PLATFORMS = platforms.DESKTOP_ONLY
# pylint: disable=line-too-long
URL = 'http://kenrussell.github.io/webgl-animometer/Animometer/tests/3d/webgl-indexed-instanced.html?webgl_version=2&use_attributes=1&use_multi_draw=1&num_geometries=120000'
class AnimometerWebGLIndexedBaseVertexBaseInstance(ToughWebglPage):
BASE_NAME = 'animometer_webgl_indexed_multi_draw_base_vertex_base_instance'
SUPPORTED_PLATFORMS = platforms.DESKTOP_ONLY
# pylint: disable=line-too-long
URL = 'http://kenrussell.github.io/webgl-animometer/Animometer/tests/3d/webgl-indexed-instanced.html?webgl_version=2&use_attributes=1&use_multi_draw=1&use_base_vertex_base_instance=1&num_geometries=120000'
class AnimometerWebGLAttribArrays(ToughWebglPage):
BASE_NAME = 'animometer_webgl_attrib_arrays'
# pylint: disable=line-too-long
URL = 'http://kenrussell.github.io/webgl-animometer/Animometer/tests/3d/webgl.html?use_attributes=1'
TAGS = ToughWebglPage.TAGS + [
story_tags.REPRESENTATIVE_MAC_DESKTOP
]
class CameraToWebGL(ToughWebglPage):
TAGS = ToughWebglPage.TAGS + [story_tags.USE_FAKE_CAMERA_DEVICE]
BASE_NAME = 'camera_to_webgl'
# pylint: disable=line-too-long
URL = 'https://www.khronos.org/registry/webgl/sdk/tests/extra/texture-from-camera-stress.html?uploadsPerFrame=200'
class UnityPage(ToughWebglPage):
ABSTRACT_STORY = True
def RunNavigateSteps(self, action_runner):
super(UnityPage, self).RunNavigateSteps(action_runner)
# Wait an additional 10 seconds for any loading screens
# or interaction to click "Play"
action_runner.Wait(10)
def RunPageInteractions(self, action_runner):
with action_runner.CreateInteraction('WebGLAnimation'):
action_runner.Wait(30)
class SkelebuddiesWasm2020(UnityPage):
BASE_NAME = 'skelebuddies_wasm_2020'
# pylint: disable=line-too-long
URL = 'http://clb.confined.space/emunittest/Skelebuddies-Wasm-Release-2020-10-26-profiling/Skelebuddies.html?playback'
class TinyRacingV3Wasm2020(UnityPage):
BASE_NAME = 'tiny_racing_v3_wasm_2020'
# pylint: disable=line-too-long
URL = 'http://clb.confined.space/emunittest/llvm-tinyracing-wasm-release-2020-03-17/TinyRacing.html?playback'
class MicrogameFPS(UnityPage):
BASE_NAME = 'microgame_fps'
# pylint: disable=line-too-long
URL = 'http://clb.confined.space/emunittest/microgame-fps_20190922_131915_wasm_release_profiling/index.html?playback'
class LostCrypt(UnityPage):
BASE_NAME = 'lost_crypt'
SUPPORTED_PLATFORMS = platforms.DESKTOP_ONLY
# pylint: disable=line-too-long
URL = 'http://clb.confined.space/emunittest/LostCrypt_20191220_131436_wasm_release/index.html?playback'
def MakeFastCallVariant(cls):
def __init__(self,
page_set,
shared_page_state_class,
name_suffix='',
extra_browser_args=None):
if extra_browser_args is None:
extra_browser_args = []
super(cls, self).__init__(page_set=page_set,
shared_page_state_class=shared_page_state_class,
name_suffix=name_suffix,
extra_browser_args=extra_browser_args)
# This has to be after after superclass init in order to override the args
# added by ToughWebglPage.__init__
extra_browser_args.remove("--disable-features=V8TurboFastApiCalls")
extra_browser_args.append("--enable-features=V8TurboFastApiCalls")
return type(
cls.__name__ + 'FastCall', (cls,), {
'BASE_NAME':
cls.BASE_NAME + '_fast_call',
'SUPPORTED_PLATFORMS':
cls.SUPPORTED_PLATFORMS.intersection(platforms.DESKTOP_ONLY),
'__init__':
__init__,
})
AnimometerWebGLFastCall = MakeFastCallVariant(AnimometerWebGL)
AnimometerWebGLIndexedFastCall = MakeFastCallVariant(AnimometerWebGLIndexed)
Aquarium20KFishFastCall = MakeFastCallVariant(Aquarium20KFish)
SkelebuddiesWasm2020FastCall = MakeFastCallVariant(SkelebuddiesWasm2020)
TinyRacingV3Wasm2020FastCall = MakeFastCallVariant(TinyRacingV3Wasm2020)
MicrogameFPSFastCall = MakeFastCallVariant(MicrogameFPS)
LostCryptFastCall = MakeFastCallVariant(LostCrypt)